@vendasta/meetings 0.73.1 → 0.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/_generated/host.service.mjs +25 -0
- package/esm2020/lib/_internal/enums/dayofweek.enum.mjs +18 -0
- package/esm2020/lib/_internal/enums/index.mjs +11 -0
- package/esm2020/lib/_internal/enums/meeting-source.enum.mjs +20 -0
- package/esm2020/lib/_internal/enums/shared.enum.mjs +21 -0
- package/{esm2015/lib/_internal/enums/zoom.enum.js → esm2020/lib/_internal/enums/zoom.enum.mjs} +1 -1
- package/esm2020/lib/_internal/google-meet.api.service.mjs +41 -0
- package/esm2020/lib/_internal/index.mjs +15 -0
- package/esm2020/lib/_internal/interfaces/date-range.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/datetime.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/dayofweek.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/field-mask.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/google-meet.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/meeting-guest.interface.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/meeting-host.interface.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/meeting-source.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/meeting-type.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/shared.interface.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/timeofday.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/zoom.interface.mjs +8 -0
- package/esm2020/lib/_internal/meeting-guest.api.service.mjs +84 -0
- package/esm2020/lib/_internal/meeting-host.api.service.mjs +170 -0
- package/esm2020/lib/_internal/meeting-source-api.api.service.mjs +41 -0
- package/esm2020/lib/_internal/objects/date-range.mjs +36 -0
- package/esm2020/lib/_internal/objects/datetime.mjs +77 -0
- package/esm2020/lib/_internal/objects/dayofweek.mjs +7 -0
- package/esm2020/lib/_internal/objects/field-mask.mjs +27 -0
- package/esm2020/lib/_internal/objects/google-meet.mjs +539 -0
- package/esm2020/lib/_internal/objects/index.mjs +18 -0
- package/esm2020/lib/_internal/objects/meeting-guest.mjs +511 -0
- package/esm2020/lib/_internal/objects/meeting-host.mjs +1485 -0
- package/esm2020/lib/_internal/objects/meeting-source.mjs +121 -0
- package/esm2020/lib/_internal/objects/meeting-type.mjs +119 -0
- package/esm2020/lib/_internal/objects/shared.mjs +426 -0
- package/esm2020/lib/_internal/objects/timeofday.mjs +36 -0
- package/esm2020/lib/_internal/objects/zoom.mjs +377 -0
- package/esm2020/lib/_internal/zoom.api.service.mjs +41 -0
- package/esm2020/lib/guest/guest.service.mjs +86 -0
- package/esm2020/lib/guest/index.mjs +2 -0
- package/esm2020/lib/host/host.service.mjs +308 -0
- package/esm2020/lib/host/url.mjs +39 -0
- package/esm2020/lib/index.mjs +8 -0
- package/esm2020/lib/meetings.service.mjs +168 -0
- package/esm2020/lib/shared/availability.mjs +2 -0
- package/esm2020/lib/shared/calendar.mjs +29 -0
- package/esm2020/lib/shared/duration.mjs +41 -0
- package/esm2020/lib/shared/environment.mjs +17 -0
- package/esm2020/lib/shared/fieldmask.mjs +6 -0
- package/esm2020/lib/shared/host-id.mjs +20 -0
- package/esm2020/lib/shared/host-url-map.mjs +2 -0
- package/esm2020/lib/shared/host-user.mjs +8 -0
- package/esm2020/lib/shared/host.mjs +8 -0
- package/esm2020/lib/shared/index.mjs +14 -0
- package/esm2020/lib/shared/meeting-type.mjs +60 -0
- package/esm2020/lib/shared/meeting.mjs +89 -0
- package/esm2020/lib/shared/paged-response.mjs +8 -0
- package/esm2020/lib/shared/preferences.mjs +12 -0
- package/esm2020/lib/shared/time-span.mjs +7 -0
- package/esm2020/public_api.mjs +2 -0
- package/esm2020/vendasta-meetings.mjs +5 -0
- package/fesm2015/{vendasta-meetings.js → vendasta-meetings.mjs} +487 -519
- package/fesm2015/vendasta-meetings.mjs.map +1 -0
- package/fesm2020/vendasta-meetings.mjs +5086 -0
- package/fesm2020/vendasta-meetings.mjs.map +1 -0
- package/lib/_generated/host.service.d.ts +5 -9
- package/lib/_internal/google-meet.api.service.d.ts +4 -0
- package/lib/_internal/meeting-guest.api.service.d.ts +4 -0
- package/lib/_internal/meeting-host.api.service.d.ts +4 -0
- package/lib/_internal/meeting-source-api.api.service.d.ts +4 -0
- package/lib/_internal/zoom.api.service.d.ts +4 -0
- package/lib/guest/guest.service.d.ts +4 -3
- package/lib/host/host.service.d.ts +4 -3
- package/lib/host/url.d.ts +1 -1
- package/lib/meetings.service.d.ts +3 -0
- package/lib/shared/environment.d.ts +8 -0
- package/lib/shared/meeting-type.d.ts +1 -1
- package/package.json +26 -15
- package/src/README.md +12 -0
- package/vendasta-meetings.d.ts +1 -0
- package/bundles/vendasta-meetings.umd.js +0 -5517
- package/bundles/vendasta-meetings.umd.js.map +0 -1
- package/bundles/vendasta-meetings.umd.min.js +0 -16
- package/bundles/vendasta-meetings.umd.min.js.map +0 -1
- package/esm2015/lib/_generated/host.service.js +0 -65
- package/esm2015/lib/_internal/enums/dayofweek.enum.js +0 -18
- package/esm2015/lib/_internal/enums/index.js +0 -11
- package/esm2015/lib/_internal/enums/meeting-source.enum.js +0 -20
- package/esm2015/lib/_internal/enums/shared.enum.js +0 -21
- package/esm2015/lib/_internal/google-meet.api.service.js +0 -42
- package/esm2015/lib/_internal/index.js +0 -15
- package/esm2015/lib/_internal/interfaces/date-range.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/datetime.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/dayofweek.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/field-mask.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/google-meet.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/index.js +0 -2
- package/esm2015/lib/_internal/interfaces/meeting-guest.interface.js +0 -2
- package/esm2015/lib/_internal/interfaces/meeting-host.interface.js +0 -2
- package/esm2015/lib/_internal/interfaces/meeting-source.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/meeting-type.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/shared.interface.js +0 -2
- package/esm2015/lib/_internal/interfaces/timeofday.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/zoom.interface.js +0 -8
- package/esm2015/lib/_internal/meeting-guest.api.service.js +0 -85
- package/esm2015/lib/_internal/meeting-host.api.service.js +0 -171
- package/esm2015/lib/_internal/meeting-source-api.api.service.js +0 -42
- package/esm2015/lib/_internal/objects/date-range.js +0 -36
- package/esm2015/lib/_internal/objects/datetime.js +0 -77
- package/esm2015/lib/_internal/objects/dayofweek.js +0 -7
- package/esm2015/lib/_internal/objects/field-mask.js +0 -27
- package/esm2015/lib/_internal/objects/google-meet.js +0 -539
- package/esm2015/lib/_internal/objects/index.js +0 -18
- package/esm2015/lib/_internal/objects/meeting-guest.js +0 -511
- package/esm2015/lib/_internal/objects/meeting-host.js +0 -1485
- package/esm2015/lib/_internal/objects/meeting-source.js +0 -121
- package/esm2015/lib/_internal/objects/meeting-type.js +0 -119
- package/esm2015/lib/_internal/objects/shared.js +0 -426
- package/esm2015/lib/_internal/objects/timeofday.js +0 -36
- package/esm2015/lib/_internal/objects/zoom.js +0 -377
- package/esm2015/lib/_internal/zoom.api.service.js +0 -42
- package/esm2015/lib/guest/guest.service.js +0 -86
- package/esm2015/lib/guest/index.js +0 -2
- package/esm2015/lib/host/host.service.js +0 -287
- package/esm2015/lib/host/url.js +0 -39
- package/esm2015/lib/index.js +0 -8
- package/esm2015/lib/meetings.service.js +0 -170
- package/esm2015/lib/shared/availability.js +0 -2
- package/esm2015/lib/shared/calendar.js +0 -29
- package/esm2015/lib/shared/duration.js +0 -41
- package/esm2015/lib/shared/fieldmask.js +0 -6
- package/esm2015/lib/shared/host-id.js +0 -20
- package/esm2015/lib/shared/host-url-map.js +0 -2
- package/esm2015/lib/shared/host-user.js +0 -8
- package/esm2015/lib/shared/host.js +0 -8
- package/esm2015/lib/shared/index.js +0 -14
- package/esm2015/lib/shared/meeting-type.js +0 -52
- package/esm2015/lib/shared/meeting.js +0 -89
- package/esm2015/lib/shared/paged-response.js +0 -8
- package/esm2015/lib/shared/preferences.js +0 -12
- package/esm2015/lib/shared/time-span.js +0 -7
- package/esm2015/public_api.js +0 -2
- package/esm2015/vendasta-meetings.js +0 -5
- package/fesm2015/vendasta-meetings.js.map +0 -1
- package/vendasta-meetings.metadata.json +0 -1
|
@@ -1,1485 +0,0 @@
|
|
|
1
|
-
import { DateRange } from './date-range';
|
|
2
|
-
import { FieldMask } from './field-mask';
|
|
3
|
-
import { MeetingType } from './meeting-type';
|
|
4
|
-
import { TimeRange, Calendar, Preferences, HostUser, Contact, PagedRequestOptions, PagedResponseMetadata, Attendee, Answers, Attachment } from './shared';
|
|
5
|
-
import { TimeZone } from './datetime';
|
|
6
|
-
import * as e from '../enums';
|
|
7
|
-
export function enumStringToValue(enumRef, value) {
|
|
8
|
-
if (typeof value === 'number') {
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
|
-
return enumRef[value];
|
|
12
|
-
}
|
|
13
|
-
export class BuildHostIdRequestApplicationContextPropertiesEntry {
|
|
14
|
-
constructor(kwargs) {
|
|
15
|
-
if (!kwargs) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
Object.assign(this, kwargs);
|
|
19
|
-
}
|
|
20
|
-
static fromProto(proto) {
|
|
21
|
-
let m = new BuildHostIdRequestApplicationContextPropertiesEntry();
|
|
22
|
-
m = Object.assign(m, proto);
|
|
23
|
-
return m;
|
|
24
|
-
}
|
|
25
|
-
toApiJson() {
|
|
26
|
-
const toReturn = {};
|
|
27
|
-
if (typeof this.key !== 'undefined') {
|
|
28
|
-
toReturn['key'] = this.key;
|
|
29
|
-
}
|
|
30
|
-
if (typeof this.value !== 'undefined') {
|
|
31
|
-
toReturn['value'] = this.value;
|
|
32
|
-
}
|
|
33
|
-
return toReturn;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export class EnsurePersonalCalendarExistsRequestApplicationContextPropertiesEntry {
|
|
37
|
-
constructor(kwargs) {
|
|
38
|
-
if (!kwargs) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
Object.assign(this, kwargs);
|
|
42
|
-
}
|
|
43
|
-
static fromProto(proto) {
|
|
44
|
-
let m = new EnsurePersonalCalendarExistsRequestApplicationContextPropertiesEntry();
|
|
45
|
-
m = Object.assign(m, proto);
|
|
46
|
-
return m;
|
|
47
|
-
}
|
|
48
|
-
toApiJson() {
|
|
49
|
-
const toReturn = {};
|
|
50
|
-
if (typeof this.key !== 'undefined') {
|
|
51
|
-
toReturn['key'] = this.key;
|
|
52
|
-
}
|
|
53
|
-
if (typeof this.value !== 'undefined') {
|
|
54
|
-
toReturn['value'] = this.value;
|
|
55
|
-
}
|
|
56
|
-
return toReturn;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
export class AvailabilityRule {
|
|
60
|
-
constructor(kwargs) {
|
|
61
|
-
if (!kwargs) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
Object.assign(this, kwargs);
|
|
65
|
-
}
|
|
66
|
-
static fromProto(proto) {
|
|
67
|
-
let m = new AvailabilityRule();
|
|
68
|
-
m = Object.assign(m, proto);
|
|
69
|
-
if (proto.day) {
|
|
70
|
-
m.day = enumStringToValue(e.DayOfWeek, proto.day);
|
|
71
|
-
}
|
|
72
|
-
if (proto.timeSlot) {
|
|
73
|
-
m.timeSlot = TimeRange.fromProto(proto.timeSlot);
|
|
74
|
-
}
|
|
75
|
-
if (proto.timeZone) {
|
|
76
|
-
m.timeZone = TimeZone.fromProto(proto.timeZone);
|
|
77
|
-
}
|
|
78
|
-
return m;
|
|
79
|
-
}
|
|
80
|
-
toApiJson() {
|
|
81
|
-
const toReturn = {};
|
|
82
|
-
if (typeof this.hostId !== 'undefined') {
|
|
83
|
-
toReturn['hostId'] = this.hostId;
|
|
84
|
-
}
|
|
85
|
-
if (typeof this.meetingTypeId !== 'undefined') {
|
|
86
|
-
toReturn['meetingTypeId'] = this.meetingTypeId;
|
|
87
|
-
}
|
|
88
|
-
if (typeof this.day !== 'undefined') {
|
|
89
|
-
toReturn['day'] = this.day;
|
|
90
|
-
}
|
|
91
|
-
if (typeof this.timeSlot !== 'undefined' && this.timeSlot !== null) {
|
|
92
|
-
toReturn['timeSlot'] = 'toApiJson' in this.timeSlot ? this.timeSlot.toApiJson() : this.timeSlot;
|
|
93
|
-
}
|
|
94
|
-
if (typeof this.timeZone !== 'undefined' && this.timeZone !== null) {
|
|
95
|
-
toReturn['timeZone'] = 'toApiJson' in this.timeZone ? this.timeZone.toApiJson() : this.timeZone;
|
|
96
|
-
}
|
|
97
|
-
return toReturn;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
export class BuildHostIdRequest {
|
|
101
|
-
constructor(kwargs) {
|
|
102
|
-
if (!kwargs) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
Object.assign(this, kwargs);
|
|
106
|
-
}
|
|
107
|
-
static fromProto(proto) {
|
|
108
|
-
let m = new BuildHostIdRequest();
|
|
109
|
-
m = Object.assign(m, proto);
|
|
110
|
-
if (proto.applicationContextProperties) {
|
|
111
|
-
m.applicationContextProperties = Object.keys(proto.applicationContextProperties).reduce((obj, k) => { obj[k] = proto.applicationContextProperties[k]; return obj; }, {});
|
|
112
|
-
}
|
|
113
|
-
return m;
|
|
114
|
-
}
|
|
115
|
-
toApiJson() {
|
|
116
|
-
const toReturn = {};
|
|
117
|
-
if (typeof this.applicationContextProperties !== 'undefined' && this.applicationContextProperties !== null) {
|
|
118
|
-
toReturn['applicationContextProperties'] = 'toApiJson' in this.applicationContextProperties ? this.applicationContextProperties.toApiJson() : this.applicationContextProperties;
|
|
119
|
-
}
|
|
120
|
-
if (typeof this.userId !== 'undefined') {
|
|
121
|
-
toReturn['userId'] = this.userId;
|
|
122
|
-
}
|
|
123
|
-
return toReturn;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
export class BuildHostIdResponse {
|
|
127
|
-
constructor(kwargs) {
|
|
128
|
-
if (!kwargs) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
Object.assign(this, kwargs);
|
|
132
|
-
}
|
|
133
|
-
static fromProto(proto) {
|
|
134
|
-
let m = new BuildHostIdResponse();
|
|
135
|
-
m = Object.assign(m, proto);
|
|
136
|
-
return m;
|
|
137
|
-
}
|
|
138
|
-
toApiJson() {
|
|
139
|
-
const toReturn = {};
|
|
140
|
-
if (typeof this.hostId !== 'undefined') {
|
|
141
|
-
toReturn['hostId'] = this.hostId;
|
|
142
|
-
}
|
|
143
|
-
return toReturn;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
export class GetMeetingTypesForCalendarsResponseCalendarMeetingTypesMapEntry {
|
|
147
|
-
constructor(kwargs) {
|
|
148
|
-
if (!kwargs) {
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
Object.assign(this, kwargs);
|
|
152
|
-
}
|
|
153
|
-
static fromProto(proto) {
|
|
154
|
-
let m = new GetMeetingTypesForCalendarsResponseCalendarMeetingTypesMapEntry();
|
|
155
|
-
m = Object.assign(m, proto);
|
|
156
|
-
if (proto.value) {
|
|
157
|
-
m.value = MeetingTypeList.fromProto(proto.value);
|
|
158
|
-
}
|
|
159
|
-
return m;
|
|
160
|
-
}
|
|
161
|
-
toApiJson() {
|
|
162
|
-
const toReturn = {};
|
|
163
|
-
if (typeof this.key !== 'undefined') {
|
|
164
|
-
toReturn['key'] = this.key;
|
|
165
|
-
}
|
|
166
|
-
if (typeof this.value !== 'undefined' && this.value !== null) {
|
|
167
|
-
toReturn['value'] = 'toApiJson' in this.value ? this.value.toApiJson() : this.value;
|
|
168
|
-
}
|
|
169
|
-
return toReturn;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
export class CancelMeetingRequest {
|
|
173
|
-
constructor(kwargs) {
|
|
174
|
-
if (!kwargs) {
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
Object.assign(this, kwargs);
|
|
178
|
-
}
|
|
179
|
-
static fromProto(proto) {
|
|
180
|
-
let m = new CancelMeetingRequest();
|
|
181
|
-
m = Object.assign(m, proto);
|
|
182
|
-
return m;
|
|
183
|
-
}
|
|
184
|
-
toApiJson() {
|
|
185
|
-
const toReturn = {};
|
|
186
|
-
if (typeof this.meetingId !== 'undefined') {
|
|
187
|
-
toReturn['meetingId'] = this.meetingId;
|
|
188
|
-
}
|
|
189
|
-
if (typeof this.cancellationReason !== 'undefined') {
|
|
190
|
-
toReturn['cancellationReason'] = this.cancellationReason;
|
|
191
|
-
}
|
|
192
|
-
return toReturn;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
export class CreateAvailabilityRequest {
|
|
196
|
-
static fromProto(proto) {
|
|
197
|
-
let m = new CreateAvailabilityRequest();
|
|
198
|
-
m = Object.assign(m, proto);
|
|
199
|
-
return m;
|
|
200
|
-
}
|
|
201
|
-
constructor(kwargs) {
|
|
202
|
-
if (!kwargs) {
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
Object.assign(this, kwargs);
|
|
206
|
-
}
|
|
207
|
-
toApiJson() {
|
|
208
|
-
const toReturn = {};
|
|
209
|
-
return toReturn;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
export class CreateAvailabilityResponse {
|
|
213
|
-
static fromProto(proto) {
|
|
214
|
-
let m = new CreateAvailabilityResponse();
|
|
215
|
-
m = Object.assign(m, proto);
|
|
216
|
-
return m;
|
|
217
|
-
}
|
|
218
|
-
constructor(kwargs) {
|
|
219
|
-
if (!kwargs) {
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
Object.assign(this, kwargs);
|
|
223
|
-
}
|
|
224
|
-
toApiJson() {
|
|
225
|
-
const toReturn = {};
|
|
226
|
-
return toReturn;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
export class CreateCalendarRequest {
|
|
230
|
-
constructor(kwargs) {
|
|
231
|
-
if (!kwargs) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
Object.assign(this, kwargs);
|
|
235
|
-
}
|
|
236
|
-
static fromProto(proto) {
|
|
237
|
-
let m = new CreateCalendarRequest();
|
|
238
|
-
m = Object.assign(m, proto);
|
|
239
|
-
if (proto.calendar) {
|
|
240
|
-
m.calendar = Calendar.fromProto(proto.calendar);
|
|
241
|
-
}
|
|
242
|
-
return m;
|
|
243
|
-
}
|
|
244
|
-
toApiJson() {
|
|
245
|
-
const toReturn = {};
|
|
246
|
-
if (typeof this.calendar !== 'undefined' && this.calendar !== null) {
|
|
247
|
-
toReturn['calendar'] = 'toApiJson' in this.calendar ? this.calendar.toApiJson() : this.calendar;
|
|
248
|
-
}
|
|
249
|
-
return toReturn;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
export class CreateCalendarResponse {
|
|
253
|
-
constructor(kwargs) {
|
|
254
|
-
if (!kwargs) {
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
Object.assign(this, kwargs);
|
|
258
|
-
}
|
|
259
|
-
static fromProto(proto) {
|
|
260
|
-
let m = new CreateCalendarResponse();
|
|
261
|
-
m = Object.assign(m, proto);
|
|
262
|
-
return m;
|
|
263
|
-
}
|
|
264
|
-
toApiJson() {
|
|
265
|
-
const toReturn = {};
|
|
266
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
267
|
-
toReturn['calendarId'] = this.calendarId;
|
|
268
|
-
}
|
|
269
|
-
return toReturn;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
export class CreateDefaultMeetingTypesRequest {
|
|
273
|
-
constructor(kwargs) {
|
|
274
|
-
if (!kwargs) {
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
Object.assign(this, kwargs);
|
|
278
|
-
}
|
|
279
|
-
static fromProto(proto) {
|
|
280
|
-
let m = new CreateDefaultMeetingTypesRequest();
|
|
281
|
-
m = Object.assign(m, proto);
|
|
282
|
-
return m;
|
|
283
|
-
}
|
|
284
|
-
toApiJson() {
|
|
285
|
-
const toReturn = {};
|
|
286
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
287
|
-
toReturn['calendarId'] = this.calendarId;
|
|
288
|
-
}
|
|
289
|
-
if (typeof this.calendarIds !== 'undefined') {
|
|
290
|
-
toReturn['calendarIds'] = this.calendarIds;
|
|
291
|
-
}
|
|
292
|
-
return toReturn;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
export class CreateMeetingTypeRequest {
|
|
296
|
-
constructor(kwargs) {
|
|
297
|
-
if (!kwargs) {
|
|
298
|
-
return;
|
|
299
|
-
}
|
|
300
|
-
Object.assign(this, kwargs);
|
|
301
|
-
}
|
|
302
|
-
static fromProto(proto) {
|
|
303
|
-
let m = new CreateMeetingTypeRequest();
|
|
304
|
-
m = Object.assign(m, proto);
|
|
305
|
-
if (proto.meetingType) {
|
|
306
|
-
m.meetingType = MeetingType.fromProto(proto.meetingType);
|
|
307
|
-
}
|
|
308
|
-
return m;
|
|
309
|
-
}
|
|
310
|
-
toApiJson() {
|
|
311
|
-
const toReturn = {};
|
|
312
|
-
if (typeof this.meetingType !== 'undefined' && this.meetingType !== null) {
|
|
313
|
-
toReturn['meetingType'] = 'toApiJson' in this.meetingType ? this.meetingType.toApiJson() : this.meetingType;
|
|
314
|
-
}
|
|
315
|
-
return toReturn;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
export class CreateMeetingTypeResponse {
|
|
319
|
-
constructor(kwargs) {
|
|
320
|
-
if (!kwargs) {
|
|
321
|
-
return;
|
|
322
|
-
}
|
|
323
|
-
Object.assign(this, kwargs);
|
|
324
|
-
}
|
|
325
|
-
static fromProto(proto) {
|
|
326
|
-
let m = new CreateMeetingTypeResponse();
|
|
327
|
-
m = Object.assign(m, proto);
|
|
328
|
-
return m;
|
|
329
|
-
}
|
|
330
|
-
toApiJson() {
|
|
331
|
-
const toReturn = {};
|
|
332
|
-
if (typeof this.id !== 'undefined') {
|
|
333
|
-
toReturn['id'] = this.id;
|
|
334
|
-
}
|
|
335
|
-
return toReturn;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
export class DeleteAvailabilityRequest {
|
|
339
|
-
static fromProto(proto) {
|
|
340
|
-
let m = new DeleteAvailabilityRequest();
|
|
341
|
-
m = Object.assign(m, proto);
|
|
342
|
-
return m;
|
|
343
|
-
}
|
|
344
|
-
constructor(kwargs) {
|
|
345
|
-
if (!kwargs) {
|
|
346
|
-
return;
|
|
347
|
-
}
|
|
348
|
-
Object.assign(this, kwargs);
|
|
349
|
-
}
|
|
350
|
-
toApiJson() {
|
|
351
|
-
const toReturn = {};
|
|
352
|
-
return toReturn;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
export class DeleteMeetingTypeRequest {
|
|
356
|
-
constructor(kwargs) {
|
|
357
|
-
if (!kwargs) {
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
Object.assign(this, kwargs);
|
|
361
|
-
}
|
|
362
|
-
static fromProto(proto) {
|
|
363
|
-
let m = new DeleteMeetingTypeRequest();
|
|
364
|
-
m = Object.assign(m, proto);
|
|
365
|
-
return m;
|
|
366
|
-
}
|
|
367
|
-
toApiJson() {
|
|
368
|
-
const toReturn = {};
|
|
369
|
-
if (typeof this.id !== 'undefined') {
|
|
370
|
-
toReturn['id'] = this.id;
|
|
371
|
-
}
|
|
372
|
-
return toReturn;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
export class DoesCalendarExistRequest {
|
|
376
|
-
constructor(kwargs) {
|
|
377
|
-
if (!kwargs) {
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
Object.assign(this, kwargs);
|
|
381
|
-
}
|
|
382
|
-
static fromProto(proto) {
|
|
383
|
-
let m = new DoesCalendarExistRequest();
|
|
384
|
-
m = Object.assign(m, proto);
|
|
385
|
-
return m;
|
|
386
|
-
}
|
|
387
|
-
toApiJson() {
|
|
388
|
-
const toReturn = {};
|
|
389
|
-
if (typeof this.calendarIdentifier !== 'undefined') {
|
|
390
|
-
toReturn['calendarIdentifier'] = this.calendarIdentifier;
|
|
391
|
-
}
|
|
392
|
-
return toReturn;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
export class DoesCalendarExistResponse {
|
|
396
|
-
constructor(kwargs) {
|
|
397
|
-
if (!kwargs) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
Object.assign(this, kwargs);
|
|
401
|
-
}
|
|
402
|
-
static fromProto(proto) {
|
|
403
|
-
let m = new DoesCalendarExistResponse();
|
|
404
|
-
m = Object.assign(m, proto);
|
|
405
|
-
return m;
|
|
406
|
-
}
|
|
407
|
-
toApiJson() {
|
|
408
|
-
const toReturn = {};
|
|
409
|
-
if (typeof this.exists !== 'undefined') {
|
|
410
|
-
toReturn['exists'] = this.exists;
|
|
411
|
-
}
|
|
412
|
-
return toReturn;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
export class EnsureGroupCalendarsExistRequest {
|
|
416
|
-
constructor(kwargs) {
|
|
417
|
-
if (!kwargs) {
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
Object.assign(this, kwargs);
|
|
421
|
-
}
|
|
422
|
-
static fromProto(proto) {
|
|
423
|
-
let m = new EnsureGroupCalendarsExistRequest();
|
|
424
|
-
m = Object.assign(m, proto);
|
|
425
|
-
return m;
|
|
426
|
-
}
|
|
427
|
-
toApiJson() {
|
|
428
|
-
const toReturn = {};
|
|
429
|
-
if (typeof this.externalIds !== 'undefined') {
|
|
430
|
-
toReturn['externalIds'] = this.externalIds;
|
|
431
|
-
}
|
|
432
|
-
return toReturn;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
export class EnsureGroupCalendarsExistResponse {
|
|
436
|
-
constructor(kwargs) {
|
|
437
|
-
if (!kwargs) {
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
Object.assign(this, kwargs);
|
|
441
|
-
}
|
|
442
|
-
static fromProto(proto) {
|
|
443
|
-
let m = new EnsureGroupCalendarsExistResponse();
|
|
444
|
-
m = Object.assign(m, proto);
|
|
445
|
-
return m;
|
|
446
|
-
}
|
|
447
|
-
toApiJson() {
|
|
448
|
-
const toReturn = {};
|
|
449
|
-
if (typeof this.calendarIds !== 'undefined') {
|
|
450
|
-
toReturn['calendarIds'] = this.calendarIds;
|
|
451
|
-
}
|
|
452
|
-
return toReturn;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
export class EnsurePersonalCalendarExistsRequest {
|
|
456
|
-
constructor(kwargs) {
|
|
457
|
-
if (!kwargs) {
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
Object.assign(this, kwargs);
|
|
461
|
-
}
|
|
462
|
-
static fromProto(proto) {
|
|
463
|
-
let m = new EnsurePersonalCalendarExistsRequest();
|
|
464
|
-
m = Object.assign(m, proto);
|
|
465
|
-
if (proto.applicationContextProperties) {
|
|
466
|
-
m.applicationContextProperties = Object.keys(proto.applicationContextProperties).reduce((obj, k) => { obj[k] = proto.applicationContextProperties[k]; return obj; }, {});
|
|
467
|
-
}
|
|
468
|
-
return m;
|
|
469
|
-
}
|
|
470
|
-
toApiJson() {
|
|
471
|
-
const toReturn = {};
|
|
472
|
-
if (typeof this.userId !== 'undefined') {
|
|
473
|
-
toReturn['userId'] = this.userId;
|
|
474
|
-
}
|
|
475
|
-
if (typeof this.applicationContextProperties !== 'undefined' && this.applicationContextProperties !== null) {
|
|
476
|
-
toReturn['applicationContextProperties'] = 'toApiJson' in this.applicationContextProperties ? this.applicationContextProperties.toApiJson() : this.applicationContextProperties;
|
|
477
|
-
}
|
|
478
|
-
return toReturn;
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
export class EnsurePersonalCalendarExistsResponse {
|
|
482
|
-
constructor(kwargs) {
|
|
483
|
-
if (!kwargs) {
|
|
484
|
-
return;
|
|
485
|
-
}
|
|
486
|
-
Object.assign(this, kwargs);
|
|
487
|
-
}
|
|
488
|
-
static fromProto(proto) {
|
|
489
|
-
let m = new EnsurePersonalCalendarExistsResponse();
|
|
490
|
-
m = Object.assign(m, proto);
|
|
491
|
-
return m;
|
|
492
|
-
}
|
|
493
|
-
toApiJson() {
|
|
494
|
-
const toReturn = {};
|
|
495
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
496
|
-
toReturn['calendarId'] = this.calendarId;
|
|
497
|
-
}
|
|
498
|
-
return toReturn;
|
|
499
|
-
}
|
|
500
|
-
}
|
|
501
|
-
export class ListAvailabilityRequestFilters {
|
|
502
|
-
constructor(kwargs) {
|
|
503
|
-
if (!kwargs) {
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
Object.assign(this, kwargs);
|
|
507
|
-
}
|
|
508
|
-
static fromProto(proto) {
|
|
509
|
-
let m = new ListAvailabilityRequestFilters();
|
|
510
|
-
m = Object.assign(m, proto);
|
|
511
|
-
return m;
|
|
512
|
-
}
|
|
513
|
-
toApiJson() {
|
|
514
|
-
const toReturn = {};
|
|
515
|
-
if (typeof this.hostId !== 'undefined') {
|
|
516
|
-
toReturn['hostId'] = this.hostId;
|
|
517
|
-
}
|
|
518
|
-
if (typeof this.meetingTypeId !== 'undefined') {
|
|
519
|
-
toReturn['meetingTypeId'] = this.meetingTypeId;
|
|
520
|
-
}
|
|
521
|
-
return toReturn;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
export class ListBookedMeetingsRequestFilters {
|
|
525
|
-
constructor(kwargs) {
|
|
526
|
-
if (!kwargs) {
|
|
527
|
-
return;
|
|
528
|
-
}
|
|
529
|
-
Object.assign(this, kwargs);
|
|
530
|
-
}
|
|
531
|
-
static fromProto(proto) {
|
|
532
|
-
let m = new ListBookedMeetingsRequestFilters();
|
|
533
|
-
m = Object.assign(m, proto);
|
|
534
|
-
if (proto.timeSpan) {
|
|
535
|
-
m.timeSpan = DateRange.fromProto(proto.timeSpan);
|
|
536
|
-
}
|
|
537
|
-
return m;
|
|
538
|
-
}
|
|
539
|
-
toApiJson() {
|
|
540
|
-
const toReturn = {};
|
|
541
|
-
if (typeof this.meetingTypeIds !== 'undefined') {
|
|
542
|
-
toReturn['meetingTypeIds'] = this.meetingTypeIds;
|
|
543
|
-
}
|
|
544
|
-
if (typeof this.hostId !== 'undefined') {
|
|
545
|
-
toReturn['hostId'] = this.hostId;
|
|
546
|
-
}
|
|
547
|
-
if (typeof this.timeSpan !== 'undefined' && this.timeSpan !== null) {
|
|
548
|
-
toReturn['timeSpan'] = 'toApiJson' in this.timeSpan ? this.timeSpan.toApiJson() : this.timeSpan;
|
|
549
|
-
}
|
|
550
|
-
return toReturn;
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
export class GetHostMeetingRequest {
|
|
554
|
-
constructor(kwargs) {
|
|
555
|
-
if (!kwargs) {
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
Object.assign(this, kwargs);
|
|
559
|
-
}
|
|
560
|
-
static fromProto(proto) {
|
|
561
|
-
let m = new GetHostMeetingRequest();
|
|
562
|
-
m = Object.assign(m, proto);
|
|
563
|
-
return m;
|
|
564
|
-
}
|
|
565
|
-
toApiJson() {
|
|
566
|
-
const toReturn = {};
|
|
567
|
-
if (typeof this.meetingId !== 'undefined') {
|
|
568
|
-
toReturn['meetingId'] = this.meetingId;
|
|
569
|
-
}
|
|
570
|
-
if (typeof this.location !== 'undefined') {
|
|
571
|
-
toReturn['location'] = this.location;
|
|
572
|
-
}
|
|
573
|
-
return toReturn;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
export class GetHostMeetingResponse {
|
|
577
|
-
constructor(kwargs) {
|
|
578
|
-
if (!kwargs) {
|
|
579
|
-
return;
|
|
580
|
-
}
|
|
581
|
-
Object.assign(this, kwargs);
|
|
582
|
-
}
|
|
583
|
-
static fromProto(proto) {
|
|
584
|
-
let m = new GetHostMeetingResponse();
|
|
585
|
-
m = Object.assign(m, proto);
|
|
586
|
-
if (proto.meeting) {
|
|
587
|
-
m.meeting = Meeting.fromProto(proto.meeting);
|
|
588
|
-
}
|
|
589
|
-
return m;
|
|
590
|
-
}
|
|
591
|
-
toApiJson() {
|
|
592
|
-
const toReturn = {};
|
|
593
|
-
if (typeof this.meeting !== 'undefined' && this.meeting !== null) {
|
|
594
|
-
toReturn['meeting'] = 'toApiJson' in this.meeting ? this.meeting.toApiJson() : this.meeting;
|
|
595
|
-
}
|
|
596
|
-
return toReturn;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
export class GetHostPreferencesRequest {
|
|
600
|
-
constructor(kwargs) {
|
|
601
|
-
if (!kwargs) {
|
|
602
|
-
return;
|
|
603
|
-
}
|
|
604
|
-
Object.assign(this, kwargs);
|
|
605
|
-
}
|
|
606
|
-
static fromProto(proto) {
|
|
607
|
-
let m = new GetHostPreferencesRequest();
|
|
608
|
-
m = Object.assign(m, proto);
|
|
609
|
-
return m;
|
|
610
|
-
}
|
|
611
|
-
toApiJson() {
|
|
612
|
-
const toReturn = {};
|
|
613
|
-
if (typeof this.hostId !== 'undefined') {
|
|
614
|
-
toReturn['hostId'] = this.hostId;
|
|
615
|
-
}
|
|
616
|
-
return toReturn;
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
export class GetHostPreferencesResponse {
|
|
620
|
-
constructor(kwargs) {
|
|
621
|
-
if (!kwargs) {
|
|
622
|
-
return;
|
|
623
|
-
}
|
|
624
|
-
Object.assign(this, kwargs);
|
|
625
|
-
}
|
|
626
|
-
static fromProto(proto) {
|
|
627
|
-
let m = new GetHostPreferencesResponse();
|
|
628
|
-
m = Object.assign(m, proto);
|
|
629
|
-
if (proto.preferences) {
|
|
630
|
-
m.preferences = Preferences.fromProto(proto.preferences);
|
|
631
|
-
}
|
|
632
|
-
return m;
|
|
633
|
-
}
|
|
634
|
-
toApiJson() {
|
|
635
|
-
const toReturn = {};
|
|
636
|
-
if (typeof this.preferences !== 'undefined' && this.preferences !== null) {
|
|
637
|
-
toReturn['preferences'] = 'toApiJson' in this.preferences ? this.preferences.toApiJson() : this.preferences;
|
|
638
|
-
}
|
|
639
|
-
return toReturn;
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
export class GetHostsForCalendarRequest {
|
|
643
|
-
constructor(kwargs) {
|
|
644
|
-
if (!kwargs) {
|
|
645
|
-
return;
|
|
646
|
-
}
|
|
647
|
-
Object.assign(this, kwargs);
|
|
648
|
-
}
|
|
649
|
-
static fromProto(proto) {
|
|
650
|
-
let m = new GetHostsForCalendarRequest();
|
|
651
|
-
m = Object.assign(m, proto);
|
|
652
|
-
return m;
|
|
653
|
-
}
|
|
654
|
-
toApiJson() {
|
|
655
|
-
const toReturn = {};
|
|
656
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
657
|
-
toReturn['calendarId'] = this.calendarId;
|
|
658
|
-
}
|
|
659
|
-
return toReturn;
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
export class GetHostsForCalendarResponse {
|
|
663
|
-
constructor(kwargs) {
|
|
664
|
-
if (!kwargs) {
|
|
665
|
-
return;
|
|
666
|
-
}
|
|
667
|
-
Object.assign(this, kwargs);
|
|
668
|
-
}
|
|
669
|
-
static fromProto(proto) {
|
|
670
|
-
let m = new GetHostsForCalendarResponse();
|
|
671
|
-
m = Object.assign(m, proto);
|
|
672
|
-
if (proto.hostUsers) {
|
|
673
|
-
m.hostUsers = proto.hostUsers.map(HostUser.fromProto);
|
|
674
|
-
}
|
|
675
|
-
return m;
|
|
676
|
-
}
|
|
677
|
-
toApiJson() {
|
|
678
|
-
const toReturn = {};
|
|
679
|
-
if (typeof this.hostUsers !== 'undefined' && this.hostUsers !== null) {
|
|
680
|
-
toReturn['hostUsers'] = 'toApiJson' in this.hostUsers ? this.hostUsers.toApiJson() : this.hostUsers;
|
|
681
|
-
}
|
|
682
|
-
return toReturn;
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
export class GetMeetingTypesForCalendarsRequest {
|
|
686
|
-
constructor(kwargs) {
|
|
687
|
-
if (!kwargs) {
|
|
688
|
-
return;
|
|
689
|
-
}
|
|
690
|
-
Object.assign(this, kwargs);
|
|
691
|
-
}
|
|
692
|
-
static fromProto(proto) {
|
|
693
|
-
let m = new GetMeetingTypesForCalendarsRequest();
|
|
694
|
-
m = Object.assign(m, proto);
|
|
695
|
-
return m;
|
|
696
|
-
}
|
|
697
|
-
toApiJson() {
|
|
698
|
-
const toReturn = {};
|
|
699
|
-
if (typeof this.calendarIds !== 'undefined') {
|
|
700
|
-
toReturn['calendarIds'] = this.calendarIds;
|
|
701
|
-
}
|
|
702
|
-
return toReturn;
|
|
703
|
-
}
|
|
704
|
-
}
|
|
705
|
-
export class GetMeetingTypesForCalendarsResponse {
|
|
706
|
-
constructor(kwargs) {
|
|
707
|
-
if (!kwargs) {
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
Object.assign(this, kwargs);
|
|
711
|
-
}
|
|
712
|
-
static fromProto(proto) {
|
|
713
|
-
let m = new GetMeetingTypesForCalendarsResponse();
|
|
714
|
-
m = Object.assign(m, proto);
|
|
715
|
-
if (proto.calendarMeetingTypesMap) {
|
|
716
|
-
m.calendarMeetingTypesMap = Object.keys(proto.calendarMeetingTypesMap).reduce((obj, k) => { obj[k] = MeetingTypeList.fromProto(proto.calendarMeetingTypesMap[k]); return obj; }, {});
|
|
717
|
-
}
|
|
718
|
-
return m;
|
|
719
|
-
}
|
|
720
|
-
toApiJson() {
|
|
721
|
-
const toReturn = {};
|
|
722
|
-
if (typeof this.calendarMeetingTypesMap !== 'undefined' && this.calendarMeetingTypesMap !== null) {
|
|
723
|
-
toReturn['calendarMeetingTypesMap'] = 'toApiJson' in this.calendarMeetingTypesMap ? this.calendarMeetingTypesMap.toApiJson() : this.calendarMeetingTypesMap;
|
|
724
|
-
}
|
|
725
|
-
return toReturn;
|
|
726
|
-
}
|
|
727
|
-
}
|
|
728
|
-
export class HostBookMeetingRequest {
|
|
729
|
-
constructor(kwargs) {
|
|
730
|
-
if (!kwargs) {
|
|
731
|
-
return;
|
|
732
|
-
}
|
|
733
|
-
Object.assign(this, kwargs);
|
|
734
|
-
}
|
|
735
|
-
static fromProto(proto) {
|
|
736
|
-
let m = new HostBookMeetingRequest();
|
|
737
|
-
m = Object.assign(m, proto);
|
|
738
|
-
if (proto.meetingSource) {
|
|
739
|
-
m.meetingSource = enumStringToValue(e.MeetingSource, proto.meetingSource);
|
|
740
|
-
}
|
|
741
|
-
if (proto.timeSlot) {
|
|
742
|
-
m.timeSlot = DateRange.fromProto(proto.timeSlot);
|
|
743
|
-
}
|
|
744
|
-
if (proto.attendees) {
|
|
745
|
-
m.attendees = proto.attendees.map(Contact.fromProto);
|
|
746
|
-
}
|
|
747
|
-
return m;
|
|
748
|
-
}
|
|
749
|
-
toApiJson() {
|
|
750
|
-
const toReturn = {};
|
|
751
|
-
if (typeof this.meetingSource !== 'undefined') {
|
|
752
|
-
toReturn['meetingSource'] = this.meetingSource;
|
|
753
|
-
}
|
|
754
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
755
|
-
toReturn['calendarId'] = this.calendarId;
|
|
756
|
-
}
|
|
757
|
-
if (typeof this.meetingTypeId !== 'undefined') {
|
|
758
|
-
toReturn['meetingTypeId'] = this.meetingTypeId;
|
|
759
|
-
}
|
|
760
|
-
if (typeof this.timeSlot !== 'undefined' && this.timeSlot !== null) {
|
|
761
|
-
toReturn['timeSlot'] = 'toApiJson' in this.timeSlot ? this.timeSlot.toApiJson() : this.timeSlot;
|
|
762
|
-
}
|
|
763
|
-
if (typeof this.attendees !== 'undefined' && this.attendees !== null) {
|
|
764
|
-
toReturn['attendees'] = 'toApiJson' in this.attendees ? this.attendees.toApiJson() : this.attendees;
|
|
765
|
-
}
|
|
766
|
-
if (typeof this.topic !== 'undefined') {
|
|
767
|
-
toReturn['topic'] = this.topic;
|
|
768
|
-
}
|
|
769
|
-
return toReturn;
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
export class HostBookMeetingResponse {
|
|
773
|
-
constructor(kwargs) {
|
|
774
|
-
if (!kwargs) {
|
|
775
|
-
return;
|
|
776
|
-
}
|
|
777
|
-
Object.assign(this, kwargs);
|
|
778
|
-
}
|
|
779
|
-
static fromProto(proto) {
|
|
780
|
-
let m = new HostBookMeetingResponse();
|
|
781
|
-
m = Object.assign(m, proto);
|
|
782
|
-
return m;
|
|
783
|
-
}
|
|
784
|
-
toApiJson() {
|
|
785
|
-
const toReturn = {};
|
|
786
|
-
if (typeof this.meetingId !== 'undefined') {
|
|
787
|
-
toReturn['meetingId'] = this.meetingId;
|
|
788
|
-
}
|
|
789
|
-
return toReturn;
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
export class HostGetCalendarRequest {
|
|
793
|
-
constructor(kwargs) {
|
|
794
|
-
if (!kwargs) {
|
|
795
|
-
return;
|
|
796
|
-
}
|
|
797
|
-
Object.assign(this, kwargs);
|
|
798
|
-
}
|
|
799
|
-
static fromProto(proto) {
|
|
800
|
-
let m = new HostGetCalendarRequest();
|
|
801
|
-
m = Object.assign(m, proto);
|
|
802
|
-
return m;
|
|
803
|
-
}
|
|
804
|
-
toApiJson() {
|
|
805
|
-
const toReturn = {};
|
|
806
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
807
|
-
toReturn['calendarId'] = this.calendarId;
|
|
808
|
-
}
|
|
809
|
-
return toReturn;
|
|
810
|
-
}
|
|
811
|
-
}
|
|
812
|
-
export class HostGetCalendarResponse {
|
|
813
|
-
constructor(kwargs) {
|
|
814
|
-
if (!kwargs) {
|
|
815
|
-
return;
|
|
816
|
-
}
|
|
817
|
-
Object.assign(this, kwargs);
|
|
818
|
-
}
|
|
819
|
-
static fromProto(proto) {
|
|
820
|
-
let m = new HostGetCalendarResponse();
|
|
821
|
-
m = Object.assign(m, proto);
|
|
822
|
-
if (proto.calendar) {
|
|
823
|
-
m.calendar = Calendar.fromProto(proto.calendar);
|
|
824
|
-
}
|
|
825
|
-
return m;
|
|
826
|
-
}
|
|
827
|
-
toApiJson() {
|
|
828
|
-
const toReturn = {};
|
|
829
|
-
if (typeof this.calendar !== 'undefined' && this.calendar !== null) {
|
|
830
|
-
toReturn['calendar'] = 'toApiJson' in this.calendar ? this.calendar.toApiJson() : this.calendar;
|
|
831
|
-
}
|
|
832
|
-
return toReturn;
|
|
833
|
-
}
|
|
834
|
-
}
|
|
835
|
-
export class HostGetMeetingTypeRequest {
|
|
836
|
-
constructor(kwargs) {
|
|
837
|
-
if (!kwargs) {
|
|
838
|
-
return;
|
|
839
|
-
}
|
|
840
|
-
Object.assign(this, kwargs);
|
|
841
|
-
}
|
|
842
|
-
static fromProto(proto) {
|
|
843
|
-
let m = new HostGetMeetingTypeRequest();
|
|
844
|
-
m = Object.assign(m, proto);
|
|
845
|
-
return m;
|
|
846
|
-
}
|
|
847
|
-
toApiJson() {
|
|
848
|
-
const toReturn = {};
|
|
849
|
-
if (typeof this.calendarSlug !== 'undefined') {
|
|
850
|
-
toReturn['calendarSlug'] = this.calendarSlug;
|
|
851
|
-
}
|
|
852
|
-
if (typeof this.meetingTypeSlug !== 'undefined') {
|
|
853
|
-
toReturn['meetingTypeSlug'] = this.meetingTypeSlug;
|
|
854
|
-
}
|
|
855
|
-
return toReturn;
|
|
856
|
-
}
|
|
857
|
-
}
|
|
858
|
-
export class HostGetMeetingTypeResponse {
|
|
859
|
-
constructor(kwargs) {
|
|
860
|
-
if (!kwargs) {
|
|
861
|
-
return;
|
|
862
|
-
}
|
|
863
|
-
Object.assign(this, kwargs);
|
|
864
|
-
}
|
|
865
|
-
static fromProto(proto) {
|
|
866
|
-
let m = new HostGetMeetingTypeResponse();
|
|
867
|
-
m = Object.assign(m, proto);
|
|
868
|
-
if (proto.meetingType) {
|
|
869
|
-
m.meetingType = MeetingType.fromProto(proto.meetingType);
|
|
870
|
-
}
|
|
871
|
-
return m;
|
|
872
|
-
}
|
|
873
|
-
toApiJson() {
|
|
874
|
-
const toReturn = {};
|
|
875
|
-
if (typeof this.meetingType !== 'undefined' && this.meetingType !== null) {
|
|
876
|
-
toReturn['meetingType'] = 'toApiJson' in this.meetingType ? this.meetingType.toApiJson() : this.meetingType;
|
|
877
|
-
}
|
|
878
|
-
return toReturn;
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
export class HostListMeetingTypesRequest {
|
|
882
|
-
constructor(kwargs) {
|
|
883
|
-
if (!kwargs) {
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
Object.assign(this, kwargs);
|
|
887
|
-
}
|
|
888
|
-
static fromProto(proto) {
|
|
889
|
-
let m = new HostListMeetingTypesRequest();
|
|
890
|
-
m = Object.assign(m, proto);
|
|
891
|
-
return m;
|
|
892
|
-
}
|
|
893
|
-
toApiJson() {
|
|
894
|
-
const toReturn = {};
|
|
895
|
-
if (typeof this.hostId !== 'undefined') {
|
|
896
|
-
toReturn['hostId'] = this.hostId;
|
|
897
|
-
}
|
|
898
|
-
return toReturn;
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
export class HostListMeetingTypesResponse {
|
|
902
|
-
constructor(kwargs) {
|
|
903
|
-
if (!kwargs) {
|
|
904
|
-
return;
|
|
905
|
-
}
|
|
906
|
-
Object.assign(this, kwargs);
|
|
907
|
-
}
|
|
908
|
-
static fromProto(proto) {
|
|
909
|
-
let m = new HostListMeetingTypesResponse();
|
|
910
|
-
m = Object.assign(m, proto);
|
|
911
|
-
if (proto.meetingTypes) {
|
|
912
|
-
m.meetingTypes = proto.meetingTypes.map(MeetingType.fromProto);
|
|
913
|
-
}
|
|
914
|
-
return m;
|
|
915
|
-
}
|
|
916
|
-
toApiJson() {
|
|
917
|
-
const toReturn = {};
|
|
918
|
-
if (typeof this.meetingTypes !== 'undefined' && this.meetingTypes !== null) {
|
|
919
|
-
toReturn['meetingTypes'] = 'toApiJson' in this.meetingTypes ? this.meetingTypes.toApiJson() : this.meetingTypes;
|
|
920
|
-
}
|
|
921
|
-
return toReturn;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
export class IsHostConfiguredRequest {
|
|
925
|
-
constructor(kwargs) {
|
|
926
|
-
if (!kwargs) {
|
|
927
|
-
return;
|
|
928
|
-
}
|
|
929
|
-
Object.assign(this, kwargs);
|
|
930
|
-
}
|
|
931
|
-
static fromProto(proto) {
|
|
932
|
-
let m = new IsHostConfiguredRequest();
|
|
933
|
-
m = Object.assign(m, proto);
|
|
934
|
-
return m;
|
|
935
|
-
}
|
|
936
|
-
toApiJson() {
|
|
937
|
-
const toReturn = {};
|
|
938
|
-
if (typeof this.hostId !== 'undefined') {
|
|
939
|
-
toReturn['hostId'] = this.hostId;
|
|
940
|
-
}
|
|
941
|
-
return toReturn;
|
|
942
|
-
}
|
|
943
|
-
}
|
|
944
|
-
export class IsHostConfiguredResponse {
|
|
945
|
-
constructor(kwargs) {
|
|
946
|
-
if (!kwargs) {
|
|
947
|
-
return;
|
|
948
|
-
}
|
|
949
|
-
Object.assign(this, kwargs);
|
|
950
|
-
}
|
|
951
|
-
static fromProto(proto) {
|
|
952
|
-
let m = new IsHostConfiguredResponse();
|
|
953
|
-
m = Object.assign(m, proto);
|
|
954
|
-
return m;
|
|
955
|
-
}
|
|
956
|
-
toApiJson() {
|
|
957
|
-
const toReturn = {};
|
|
958
|
-
if (typeof this.isConfigured !== 'undefined') {
|
|
959
|
-
toReturn['isConfigured'] = this.isConfigured;
|
|
960
|
-
}
|
|
961
|
-
return toReturn;
|
|
962
|
-
}
|
|
963
|
-
}
|
|
964
|
-
export class ListAvailabilityRequest {
|
|
965
|
-
constructor(kwargs) {
|
|
966
|
-
if (!kwargs) {
|
|
967
|
-
return;
|
|
968
|
-
}
|
|
969
|
-
Object.assign(this, kwargs);
|
|
970
|
-
}
|
|
971
|
-
static fromProto(proto) {
|
|
972
|
-
let m = new ListAvailabilityRequest();
|
|
973
|
-
m = Object.assign(m, proto);
|
|
974
|
-
if (proto.pagingOptions) {
|
|
975
|
-
m.pagingOptions = PagedRequestOptions.fromProto(proto.pagingOptions);
|
|
976
|
-
}
|
|
977
|
-
if (proto.filters) {
|
|
978
|
-
m.filters = ListAvailabilityRequestFilters.fromProto(proto.filters);
|
|
979
|
-
}
|
|
980
|
-
if (proto.timeZone) {
|
|
981
|
-
m.timeZone = TimeZone.fromProto(proto.timeZone);
|
|
982
|
-
}
|
|
983
|
-
return m;
|
|
984
|
-
}
|
|
985
|
-
toApiJson() {
|
|
986
|
-
const toReturn = {};
|
|
987
|
-
if (typeof this.pagingOptions !== 'undefined' && this.pagingOptions !== null) {
|
|
988
|
-
toReturn['pagingOptions'] = 'toApiJson' in this.pagingOptions ? this.pagingOptions.toApiJson() : this.pagingOptions;
|
|
989
|
-
}
|
|
990
|
-
if (typeof this.filters !== 'undefined' && this.filters !== null) {
|
|
991
|
-
toReturn['filters'] = 'toApiJson' in this.filters ? this.filters.toApiJson() : this.filters;
|
|
992
|
-
}
|
|
993
|
-
if (typeof this.timeZone !== 'undefined' && this.timeZone !== null) {
|
|
994
|
-
toReturn['timeZone'] = 'toApiJson' in this.timeZone ? this.timeZone.toApiJson() : this.timeZone;
|
|
995
|
-
}
|
|
996
|
-
return toReturn;
|
|
997
|
-
}
|
|
998
|
-
}
|
|
999
|
-
export class ListAvailabilityResponse {
|
|
1000
|
-
constructor(kwargs) {
|
|
1001
|
-
if (!kwargs) {
|
|
1002
|
-
return;
|
|
1003
|
-
}
|
|
1004
|
-
Object.assign(this, kwargs);
|
|
1005
|
-
}
|
|
1006
|
-
static fromProto(proto) {
|
|
1007
|
-
let m = new ListAvailabilityResponse();
|
|
1008
|
-
m = Object.assign(m, proto);
|
|
1009
|
-
if (proto.availabilityRules) {
|
|
1010
|
-
m.availabilityRules = proto.availabilityRules.map(AvailabilityRule.fromProto);
|
|
1011
|
-
}
|
|
1012
|
-
if (proto.metadata) {
|
|
1013
|
-
m.metadata = PagedResponseMetadata.fromProto(proto.metadata);
|
|
1014
|
-
}
|
|
1015
|
-
return m;
|
|
1016
|
-
}
|
|
1017
|
-
toApiJson() {
|
|
1018
|
-
const toReturn = {};
|
|
1019
|
-
if (typeof this.availabilityRules !== 'undefined' && this.availabilityRules !== null) {
|
|
1020
|
-
toReturn['availabilityRules'] = 'toApiJson' in this.availabilityRules ? this.availabilityRules.toApiJson() : this.availabilityRules;
|
|
1021
|
-
}
|
|
1022
|
-
if (typeof this.metadata !== 'undefined' && this.metadata !== null) {
|
|
1023
|
-
toReturn['metadata'] = 'toApiJson' in this.metadata ? this.metadata.toApiJson() : this.metadata;
|
|
1024
|
-
}
|
|
1025
|
-
return toReturn;
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
export class ListBookedMeetingsRequest {
|
|
1029
|
-
constructor(kwargs) {
|
|
1030
|
-
if (!kwargs) {
|
|
1031
|
-
return;
|
|
1032
|
-
}
|
|
1033
|
-
Object.assign(this, kwargs);
|
|
1034
|
-
}
|
|
1035
|
-
static fromProto(proto) {
|
|
1036
|
-
let m = new ListBookedMeetingsRequest();
|
|
1037
|
-
m = Object.assign(m, proto);
|
|
1038
|
-
if (proto.filters) {
|
|
1039
|
-
m.filters = ListBookedMeetingsRequestFilters.fromProto(proto.filters);
|
|
1040
|
-
}
|
|
1041
|
-
if (proto.pagingOptions) {
|
|
1042
|
-
m.pagingOptions = PagedRequestOptions.fromProto(proto.pagingOptions);
|
|
1043
|
-
}
|
|
1044
|
-
if (proto.timeZone) {
|
|
1045
|
-
m.timeZone = TimeZone.fromProto(proto.timeZone);
|
|
1046
|
-
}
|
|
1047
|
-
return m;
|
|
1048
|
-
}
|
|
1049
|
-
toApiJson() {
|
|
1050
|
-
const toReturn = {};
|
|
1051
|
-
if (typeof this.filters !== 'undefined' && this.filters !== null) {
|
|
1052
|
-
toReturn['filters'] = 'toApiJson' in this.filters ? this.filters.toApiJson() : this.filters;
|
|
1053
|
-
}
|
|
1054
|
-
if (typeof this.pagingOptions !== 'undefined' && this.pagingOptions !== null) {
|
|
1055
|
-
toReturn['pagingOptions'] = 'toApiJson' in this.pagingOptions ? this.pagingOptions.toApiJson() : this.pagingOptions;
|
|
1056
|
-
}
|
|
1057
|
-
if (typeof this.timeZone !== 'undefined' && this.timeZone !== null) {
|
|
1058
|
-
toReturn['timeZone'] = 'toApiJson' in this.timeZone ? this.timeZone.toApiJson() : this.timeZone;
|
|
1059
|
-
}
|
|
1060
|
-
return toReturn;
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
export class ListBookedMeetingsResponse {
|
|
1064
|
-
constructor(kwargs) {
|
|
1065
|
-
if (!kwargs) {
|
|
1066
|
-
return;
|
|
1067
|
-
}
|
|
1068
|
-
Object.assign(this, kwargs);
|
|
1069
|
-
}
|
|
1070
|
-
static fromProto(proto) {
|
|
1071
|
-
let m = new ListBookedMeetingsResponse();
|
|
1072
|
-
m = Object.assign(m, proto);
|
|
1073
|
-
if (proto.meetings) {
|
|
1074
|
-
m.meetings = proto.meetings.map(Meeting.fromProto);
|
|
1075
|
-
}
|
|
1076
|
-
if (proto.pagingMetadata) {
|
|
1077
|
-
m.pagingMetadata = PagedResponseMetadata.fromProto(proto.pagingMetadata);
|
|
1078
|
-
}
|
|
1079
|
-
return m;
|
|
1080
|
-
}
|
|
1081
|
-
toApiJson() {
|
|
1082
|
-
const toReturn = {};
|
|
1083
|
-
if (typeof this.meetings !== 'undefined' && this.meetings !== null) {
|
|
1084
|
-
toReturn['meetings'] = 'toApiJson' in this.meetings ? this.meetings.toApiJson() : this.meetings;
|
|
1085
|
-
}
|
|
1086
|
-
if (typeof this.pagingMetadata !== 'undefined' && this.pagingMetadata !== null) {
|
|
1087
|
-
toReturn['pagingMetadata'] = 'toApiJson' in this.pagingMetadata ? this.pagingMetadata.toApiJson() : this.pagingMetadata;
|
|
1088
|
-
}
|
|
1089
|
-
return toReturn;
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
export class Meeting {
|
|
1093
|
-
constructor(kwargs) {
|
|
1094
|
-
if (!kwargs) {
|
|
1095
|
-
return;
|
|
1096
|
-
}
|
|
1097
|
-
Object.assign(this, kwargs);
|
|
1098
|
-
}
|
|
1099
|
-
static fromProto(proto) {
|
|
1100
|
-
let m = new Meeting();
|
|
1101
|
-
m = Object.assign(m, proto);
|
|
1102
|
-
if (proto.start) {
|
|
1103
|
-
m.start = new Date(proto.start);
|
|
1104
|
-
}
|
|
1105
|
-
if (proto.end) {
|
|
1106
|
-
m.end = new Date(proto.end);
|
|
1107
|
-
}
|
|
1108
|
-
if (proto.created) {
|
|
1109
|
-
m.created = new Date(proto.created);
|
|
1110
|
-
}
|
|
1111
|
-
if (proto.updated) {
|
|
1112
|
-
m.updated = new Date(proto.updated);
|
|
1113
|
-
}
|
|
1114
|
-
if (proto.attendees) {
|
|
1115
|
-
m.attendees = proto.attendees.map(Attendee.fromProto);
|
|
1116
|
-
}
|
|
1117
|
-
if (proto.formAnswers) {
|
|
1118
|
-
m.formAnswers = Answers.fromProto(proto.formAnswers);
|
|
1119
|
-
}
|
|
1120
|
-
if (proto.metadata) {
|
|
1121
|
-
m.metadata = Object.keys(proto.metadata).reduce((obj, k) => { obj[k] = proto.metadata[k]; return obj; }, {});
|
|
1122
|
-
}
|
|
1123
|
-
if (proto.attachments) {
|
|
1124
|
-
m.attachments = proto.attachments.map(Attachment.fromProto);
|
|
1125
|
-
}
|
|
1126
|
-
return m;
|
|
1127
|
-
}
|
|
1128
|
-
toApiJson() {
|
|
1129
|
-
const toReturn = {};
|
|
1130
|
-
if (typeof this.id !== 'undefined') {
|
|
1131
|
-
toReturn['id'] = this.id;
|
|
1132
|
-
}
|
|
1133
|
-
if (typeof this.eventTypeId !== 'undefined') {
|
|
1134
|
-
toReturn['eventTypeId'] = this.eventTypeId;
|
|
1135
|
-
}
|
|
1136
|
-
if (typeof this.hostId !== 'undefined') {
|
|
1137
|
-
toReturn['hostId'] = this.hostId;
|
|
1138
|
-
}
|
|
1139
|
-
if (typeof this.start !== 'undefined' && this.start !== null) {
|
|
1140
|
-
toReturn['start'] = 'toApiJson' in this.start ? this.start.toApiJson() : this.start;
|
|
1141
|
-
}
|
|
1142
|
-
if (typeof this.end !== 'undefined' && this.end !== null) {
|
|
1143
|
-
toReturn['end'] = 'toApiJson' in this.end ? this.end.toApiJson() : this.end;
|
|
1144
|
-
}
|
|
1145
|
-
if (typeof this.created !== 'undefined' && this.created !== null) {
|
|
1146
|
-
toReturn['created'] = 'toApiJson' in this.created ? this.created.toApiJson() : this.created;
|
|
1147
|
-
}
|
|
1148
|
-
if (typeof this.updated !== 'undefined' && this.updated !== null) {
|
|
1149
|
-
toReturn['updated'] = 'toApiJson' in this.updated ? this.updated.toApiJson() : this.updated;
|
|
1150
|
-
}
|
|
1151
|
-
if (typeof this.attendees !== 'undefined' && this.attendees !== null) {
|
|
1152
|
-
toReturn['attendees'] = 'toApiJson' in this.attendees ? this.attendees.toApiJson() : this.attendees;
|
|
1153
|
-
}
|
|
1154
|
-
if (typeof this.description !== 'undefined') {
|
|
1155
|
-
toReturn['description'] = this.description;
|
|
1156
|
-
}
|
|
1157
|
-
if (typeof this.joinMeetingUrl !== 'undefined') {
|
|
1158
|
-
toReturn['joinMeetingUrl'] = this.joinMeetingUrl;
|
|
1159
|
-
}
|
|
1160
|
-
if (typeof this.topic !== 'undefined') {
|
|
1161
|
-
toReturn['topic'] = this.topic;
|
|
1162
|
-
}
|
|
1163
|
-
if (typeof this.formAnswers !== 'undefined' && this.formAnswers !== null) {
|
|
1164
|
-
toReturn['formAnswers'] = 'toApiJson' in this.formAnswers ? this.formAnswers.toApiJson() : this.formAnswers;
|
|
1165
|
-
}
|
|
1166
|
-
if (typeof this.metadata !== 'undefined' && this.metadata !== null) {
|
|
1167
|
-
toReturn['metadata'] = 'toApiJson' in this.metadata ? this.metadata.toApiJson() : this.metadata;
|
|
1168
|
-
}
|
|
1169
|
-
if (typeof this.attachments !== 'undefined' && this.attachments !== null) {
|
|
1170
|
-
toReturn['attachments'] = 'toApiJson' in this.attachments ? this.attachments.toApiJson() : this.attachments;
|
|
1171
|
-
}
|
|
1172
|
-
return toReturn;
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
export class MeetingTypeList {
|
|
1176
|
-
constructor(kwargs) {
|
|
1177
|
-
if (!kwargs) {
|
|
1178
|
-
return;
|
|
1179
|
-
}
|
|
1180
|
-
Object.assign(this, kwargs);
|
|
1181
|
-
}
|
|
1182
|
-
static fromProto(proto) {
|
|
1183
|
-
let m = new MeetingTypeList();
|
|
1184
|
-
m = Object.assign(m, proto);
|
|
1185
|
-
if (proto.meetingTypes) {
|
|
1186
|
-
m.meetingTypes = proto.meetingTypes.map(MeetingType.fromProto);
|
|
1187
|
-
}
|
|
1188
|
-
return m;
|
|
1189
|
-
}
|
|
1190
|
-
toApiJson() {
|
|
1191
|
-
const toReturn = {};
|
|
1192
|
-
if (typeof this.meetingTypes !== 'undefined' && this.meetingTypes !== null) {
|
|
1193
|
-
toReturn['meetingTypes'] = 'toApiJson' in this.meetingTypes ? this.meetingTypes.toApiJson() : this.meetingTypes;
|
|
1194
|
-
}
|
|
1195
|
-
return toReturn;
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
export class MeetingMetadataEntry {
|
|
1199
|
-
constructor(kwargs) {
|
|
1200
|
-
if (!kwargs) {
|
|
1201
|
-
return;
|
|
1202
|
-
}
|
|
1203
|
-
Object.assign(this, kwargs);
|
|
1204
|
-
}
|
|
1205
|
-
static fromProto(proto) {
|
|
1206
|
-
let m = new MeetingMetadataEntry();
|
|
1207
|
-
m = Object.assign(m, proto);
|
|
1208
|
-
return m;
|
|
1209
|
-
}
|
|
1210
|
-
toApiJson() {
|
|
1211
|
-
const toReturn = {};
|
|
1212
|
-
if (typeof this.key !== 'undefined') {
|
|
1213
|
-
toReturn['key'] = this.key;
|
|
1214
|
-
}
|
|
1215
|
-
if (typeof this.value !== 'undefined') {
|
|
1216
|
-
toReturn['value'] = this.value;
|
|
1217
|
-
}
|
|
1218
|
-
return toReturn;
|
|
1219
|
-
}
|
|
1220
|
-
}
|
|
1221
|
-
export class UpdateMeetingMetadataRequestMetadataEntry {
|
|
1222
|
-
constructor(kwargs) {
|
|
1223
|
-
if (!kwargs) {
|
|
1224
|
-
return;
|
|
1225
|
-
}
|
|
1226
|
-
Object.assign(this, kwargs);
|
|
1227
|
-
}
|
|
1228
|
-
static fromProto(proto) {
|
|
1229
|
-
let m = new UpdateMeetingMetadataRequestMetadataEntry();
|
|
1230
|
-
m = Object.assign(m, proto);
|
|
1231
|
-
return m;
|
|
1232
|
-
}
|
|
1233
|
-
toApiJson() {
|
|
1234
|
-
const toReturn = {};
|
|
1235
|
-
if (typeof this.key !== 'undefined') {
|
|
1236
|
-
toReturn['key'] = this.key;
|
|
1237
|
-
}
|
|
1238
|
-
if (typeof this.value !== 'undefined') {
|
|
1239
|
-
toReturn['value'] = this.value;
|
|
1240
|
-
}
|
|
1241
|
-
return toReturn;
|
|
1242
|
-
}
|
|
1243
|
-
}
|
|
1244
|
-
export class RescheduleMeetingRequest {
|
|
1245
|
-
constructor(kwargs) {
|
|
1246
|
-
if (!kwargs) {
|
|
1247
|
-
return;
|
|
1248
|
-
}
|
|
1249
|
-
Object.assign(this, kwargs);
|
|
1250
|
-
}
|
|
1251
|
-
static fromProto(proto) {
|
|
1252
|
-
let m = new RescheduleMeetingRequest();
|
|
1253
|
-
m = Object.assign(m, proto);
|
|
1254
|
-
if (proto.start) {
|
|
1255
|
-
m.start = new Date(proto.start);
|
|
1256
|
-
}
|
|
1257
|
-
return m;
|
|
1258
|
-
}
|
|
1259
|
-
toApiJson() {
|
|
1260
|
-
const toReturn = {};
|
|
1261
|
-
if (typeof this.meetingId !== 'undefined') {
|
|
1262
|
-
toReturn['meetingId'] = this.meetingId;
|
|
1263
|
-
}
|
|
1264
|
-
if (typeof this.start !== 'undefined' && this.start !== null) {
|
|
1265
|
-
toReturn['start'] = 'toApiJson' in this.start ? this.start.toApiJson() : this.start;
|
|
1266
|
-
}
|
|
1267
|
-
return toReturn;
|
|
1268
|
-
}
|
|
1269
|
-
}
|
|
1270
|
-
export class SetGeneralAvailabilityRequest {
|
|
1271
|
-
constructor(kwargs) {
|
|
1272
|
-
if (!kwargs) {
|
|
1273
|
-
return;
|
|
1274
|
-
}
|
|
1275
|
-
Object.assign(this, kwargs);
|
|
1276
|
-
}
|
|
1277
|
-
static fromProto(proto) {
|
|
1278
|
-
let m = new SetGeneralAvailabilityRequest();
|
|
1279
|
-
m = Object.assign(m, proto);
|
|
1280
|
-
if (proto.days) {
|
|
1281
|
-
m.days = proto.days.map((v) => enumStringToValue(e.DayOfWeek, v));
|
|
1282
|
-
}
|
|
1283
|
-
if (proto.timeSlot) {
|
|
1284
|
-
m.timeSlot = TimeRange.fromProto(proto.timeSlot);
|
|
1285
|
-
}
|
|
1286
|
-
if (proto.timeZone) {
|
|
1287
|
-
m.timeZone = TimeZone.fromProto(proto.timeZone);
|
|
1288
|
-
}
|
|
1289
|
-
if (proto.weekdaysAvailability) {
|
|
1290
|
-
m.weekdaysAvailability = proto.weekdaysAvailability.map(WeekdayAvailability.fromProto);
|
|
1291
|
-
}
|
|
1292
|
-
return m;
|
|
1293
|
-
}
|
|
1294
|
-
toApiJson() {
|
|
1295
|
-
const toReturn = {};
|
|
1296
|
-
if (typeof this.hostId !== 'undefined') {
|
|
1297
|
-
toReturn['hostId'] = this.hostId;
|
|
1298
|
-
}
|
|
1299
|
-
if (typeof this.meetingTypeId !== 'undefined') {
|
|
1300
|
-
toReturn['meetingTypeId'] = this.meetingTypeId;
|
|
1301
|
-
}
|
|
1302
|
-
if (typeof this.days !== 'undefined') {
|
|
1303
|
-
toReturn['days'] = this.days;
|
|
1304
|
-
}
|
|
1305
|
-
if (typeof this.timeSlot !== 'undefined' && this.timeSlot !== null) {
|
|
1306
|
-
toReturn['timeSlot'] = 'toApiJson' in this.timeSlot ? this.timeSlot.toApiJson() : this.timeSlot;
|
|
1307
|
-
}
|
|
1308
|
-
if (typeof this.timeZone !== 'undefined' && this.timeZone !== null) {
|
|
1309
|
-
toReturn['timeZone'] = 'toApiJson' in this.timeZone ? this.timeZone.toApiJson() : this.timeZone;
|
|
1310
|
-
}
|
|
1311
|
-
if (typeof this.weekdaysAvailability !== 'undefined' && this.weekdaysAvailability !== null) {
|
|
1312
|
-
toReturn['weekdaysAvailability'] = 'toApiJson' in this.weekdaysAvailability ? this.weekdaysAvailability.toApiJson() : this.weekdaysAvailability;
|
|
1313
|
-
}
|
|
1314
|
-
return toReturn;
|
|
1315
|
-
}
|
|
1316
|
-
}
|
|
1317
|
-
export class UpdateAvailabilityRequest {
|
|
1318
|
-
static fromProto(proto) {
|
|
1319
|
-
let m = new UpdateAvailabilityRequest();
|
|
1320
|
-
m = Object.assign(m, proto);
|
|
1321
|
-
return m;
|
|
1322
|
-
}
|
|
1323
|
-
constructor(kwargs) {
|
|
1324
|
-
if (!kwargs) {
|
|
1325
|
-
return;
|
|
1326
|
-
}
|
|
1327
|
-
Object.assign(this, kwargs);
|
|
1328
|
-
}
|
|
1329
|
-
toApiJson() {
|
|
1330
|
-
const toReturn = {};
|
|
1331
|
-
return toReturn;
|
|
1332
|
-
}
|
|
1333
|
-
}
|
|
1334
|
-
export class UpdateCalendarRequest {
|
|
1335
|
-
constructor(kwargs) {
|
|
1336
|
-
if (!kwargs) {
|
|
1337
|
-
return;
|
|
1338
|
-
}
|
|
1339
|
-
Object.assign(this, kwargs);
|
|
1340
|
-
}
|
|
1341
|
-
static fromProto(proto) {
|
|
1342
|
-
let m = new UpdateCalendarRequest();
|
|
1343
|
-
m = Object.assign(m, proto);
|
|
1344
|
-
if (proto.calendarUpdate) {
|
|
1345
|
-
m.calendarUpdate = Calendar.fromProto(proto.calendarUpdate);
|
|
1346
|
-
}
|
|
1347
|
-
if (proto.fieldMask) {
|
|
1348
|
-
m.fieldMask = FieldMask.fromProto(proto.fieldMask);
|
|
1349
|
-
}
|
|
1350
|
-
return m;
|
|
1351
|
-
}
|
|
1352
|
-
toApiJson() {
|
|
1353
|
-
const toReturn = {};
|
|
1354
|
-
if (typeof this.calendarId !== 'undefined') {
|
|
1355
|
-
toReturn['calendarId'] = this.calendarId;
|
|
1356
|
-
}
|
|
1357
|
-
if (typeof this.calendarUpdate !== 'undefined' && this.calendarUpdate !== null) {
|
|
1358
|
-
toReturn['calendarUpdate'] = 'toApiJson' in this.calendarUpdate ? this.calendarUpdate.toApiJson() : this.calendarUpdate;
|
|
1359
|
-
}
|
|
1360
|
-
if (typeof this.fieldMask !== 'undefined' && this.fieldMask !== null) {
|
|
1361
|
-
toReturn['fieldMask'] = 'toApiJson' in this.fieldMask ? this.fieldMask.toApiJson() : this.fieldMask;
|
|
1362
|
-
}
|
|
1363
|
-
return toReturn;
|
|
1364
|
-
}
|
|
1365
|
-
}
|
|
1366
|
-
export class UpdateHostPreferencesRequest {
|
|
1367
|
-
constructor(kwargs) {
|
|
1368
|
-
if (!kwargs) {
|
|
1369
|
-
return;
|
|
1370
|
-
}
|
|
1371
|
-
Object.assign(this, kwargs);
|
|
1372
|
-
}
|
|
1373
|
-
static fromProto(proto) {
|
|
1374
|
-
let m = new UpdateHostPreferencesRequest();
|
|
1375
|
-
m = Object.assign(m, proto);
|
|
1376
|
-
if (proto.preferences) {
|
|
1377
|
-
m.preferences = Preferences.fromProto(proto.preferences);
|
|
1378
|
-
}
|
|
1379
|
-
if (proto.fieldMask) {
|
|
1380
|
-
m.fieldMask = FieldMask.fromProto(proto.fieldMask);
|
|
1381
|
-
}
|
|
1382
|
-
return m;
|
|
1383
|
-
}
|
|
1384
|
-
toApiJson() {
|
|
1385
|
-
const toReturn = {};
|
|
1386
|
-
if (typeof this.hostId !== 'undefined') {
|
|
1387
|
-
toReturn['hostId'] = this.hostId;
|
|
1388
|
-
}
|
|
1389
|
-
if (typeof this.preferences !== 'undefined' && this.preferences !== null) {
|
|
1390
|
-
toReturn['preferences'] = 'toApiJson' in this.preferences ? this.preferences.toApiJson() : this.preferences;
|
|
1391
|
-
}
|
|
1392
|
-
if (typeof this.fieldMask !== 'undefined' && this.fieldMask !== null) {
|
|
1393
|
-
toReturn['fieldMask'] = 'toApiJson' in this.fieldMask ? this.fieldMask.toApiJson() : this.fieldMask;
|
|
1394
|
-
}
|
|
1395
|
-
return toReturn;
|
|
1396
|
-
}
|
|
1397
|
-
}
|
|
1398
|
-
export class UpdateMeetingMetadataRequest {
|
|
1399
|
-
constructor(kwargs) {
|
|
1400
|
-
if (!kwargs) {
|
|
1401
|
-
return;
|
|
1402
|
-
}
|
|
1403
|
-
Object.assign(this, kwargs);
|
|
1404
|
-
}
|
|
1405
|
-
static fromProto(proto) {
|
|
1406
|
-
let m = new UpdateMeetingMetadataRequest();
|
|
1407
|
-
m = Object.assign(m, proto);
|
|
1408
|
-
if (proto.metadata) {
|
|
1409
|
-
m.metadata = Object.keys(proto.metadata).reduce((obj, k) => { obj[k] = proto.metadata[k]; return obj; }, {});
|
|
1410
|
-
}
|
|
1411
|
-
return m;
|
|
1412
|
-
}
|
|
1413
|
-
toApiJson() {
|
|
1414
|
-
const toReturn = {};
|
|
1415
|
-
if (typeof this.meetingId !== 'undefined') {
|
|
1416
|
-
toReturn['meetingId'] = this.meetingId;
|
|
1417
|
-
}
|
|
1418
|
-
if (typeof this.metadata !== 'undefined' && this.metadata !== null) {
|
|
1419
|
-
toReturn['metadata'] = 'toApiJson' in this.metadata ? this.metadata.toApiJson() : this.metadata;
|
|
1420
|
-
}
|
|
1421
|
-
return toReturn;
|
|
1422
|
-
}
|
|
1423
|
-
}
|
|
1424
|
-
export class UpdateMeetingTypeRequest {
|
|
1425
|
-
constructor(kwargs) {
|
|
1426
|
-
if (!kwargs) {
|
|
1427
|
-
return;
|
|
1428
|
-
}
|
|
1429
|
-
Object.assign(this, kwargs);
|
|
1430
|
-
}
|
|
1431
|
-
static fromProto(proto) {
|
|
1432
|
-
let m = new UpdateMeetingTypeRequest();
|
|
1433
|
-
m = Object.assign(m, proto);
|
|
1434
|
-
if (proto.meetingType) {
|
|
1435
|
-
m.meetingType = MeetingType.fromProto(proto.meetingType);
|
|
1436
|
-
}
|
|
1437
|
-
if (proto.fieldMask) {
|
|
1438
|
-
m.fieldMask = FieldMask.fromProto(proto.fieldMask);
|
|
1439
|
-
}
|
|
1440
|
-
return m;
|
|
1441
|
-
}
|
|
1442
|
-
toApiJson() {
|
|
1443
|
-
const toReturn = {};
|
|
1444
|
-
if (typeof this.id !== 'undefined') {
|
|
1445
|
-
toReturn['id'] = this.id;
|
|
1446
|
-
}
|
|
1447
|
-
if (typeof this.meetingType !== 'undefined' && this.meetingType !== null) {
|
|
1448
|
-
toReturn['meetingType'] = 'toApiJson' in this.meetingType ? this.meetingType.toApiJson() : this.meetingType;
|
|
1449
|
-
}
|
|
1450
|
-
if (typeof this.fieldMask !== 'undefined' && this.fieldMask !== null) {
|
|
1451
|
-
toReturn['fieldMask'] = 'toApiJson' in this.fieldMask ? this.fieldMask.toApiJson() : this.fieldMask;
|
|
1452
|
-
}
|
|
1453
|
-
return toReturn;
|
|
1454
|
-
}
|
|
1455
|
-
}
|
|
1456
|
-
export class WeekdayAvailability {
|
|
1457
|
-
constructor(kwargs) {
|
|
1458
|
-
if (!kwargs) {
|
|
1459
|
-
return;
|
|
1460
|
-
}
|
|
1461
|
-
Object.assign(this, kwargs);
|
|
1462
|
-
}
|
|
1463
|
-
static fromProto(proto) {
|
|
1464
|
-
let m = new WeekdayAvailability();
|
|
1465
|
-
m = Object.assign(m, proto);
|
|
1466
|
-
if (proto.day) {
|
|
1467
|
-
m.day = enumStringToValue(e.DayOfWeek, proto.day);
|
|
1468
|
-
}
|
|
1469
|
-
if (proto.timeSlots) {
|
|
1470
|
-
m.timeSlots = proto.timeSlots.map(TimeRange.fromProto);
|
|
1471
|
-
}
|
|
1472
|
-
return m;
|
|
1473
|
-
}
|
|
1474
|
-
toApiJson() {
|
|
1475
|
-
const toReturn = {};
|
|
1476
|
-
if (typeof this.day !== 'undefined') {
|
|
1477
|
-
toReturn['day'] = this.day;
|
|
1478
|
-
}
|
|
1479
|
-
if (typeof this.timeSlots !== 'undefined' && this.timeSlots !== null) {
|
|
1480
|
-
toReturn['timeSlots'] = 'toApiJson' in this.timeSlots ? this.timeSlots.toApiJson() : this.timeSlots;
|
|
1481
|
-
}
|
|
1482
|
-
return toReturn;
|
|
1483
|
-
}
|
|
1484
|
-
}
|
|
1485
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVldGluZy1ob3N0LmpzIiwic291cmNlUm9vdCI6Ii9jb2RlZnJlc2gvdm9sdW1lL21lZXRpbmdzL3Nka3MvdHlwZXNjcmlwdC9zcmMvbWVldGluZ3Nfc2RrL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9faW50ZXJuYWwvb2JqZWN0cy9tZWV0aW5nLWhvc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxSixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBSSxPQUFZLEVBQUUsS0FBYTtJQUM5RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sT0FBTyxtREFBbUQ7SUFVNUQsWUFBWSxNQUF1RTtRQUMvRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVhELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLG1EQUFtRCxFQUFFLENBQUM7UUFDbEUs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QUFXLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxTQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQUM7UUFDckwsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBDb2RlIGdlbmVyYXRlZCBieSBzZGtnZW5cbi8vIERPIE5PVCBFRElUIS5cbi8vXG4vLyBPYmplY3RzLlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5pbXBvcnQgKiBhcyBpIGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlIH0gZnJvbSAnLi9kYXRlLXJhbmdlJztcbmltcG9ydCB7IEZpZWxkTWFzayB9IGZyb20gJy4vZmllbGQtbWFzayc7XG5pbXBvcnQgeyBNZWV0aW5nVHlwZSB9IGZyb20gJy4vbWVldGluZy10eXBlJztcbmltcG9ydCB7IFRpbWVSYW5nZSwgQ2FsZW5kYXIsIFByZWZlcmVuY2VzLCBIb3N0VXNlciwgQ29udGFjdCwgUGFnZWRSZXF1ZXN0T3B0aW9ucywgUGFnZWRSZXNwb25zZU1ldGFkYXRhLCBBdHRlbmRlZSwgQW5zd2VycywgQXR0YWNobWVudCB9IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IFRpbWVab25lIH0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZEhvc3RJZFJlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnkgaW1wbGVtZW50cyBpLkJ1aWxkSG9zdElkUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEJ1aWxkSG9zdElkUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IEJ1aWxkSG9zdElkUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQnVpbGRIb3N0SWRSZXF1ZXN0QXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc0VudHJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZSddID0gdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeSBpbXBsZW1lbnRzIGkuRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IEVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXF1ZXN0QXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc0VudHJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5FbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWUnXSA9IHRoaXMudmFsdWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXZhaWxhYmlsaXR5UnVsZSBpbXBsZW1lbnRzIGkuQXZhaWxhYmlsaXR5UnVsZUludGVyZmFjZSB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGVJZDogc3RyaW5nO1xuICAgIGRheTogZS5EYXlPZldlZWs7XG4gICAgdGltZVNsb3Q6IFRpbWVSYW5nZTtcbiAgICB0aW1lWm9uZTogVGltZVpvbmU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBBdmFpbGFiaWxpdHlSdWxlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQXZhaWxhYmlsaXR5UnVsZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5kYXkpIHttLmRheSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuRGF5T2ZXZWVrPihlLkRheU9mV2VlaywgcHJvdG8uZGF5KTt9XG4gICAgICAgIGlmIChwcm90by50aW1lU2xvdCkge20udGltZVNsb3QgPSBUaW1lUmFuZ2UuZnJvbVByb3RvKHByb3RvLnRpbWVTbG90KTt9XG4gICAgICAgIGlmIChwcm90by50aW1lWm9uZSkge20udGltZVpvbmUgPSBUaW1lWm9uZS5mcm9tUHJvdG8ocHJvdG8udGltZVpvbmUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5BdmFpbGFiaWxpdHlSdWxlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlSWQnXSA9IHRoaXMubWVldGluZ1R5cGVJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2RheSddID0gdGhpcy5kYXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVNsb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVNsb3QgIT09IG51bGwpIHt0b1JldHVyblsndGltZVNsb3QnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVNsb3QgPyAodGhpcy50aW1lU2xvdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lU2xvdDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lWm9uZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lWm9uZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lWm9uZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lWm9uZSA/ICh0aGlzLnRpbWVab25lIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVab25lO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkSG9zdElkUmVxdWVzdCBpbXBsZW1lbnRzIGkuQnVpbGRIb3N0SWRSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICB1c2VySWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEJ1aWxkSG9zdElkUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEJ1aWxkSG9zdElkUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzKSB7bS5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcykucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwcm90by5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzW2tdOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkJ1aWxkSG9zdElkUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgPyAodGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudXNlcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd1c2VySWQnXSA9IHRoaXMudXNlcklkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkSG9zdElkUmVzcG9uc2UgaW1wbGVtZW50cyBpLkJ1aWxkSG9zdElkUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQnVpbGRIb3N0SWRSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEJ1aWxkSG9zdElkUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkJ1aWxkSG9zdElkUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2VDYWxlbmRhck1lZXRpbmdUeXBlc01hcEVudHJ5IGltcGxlbWVudHMgaS5HZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUNhbGVuZGFyTWVldGluZ1R5cGVzTWFwRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBNZWV0aW5nVHlwZUxpc3Q7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUNhbGVuZGFyTWVldGluZ1R5cGVzTWFwRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUNhbGVuZGFyTWVldGluZ1R5cGVzTWFwRW50cnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8udmFsdWUpIHttLnZhbHVlID0gTWVldGluZ1R5cGVMaXN0LmZyb21Qcm90byhwcm90by52YWx1ZSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlQ2FsZW5kYXJNZWV0aW5nVHlwZXNNYXBFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy52YWx1ZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd2YWx1ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy52YWx1ZSA/ICh0aGlzLnZhbHVlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbmNlbE1lZXRpbmdSZXF1ZXN0IGltcGxlbWVudHMgaS5DYW5jZWxNZWV0aW5nUmVxdWVzdEludGVyZmFjZSB7XG4gICAgbWVldGluZ0lkOiBzdHJpbmc7XG4gICAgY2FuY2VsbGF0aW9uUmVhc29uOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDYW5jZWxNZWV0aW5nUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IENhbmNlbE1lZXRpbmdSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DYW5jZWxNZWV0aW5nUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ0lkJ10gPSB0aGlzLm1lZXRpbmdJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYW5jZWxsYXRpb25SZWFzb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbmNlbGxhdGlvblJlYXNvbiddID0gdGhpcy5jYW5jZWxsYXRpb25SZWFzb247fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlQXZhaWxhYmlsaXR5UmVxdWVzdCBpbXBsZW1lbnRzIGkuQ3JlYXRlQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSB7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVBdmFpbGFiaWxpdHlSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ3JlYXRlQXZhaWxhYmlsaXR5UmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUF2YWlsYWJpbGl0eVJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVBdmFpbGFiaWxpdHlSZXNwb25zZUludGVyZmFjZSB7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVBdmFpbGFiaWxpdHlSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZUF2YWlsYWJpbGl0eVJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DcmVhdGVBdmFpbGFiaWxpdHlSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUNhbGVuZGFyUmVxdWVzdCBpbXBsZW1lbnRzIGkuQ3JlYXRlQ2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcjogQ2FsZW5kYXI7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVDYWxlbmRhclJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVDYWxlbmRhclJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY2FsZW5kYXIpIHttLmNhbGVuZGFyID0gQ2FsZW5kYXIuZnJvbVByb3RvKHByb3RvLmNhbGVuZGFyKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlQ2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXIgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY2FsZW5kYXIgIT09IG51bGwpIHt0b1JldHVyblsnY2FsZW5kYXInXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY2FsZW5kYXIgPyAodGhpcy5jYWxlbmRhciBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jYWxlbmRhcjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVDYWxlbmRhclJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVDYWxlbmRhclJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVDYWxlbmRhclJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzUmVxdWVzdCBpbXBsZW1lbnRzIGkuQ3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWQ6IHN0cmluZztcbiAgICBjYWxlbmRhcklkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZURlZmF1bHRNZWV0aW5nVHlwZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZHMnXSA9IHRoaXMuY2FsZW5kYXJJZHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTWVldGluZ1R5cGVSZXF1ZXN0IGltcGxlbWVudHMgaS5DcmVhdGVNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdUeXBlOiBNZWV0aW5nVHlwZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IENyZWF0ZU1lZXRpbmdUeXBlUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZU1lZXRpbmdUeXBlUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5nVHlwZSkge20ubWVldGluZ1R5cGUgPSBNZWV0aW5nVHlwZS5mcm9tUHJvdG8ocHJvdG8ubWVldGluZ1R5cGUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DcmVhdGVNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZWV0aW5nVHlwZSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5nVHlwZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nVHlwZSA/ICh0aGlzLm1lZXRpbmdUeXBlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdUeXBlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZU1lZXRpbmdUeXBlUmVzcG9uc2UgaW1wbGVtZW50cyBpLkNyZWF0ZU1lZXRpbmdUeXBlUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVNZWV0aW5nVHlwZVJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ3JlYXRlTWVldGluZ1R5cGVSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlTWVldGluZ1R5cGVSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWxldGVBdmFpbGFiaWxpdHlSZXF1ZXN0IGltcGxlbWVudHMgaS5EZWxldGVBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlIHtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IERlbGV0ZUF2YWlsYWJpbGl0eVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBEZWxldGVBdmFpbGFiaWxpdHlSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5EZWxldGVBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVsZXRlTWVldGluZ1R5cGVSZXF1ZXN0IGltcGxlbWVudHMgaS5EZWxldGVNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVNZWV0aW5nVHlwZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBEZWxldGVNZWV0aW5nVHlwZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkRlbGV0ZU1lZXRpbmdUeXBlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb2VzQ2FsZW5kYXJFeGlzdFJlcXVlc3QgaW1wbGVtZW50cyBpLkRvZXNDYWxlbmRhckV4aXN0UmVxdWVzdEludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEb2VzQ2FsZW5kYXJFeGlzdFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBEb2VzQ2FsZW5kYXJFeGlzdFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkRvZXNDYWxlbmRhckV4aXN0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWRlbnRpZmllciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZGVudGlmaWVyJ10gPSB0aGlzLmNhbGVuZGFySWRlbnRpZmllcjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb2VzQ2FsZW5kYXJFeGlzdFJlc3BvbnNlIGltcGxlbWVudHMgaS5Eb2VzQ2FsZW5kYXJFeGlzdFJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBleGlzdHM6IGJvb2xlYW47XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEb2VzQ2FsZW5kYXJFeGlzdFJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRG9lc0NhbGVuZGFyRXhpc3RSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRG9lc0NhbGVuZGFyRXhpc3RSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4aXN0cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZXhpc3RzJ10gPSB0aGlzLmV4aXN0czt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVxdWVzdCBpbXBsZW1lbnRzIGkuRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGV4dGVybmFsSWRzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXh0ZXJuYWxJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2V4dGVybmFsSWRzJ10gPSB0aGlzLmV4dGVybmFsSWRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXNwb25zZSBpbXBsZW1lbnRzIGkuRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBFbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBFbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhcklkcyddID0gdGhpcy5jYWxlbmRhcklkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdCBpbXBsZW1lbnRzIGkuRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIGFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzKSB7bS5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMocHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcykucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwcm90by5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzW2tdOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudXNlcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd1c2VySWQnXSA9IHRoaXMudXNlcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgPyAodGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1Jlc3BvbnNlIGltcGxlbWVudHMgaS5FbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZCddID0gdGhpcy5jYWxlbmRhcklkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVycyBpbXBsZW1lbnRzIGkuTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgICBtZWV0aW5nVHlwZUlkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnMge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnMoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZUlkJ10gPSB0aGlzLm1lZXRpbmdUeXBlSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEZpbHRlcnMgaW1wbGVtZW50cyBpLkxpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nVHlwZUlkczogc3RyaW5nW107XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgdGltZVNwYW46IERhdGVSYW5nZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEZpbHRlcnMoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8udGltZVNwYW4pIHttLnRpbWVTcGFuID0gRGF0ZVJhbmdlLmZyb21Qcm90byhwcm90by50aW1lU3Bhbik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlSWRzJ10gPSB0aGlzLm1lZXRpbmdUeXBlSWRzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lU3BhbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lU3BhbiAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lU3BhbiddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lU3BhbiA/ICh0aGlzLnRpbWVTcGFuIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVTcGFuO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEhvc3RNZWV0aW5nUmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0SG9zdE1lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nSWQ6IHN0cmluZztcbiAgICBsb2NhdGlvbjogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0SG9zdE1lZXRpbmdSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0SG9zdE1lZXRpbmdSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0TWVldGluZ1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdJZCddID0gdGhpcy5tZWV0aW5nSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2xvY2F0aW9uJ10gPSB0aGlzLmxvY2F0aW9uO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEhvc3RNZWV0aW5nUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldEhvc3RNZWV0aW5nUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmc6IE1lZXRpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRIb3N0TWVldGluZ1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0SG9zdE1lZXRpbmdSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5nKSB7bS5tZWV0aW5nID0gTWVldGluZy5mcm9tUHJvdG8ocHJvdG8ubWVldGluZyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldEhvc3RNZWV0aW5nUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmcgIT09IG51bGwpIHt0b1JldHVyblsnbWVldGluZyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nID8gKHRoaXMubWVldGluZyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5tZWV0aW5nO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEhvc3RQcmVmZXJlbmNlc1JlcXVlc3QgaW1wbGVtZW50cyBpLkdldEhvc3RQcmVmZXJlbmNlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0SG9zdFByZWZlcmVuY2VzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldEhvc3RQcmVmZXJlbmNlc1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldEhvc3RQcmVmZXJlbmNlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0SG9zdFByZWZlcmVuY2VzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldEhvc3RQcmVmZXJlbmNlc1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBwcmVmZXJlbmNlczogUHJlZmVyZW5jZXM7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRIb3N0UHJlZmVyZW5jZXNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldEhvc3RQcmVmZXJlbmNlc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnByZWZlcmVuY2VzKSB7bS5wcmVmZXJlbmNlcyA9IFByZWZlcmVuY2VzLmZyb21Qcm90byhwcm90by5wcmVmZXJlbmNlcyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldEhvc3RQcmVmZXJlbmNlc1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlZmVyZW5jZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucHJlZmVyZW5jZXMgIT09IG51bGwpIHt0b1JldHVyblsncHJlZmVyZW5jZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucHJlZmVyZW5jZXMgPyAodGhpcy5wcmVmZXJlbmNlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wcmVmZXJlbmNlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRIb3N0c0ZvckNhbGVuZGFyUmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0SG9zdHNGb3JDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldEhvc3RzRm9yQ2FsZW5kYXJSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0SG9zdHNGb3JDYWxlbmRhclJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldEhvc3RzRm9yQ2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZCddID0gdGhpcy5jYWxlbmRhcklkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEhvc3RzRm9yQ2FsZW5kYXJSZXNwb25zZSBpbXBsZW1lbnRzIGkuR2V0SG9zdHNGb3JDYWxlbmRhclJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBob3N0VXNlcnM6IEhvc3RVc2VyW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRIb3N0c0ZvckNhbGVuZGFyUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRIb3N0c0ZvckNhbGVuZGFyUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uaG9zdFVzZXJzKSB7bS5ob3N0VXNlcnMgPSBwcm90by5ob3N0VXNlcnMubWFwKEhvc3RVc2VyLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldEhvc3RzRm9yQ2FsZW5kYXJSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RVc2VycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5ob3N0VXNlcnMgIT09IG51bGwpIHt0b1JldHVyblsnaG9zdFVzZXJzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmhvc3RVc2VycyA/ICh0aGlzLmhvc3RVc2VycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5ob3N0VXNlcnM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZHM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZHMnXSA9IHRoaXMuY2FsZW5kYXJJZHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhck1lZXRpbmdUeXBlc01hcDoge1trZXk6IHN0cmluZ106IE1lZXRpbmdUeXBlTGlzdH07XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwKSB7bS5jYWxlbmRhck1lZXRpbmdUeXBlc01hcCA9IE9iamVjdC5rZXlzKHByb3RvLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwKS5yZWR1Y2U8YW55Pigob2JqLCBrKSA9PiB7IG9ialtrXSA9IE1lZXRpbmdUeXBlTGlzdC5mcm9tUHJvdG8ocHJvdG8uY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXBba10pOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAgIT09IG51bGwpIHt0b1JldHVyblsnY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAgPyAodGhpcy5jYWxlbmRhck1lZXRpbmdUeXBlc01hcCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jYWxlbmRhck1lZXRpbmdUeXBlc01hcDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0Qm9va01lZXRpbmdSZXF1ZXN0IGltcGxlbWVudHMgaS5Ib3N0Qm9va01lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nU291cmNlOiBlLk1lZXRpbmdTb3VyY2U7XG4gICAgY2FsZW5kYXJJZDogc3RyaW5nO1xuICAgIG1lZXRpbmdUeXBlSWQ6IHN0cmluZztcbiAgICB0aW1lU2xvdDogRGF0ZVJhbmdlO1xuICAgIGF0dGVuZGVlczogQ29udGFjdFtdO1xuICAgIHRvcGljOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBIb3N0Qm9va01lZXRpbmdSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSG9zdEJvb2tNZWV0aW5nUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5nU291cmNlKSB7bS5tZWV0aW5nU291cmNlID0gZW51bVN0cmluZ1RvVmFsdWU8ZS5NZWV0aW5nU291cmNlPihlLk1lZXRpbmdTb3VyY2UsIHByb3RvLm1lZXRpbmdTb3VyY2UpO31cbiAgICAgICAgaWYgKHByb3RvLnRpbWVTbG90KSB7bS50aW1lU2xvdCA9IERhdGVSYW5nZS5mcm9tUHJvdG8ocHJvdG8udGltZVNsb3QpO31cbiAgICAgICAgaWYgKHByb3RvLmF0dGVuZGVlcykge20uYXR0ZW5kZWVzID0gcHJvdG8uYXR0ZW5kZWVzLm1hcChDb250YWN0LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkhvc3RCb29rTWVldGluZ1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nU291cmNlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nU291cmNlJ10gPSB0aGlzLm1lZXRpbmdTb3VyY2U7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZCddID0gdGhpcy5jYWxlbmRhcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlSWQnXSA9IHRoaXMubWVldGluZ1R5cGVJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lU2xvdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lU2xvdCAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lU2xvdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lU2xvdCA/ICh0aGlzLnRpbWVTbG90IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVTbG90O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dGVuZGVlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRlbmRlZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXR0ZW5kZWVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF0dGVuZGVlcyA/ICh0aGlzLmF0dGVuZGVlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdHRlbmRlZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudG9waWMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3RvcGljJ10gPSB0aGlzLnRvcGljO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhvc3RCb29rTWVldGluZ1Jlc3BvbnNlIGltcGxlbWVudHMgaS5Ib3N0Qm9va01lZXRpbmdSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVldGluZ0lkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBIb3N0Qm9va01lZXRpbmdSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RCb29rTWVldGluZ1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0Qm9va01lZXRpbmdSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ0lkJ10gPSB0aGlzLm1lZXRpbmdJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0R2V0Q2FsZW5kYXJSZXF1ZXN0IGltcGxlbWVudHMgaS5Ib3N0R2V0Q2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBIb3N0R2V0Q2FsZW5kYXJSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSG9zdEdldENhbGVuZGFyUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSG9zdEdldENhbGVuZGFyUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0R2V0Q2FsZW5kYXJSZXNwb25zZSBpbXBsZW1lbnRzIGkuSG9zdEdldENhbGVuZGFyUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFyOiBDYWxlbmRhcjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEhvc3RHZXRDYWxlbmRhclJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSG9zdEdldENhbGVuZGFyUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY2FsZW5kYXIpIHttLmNhbGVuZGFyID0gQ2FsZW5kYXIuZnJvbVByb3RvKHByb3RvLmNhbGVuZGFyKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSG9zdEdldENhbGVuZGFyUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jYWxlbmRhciAhPT0gbnVsbCkge3RvUmV0dXJuWydjYWxlbmRhciddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jYWxlbmRhciA/ICh0aGlzLmNhbGVuZGFyIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmNhbGVuZGFyO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhvc3RHZXRNZWV0aW5nVHlwZVJlcXVlc3QgaW1wbGVtZW50cyBpLkhvc3RHZXRNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFyU2x1Zzogc3RyaW5nO1xuICAgIG1lZXRpbmdUeXBlU2x1Zzogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdEdldE1lZXRpbmdUeXBlUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RHZXRNZWV0aW5nVHlwZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkhvc3RHZXRNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhclNsdWcgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFyU2x1ZyddID0gdGhpcy5jYWxlbmRhclNsdWc7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVTbHVnICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZVNsdWcnXSA9IHRoaXMubWVldGluZ1R5cGVTbHVnO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhvc3RHZXRNZWV0aW5nVHlwZVJlc3BvbnNlIGltcGxlbWVudHMgaS5Ib3N0R2V0TWVldGluZ1R5cGVSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdEdldE1lZXRpbmdUeXBlUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBIb3N0R2V0TWVldGluZ1R5cGVSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5nVHlwZSkge20ubWVldGluZ1R5cGUgPSBNZWV0aW5nVHlwZS5mcm9tUHJvdG8ocHJvdG8ubWVldGluZ1R5cGUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0R2V0TWVldGluZ1R5cGVSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmdUeXBlICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1lZXRpbmdUeXBlID8gKHRoaXMubWVldGluZ1R5cGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZ1R5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9zdExpc3RNZWV0aW5nVHlwZXNSZXF1ZXN0IGltcGxlbWVudHMgaS5Ib3N0TGlzdE1lZXRpbmdUeXBlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdExpc3RNZWV0aW5nVHlwZXNSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSG9zdExpc3RNZWV0aW5nVHlwZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0TGlzdE1lZXRpbmdUeXBlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9zdExpc3RNZWV0aW5nVHlwZXNSZXNwb25zZSBpbXBsZW1lbnRzIGkuSG9zdExpc3RNZWV0aW5nVHlwZXNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVldGluZ1R5cGVzOiBNZWV0aW5nVHlwZVtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdExpc3RNZWV0aW5nVHlwZXNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RMaXN0TWVldGluZ1R5cGVzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ1R5cGVzKSB7bS5tZWV0aW5nVHlwZXMgPSBwcm90by5tZWV0aW5nVHlwZXMubWFwKE1lZXRpbmdUeXBlLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkhvc3RMaXN0TWVldGluZ1R5cGVzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWVldGluZ1R5cGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nVHlwZXMgPyAodGhpcy5tZWV0aW5nVHlwZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZ1R5cGVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElzSG9zdENvbmZpZ3VyZWRSZXF1ZXN0IGltcGxlbWVudHMgaS5Jc0hvc3RDb25maWd1cmVkUmVxdWVzdEludGVyZmFjZSB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBJc0hvc3RDb25maWd1cmVkUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IElzSG9zdENvbmZpZ3VyZWRSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Jc0hvc3RDb25maWd1cmVkUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJc0hvc3RDb25maWd1cmVkUmVzcG9uc2UgaW1wbGVtZW50cyBpLklzSG9zdENvbmZpZ3VyZWRSZXNwb25zZUludGVyZmFjZSB7XG4gICAgaXNDb25maWd1cmVkOiBib29sZWFuO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSXNIb3N0Q29uZmlndXJlZFJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSXNIb3N0Q29uZmlndXJlZFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Jc0hvc3RDb25maWd1cmVkUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0NvbmZpZ3VyZWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2lzQ29uZmlndXJlZCddID0gdGhpcy5pc0NvbmZpZ3VyZWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3QgaW1wbGVtZW50cyBpLkxpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBwYWdpbmdPcHRpb25zOiBQYWdlZFJlcXVlc3RPcHRpb25zO1xuICAgIGZpbHRlcnM6IExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVycztcbiAgICB0aW1lWm9uZTogVGltZVpvbmU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ09wdGlvbnMpIHttLnBhZ2luZ09wdGlvbnMgPSBQYWdlZFJlcXVlc3RPcHRpb25zLmZyb21Qcm90byhwcm90by5wYWdpbmdPcHRpb25zKTt9XG4gICAgICAgIGlmIChwcm90by5maWx0ZXJzKSB7bS5maWx0ZXJzID0gTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzLmZyb21Qcm90byhwcm90by5maWx0ZXJzKTt9XG4gICAgICAgIGlmIChwcm90by50aW1lWm9uZSkge20udGltZVpvbmUgPSBUaW1lWm9uZS5mcm9tUHJvdG8ocHJvdG8udGltZVpvbmUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2luZ09wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nT3B0aW9ucyAhPT0gbnVsbCkge3RvUmV0dXJuWydwYWdpbmdPcHRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhZ2luZ09wdGlvbnMgPyAodGhpcy5wYWdpbmdPcHRpb25zIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBhZ2luZ09wdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmlsdGVycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maWx0ZXJzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2ZpbHRlcnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmlsdGVycyA/ICh0aGlzLmZpbHRlcnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZmlsdGVyczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lWm9uZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lWm9uZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lWm9uZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lWm9uZSA/ICh0aGlzLnRpbWVab25lIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVab25lO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RBdmFpbGFiaWxpdHlSZXNwb25zZSBpbXBsZW1lbnRzIGkuTGlzdEF2YWlsYWJpbGl0eVJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBhdmFpbGFiaWxpdHlSdWxlczogQXZhaWxhYmlsaXR5UnVsZVtdO1xuICAgIG1ldGFkYXRhOiBQYWdlZFJlc3BvbnNlTWV0YWRhdGE7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0QXZhaWxhYmlsaXR5UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0QXZhaWxhYmlsaXR5UmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXZhaWxhYmlsaXR5UnVsZXMpIHttLmF2YWlsYWJpbGl0eVJ1bGVzID0gcHJvdG8uYXZhaWxhYmlsaXR5UnVsZXMubWFwKEF2YWlsYWJpbGl0eVJ1bGUuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5tZXRhZGF0YSkge20ubWV0YWRhdGEgPSBQYWdlZFJlc3BvbnNlTWV0YWRhdGEuZnJvbVByb3RvKHByb3RvLm1ldGFkYXRhKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdEF2YWlsYWJpbGl0eVJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXZhaWxhYmlsaXR5UnVsZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXZhaWxhYmlsaXR5UnVsZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXZhaWxhYmlsaXR5UnVsZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXZhaWxhYmlsaXR5UnVsZXMgPyAodGhpcy5hdmFpbGFiaWxpdHlSdWxlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdmFpbGFiaWxpdHlSdWxlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXRhZGF0YSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZXRhZGF0YSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZXRhZGF0YSA/ICh0aGlzLm1ldGFkYXRhIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1ldGFkYXRhO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3QgaW1wbGVtZW50cyBpLkxpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGZpbHRlcnM6IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzO1xuICAgIHBhZ2luZ09wdGlvbnM6IFBhZ2VkUmVxdWVzdE9wdGlvbnM7XG4gICAgdGltZVpvbmU6IFRpbWVab25lO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZmlsdGVycykge20uZmlsdGVycyA9IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzLmZyb21Qcm90byhwcm90by5maWx0ZXJzKTt9XG4gICAgICAgIGlmIChwcm90by5wYWdpbmdPcHRpb25zKSB7bS5wYWdpbmdPcHRpb25zID0gUGFnZWRSZXF1ZXN0T3B0aW9ucy5mcm9tUHJvdG8ocHJvdG8ucGFnaW5nT3B0aW9ucyk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVpvbmUpIHttLnRpbWVab25lID0gVGltZVpvbmUuZnJvbVByb3RvKHByb3RvLnRpbWVab25lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdEJvb2tlZE1lZXRpbmdzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbHRlcnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmlsdGVycyAhPT0gbnVsbCkge3RvUmV0dXJuWydmaWx0ZXJzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmZpbHRlcnMgPyAodGhpcy5maWx0ZXJzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZpbHRlcnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnaW5nT3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYWdpbmdPcHRpb25zICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhZ2luZ09wdGlvbnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFnaW5nT3B0aW9ucyA/ICh0aGlzLnBhZ2luZ09wdGlvbnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFnaW5nT3B0aW9uczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lWm9uZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lWm9uZSAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lWm9uZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lWm9uZSA/ICh0aGlzLnRpbWVab25lIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVab25lO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RCb29rZWRNZWV0aW5nc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5MaXN0Qm9va2VkTWVldGluZ3NSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVldGluZ3M6IE1lZXRpbmdbXTtcbiAgICBwYWdpbmdNZXRhZGF0YTogUGFnZWRSZXNwb25zZU1ldGFkYXRhO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdEJvb2tlZE1lZXRpbmdzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0Qm9va2VkTWVldGluZ3NSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5ncykge20ubWVldGluZ3MgPSBwcm90by5tZWV0aW5ncy5tYXAoTWVldGluZy5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ01ldGFkYXRhKSB7bS5wYWdpbmdNZXRhZGF0YSA9IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YS5mcm9tUHJvdG8ocHJvdG8ucGFnaW5nTWV0YWRhdGEpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0Qm9va2VkTWVldGluZ3NSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmdzICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmdzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1lZXRpbmdzID8gKHRoaXMubWVldGluZ3MgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZ3M7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09IG51bGwpIHt0b1JldHVyblsncGFnaW5nTWV0YWRhdGEnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFnaW5nTWV0YWRhdGEgPyAodGhpcy5wYWdpbmdNZXRhZGF0YSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYWdpbmdNZXRhZGF0YTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZWV0aW5nIGltcGxlbWVudHMgaS5NZWV0aW5nSW50ZXJmYWNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGV2ZW50VHlwZUlkOiBzdHJpbmc7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgc3RhcnQ6IERhdGU7XG4gICAgZW5kOiBEYXRlO1xuICAgIGNyZWF0ZWQ6IERhdGU7XG4gICAgdXBkYXRlZDogRGF0ZTtcbiAgICBhdHRlbmRlZXM6IEF0dGVuZGVlW107XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBqb2luTWVldGluZ1VybDogc3RyaW5nO1xuICAgIHRvcGljOiBzdHJpbmc7XG4gICAgZm9ybUFuc3dlcnM6IEFuc3dlcnM7XG4gICAgbWV0YWRhdGE6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBNZWV0aW5nIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTWVldGluZygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdGFydCkge20uc3RhcnQgPSBuZXcgRGF0ZShwcm90by5zdGFydCk7fVxuICAgICAgICBpZiAocHJvdG8uZW5kKSB7bS5lbmQgPSBuZXcgRGF0ZShwcm90by5lbmQpO31cbiAgICAgICAgaWYgKHByb3RvLmNyZWF0ZWQpIHttLmNyZWF0ZWQgPSBuZXcgRGF0ZShwcm90by5jcmVhdGVkKTt9XG4gICAgICAgIGlmIChwcm90by51cGRhdGVkKSB7bS51cGRhdGVkID0gbmV3IERhdGUocHJvdG8udXBkYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8uYXR0ZW5kZWVzKSB7bS5hdHRlbmRlZXMgPSBwcm90by5hdHRlbmRlZXMubWFwKEF0dGVuZGVlLmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8uZm9ybUFuc3dlcnMpIHttLmZvcm1BbnN3ZXJzID0gQW5zd2Vycy5mcm9tUHJvdG8ocHJvdG8uZm9ybUFuc3dlcnMpO31cbiAgICAgICAgaWYgKHByb3RvLm1ldGFkYXRhKSB7bS5tZXRhZGF0YSA9IE9iamVjdC5rZXlzKHByb3RvLm1ldGFkYXRhKS5yZWR1Y2U8YW55Pigob2JqLCBrKSA9PiB7IG9ialtrXSA9IHByb3RvLm1ldGFkYXRhW2tdOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICBpZiAocHJvdG8uYXR0YWNobWVudHMpIHttLmF0dGFjaG1lbnRzID0gcHJvdG8uYXR0YWNobWVudHMubWFwKEF0dGFjaG1lbnQuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTWVldGluZ0ludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ldmVudFR5cGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZXZlbnRUeXBlSWQnXSA9IHRoaXMuZXZlbnRUeXBlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0YXJ0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3N0YXJ0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0YXJ0ID8gKHRoaXMuc3RhcnQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuc3RhcnQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZW5kICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmVuZCAhPT0gbnVsbCkge3RvUmV0dXJuWydlbmQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZW5kID8gKHRoaXMuZW5kIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmVuZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jcmVhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNyZWF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsnY3JlYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jcmVhdGVkID8gKHRoaXMuY3JlYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jcmVhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVwZGF0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudXBkYXRlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyd1cGRhdGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnVwZGF0ZWQgPyAodGhpcy51cGRhdGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnVwZGF0ZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0ZW5kZWVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmF0dGVuZGVlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhdHRlbmRlZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0ZW5kZWVzID8gKHRoaXMuYXR0ZW5kZWVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmF0dGVuZGVlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kZXNjcmlwdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZGVzY3JpcHRpb24nXSA9IHRoaXMuZGVzY3JpcHRpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuam9pbk1lZXRpbmdVcmwgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2pvaW5NZWV0aW5nVXJsJ10gPSB0aGlzLmpvaW5NZWV0aW5nVXJsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvcGljICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0b3BpYyddID0gdGhpcy50b3BpYzt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5mb3JtQW5zd2VycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5mb3JtQW5zd2VycyAhPT0gbnVsbCkge3RvUmV0dXJuWydmb3JtQW5zd2VycyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5mb3JtQW5zd2VycyA/ICh0aGlzLmZvcm1BbnN3ZXJzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZvcm1BbnN3ZXJzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1ldGFkYXRhICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1ldGFkYXRhICE9PSBudWxsKSB7dG9SZXR1cm5bJ21ldGFkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1ldGFkYXRhID8gKHRoaXMubWV0YWRhdGEgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWV0YWRhdGE7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0YWNobWVudHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXR0YWNobWVudHMgIT09IG51bGwpIHt0b1JldHVyblsnYXR0YWNobWVudHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0YWNobWVudHMgPyAodGhpcy5hdHRhY2htZW50cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdHRhY2htZW50czt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZWV0aW5nVHlwZUxpc3QgaW1wbGVtZW50cyBpLk1lZXRpbmdUeXBlTGlzdEludGVyZmFjZSB7XG4gICAgbWVldGluZ1R5cGVzOiBNZWV0aW5nVHlwZVtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTWVldGluZ1R5cGVMaXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTWVldGluZ1R5cGVMaXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm1lZXRpbmdUeXBlcykge20ubWVldGluZ1R5cGVzID0gcHJvdG8ubWVldGluZ1R5cGVzLm1hcChNZWV0aW5nVHlwZS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5NZWV0aW5nVHlwZUxpc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWVldGluZ1R5cGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nVHlwZXMgPyAodGhpcy5tZWV0aW5nVHlwZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZ1R5cGVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lZXRpbmdNZXRhZGF0YUVudHJ5IGltcGxlbWVudHMgaS5NZWV0aW5nTWV0YWRhdGFFbnRyeUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE1lZXRpbmdNZXRhZGF0YUVudHJ5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTWVldGluZ01ldGFkYXRhRW50cnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk1lZXRpbmdNZXRhZGF0YUVudHJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZSddID0gdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0TWV0YWRhdGFFbnRyeSBpbXBsZW1lbnRzIGkuVXBkYXRlTWVldGluZ01ldGFkYXRhUmVxdWVzdE1ldGFkYXRhRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0TWV0YWRhdGFFbnRyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IFVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3RNZXRhZGF0YUVudHJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0TWV0YWRhdGFFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWUnXSA9IHRoaXMudmFsdWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVzY2hlZHVsZU1lZXRpbmdSZXF1ZXN0IGltcGxlbWVudHMgaS5SZXNjaGVkdWxlTWVldGluZ1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdJZDogc3RyaW5nO1xuICAgIHN0YXJ0OiBEYXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUmVzY2hlZHVsZU1lZXRpbmdSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUmVzY2hlZHVsZU1lZXRpbmdSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnN0YXJ0KSB7bS5zdGFydCA9IG5ldyBEYXRlKHByb3RvLnN0YXJ0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUmVzY2hlZHVsZU1lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nSWQnXSA9IHRoaXMubWVldGluZ0lkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0YXJ0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0YXJ0ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3N0YXJ0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0YXJ0ID8gKHRoaXMuc3RhcnQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuc3RhcnQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0R2VuZXJhbEF2YWlsYWJpbGl0eVJlcXVlc3QgaW1wbGVtZW50cyBpLlNldEdlbmVyYWxBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgICBtZWV0aW5nVHlwZUlkOiBzdHJpbmc7XG4gICAgZGF5czogZS5EYXlPZldlZWtbXTtcbiAgICB0aW1lU2xvdDogVGltZVJhbmdlO1xuICAgIHRpbWVab25lOiBUaW1lWm9uZTtcbiAgICB3ZWVrZGF5c0F2YWlsYWJpbGl0eTogV2Vla2RheUF2YWlsYWJpbGl0eVtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2V0R2VuZXJhbEF2YWlsYWJpbGl0eVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBTZXRHZW5lcmFsQXZhaWxhYmlsaXR5UmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5kYXlzKSB7bS5kYXlzID0gcHJvdG8uZGF5cy5tYXAoKHY6IHN0cmluZykgPT4gZW51bVN0cmluZ1RvVmFsdWU8ZS5EYXlPZldlZWs+KGUuRGF5T2ZXZWVrLCB2KSk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVNsb3QpIHttLnRpbWVTbG90ID0gVGltZVJhbmdlLmZyb21Qcm90byhwcm90by50aW1lU2xvdCk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVpvbmUpIHttLnRpbWVab25lID0gVGltZVpvbmUuZnJvbVByb3RvKHByb3RvLnRpbWVab25lKTt9XG4gICAgICAgIGlmIChwcm90by53ZWVrZGF5c0F2YWlsYWJpbGl0eSkge20ud2Vla2RheXNBdmFpbGFiaWxpdHkgPSBwcm90by53ZWVrZGF5c0F2YWlsYWJpbGl0eS5tYXAoV2Vla2RheUF2YWlsYWJpbGl0eS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TZXRHZW5lcmFsQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZUlkJ10gPSB0aGlzLm1lZXRpbmdUeXBlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF5cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZGF5cyddID0gdGhpcy5kYXlzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVTbG90ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRpbWVTbG90ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3RpbWVTbG90J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnRpbWVTbG90ID8gKHRoaXMudGltZVNsb3QgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudGltZVNsb3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVpvbmUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVpvbmUgIT09IG51bGwpIHt0b1JldHVyblsndGltZVpvbmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVpvbmUgPyAodGhpcy50aW1lWm9uZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lWm9uZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy53ZWVrZGF5c0F2YWlsYWJpbGl0eSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy53ZWVrZGF5c0F2YWlsYWJpbGl0eSAhPT0gbnVsbCkge3RvUmV0dXJuWyd3ZWVrZGF5c0F2YWlsYWJpbGl0eSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy53ZWVrZGF5c0F2YWlsYWJpbGl0eSA/ICh0aGlzLndlZWtkYXlzQXZhaWxhYmlsaXR5IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLndlZWtkYXlzQXZhaWxhYmlsaXR5O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUF2YWlsYWJpbGl0eVJlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZUF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2Uge1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogVXBkYXRlQXZhaWxhYmlsaXR5UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFVwZGF0ZUF2YWlsYWJpbGl0eVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlVwZGF0ZUF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVDYWxlbmRhclJlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZUNhbGVuZGFyUmVxdWVzdEludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZDogc3RyaW5nO1xuICAgIGNhbGVuZGFyVXBkYXRlOiBDYWxlbmRhcjtcbiAgICBmaWVsZE1hc2s6IEZpZWxkTWFzaztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFVwZGF0ZUNhbGVuZGFyUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFVwZGF0ZUNhbGVuZGFyUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5jYWxlbmRhclVwZGF0ZSkge20uY2FsZW5kYXJVcGRhdGUgPSBDYWxlbmRhci5mcm9tUHJvdG8ocHJvdG8uY2FsZW5kYXJVcGRhdGUpO31cbiAgICAgICAgaWYgKHByb3RvLmZpZWxkTWFzaykge20uZmllbGRNYXNrID0gRmllbGRNYXNrLmZyb21Qcm90byhwcm90by5maWVsZE1hc2spO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhcklkJ10gPSB0aGlzLmNhbGVuZGFySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJVcGRhdGUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY2FsZW5kYXJVcGRhdGUgIT09IG51bGwpIHt0b1JldHVyblsnY2FsZW5kYXJVcGRhdGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY2FsZW5kYXJVcGRhdGUgPyAodGhpcy5jYWxlbmRhclVwZGF0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jYWxlbmRhclVwZGF0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5maWVsZE1hc2sgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmllbGRNYXNrICE9PSBudWxsKSB7dG9SZXR1cm5bJ2ZpZWxkTWFzayddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5maWVsZE1hc2sgPyAodGhpcy5maWVsZE1hc2sgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZmllbGRNYXNrO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZUhvc3RQcmVmZXJlbmNlc1JlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZUhvc3RQcmVmZXJlbmNlc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuICAgIHByZWZlcmVuY2VzOiBQcmVmZXJlbmNlcztcbiAgICBmaWVsZE1hc2s6IEZpZWxkTWFzaztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFVwZGF0ZUhvc3RQcmVmZXJlbmNlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnByZWZlcmVuY2VzKSB7bS5wcmVmZXJlbmNlcyA9IFByZWZlcmVuY2VzLmZyb21Qcm90byhwcm90by5wcmVmZXJlbmNlcyk7fVxuICAgICAgICBpZiAocHJvdG8uZmllbGRNYXNrKSB7bS5maWVsZE1hc2sgPSBGaWVsZE1hc2suZnJvbVByb3RvKHByb3RvLmZpZWxkTWFzayk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlVwZGF0ZUhvc3RQcmVmZXJlbmNlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHJlZmVyZW5jZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucHJlZmVyZW5jZXMgIT09IG51bGwpIHt0b1JldHVyblsncHJlZmVyZW5jZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucHJlZmVyZW5jZXMgPyAodGhpcy5wcmVmZXJlbmNlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wcmVmZXJlbmNlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5maWVsZE1hc2sgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmllbGRNYXNrICE9PSBudWxsKSB7dG9SZXR1cm5bJ2ZpZWxkTWFzayddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5maWVsZE1hc2sgPyAodGhpcy5maWVsZE1hc2sgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZmllbGRNYXNrO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdJZDogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm1ldGFkYXRhKSB7bS5tZXRhZGF0YSA9IE9iamVjdC5rZXlzKHByb3RvLm1ldGFkYXRhKS5yZWR1Y2U8YW55Pigob2JqLCBrKSA9PiB7IG9ialtrXSA9IHByb3RvLm1ldGFkYXRhW2tdOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdJZCddID0gdGhpcy5tZWV0aW5nSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWV0YWRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWV0YWRhdGEgIT09IG51bGwpIHt0b1JldHVyblsnbWV0YWRhdGEnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWV0YWRhdGEgPyAodGhpcy5tZXRhZGF0YSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5tZXRhZGF0YTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVNZWV0aW5nVHlwZVJlcXVlc3QgaW1wbGVtZW50cyBpLlVwZGF0ZU1lZXRpbmdUeXBlUmVxdWVzdEludGVyZmFjZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBtZWV0aW5nVHlwZTogTWVldGluZ1R5cGU7XG4gICAgZmllbGRNYXNrOiBGaWVsZE1hc2s7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBVcGRhdGVNZWV0aW5nVHlwZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVNZWV0aW5nVHlwZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ1R5cGUpIHttLm1lZXRpbmdUeXBlID0gTWVldGluZ1R5cGUuZnJvbVByb3RvKHByb3RvLm1lZXRpbmdUeXBlKTt9XG4gICAgICAgIGlmIChwcm90by5maWVsZE1hc2spIHttLmZpZWxkTWFzayA9IEZpZWxkTWFzay5mcm9tUHJvdG8ocHJvdG8uZmllbGRNYXNrKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVXBkYXRlTWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2lkJ10gPSB0aGlzLmlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmdUeXBlICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmdUeXBlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1lZXRpbmdUeXBlID8gKHRoaXMubWVldGluZ1R5cGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZ1R5cGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmllbGRNYXNrICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpZWxkTWFzayAhPT0gbnVsbCkge3RvUmV0dXJuWydmaWVsZE1hc2snXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmllbGRNYXNrID8gKHRoaXMuZmllbGRNYXNrIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZpZWxkTWFzazt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWVrZGF5QXZhaWxhYmlsaXR5IGltcGxlbWVudHMgaS5XZWVrZGF5QXZhaWxhYmlsaXR5SW50ZXJmYWNlIHtcbiAgICBkYXk6IGUuRGF5T2ZXZWVrO1xuICAgIHRpbWVTbG90czogVGltZVJhbmdlW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBXZWVrZGF5QXZhaWxhYmlsaXR5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgV2Vla2RheUF2YWlsYWJpbGl0eSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5kYXkpIHttLmRheSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuRGF5T2ZXZWVrPihlLkRheU9mV2VlaywgcHJvdG8uZGF5KTt9XG4gICAgICAgIGlmIChwcm90by50aW1lU2xvdHMpIHttLnRpbWVTbG90cyA9IHByb3RvLnRpbWVTbG90cy5tYXAoVGltZVJhbmdlLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLldlZWtkYXlBdmFpbGFiaWxpdHlJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2RheSddID0gdGhpcy5kYXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVNsb3RzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRpbWVTbG90cyAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lU2xvdHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVNsb3RzID8gKHRoaXMudGltZVNsb3RzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVTbG90czt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiJdfQ==
|