@bryntum/calendar-angular-thin 7.1.1
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/README.md +44 -0
- package/bryntum-calendar-angular-thin.d.ts +5 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js +22195 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-calendar-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-agenda-view.component.js +2503 -0
- package/esm2015/lib/bryntum-calendar-date-picker.component.js +1045 -0
- package/esm2015/lib/bryntum-calendar-project-model.component.js +369 -0
- package/esm2015/lib/bryntum-calendar.component.js +2355 -0
- package/esm2015/lib/bryntum-day-agenda-view.component.js +1338 -0
- package/esm2015/lib/bryntum-day-resource-view.component.js +1347 -0
- package/esm2015/lib/bryntum-day-view.component.js +1323 -0
- package/esm2015/lib/bryntum-event-list.component.js +2453 -0
- package/esm2015/lib/bryntum-mode-selector.component.js +702 -0
- package/esm2015/lib/bryntum-month-agenda-view.component.js +1201 -0
- package/esm2015/lib/bryntum-month-grid.component.js +1262 -0
- package/esm2015/lib/bryntum-month-view.component.js +1337 -0
- package/esm2015/lib/bryntum-range-menu.component.js +884 -0
- package/esm2015/lib/bryntum-resource-view.component.js +1068 -0
- package/esm2015/lib/bryntum-week-view.component.js +1323 -0
- package/esm2015/lib/bryntum-year-view.component.js +1163 -0
- package/esm2015/lib/calendar.module.js +99 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +21 -0
- package/fesm2015/bryntum-calendar-angular-thin.js +21714 -0
- package/fesm2015/bryntum-calendar-angular-thin.js.map +1 -0
- package/lib/bryntum-agenda-view.component.d.ts +2953 -0
- package/lib/bryntum-calendar-date-picker.component.d.ts +1525 -0
- package/lib/bryntum-calendar-project-model.component.d.ts +399 -0
- package/lib/bryntum-calendar.component.d.ts +2577 -0
- package/lib/bryntum-day-agenda-view.component.d.ts +1960 -0
- package/lib/bryntum-day-resource-view.component.d.ts +2025 -0
- package/lib/bryntum-day-view.component.d.ts +1980 -0
- package/lib/bryntum-event-list.component.d.ts +2888 -0
- package/lib/bryntum-mode-selector.component.d.ts +851 -0
- package/lib/bryntum-month-agenda-view.component.d.ts +1765 -0
- package/lib/bryntum-month-grid.component.d.ts +1731 -0
- package/lib/bryntum-month-view.component.d.ts +1897 -0
- package/lib/bryntum-range-menu.component.d.ts +1130 -0
- package/lib/bryntum-resource-view.component.d.ts +1512 -0
- package/lib/bryntum-week-view.component.d.ts +1980 -0
- package/lib/bryntum-year-view.component.d.ts +1661 -0
- package/lib/calendar.module.d.ts +22 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,1337 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum MonthView
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { Widget } from '@bryntum/core-thin';
|
|
8
|
+
import { MonthView } from '@bryntum/calendar-thin';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class BryntumMonthViewComponent {
|
|
11
|
+
constructor(element) {
|
|
12
|
+
this.bryntumConfig = {
|
|
13
|
+
adopt: undefined,
|
|
14
|
+
appendTo: undefined,
|
|
15
|
+
href: undefined,
|
|
16
|
+
angularComponent: this,
|
|
17
|
+
features: {},
|
|
18
|
+
listeners: {}
|
|
19
|
+
};
|
|
20
|
+
// Events emitters
|
|
21
|
+
/**
|
|
22
|
+
* This event fires whenever the [autoCreate gesture](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) is detected
|
|
23
|
+
* and also when a [drag-create](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag) gesture is detected.
|
|
24
|
+
* ...
|
|
25
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-beforeAutoCreate)
|
|
26
|
+
* @param {object} event Event object
|
|
27
|
+
* @param {Event} event.domEvent The DOM event which initiated the creation.
|
|
28
|
+
* @param {Date} event.date *DEPRECATED in favour of `startDate`.* The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
29
|
+
* @param {Date} event.startDate The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
30
|
+
* @param {Date} event.endDate The ending time of the event to be created.
|
|
31
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
|
|
32
|
+
* @param {CalendarView} event.view This view.
|
|
33
|
+
*/
|
|
34
|
+
this.onBeforeAutoCreate = new EventEmitter();
|
|
35
|
+
/**
|
|
36
|
+
* Triggered before a view's orientating date changes.
|
|
37
|
+
* ...
|
|
38
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-beforeChangeDate)
|
|
39
|
+
* @param {object} event Event object
|
|
40
|
+
* @param {Date} event.oldDate The current orientating date of this view.
|
|
41
|
+
* @param {Date} event.date The new date to which this view is to be orientated.
|
|
42
|
+
*/
|
|
43
|
+
this.onBeforeChangeDate = new EventEmitter();
|
|
44
|
+
/**
|
|
45
|
+
* Fires before an object is destroyed.
|
|
46
|
+
* @param {object} event Event object
|
|
47
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
48
|
+
*/
|
|
49
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
50
|
+
/**
|
|
51
|
+
* Triggered before a widget is hidden. Return `false` to prevent the action.
|
|
52
|
+
* @param {object} event Event object
|
|
53
|
+
* @param {Core.widget.Widget} event.source The widget being hidden.
|
|
54
|
+
*/
|
|
55
|
+
this.onBeforeHide = new EventEmitter();
|
|
56
|
+
/**
|
|
57
|
+
* Fires before this CalendarPanel refreshes in response to changes in its month.
|
|
58
|
+
* @param {object} event Event object
|
|
59
|
+
* @param {Core.widget.DatePicker} event.source This DatePicker.
|
|
60
|
+
*/
|
|
61
|
+
this.onBeforeRefresh = new EventEmitter();
|
|
62
|
+
/**
|
|
63
|
+
* Triggered before a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
64
|
+
* @param {object} event Event object
|
|
65
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
|
|
66
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
67
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
68
|
+
*/
|
|
69
|
+
this.onBeforeResponsiveStateChange = new EventEmitter();
|
|
70
|
+
/**
|
|
71
|
+
* Fired before this container will load record values into its child fields. This is useful if you
|
|
72
|
+
* want to modify the UI before data is loaded (e.g. set some input field to be readonly)
|
|
73
|
+
* @param {object} event Event object
|
|
74
|
+
* @param {Core.widget.Container} event.source The container
|
|
75
|
+
* @param {Core.data.Model} event.record The record
|
|
76
|
+
*/
|
|
77
|
+
this.onBeforeSetRecord = new EventEmitter();
|
|
78
|
+
/**
|
|
79
|
+
* Triggered before a widget is shown. Return `false` to prevent the action.
|
|
80
|
+
* @param {object} event Event object
|
|
81
|
+
* @param {Core.widget.Widget,any} event.source The widget being shown
|
|
82
|
+
*/
|
|
83
|
+
this.onBeforeShow = new EventEmitter();
|
|
84
|
+
/**
|
|
85
|
+
* Fired before an [OverflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/OverflowPopup) is shown when an a
|
|
86
|
+
* "+ n more" overflow button is activated by an [overflowPopupTrigger](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#config-overflowPopupTrigger) event.
|
|
87
|
+
* @param {object} event Event object
|
|
88
|
+
* @param {HTMLElement} event.cell The day cell for which the overflow popup is going to be shown.
|
|
89
|
+
* @param {DayCell} event.cellData A `DayCell` object that contains data about the cell.
|
|
90
|
+
* @param {Date} event.date The date which has overflowing events
|
|
91
|
+
* @param {Calendar.widget.OverflowPopup} event.overflowPopup The overflow `Popup`.
|
|
92
|
+
*/
|
|
93
|
+
this.onBeforeShowOverflowPopup = new EventEmitter();
|
|
94
|
+
/**
|
|
95
|
+
* Fired before state is applied to the source. Allows editing the state object or preventing the operation.
|
|
96
|
+
* @param {object} event Event object
|
|
97
|
+
* @param {any} event.state State object config
|
|
98
|
+
*/
|
|
99
|
+
this.onBeforeStateApply = new EventEmitter();
|
|
100
|
+
/**
|
|
101
|
+
* Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
|
|
102
|
+
* @param {object} event Event object
|
|
103
|
+
* @param {any} event.state State object config
|
|
104
|
+
*/
|
|
105
|
+
this.onBeforeStateSave = new EventEmitter();
|
|
106
|
+
/**
|
|
107
|
+
* Fires when any other event is fired from the object.
|
|
108
|
+
* ...
|
|
109
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-catchAll)
|
|
110
|
+
* @param {object} event Event object
|
|
111
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
112
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
113
|
+
*/
|
|
114
|
+
this.onCatchAll = new EventEmitter();
|
|
115
|
+
/**
|
|
116
|
+
* Fired when a date cell is clicked.
|
|
117
|
+
* @param {object} event Event object
|
|
118
|
+
* @param {HTMLElement} event.cell The clicked cell element.
|
|
119
|
+
* @param {Date} event.date The date represented by the cell.
|
|
120
|
+
* @param {number[]} event.week The week array `[year, weekNumber]`.
|
|
121
|
+
* @param {Event} event.domEvent The original DOM event.
|
|
122
|
+
*/
|
|
123
|
+
this.onCellClick = new EventEmitter();
|
|
124
|
+
/**
|
|
125
|
+
* Fired when a new set of events has been gathered for this view's date range.
|
|
126
|
+
* @param {object} event Event object
|
|
127
|
+
* @param {Map<any, any>} event.cellMap The map of date keys to [day cell](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellCollecter#typedef-DayCell) data blocks.
|
|
128
|
+
*/
|
|
129
|
+
this.onCellMapPopulated = new EventEmitter();
|
|
130
|
+
/**
|
|
131
|
+
* Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
132
|
+
* @param {object} event Event object
|
|
133
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
134
|
+
*/
|
|
135
|
+
this.onCollapse = new EventEmitter();
|
|
136
|
+
/**
|
|
137
|
+
* Fires when the date of this CalendarPanel is set.
|
|
138
|
+
* @param {object} event Event object
|
|
139
|
+
* @param {Date} event.value The new date.
|
|
140
|
+
* @param {Date} event.oldValue The old date.
|
|
141
|
+
* @param {object} event.changes An object which contains properties which indicate what part of the date changed.
|
|
142
|
+
* @param {boolean} event.changes.d True if the date changed in any way.
|
|
143
|
+
* @param {boolean} event.changes.w True if the week changed (including same week in a different year).
|
|
144
|
+
* @param {boolean} event.changes.m True if the month changed (including same month in a different year).
|
|
145
|
+
* @param {boolean} event.changes.y True if the year changed.
|
|
146
|
+
*/
|
|
147
|
+
this.onDateChange = new EventEmitter();
|
|
148
|
+
/**
|
|
149
|
+
* Fired after one day cell's events are collected in sorted order according to the
|
|
150
|
+
* [eventSorter](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-eventSorter)
|
|
151
|
+
* ...
|
|
152
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-dayCellPopulated)
|
|
153
|
+
* @param {object} event Event object
|
|
154
|
+
* @param {Scheduler.model.EventModel[]} event.events The events to be shown for the passed date
|
|
155
|
+
* @param {Date} event.The date the events are to be shown in.
|
|
156
|
+
*/
|
|
157
|
+
this.onDayCellPopulated = new EventEmitter();
|
|
158
|
+
/**
|
|
159
|
+
* Fires when an object is destroyed.
|
|
160
|
+
* @param {object} event Event object
|
|
161
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
162
|
+
*/
|
|
163
|
+
this.onDestroy = new EventEmitter();
|
|
164
|
+
/**
|
|
165
|
+
* Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/calendar/docs/api/Core/widget/Container#property-hasChanges) property changes
|
|
166
|
+
* @param {object} event Event object
|
|
167
|
+
* @param {Core.widget.Container} event.source The container.
|
|
168
|
+
* @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
|
|
169
|
+
*/
|
|
170
|
+
this.onDirtyStateChange = new EventEmitter();
|
|
171
|
+
/**
|
|
172
|
+
* Triggered when a widget's [element](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#property-element) is available.
|
|
173
|
+
* @param {object} event Event object
|
|
174
|
+
* @param {HTMLElement} event.element The Widget's element.
|
|
175
|
+
*/
|
|
176
|
+
this.onElementCreated = new EventEmitter();
|
|
177
|
+
/**
|
|
178
|
+
* Fired when an empty cell content area is clicked on. If the handler returns
|
|
179
|
+
* `false` the current pointer event is not processed further.
|
|
180
|
+
* @param {object} event Event object
|
|
181
|
+
* @param {Event} event.domEvent The triggering DOM event.
|
|
182
|
+
* @param {Date} event.date The date which has no visible events
|
|
183
|
+
*/
|
|
184
|
+
this.onEmptyCellClick = new EventEmitter();
|
|
185
|
+
/**
|
|
186
|
+
* Fired when an [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) gesture has created a new event
|
|
187
|
+
* and added it to the event store.
|
|
188
|
+
* ...
|
|
189
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-eventAutoCreated)
|
|
190
|
+
* @param {object} event Event object
|
|
191
|
+
* @param {CalendarView} event.source This Calendar view instance.
|
|
192
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The new event record.
|
|
193
|
+
*/
|
|
194
|
+
this.onEventAutoCreated = new EventEmitter();
|
|
195
|
+
/**
|
|
196
|
+
* This event is fired when the event height changes due to resizing of the view
|
|
197
|
+
* and the application of [responsiveEventHeight](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#config-responsiveEventHeight).
|
|
198
|
+
* @param {object} event Event object
|
|
199
|
+
* @param {number} event.height The new event height.
|
|
200
|
+
* @param {number} event.oldHeight The previous event height.
|
|
201
|
+
*/
|
|
202
|
+
this.onEventHeightChange = new EventEmitter();
|
|
203
|
+
/**
|
|
204
|
+
* Fires when a day spanning event is found, and the date to which its encapsulating event bar
|
|
205
|
+
* extends has been calculated.
|
|
206
|
+
* ...
|
|
207
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-eventPropagate)
|
|
208
|
+
* @param {object} event Event object
|
|
209
|
+
* @param {Date} event.eventEndDate The end date for which to calculate the propagate end date.
|
|
210
|
+
* @param {Date} event.propagateEndDate The system-calculated end point of the event bar.
|
|
211
|
+
* @param {boolean} event.isAllDay `true` if the event is an all day event, or spans multiple days.
|
|
212
|
+
* @param {boolean} event.isOverflow `true` if this is being called as part of further propagation.
|
|
213
|
+
* @param {boolean} event.overflows `true` if the event extends into future cells.
|
|
214
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record being propagated.
|
|
215
|
+
* @param {Date} event.date The date from which the event is being propagated.
|
|
216
|
+
*/
|
|
217
|
+
this.onEventPropagate = new EventEmitter();
|
|
218
|
+
/**
|
|
219
|
+
* Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
220
|
+
* @param {object} event Event object
|
|
221
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
222
|
+
*/
|
|
223
|
+
this.onExpand = new EventEmitter();
|
|
224
|
+
/**
|
|
225
|
+
* Fired when focus enters this Widget.
|
|
226
|
+
* @param {object} event Event object
|
|
227
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
228
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
229
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
230
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
231
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
232
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
233
|
+
*/
|
|
234
|
+
this.onFocusIn = new EventEmitter();
|
|
235
|
+
/**
|
|
236
|
+
* Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
|
|
237
|
+
* focus moving from within this Widget's ownership tree, even if there are floating widgets
|
|
238
|
+
* will not trigger this event. This is when focus exits this widget completely.
|
|
239
|
+
* @param {object} event Event object
|
|
240
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
241
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
242
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
243
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
244
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
245
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
246
|
+
*/
|
|
247
|
+
this.onFocusOut = new EventEmitter();
|
|
248
|
+
/**
|
|
249
|
+
* Triggered after a widget was hidden
|
|
250
|
+
* @param {object} event Event object
|
|
251
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
252
|
+
*/
|
|
253
|
+
this.onHide = new EventEmitter();
|
|
254
|
+
/**
|
|
255
|
+
* Triggered when a widget which had been in a non-visible state for any reason
|
|
256
|
+
* achieves visibility.
|
|
257
|
+
* ...
|
|
258
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-paint)
|
|
259
|
+
* @param {object} event Event object
|
|
260
|
+
* @param {Core.widget.Widget} event.source The widget being painted.
|
|
261
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint.
|
|
262
|
+
*/
|
|
263
|
+
this.onPaint = new EventEmitter();
|
|
264
|
+
/**
|
|
265
|
+
* Fired when a Widget's read only state is toggled
|
|
266
|
+
* @param {object} event Event object
|
|
267
|
+
* @param {boolean} event.readOnly Read only or not
|
|
268
|
+
*/
|
|
269
|
+
this.onReadOnly = new EventEmitter();
|
|
270
|
+
/**
|
|
271
|
+
* This event is fired after a widget's elements have been synchronized due to a direct or indirect call
|
|
272
|
+
* to [recompose](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
|
|
273
|
+
*/
|
|
274
|
+
this.onRecompose = new EventEmitter();
|
|
275
|
+
/**
|
|
276
|
+
* Fires when this CalendarPanel refreshes.
|
|
277
|
+
*/
|
|
278
|
+
this.onRefresh = new EventEmitter();
|
|
279
|
+
/**
|
|
280
|
+
* Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
|
|
281
|
+
* @param {object} event Event object
|
|
282
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
283
|
+
* @param {number} event.width The new width
|
|
284
|
+
* @param {number} event.height The new height
|
|
285
|
+
* @param {number} event.oldWidth The old width
|
|
286
|
+
* @param {number} event.oldHeight The old height
|
|
287
|
+
*/
|
|
288
|
+
this.onResize = new EventEmitter();
|
|
289
|
+
/**
|
|
290
|
+
* Triggered when a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
291
|
+
* @param {object} event Event object
|
|
292
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
|
|
293
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
294
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
295
|
+
*/
|
|
296
|
+
this.onResponsiveStateChange = new EventEmitter();
|
|
297
|
+
/**
|
|
298
|
+
* Triggered after a widget is shown.
|
|
299
|
+
* @param {object} event Event object
|
|
300
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
301
|
+
*/
|
|
302
|
+
this.onShow = new EventEmitter();
|
|
303
|
+
/**
|
|
304
|
+
* Fired after an [OverflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/OverflowPopup) has been shown when an a
|
|
305
|
+
* "+ n more" overflow button is activated by an [overflowPopupTrigger](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#config-overflowPopupTrigger) event.
|
|
306
|
+
* @param {object} event Event object
|
|
307
|
+
* @param {HTMLElement} event.cell The day cell for which the overflow popup is going to be shown.
|
|
308
|
+
* @param {DayCell} event.cellData A `DayCell` object that contains data about the cell.
|
|
309
|
+
* @param {Date} event.date The date which has overflowing events
|
|
310
|
+
* @param {Calendar.widget.OverflowPopup} event.overflowPopup The overflow `Popup`.
|
|
311
|
+
*/
|
|
312
|
+
this.onShowOverflowPopup = new EventEmitter();
|
|
313
|
+
/**
|
|
314
|
+
* A header [tool](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-tools) has been clicked.
|
|
315
|
+
* @param {object} event Event object
|
|
316
|
+
* @param {Core.widget.Tool} event.source This Panel.
|
|
317
|
+
* @param {Core.widget.Tool} event.tool The tool which is being clicked.
|
|
318
|
+
*/
|
|
319
|
+
this.onToolClick = new EventEmitter();
|
|
320
|
+
/**
|
|
321
|
+
* Fired when a week number cell is clicked.
|
|
322
|
+
* @param {object} event Event object
|
|
323
|
+
* @param {Date} event.date The start date of the week.
|
|
324
|
+
* @param {number[]} event.week The week array `[year, weekNumber]`.
|
|
325
|
+
* @param {Event} event.domEvent The original DOM event.
|
|
326
|
+
*/
|
|
327
|
+
this.onWeekCellClick = new EventEmitter();
|
|
328
|
+
/**
|
|
329
|
+
* This event is fired as soon as a week row is requested to be flexed. The animated
|
|
330
|
+
* transition to the new height will still be in progress, but the row's flex style is
|
|
331
|
+
* set to its evenly shared flex value.
|
|
332
|
+
* ...
|
|
333
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-weekFlex)
|
|
334
|
+
* @param {object} event Event object
|
|
335
|
+
* @param {Date} event.weekStart The start date of the week being reverted to a flexed height.
|
|
336
|
+
* @param {HTMLElement} event.element The week row being reverted to a flexed height.
|
|
337
|
+
*/
|
|
338
|
+
this.onWeekFlex = new EventEmitter();
|
|
339
|
+
/**
|
|
340
|
+
* This event is fired as soon as a week row is requested to be shrinkwrapped.
|
|
341
|
+
* ...
|
|
342
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-weekShrinkwrap)
|
|
343
|
+
* @param {object} event Event object
|
|
344
|
+
* @param {Date} event.weekStart The start date of the week being shrinkwrapped.
|
|
345
|
+
* @param {HTMLElement} event.element The week row being shrinkwrapped.
|
|
346
|
+
*/
|
|
347
|
+
this.onWeekShrinkwrap = new EventEmitter();
|
|
348
|
+
this.elementRef = element;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Create and append the underlying widget
|
|
352
|
+
*/
|
|
353
|
+
ngOnInit() {
|
|
354
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumMonthViewComponent;
|
|
355
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
356
|
+
// @ts-ignore
|
|
357
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
358
|
+
if (['features', 'config'].includes(prop)) {
|
|
359
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
// @ts-ignore
|
|
363
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
364
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
365
|
+
// @ts-ignore
|
|
366
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
367
|
+
// @ts-ignore
|
|
368
|
+
me[event].emit(e);
|
|
369
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
370
|
+
// in Angular listeners
|
|
371
|
+
return e.returnValue;
|
|
372
|
+
};
|
|
373
|
+
});
|
|
374
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
375
|
+
const containerParam = [
|
|
376
|
+
'adopt',
|
|
377
|
+
'appendTo',
|
|
378
|
+
'insertAfter',
|
|
379
|
+
'insertBefore'
|
|
380
|
+
// @ts-ignore
|
|
381
|
+
].find(prop => bryntumConfig[prop]);
|
|
382
|
+
if (!containerParam) {
|
|
383
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
384
|
+
// Button should always be <a> or <button> inside owner element
|
|
385
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
393
|
+
}
|
|
394
|
+
// @ts-ignore
|
|
395
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Watch for changes
|
|
399
|
+
* @param changes
|
|
400
|
+
*/
|
|
401
|
+
ngOnChanges(changes) {
|
|
402
|
+
const { instance } = this, { instanceName } = BryntumMonthViewComponent;
|
|
403
|
+
if (!instance) {
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
// Iterate over all changes
|
|
407
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
408
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumMonthViewComponent;
|
|
409
|
+
if (bryntumProps.includes(prop)) {
|
|
410
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
411
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
412
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Destroy the component
|
|
419
|
+
*/
|
|
420
|
+
ngOnDestroy() {
|
|
421
|
+
// @ts-ignore
|
|
422
|
+
if (this.instance && this.instance.destroy) {
|
|
423
|
+
this.instance.destroy();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
BryntumMonthViewComponent.instanceClass = MonthView;
|
|
428
|
+
BryntumMonthViewComponent.instanceName = 'MonthView';
|
|
429
|
+
BryntumMonthViewComponent.bryntumEvents = [
|
|
430
|
+
'onBeforeAutoCreate',
|
|
431
|
+
'onBeforeChangeDate',
|
|
432
|
+
'onBeforeDestroy',
|
|
433
|
+
'onBeforeHide',
|
|
434
|
+
'onBeforeRefresh',
|
|
435
|
+
'onBeforeResponsiveStateChange',
|
|
436
|
+
'onBeforeSetRecord',
|
|
437
|
+
'onBeforeShow',
|
|
438
|
+
'onBeforeShowOverflowPopup',
|
|
439
|
+
'onBeforeStateApply',
|
|
440
|
+
'onBeforeStateSave',
|
|
441
|
+
'onCatchAll',
|
|
442
|
+
'onCellClick',
|
|
443
|
+
'onCellMapPopulated',
|
|
444
|
+
'onCollapse',
|
|
445
|
+
'onDateChange',
|
|
446
|
+
'onDayCellPopulated',
|
|
447
|
+
'onDestroy',
|
|
448
|
+
'onDirtyStateChange',
|
|
449
|
+
'onElementCreated',
|
|
450
|
+
'onEmptyCellClick',
|
|
451
|
+
'onEventAutoCreated',
|
|
452
|
+
'onEventHeightChange',
|
|
453
|
+
'onEventPropagate',
|
|
454
|
+
'onExpand',
|
|
455
|
+
'onFocusIn',
|
|
456
|
+
'onFocusOut',
|
|
457
|
+
'onHide',
|
|
458
|
+
'onPaint',
|
|
459
|
+
'onReadOnly',
|
|
460
|
+
'onRecompose',
|
|
461
|
+
'onRefresh',
|
|
462
|
+
'onResize',
|
|
463
|
+
'onResponsiveStateChange',
|
|
464
|
+
'onShow',
|
|
465
|
+
'onShowOverflowPopup',
|
|
466
|
+
'onToolClick',
|
|
467
|
+
'onWeekCellClick',
|
|
468
|
+
'onWeekFlex',
|
|
469
|
+
'onWeekShrinkwrap'
|
|
470
|
+
];
|
|
471
|
+
BryntumMonthViewComponent.bryntumFeatureNames = [];
|
|
472
|
+
BryntumMonthViewComponent.bryntumConfigs = BryntumMonthViewComponent.bryntumFeatureNames.concat([
|
|
473
|
+
'activationKey',
|
|
474
|
+
'adopt',
|
|
475
|
+
'align',
|
|
476
|
+
'alignSelf',
|
|
477
|
+
'allowDragCreate',
|
|
478
|
+
'allowDragMove',
|
|
479
|
+
'allowDragResize',
|
|
480
|
+
'anchor',
|
|
481
|
+
'animateTimeShift',
|
|
482
|
+
'appendTo',
|
|
483
|
+
'ariaDescription',
|
|
484
|
+
'ariaLabel',
|
|
485
|
+
'autoCreate',
|
|
486
|
+
'autoRowHeight',
|
|
487
|
+
'bbar',
|
|
488
|
+
'bodyCls',
|
|
489
|
+
'bubbleEvents',
|
|
490
|
+
'callOnFunctions',
|
|
491
|
+
'catchEventHandlerExceptions',
|
|
492
|
+
'cellRenderer',
|
|
493
|
+
'centered',
|
|
494
|
+
'cls',
|
|
495
|
+
'collapsed',
|
|
496
|
+
'collapsible',
|
|
497
|
+
'color',
|
|
498
|
+
'column',
|
|
499
|
+
'config',
|
|
500
|
+
'constrainTo',
|
|
501
|
+
'contentElementCls',
|
|
502
|
+
'dataField',
|
|
503
|
+
'dataset',
|
|
504
|
+
'date',
|
|
505
|
+
'dateFormat',
|
|
506
|
+
'dateSeparator',
|
|
507
|
+
'dayCellNameFormat',
|
|
508
|
+
'dayCellRenderer',
|
|
509
|
+
'dayNameFormat',
|
|
510
|
+
'defaultBindProperty',
|
|
511
|
+
'defaultFocus',
|
|
512
|
+
'defaults',
|
|
513
|
+
'defaultScrollOptions',
|
|
514
|
+
'descriptionFormat',
|
|
515
|
+
'descriptionRenderer',
|
|
516
|
+
'detectCSSCompatibilityIssues',
|
|
517
|
+
'disabled',
|
|
518
|
+
'disabledCls',
|
|
519
|
+
'disabledDates',
|
|
520
|
+
'disableNonWorkingDays',
|
|
521
|
+
'disableOtherMonthCells',
|
|
522
|
+
'disableWeekends',
|
|
523
|
+
'dock',
|
|
524
|
+
'draggable',
|
|
525
|
+
'dragUnit',
|
|
526
|
+
'drawer',
|
|
527
|
+
'elementAttributes',
|
|
528
|
+
'emptyCellRenderer',
|
|
529
|
+
'eventFilter',
|
|
530
|
+
'eventHeaderRenderer',
|
|
531
|
+
'eventHeight',
|
|
532
|
+
'eventRenderer',
|
|
533
|
+
'eventSorter',
|
|
534
|
+
'eventSpacing',
|
|
535
|
+
'extendAllDayEndDay',
|
|
536
|
+
'extraData',
|
|
537
|
+
'filterEventResources',
|
|
538
|
+
'flex',
|
|
539
|
+
'floating',
|
|
540
|
+
'footer',
|
|
541
|
+
'getPrimaryResource',
|
|
542
|
+
'header',
|
|
543
|
+
'headerRenderer',
|
|
544
|
+
'height',
|
|
545
|
+
'hidden',
|
|
546
|
+
'hideAnimation',
|
|
547
|
+
'hideNonWorkingDays',
|
|
548
|
+
'hideOtherMonthCells',
|
|
549
|
+
'hideWhenEmpty',
|
|
550
|
+
'icon',
|
|
551
|
+
'id',
|
|
552
|
+
'ignoreParentReadOnly',
|
|
553
|
+
'inputFieldAlign',
|
|
554
|
+
'insertBefore',
|
|
555
|
+
'insertFirst',
|
|
556
|
+
'itemCls',
|
|
557
|
+
'items',
|
|
558
|
+
'keyMap',
|
|
559
|
+
'labelPosition',
|
|
560
|
+
'layout',
|
|
561
|
+
'layoutStyle',
|
|
562
|
+
'lazyItems',
|
|
563
|
+
'listeners',
|
|
564
|
+
'localeClass',
|
|
565
|
+
'localizable',
|
|
566
|
+
'localizableProperties',
|
|
567
|
+
'margin',
|
|
568
|
+
'maskDefaults',
|
|
569
|
+
'masked',
|
|
570
|
+
'maxDate',
|
|
571
|
+
'maxEventsPerCell',
|
|
572
|
+
'maxHeight',
|
|
573
|
+
'maximizeOnMobile',
|
|
574
|
+
'maxWidth',
|
|
575
|
+
'minColumnWidth',
|
|
576
|
+
'minDate',
|
|
577
|
+
'minHeight',
|
|
578
|
+
'minRowHeight',
|
|
579
|
+
'minWidth',
|
|
580
|
+
'monitorResize',
|
|
581
|
+
'month',
|
|
582
|
+
'namedItems',
|
|
583
|
+
'nonWorkingDayCls',
|
|
584
|
+
'nonWorkingDays',
|
|
585
|
+
'otherMonthCls',
|
|
586
|
+
'overflowButtonRenderer',
|
|
587
|
+
'overflowClickAction',
|
|
588
|
+
'overflowPopup',
|
|
589
|
+
'overflowPopupTrigger',
|
|
590
|
+
'owner',
|
|
591
|
+
'pastEventCls',
|
|
592
|
+
'persistShrinkWrappedRows',
|
|
593
|
+
'positioned',
|
|
594
|
+
'preventTooltipOnTouch',
|
|
595
|
+
'readOnly',
|
|
596
|
+
'relayStoreEvents',
|
|
597
|
+
'rendition',
|
|
598
|
+
'resourceImagePath',
|
|
599
|
+
'responsive',
|
|
600
|
+
'responsiveEventHeight',
|
|
601
|
+
'responsiveRoot',
|
|
602
|
+
'responsiveState',
|
|
603
|
+
'responsiveTarget',
|
|
604
|
+
'ripple',
|
|
605
|
+
'rootElement',
|
|
606
|
+
'rtl',
|
|
607
|
+
'scrollable',
|
|
608
|
+
'scrollAction',
|
|
609
|
+
'selectorButton',
|
|
610
|
+
'selectorMenuItem',
|
|
611
|
+
'shadePastDates',
|
|
612
|
+
'shortDateFormat',
|
|
613
|
+
'shortDateTimeFormat',
|
|
614
|
+
'shortEventCls',
|
|
615
|
+
'shortEventDuration',
|
|
616
|
+
'showAnimation',
|
|
617
|
+
'showBullet',
|
|
618
|
+
'showResourceAvatars',
|
|
619
|
+
'showTooltipWhenDisabled',
|
|
620
|
+
'showWeekColumn',
|
|
621
|
+
'showWeekNumber',
|
|
622
|
+
'sixWeeks',
|
|
623
|
+
'span',
|
|
624
|
+
'stackMultiDayEvents',
|
|
625
|
+
'stateful',
|
|
626
|
+
'statefulEvents',
|
|
627
|
+
'stateId',
|
|
628
|
+
'stateProvider',
|
|
629
|
+
'strictRecordMapping',
|
|
630
|
+
'strips',
|
|
631
|
+
'syncCalendarDate',
|
|
632
|
+
'syncViewDate',
|
|
633
|
+
'tab',
|
|
634
|
+
'tabBarItems',
|
|
635
|
+
'tag',
|
|
636
|
+
'tbar',
|
|
637
|
+
'textAlign',
|
|
638
|
+
'timeFormat',
|
|
639
|
+
'tip',
|
|
640
|
+
'title',
|
|
641
|
+
'todayCls',
|
|
642
|
+
'tools',
|
|
643
|
+
'tooltip',
|
|
644
|
+
'trapFocus',
|
|
645
|
+
'type',
|
|
646
|
+
'ui',
|
|
647
|
+
'weekColumnHeader',
|
|
648
|
+
'weekendCls',
|
|
649
|
+
'weekRenderer',
|
|
650
|
+
'weekStartDay',
|
|
651
|
+
'weight',
|
|
652
|
+
'width',
|
|
653
|
+
'x',
|
|
654
|
+
'y'
|
|
655
|
+
]);
|
|
656
|
+
BryntumMonthViewComponent.bryntumConfigsOnly = [
|
|
657
|
+
'activationKey',
|
|
658
|
+
'adopt',
|
|
659
|
+
'align',
|
|
660
|
+
'anchor',
|
|
661
|
+
'ariaDescription',
|
|
662
|
+
'ariaLabel',
|
|
663
|
+
'bbar',
|
|
664
|
+
'bodyCls',
|
|
665
|
+
'bubbleEvents',
|
|
666
|
+
'cellRenderer',
|
|
667
|
+
'centered',
|
|
668
|
+
'collapsible',
|
|
669
|
+
'color',
|
|
670
|
+
'config',
|
|
671
|
+
'constrainTo',
|
|
672
|
+
'contentElementCls',
|
|
673
|
+
'dataField',
|
|
674
|
+
'dayCellNameFormat',
|
|
675
|
+
'dayCellRenderer',
|
|
676
|
+
'dayNameFormat',
|
|
677
|
+
'defaultBindProperty',
|
|
678
|
+
'defaultFocus',
|
|
679
|
+
'defaults',
|
|
680
|
+
'descriptionRenderer',
|
|
681
|
+
'detectCSSCompatibilityIssues',
|
|
682
|
+
'disabledCls',
|
|
683
|
+
'disabledDates',
|
|
684
|
+
'disableNonWorkingDays',
|
|
685
|
+
'disableOtherMonthCells',
|
|
686
|
+
'disableWeekends',
|
|
687
|
+
'dock',
|
|
688
|
+
'draggable',
|
|
689
|
+
'drawer',
|
|
690
|
+
'elementAttributes',
|
|
691
|
+
'emptyCellRenderer',
|
|
692
|
+
'eventFilter',
|
|
693
|
+
'eventHeaderRenderer',
|
|
694
|
+
'eventRenderer',
|
|
695
|
+
'eventSorter',
|
|
696
|
+
'floating',
|
|
697
|
+
'footer',
|
|
698
|
+
'getPrimaryResource',
|
|
699
|
+
'header',
|
|
700
|
+
'headerRenderer',
|
|
701
|
+
'hideAnimation',
|
|
702
|
+
'hideOtherMonthCells',
|
|
703
|
+
'hideWhenEmpty',
|
|
704
|
+
'icon',
|
|
705
|
+
'ignoreParentReadOnly',
|
|
706
|
+
'itemCls',
|
|
707
|
+
'lazyItems',
|
|
708
|
+
'listeners',
|
|
709
|
+
'localeClass',
|
|
710
|
+
'localizable',
|
|
711
|
+
'localizableProperties',
|
|
712
|
+
'maskDefaults',
|
|
713
|
+
'masked',
|
|
714
|
+
'maxEventsPerCell',
|
|
715
|
+
'minColumnWidth',
|
|
716
|
+
'minRowHeight',
|
|
717
|
+
'monitorResize',
|
|
718
|
+
'month',
|
|
719
|
+
'namedItems',
|
|
720
|
+
'nonWorkingDayCls',
|
|
721
|
+
'otherMonthCls',
|
|
722
|
+
'overflowButtonRenderer',
|
|
723
|
+
'overflowClickAction',
|
|
724
|
+
'overflowPopup',
|
|
725
|
+
'overflowPopupTrigger',
|
|
726
|
+
'owner',
|
|
727
|
+
'positioned',
|
|
728
|
+
'preventTooltipOnTouch',
|
|
729
|
+
'relayStoreEvents',
|
|
730
|
+
'resourceImagePath',
|
|
731
|
+
'responsive',
|
|
732
|
+
'responsiveEventHeight',
|
|
733
|
+
'responsiveRoot',
|
|
734
|
+
'responsiveState',
|
|
735
|
+
'responsiveTarget',
|
|
736
|
+
'ripple',
|
|
737
|
+
'rootElement',
|
|
738
|
+
'scrollAction',
|
|
739
|
+
'selectorButton',
|
|
740
|
+
'selectorMenuItem',
|
|
741
|
+
'shortEventCls',
|
|
742
|
+
'shortEventDuration',
|
|
743
|
+
'showAnimation',
|
|
744
|
+
'showBullet',
|
|
745
|
+
'showResourceAvatars',
|
|
746
|
+
'showTooltipWhenDisabled',
|
|
747
|
+
'showWeekColumn',
|
|
748
|
+
'sixWeeks',
|
|
749
|
+
'stateful',
|
|
750
|
+
'statefulEvents',
|
|
751
|
+
'stateId',
|
|
752
|
+
'stateProvider',
|
|
753
|
+
'strips',
|
|
754
|
+
'tab',
|
|
755
|
+
'tabBarItems',
|
|
756
|
+
'tag',
|
|
757
|
+
'tbar',
|
|
758
|
+
'textAlign',
|
|
759
|
+
'timeFormat',
|
|
760
|
+
'tip',
|
|
761
|
+
'todayCls',
|
|
762
|
+
'trapFocus',
|
|
763
|
+
'type',
|
|
764
|
+
'ui',
|
|
765
|
+
'weekendCls',
|
|
766
|
+
'weekRenderer',
|
|
767
|
+
'weekStartDay',
|
|
768
|
+
'weight'
|
|
769
|
+
];
|
|
770
|
+
BryntumMonthViewComponent.bryntumProps = BryntumMonthViewComponent.bryntumFeatureNames.concat([
|
|
771
|
+
'alignSelf',
|
|
772
|
+
'allowDragCreate',
|
|
773
|
+
'allowDragMove',
|
|
774
|
+
'allowDragResize',
|
|
775
|
+
'anchorSize',
|
|
776
|
+
'animateTimeShift',
|
|
777
|
+
'appendTo',
|
|
778
|
+
'autoCreate',
|
|
779
|
+
'autoRowHeight',
|
|
780
|
+
'callOnFunctions',
|
|
781
|
+
'catchEventHandlerExceptions',
|
|
782
|
+
'cls',
|
|
783
|
+
'collapsed',
|
|
784
|
+
'column',
|
|
785
|
+
'dataset',
|
|
786
|
+
'date',
|
|
787
|
+
'dateFormat',
|
|
788
|
+
'dateSeparator',
|
|
789
|
+
'dayCellCls',
|
|
790
|
+
'defaultScrollOptions',
|
|
791
|
+
'descriptionFormat',
|
|
792
|
+
'disabled',
|
|
793
|
+
'dragUnit',
|
|
794
|
+
'eventHeight',
|
|
795
|
+
'eventSpacing',
|
|
796
|
+
'extendAllDayEndDay',
|
|
797
|
+
'extraData',
|
|
798
|
+
'filterEventResources',
|
|
799
|
+
'firstVisibleCell',
|
|
800
|
+
'firstVisibleDate',
|
|
801
|
+
'flex',
|
|
802
|
+
'focusVisible',
|
|
803
|
+
'hasChanges',
|
|
804
|
+
'height',
|
|
805
|
+
'hidden',
|
|
806
|
+
'hideNonWorkingDays',
|
|
807
|
+
'id',
|
|
808
|
+
'inputFieldAlign',
|
|
809
|
+
'insertBefore',
|
|
810
|
+
'insertFirst',
|
|
811
|
+
'isSettingValues',
|
|
812
|
+
'isValid',
|
|
813
|
+
'items',
|
|
814
|
+
'keyMap',
|
|
815
|
+
'labelPosition',
|
|
816
|
+
'lastVisibleCell',
|
|
817
|
+
'lastVisibleDate',
|
|
818
|
+
'layout',
|
|
819
|
+
'layoutStyle',
|
|
820
|
+
'margin',
|
|
821
|
+
'maxDate',
|
|
822
|
+
'maxHeight',
|
|
823
|
+
'maximizeOnMobile',
|
|
824
|
+
'maxWidth',
|
|
825
|
+
'minDate',
|
|
826
|
+
'minHeight',
|
|
827
|
+
'minWidth',
|
|
828
|
+
'nonWorkingDays',
|
|
829
|
+
'parent',
|
|
830
|
+
'pastEventCls',
|
|
831
|
+
'persistShrinkWrappedRows',
|
|
832
|
+
'readOnly',
|
|
833
|
+
'record',
|
|
834
|
+
'rendition',
|
|
835
|
+
'rtl',
|
|
836
|
+
'scrollable',
|
|
837
|
+
'shadePastDates',
|
|
838
|
+
'shortDateFormat',
|
|
839
|
+
'shortDateTimeFormat',
|
|
840
|
+
'showWeekNumber',
|
|
841
|
+
'span',
|
|
842
|
+
'stackMultiDayEvents',
|
|
843
|
+
'state',
|
|
844
|
+
'strictRecordMapping',
|
|
845
|
+
'syncCalendarDate',
|
|
846
|
+
'syncViewDate',
|
|
847
|
+
'title',
|
|
848
|
+
'tools',
|
|
849
|
+
'tooltip',
|
|
850
|
+
'values',
|
|
851
|
+
'weekColumnHeader',
|
|
852
|
+
'width',
|
|
853
|
+
'x',
|
|
854
|
+
'y'
|
|
855
|
+
]);
|
|
856
|
+
BryntumMonthViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumMonthViewComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
857
|
+
BryntumMonthViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumMonthViewComponent, selector: "bryntum-month-view", inputs: { activationKey: "activationKey", adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", cellRenderer: "cellRenderer", centered: "centered", collapsible: "collapsible", color: "color", config: "config", constrainTo: "constrainTo", contentElementCls: "contentElementCls", dataField: "dataField", dayCellNameFormat: "dayCellNameFormat", dayCellRenderer: "dayCellRenderer", dayNameFormat: "dayNameFormat", defaultBindProperty: "defaultBindProperty", defaultFocus: "defaultFocus", defaults: "defaults", descriptionRenderer: "descriptionRenderer", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disabledCls: "disabledCls", disabledDates: "disabledDates", disableNonWorkingDays: "disableNonWorkingDays", disableOtherMonthCells: "disableOtherMonthCells", disableWeekends: "disableWeekends", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", emptyCellRenderer: "emptyCellRenderer", eventFilter: "eventFilter", eventHeaderRenderer: "eventHeaderRenderer", eventRenderer: "eventRenderer", eventSorter: "eventSorter", floating: "floating", footer: "footer", getPrimaryResource: "getPrimaryResource", header: "header", headerRenderer: "headerRenderer", hideAnimation: "hideAnimation", hideOtherMonthCells: "hideOtherMonthCells", hideWhenEmpty: "hideWhenEmpty", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", itemCls: "itemCls", lazyItems: "lazyItems", listeners: "listeners", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", maxEventsPerCell: "maxEventsPerCell", minColumnWidth: "minColumnWidth", minRowHeight: "minRowHeight", monitorResize: "monitorResize", month: "month", namedItems: "namedItems", nonWorkingDayCls: "nonWorkingDayCls", otherMonthCls: "otherMonthCls", overflowButtonRenderer: "overflowButtonRenderer", overflowClickAction: "overflowClickAction", overflowPopup: "overflowPopup", overflowPopupTrigger: "overflowPopupTrigger", owner: "owner", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", responsive: "responsive", responsiveEventHeight: "responsiveEventHeight", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", selectorButton: "selectorButton", selectorMenuItem: "selectorMenuItem", shortEventCls: "shortEventCls", shortEventDuration: "shortEventDuration", showAnimation: "showAnimation", showBullet: "showBullet", showResourceAvatars: "showResourceAvatars", showTooltipWhenDisabled: "showTooltipWhenDisabled", showWeekColumn: "showWeekColumn", sixWeeks: "sixWeeks", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", tab: "tab", tabBarItems: "tabBarItems", tag: "tag", tbar: "tbar", textAlign: "textAlign", timeFormat: "timeFormat", tip: "tip", todayCls: "todayCls", trapFocus: "trapFocus", type: "type", ui: "ui", weekendCls: "weekendCls", weekRenderer: "weekRenderer", weekStartDay: "weekStartDay", weight: "weight", alignSelf: "alignSelf", allowDragCreate: "allowDragCreate", allowDragMove: "allowDragMove", allowDragResize: "allowDragResize", animateTimeShift: "animateTimeShift", appendTo: "appendTo", autoCreate: "autoCreate", autoRowHeight: "autoRowHeight", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", dataset: "dataset", date: "date", dateFormat: "dateFormat", dateSeparator: "dateSeparator", defaultScrollOptions: "defaultScrollOptions", descriptionFormat: "descriptionFormat", disabled: "disabled", dragUnit: "dragUnit", eventHeight: "eventHeight", eventSpacing: "eventSpacing", extendAllDayEndDay: "extendAllDayEndDay", extraData: "extraData", filterEventResources: "filterEventResources", flex: "flex", height: "height", hidden: "hidden", hideNonWorkingDays: "hideNonWorkingDays", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", items: "items", keyMap: "keyMap", labelPosition: "labelPosition", layout: "layout", layoutStyle: "layoutStyle", margin: "margin", maxDate: "maxDate", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minDate: "minDate", minHeight: "minHeight", minWidth: "minWidth", nonWorkingDays: "nonWorkingDays", pastEventCls: "pastEventCls", persistShrinkWrappedRows: "persistShrinkWrappedRows", readOnly: "readOnly", rendition: "rendition", rtl: "rtl", scrollable: "scrollable", shadePastDates: "shadePastDates", shortDateFormat: "shortDateFormat", shortDateTimeFormat: "shortDateTimeFormat", showWeekNumber: "showWeekNumber", span: "span", stackMultiDayEvents: "stackMultiDayEvents", strictRecordMapping: "strictRecordMapping", syncCalendarDate: "syncCalendarDate", syncViewDate: "syncViewDate", title: "title", tools: "tools", tooltip: "tooltip", weekColumnHeader: "weekColumnHeader", width: "width", x: "x", y: "y", anchorSize: "anchorSize", dayCellCls: "dayCellCls", firstVisibleCell: "firstVisibleCell", firstVisibleDate: "firstVisibleDate", focusVisible: "focusVisible", hasChanges: "hasChanges", isSettingValues: "isSettingValues", isValid: "isValid", lastVisibleCell: "lastVisibleCell", lastVisibleDate: "lastVisibleDate", parent: "parent", record: "record", state: "state", values: "values" }, outputs: { onBeforeAutoCreate: "onBeforeAutoCreate", onBeforeChangeDate: "onBeforeChangeDate", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeRefresh: "onBeforeRefresh", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeShowOverflowPopup: "onBeforeShowOverflowPopup", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onCatchAll: "onCatchAll", onCellClick: "onCellClick", onCellMapPopulated: "onCellMapPopulated", onCollapse: "onCollapse", onDateChange: "onDateChange", onDayCellPopulated: "onDayCellPopulated", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onElementCreated: "onElementCreated", onEmptyCellClick: "onEmptyCellClick", onEventAutoCreated: "onEventAutoCreated", onEventHeightChange: "onEventHeightChange", onEventPropagate: "onEventPropagate", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRefresh: "onRefresh", onResize: "onResize", onResponsiveStateChange: "onResponsiveStateChange", onShow: "onShow", onShowOverflowPopup: "onShowOverflowPopup", onToolClick: "onToolClick", onWeekCellClick: "onWeekCellClick", onWeekFlex: "onWeekFlex", onWeekShrinkwrap: "onWeekShrinkwrap" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
858
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumMonthViewComponent, decorators: [{
|
|
859
|
+
type: Component,
|
|
860
|
+
args: [{
|
|
861
|
+
selector: 'bryntum-month-view',
|
|
862
|
+
template: ''
|
|
863
|
+
}]
|
|
864
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activationKey: [{
|
|
865
|
+
type: Input
|
|
866
|
+
}], adopt: [{
|
|
867
|
+
type: Input
|
|
868
|
+
}], align: [{
|
|
869
|
+
type: Input
|
|
870
|
+
}], anchor: [{
|
|
871
|
+
type: Input
|
|
872
|
+
}], ariaDescription: [{
|
|
873
|
+
type: Input
|
|
874
|
+
}], ariaLabel: [{
|
|
875
|
+
type: Input
|
|
876
|
+
}], bbar: [{
|
|
877
|
+
type: Input
|
|
878
|
+
}], bodyCls: [{
|
|
879
|
+
type: Input
|
|
880
|
+
}], bubbleEvents: [{
|
|
881
|
+
type: Input
|
|
882
|
+
}], cellRenderer: [{
|
|
883
|
+
type: Input
|
|
884
|
+
}], centered: [{
|
|
885
|
+
type: Input
|
|
886
|
+
}], collapsible: [{
|
|
887
|
+
type: Input
|
|
888
|
+
}], color: [{
|
|
889
|
+
type: Input
|
|
890
|
+
}], config: [{
|
|
891
|
+
type: Input
|
|
892
|
+
}], constrainTo: [{
|
|
893
|
+
type: Input
|
|
894
|
+
}], contentElementCls: [{
|
|
895
|
+
type: Input
|
|
896
|
+
}], dataField: [{
|
|
897
|
+
type: Input
|
|
898
|
+
}], dayCellNameFormat: [{
|
|
899
|
+
type: Input
|
|
900
|
+
}], dayCellRenderer: [{
|
|
901
|
+
type: Input
|
|
902
|
+
}], dayNameFormat: [{
|
|
903
|
+
type: Input
|
|
904
|
+
}], defaultBindProperty: [{
|
|
905
|
+
type: Input
|
|
906
|
+
}], defaultFocus: [{
|
|
907
|
+
type: Input
|
|
908
|
+
}], defaults: [{
|
|
909
|
+
type: Input
|
|
910
|
+
}], descriptionRenderer: [{
|
|
911
|
+
type: Input
|
|
912
|
+
}], detectCSSCompatibilityIssues: [{
|
|
913
|
+
type: Input
|
|
914
|
+
}], disabledCls: [{
|
|
915
|
+
type: Input
|
|
916
|
+
}], disabledDates: [{
|
|
917
|
+
type: Input
|
|
918
|
+
}], disableNonWorkingDays: [{
|
|
919
|
+
type: Input
|
|
920
|
+
}], disableOtherMonthCells: [{
|
|
921
|
+
type: Input
|
|
922
|
+
}], disableWeekends: [{
|
|
923
|
+
type: Input
|
|
924
|
+
}], dock: [{
|
|
925
|
+
type: Input
|
|
926
|
+
}], draggable: [{
|
|
927
|
+
type: Input
|
|
928
|
+
}], drawer: [{
|
|
929
|
+
type: Input
|
|
930
|
+
}], elementAttributes: [{
|
|
931
|
+
type: Input
|
|
932
|
+
}], emptyCellRenderer: [{
|
|
933
|
+
type: Input
|
|
934
|
+
}], eventFilter: [{
|
|
935
|
+
type: Input
|
|
936
|
+
}], eventHeaderRenderer: [{
|
|
937
|
+
type: Input
|
|
938
|
+
}], eventRenderer: [{
|
|
939
|
+
type: Input
|
|
940
|
+
}], eventSorter: [{
|
|
941
|
+
type: Input
|
|
942
|
+
}], floating: [{
|
|
943
|
+
type: Input
|
|
944
|
+
}], footer: [{
|
|
945
|
+
type: Input
|
|
946
|
+
}], getPrimaryResource: [{
|
|
947
|
+
type: Input
|
|
948
|
+
}], header: [{
|
|
949
|
+
type: Input
|
|
950
|
+
}], headerRenderer: [{
|
|
951
|
+
type: Input
|
|
952
|
+
}], hideAnimation: [{
|
|
953
|
+
type: Input
|
|
954
|
+
}], hideOtherMonthCells: [{
|
|
955
|
+
type: Input
|
|
956
|
+
}], hideWhenEmpty: [{
|
|
957
|
+
type: Input
|
|
958
|
+
}], icon: [{
|
|
959
|
+
type: Input
|
|
960
|
+
}], ignoreParentReadOnly: [{
|
|
961
|
+
type: Input
|
|
962
|
+
}], itemCls: [{
|
|
963
|
+
type: Input
|
|
964
|
+
}], lazyItems: [{
|
|
965
|
+
type: Input
|
|
966
|
+
}], listeners: [{
|
|
967
|
+
type: Input
|
|
968
|
+
}], localeClass: [{
|
|
969
|
+
type: Input
|
|
970
|
+
}], localizable: [{
|
|
971
|
+
type: Input
|
|
972
|
+
}], localizableProperties: [{
|
|
973
|
+
type: Input
|
|
974
|
+
}], maskDefaults: [{
|
|
975
|
+
type: Input
|
|
976
|
+
}], masked: [{
|
|
977
|
+
type: Input
|
|
978
|
+
}], maxEventsPerCell: [{
|
|
979
|
+
type: Input
|
|
980
|
+
}], minColumnWidth: [{
|
|
981
|
+
type: Input
|
|
982
|
+
}], minRowHeight: [{
|
|
983
|
+
type: Input
|
|
984
|
+
}], monitorResize: [{
|
|
985
|
+
type: Input
|
|
986
|
+
}], month: [{
|
|
987
|
+
type: Input
|
|
988
|
+
}], namedItems: [{
|
|
989
|
+
type: Input
|
|
990
|
+
}], nonWorkingDayCls: [{
|
|
991
|
+
type: Input
|
|
992
|
+
}], otherMonthCls: [{
|
|
993
|
+
type: Input
|
|
994
|
+
}], overflowButtonRenderer: [{
|
|
995
|
+
type: Input
|
|
996
|
+
}], overflowClickAction: [{
|
|
997
|
+
type: Input
|
|
998
|
+
}], overflowPopup: [{
|
|
999
|
+
type: Input
|
|
1000
|
+
}], overflowPopupTrigger: [{
|
|
1001
|
+
type: Input
|
|
1002
|
+
}], owner: [{
|
|
1003
|
+
type: Input
|
|
1004
|
+
}], positioned: [{
|
|
1005
|
+
type: Input
|
|
1006
|
+
}], preventTooltipOnTouch: [{
|
|
1007
|
+
type: Input
|
|
1008
|
+
}], relayStoreEvents: [{
|
|
1009
|
+
type: Input
|
|
1010
|
+
}], resourceImagePath: [{
|
|
1011
|
+
type: Input
|
|
1012
|
+
}], responsive: [{
|
|
1013
|
+
type: Input
|
|
1014
|
+
}], responsiveEventHeight: [{
|
|
1015
|
+
type: Input
|
|
1016
|
+
}], responsiveRoot: [{
|
|
1017
|
+
type: Input
|
|
1018
|
+
}], responsiveState: [{
|
|
1019
|
+
type: Input
|
|
1020
|
+
}], responsiveTarget: [{
|
|
1021
|
+
type: Input
|
|
1022
|
+
}], ripple: [{
|
|
1023
|
+
type: Input
|
|
1024
|
+
}], rootElement: [{
|
|
1025
|
+
type: Input
|
|
1026
|
+
}], scrollAction: [{
|
|
1027
|
+
type: Input
|
|
1028
|
+
}], selectorButton: [{
|
|
1029
|
+
type: Input
|
|
1030
|
+
}], selectorMenuItem: [{
|
|
1031
|
+
type: Input
|
|
1032
|
+
}], shortEventCls: [{
|
|
1033
|
+
type: Input
|
|
1034
|
+
}], shortEventDuration: [{
|
|
1035
|
+
type: Input
|
|
1036
|
+
}], showAnimation: [{
|
|
1037
|
+
type: Input
|
|
1038
|
+
}], showBullet: [{
|
|
1039
|
+
type: Input
|
|
1040
|
+
}], showResourceAvatars: [{
|
|
1041
|
+
type: Input
|
|
1042
|
+
}], showTooltipWhenDisabled: [{
|
|
1043
|
+
type: Input
|
|
1044
|
+
}], showWeekColumn: [{
|
|
1045
|
+
type: Input
|
|
1046
|
+
}], sixWeeks: [{
|
|
1047
|
+
type: Input
|
|
1048
|
+
}], stateful: [{
|
|
1049
|
+
type: Input
|
|
1050
|
+
}], statefulEvents: [{
|
|
1051
|
+
type: Input
|
|
1052
|
+
}], stateId: [{
|
|
1053
|
+
type: Input
|
|
1054
|
+
}], stateProvider: [{
|
|
1055
|
+
type: Input
|
|
1056
|
+
}], strips: [{
|
|
1057
|
+
type: Input
|
|
1058
|
+
}], tab: [{
|
|
1059
|
+
type: Input
|
|
1060
|
+
}], tabBarItems: [{
|
|
1061
|
+
type: Input
|
|
1062
|
+
}], tag: [{
|
|
1063
|
+
type: Input
|
|
1064
|
+
}], tbar: [{
|
|
1065
|
+
type: Input
|
|
1066
|
+
}], textAlign: [{
|
|
1067
|
+
type: Input
|
|
1068
|
+
}], timeFormat: [{
|
|
1069
|
+
type: Input
|
|
1070
|
+
}], tip: [{
|
|
1071
|
+
type: Input
|
|
1072
|
+
}], todayCls: [{
|
|
1073
|
+
type: Input
|
|
1074
|
+
}], trapFocus: [{
|
|
1075
|
+
type: Input
|
|
1076
|
+
}], type: [{
|
|
1077
|
+
type: Input
|
|
1078
|
+
}], ui: [{
|
|
1079
|
+
type: Input
|
|
1080
|
+
}], weekendCls: [{
|
|
1081
|
+
type: Input
|
|
1082
|
+
}], weekRenderer: [{
|
|
1083
|
+
type: Input
|
|
1084
|
+
}], weekStartDay: [{
|
|
1085
|
+
type: Input
|
|
1086
|
+
}], weight: [{
|
|
1087
|
+
type: Input
|
|
1088
|
+
}], alignSelf: [{
|
|
1089
|
+
type: Input
|
|
1090
|
+
}], allowDragCreate: [{
|
|
1091
|
+
type: Input
|
|
1092
|
+
}], allowDragMove: [{
|
|
1093
|
+
type: Input
|
|
1094
|
+
}], allowDragResize: [{
|
|
1095
|
+
type: Input
|
|
1096
|
+
}], animateTimeShift: [{
|
|
1097
|
+
type: Input
|
|
1098
|
+
}], appendTo: [{
|
|
1099
|
+
type: Input
|
|
1100
|
+
}], autoCreate: [{
|
|
1101
|
+
type: Input
|
|
1102
|
+
}], autoRowHeight: [{
|
|
1103
|
+
type: Input
|
|
1104
|
+
}], callOnFunctions: [{
|
|
1105
|
+
type: Input
|
|
1106
|
+
}], catchEventHandlerExceptions: [{
|
|
1107
|
+
type: Input
|
|
1108
|
+
}], cls: [{
|
|
1109
|
+
type: Input
|
|
1110
|
+
}], collapsed: [{
|
|
1111
|
+
type: Input
|
|
1112
|
+
}], column: [{
|
|
1113
|
+
type: Input
|
|
1114
|
+
}], dataset: [{
|
|
1115
|
+
type: Input
|
|
1116
|
+
}], date: [{
|
|
1117
|
+
type: Input
|
|
1118
|
+
}], dateFormat: [{
|
|
1119
|
+
type: Input
|
|
1120
|
+
}], dateSeparator: [{
|
|
1121
|
+
type: Input
|
|
1122
|
+
}], defaultScrollOptions: [{
|
|
1123
|
+
type: Input
|
|
1124
|
+
}], descriptionFormat: [{
|
|
1125
|
+
type: Input
|
|
1126
|
+
}], disabled: [{
|
|
1127
|
+
type: Input
|
|
1128
|
+
}], dragUnit: [{
|
|
1129
|
+
type: Input
|
|
1130
|
+
}], eventHeight: [{
|
|
1131
|
+
type: Input
|
|
1132
|
+
}], eventSpacing: [{
|
|
1133
|
+
type: Input
|
|
1134
|
+
}], extendAllDayEndDay: [{
|
|
1135
|
+
type: Input
|
|
1136
|
+
}], extraData: [{
|
|
1137
|
+
type: Input
|
|
1138
|
+
}], filterEventResources: [{
|
|
1139
|
+
type: Input
|
|
1140
|
+
}], flex: [{
|
|
1141
|
+
type: Input
|
|
1142
|
+
}], height: [{
|
|
1143
|
+
type: Input
|
|
1144
|
+
}], hidden: [{
|
|
1145
|
+
type: Input
|
|
1146
|
+
}], hideNonWorkingDays: [{
|
|
1147
|
+
type: Input
|
|
1148
|
+
}], id: [{
|
|
1149
|
+
type: Input
|
|
1150
|
+
}], inputFieldAlign: [{
|
|
1151
|
+
type: Input
|
|
1152
|
+
}], insertBefore: [{
|
|
1153
|
+
type: Input
|
|
1154
|
+
}], insertFirst: [{
|
|
1155
|
+
type: Input
|
|
1156
|
+
}], items: [{
|
|
1157
|
+
type: Input
|
|
1158
|
+
}], keyMap: [{
|
|
1159
|
+
type: Input
|
|
1160
|
+
}], labelPosition: [{
|
|
1161
|
+
type: Input
|
|
1162
|
+
}], layout: [{
|
|
1163
|
+
type: Input
|
|
1164
|
+
}], layoutStyle: [{
|
|
1165
|
+
type: Input
|
|
1166
|
+
}], margin: [{
|
|
1167
|
+
type: Input
|
|
1168
|
+
}], maxDate: [{
|
|
1169
|
+
type: Input
|
|
1170
|
+
}], maxHeight: [{
|
|
1171
|
+
type: Input
|
|
1172
|
+
}], maximizeOnMobile: [{
|
|
1173
|
+
type: Input
|
|
1174
|
+
}], maxWidth: [{
|
|
1175
|
+
type: Input
|
|
1176
|
+
}], minDate: [{
|
|
1177
|
+
type: Input
|
|
1178
|
+
}], minHeight: [{
|
|
1179
|
+
type: Input
|
|
1180
|
+
}], minWidth: [{
|
|
1181
|
+
type: Input
|
|
1182
|
+
}], nonWorkingDays: [{
|
|
1183
|
+
type: Input
|
|
1184
|
+
}], pastEventCls: [{
|
|
1185
|
+
type: Input
|
|
1186
|
+
}], persistShrinkWrappedRows: [{
|
|
1187
|
+
type: Input
|
|
1188
|
+
}], readOnly: [{
|
|
1189
|
+
type: Input
|
|
1190
|
+
}], rendition: [{
|
|
1191
|
+
type: Input
|
|
1192
|
+
}], rtl: [{
|
|
1193
|
+
type: Input
|
|
1194
|
+
}], scrollable: [{
|
|
1195
|
+
type: Input
|
|
1196
|
+
}], shadePastDates: [{
|
|
1197
|
+
type: Input
|
|
1198
|
+
}], shortDateFormat: [{
|
|
1199
|
+
type: Input
|
|
1200
|
+
}], shortDateTimeFormat: [{
|
|
1201
|
+
type: Input
|
|
1202
|
+
}], showWeekNumber: [{
|
|
1203
|
+
type: Input
|
|
1204
|
+
}], span: [{
|
|
1205
|
+
type: Input
|
|
1206
|
+
}], stackMultiDayEvents: [{
|
|
1207
|
+
type: Input
|
|
1208
|
+
}], strictRecordMapping: [{
|
|
1209
|
+
type: Input
|
|
1210
|
+
}], syncCalendarDate: [{
|
|
1211
|
+
type: Input
|
|
1212
|
+
}], syncViewDate: [{
|
|
1213
|
+
type: Input
|
|
1214
|
+
}], title: [{
|
|
1215
|
+
type: Input
|
|
1216
|
+
}], tools: [{
|
|
1217
|
+
type: Input
|
|
1218
|
+
}], tooltip: [{
|
|
1219
|
+
type: Input
|
|
1220
|
+
}], weekColumnHeader: [{
|
|
1221
|
+
type: Input
|
|
1222
|
+
}], width: [{
|
|
1223
|
+
type: Input
|
|
1224
|
+
}], x: [{
|
|
1225
|
+
type: Input
|
|
1226
|
+
}], y: [{
|
|
1227
|
+
type: Input
|
|
1228
|
+
}], anchorSize: [{
|
|
1229
|
+
type: Input
|
|
1230
|
+
}], dayCellCls: [{
|
|
1231
|
+
type: Input
|
|
1232
|
+
}], firstVisibleCell: [{
|
|
1233
|
+
type: Input
|
|
1234
|
+
}], firstVisibleDate: [{
|
|
1235
|
+
type: Input
|
|
1236
|
+
}], focusVisible: [{
|
|
1237
|
+
type: Input
|
|
1238
|
+
}], hasChanges: [{
|
|
1239
|
+
type: Input
|
|
1240
|
+
}], isSettingValues: [{
|
|
1241
|
+
type: Input
|
|
1242
|
+
}], isValid: [{
|
|
1243
|
+
type: Input
|
|
1244
|
+
}], lastVisibleCell: [{
|
|
1245
|
+
type: Input
|
|
1246
|
+
}], lastVisibleDate: [{
|
|
1247
|
+
type: Input
|
|
1248
|
+
}], parent: [{
|
|
1249
|
+
type: Input
|
|
1250
|
+
}], record: [{
|
|
1251
|
+
type: Input
|
|
1252
|
+
}], state: [{
|
|
1253
|
+
type: Input
|
|
1254
|
+
}], values: [{
|
|
1255
|
+
type: Input
|
|
1256
|
+
}], onBeforeAutoCreate: [{
|
|
1257
|
+
type: Output
|
|
1258
|
+
}], onBeforeChangeDate: [{
|
|
1259
|
+
type: Output
|
|
1260
|
+
}], onBeforeDestroy: [{
|
|
1261
|
+
type: Output
|
|
1262
|
+
}], onBeforeHide: [{
|
|
1263
|
+
type: Output
|
|
1264
|
+
}], onBeforeRefresh: [{
|
|
1265
|
+
type: Output
|
|
1266
|
+
}], onBeforeResponsiveStateChange: [{
|
|
1267
|
+
type: Output
|
|
1268
|
+
}], onBeforeSetRecord: [{
|
|
1269
|
+
type: Output
|
|
1270
|
+
}], onBeforeShow: [{
|
|
1271
|
+
type: Output
|
|
1272
|
+
}], onBeforeShowOverflowPopup: [{
|
|
1273
|
+
type: Output
|
|
1274
|
+
}], onBeforeStateApply: [{
|
|
1275
|
+
type: Output
|
|
1276
|
+
}], onBeforeStateSave: [{
|
|
1277
|
+
type: Output
|
|
1278
|
+
}], onCatchAll: [{
|
|
1279
|
+
type: Output
|
|
1280
|
+
}], onCellClick: [{
|
|
1281
|
+
type: Output
|
|
1282
|
+
}], onCellMapPopulated: [{
|
|
1283
|
+
type: Output
|
|
1284
|
+
}], onCollapse: [{
|
|
1285
|
+
type: Output
|
|
1286
|
+
}], onDateChange: [{
|
|
1287
|
+
type: Output
|
|
1288
|
+
}], onDayCellPopulated: [{
|
|
1289
|
+
type: Output
|
|
1290
|
+
}], onDestroy: [{
|
|
1291
|
+
type: Output
|
|
1292
|
+
}], onDirtyStateChange: [{
|
|
1293
|
+
type: Output
|
|
1294
|
+
}], onElementCreated: [{
|
|
1295
|
+
type: Output
|
|
1296
|
+
}], onEmptyCellClick: [{
|
|
1297
|
+
type: Output
|
|
1298
|
+
}], onEventAutoCreated: [{
|
|
1299
|
+
type: Output
|
|
1300
|
+
}], onEventHeightChange: [{
|
|
1301
|
+
type: Output
|
|
1302
|
+
}], onEventPropagate: [{
|
|
1303
|
+
type: Output
|
|
1304
|
+
}], onExpand: [{
|
|
1305
|
+
type: Output
|
|
1306
|
+
}], onFocusIn: [{
|
|
1307
|
+
type: Output
|
|
1308
|
+
}], onFocusOut: [{
|
|
1309
|
+
type: Output
|
|
1310
|
+
}], onHide: [{
|
|
1311
|
+
type: Output
|
|
1312
|
+
}], onPaint: [{
|
|
1313
|
+
type: Output
|
|
1314
|
+
}], onReadOnly: [{
|
|
1315
|
+
type: Output
|
|
1316
|
+
}], onRecompose: [{
|
|
1317
|
+
type: Output
|
|
1318
|
+
}], onRefresh: [{
|
|
1319
|
+
type: Output
|
|
1320
|
+
}], onResize: [{
|
|
1321
|
+
type: Output
|
|
1322
|
+
}], onResponsiveStateChange: [{
|
|
1323
|
+
type: Output
|
|
1324
|
+
}], onShow: [{
|
|
1325
|
+
type: Output
|
|
1326
|
+
}], onShowOverflowPopup: [{
|
|
1327
|
+
type: Output
|
|
1328
|
+
}], onToolClick: [{
|
|
1329
|
+
type: Output
|
|
1330
|
+
}], onWeekCellClick: [{
|
|
1331
|
+
type: Output
|
|
1332
|
+
}], onWeekFlex: [{
|
|
1333
|
+
type: Output
|
|
1334
|
+
}], onWeekShrinkwrap: [{
|
|
1335
|
+
type: Output
|
|
1336
|
+
}] } });
|
|
1337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1tb250aC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tbW9udGgtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUE2WixNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV2YyxPQUFPLEVBQStGLFNBQVMsRUFBMEQsTUFBTSx3QkFBd0IsQ0FBQzs7QUEycUN4TSxNQUFNLE9BQU8seUJBQXlCO0lBb2NsQyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBb09GLGtCQUFrQjtRQUNsQjs7Ozs7Ozs7Ozs7O1dBWUc7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBeUssQ0FBQztRQUM5Tjs7Ozs7OztXQU9HO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQW9GLENBQUM7UUFDekk7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQXlFLENBQUM7UUFDeEg7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQW9ELENBQUM7UUFDdEc7Ozs7OztXQU1HO1FBQ08sa0NBQTZCLEdBQVEsSUFB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QUF6QixNQUFNO2dCQVFHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFVRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQWVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFNRyxRQUFRO3NCQUFqQixNQUFNO2dCQVdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBYUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsT0FBTztzQkFBaEIsTUFBTTtnQkFNRyxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVFHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFXRyxVQUFVO3NCQUFuQixNQUFNO2dCQVNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgZm9yIEJyeW50dW0gTW9udGhWaWV3XG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFsaWduU3BlYywgQmFzZSwgQnJ5bnR1bVNjcm9sbE9wdGlvbnMsIEJ1dHRvbkNvbmZpZywgQ2FsZW5kYXJQYW5lbCwgQ29udGFpbmVyLCBEYXRlUGlja2VyLCBEb21Db25maWcsIEtleU1hcENvbmZpZywgTGF5b3V0LCBNYXNrQ29uZmlnLCBNZW51SXRlbUNvbmZpZywgTWVudUl0ZW1FbnRyeSwgTW9kZWwsIE1vbnRoLCBNb250aENvbmZpZywgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBSZWN0YW5nbGUsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgVGFiQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5pbXBvcnQgeyBFdmVudE1vZGVsLCBSZXNvdXJjZU1vZGVsIH0gZnJvbSAnQGJyeW50dW0vc2NoZWR1bGVyLXRoaW4nO1xuaW1wb3J0IHsgQ2FsZW5kYXJWaWV3LCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWcsIENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnLCBEYXlDZWxsLCBFdmVudEJhciwgTW9udGhWaWV3LCBNb250aFZpZXdMaXN0ZW5lcnMsIE92ZXJmbG93UG9wdXAsIE92ZXJmbG93UG9wdXBDb25maWcgfSBmcm9tICdAYnJ5bnR1bS9jYWxlbmRhci10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bU1vbnRoVmlld1Byb3BzID0ge1xuICAgIC8vIENvbmZpZ3NcbiAgICAvKipcbiAgICAgKiBBIGtleSB0byB1c2UgdG8gYWN0aXZhdGUgdGhpcyB2aWV3LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWFjdGl2YXRpb25LZXkpXG4gICAgICovXG4gICAgYWN0aXZhdGlvbktleSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hZG9wdClcbiAgICAgKi9cbiAgICBhZG9wdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hbGlnbilcbiAgICAgKi9cbiAgICBhbGlnbiA/IDogQWxpZ25TcGVjfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2FsaWduLXNlbGZdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9hbGlnbi1zZWxmKSBzdHlsZS5cbiAgICAgKi9cbiAgICBhbGlnblNlbGYgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLWNyZWF0aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnQ3JlYXRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYGZhbHNlYCB0byBkaXNhYmxlIGRyYWctbW92aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnTW92ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLXJlc2l6aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnUmVzaXplID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIGFuZCBiZWluZyBzaG93biB0aHJvdWdoIFtzaG93QnldKCNDb3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tc2hvd0J5KS4qXG4gICAgICogYHRydWVgIHRvIHNob3cgYSBjb25uZWN0b3IgYXJyb3cgcG9pbnRpbmcgdG8gdGhlIGFsaWduIHRhcmdldC5cbiAgICAgKi9cbiAgICBhbmNob3IgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCB0aW1lLCB0aGUgbmV4dCB0aW1lXG4gICAgICogYmxvY2sgd2lsbCBiZSBhbmltYXRlZCBpbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYW5pbWF0ZVRpbWVTaGlmdClcbiAgICAgKi9cbiAgICBhbmltYXRlVGltZVNoaWZ0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KS5cbiAgICAgKi9cbiAgICBhcHBlbmRUbyA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3RcbiAgICAgKiBpbnRvIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaW5rZWQgdXNpbmcgdGhlIGBhcmlhLWRlc2NyaWJlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXJpYURlc2NyaXB0aW9uKVxuICAgICAqL1xuICAgIGFyaWFEZXNjcmlwdGlvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3QgYXNcbiAgICAgKiB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hcmlhTGFiZWwpXG4gICAgICovXG4gICAgYXJpYUxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGNvbmZpZyBpcyBzZXQsIHRoZW4gdGhlIGBnZXN0dXJlYCBjb25maWd1cmVkICh3aGljaCBkZWZhdWx0cyB0byBgZGJsY2xpY2tgKSBjcmVhdGVzIGFcbiAgICAgKiBuZXcgZXZlbnQgYXQgdGhlIG1vdXNlIG9yIHRvdWNoIGV2ZW50J3MgdGltZSBwb2ludC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hdXRvQ3JlYXRlKVxuICAgICAqL1xuICAgIGF1dG9DcmVhdGUgPyA6IHtcbiAgICAgICAgZ2VzdHVyZT86IHN0cmluZ1xuICAgICAgICBuZXdOYW1lPzogRnVuY3Rpb258c3RyaW5nXG4gICAgICAgIHN0ZXA/OiBzdHJpbmdcbiAgICAgICAgc25hcFR5cGU/OiAncm91bmQnfCdjZWlsJ3wnZmxvb3InXG4gICAgICAgIGR1cmF0aW9uPzogc3RyaW5nXG4gICAgICAgIHN0YXJ0SG91cj86IG51bWJlclxuICAgIH18c3RyaW5nfGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB3ZWVrcyByb3dzIGFsbCBmbGV4IHRvIHNoYXJlIHRoZSBhdmFpbGFibGUgaGVpZ2h0IGVxdWFsbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodClcbiAgICAgKi9cbiAgICBhdXRvUm93SGVpZ2h0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLFxuICAgICAqIG9yIGFycmF5IG9mIGNvbmZpZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY2hpbGQgaXRlbXMgb2YgYSBUb29sYmFyLiBBbm90aGVyIHdheSB0byBhZGQgYSBiYmFyIGlzIHRvIHVzZSBbc3RyaXBzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWJiYXIpXG4gICAgICovXG4gICAgYmJhciA/IDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBwYW5lbCdzIGJvZHkgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1ib2R5Q2xzKVxuICAgICAqL1xuICAgIGJvZHlDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWJ1YmJsZUV2ZW50cylcbiAgICAgKi9cbiAgICBidWJibGVFdmVudHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIChvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uKSB3aGljaCBjcmVhdGVzIGNvbnRlbnQgaW4sIGFuZCBtYXkgbXV0YXRlIGEgZGF5IGNlbGwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVuZGVyRGF0YVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlbmRlckRhdGEuY2VsbCBUaGUgY2VsbCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gcmVuZGVyRGF0YS5kYXRlIFRoZSBkYXRlIGZvciB0aGUgY2VsbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZW5kZXJEYXRhLmRheSBUaGUgZGF5IGZvciB0aGUgY2VsbCAoYDBgIHRvIGA2YCBmb3IgU3VuZGF5IHRvIFNhdHVyZGF5KVxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEucm93SW5kZXggVGhlIHJvdyBpbmRleCwgMCB0byBtb250aCByb3cgY291bnQgKDYgaWYgW3NpeFdlZWtzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLXNpeFdlZWtzKSBpcyBgdHJ1ZWApXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVuZGVyRGF0YS5yb3cgVGhlIHJvdyBlbGVtZW50IGVuY2Fwc3VsYXRpbmcgdGhlIHdlZWsgd2hpY2ggdGhlIGNlbGwgaXMgYSBwYXJ0IG9mXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5DYWxlbmRhclBhbmVsfSByZW5kZXJEYXRhLnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gcmVuZGVyRGF0YS5jZWxsSW5kZXggVGhlIGNlbGwgaW5kZXggaW4gdGhlIHdob2xlIHBhbmVsLiBNYXkgYmUgZnJvbSBgMGAgdG8gdXAgdG8gYDQyYFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEuY29sdW1uSW5kZXggVGhlIGNvbHVtbiBpbmRleCwgYDBgIHRvIGA2YFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEudmlzaWJsZUNvbHVtbkluZGV4IFRoZSB2aXNpYmxlIGNvbHVtbiBpbmRleCB0YWtpbmcgaGlkZGVuIG5vbiB3b3JraW5nIGRheXMgaW50byBhY2NvdW50XG4gICAgICogQHJldHVybnMge3N0cmluZyxEb21Db25maWcsdm9pZH1cbiAgICAgKi9cbiAgICBjZWxsUmVuZGVyZXIgPyA6ICgocmVuZGVyRGF0YTogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgZGF5OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXJbXSwgcm93OiBIVE1MRWxlbWVudCwgc291cmNlOiBDYWxlbmRhclBhbmVsLCBjZWxsSW5kZXg6IG51bWJlcltdLCBjb2x1bW5JbmRleDogbnVtYmVyW10sIHZpc2libGVDb2x1bW5JbmRleDogbnVtYmVyW10gfSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gY2VudHJlIHRoZSBXaWRnZXQgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBjZW50ZXJlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudC5cbiAgICAgKiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzXG4gICAgICogd2l0aCB0cnV0aHkgdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1jbHMpXG4gICAgICovXG4gICAgY2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgcGFuZWwgaXMgY29sbGFwc2VkICh0aGUgYm9keSBvZiB0aGUgcGFuZWwgaXMgaGlkZGVuIHdoaWxlIG9ubHkgdGhlIGhlYWRlciBpc1xuICAgICAqIHZpc2libGUpLiBPbmx5IHZhbGlkIGlmIHRoZSBwYW5lbCBpcyBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKS5cbiAgICAgKi9cbiAgICBjb2xsYXBzZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBlbmFibGVzIGNvbGxhcHNpYmlsaXR5IGZvciB0aGUgcGFuZWwuIFNlZSBbY29sbGFwc2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzZWQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWNvbGxhcHNpYmxlKVxuICAgICAqL1xuICAgIGNvbGxhcHNpYmxlID8gOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIHNwZWNpZmllZCBjb2xvciB0byB0aGUgd2lkZ2V0LCBieSBzZXR0aW5nIHRoZSBgLS1iLXByaW1hcnlgIENTUyB2YXJpYWJsZSBpbiB0aGUgd2lkZ2V0c1xuICAgICAqIGBzdHlsZWAgYmxvY2suXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgY29uZmlnID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykgb3IgW3Bvc2l0aW9uZWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXBvc2l0aW9uZWQpLipcbiAgICAgKiBFbGVtZW50LCBXaWRnZXQgb3IgUmVjdGFuZ2xlIHRvIHdoaWNoIHRoaXMgV2lkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICAgICAqL1xuICAgIGNvbnN0cmFpblRvID8gOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgV2lkZ2V0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpbiB0aGUgR3JpZCdzIFJvd0V4cGFuZGVyIGZlYXR1cmUncyBgd2lkZ2V0YCBjb25maWcsIHByb3ZpZGUgdGhlXG4gICAgICogZmllbGQgb24gdGhlIGV4cGFuZGVkIHJlY29yZCB0byB1c2UgZm9yIHBvcHVsYXRpbmcgdGhpcyB3aWRnZXQncyBzdG9yZSAoaWYgYXBwbGljYWJsZSlcbiAgICAgKi9cbiAgICBkYXRhRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBhcHBseSB0byBlbGVtZW50cyBkYXRhc2V0IChlYWNoIGtleSB3aWxsIGJlIHVzZWQgYXMgYSBkYXRhLWF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudClcbiAgICAgKi9cbiAgICBkYXRhc2V0ID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hpY2ggdGhpcyBDYWxlbmRhclBhbmVsIGVuY2Fwc3VsYXRlcy5cbiAgICAgKi9cbiAgICBkYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZy9mdW5jdGlvbiB0byB1c2UgdG8gY3JlYXRlIGRhdGUgb3V0cHV0IGZvciB2aWV3IGRlc2NyaXB0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBkYXRlRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSBzdGFydCBhbmQgZW5kIGRhdGVzIGluIHRoZSBbZGVzY3JpcHRpb25Gb3JtYXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRlc2NyaXB0aW9uRm9ybWF0KS5cbiAgICAgKi9cbiAgICBkYXRlU2VwYXJhdG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZy9mdW5jdGlvbiB0byBmb3JtYXQgdGhlIGRheSBuYW1lc1xuICAgICAqIGluIHRoZSBoZWFkZXIgcGFydCBvZiBlYWNoIGNhbGVuZGFyIGNlbGwuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgZGF5Q2VsbE5hbWVGb3JtYXQgPyA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBzcGVjaWZpZWQgdG8gY3JlYXRlIHRoZSBjb250ZW50IGZvciB0aGUgZGF0ZSBhbmQgZGF5IG5hbWUgc2VjdGlvbiBvZiBjYWxlbmRhciBjZWxscy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kYXlDZWxsUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBjZWxsRGF0YSBBIGBEYXlDZWxsYCBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBjZWxsLi5cbiAgICAgKiBAcGFyYW0ge0RvbUNvbmZpZyxvYmplY3R9IGRheUNlbGxEb21Db25maWcgQW4gb2JqZWN0IHRvIHN5bmMgdGhlIGRheSBjZWxsIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRheUNlbGxEb21Db25maWcuY2xhc3NOYW1lIEFuIG9iamVjdCB3aG8ncyB0cnV0aHkgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhcHBsaWVkIGFzIGNsYXNzIG5hbWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXlDZWxsRG9tQ29uZmlnLnN0eWxlIEEgQ1NTIHN0eWxlIGRlZmluaXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXlDZWxsRG9tQ29uZmlnLmRhdGFzZXQgVGhlIERPTSBkYXRhIHByb3BlcnRpZXMgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnW119IGRheUNlbGxEb21Db25maWcuY2hpbGRyZW4gVGhlIFtEb21Db25maWddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRG9tSGVscGVyI3R5cGVkZWYtRG9tQ29uZmlnKSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGNlbGwuXG4gICAgICogQHJldHVybnMge3N0cmluZyxvYmplY3Qsb2JqZWN0W119IFRoZSBkZWZpbml0aW9uIG9mIHRoZSBjZWxsIGhlYWRlciBjb250ZW50LlxuICAgICAqL1xuICAgIGRheUNlbGxSZW5kZXJlciA/IDogKGNlbGxEYXRhOiBEYXlDZWxsLCBkYXlDZWxsRG9tQ29uZmlnOiB7IGNsYXNzTmFtZTogb2JqZWN0LCBzdHlsZTogb2JqZWN0LCBkYXRhc2V0OiBvYmplY3QsIGNoaWxkcmVuOiBEb21Db25maWdbXSB9KSA9PiBzdHJpbmd8b2JqZWN0fG9iamVjdFtdXG4gICAgLyoqXG4gICAgICogVGhlIFtEYXRlSGVscGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RhdGVIZWxwZXIpIGZvcm1hdCBzdHJpbmcgdG8gZm9ybWF0IHRoZSBkYXkgbmFtZXNcbiAgICAgKiBpbiB0aGUgaGVhZGVyIHJvdyBhYm92ZSB0aGUgY2FsZW5kYXIgY2VsbHMuXG4gICAgICovXG4gICAgZGF5TmFtZUZvcm1hdCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCB3aGVuIGEgc2luZ2xlIHZhbHVlIGlzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBXaWRnZXQuIFN1Y2ggYXMgd2hlbiB1c2VkXG4gICAgICogaW4gYSBncmlkIFdpZGdldENvbHVtbiwgdGhpcyBpcyB0aGUgcHJvcGVydHkgdG8gd2hpY2ggdGhlIGNvbHVtbidzIGBmaWVsZGAgaXMgYXBwbGllZC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QmluZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIFtxdWVyeV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjZnVuY3Rpb24tcXVlcnkpIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiBpZGVudGlmeSB0aGUgZGVzY2VuZGFudCB3aWRnZXQgdG8gd2hpY2hcbiAgICAgKiBmb2N1cyBzaG91bGQgYmUgZGlyZWN0ZWQgYnkgZGVmYXVsdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZWZhdWx0Rm9jdXMpXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IHdpZGdldCBXaWRnZXQgcGFzc2VkIHRvIG1ldGhvZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnV0aHkgdmFsdWUgaWYgd2lkZ2V0IGlzIHRoZSBkZWZhdWx0IG9uZVxuICAgICAqL1xuICAgIGRlZmF1bHRGb2N1cyA/IDogKCh3aWRnZXQ6IFdpZGdldCkgPT4gYm9vbGVhbil8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzZXR0aW5ncyB0byBhcHBseSB0byBhbGwgY2hpbGQgd2lkZ2V0cy5cbiAgICAgKi9cbiAgICBkZWZhdWx0cyA/IDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyB0byBhZGQgaW50byBzY3JvbGwgb3B0aW9ucyB3aGVuIHRoZSBbc2Nyb2xsVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jZnVuY3Rpb24tc2Nyb2xsVG8pIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGVmYXVsdFNjcm9sbE9wdGlvbnMpXG4gICAgICovXG4gICAgZGVmYXVsdFNjcm9sbE9wdGlvbnMgPyA6IEJyeW50dW1TY3JvbGxPcHRpb25zXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgZm9ybWF0IHVzZWQgYnkgdGhlIGRlZmF1bHQgW2Rlc2NyaXB0aW9uUmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRlc2NyaXB0aW9uUmVuZGVyZXIpIGZvciByZW5kZXJpbmcgdGhlIHZpZXcncyBkZXNjcmlwdGlvbi5cbiAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIGBudWxsYCwgdGhlIFtkYXRlRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kYXRlRm9ybWF0KSAoYW5kIHBvdGVudGlhbGx5IFtkYXRlU2VwYXJhdG9yXSgjU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRhdGVTZXBhcmF0b3IpKSB3aWxsXG4gICAgICogYmUgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdClcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbkZvcm1hdCA/IDogc3RyaW5nfHN0cmluZ1tdfGJvb2xlYW5bXXwoKGRhdGU6IERhdGUpID0+IHN0cmluZyl8RnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgdGhpcyB2aWV3LiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlXG4gICAgICogW2Rlc2NyaXB0aW9uRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGVzY3JpcHRpb25SZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gdmlldyBUaGUgYWN0aXZlIHZpZXcgaW4gY2FzZSB0aGUgZnVuY3Rpb24gaXMgaW4gYW5vdGhlciBzY29wZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBEZXNjcmlwdGlvbiBzdHJpbmdcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvblJlbmRlcmVyID8gOiAodmlldzogV2lkZ2V0KSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBkaXNhYmxlZCBjYWxlbmRhciBjZWxscy5cbiAgICAgKi9cbiAgICBkaXNhYmxlZENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRWl0aGVyIGFuIGFycmF5IG9mIGBEYXRlYCBvYmplY3RzIHdoaWNoIGFyZSB0byBiZSBkaXNhYmxlZCAob3IgZGF0ZSBzdHJpbmdzKSwgb3JcbiAgICAgKiBhIGZ1bmN0aW9uIChvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uKSwgd2hpY2gsIHdoZW4gcGFzc2VkIGEgYERhdGVgIHJldHVybnMgYHRydWVgIGlmIHRoZVxuICAgICAqIGRhdGUgaXMgZGlzYWJsZWQuIERpc2FibGVkIGRhdGVzIGNhbm5vdCBiZSBpbnRlcmFjdGVkIHdpdGguXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIERhdGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3ZpZGVkIGRhdGUgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBkaXNhYmxlZERhdGVzID8gOiAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pfHN0cmluZ3xEYXRlW118c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBub24gd29ya2luZyBkYXlzIGFzIFtkaXNhYmxlZERhdGVzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLWRpc2FibGVkRGF0ZXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWRpc2FibGVOb25Xb3JraW5nRGF5cylcbiAgICAgKi9cbiAgICBkaXNhYmxlTm9uV29ya2luZ0RheXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyB0cnVlIHRvIGRpc2FibGUgcG9pbnRlciBpbnRlcmFjdGlvbiB3aXRoIGNlbGxzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZVxuICAgICAqIHJhbmdlIG9mIHRoZSBjdXJyZW50IG1vbnRoLlxuICAgICAqL1xuICAgIGRpc2FibGVPdGhlck1vbnRoQ2VsbHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBTYXR1cmRheXMgYW5kIFN1bmRheXMgYXMgW2Rpc2FibGVkRGF0ZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ2FsZW5kYXJQYW5lbCNjb25maWctZGlzYWJsZWREYXRlcykuXG4gICAgICovXG4gICAgZGlzYWJsZVdlZWtlbmRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsKVxuICAgICAqIFtzdHJpcHMgY29sbGVjdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRoaXMgY29uZmlnIGFyZSBgJ3RvcCdgLFxuICAgICAqIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBvciBgJ3JpZ2h0J2AsIHdoaWNoIGNhdXNlIHRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIG9uIHRoYXQgc2lkZSBvZiB0aGUgcGFuZWwnc1xuICAgICAqIGJvZHkuIFN1Y2ggd2lkZ2V0cyBhcmUgY2FsbGVkIFwiZWRnZSBzdHJpcHNcIi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBiZSBhYmxlIHRvIGRyYWcgYSB3aWRnZXQgZnJlZWx5IG9uIHRoZSBwYWdlLiBPciBzZXQgdG8gYW4gb2JqZWN0IHdpdGggYSDCtGhhbmRsZVNlbGVjdG9ywrRcbiAgICAgKiBwcm9wZXJ0eSB3aGljaCBjb250cm9scyB3aGVuIGEgZHJhZyBzaG91bGQgc3RhcnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhZ2dhYmxlKVxuICAgICAqL1xuICAgIGRyYWdnYWJsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGhhbmRsZVNlbGVjdG9yPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBbZHVyYXRpb25Vbml0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9FdmVudE1vZGVsI2ZpZWxkLWR1cmF0aW9uVW5pdCkgdG8gdXNlIHdoZW4gZHJhZy1jcmVhdGluZyBldmVudHNcbiAgICAgKiBpbiB0aGlzIHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhZ1VuaXQpXG4gICAgICovXG4gICAgZHJhZ1VuaXQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE1ha2UgdGhpcyBQYW5lbCBhIGRvY2tlZCBkcmF3ZXIgd2hpY2ggc2xpZGVzIG91dCBmcm9tIG9uZSBzaWRlIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0IGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhd2VyKVxuICAgICAqIEBwYXJhbSB7J3N0YXJ0JywnbGVmdCcsJ2VuZCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ30gc2lkZSBUaGUgc2lkZSBvZiB0aGUgdmlld3BvcnQgdG8gZG9jayB0aGUgZHJhd2VyIHRvLiAgKiBgJ3N0YXJ0J2AgbWVhbnMgdGhlIGBpbmxpbmUtc3RhcnRgIHNpZGUuICogYCdlbmQnYCBtZWFucyB0aGUgYGlubGluZS1lbmRgIHNpZGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmcsbnVtYmVyfSBzaXplIFRoZSBzaXplIG9mIHRoZSBkcmF3ZXIgaW4gaXRzIGNvbGxhcHNpYmxlIGF4aXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmxpbmUgSWYgdXNpbmcgdGhlIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyB0byBwbGFjZSB0aGUgZHJhd2VyIGluc2lkZSBhIGhvc3Qgd2lkZ2V0LCB0aGlzIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGRyYXdlciBpbmxpbmUgd2l0aGluIHRoYXQgaG9zdC4gTm90ZSB0aGF0LCBpZiB1c2luZyB0aGlzLCB0aGUgbGF5b3V0IG9mIHRoZSBob3N0IGVsZW1lbnQgbXVzdCBoYXZlIGBmbGV4LWRpcmVjdGlvbmAgc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICogQHBhcmFtIHtib29sZWFuLG9iamVjdH0gYXV0b0Nsb3NlIFNwZWNpZmllcyB3aGF0IHVzZXIgYWN0aW9ucyBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZHJhd2VyLiBEZWZhdWx0cyB0byBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGRyYXdlciBvciB3aGVuIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sc3RyaW5nfSBhdXRvQ2xvc2UubW91c2Vkb3duIElmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCBpcyB1c2VkIGFzIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbHRlciBjbGlja3Mgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLmZvY3Vzb3V0IElmIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlciwgdGhlIGRyYXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaGlkZGVuLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRvQ2xvc2UubW91c2VvdXQgSGlkZXMgdGhlIGRyYXdlciB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGRyYXdlciBhZnRlciB0aGUgYGF1dG9DbG9zZURlbGF5YCBwZXJpb2QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1dG9DbG9zZURlbGF5IFdoZW4gdXNpbmcgYG1vdXNlb3V0YCwgdGhpcyBpcyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgZHJhd2VyID8gOiBib29sZWFufHtzaWRlPzogJ3N0YXJ0J3wnbGVmdCd8J2VuZCd8J3JpZ2h0J3wndG9wJ3wnYm90dG9tJywgc2l6ZT86IHN0cmluZ3xudW1iZXIsIGlubGluZT86IGJvb2xlYW4sIGF1dG9DbG9zZTogeyBtb3VzZWRvd24/OiBib29sZWFufHN0cmluZywgZm9jdXNvdXQ/OiBib29sZWFufHN0cmluZywgbW91c2VvdXQ/OiBzdHJpbmcgfSwgYXV0b0Nsb3NlRGVsYXk/OiBudW1iZXJ9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgYXR0cmlidXRlcyB0byBhc3NpZ24gdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHdpZGdldC5cbiAgICAgKiBTZXQgYG51bGxgIHZhbHVlIHRvIGF0dHJpYnV0ZSB0byByZW1vdmUgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICovXG4gICAgZWxlbWVudEF0dHJpYnV0ZXMgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPlxuICAgIC8qKlxuICAgICAqIEEgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb250ZW50IG9mIGEgY2xpY2thYmxlXG4gICAgICogZWxlbWVudCB3aGljaCBpcyBwcmVzZW50IHdoZW4gbm8gZXZlbnRzIGFyZSBpbiBhIGNlbGwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZW1wdHlDZWxsUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBkYXlDZWxsUmVuZGVyZXIgQSBgRGF5Q2VsbGAgb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgY2VsbC5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLHZvaWR9IERvbUNvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBIVE1MIG1hcmt1cFxuICAgICAqL1xuICAgIGVtcHR5Q2VsbFJlbmRlcmVyID8gOiAoKGRheUNlbGxSZW5kZXJlcjogRGF5Q2VsbCkgPT4gRG9tQ29uZmlnfHZvaWQpfG9iamVjdHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHRvIGZpbHRlciB3aGljaCBldmVudHNcbiAgICAgKiBhcmUgY29sbGVjdGVkIGludG8gdGhlIGRheSBjZWxsIGRhdGEgYmxvY2tzLlxuICAgICAqIFJldHVybiBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgcGFzc2VkIGV2ZW50LCBvciBhICpmYWxzeSogdmFsdWUgdG8gZXhjbHVkZSB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQgdGhlIHBhc3NlZCBldmVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGV2ZW50RmlsdGVyID8gOiAoKGV2ZW50OiBFdmVudE1vZGVsKSA9PiBib29sZWFuKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHdoaWNoIHlvdVxuICAgICAqIGNhbiBzcGVjaWZ5IHRvIGN1c3RvbWl6ZSBldmVudCBET00gY29udGVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1ldmVudEhlYWRlclJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgZXZlbnQgYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZGV0YWlsLnZpZXcgVGhlIHZpZXcgcmVuZGVyaW5nIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGRldGFpbC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZGV0YWlsLnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEgQSBkYXRhIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBldmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLnN0eWxlIFRoZSBzdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgZXZlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5jbHMgVGhlIGNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZXZlbnQgZWxlbWVudCBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmljb25TdHlsZSBUaGUgaWNvblN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBpY29uIGVsZW1lbnQgaWYgYW4gaWNvbiBlbGVtZW50IGlzIHRvIGJlIHVzZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuaWNvbkNscyBUaGUgaWNvbkNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgaWNvbiBlbGVtZW50LiBJbml0aWFsbHkgc2V0IGZyb20gdGhlIGV2ZW50IHJlY29yZCdzIFtpY29uQ2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9FdmVudE1vZGVsI2ZpZWxkLWljb25DbHMpLiBDYW4gYmUgbXV0YXRlZCBieSB0aGUgcmVuZGVyZXIuIElmIG51bGwsIG9yIG5vIHByb3BlcnRpZXMgYXJlIHNldCwgbm8gaWNvbiB3aWxsIGJlIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmV2ZW50Q29sb3IgQ29sb3IgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuZGF0YXNldCBBbiBvYmplY3Qgd2hpY2ggcHJvZHVjZXMgdGhlIGBkYXRhc2V0YCBvZiB0aGUgcmVzdWx0aW5nIGV2ZW50IGJhclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc29saWRCYXIgVGhpcyBpcyB2YWxpZCBmb3Igdmlld3Mgd2hpY2ggY3JlYXRlIGV2ZW50IGJhcnMuIFRoaXMgaXMgc2V0IHRvIGB0cnVlYCBieSBkZWZhdWx0IGZvciBhbGwgZGF5IGFuZCBpbnRlcmRheSBldmVudHMgc28gdGhhdCB0aGVzZSBhcHBlYXIgYXMgYSBzb2xpZCBibG9jayBvZiBiYWNrZ3JvdW5kIGNvbG9yLiBBbiBldmVudFJlbmRlcmVyIG1heSBtdXRhdGUgdGhpcyBmbGFnIHRvIGNoYW5nZSBpbiB3aGF0IG1hbm5lciB0aGUgZXZlbnQgYmFyIGlzIGNvbG9yZWQgLSBhcyBhIHNvbGlkIGJhciBvZiBjb2xvciwgb3IgdXNpbmcgdGhlIGZvcmVncm91bmQgY29sb3IgKHRleHQgYW5kIGljb25zKSBzdWNoIGFzIHRoZSBNb250aFZpZXcsIHRoZSBDYWxlbmRhclJvdyAoYWxsIGRheSBldmVudHMgaW4gYSBEYXlWaWV3KSwgYW5kIE92ZXJmbG93UG9wdXBzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmJvZHlDb2xvciBXaGVuIHVzZWQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgY29sb3IgaXMgYXBwbGllZCB0byB0aGUgYm9keSBvZiB0aGUgZXZlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBsaWdodCBlbm91Z2ggdGhhdCB0aGUgdGV4dCBjb2xvciAoRnJvbSB0aGUgU0FTUyB2YXJpYWJsZSBgJGRheXZpZXctZXZlbnQtY29sb3JgKSBpcyB2aXNpYmxlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWwuc2hvd0J1bGxldCBJZiB0aGVyZSBpcyBubyBgaWNvbkNsc2AsIGFuZCB0aGUgZXZlbnQgaXMgbm90IHJlY3VycmluZywgdGhlbiBieSBkZWZhdWx0IGEgXCJidWxsZXRcIiBjaXJjdWxhciBpY29uIGlzIHNob3duIGlmIHRoZSB2aWV3J3MgW3Nob3dCdWxsZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLXNob3dCdWxsZXQpIGlmIHNldC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGluIGFuIGV2ZW50IHJlbmRlcmVyIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW91ci5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLERvbUNvbmZpZ1tdLHN0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIGV2ZW50SGVhZGVyUmVuZGVyZXIgPyA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nIH0sIHNob3dCdWxsZXQ6IGJvb2xlYW4gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGV2ZW50IGJhcnMgaW4gdGhpcyB2aWV3LiBUaGlzIGNhbiBiZSBhIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzIG9yIGEgQ1NTIHVuaXQgbWVhc3VyZSBzdWNoXG4gICAgICogYXMgYCcyZW0nYC5cbiAgICAgKi9cbiAgICBldmVudEhlaWdodCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24sIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gdGhlIG93bmVyc2hpcCBoaWVyYXJjaHkgd2hpY2ggeW91XG4gICAgICogY2FuIHNwZWNpZnkgdG8gY3VzdG9taXplIGV2ZW50IERPTSBjb250ZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWV2ZW50UmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBldmVudCBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBkZXRhaWwudmlldyBUaGUgdmlldyByZW5kZXJpbmcgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZGV0YWlsLmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBkZXRhaWwucmVzb3VyY2VSZWNvcmQgVGhlIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YSBBIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGV2ZW50IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuc3R5bGUgVGhlIHN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBldmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmNscyBUaGUgY2xzIHByb3BlcnR5IGlzIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBldmVudCBlbGVtZW50IGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuaWNvblN0eWxlIFRoZSBpY29uU3R5bGUgcHJvcGVydHkgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgc3R5bGUgcHJvcGVydGllcyBmb3IgdGhlIGljb24gZWxlbWVudCBpZiBhbiBpY29uIGVsZW1lbnQgaXMgdG8gYmUgdXNlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5pY29uQ2xzIFRoZSBpY29uQ2xzIHByb3BlcnR5IGlzIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBpY29uIGVsZW1lbnQuIEluaXRpYWxseSBzZXQgZnJvbSB0aGUgZXZlbnQgcmVjb3JkJ3MgW2ljb25DbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL0V2ZW50TW9kZWwjZmllbGQtaWNvbkNscykuIENhbiBiZSBtdXRhdGVkIGJ5IHRoZSByZW5kZXJlci4gSWYgbnVsbCwgb3Igbm8gcHJvcGVydGllcyBhcmUgc2V0LCBubyBpY29uIHdpbGwgYmUgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEuZXZlbnRDb2xvciBDb2xvciB0byBiZSBhcHBsaWVkIHRvIHRoZSBldmVudC4gVGhpcyBtYXkgYmUgYSBDU1MgY29sb3IgbmFtZSBvciBhIENTUyBjb2xvciB2YWx1ZSBpbiBhbnkgb2YgdGhlIHN1cHBvcnRlZCBDU1MgY29sb3IgZm9ybWF0cyBzdWNoIGFzIGAjUlJHR0JCYCwgYHJnYigyNTUsIDAsIDApYCwgb3IgYHJnYmEoMjU1LCAwLCAwLCAwLjUpYC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEuZXZlbnRCYWNrZ3JvdW5kIEEgQ1NTIGJhY2tncm91bmQgc3R5bGUgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnQuIFRoaXMgaXMgbm90IHNldCBieSBkZWZhdWx0LCBidXQgY2FuIGJlIHNldCBieSB0aGUgcmVuZGVyZXIgdG8gcHJvdmlkZSBhIGJhY2tncm91bmQgaW1hZ2Ugb3IgZ3JhZGllbnQgZm9yIHRoZSBldmVudCBiYXIuIFRoaXMgb3ZlcnJpZGVzIHRoZSBgZXZlbnRDb2xvcmAgcHJvcGVydHkgaWYgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEudGV4dENvbG9yIEEgQ1NTIGNvbG9yIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGV2ZW50IHRleHQuIFRoaXMgaXMgbm90IHNldCBieSBkZWZhdWx0LCBidXQgY2FuIGJlIHNldCBieSB0aGUgcmVuZGVyZXIgdG8gcHJvdmlkZSBhIGN1c3RvbSBjb2xvciBmb3IgdGhlIGV2ZW50IG5hbWUgdGV4dCBpbiB0aGUgZXZlbnQgYmFyLiBUaGlzIG1heSBiZSBhIENTUyBjb2xvciBuYW1lIG9yIGEgQ1NTIGNvbG9yIHZhbHVlIGluIGFueSBvZiB0aGUgc3VwcG9ydGVkIENTUyBjb2xvciBmb3JtYXRzIHN1Y2ggYXMgYCNSUkdHQkJgLCBgcmdiKDI1NSwgMCwgMClgLCBvciBgcmdiYSgyNTUsIDAsIDAsIDAuNSlgLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5ldmVudElubmVyU3R5bGUgVGhlIGV2ZW50SW5uZXJTdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgaW5uZXIgcGFydCBvZiB0aGUgZXZlbnQgZWxlbWVudCwgdGhlIGAuYi1jYWwtZXZlbnRgIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmRhdGFzZXQgQW4gb2JqZWN0IHdoaWNoIHByb2R1Y2VzIHRoZSBgZGF0YXNldGAgb2YgdGhlIHJlc3VsdGluZyBldmVudCBiYXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRldGFpbC5yZW5kZXJEYXRhLnNvbGlkQmFyIFRoaXMgaXMgdmFsaWQgZm9yIHZpZXdzIHdoaWNoIGNyZWF0ZSBldmVudCBiYXJzLiBUaGlzIGlzIHNldCB0byBgdHJ1ZWAgYnkgZGVmYXVsdCBmb3IgYWxsIGRheSBhbmQgaW50ZXJkYXkgZXZlbnRzIHNvIHRoYXQgdGhlc2UgYXBwZWFyIGFzIGEgc29saWQgYmxvY2sgb2YgYmFja2dyb3VuZCBjb2xvci4gQW4gZXZlbnRSZW5kZXJlciBtYXkgbXV0YXRlIHRoaXMgZmxhZyB0byBjaGFuZ2UgaW4gd2hhdCBtYW5uZXIgdGhlIGV2ZW50IGJhciBpcyBjb2xvcmVkIC0gYXMgYSBzb2xpZCBiYXIgb2YgY29sb3IsIG9yIHVzaW5nIHRoZSBmb3JlZ3JvdW5kIGNvbG9yICh0ZXh0IGFuZCBpY29ucykgc3VjaCBhcyB0aGUgTW9udGhWaWV3LCB0aGUgQ2FsZW5kYXJSb3cgKGFsbCBkYXkgZXZlbnRzIGluIGEgRGF5VmlldyksIGFuZCBPdmVyZmxvd1BvcHVwc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwucmVuZGVyRGF0YS5ib2R5Q29sb3IgV2hlbiB1c2VkIGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIGNvbG9yIGlzIGFwcGxpZWQgdG8gdGhlIGJvZHkgb2YgdGhlIGV2ZW50IGVsZW1lbnQuIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgbGlnaHQgZW5vdWdoIHRoYXQgdGhlIHRleHQgY29sb3IgKEZyb20gdGhlIFNBU1MgdmFyaWFibGUgYCRkYXl2aWV3LWV2ZW50LWNvbG9yYCkgaXMgdmlzaWJsZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc2hvd0J1bGxldCBJZiB0aGVyZSBpcyBubyBgaWNvbkNsc2AsIGFuZCB0aGUgZXZlbnQgaXMgbm90IHJlY3VycmluZywgdGhlbiBieSBkZWZhdWx0IGEgXCJidWxsZXRcIiBjaXJjdWxhciBpY29uIGlzIHNob3duIGlmIHRoZSB2aWV3J3MgW3Nob3dCdWxsZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLXNob3dCdWxsZXQpIGlmIHNldC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGluIGFuIGV2ZW50IHJlbmRlcmVyIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW91ci5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLERvbUNvbmZpZ1tdLHN0cmluZyx2b2lkfSBUaGUgY29udGVudCB0byBiZSB1c2VkIGFzIHRoZSBldmVudCBib2R5LlxuICAgICAqL1xuICAgIGV2ZW50UmVuZGVyZXIgPyA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGV2ZW50QmFja2dyb3VuZDogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZXZlbnRJbm5lclN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nLCBzaG93QnVsbGV0OiBib29sZWFuIH0gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHdoaWNoIGNvbXBhcmVzIGV2ZW50cyB3aGljaCBzb21lIHZpZXdzIHVzZSB0byBkZWNpZGUgdXBvbiByZW5kZXJpbmcgb3JkZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbCxFdmVudEJhcn0gbGhzIFRoZSBsZWZ0IHNpZGUgdmFsdWUgdG8gY29ucGFyZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWwsRXZlbnRCYXJ9IHJocyBUaGUgcmlnaHQgc2lkZSB2YWx1ZSB0byBjb25wYXJlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBldmVudFNvcnRlciA/IDogKGxoczogRXZlbnRNb2RlbHxFdmVudEJhciwgcmhzOiBFdmVudE1vZGVsfEV2ZW50QmFyKSA9PiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBIb3cgbXVjaCB2ZXJ0aWNhbCBzcGFjZSBpbiBwaXhlbHMgdG8gbGVhdmUgYmV0d2VlbiBldmVudCBiYXJzIGluIGEgY2VsbC5cbiAgICAgKi9cbiAgICBldmVudFNwYWNpbmcgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBlbmQgZGF0ZSBvZiBhbiBhbGwgZGF5IGV2ZW50IGlzIGRpc3BsYXllZCBpbiB0aGUgVUkgYXNcbiAgICAgKiB0aGUgbGFzdCBjYWxlbmRhciBkYXRlIG9uIHdoaWNoIHRoZSBldmVudCBmYWxscy4gRm9yIG1vc3QgZW5kIHVzZXJzLCB0aGlzIGlzIHRoZVxuICAgICAqIGV4cGVjdGVkIHZhbHVlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWV4dGVuZEFsbERheUVuZERheSlcbiAgICAgKi9cbiAgICBleHRlbmRBbGxEYXlFbmREYXkgPyA6IGJvb2xlYW5cbiAgICBleHRyYURhdGEgPyA6IGFueVxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgdGhlbiB3aGVuIGRldGVybWluaW5nIHdoaWNoIGFzc2lnbmVkIHJlc291cmNlIG9mIGEgbXVsdGkgYXNzaWduZWQgZXZlbnRcbiAgICAgKiB0byB1c2UgdG8gY3JlYXRlIHRoZSBldmVudCBVSSwgdGhlIGZpcnN0IHJlc291cmNlIHdoaWNoIGlzIHN0aWxsIHNlbGVjdGVkIGluIHRoZVxuICAgICAqIFtyZXNvdXJjZUZpbHRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhciNwcm9wZXJ0eS1yZXNvdXJjZUZpbHRlcikgaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1maWx0ZXJFdmVudFJlc291cmNlcylcbiAgICAgKi9cbiAgICBmaWx0ZXJFdmVudFJlc291cmNlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbW92ZSB0aGUgd2lkZ2V0IG91dCBvZiB0aGUgZG9jdW1lbnQgZmxvdyBhbmQgcG9zaXRpb24gaXRcbiAgICAgKiBhYnNvbHV0ZWx5IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgZmxvYXRpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWcgb2JqZWN0IG9mIGEgZm9vdGVyLiBNYXkgY29udGFpbiBhIGBkb2NrYCwgYGh0bWxgIGFuZCBhIGBjbHNgIHByb3BlcnR5LiBBIGZvb3RlciBpcyBub3QgYSB3aWRnZXQsXG4gICAgICogYnV0IHJhdGhlciBwbGFpbiBIVE1MIHRoYXQgZm9sbG93cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYW5lbCdzIGJvZHkgYW5kIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZm9vdGVyKVxuICAgICAqL1xuICAgIGZvb3RlciA/IDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBGdW5jdGlvbiAob3IgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5KSB3aGljaCByZXR1cm5zIHRoZVxuICAgICAqIFtyZXNvdXJjZSByZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIHRvIHVzZSB0byBjcmVhdGUgdGhlIFVJIGZvciBhbiBldmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1nZXRQcmltYXJ5UmVzb3VyY2UpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnRSZWNvcmQgVGhlIGV2ZW50IGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSByZXNvdXJjZS5cbiAgICAgKiBAcmV0dXJucyB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZSB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgZ2V0UHJpbWFyeVJlc291cmNlID8gOiAoKGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsKSA9PiBSZXNvdXJjZU1vZGVsKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI3R5cGVkZWYtUGFuZWxIZWFkZXIpIGZvciB0aGUgcGFuZWwncyBoZWFkZXIgb3IgYSBzdHJpbmcgaW4gcGxhY2Ugb2YgYSBgdGl0bGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiAob3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbikgd2hpY2ggY3JlYXRlcyBjb250ZW50IGluLCBhbmQgbWF5IG11dGF0ZSBhIGRheSBoZWFkZXIgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1oZWFkZXJSZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjZWxsIFRoZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBUaGUgZGF5IGNvbHVtbi4gV2lsbCBiZSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGA2YFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3ZWVrRGF5IFRoZSBjYW5vbmljYWwgZGF5IG51bWJlciB3aGVyZSBNb25kYXkgaXMgYDBgIGFuZCBTdW5kYXkgaXMgYDZgXG4gICAgICogQHJldHVybnMge3N0cmluZyxEb21Db25maWcsdm9pZH1cbiAgICAgKi9cbiAgICBoZWFkZXJSZW5kZXJlciA/IDogKChjZWxsOiBIVE1MRWxlbWVudCwgY29sdW1uSW5kZXg6IG51bWJlciwgd2Vla0RheTogbnVtYmVyKSA9PiBzdHJpbmd8RG9tQ29uZmlnfHZvaWQpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctaGlkZUFuaW1hdGlvbilcbiAgICAgKi9cbiAgICBoaWRlQW5pbWF0aW9uID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGlkZSBbbm9uV29ya2luZ0RheXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLW5vbldvcmtpbmdEYXlzKVxuICAgICAqL1xuICAgIGhpZGVOb25Xb3JraW5nRGF5cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGB0cnVlYCB0byBoaWRlIGNlbGxzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCBtb250aC5cbiAgICAgKi9cbiAgICBoaWRlT3RoZXJNb250aENlbGxzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gbWFrZSB0aGlzIGNvbnRhaW5lciBoaWRlIHdoZW4gaXQgaGFzIG5vIHZpc2libGUgY2hpbGRyZW4gKEVpdGhlciBlbXB0eVxuICAgICAqIG9yIGFsbCBjaGlsZHJlbiBoaWRkZW4pLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWhpZGVXaGVuRW1wdHkpXG4gICAgICovXG4gICAgaGlkZVdoZW5FbXB0eSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGljb24gdG8gc2hvdyBiZWZvcmUgdGhlIFt0aXRsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdGl0bGUpLiBFaXRoZXIgcGFzcyBhIENTUyBjbGFzcyBhcyBhIHN0cmluZywgb3IgcGFzcyBhXG4gICAgICogW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCBkZXNjcmliaW5nIGFuIGVsZW1lbnQgdG8gcmVwcmVzZW50IHRoZSBpY29uLlxuICAgICAqL1xuICAgIGljb24gPyA6IHN0cmluZ3xEb21Db25maWdcbiAgICAvKipcbiAgICAgKiBXaWRnZXQgaWQsIGlmIG5vdCBzcGVjaWZpZWQgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiBBbHNvIHVzZWQgZm9yIGxvb2t1cHMgdGhyb3VnaCBXaWRnZXQuZ2V0QnlJZFxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1pbnB1dEZpZWxkQWxpZ24pXG4gICAgICovXG4gICAgaW5wdXRGaWVsZEFsaWduID8gOiAnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBDU1MgY2xhc3MgdG8gYWRkIHRvIGNoaWxkIGl0ZW1zIG9mIHRoaXMgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGl0ZW1DbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHR5cGVkIGNoaWxkIHdpZGdldCBjb25maWcgb2JqZWN0cyBvciBXaWRnZXRzLiBNYXkgYWxzbyBiZSBzcGVjaWZpZWRcbiAgICAgKiBhcyBhbiBhcnJheS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1pdGVtcylcbiAgICAgKi9cbiAgICBpdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfE1lbnVJdGVtRW50cnk+fChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1FbnRyeXxXaWRnZXQpW11cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdGhlIFtrZXldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSkgbmFtZVxuICAgICAqIGFuZCBvcHRpb25hbCBtb2RpZmllciBwcmVmaXhlczogYCdDdHJsKydgLCBgJ0FsdCsnYCwgYCdNZXRhKydgLCBhbmQgYCdTaGlmdCsnYCAoY2FzZS1pbnNlbnNpdGl2ZSkuIFRoZSB2YWx1ZXNcbiAgICAgKiBhcmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIG1ldGhvZCB0byBjYWxsIHdoZW4gdGhlIGtleXN0cm9rZSBpcyByZWNlaXZlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1rZXlNYXApXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHNob3J0IG5hbWUgb2YgYSBoZWxwZXIgY2xhc3Mgd2hpY2ggbWFuYWdlcyByZW5kZXJpbmcgYW5kIHN0eWxpbmcgb2YgY2hpbGQgaXRlbXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGF5b3V0KVxuICAgICAqL1xuICAgIGxheW91dCA/IDogc3RyaW5nfENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIENTUyBzdHlsZSBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1sYXlvdXRTdHlsZSlcbiAgICAgKi9cbiAgICBsYXlvdXRTdHlsZSA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW2NoaWxkIGl0ZW1dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1pdGVtcykgKmNvbmZpZyBvYmplY3RzKiB3aGljaCBpcyB0byBiZSBjb252ZXJ0ZWQgaW50b1xuICAgICAqIGluc3RhbmNlcyBvbmx5IHdoZW4gdGhpcyBDb250YWluZXIgaXMgcmVuZGVyZWQsIHJhdGhlciB0aGFuIGVhZ2VybHkgYXQgY29uc3RydWN0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGF6eUl0ZW1zKVxuICAgICAqL1xuICAgIGxhenlJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IE1vbnRoVmlld0xpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxvY2FsaXphYmxlUHJvcGVydGllcylcbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZVByb3BlcnRpZXMgPyA6IHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgbWFyZ2luLiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGBUUkJMYCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXJnaW4gPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBvYmplY3QgY29udGFpbnMgdGhlIGRlZmF1bHRzIGZvciB0aGUgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY3JlYXRlZCBmb3IgdGhlXG4gICAgICogW21hc2tlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tlZCkgY29uZmlnLiBBbnkgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhlIGBtYXNrZWRgIGNvbmZpZyB3aWxsIG92ZXJyaWRlIHRoZXNlXG4gICAgICogdmFsdWVzLlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGRhdGUgdG8gd2hpY2ggdGhlIGBlbmREYXRlYCBvZiB0aGlzIHZpZXcgbWF5IGJlIG5hdmlnYXRlZC5cbiAgICAgKi9cbiAgICBtYXhEYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgdG8gc2hvdyBpbiBhIGNlbGwgd2hlbiB0aGUgcm93IGlzIHNocmlua3dyYXBwZWQuXG4gICAgICogVXNlIHRoaXMgdG8ga2VlcCByb3dzIHRvIGEgc2FuZSBzaXplIHdoZW4gdXNpbmcgW2F1dG9Sb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodCksXG4gICAgICogb3IgdGhlIFtXZWVrRXhwYW5kZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9XZWVrRXhwYW5kZXIpIGZlYXR1cmUuXG4gICAgICovXG4gICAgbWF4RXZlbnRzUGVyQ2VsbCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtYXhIZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1tYXhpbWl6ZU9uTW9iaWxlKVxuICAgICAqL1xuICAgIG1heGltaXplT25Nb2JpbGUgPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWF4V2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgZGF5IGNlbGxzIGZsZXggdG8gc2hhcmUgYXZhaWxhYmxlIFBhbmVsIHdpZHRoIGVxdWFsbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbWluQ29sdW1uV2lkdGgpXG4gICAgICovXG4gICAgbWluQ29sdW1uV2lkdGggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIGRhdGUgdG8gd2hpY2ggdGhlIGBzdGFydERhdGVgIG9mIHRoaXMgdmlldyBtYXkgYmUgbmF2aWdhdGVkLlxuICAgICAqL1xuICAgIG1pbkRhdGUgPyA6IERhdGV8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluSGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgd2VlayByb3dzIGZsZXggdG8gc2hhcmUgYXZhaWxhYmxlIFBhbmVsIGhlaWdodCBlcXVhbGx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW1pblJvd0hlaWdodClcbiAgICAgKi9cbiAgICBtaW5Sb3dIZWlnaHQgPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGlzIGNvbmZpZ3VyZWQgYXMgYHRydWVgIGEgW1Jlc2l6ZU9ic2VydmVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzaXplT2JzZXJ2ZXIpXG4gICAgICogaXMgdXNlZCB0byBtb25pdG9yIHRoaXMgZWxlbWVudCBmb3Igc2l6ZSBjaGFuZ2VzIGNhdXNlZCBieSBlaXRoZXIgc3R5bGUgbWFuaXB1bGF0aW9uLCBvciBieSBDU1NcbiAgICAgKiBsYXlvdXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbW9uaXRvclJlc2l6ZSlcbiAgICAgKi9cbiAgICBtb25pdG9yUmVzaXplID8gOiBib29sZWFufHtcbiAgICAgICAgaW1tZWRpYXRlPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFtNb250aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3V0aWwvTW9udGgpIE1vbnRoIHV0aWxpdHkgb2JqZWN0IHdoaWNoIGVuY2Fwc3VsYXRlcyB0aGlzIFBhbmVsJ3MgbW9udGhcbiAgICAgKiBhbmQgcHJvdmlkZXMgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgbmF2aWdhdGlvbiBzZXJ2aWNlcy5cbiAgICAgKi9cbiAgICBtb250aCA/IDogTW9udGh8TW9udGhDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IGNvbmZpZyBvYmplY3RzIHdoaWNoIG1heSBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gdGhlIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKVxuICAgICAqIGNvbmZpZy4gRm9yIGV4YW1wbGUsIGEgc3BlY2lhbGl6ZWQgW01lbnVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWVudSkgc3ViY2xhc3MgbWF5IGhhdmUgYSBgbmFtZWRJdGVtc2AgZGVmYXVsdFxuICAgICAqIHZhbHVlIGRlZmluZWQgbGlrZSB0aGlzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW5hbWVkSXRlbXMpXG4gICAgICovXG4gICAgbmFtZWRJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBjZWxscyB3aGljaCBhcmUgW25vbldvcmtpbmdEYXlzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLW5vbldvcmtpbmdEYXlzKS5cbiAgICAgKi9cbiAgICBub25Xb3JraW5nRGF5Q2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBOb24td29ya2luZyBkYXlzIGFzIGFuIG9iamVjdCB3aGVyZSBrZXlzIGFyZSBkYXkgaW5kaWNlcywgMC02IChTdW5kYXktU2F0dXJkYXkpLCBhbmQgdGhlIHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBEZWZhdWx0cyB0byBbbm9uV29ya2luZ0RheXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlciNwcm9wZXJ0eS1ub25Xb3JraW5nRGF5cy1zdGF0aWMpLlxuICAgICAqL1xuICAgIG5vbldvcmtpbmdEYXlzID8gOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPlxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBjZWxscyB3aGljaCBhcmUgaW4gdGhlIHByZXZpb3VzIG9yIG5leHQgbW9udGguXG4gICAgICovXG4gICAgb3RoZXJNb250aENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiwgb3IgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGlzIHBhc3NlZCB0aGUgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCB3aGljaFxuICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIFwiK24gbW9yZVwiIGJ1dHRvbiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIGRheSBjZWxsIGhhc1xuICAgICAqIG92ZXJmbG93aW5nIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1vdmVyZmxvd0J1dHRvblJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnLG9iamVjdH0gZG9tQ29uZmlnIEEgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIGNvbmZpZyBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIG92ZXJmbG93IGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tQ29uZmlnLnRhZyBUaGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Db25maWcuY2xhc3NOYW1lIEFuIG9iamVjdCB3aG8ncyB0cnV0aHkgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhcHBsaWVkIGFzIGNsYXNzIG5hbWVzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21Db25maWcudGV4dCBUaGUgaW5uZXIgY29udGVudCBvZiB0aGUgZWxlbWVudC4gPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyB3aWxsIGJlIEhUTUwgZW5jb2RlZCBmb3IgWFNTIHNhZmV0eTwvc3Ryb25nPlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Db25maWcuc3R5bGUgQSBDU1Mgc3R5bGUgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRvbUNvbmZpZy5kYXRhc2V0IFRoZSBET00gZGF0YSBwcm9wZXJ0aWVzIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3ZlcmZsb3dDb3VudCBUaGUgbnVtYmVyIG9mIG92ZXJmbG93aW5nIGV2ZW50cy5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLHN0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIG92ZXJmbG93QnV0dG9uUmVuZGVyZXIgPyA6IChkb21Db25maWc6IHsgdGFnOiBzdHJpbmcsIGNsYXNzTmFtZTogb2JqZWN0LCB0ZXh0OiBzdHJpbmcsIHN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCB9LCBvdmVyZmxvd0NvdW50OiBudW1iZXIpID0+IERvbUNvbmZpZ3xzdHJpbmd8dm9pZFxuICAgIC8qKlxuICAgICAqIEhvdyB0aGUgdmlldyByZXNwb25kcyB0byBjbGlja2luZyBvbiBhIGArbiBtb3JlYCBidXR0b24gaW4gYW4gb3ZlcmZsb3dpbmcgZGF5IGNlbGwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctb3ZlcmZsb3dDbGlja0FjdGlvbilcbiAgICAgKi9cbiAgICBvdmVyZmxvd0NsaWNrQWN0aW9uID8gOiAncG9wdXAnfCdleHBhbmQnXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBbT3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvT3ZlcmZsb3dQb3B1cCkgdGhhdCB0aGlzIHZpZXdcbiAgICAgKiBtYXkgc2hvdyB3aGVuIGV2ZW50cyBmb3Igb25lIGRheSBvdmVyZmxvdyB0aGUgYXZhaWxhYmxlIHNwYWNlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW92ZXJmbG93UG9wdXApXG4gICAgICovXG4gICAgb3ZlcmZsb3dQb3B1cCA/IDogT3ZlcmZsb3dQb3B1cENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBwb2ludGVyIGdlc3R1cmUgd2hpY2ggc2hvd3MgdGhlIHBvcHVwIGNvbnRhaW5pbmcgYW55IG92ZXJmbG93aW5nIGV2ZW50c1xuICAgICAqIGluIHRoZSBjdXJyZW50IHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctb3ZlcmZsb3dQb3B1cFRyaWdnZXIpXG4gICAgICovXG4gICAgb3ZlcmZsb3dQb3B1cFRyaWdnZXIgPyA6ICdjbGljayd8J21vdXNlb3Zlcid8J2hvdmVyJ1xuICAgIC8qKlxuICAgICAqIFRoZSBvd25pbmcgV2lkZ2V0IG9mIHRoaXMgV2lkZ2V0LiBJZiB0aGlzIFdpZGdldCBpcyBkaXJlY3RseSBjb250YWluZWQgKHRoYXQgaXMsIGl0IGlzIG9uZSBvZiB0aGVcbiAgICAgKiBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWl0ZW1zKSBvZiBhIENvbnRhaW5lciksIHRoaXMgY29uZmlnIHdpbGwgYmUgaWdub3JlZC4gSW4gdGhpcyBjYXNlXG4gICAgICogdGhlIG93bmVyIGlzIDxzdHJvbmc+YWx3YXlzPC9zdHJvbmc+IHRoZSBlbmNhcHN1bGF0aW5nIENvbnRhaW5lci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1vd25lcilcbiAgICAgKi9cbiAgICBvd25lciA/IDogV2lkZ2V0fGFueVxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBldmVudHMgd2hpY2ggaGF2ZSBhbiBlbmQgZGF0ZSBpbiB0aGUgcGFzdC4gRGVmYXVsdHMgdG8gYCdiLXBhc3QtZXZlbnQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1wYXN0RXZlbnRDbHMpXG4gICAgICovXG4gICAgcGFzdEV2ZW50Q2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCByb3dzIHdoaWNoIGhhdmUgYmVlbiBtb2RpZmllZCBieSB0aGUgW1dlZWtFeHBhbmRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1dlZWtFeHBhbmRlcilcbiAgICAgKiBmZWF0dXJlLCA8c3Ryb25nPm5vdCBieSB0aGUgW2F1dG9Sb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodCkgc2V0dGluZzwvc3Ryb25nPiwgdG8gc2hpbmt3cmFwIGxhcmdlIGNvbnRlbnRcbiAgICAgKiBhcmUgcmVzZXQgdG8gZmxleGVkIGhlaWdodCBvbiBtb250aCBjaGFuZ2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcGVyc2lzdFNocmlua1dyYXBwZWRSb3dzKVxuICAgICAqL1xuICAgIHBlcnNpc3RTaHJpbmtXcmFwcGVkUm93cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgd2hlbiBhIHdpZGdldCBpcyByZW5kZXJlZCBpbnRvIGFub3RoZXIgd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCksIGJ1dCBtdXN0XG4gICAgICogbm90IHBhcnRpY2lwYXRlIGluIHRoZSBzdGFuZGFyZCBsYXlvdXQgb2YgdGhhdCB3aWRnZXQsIGFuZCBtdXN0IGJlIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGF0XG4gICAgICogd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcG9zaXRpb25lZClcbiAgICAgKi9cbiAgICBwb3NpdGlvbmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJldmVudCB0b29sdGlwIGZyb20gYmVpbmcgZGlzcGxheWVkIG9uIHRvdWNoIGRldmljZXMuIFVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IgYnV0dG9ucyB0aGF0IGRpc3BsYXkgYVxuICAgICAqIG1lbnUgb24gY2xpY2sgZXRjLCBzaW5jZSB0aGUgdG9vbHRpcCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKi9cbiAgICBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgd2lkZ2V0IGlzIHJlYWQtb25seS4gIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgd2lkZ2V0IGlzIGFuIGlucHV0XG4gICAgICogZmllbGQsIDxzdHJvbmc+b3IgY29udGFpbnMgaW5wdXQgZmllbGRzIGF0IGFueSBkZXB0aDwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yZWFkT25seSlcbiAgICAgKi9cbiAgICByZWFkT25seSA/IDogYm9vbGVhblxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBkZWZhdWx0IGByZW5kaXRpb25gIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCB3aWRnZXRzLCBvciBhIG1hcCBvZiByZW5kaXRpb25zIGtleWVkIGJ5IGNoaWxkIHdpZGdldFxuICAgICAqIGB0eXBlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yZW5kaXRpb24pXG4gICAgICovXG4gICAgcmVuZGl0aW9uID8gOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsXG4gICAgLyoqXG4gICAgICogUGF0aCB0byBsb2FkIHJlc291cmNlIGltYWdlcyBmcm9tLiBVc2VkIGJ5IHRoZSBbc2hvd1Jlc291cmNlQXZhdGFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvd1Jlc291cmNlQXZhdGFycykgY29uZmlnXG4gICAgICogdG8gY3JlYXRlIFVSTHMgdXNpbmcgdGhlIHJlc291cmNlJ3NcbiAgICAgKiBbaW1hZ2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwjZmllbGQtaW1hZ2UpIG9yXG4gICAgICogW2ltYWdlVXJsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsI2ZpZWxkLWltYWdlVXJsKSBmaWVsZHM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzb3VyY2VJbWFnZVBhdGgpXG4gICAgICovXG4gICAgcmVzb3VyY2VJbWFnZVBhdGggPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdmFyaW91cyByZXNwb25zaXZlIHN0YXRlIG9iamVjdHMga2V5ZWQgYnkgdGhlaXIgbmFtZS4gRWFjaCBrZXkgKGV4Y2VwdCBgJyonYCwgc2VlIGJlbG93KSBpblxuICAgICAqIHRoaXMgb2JqZWN0IGlzIGEgc3RhdGUgbmFtZSAoc2VlIFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSkgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZVxuICAgICAqIGFzc29jaWF0ZWQgW1Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI3R5cGVkZWYtUmVzcG9uc2l2ZVN0YXRlKSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzcG9uc2l2ZSlcbiAgICAgKi9cbiAgICByZXNwb25zaXZlID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hpY2ggZGVzY3JpYmVzIGhvdyB0aGUgZXZlbnQgYmFyIGhlaWdodCBpbiBtb250aCBjZWxscyBzaG91bGQgcmVzcG9uZCB0byBjaGFuZ2VzXG4gICAgICogaW4gYXZhaWxhYmxlIHZlcnRpY2FsIHNwYWNlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJlc3BvbnNpdmVFdmVudEhlaWdodClcbiAgICAgKi9cbiAgICByZXNwb25zaXZlRXZlbnRIZWlnaHQgPyA6IFJlY29yZDwoJ3RocmVzaG9sZCd8J21pbkhlaWdodCcpLCBudW1iZXI+fFJlY29yZDxudW1iZXIsIG51bWJlcj5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG1hcmsgdGhpcyBpbnN0YW5jZSBhcyB0aGUgZGVmYXVsdCBbcmVzcG9uc2l2ZVRhcmdldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlVGFyZ2V0KSBmb3IgZGVzY2VuZGFudHMgdGhhdCBkb1xuICAgICAqIG5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0IFtyZXNwb25zaXZlVGFyZ2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIG9mIHRoZWlyIG93bi5cbiAgICAgKi9cbiAgICByZXNwb25zaXZlUm9vdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIFtyZXNwb25zaXZlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmUpIGNvbmZpZy4gVGhpcyBpcyBhc3NpZ25lZCBpbnRlcm5hbGx5XG4gICAgICogYW5kIHNob3VsZCBub3QgYmUgYXNzaWduZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVN0YXRlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgd2lkZ2V0IHdob3NlIHNpemUgYW5kIG90aGVyIHByb3BlcnRpZXMgZHJpdmUgdGhpcyBvYmplY3QncyByZXNwb25zaXZlIGJlaGF2aW9yLiBJZiB0aGlzIGNvbmZpZyBpcyBub3RcbiAgICAgKiBzcGVjaWZpZWQsIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHRoYXQgc3BlY2lmaWVkIFtyZXNwb25zaXZlUm9vdD10cnVlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVSb290KSB3aWxsIGJlXG4gICAgICogdXNlZC4gSWYgdGhlcmUgaXMgbm8gc3VjaCBhbmNlc3RvciwgdGhlbiB0aGUgaW5zdGFuY2UgdXNpbmcgdGhpcyBtaXhpbiBpcyB1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVRhcmdldCA/IDogc3RyaW5nfFdpZGdldFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgY29tcG9uZW50IGRpc3BsYXkgYSB0cmFuc2x1Y2VudCByaXBwbGUgd2hlbiBpdHNcbiAgICAgKiBbZm9jdXNFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1mb2N1c0VsZW1lbnQpLCBvciBbZWxlbWVudF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyB0YXBwZWQgPGVtPmlmIHRoZVxuICAgICAqIGN1cnJlbnQgdGhlbWUgc3VwcG9ydHMgcmlwcGxlczwvZW0+LiBPdXQgb2YgdGhlIGJveCwgb25seSB0aGUgTWF0ZXJpYWwgdGhlbWUgc3VwcG9ydHMgcmlwcGxlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yaXBwbGUpXG4gICAgICovXG4gICAgcmlwcGxlID8gOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgeW91IGFyZSByZW5kZXJpbmcgdGhpcyB3aWRnZXQgdG8gYSBzaGFkb3cgcm9vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgdGhpcyBjb25maWcgdG8gdGhlIHNoYWRvd1Jvb3QuIElmIG5vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgaXQgdG8gYGRvY3VtZW50LmJvZHlgXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQgPyA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnRcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJ0bClcbiAgICAgKi9cbiAgICBydGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciAoYW5kIG9wdGlvbmFsbHkgaW4gd2hpY2ggYXhlcykgYSBXaWRnZXQgbWF5IHNjcm9sbC4gYHRydWVgIG1lYW5zIHRoaXMgd2lkZ2V0IG1heSBzY3JvbGxcbiAgICAgKiBpbiBib3RoIGF4ZXMuIE1heSBiZSBhbiBvYmplY3QgY29udGFpbmluZyBib29sZWFuIGBvdmVyZmxvd1hgIGFuZCBgb3ZlcmZsb3dZYCBwcm9wZXJ0aWVzIHdoaWNoIGFyZVxuICAgICAqIGFwcGxpZWQgdG8gQ1NTIHN0eWxlIHByb3BlcnRpZXMgYG92ZXJmbG93WGAgYW5kIGBvdmVyZmxvd1lgLiBJZiB0aGV5IGFyZSBib29sZWFuLCB0aGV5IGFyZSB0cmFuc2xhdGVkIHRvXG4gICAgICogQ1NTIG92ZXJmbG93IHByb3BlcnRpZXMgdGh1czpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gaWYgZG9jdW1lbnQgaXMgc2Nyb2xsZWQgd2hpbGUgV2lkZ2V0IGlzIHZpc2libGUgKG9ubHkgcmVsZXZhbnQgd2hlbiBmbG9hdGluZyBpcyBzZXQgdG8gYHRydWVgKS5cbiAgICAgKiBWYWxpZCB2YWx1ZXM6IMK0bnVsbMK0OiBkbyBub3RoaW5nLCDCtGhpZGXCtDogaGlkZSB0aGUgd2lkZ2V0IG9yIMK0cmVhbGlnbsK0OiByZWFsaWduIHRvIHRoZSB0YXJnZXQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgc2Nyb2xsQWN0aW9uID8gOiAnaGlkZSd8J3JlYWxpZ24nfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGJ1dHRvbiBjb25maWd1cmF0aW9uIG9iamVjdCB0byB1c2UgZm9yIHRoZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgbW9kZSBzZWxlY3RvciBidXR0b24gZm9yIHRoaXMgbW9kZS5cbiAgICAgKi9cbiAgICBzZWxlY3RvckJ1dHRvbiA/IDogQnV0dG9uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBtZW51IGl0ZW0gY29uZmlndXJhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIG1vZGUgc2VsZWN0b3IgbWVudSBpdGVtIGZvciB0aGlzIG1vZGUuXG4gICAgICovXG4gICAgc2VsZWN0b3JNZW51SXRlbSA/IDogTWVudUl0ZW1Db25maWdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBwYXN0IGRhdGVzIGluIGEgbGlnaHRlciB0ZXh0IGNvbG9yLlxuICAgICAqL1xuICAgIHNoYWRlUGFzdERhdGVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBhbmQgdGltZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlVGltZUZvcm1hdCA/IDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKVxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBldmVudHMgd2hpY2ggaGF2ZSBkdXJhdGlvbiBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiBbc2hvcnRFdmVudER1cmF0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG9ydEV2ZW50RHVyYXRpb24pLlxuICAgICAqL1xuICAgIHNob3J0RXZlbnRDbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhdCB3aGljaCBiZWxvdyBhbmQgZXF1YWwgdG8gdGhpcyB2YWx1ZSwgYW4gZXZlbnQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgZ2V0c1xuICAgICAqIHRoZSBbc2hvcnRFdmVudENsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvcnRFdmVudENscykgYWRkZWQgdG8gaXQgc28gdGhhdCBzbWFsbCBldmVudCBiYXJzIGNhbiBoYXZlIHN0eWxlIHJlYXJyYW5nZW1lbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXNob3J0RXZlbnREdXJhdGlvbilcbiAgICAgKi9cbiAgICBzaG9ydEV2ZW50RHVyYXRpb24gPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiA8c3Ryb25nPk5vdCBhcHBsaWNhYmxlIGluIGEgYERheVZpZXdgPC9zdHJvbmc+XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc2hvd0J1bGxldClcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJhciBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdC4gU2V0IHRoaXMgdG8gYHRydWVgIGluIG1vZGVzIHdoZXJlIGEgc29saWQgZXZlbnQgYmFyIHNob3VsZCBzaG93IGEgYnVsbGV0IGljb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5vQmFyIFRoaXMgaXMgYHRydWVgIGJ5IGRlZmF1bHQuIEV2ZW50cyB3aXRoIG5vIGJhY2tncm91bmQgY29sb3VyLCB1c2UgdGhpcyB0byBzaG93IHRoZSBldmVudCdzIGRlZmluZWQgYGV2ZW50Q29sb3JgXG4gICAgICovXG4gICAgc2hvd0J1bGxldCA/IDogYm9vbGVhbnx7YmFyPzogYm9vbGVhbiwgbm9CYXI/OiBib29sZWFufVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gc2hvdyBhdmF0YXJzIG9mIHRoZSBhc3NpZ25lZCByZXNvdXJjZXMgKGNhbGVuZGFycykgYXQgdGhlXG4gICAgICogc3RhcnQgb2YgdGhlIGV2ZW50IGJhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKVxuICAgICAqL1xuICAgIHNob3dSZXNvdXJjZUF2YXRhcnMgPyA6IGJvb2xlYW58c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgdGhlIHRvb2x0aXAgd2hlbiB0aGlzIHdpZGdldCBpcyBbZGlzYWJsZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWRpc2FibGVkKVxuICAgICAqL1xuICAgIHNob3dUb29sdGlwV2hlbkRpc2FibGVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBzaG93IGEgd2VlayBudW1iZXIgY29sdW1uIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FsZW5kYXIgYmxvY2suXG4gICAgICovXG4gICAgc2hvd1dlZWtDb2x1bW4gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYGZhbHNlYCB0byBoaWRlIHRoZSB3ZWVrIG51bWJlciBzaG93biBhdCB0aGUgdG9wLWxlZnQgb2YgZWFjaCBkYXkgY2VsbFxuICAgICAqL1xuICAgIHNob3dXZWVrTnVtYmVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBhbHdheXMgc2hvdyBhIHNpeC13ZWVrIGNhbGVuZGFyLlxuICAgICAqL1xuICAgIHNpeFdlZWtzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBzdGFjayBtdWx0aS1kYXkgZXZlbnRzIHdpdGhpbiBlYWNoIGNlbGwgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIHN0YXJ0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhY2tNdWx0aURheUV2ZW50cylcbiAgICAgKi9cbiAgICBzdGFja011bHRpRGF5RXZlbnRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhdGVmdWwpXG4gICAgICovXG4gICAgc3RhdGVmdWwgPyA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50cyB0aGF0LCB3aGVuIGZpcmVkIGJ5IHRoaXMgY29tcG9uZW50LCBzaG91bGQgdHJpZ2dlciBpdCB0byBzYXZlIGl0cyBzdGF0ZSBieSBjYWxsaW5nXG4gICAgICogW3NhdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2Z1bmN0aW9uLXNhdmVTdGF0ZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhdGVmdWxFdmVudHMpXG4gICAgICovXG4gICAgc3RhdGVmdWxFdmVudHMgPyA6IG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gc2F2aW5nIHRoaXMgb2JqZWN0J3Mgc3RhdGUgaW4gdGhlIFtzdGF0ZVByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlUHJvdmlkZXIpLiBJZiB0aGlzIGNvbmZpZyBpc1xuICAgICAqIG5vdCBhc3NpZ25lZCwgYW5kIFtzdGF0ZWZ1bF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2NvbmZpZy1zdGF0ZWZ1bCkgaXMgbm90IHNldCB0byBgZmFsc2VgLCB0aGUgW2lkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1pZClcbiAgICAgKiAoaWYgZXhwbGljaXRseSBzcGVjaWZpZWQpIHdpbGwgYmUgdXNlZCBhcyB0aGUgYHN0YXRlSWRgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN0YXRlSWQpXG4gICAgICovXG4gICAgc3RhdGVJZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGBTdGF0ZVByb3ZpZGVyYCB0byB1c2UgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGlzIG9iamVjdCdzIFtzdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI3Byb3BlcnR5LXN0YXRlKS4gQnkgZGVmYXVsdCwgYHN0YXRlYFxuICAgICAqIHdpbGwgYmUgc2F2ZWQgdXNpbmcgdGhlIFtkZWZhdWx0IHN0YXRlIHByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvc3RhdGUvU3RhdGVQcm92aWRlciNwcm9wZXJ0eS1pbnN0YW5jZS1zdGF0aWMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN0YXRlUHJvdmlkZXIpXG4gICAgICovXG4gICAgc3RhdGVQcm92aWRlciA/IDogU3RhdGVQcm92aWRlclxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIG1hdGNoIGZpZWxkcyBieSB0aGVpciBgbmFtZWAgcHJvcGVydHkgb25seSB3aGVuIGFzc2lnbmluZyBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1yZWNvcmQpLFxuICAgICAqIHdpdGhvdXQgZmFsbGluZyBiYWNrIHRvIGByZWZgLlxuICAgICAqL1xuICAgIHN0cmljdFJlY29yZE1hcHBpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB3aWRnZXRzIGtleWVkIGJ5IG5hbWUuIEJ5IGRlZmF1bHQgKHdoZW4gbm8gYHR5cGVgIGlzIGdpdmVuKSwgc3RyaXBzIGFyZVxuICAgICAqIFt0b29sYmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKS4gSWYgeW91IHdhbnQgdG8gcGFzcyBhbiBhcnJheSwgeW91IGNhbiB1c2VcbiAgICAgKiB0aGUgdG9vbGJhcidzIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zdHJpcHMpXG4gICAgICovXG4gICAgc3RyaXBzID8gOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnZlcnNlIG9mIFtzeW5jVmlld0RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jcHJvcGVydHktc3luY1ZpZXdEYXRlKVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN5bmNDYWxlbmRhckRhdGUpXG4gICAgICovXG4gICAgc3luY0NhbGVuZGFyRGF0ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBjb252ZXJzZSBvZiBbc3luY0NhbGVuZGFyRGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNwcm9wZXJ0eS1zeW5jQ2FsZW5kYXJEYXRlKVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN5bmNWaWV3RGF0ZSlcbiAgICAgKi9cbiAgICBzeW5jVmlld0RhdGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10YWIpXG4gICAgICovXG4gICAgdGFiID8gOiBib29sZWFufFRhYkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBjb250YWluZXIgaXMgdXNlZCBhcyBhIHRhYiBpbiBhIFRhYlBhbmVsLCB0aGVzZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICogW1RhYkJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJCYXIpIHdoZW4gdGhpcyBjb250YWluZXIgaXMgdGhlIGFjdGl2ZSB0YWIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctdGFiQmFySXRlbXMpXG4gICAgICovXG4gICAgdGFiQmFySXRlbXMgPyA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdXG4gICAgLyoqXG4gICAgICogVGhlIHRhZyBuYW1lIG9mIHRoaXMgV2lkZ2V0J3Mgcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgdGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIENvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgW1Rvb2xiYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuXG4gICAgICogVGhpcyBjcmVhdGVzIGEgdG9vbGJhciBkb2NrZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFuZWwgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10YmFyKVxuICAgICAqL1xuICAgIHRiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQ6ICdsZWZ0JywgJ2NlbnRlcicgb3IgJ3JpZ2h0Jy4gQWxzbyBhY2NlcHRzIGRpcmVjdGlvbiBuZXV0cmFsICdzdGFydCcgYW5kICdlbmQnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXRleHRBbGlnbilcbiAgICAgKi9cbiAgICB0ZXh0QWxpZ24gPyA6ICdsZWZ0J3wnY2VudGVyJ3wncmlnaHQnfCdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBBIFtEYXRlSGVscGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RhdGVIZWxwZXIpIGZvcm1hdCBzdHJpbmcvZnVuY3Rpb24gdXNlZCB0byBmb3JtYXQgdGhlIHRpbWUgZGlzcGxheWVkIGluIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBkYXRlLlxuICAgICAqL1xuICAgIHRpbWVGb3JtYXQgPyA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBvYmplY3QgdG8gY3JlYXRlIGEgdG9vbHRpcCB3aGljaCB3aWxsIHNob3cgb24gaG92ZXIgb2YgYSBkYXRlIGNlbGwgaW5jbHVkaW5nIGRpc2FibGVkLCB3ZWVrZW5kLFxuICAgICAqIGFuZCBcIm90aGVyIG1vbnRoXCIgY2VsbHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctdGlwKVxuICAgICAqL1xuICAgIHRpcCA/IDogVG9vbHRpcENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10aXRsZSlcbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGNsYXNzIG5hbWUgdG8gYWRkIHRvIHRoZSBjYWxlbmRhciBjZWxsIHdoaWNoIGNvbnRhaW5zIHRvZGF5J3MgZGF0ZS5cbiAgICAgKi9cbiAgICB0b2RheUNscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10b29sdGlwKVxuICAgICAqL1xuICAgIHRvb2x0aXAgPyA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0YWJiaW5nIHdpdGhpbiBhIFBhbmVsIGlzIG5vdCBjb250YWluZWQsIGllIHlvdSBjYW4gVEFCIG91dCBvZiB0aGUgUGFuZWxcbiAgICAgKiBmb3J3YXJkcyBvciBiYWNrd2FyZHMuXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYHRydWVgIHRvIGRpc2FsbG93IHRhYmJpbmcgb3V0IG9mIHRoZSBQYW5lbCwgYW5kIG1ha2UgdGFiYmluZyBjaXJjdWxhciB3aXRoaW4gdGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICB0cmFwRm9jdXMgPyA6IGJvb2xlYW5cbiAgICB0eXBlID8gOiAnbW9udGh2aWV3J3wnbW9udGgnXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogVGhlIGhlYWRlciB0ZXh0IGZvciB0aGUgd2VlayBudW1iZXIgY29sdW1uLCBpZiBzaG93bi5cbiAgICAgKi9cbiAgICB3ZWVrQ29sdW1uSGVhZGVyID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgbmFtZSB0byBhZGQgdG8gY2FsZW5kYXIgY2VsbHMgd2hpY2ggYXJlIHdlZWtlbmQgZGF0ZXMuXG4gICAgICovXG4gICAgd2Vla2VuZENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiAob3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbikgd2hpY2ggY3JlYXRlcyBjb250ZW50IGluLCBhbmQgbWF5IG11dGF0ZSB0aGUgd2VlayBjZWxsIGVsZW1lbnQgYXQgdGhlIHN0YXJ0IG9mIGEgd2VlayByb3cuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctd2Vla1JlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHdlZWtDZWxsIFRoZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHdlZWsgQW4gYXJyYXkgY29udGFpbmluZyBgW3llYXIsIHdlZWtOdW1iZXJdYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcsRG9tQ29uZmlnLHZvaWR9XG4gICAgICovXG4gICAgd2Vla1JlbmRlcmVyID8gOiAoKHdlZWtDZWxsOiBIVE1MRWxlbWVudCwgd2VlazogbnVtYmVyW10pID0+IHN0cmluZ3xEb21Db25maWd8dm9pZCl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHdlZWsgc3RhcnQgZGF5LCAwIG1lYW5pbmcgU3VuZGF5LCA2IG1lYW5pbmcgU2F0dXJkYXkuXG4gICAgICogRGVmYXVsdHMgdG8gW3dlZWtTdGFydERheV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyI3Byb3BlcnR5LXdlZWtTdGFydERheS1zdGF0aWMpLlxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLW1vbnRoLXZpZXcnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IE1vbnRoVmlldztcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ01vbnRoVmlldyc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlQXV0b0NyZWF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNoYW5nZURhdGUnLFxuICAgICAgICAnb25CZWZvcmVEZXN0cm95JyxcbiAgICAgICAgJ29uQmVmb3JlSGlkZScsXG4gICAgICAgICdvbkJlZm9yZVJlZnJlc2gnLFxuICAgICAgICAnb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25CZWZvcmVTZXRSZWNvcmQnLFxuICAgICAgICAnb25CZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlU2hvd092ZXJmbG93UG9wdXAnLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU3RhdGVTYXZlJyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DZWxsQ2xpY2snLFxuICAgICAgICAnb25DZWxsTWFwUG9wdWxhdGVkJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25EYXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRGF5Q2VsbFBvcHVsYXRlZCcsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25EaXJ0eVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRWxlbWVudENyZWF0ZWQnLFxuICAgICAgICAnb25FbXB0eUNlbGxDbGljaycsXG4gICAgICAgICdvbkV2ZW50QXV0b0NyZWF0ZWQnLFxuICAgICAgICAnb25FdmVudEhlaWdodENoYW5nZScsXG4gICAgICAgICdvbkV2ZW50UHJvcGFnYXRlJyxcbiAgICAgICAgJ29uRXhwYW5kJyxcbiAgICAgICAgJ29uRm9jdXNJbicsXG4gICAgICAgICdvbkZvY3VzT3V0JyxcbiAgICAgICAgJ29uSGlkZScsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUmVhZE9ubHknLFxuICAgICAgICAnb25SZWNvbXBvc2UnLFxuICAgICAgICAnb25SZWZyZXNoJyxcbiAgICAgICAgJ29uUmVzaXplJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uU2hvdycsXG4gICAgICAgICdvblNob3dPdmVyZmxvd1BvcHVwJyxcbiAgICAgICAgJ29uVG9vbENsaWNrJyxcbiAgICAgICAgJ29uV2Vla0NlbGxDbGljaycsXG4gICAgICAgICdvbldlZWtGbGV4JyxcbiAgICAgICAgJ29uV2Vla1Nocmlua3dyYXAnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1Nb250aFZpZXdDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWN0aXZhdGlvbktleScsXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYWxsb3dEcmFnQ3JlYXRlJyxcbiAgICAgICAgJ2FsbG93RHJhZ01vdmUnLFxuICAgICAgICAnYWxsb3dEcmFnUmVzaXplJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhbmltYXRlVGltZVNoaWZ0JyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0NyZWF0ZScsXG4gICAgICAgICdhdXRvUm93SGVpZ2h0JyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZWxsUmVuZGVyZXInLFxuICAgICAgICAnY2VudGVyZWQnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RheUNlbGxOYW1lRm9ybWF0JyxcbiAgICAgICAgJ2RheUNlbGxSZW5kZXJlcicsXG4gICAgICAgICdkYXlOYW1lRm9ybWF0JyxcbiAgICAgICAgJ2RlZmF1bHRCaW5kUHJvcGVydHknLFxuICAgICAgICAnZGVmYXVsdEZvY3VzJyxcbiAgICAgICAgJ2RlZmF1bHRzJyxcbiAgICAgICAgJ2RlZmF1bHRTY3JvbGxPcHRpb25zJyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uRm9ybWF0JyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uUmVuZGVyZXInLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNhYmxlZENscycsXG4gICAgICAgICdkaXNhYmxlZERhdGVzJyxcbiAgICAgICAgJ2Rpc2FibGVOb25Xb3JraW5nRGF5cycsXG4gICAgICAgICdkaXNhYmxlT3RoZXJNb250aENlbGxzJyxcbiAgICAgICAgJ2Rpc2FibGVXZWVrZW5kcycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmFnVW5pdCcsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW1wdHlDZWxsUmVuZGVyZXInLFxuICAgICAgICAnZXZlbnRGaWx0ZXInLFxuICAgICAgICAnZXZlbnRIZWFkZXJSZW5kZXJlcicsXG4gICAgICAgICdldmVudEhlaWdodCcsXG4gICAgICAgICdldmVudFJlbmRlcmVyJyxcbiAgICAgICAgJ2V2ZW50U29ydGVyJyxcbiAgICAgICAgJ2V2ZW50U3BhY2luZycsXG4gICAgICAgICdleHRlbmRBbGxEYXlFbmREYXknLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlckV2ZW50UmVzb3VyY2VzJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2dldFByaW1hcnlSZXNvdXJjZScsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGVhZGVyUmVuZGVyZXInLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVOb25Xb3JraW5nRGF5cycsXG4gICAgICAgICdoaWRlT3RoZXJNb250aENlbGxzJyxcbiAgICAgICAgJ2hpZGVXaGVuRW1wdHknLFxuICAgICAgICAnaWNvbicsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2l0ZW1DbHMnLFxuICAgICAgICAnaXRlbXMnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGF5b3V0JyxcbiAgICAgICAgJ2xheW91dFN0eWxlJyxcbiAgICAgICAgJ2xhenlJdGVtcycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4RXZlbnRzUGVyQ2VsbCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5Db2x1bW5XaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5Sb3dIZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdtb250aCcsXG4gICAgICAgICduYW1lZEl0ZW1zJyxcbiAgICAgICAgJ25vbldvcmtpbmdEYXlDbHMnLFxuICAgICAgICAnbm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnb3RoZXJNb250aENscycsXG4gICAgICAgICdvdmVyZmxvd0J1dHRvblJlbmRlcmVyJyxcbiAgICAgICAgJ292ZXJmbG93Q2xpY2tBY3Rpb24nLFxuICAgICAgICAnb3ZlcmZsb3dQb3B1cCcsXG4gICAgICAgICdvdmVyZmxvd1BvcHVwVHJpZ2dlcicsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwYXN0RXZlbnRDbHMnLFxuICAgICAgICAncGVyc2lzdFNocmlua1dyYXBwZWRSb3dzJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZUV2ZW50SGVpZ2h0JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzY3JvbGxBY3Rpb24nLFxuICAgICAgICAnc2VsZWN0b3JCdXR0b24nLFxuICAgICAgICAnc2VsZWN0b3JNZW51SXRlbScsXG4gICAgICAgICdzaGFkZVBhc3REYXRlcycsXG4gICAgICAgICdzaG9ydERhdGVGb3JtYXQnLFxuICAgICAgICAnc2hvcnREYXRlVGltZUZvcm1hdCcsXG4gICAgICAgICdzaG9ydEV2ZW50Q2xzJyxcbiAgICAgICAgJ3Nob3J0RXZlbnREdXJhdGlvbicsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dCdWxsZXQnLFxuICAgICAgICAnc2hvd1Jlc291cmNlQXZhdGFycycsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICdzaG93V2Vla0NvbHVtbicsXG4gICAgICAgICdzaG93V2Vla051bWJlcicsXG4gICAgICAgICdzaXhXZWVrcycsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0YWNrTXVsdGlEYXlFdmVudHMnLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmljdFJlY29yZE1hcHBpbmcnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNDYWxlbmRhckRhdGUnLFxuICAgICAgICAnc3luY1ZpZXdEYXRlJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZUZvcm1hdCcsXG4gICAgICAgICd0aXAnLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9kYXlDbHMnLFxuICAgICAgICAndG9vbHMnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0cmFwRm9jdXMnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWVrQ29sdW1uSGVhZGVyJyxcbiAgICAgICAgJ3dlZWtlbmRDbHMnLFxuICAgICAgICAnd2Vla1JlbmRlcmVyJyxcbiAgICAgICAgJ3dlZWtTdGFydERheScsXG4gICAgICAgICd3ZWlnaHQnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FjdGl2YXRpb25LZXknLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYW5jaG9yJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjZWxsUmVuZGVyZXInLFxuICAgICAgICAnY2VudGVyZWQnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXlDZWxsTmFtZUZvcm1hdCcsXG4gICAgICAgICdkYXlDZWxsUmVuZGVyZXInLFxuICAgICAgICAnZGF5TmFtZUZvcm1hdCcsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRGb2N1cycsXG4gICAgICAgICdkZWZhdWx0cycsXG4gICAgICAgICdkZXNjcmlwdGlvblJlbmRlcmVyJyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzYWJsZWRDbHMnLFxuICAgICAgICAnZGlzYWJsZWREYXRlcycsXG4gICAgICAgICdkaXNhYmxlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnZGlzYWJsZU90aGVyTW9udGhDZWxscycsXG4gICAgICAgICdkaXNhYmxlV2Vla2VuZHMnLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5Q2VsbFJlbmRlcmVyJyxcbiAgICAgICAgJ2V2ZW50RmlsdGVyJyxcbiAgICAgICAgJ2V2ZW50SGVhZGVyUmVuZGVyZXInLFxuICAgICAgICAnZXZlbnRSZW5kZXJlcicsXG4gICAgICAgICdldmVudFNvcnRlcicsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnZ2V0UHJpbWFyeVJlc291cmNlJyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoZWFkZXJSZW5kZXJlcicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVPdGhlck1vbnRoQ2VsbHMnLFxuICAgICAgICAnaGlkZVdoZW5FbXB0eScsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2l0ZW1DbHMnLFxuICAgICAgICAnbGF6eUl0ZW1zJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtYXhFdmVudHNQZXJDZWxsJyxcbiAgICAgICAgJ21pbkNvbHVtbldpZHRoJyxcbiAgICAgICAgJ21pblJvd0hlaWdodCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgJ25hbWVkSXRlbXMnLFxuICAgICAgICAnbm9uV29ya2luZ0RheUNscycsXG4gICAgICAgICdvdGhlck1vbnRoQ2xzJyxcbiAgICAgICAgJ292ZXJmbG93QnV0dG9uUmVuZGVyZXInLFxuICAgICAgICAnb3ZlcmZsb3dDbGlja0FjdGlvbicsXG4gICAgICAgICdvdmVyZmxvd1BvcHVwJyxcbiAgICAgICAgJ292ZXJmbG93UG9wdXBUcmlnZ2VyJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVzb3VyY2VJbWFnZVBhdGgnLFxuICAgICAgICAncmVzcG9uc2l2ZScsXG4gICAgICAgICdyZXNwb25zaXZlRXZlbnRIZWlnaHQnLFxuICAgICAgICAncmVzcG9uc2l2ZVJvb3QnLFxuICAgICAgICAncmVzcG9uc2l2ZVN0YXRlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVUYXJnZXQnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzZWxlY3RvckJ1dHRvbicsXG4gICAgICAgICdzZWxlY3Rvck1lbnVJdGVtJyxcbiAgICAgICAgJ3Nob3J0RXZlbnRDbHMnLFxuICAgICAgICAnc2hvcnRFdmVudER1cmF0aW9uJyxcbiAgICAgICAgJ3Nob3dBbmltYXRpb24nLFxuICAgICAgICAnc2hvd0J1bGxldCcsXG4gICAgICAgICdzaG93UmVzb3VyY2VBdmF0YXJzJyxcbiAgICAgICAgJ3Nob3dUb29sdGlwV2hlbkRpc2FibGVkJyxcbiAgICAgICAgJ3Nob3dXZWVrQ29sdW1uJyxcbiAgICAgICAgJ3NpeFdlZWtzJyxcbiAgICAgICAgJ3N0YXRlZnVsJyxcbiAgICAgICAgJ3N0YXRlZnVsRXZlbnRzJyxcbiAgICAgICAgJ3N0YXRlSWQnLFxuICAgICAgICAnc3RhdGVQcm92aWRlcicsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3RhZycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RleHRBbGlnbicsXG4gICAgICAgICd0aW1lRm9ybWF0JyxcbiAgICAgICAgJ3RpcCcsXG4gICAgICAgICd0b2RheUNscycsXG4gICAgICAgICd0cmFwRm9jdXMnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWVrZW5kQ2xzJyxcbiAgICAgICAgJ3dlZWtSZW5kZXJlcicsXG4gICAgICAgICd3ZWVrU3RhcnREYXknLFxuICAgICAgICAnd2VpZ2h0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYWxsb3dEcmFnQ3JlYXRlJyxcbiAgICAgICAgJ2FsbG93RHJhZ01vdmUnLFxuICAgICAgICAnYWxsb3dEcmFnUmVzaXplJyxcbiAgICAgICAgJ2FuY2hvclNpemUnLFxuICAgICAgICAnYW5pbWF0ZVRpbWVTaGlmdCcsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2F1dG9Sb3dIZWlnaHQnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RheUNlbGxDbHMnLFxuICAgICAgICAnZGVmYXVsdFNjcm9sbE9wdGlvbnMnLFxuICAgICAgICAnZGVzY3JpcHRpb25Gb3JtYXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZHJhZ1VuaXQnLFxuICAgICAgICAnZXZlbnRIZWlnaHQnLFxuICAgICAgICAnZXZlbnRTcGFjaW5nJyxcbiAgICAgICAgJ2V4dGVuZEFsbERheUVuZERheScsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmlyc3RWaXNpYmxlQ2VsbCcsXG4gICAgICAgICdmaXJzdFZpc2libGVEYXRlJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdpc1NldHRpbmdWYWx1ZXMnLFxuICAgICAgICAnaXNWYWxpZCcsXG4gICAgICAgICdpdGVtcycsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsYXN0VmlzaWJsZUNlbGwnLFxuICAgICAgICAnbGFzdFZpc2libGVEYXRlJyxcbiAgICAgICAgJ2xheW91dCcsXG4gICAgICAgICdsYXlvdXRTdHlsZScsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4RGF0ZScsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdub25Xb3JraW5nRGF5cycsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncGFzdEV2ZW50Q2xzJyxcbiAgICAgICAgJ3BlcnNpc3RTaHJpbmtXcmFwcGVkUm93cycsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3NoYWRlUGFzdERhdGVzJyxcbiAgICAgICAgJ3Nob3J0RGF0ZUZvcm1hdCcsXG4gICAgICAgICdzaG9ydERhdGVUaW1lRm9ybWF0JyxcbiAgICAgICAgJ3Nob3dXZWVrTnVtYmVyJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhY2tNdWx0aURheUV2ZW50cycsXG4gICAgICAgICdzdGF0ZScsXG4gICAgICAgICdzdHJpY3RSZWNvcmRNYXBwaW5nJyxcbiAgICAgICAgJ3N5bmNDYWxlbmRhckRhdGUnLFxuICAgICAgICAnc3luY1ZpZXdEYXRlJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndmFsdWVzJyxcbiAgICAgICAgJ3dlZWtDb2x1bW5IZWFkZXInLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IE1vbnRoVmlldztcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmF0aW9uS2V5ICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYWRvcHQgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsaWduICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpcHRpb24gICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIGJvZHlDbHMgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNlbGxSZW5kZXJlciAgICAgICAgICAgICAgICAgISA6ICgocmVuZGVyRGF0YTogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgZGF5OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXJbXSwgcm93OiBIVE1MRWxlbWVudCwgc291cmNlOiBDYWxlbmRhclBhbmVsLCBjZWxsSW5kZXg6IG51bWJlcltdLCBjb2x1bW5JbmRleDogbnVtYmVyW10sIHZpc2libGVDb2x1bW5JbmRleDogbnVtYmVyW10gfSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgY2VudGVyZWQgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2xsYXBzaWJsZSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbnN0cmFpblRvICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGU7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGF5Q2VsbE5hbWVGb3JtYXQgICAgICAgICAgICAhIDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBkYXlDZWxsUmVuZGVyZXIgICAgICAgICAgICAgICEgOiAoY2VsbERhdGE6IERheUNlbGwsIGRheUNlbGxEb21Db25maWc6IHsgY2xhc3NOYW1lOiBvYmplY3QsIHN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgY2hpbGRyZW46IERvbUNvbmZpZ1tdIH0pID0+IHN0cmluZ3xvYmplY3R8b2JqZWN0W107XG4gICAgQElucHV0KCkgZGF5TmFtZUZvcm1hdCAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0Rm9jdXMgICAgICAgICAgICAgICAgICEgOiAoKHdpZGdldDogV2lkZ2V0KSA9PiBib29sZWFuKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uUmVuZGVyZXIgICAgICAgICAgISA6ICh2aWV3OiBXaWRnZXQpID0+IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkQ2xzICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzICAgICAgICAgICAgICAgICEgOiAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pfHN0cmluZ3xEYXRlW118c3RyaW5nW107XG4gICAgQElucHV0KCkgZGlzYWJsZU5vbldvcmtpbmdEYXlzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlT3RoZXJNb250aENlbGxzICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVXZWVrZW5kcyAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGRyYWdnYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBlbGVtZW50QXR0cmlidXRlcyAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD47XG4gICAgQElucHV0KCkgZW1wdHlDZWxsUmVuZGVyZXIgICAgICAgICAgICAhIDogKChkYXlDZWxsUmVuZGVyZXI6IERheUNlbGwpID0+IERvbUNvbmZpZ3x2b2lkKXxvYmplY3R8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50RmlsdGVyICAgICAgICAgICAgICAgICAgISA6ICgoZXZlbnQ6IEV2ZW50TW9kZWwpID0+IGJvb2xlYW4pfHN0cmluZztcbiAgICBASW5wdXQoKSBldmVudEhlYWRlclJlbmRlcmVyICAgICAgICAgICEgOiAoKGRldGFpbDogeyB2aWV3OiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgcmVuZGVyRGF0YTogeyBzdHlsZTogb2JqZWN0LCBjbHM6IG9iamVjdCwgaWNvblN0eWxlOiBvYmplY3QsIGljb25DbHM6IG9iamVjdCwgZXZlbnRDb2xvcjogc3RyaW5nLCBkYXRhc2V0OiBvYmplY3QsIHNvbGlkQmFyOiBib29sZWFuLCBib2R5Q29sb3I6IHN0cmluZyB9LCBzaG93QnVsbGV0OiBib29sZWFuIH0pID0+IERvbUNvbmZpZ3xEb21Db25maWdbXXxzdHJpbmd8dm9pZCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50UmVuZGVyZXIgICAgICAgICAgICAgICAgISA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGV2ZW50QmFja2dyb3VuZDogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZXZlbnRJbm5lclN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nLCBzaG93QnVsbGV0OiBib29sZWFuIH0gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZXZlbnRTb3J0ZXIgICAgICAgICAgICAgICAgICAhIDogKGxoczogRXZlbnRNb2RlbHxFdmVudEJhciwgcmhzOiBFdmVudE1vZGVsfEV2ZW50QmFyKSA9PiBudW1iZXI7XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmc7XG4gICAgQElucHV0KCkgZ2V0UHJpbWFyeVJlc291cmNlICAgICAgICAgICAhIDogKChldmVudFJlY29yZDogRXZlbnRNb2RlbCkgPT4gUmVzb3VyY2VNb2RlbCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyO1xuICAgIEBJbnB1dCgpIGhlYWRlclJlbmRlcmVyICAgICAgICAgICAgICAgISA6ICgoY2VsbDogSFRNTEVsZW1lbnQsIGNvbHVtbkluZGV4OiBudW1iZXIsIHdlZWtEYXk6IG51bWJlcikgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZUFuaW1hdGlvbiAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaGlkZU90aGVyTW9udGhDZWxscyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlV2hlbkVtcHR5ICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGljb24gICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgaWdub3JlUGFyZW50UmVhZE9ubHkgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpdGVtQ2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbGF6eUl0ZW1zICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICEgOiBNb250aFZpZXdMaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9jYWxlQ2xhc3MgICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIEJhc2U7XG4gICAgQElucHV0KCkgbG9jYWxpemFibGUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICEgOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBtYXNrRGVmYXVsdHMgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWF4RXZlbnRzUGVyQ2VsbCAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkNvbHVtbldpZHRoICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5Sb3dIZWlnaHQgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1vbml0b3JSZXNpemUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBtb250aCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBNb250aHxNb250aENvbmZpZztcbiAgICBASW5wdXQoKSBuYW1lZEl0ZW1zICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIG5vbldvcmtpbmdEYXlDbHMgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBvdGhlck1vbnRoQ2xzICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3ZlcmZsb3dCdXR0b25SZW5kZXJlciAgICAgICAhIDogKGRvbUNvbmZpZzogeyB0YWc6IHN0cmluZywgY2xhc3NOYW1lOiBvYmplY3QsIHRleHQ6IHN0cmluZywgc3R5bGU6IG9iamVjdCwgZGF0YXNldDogb2JqZWN0IH0sIG92ZXJmbG93Q291bnQ6IG51bWJlcikgPT4gRG9tQ29uZmlnfHN0cmluZ3x2b2lkO1xuICAgIEBJbnB1dCgpIG92ZXJmbG93Q2xpY2tBY3Rpb24gICAgICAgICAgISA6ICdwb3B1cCd8J2V4cGFuZCc7XG4gICAgQElucHV0KCkgb3ZlcmZsb3dQb3B1cCAgICAgICAgICAgICAgICAhIDogT3ZlcmZsb3dQb3B1cENvbmZpZztcbiAgICBASW5wdXQoKSBvdmVyZmxvd1BvcHVwVHJpZ2dlciAgICAgICAgICEgOiAnY2xpY2snfCdtb3VzZW92ZXInfCdob3Zlcic7XG4gICAgQElucHV0KCkgb3duZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVsYXlTdG9yZUV2ZW50cyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZUltYWdlUGF0aCAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZSAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVFdmVudEhlaWdodCAgICAgICAgISA6IFJlY29yZDwoJ3RocmVzaG9sZCd8J21pbkhlaWdodCcpLCBudW1iZXI+fFJlY29yZDxudW1iZXIsIG51bWJlcj47XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVJvb3QgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVRhcmdldCAgICAgICAgICAgICAhIDogc3RyaW5nfFdpZGdldDtcbiAgICBASW5wdXQoKSByaXBwbGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2Nyb2xsQWN0aW9uICAgICAgICAgICAgICAgICAhIDogJ2hpZGUnfCdyZWFsaWduJ3xudWxsO1xuICAgIEBJbnB1dCgpIHNlbGVjdG9yQnV0dG9uICAgICAgICAgICAgICAgISA6IEJ1dHRvbkNvbmZpZztcbiAgICBASW5wdXQoKSBzZWxlY3Rvck1lbnVJdGVtICAgICAgICAgICAgICEgOiBNZW51SXRlbUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG9ydEV2ZW50Q2xzICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvcnRFdmVudER1cmF0aW9uICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBzaG93QW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBzaG93QnVsbGV0ICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtiYXI/OiBib29sZWFuLCBub0Jhcj86IGJvb2xlYW59O1xuICAgIEBJbnB1dCgpIHNob3dSZXNvdXJjZUF2YXRhcnMgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3dUb29sdGlwV2hlbkRpc2FibGVkICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1dlZWtDb2x1bW4gICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaXhXZWVrcyAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsRXZlbnRzICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3RhdGVQcm92aWRlciAgICAgICAgICAgICAgICAhIDogU3RhdGVQcm92aWRlcjtcbiAgICBASW5wdXQoKSBzdHJpcHMgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58VGFiQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhYkJhckl0ZW1zICAgICAgICAgICAgICAgICAgISA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdO1xuICAgIEBJbnB1dCgpIHRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0ZXh0QWxpZ24gICAgICAgICAgICAgICAgICAgICEgOiAnbGVmdCd8J2NlbnRlcid8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIHRpbWVGb3JtYXQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgdGlwICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogVG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSB0b2RheUNscyAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnbW9udGh2aWV3J3wnbW9udGgnO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgd2Vla2VuZENscyAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHdlZWtSZW5kZXJlciAgICAgICAgICAgICAgICAgISA6ICgod2Vla0NlbGw6IEhUTUxFbGVtZW50LCB3ZWVrOiBudW1iZXJbXSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgd2Vla1N0YXJ0RGF5ICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbGxvd0RyYWdDcmVhdGUgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYWxsb3dEcmFnTW92ZSAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFsbG93RHJhZ1Jlc2l6ZSAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhbmltYXRlVGltZVNoaWZ0ICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXBwZW5kVG8gICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYXV0b0NyZWF0ZSAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGdlc3R1cmU/OiBzdHJpbmdcbiAgICAgICAgbmV3TmFtZT86IEZ1bmN0aW9ufHN0cmluZ1xuICAgICAgICBzdGVwPzogc3RyaW5nXG4gICAgICAgIHNuYXBUeXBlPzogJ3JvdW5kJ3wnY2VpbCd8J2Zsb29yJ1xuICAgICAgICBkdXJhdGlvbj86IHN0cmluZ1xuICAgICAgICBzdGFydEhvdXI/OiBudW1iZXJcbiAgICB9fHN0cmluZ3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9Sb3dIZWlnaHQgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjYWxsT25GdW5jdGlvbnMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2xsYXBzZWQgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1uICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZGF0YXNldCAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgISA6IERhdGV8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGRhdGVGb3JtYXQgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBkYXRlU2VwYXJhdG9yICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0U2Nyb2xsT3B0aW9ucyAgICAgICAgISA6IEJyeW50dW1TY3JvbGxPcHRpb25zO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uRm9ybWF0ICAgICAgICAgICAhIDogc3RyaW5nfHN0cmluZ1tdfGJvb2xlYW5bXXwoKGRhdGU6IERhdGUpID0+IHN0cmluZyl8RnVuY3Rpb25bXTtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBkcmFnVW5pdCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBldmVudEhlaWdodCAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgZXZlbnRTcGFjaW5nICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZXh0ZW5kQWxsRGF5RW5kRGF5ICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhRGF0YSAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZpbHRlckV2ZW50UmVzb3VyY2VzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlTm9uV29ya2luZ0RheXMgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICEgOiAnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIGluc2VydEJlZm9yZSAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEZpcnN0ICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAhIDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUNvbmZpZ3xXaWRnZXQpW118UmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfE1lbnVJdGVtQ29uZmlnPnxXaWRnZXRbXXxSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1FbnRyeT58KENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUVudHJ5fFdpZGdldClbXTtcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbGFiZWxQb3NpdGlvbiAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsO1xuICAgIEBJbnB1dCgpIGxheW91dCAgICAgICAgICAgICAgICAgICAgICAhIDogTGF5b3V0fHN0cmluZ3xDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZztcbiAgICBASW5wdXQoKSBsYXlvdXRTdHlsZSAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBtYXJnaW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4RGF0ZSAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4aW1pemVPbk1vYmlsZSAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heFdpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5EYXRlICAgICAgICAgICAgICAgICAgICAgISA6IERhdGV8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbm9uV29ya2luZ0RheXMgICAgICAgICAgICAgICEgOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPjtcbiAgICBASW5wdXQoKSBwYXN0RXZlbnRDbHMgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBwZXJzaXN0U2hyaW5rV3JhcHBlZFJvd3MgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbDtcbiAgICBASW5wdXQoKSBydGwgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICEgOiBTY3JvbGxlcnxib29sZWFufFNjcm9sbGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNoYWRlUGFzdERhdGVzICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG9ydERhdGVGb3JtYXQgICAgICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgc2hvcnREYXRlVGltZUZvcm1hdCAgICAgICAgICEgOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpO1xuICAgIEBJbnB1dCgpIHNob3dXZWVrTnVtYmVyICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdGFja011bHRpRGF5RXZlbnRzICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RyaWN0UmVjb3JkTWFwcGluZyAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN5bmNDYWxlbmRhckRhdGUgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzeW5jVmlld0RhdGUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdG9vbHMgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUb29sfFRvb2xDb25maWc+fG51bGx8UmVjb3JkPHN0cmluZywgVG9vbD58UmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz47XG4gICAgQElucHV0KCkgdG9vbHRpcCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8VG9vbHRpcENvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHdlZWtDb2x1bW5IZWFkZXIgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGFuY2hvclNpemUgICAgICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGRheUNlbGxDbHMgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBmaXJzdFZpc2libGVDZWxsICEgOiBIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBmaXJzdFZpc2libGVEYXRlICEgOiBEYXRlO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGFzQ2hhbmdlcyAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc1NldHRpbmdWYWx1ZXMgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzVmFsaWQgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVDZWxsICAhIDogSFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVEYXRlICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBwYXJlbnQgICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgcmVjb3JkICAgICAgICAgICAhIDogTW9kZWw7XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIHZhbHVlcyAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG9iamVjdD47XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW5ldmVyIHRoZSBbYXV0b0NyZWF0ZSBnZXN0dXJlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1hdXRvQ3JlYXRlKSBpcyBkZXRlY3RlZFxuICAgICAqIGFuZCBhbHNvIHdoZW4gYSBbZHJhZy1jcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcpIGdlc3R1cmUgaXMgZGV0ZWN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1iZWZvcmVBdXRvQ3JlYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgRE9NIGV2ZW50IHdoaWNoIGluaXRpYXRlZCB0aGUgY3JlYXRpb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlICpERVBSRUNBVEVEIGluIGZhdm91ciBvZiBgc3RhcnREYXRlYC4qIFRoZSBzdGFydGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLiBJZiB0aGlzIGlzIGluIGEgYERheVZpZXdgLCB0aGlzIHdpbGwgYmUgc25hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIGV2ZW50IHRvIGJlIGNyZWF0ZWQuIElmIHRoaXMgaXMgaW4gYSBgRGF5Vmlld2AsIHRoaXMgd2lsbCBiZSBzbmFwcGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBpbiBbYXV0b0NyZWF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctYXV0b0NyZWF0ZSlcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIGVuZGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGlzIHZpZXcuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXV0b0NyZWF0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHZpZXcncyBvcmllbnRhdGluZyBkYXRlIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1iZWZvcmVDaGFuZ2VEYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZERhdGUgVGhlIGN1cnJlbnQgb3JpZW50YXRpbmcgZGF0ZSBvZiB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBuZXcgZGF0ZSB0byB3aGljaCB0aGlzIHZpZXcgaXMgdG8gYmUgb3JpZW50YXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDaGFuZ2VEYXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgb2xkRGF0ZTogRGF0ZSwgZGF0ZTogRGF0ZSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBoaWRkZW4uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIGhpZGRlbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVIaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgdGhpcyBDYWxlbmRhclBhbmVsIHJlZnJlc2hlcyBpbiByZXNwb25zZSB0byBjaGFuZ2VzIGluIGl0cyBtb250aC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5EYXRlUGlja2VyfSBldmVudC5zb3VyY2UgVGhpcyBEYXRlUGlja2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlZnJlc2g6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IERhdGVQaWNrZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSBuZXcgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpIGlzIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCB3aG9zZSBgcmVzcG9uc2l2ZVN0YXRlYCBpcyB0byBiZSBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgdGhpcyBjb250YWluZXIgd2lsbCBsb2FkIHJlY29yZCB2YWx1ZXMgaW50byBpdHMgY2hpbGQgZmllbGRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3VcbiAgICAgKiB3YW50IHRvIG1vZGlmeSB0aGUgVUkgYmVmb3JlIGRhdGEgaXMgbG9hZGVkIChlLmcuIHNldCBzb21lIGlucHV0IGZpZWxkIHRvIGJlIHJlYWRvbmx5KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZXRSZWNvcmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBzaG93bi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldCxhbnl9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHNob3duXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0fGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhbiBbT3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvT3ZlcmZsb3dQb3B1cCkgaXMgc2hvd24gd2hlbiBhbiBhXG4gICAgICogXCIrIG4gbW9yZVwiIG92ZXJmbG93IGJ1dHRvbiBpcyBhY3RpdmF0ZWQgYnkgYW4gW292ZXJmbG93UG9wdXBUcmlnZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjY29uZmlnLW92ZXJmbG93UG9wdXBUcmlnZ2VyKSBldmVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbCBUaGUgZGF5IGNlbGwgZm9yIHdoaWNoIHRoZSBvdmVyZmxvdyBwb3B1cCBpcyBnb2luZyB0byBiZSBzaG93bi5cbiAgICAgKiBAcGFyYW0ge0RheUNlbGx9IGV2ZW50LmNlbGxEYXRhIEEgYERheUNlbGxgIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIGNlbGwuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIHdoaWNoIGhhcyBvdmVyZmxvd2luZyBldmVudHNcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLndpZGdldC5PdmVyZmxvd1BvcHVwfSBldmVudC5vdmVyZmxvd1BvcHVwIFRoZSBvdmVyZmxvdyBgUG9wdXBgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3dPdmVyZmxvd1BvcHVwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2VsbDogSFRNTEVsZW1lbnQsIGNlbGxEYXRhOiBEYXlDZWxsLCBkYXRlOiBEYXRlLCBvdmVyZmxvd1BvcHVwOiBPdmVyZmxvd1BvcHVwIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHN0YXRlIGlzIGFwcGxpZWQgdG8gdGhlIHNvdXJjZS4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgc2F2ZWQgYnkgdGhlIFN0YXRlUHJvdmlkZXIuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2FueX0gZXZlbnQuc3RhdGUgU3RhdGUgb2JqZWN0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXRlU2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFueSBvdGhlciBldmVudCBpcyBmaXJlZCBmcm9tIHRoZSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBkYXRlIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbCBUaGUgY2xpY2tlZCBjZWxsIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIHJlcHJlc2VudGVkIGJ5IHRoZSBjZWxsLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIHdlZWsgYXJyYXkgYFt5ZWFyLCB3ZWVrTnVtYmVyXWAuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgd2VlazogbnVtYmVyW10sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIG5ldyBzZXQgb2YgZXZlbnRzIGhhcyBiZWVuIGdhdGhlcmVkIGZvciB0aGlzIHZpZXcncyBkYXRlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge01hcDxhbnksIGFueT59IGV2ZW50LmNlbGxNYXAgVGhlIG1hcCBvZiBkYXRlIGtleXMgdG8gW2RheSBjZWxsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsQ29sbGVjdGVyI3R5cGVkZWYtRGF5Q2VsbCkgZGF0YSBibG9ja3MuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1hcFBvcHVsYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGxNYXA6IE1hcDxhbnksIGFueT4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgZGF0ZSBvZiB0aGlzIENhbGVuZGFyUGFuZWwgaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnZhbHVlIFRoZSBuZXcgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZFZhbHVlIFRoZSBvbGQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY2hhbmdlcyBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgcHJvcGVydGllcyB3aGljaCBpbmRpY2F0ZSB3aGF0IHBhcnQgb2YgdGhlIGRhdGUgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZXMuZCBUcnVlIGlmIHRoZSBkYXRlIGNoYW5nZWQgaW4gYW55IHdheS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZXMudyBUcnVlIGlmIHRoZSB3ZWVrIGNoYW5nZWQgKGluY2x1ZGluZyBzYW1lIHdlZWsgaW4gYSBkaWZmZXJlbnQgeWVhcikuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGFuZ2VzLm0gVHJ1ZSBpZiB0aGUgbW9udGggY2hhbmdlZCAoaW5jbHVkaW5nIHNhbWUgbW9udGggaW4gYSBkaWZmZXJlbnQgeWVhcikuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGFuZ2VzLnkgVHJ1ZSBpZiB0aGUgeWVhciBjaGFuZ2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyB2YWx1ZTogRGF0ZSwgb2xkVmFsdWU6IERhdGUsIGNoYW5nZXM6IHsgZDogYm9vbGVhbiwgdzogYm9vbGVhbiwgbTogYm9vbGVhbiwgeTogYm9vbGVhbiB9IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBvbmUgZGF5IGNlbGwncyBldmVudHMgYXJlIGNvbGxlY3RlZCBpbiBzb3J0ZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAqIFtldmVudFNvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1kYXlDZWxsUG9wdWxhdGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmV2ZW50cyBUaGUgZXZlbnRzIHRvIGJlIHNob3duIGZvciB0aGUgcGFzc2VkIGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LlRoZSBkYXRlIHRoZSBldmVudHMgYXJlIHRvIGJlIHNob3duIGluLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRheUNlbGxQb3B1bGF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudHM6IEV2ZW50TW9kZWxbXSwgVGhlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgZmllbGQgaXMgbXV0YXRlZCBhbmQgdGhlIHN0YXRlIG9mIHRoZSBbaGFzQ2hhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaGFzQ2hhbmdlcykgcHJvcGVydHkgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kaXJ0eSBUaGUgZGlydHkgc3RhdGUgb2YgdGhlIENvbnRhaW5lciAtIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBpbml0aWFsIGxvYWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGlydHlTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCBkaXJ0eTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQncyBbZWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gZW1wdHkgY2VsbCBjb250ZW50IGFyZWEgaXMgY2xpY2tlZCBvbi4gSWYgdGhlIGhhbmRsZXIgcmV0dXJuc1xuICAgICAqIGBmYWxzZWAgdGhlIGN1cnJlbnQgcG9pbnRlciBldmVudCBpcyBub3QgcHJvY2Vzc2VkIGZ1cnRoZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgd2hpY2ggaGFzIG5vIHZpc2libGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRW1wdHlDZWxsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGdlc3R1cmUgaGFzIGNyZWF0ZWQgYSBuZXcgZXZlbnRcbiAgICAgKiBhbmQgYWRkZWQgaXQgdG8gdGhlIGV2ZW50IHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjZXZlbnQtZXZlbnRBdXRvQ3JlYXRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIHZpZXcgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIG5ldyBldmVudCByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRBdXRvQ3JlYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBldmVudCBoZWlnaHQgY2hhbmdlcyBkdWUgdG8gcmVzaXppbmcgb2YgdGhlIHZpZXdcbiAgICAgKiBhbmQgdGhlIGFwcGxpY2F0aW9uIG9mIFtyZXNwb25zaXZlRXZlbnRIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzcG9uc2l2ZUV2ZW50SGVpZ2h0KS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmhlaWdodCBUaGUgbmV3IGV2ZW50IGhlaWdodC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBwcmV2aW91cyBldmVudCBoZWlnaHQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRIZWlnaHRDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBoZWlnaHQ6IG51bWJlciwgb2xkSGVpZ2h0OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBkYXkgc3Bhbm5pbmcgZXZlbnQgaXMgZm91bmQsIGFuZCB0aGUgZGF0ZSB0byB3aGljaCBpdHMgZW5jYXBzdWxhdGluZyBldmVudCBiYXJcbiAgICAgKiBleHRlbmRzIGhhcyBiZWVuIGNhbGN1bGF0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1ldmVudFByb3BhZ2F0ZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5ldmVudEVuZERhdGUgVGhlIGVuZCBkYXRlIGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHByb3BhZ2F0ZSBlbmQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByb3BhZ2F0ZUVuZERhdGUgVGhlIHN5c3RlbS1jYWxjdWxhdGVkIGVuZCBwb2ludCBvZiB0aGUgZXZlbnQgYmFyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBbGxEYXkgYHRydWVgIGlmIHRoZSBldmVudCBpcyBhbiBhbGwgZGF5IGV2ZW50LCBvciBzcGFucyBtdWx0aXBsZSBkYXlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNPdmVyZmxvdyBgdHJ1ZWAgaWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiBmdXJ0aGVyIHByb3BhZ2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQub3ZlcmZsb3dzIGB0cnVlYCBpZiB0aGUgZXZlbnQgZXh0ZW5kcyBpbnRvIGZ1dHVyZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGZyb20gd2hpY2ggdGhlIGV2ZW50IGlzIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRQcm9wYWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudEVuZERhdGU6IERhdGUsIHByb3BhZ2F0ZUVuZERhdGU6IERhdGUsIGlzQWxsRGF5OiBib29sZWFuLCBpc092ZXJmbG93OiBib29sZWFuLCBvdmVyZmxvd3M6IGJvb2xlYW4sIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBkYXRlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgZXhwYW5kZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZW50ZXJzIHRoaXMgV2lkZ2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNJbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBgYmx1cmAgZXZlbnQuXG4gICAgICogZm9jdXMgbW92aW5nIGZyb20gd2l0aGluIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUsIGV2ZW4gaWYgdGhlcmUgYXJlIGZsb2F0aW5nIHdpZGdldHNcbiAgICAgKiB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgZXZlbnQuIFRoaXMgaXMgd2hlbiBmb2N1cyBleGl0cyB0aGlzIHdpZGdldCBjb21wbGV0ZWx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCB3aGljaCBoYWQgYmVlbiBpbiBhIG5vbi12aXNpYmxlIHN0YXRlIGZvciBhbnkgcmVhc29uXG4gICAgICogYWNoaWV2ZXMgdmlzaWJpbGl0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2V2ZW50LXBhaW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgcGFpbnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBXaWRnZXQncyByZWFkIG9ubHkgc3RhdGUgaXMgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnJlYWRPbmx5IFJlYWQgb25seSBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkT25seTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlYWRPbmx5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgd2lkZ2V0J3MgZWxlbWVudHMgaGF2ZSBiZWVuIHN5bmNocm9uaXplZCBkdWUgdG8gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2FsbFxuICAgICAqIHRvIFtyZWNvbXBvc2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhpcyBDYWxlbmRhclBhbmVsIHJlZnJlc2hlcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWZyZXNoOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5jYXBzdWxhdGluZyBlbGVtZW50IG9mIGEgV2lkZ2V0IHJlc2l6ZXMgKm9ubHkgd2hlbiBbbW9uaXRvclJlc2l6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1vbml0b3JSZXNpemUpIGlzIGB0cnVlYCouXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggVGhlIG5ldyB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5oZWlnaHQgVGhlIG5ldyBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggVGhlIG9sZCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRIZWlnaHQgVGhlIG9sZCBoZWlnaHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9sZFdpZHRoOiBudW1iZXIsIG9sZEhlaWdodDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYW4gW092ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L092ZXJmbG93UG9wdXApIGhhcyBiZWVuIHNob3duIHdoZW4gYW4gYVxuICAgICAqIFwiKyBuIG1vcmVcIiBvdmVyZmxvdyBidXR0b24gaXMgYWN0aXZhdGVkIGJ5IGFuIFtvdmVyZmxvd1BvcHVwVHJpZ2dlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI2NvbmZpZy1vdmVyZmxvd1BvcHVwVHJpZ2dlcikgZXZlbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGwgVGhlIGRheSBjZWxsIGZvciB3aGljaCB0aGUgb3ZlcmZsb3cgcG9wdXAgaXMgZ29pbmcgdG8gYmUgc2hvd24uXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBldmVudC5jZWxsRGF0YSBBIGBEYXlDZWxsYCBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBjZWxsLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSB3aGljaCBoYXMgb3ZlcmZsb3dpbmcgZXZlbnRzXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci53aWRnZXQuT3ZlcmZsb3dQb3B1cH0gZXZlbnQub3ZlcmZsb3dQb3B1cCBUaGUgb3ZlcmZsb3cgYFBvcHVwYC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TaG93T3ZlcmZsb3dQb3B1cDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGw6IEhUTUxFbGVtZW50LCBjZWxsRGF0YTogRGF5Q2VsbCwgZGF0ZTogRGF0ZSwgb3ZlcmZsb3dQb3B1cDogT3ZlcmZsb3dQb3B1cCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogQSBoZWFkZXIgW3Rvb2xdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRvb2xzKSBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQudG9vbCBUaGUgdG9vbCB3aGljaCBpcyBiZWluZyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvb2xDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVG9vbCwgdG9vbDogVG9vbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHdlZWsgbnVtYmVyIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB3ZWVrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIHdlZWsgYXJyYXkgYFt5ZWFyLCB3ZWVrTnVtYmVyXWAuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25XZWVrQ2VsbENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZGF0ZTogRGF0ZSwgd2VlazogbnVtYmVyW10sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhcyBzb29uIGFzIGEgd2VlayByb3cgaXMgcmVxdWVzdGVkIHRvIGJlIGZsZXhlZC4gVGhlIGFuaW1hdGVkXG4gICAgICogdHJhbnNpdGlvbiB0byB0aGUgbmV3IGhlaWdodCB3aWxsIHN0aWxsIGJlIGluIHByb2dyZXNzLCBidXQgdGhlIHJvdydzIGZsZXggc3R5bGUgaXNcbiAgICAgKiBzZXQgdG8gaXRzIGV2ZW5seSBzaGFyZWQgZmxleCB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2V2ZW50LXdlZWtGbGV4KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LndlZWtTdGFydCBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgd2VlayBiZWluZyByZXZlcnRlZCB0byBhIGZsZXhlZCBoZWlnaHQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUaGUgd2VlayByb3cgYmVpbmcgcmV2ZXJ0ZWQgdG8gYSBmbGV4ZWQgaGVpZ2h0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbldlZWtGbGV4OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgd2Vla1N0YXJ0OiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhcyBzb29uIGFzIGEgd2VlayByb3cgaXMgcmVxdWVzdGVkIHRvIGJlIHNocmlua3dyYXBwZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC13ZWVrU2hyaW5rd3JhcClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC53ZWVrU3RhcnQgVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHdlZWsgYmVpbmcgc2hyaW5rd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSB3ZWVrIHJvdyBiZWluZyBzaHJpbmt3cmFwcGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbldlZWtTaHJpbmt3cmFwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgd2Vla1N0YXJ0OiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtTW9udGhWaWV3Q29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1Nb250aFZpZXdDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|