@vendasta/meetings 0.72.0 → 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.
Files changed (180) hide show
  1. package/esm2020/lib/_generated/host.service.mjs +25 -0
  2. package/esm2020/lib/_internal/enums/dayofweek.enum.mjs +18 -0
  3. package/esm2020/lib/_internal/enums/index.mjs +11 -0
  4. package/esm2020/lib/_internal/enums/meeting-source.enum.mjs +20 -0
  5. package/esm2020/lib/_internal/enums/shared.enum.mjs +21 -0
  6. package/{esm2015/lib/_internal/enums/zoom.enum.js → esm2020/lib/_internal/enums/zoom.enum.mjs} +1 -1
  7. package/esm2020/lib/_internal/google-meet.api.service.mjs +41 -0
  8. package/esm2020/lib/_internal/index.mjs +15 -0
  9. package/esm2020/lib/_internal/interfaces/date-range.interface.mjs +8 -0
  10. package/esm2020/lib/_internal/interfaces/datetime.interface.mjs +8 -0
  11. package/esm2020/lib/_internal/interfaces/dayofweek.interface.mjs +8 -0
  12. package/esm2020/lib/_internal/interfaces/field-mask.interface.mjs +8 -0
  13. package/esm2020/lib/_internal/interfaces/google-meet.interface.mjs +8 -0
  14. package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
  15. package/esm2020/lib/_internal/interfaces/meeting-guest.interface.mjs +2 -0
  16. package/esm2020/lib/_internal/interfaces/meeting-host.interface.mjs +2 -0
  17. package/esm2020/lib/_internal/interfaces/meeting-source.interface.mjs +8 -0
  18. package/esm2020/lib/_internal/interfaces/meeting-type.interface.mjs +8 -0
  19. package/esm2020/lib/_internal/interfaces/shared.interface.mjs +2 -0
  20. package/esm2020/lib/_internal/interfaces/timeofday.interface.mjs +8 -0
  21. package/esm2020/lib/_internal/interfaces/zoom.interface.mjs +8 -0
  22. package/esm2020/lib/_internal/meeting-guest.api.service.mjs +84 -0
  23. package/esm2020/lib/_internal/meeting-host.api.service.mjs +170 -0
  24. package/esm2020/lib/_internal/meeting-source-api.api.service.mjs +41 -0
  25. package/esm2020/lib/_internal/objects/date-range.mjs +36 -0
  26. package/esm2020/lib/_internal/objects/datetime.mjs +77 -0
  27. package/esm2020/lib/_internal/objects/dayofweek.mjs +7 -0
  28. package/esm2020/lib/_internal/objects/field-mask.mjs +27 -0
  29. package/esm2020/lib/_internal/objects/google-meet.mjs +539 -0
  30. package/esm2020/lib/_internal/objects/index.mjs +18 -0
  31. package/esm2020/lib/_internal/objects/meeting-guest.mjs +511 -0
  32. package/esm2020/lib/_internal/objects/meeting-host.mjs +1485 -0
  33. package/esm2020/lib/_internal/objects/meeting-source.mjs +121 -0
  34. package/esm2020/lib/_internal/objects/meeting-type.mjs +119 -0
  35. package/esm2020/lib/_internal/objects/shared.mjs +426 -0
  36. package/esm2020/lib/_internal/objects/timeofday.mjs +36 -0
  37. package/esm2020/lib/_internal/objects/zoom.mjs +377 -0
  38. package/esm2020/lib/_internal/zoom.api.service.mjs +41 -0
  39. package/esm2020/lib/guest/guest.service.mjs +86 -0
  40. package/esm2020/lib/guest/index.mjs +2 -0
  41. package/esm2020/lib/host/host.service.mjs +308 -0
  42. package/esm2020/lib/host/url.mjs +39 -0
  43. package/esm2020/lib/index.mjs +8 -0
  44. package/esm2020/lib/meetings.service.mjs +168 -0
  45. package/esm2020/lib/shared/availability.mjs +2 -0
  46. package/esm2020/lib/shared/calendar.mjs +29 -0
  47. package/esm2020/lib/shared/duration.mjs +41 -0
  48. package/esm2020/lib/shared/environment.mjs +17 -0
  49. package/esm2020/lib/shared/fieldmask.mjs +6 -0
  50. package/esm2020/lib/shared/host-id.mjs +20 -0
  51. package/esm2020/lib/shared/host-url-map.mjs +2 -0
  52. package/esm2020/lib/shared/host-user.mjs +8 -0
  53. package/esm2020/lib/shared/host.mjs +8 -0
  54. package/esm2020/lib/shared/index.mjs +14 -0
  55. package/esm2020/lib/shared/meeting-type.mjs +60 -0
  56. package/esm2020/lib/shared/meeting.mjs +89 -0
  57. package/esm2020/lib/shared/paged-response.mjs +8 -0
  58. package/esm2020/lib/shared/preferences.mjs +12 -0
  59. package/esm2020/lib/shared/time-span.mjs +7 -0
  60. package/esm2020/public_api.mjs +2 -0
  61. package/esm2020/vendasta-meetings.mjs +5 -0
  62. package/fesm2015/{vendasta-meetings.js → vendasta-meetings.mjs} +554 -1264
  63. package/fesm2015/vendasta-meetings.mjs.map +1 -0
  64. package/fesm2020/vendasta-meetings.mjs +5086 -0
  65. package/fesm2020/vendasta-meetings.mjs.map +1 -0
  66. package/lib/_generated/host.service.d.ts +5 -9
  67. package/lib/_internal/google-meet.api.service.d.ts +4 -0
  68. package/lib/_internal/index.d.ts +3 -3
  69. package/lib/_internal/interfaces/meeting-host.interface.d.ts +2 -1
  70. package/lib/_internal/interfaces/meeting-source.interface.d.ts +1 -1
  71. package/lib/_internal/interfaces/meeting-type.interface.d.ts +1 -1
  72. package/lib/_internal/interfaces/shared.interface.d.ts +1 -1
  73. package/lib/_internal/interfaces/zoom.interface.d.ts +1 -1
  74. package/lib/_internal/meeting-guest.api.service.d.ts +4 -0
  75. package/lib/_internal/meeting-host.api.service.d.ts +4 -0
  76. package/lib/_internal/meeting-source-api.api.service.d.ts +4 -0
  77. package/lib/_internal/objects/date-range.d.ts +1 -1
  78. package/lib/_internal/objects/datetime.d.ts +1 -1
  79. package/lib/_internal/objects/field-mask.d.ts +1 -1
  80. package/lib/_internal/objects/google-meet.d.ts +1 -1
  81. package/lib/_internal/objects/meeting-guest.d.ts +1 -1
  82. package/lib/_internal/objects/meeting-host.d.ts +3 -2
  83. package/lib/_internal/objects/meeting-source.d.ts +2 -2
  84. package/lib/_internal/objects/meeting-type.d.ts +2 -2
  85. package/lib/_internal/objects/shared.d.ts +2 -2
  86. package/lib/_internal/objects/timeofday.d.ts +1 -1
  87. package/lib/_internal/objects/zoom.d.ts +2 -2
  88. package/lib/_internal/zoom.api.service.d.ts +4 -0
  89. package/lib/guest/guest.service.d.ts +5 -4
  90. package/lib/guest/index.d.ts +0 -1
  91. package/lib/host/host.service.d.ts +7 -6
  92. package/lib/host/url.d.ts +1 -1
  93. package/lib/index.d.ts +1 -4
  94. package/lib/meetings.service.d.ts +3 -0
  95. package/lib/shared/availability.d.ts +2 -2
  96. package/lib/shared/calendar.d.ts +1 -1
  97. package/lib/shared/environment.d.ts +8 -0
  98. package/lib/shared/fieldmask.d.ts +1 -1
  99. package/lib/shared/host.d.ts +1 -1
  100. package/lib/shared/meeting-type.d.ts +2 -2
  101. package/lib/shared/meeting.d.ts +2 -2
  102. package/lib/shared/preferences.d.ts +3 -3
  103. package/lib/shared/time-span.d.ts +1 -1
  104. package/package.json +26 -15
  105. package/public_api.d.ts +1 -1
  106. package/src/README.md +12 -0
  107. package/vendasta-meetings.d.ts +1 -10
  108. package/bundles/vendasta-meetings.umd.js +0 -6217
  109. package/bundles/vendasta-meetings.umd.js.map +0 -1
  110. package/bundles/vendasta-meetings.umd.min.js +0 -16
  111. package/bundles/vendasta-meetings.umd.min.js.map +0 -1
  112. package/esm2015/lib/_generated/host.service.js +0 -62
  113. package/esm2015/lib/_internal/enums/dayofweek.enum.js +0 -18
  114. package/esm2015/lib/_internal/enums/index.js +0 -11
  115. package/esm2015/lib/_internal/enums/meeting-source.enum.js +0 -20
  116. package/esm2015/lib/_internal/enums/shared.enum.js +0 -21
  117. package/esm2015/lib/_internal/google-meet.api.service.js +0 -38
  118. package/esm2015/lib/_internal/index.js +0 -15
  119. package/esm2015/lib/_internal/interfaces/date-range.interface.js +0 -8
  120. package/esm2015/lib/_internal/interfaces/datetime.interface.js +0 -8
  121. package/esm2015/lib/_internal/interfaces/dayofweek.interface.js +0 -8
  122. package/esm2015/lib/_internal/interfaces/field-mask.interface.js +0 -8
  123. package/esm2015/lib/_internal/interfaces/google-meet.interface.js +0 -8
  124. package/esm2015/lib/_internal/interfaces/index.js +0 -2
  125. package/esm2015/lib/_internal/interfaces/meeting-guest.interface.js +0 -2
  126. package/esm2015/lib/_internal/interfaces/meeting-host.interface.js +0 -2
  127. package/esm2015/lib/_internal/interfaces/meeting-source.interface.js +0 -8
  128. package/esm2015/lib/_internal/interfaces/meeting-type.interface.js +0 -8
  129. package/esm2015/lib/_internal/interfaces/shared.interface.js +0 -2
  130. package/esm2015/lib/_internal/interfaces/timeofday.interface.js +0 -8
  131. package/esm2015/lib/_internal/interfaces/zoom.interface.js +0 -8
  132. package/esm2015/lib/_internal/meeting-guest.api.service.js +0 -81
  133. package/esm2015/lib/_internal/meeting-host.api.service.js +0 -167
  134. package/esm2015/lib/_internal/meeting-source-api.api.service.js +0 -38
  135. package/esm2015/lib/_internal/meetings.module.js +0 -33
  136. package/esm2015/lib/_internal/objects/date-range.js +0 -40
  137. package/esm2015/lib/_internal/objects/datetime.js +0 -92
  138. package/esm2015/lib/_internal/objects/dayofweek.js +0 -7
  139. package/esm2015/lib/_internal/objects/field-mask.js +0 -30
  140. package/esm2015/lib/_internal/objects/google-meet.js +0 -646
  141. package/esm2015/lib/_internal/objects/index.js +0 -18
  142. package/esm2015/lib/_internal/objects/meeting-guest.js +0 -591
  143. package/esm2015/lib/_internal/objects/meeting-host.js +0 -1699
  144. package/esm2015/lib/_internal/objects/meeting-source.js +0 -139
  145. package/esm2015/lib/_internal/objects/meeting-type.js +0 -142
  146. package/esm2015/lib/_internal/objects/shared.js +0 -504
  147. package/esm2015/lib/_internal/objects/timeofday.js +0 -42
  148. package/esm2015/lib/_internal/objects/zoom.js +0 -456
  149. package/esm2015/lib/_internal/zoom.api.service.js +0 -38
  150. package/esm2015/lib/guest/guest.module.js +0 -16
  151. package/esm2015/lib/guest/guest.service.js +0 -82
  152. package/esm2015/lib/guest/index.js +0 -3
  153. package/esm2015/lib/host/host.module.js +0 -16
  154. package/esm2015/lib/host/host.service.js +0 -283
  155. package/esm2015/lib/host/url.js +0 -39
  156. package/esm2015/lib/index.js +0 -11
  157. package/esm2015/lib/meetings.module.js +0 -22
  158. package/esm2015/lib/meetings.service.js +0 -165
  159. package/esm2015/lib/shared/availability.js +0 -2
  160. package/esm2015/lib/shared/calendar.js +0 -29
  161. package/esm2015/lib/shared/duration.js +0 -41
  162. package/esm2015/lib/shared/fieldmask.js +0 -6
  163. package/esm2015/lib/shared/host-id.js +0 -20
  164. package/esm2015/lib/shared/host-url-map.js +0 -2
  165. package/esm2015/lib/shared/host-user.js +0 -8
  166. package/esm2015/lib/shared/host.js +0 -8
  167. package/esm2015/lib/shared/index.js +0 -14
  168. package/esm2015/lib/shared/meeting-type.js +0 -52
  169. package/esm2015/lib/shared/meeting.js +0 -89
  170. package/esm2015/lib/shared/paged-response.js +0 -8
  171. package/esm2015/lib/shared/preferences.js +0 -12
  172. package/esm2015/lib/shared/time-span.js +0 -7
  173. package/esm2015/public_api.js +0 -2
  174. package/esm2015/vendasta-meetings.js +0 -12
  175. package/fesm2015/vendasta-meetings.js.map +0 -1
  176. package/lib/_internal/meetings.module.d.ts +0 -2
  177. package/lib/guest/guest.module.d.ts +0 -2
  178. package/lib/host/host.module.d.ts +0 -2
  179. package/lib/meetings.module.d.ts +0 -2
  180. package/vendasta-meetings.metadata.json +0 -1
@@ -0,0 +1,1485 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVldGluZy1ob3N0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbWVldGluZ3Nfc2RrL3NyYy9saWIvX2ludGVybmFsL29iamVjdHMvbWVldGluZy1ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUosT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEtBQUssQ0FBQyxNQUFNLFVBQVUsQ0FBQztBQUU5QixNQUFNLFVBQVUsaUJBQWlCLENBQUksT0FBWSxFQUFFLEtBQWE7SUFDOUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLE9BQU8sbURBQW1EO0lBVTVELFlBQVksTUFBdUU7UUFDL0UsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU87U0FDVjtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFYRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxtREFBbUQsRUFBRSxDQUFDO1FBQ2xFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFD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SUFBSSxFQUFFO1lBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsU0FBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUFDO1FBQ3JMLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gQ29kZSBnZW5lcmF0ZWQgYnkgc2RrZ2VuXG4vLyBETyBOT1QgRURJVCEuXG4vL1xuLy8gT2JqZWN0cy5cbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuaW1wb3J0ICogYXMgaSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4vZGF0ZS1yYW5nZSc7XG5pbXBvcnQgeyBGaWVsZE1hc2sgfSBmcm9tICcuL2ZpZWxkLW1hc2snO1xuaW1wb3J0IHsgTWVldGluZ1R5cGUgfSBmcm9tICcuL21lZXRpbmctdHlwZSc7XG5pbXBvcnQgeyBUaW1lUmFuZ2UsIENhbGVuZGFyLCBQcmVmZXJlbmNlcywgSG9zdFVzZXIsIENvbnRhY3QsIFBhZ2VkUmVxdWVzdE9wdGlvbnMsIFBhZ2VkUmVzcG9uc2VNZXRhZGF0YSwgQXR0ZW5kZWUsIEFuc3dlcnMsIEF0dGFjaG1lbnQgfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBUaW1lWm9uZSB9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0ICogYXMgZSBmcm9tICcuLi9lbnVtcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnVtU3RyaW5nVG9WYWx1ZTxFPihlbnVtUmVmOiBhbnksIHZhbHVlOiBzdHJpbmcpOiBFIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGVudW1SZWZbdmFsdWVdO1xufVxuXG5leHBvcnQgY2xhc3MgQnVpbGRIb3N0SWRSZXF1ZXN0QXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc0VudHJ5IGltcGxlbWVudHMgaS5CdWlsZEhvc3RJZFJlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBCdWlsZEhvc3RJZFJlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBCdWlsZEhvc3RJZFJlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkJ1aWxkSG9zdElkUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWUnXSA9IHRoaXMudmFsdWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnkgaW1wbGVtZW50cyBpLkVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXF1ZXN0QXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc0VudHJ5SW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdEFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXNFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3RBcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzRW50cnlJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZhbHVlJ10gPSB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF2YWlsYWJpbGl0eVJ1bGUgaW1wbGVtZW50cyBpLkF2YWlsYWJpbGl0eVJ1bGVJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuICAgIG1lZXRpbmdUeXBlSWQ6IHN0cmluZztcbiAgICBkYXk6IGUuRGF5T2ZXZWVrO1xuICAgIHRpbWVTbG90OiBUaW1lUmFuZ2U7XG4gICAgdGltZVpvbmU6IFRpbWVab25lO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQXZhaWxhYmlsaXR5UnVsZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEF2YWlsYWJpbGl0eVJ1bGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZGF5KSB7bS5kYXkgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkRheU9mV2Vlaz4oZS5EYXlPZldlZWssIHByb3RvLmRheSk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVNsb3QpIHttLnRpbWVTbG90ID0gVGltZVJhbmdlLmZyb21Qcm90byhwcm90by50aW1lU2xvdCk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVpvbmUpIHttLnRpbWVab25lID0gVGltZVpvbmUuZnJvbVByb3RvKHByb3RvLnRpbWVab25lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQXZhaWxhYmlsaXR5UnVsZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZUlkJ10gPSB0aGlzLm1lZXRpbmdUeXBlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkYXknXSA9IHRoaXMuZGF5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVTbG90ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRpbWVTbG90ICE9PSBudWxsKSB7dG9SZXR1cm5bJ3RpbWVTbG90J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnRpbWVTbG90ID8gKHRoaXMudGltZVNsb3QgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudGltZVNsb3Q7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVpvbmUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVpvbmUgIT09IG51bGwpIHt0b1JldHVyblsndGltZVpvbmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVpvbmUgPyAodGhpcy50aW1lWm9uZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lWm9uZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZEhvc3RJZFJlcXVlc3QgaW1wbGVtZW50cyBpLkJ1aWxkSG9zdElkUmVxdWVzdEludGVyZmFjZSB7XG4gICAgYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gICAgdXNlcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBCdWlsZEhvc3RJZFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBCdWlsZEhvc3RJZFJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcykge20uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3RvLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMpLnJlZHVjZTxhbnk+KChvYmosIGspID0+IHsgb2JqW2tdID0gcHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1trXTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5CdWlsZEhvc3RJZFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzID8gKHRoaXMuYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcklkJ10gPSB0aGlzLnVzZXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCdWlsZEhvc3RJZFJlc3BvbnNlIGltcGxlbWVudHMgaS5CdWlsZEhvc3RJZFJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEJ1aWxkSG9zdElkUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBCdWlsZEhvc3RJZFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5CdWlsZEhvc3RJZFJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlQ2FsZW5kYXJNZWV0aW5nVHlwZXNNYXBFbnRyeSBpbXBsZW1lbnRzIGkuR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2VDYWxlbmRhck1lZXRpbmdUeXBlc01hcEVudHJ5SW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogTWVldGluZ1R5cGVMaXN0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2VDYWxlbmRhck1lZXRpbmdUeXBlc01hcEVudHJ5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2VDYWxlbmRhck1lZXRpbmdUeXBlc01hcEVudHJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnZhbHVlKSB7bS52YWx1ZSA9IE1lZXRpbmdUeXBlTGlzdC5mcm9tUHJvdG8ocHJvdG8udmFsdWUpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUNhbGVuZGFyTWVldGluZ1R5cGVzTWFwRW50cnlJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudmFsdWUgIT09IG51bGwpIHt0b1JldHVyblsndmFsdWUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudmFsdWUgPyAodGhpcy52YWx1ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYW5jZWxNZWV0aW5nUmVxdWVzdCBpbXBsZW1lbnRzIGkuQ2FuY2VsTWVldGluZ1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdJZDogc3RyaW5nO1xuICAgIGNhbmNlbGxhdGlvblJlYXNvbjogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ2FuY2VsTWVldGluZ1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDYW5jZWxNZWV0aW5nUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ2FuY2VsTWVldGluZ1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdJZCddID0gdGhpcy5tZWV0aW5nSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FuY2VsbGF0aW9uUmVhc29uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYW5jZWxsYXRpb25SZWFzb24nXSA9IHRoaXMuY2FuY2VsbGF0aW9uUmVhc29uO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUF2YWlsYWJpbGl0eVJlcXVlc3QgaW1wbGVtZW50cyBpLkNyZWF0ZUF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2Uge1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlQXZhaWxhYmlsaXR5UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZUF2YWlsYWJpbGl0eVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNyZWF0ZUF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVBdmFpbGFiaWxpdHlSZXNwb25zZSBpbXBsZW1lbnRzIGkuQ3JlYXRlQXZhaWxhYmlsaXR5UmVzcG9uc2VJbnRlcmZhY2Uge1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlQXZhaWxhYmlsaXR5UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVBdmFpbGFiaWxpdHlSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlQXZhaWxhYmlsaXR5UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVDYWxlbmRhclJlcXVlc3QgaW1wbGVtZW50cyBpLkNyZWF0ZUNhbGVuZGFyUmVxdWVzdEludGVyZmFjZSB7XG4gICAgY2FsZW5kYXI6IENhbGVuZGFyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlQ2FsZW5kYXJSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ3JlYXRlQ2FsZW5kYXJSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNhbGVuZGFyKSB7bS5jYWxlbmRhciA9IENhbGVuZGFyLmZyb21Qcm90byhwcm90by5jYWxlbmRhcik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNyZWF0ZUNhbGVuZGFyUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFyICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNhbGVuZGFyICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NhbGVuZGFyJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNhbGVuZGFyID8gKHRoaXMuY2FsZW5kYXIgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY2FsZW5kYXI7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZSBpbXBsZW1lbnRzIGkuQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZUludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlQ2FsZW5kYXJSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZUNhbGVuZGFyUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNyZWF0ZUNhbGVuZGFyUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhcklkJ10gPSB0aGlzLmNhbGVuZGFySWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlc1JlcXVlc3QgaW1wbGVtZW50cyBpLkNyZWF0ZURlZmF1bHRNZWV0aW5nVHlwZXNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkOiBzdHJpbmc7XG4gICAgY2FsZW5kYXJJZHM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVEZWZhdWx0TWVldGluZ1R5cGVzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlRGVmYXVsdE1lZXRpbmdUeXBlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhcklkJ10gPSB0aGlzLmNhbGVuZGFySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWRzJ10gPSB0aGlzLmNhbGVuZGFySWRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZU1lZXRpbmdUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIGkuQ3JlYXRlTWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nVHlwZTogTWVldGluZ1R5cGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBDcmVhdGVNZWV0aW5nVHlwZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVNZWV0aW5nVHlwZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ1R5cGUpIHttLm1lZXRpbmdUeXBlID0gTWVldGluZ1R5cGUuZnJvbVByb3RvKHByb3RvLm1lZXRpbmdUeXBlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlTWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWVldGluZ1R5cGUgIT09IG51bGwpIHt0b1JldHVyblsnbWVldGluZ1R5cGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWVldGluZ1R5cGUgPyAodGhpcy5tZWV0aW5nVHlwZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5tZWV0aW5nVHlwZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVNZWV0aW5nVHlwZVJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVNZWV0aW5nVHlwZVJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlTWVldGluZ1R5cGVSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IENyZWF0ZU1lZXRpbmdUeXBlUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNyZWF0ZU1lZXRpbmdUeXBlUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaWQnXSA9IHRoaXMuaWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVsZXRlQXZhaWxhYmlsaXR5UmVxdWVzdCBpbXBsZW1lbnRzIGkuRGVsZXRlQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSB7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVBdmFpbGFiaWxpdHlSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRGVsZXRlQXZhaWxhYmlsaXR5UmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRGVsZXRlQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlbGV0ZU1lZXRpbmdUeXBlUmVxdWVzdCBpbXBsZW1lbnRzIGkuRGVsZXRlTWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBpZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRGVsZXRlTWVldGluZ1R5cGVSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRGVsZXRlTWVldGluZ1R5cGVSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5EZWxldGVNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaWQnXSA9IHRoaXMuaWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9lc0NhbGVuZGFyRXhpc3RSZXF1ZXN0IGltcGxlbWVudHMgaS5Eb2VzQ2FsZW5kYXJFeGlzdFJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWRlbnRpZmllcjogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRG9lc0NhbGVuZGFyRXhpc3RSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRG9lc0NhbGVuZGFyRXhpc3RSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Eb2VzQ2FsZW5kYXJFeGlzdFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWRlbnRpZmllciddID0gdGhpcy5jYWxlbmRhcklkZW50aWZpZXI7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9lc0NhbGVuZGFyRXhpc3RSZXNwb25zZSBpbXBsZW1lbnRzIGkuRG9lc0NhbGVuZGFyRXhpc3RSZXNwb25zZUludGVyZmFjZSB7XG4gICAgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRG9lc0NhbGVuZGFyRXhpc3RSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IERvZXNDYWxlbmRhckV4aXN0UmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkRvZXNDYWxlbmRhckV4aXN0UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leGlzdHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2V4aXN0cyddID0gdGhpcy5leGlzdHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlcXVlc3QgaW1wbGVtZW50cyBpLkVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBleHRlcm5hbElkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBFbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5FbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmV4dGVybmFsSWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydleHRlcm5hbElkcyddID0gdGhpcy5leHRlcm5hbElkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVzcG9uc2UgaW1wbGVtZW50cyBpLkVuc3VyZUdyb3VwQ2FsZW5kYXJzRXhpc3RSZXNwb25zZUludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZHM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRW5zdXJlR3JvdXBDYWxlbmRhcnNFeGlzdFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5FbnN1cmVHcm91cENhbGVuZGFyc0V4aXN0UmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZHMnXSA9IHRoaXMuY2FsZW5kYXJJZHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3QgaW1wbGVtZW50cyBpLkVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBhcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcykge20uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKHByb3RvLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMpLnJlZHVjZTxhbnk+KChvYmosIGspID0+IHsgb2JqW2tdID0gcHJvdG8uYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllc1trXTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5FbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndXNlcklkJ10gPSB0aGlzLnVzZXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmFwcGxpY2F0aW9uQ29udGV4dFByb3BlcnRpZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzID8gKHRoaXMuYXBwbGljYXRpb25Db250ZXh0UHJvcGVydGllcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hcHBsaWNhdGlvbkNvbnRleHRQcm9wZXJ0aWVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXNwb25zZSBpbXBsZW1lbnRzIGkuRW5zdXJlUGVyc29uYWxDYWxlbmRhckV4aXN0c1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBFbnN1cmVQZXJzb25hbENhbGVuZGFyRXhpc3RzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkVuc3VyZVBlcnNvbmFsQ2FsZW5kYXJFeGlzdHNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnMgaW1wbGVtZW50cyBpLkxpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZSB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGVJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RGaWx0ZXJzKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ1R5cGVJZCddID0gdGhpcy5tZWV0aW5nVHlwZUlkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzIGltcGxlbWVudHMgaS5MaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZSB7XG4gICAgbWVldGluZ1R5cGVJZHM6IHN0cmluZ1tdO1xuICAgIGhvc3RJZDogc3RyaW5nO1xuICAgIHRpbWVTcGFuOiBEYXRlUmFuZ2U7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVycyB7XG4gICAgICAgIGxldCBtID0gbmV3IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RGaWx0ZXJzKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnRpbWVTcGFuKSB7bS50aW1lU3BhbiA9IERhdGVSYW5nZS5mcm9tUHJvdG8ocHJvdG8udGltZVNwYW4pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVyc0ludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlSWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZUlkcyddID0gdGhpcy5tZWV0aW5nVHlwZUlkczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVNwYW4gIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVNwYW4gIT09IG51bGwpIHt0b1JldHVyblsndGltZVNwYW4nXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVNwYW4gPyAodGhpcy50aW1lU3BhbiBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lU3Bhbjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRIb3N0TWVldGluZ1JlcXVlc3QgaW1wbGVtZW50cyBpLkdldEhvc3RNZWV0aW5nUmVxdWVzdEludGVyZmFjZSB7XG4gICAgbWVldGluZ0lkOiBzdHJpbmc7XG4gICAgbG9jYXRpb246IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldEhvc3RNZWV0aW5nUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldEhvc3RNZWV0aW5nUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0SG9zdE1lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nSWQnXSA9IHRoaXMubWVldGluZ0lkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydsb2NhdGlvbiddID0gdGhpcy5sb2NhdGlvbjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRIb3N0TWVldGluZ1Jlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRIb3N0TWVldGluZ1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nOiBNZWV0aW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0SG9zdE1lZXRpbmdSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldEhvc3RNZWV0aW5nUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZykge20ubWVldGluZyA9IE1lZXRpbmcuZnJvbVByb3RvKHByb3RvLm1lZXRpbmcpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0TWVldGluZ1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZWV0aW5nICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lZXRpbmcnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWVldGluZyA/ICh0aGlzLm1lZXRpbmcgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVldGluZzt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0IGltcGxlbWVudHMgaS5HZXRIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldEhvc3RQcmVmZXJlbmNlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEhvc3RQcmVmZXJlbmNlc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRIb3N0UHJlZmVyZW5jZXNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgcHJlZmVyZW5jZXM6IFByZWZlcmVuY2VzO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0SG9zdFByZWZlcmVuY2VzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRIb3N0UHJlZmVyZW5jZXNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wcmVmZXJlbmNlcykge20ucHJlZmVyZW5jZXMgPSBQcmVmZXJlbmNlcy5mcm9tUHJvdG8ocHJvdG8ucHJlZmVyZW5jZXMpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0UHJlZmVyZW5jZXNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZWZlcmVuY2VzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByZWZlcmVuY2VzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3ByZWZlcmVuY2VzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnByZWZlcmVuY2VzID8gKHRoaXMucHJlZmVyZW5jZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucHJlZmVyZW5jZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0SG9zdHNGb3JDYWxlbmRhclJlcXVlc3QgaW1wbGVtZW50cyBpLkdldEhvc3RzRm9yQ2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRIb3N0c0ZvckNhbGVuZGFyUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldEhvc3RzRm9yQ2FsZW5kYXJSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0c0ZvckNhbGVuZGFyUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRIb3N0c0ZvckNhbGVuZGFyUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldEhvc3RzRm9yQ2FsZW5kYXJSZXNwb25zZUludGVyZmFjZSB7XG4gICAgaG9zdFVzZXJzOiBIb3N0VXNlcltdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0SG9zdHNGb3JDYWxlbmRhclJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0SG9zdHNGb3JDYWxlbmRhclJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmhvc3RVc2Vycykge20uaG9zdFVzZXJzID0gcHJvdG8uaG9zdFVzZXJzLm1hcChIb3N0VXNlci5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRIb3N0c0ZvckNhbGVuZGFyUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0VXNlcnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuaG9zdFVzZXJzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2hvc3RVc2VycyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5ob3N0VXNlcnMgPyAodGhpcy5ob3N0VXNlcnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuaG9zdFVzZXJzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1JlcXVlc3QgaW1wbGVtZW50cyBpLkdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWRzOiBzdHJpbmdbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWRzJ10gPSB0aGlzLmNhbGVuZGFySWRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE1lZXRpbmdUeXBlc0ZvckNhbGVuZGFyc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXA6IHtba2V5OiBzdHJpbmddOiBNZWV0aW5nVHlwZUxpc3R9O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TWVldGluZ1R5cGVzRm9yQ2FsZW5kYXJzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5jYWxlbmRhck1lZXRpbmdUeXBlc01hcCkge20uY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAgPSBPYmplY3Qua2V5cyhwcm90by5jYWxlbmRhck1lZXRpbmdUeXBlc01hcCkucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBNZWV0aW5nVHlwZUxpc3QuZnJvbVByb3RvKHByb3RvLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwW2tdKTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNZWV0aW5nVHlwZXNGb3JDYWxlbmRhcnNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NhbGVuZGFyTWVldGluZ1R5cGVzTWFwJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNhbGVuZGFyTWVldGluZ1R5cGVzTWFwID8gKHRoaXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXAgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY2FsZW5kYXJNZWV0aW5nVHlwZXNNYXA7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9zdEJvb2tNZWV0aW5nUmVxdWVzdCBpbXBsZW1lbnRzIGkuSG9zdEJvb2tNZWV0aW5nUmVxdWVzdEludGVyZmFjZSB7XG4gICAgbWVldGluZ1NvdXJjZTogZS5NZWV0aW5nU291cmNlO1xuICAgIGNhbGVuZGFySWQ6IHN0cmluZztcbiAgICBtZWV0aW5nVHlwZUlkOiBzdHJpbmc7XG4gICAgdGltZVNsb3Q6IERhdGVSYW5nZTtcbiAgICBhdHRlbmRlZXM6IENvbnRhY3RbXTtcbiAgICB0b3BpYzogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdEJvb2tNZWV0aW5nUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RCb29rTWVldGluZ1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ1NvdXJjZSkge20ubWVldGluZ1NvdXJjZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuTWVldGluZ1NvdXJjZT4oZS5NZWV0aW5nU291cmNlLCBwcm90by5tZWV0aW5nU291cmNlKTt9XG4gICAgICAgIGlmIChwcm90by50aW1lU2xvdCkge20udGltZVNsb3QgPSBEYXRlUmFuZ2UuZnJvbVByb3RvKHByb3RvLnRpbWVTbG90KTt9XG4gICAgICAgIGlmIChwcm90by5hdHRlbmRlZXMpIHttLmF0dGVuZGVlcyA9IHByb3RvLmF0dGVuZGVlcy5tYXAoQ29udGFjdC5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0Qm9va01lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1NvdXJjZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ1NvdXJjZSddID0gdGhpcy5tZWV0aW5nU291cmNlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NhbGVuZGFySWQnXSA9IHRoaXMuY2FsZW5kYXJJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nVHlwZUlkJ10gPSB0aGlzLm1lZXRpbmdUeXBlSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVNsb3QgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVNsb3QgIT09IG51bGwpIHt0b1JldHVyblsndGltZVNsb3QnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVNsb3QgPyAodGhpcy50aW1lU2xvdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lU2xvdDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRlbmRlZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXR0ZW5kZWVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dGVuZGVlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hdHRlbmRlZXMgPyAodGhpcy5hdHRlbmRlZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0ZW5kZWVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRvcGljICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0b3BpYyddID0gdGhpcy50b3BpYzt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0Qm9va01lZXRpbmdSZXNwb25zZSBpbXBsZW1lbnRzIGkuSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBIb3N0Qm9va01lZXRpbmdSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSG9zdEJvb2tNZWV0aW5nUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZXRpbmdJZCddID0gdGhpcy5tZWV0aW5nSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9zdEdldENhbGVuZGFyUmVxdWVzdCBpbXBsZW1lbnRzIGkuSG9zdEdldENhbGVuZGFyUmVxdWVzdEludGVyZmFjZSB7XG4gICAgY2FsZW5kYXJJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSG9zdEdldENhbGVuZGFyUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RHZXRDYWxlbmRhclJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkhvc3RHZXRDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jYWxlbmRhcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhcklkJ10gPSB0aGlzLmNhbGVuZGFySWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSG9zdEdldENhbGVuZGFyUmVzcG9uc2UgaW1wbGVtZW50cyBpLkhvc3RHZXRDYWxlbmRhclJlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhcjogQ2FsZW5kYXI7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBIb3N0R2V0Q2FsZW5kYXJSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RHZXRDYWxlbmRhclJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNhbGVuZGFyKSB7bS5jYWxlbmRhciA9IENhbGVuZGFyLmZyb21Qcm90byhwcm90by5jYWxlbmRhcik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkhvc3RHZXRDYWxlbmRhclJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXIgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY2FsZW5kYXIgIT09IG51bGwpIHt0b1JldHVyblsnY2FsZW5kYXInXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY2FsZW5kYXIgPyAodGhpcy5jYWxlbmRhciBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jYWxlbmRhcjt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0R2V0TWVldGluZ1R5cGVSZXF1ZXN0IGltcGxlbWVudHMgaS5Ib3N0R2V0TWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjYWxlbmRhclNsdWc6IHN0cmluZztcbiAgICBtZWV0aW5nVHlwZVNsdWc6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEhvc3RHZXRNZWV0aW5nVHlwZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBIb3N0R2V0TWVldGluZ1R5cGVSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0R2V0TWVldGluZ1R5cGVSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJTbHVnICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjYWxlbmRhclNsdWcnXSA9IHRoaXMuY2FsZW5kYXJTbHVnO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdUeXBlU2x1ZyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ1R5cGVTbHVnJ10gPSB0aGlzLm1lZXRpbmdUeXBlU2x1Zzt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb3N0R2V0TWVldGluZ1R5cGVSZXNwb25zZSBpbXBsZW1lbnRzIGkuSG9zdEdldE1lZXRpbmdUeXBlUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdUeXBlOiBNZWV0aW5nVHlwZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEhvc3RHZXRNZWV0aW5nVHlwZVJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgSG9zdEdldE1lZXRpbmdUeXBlUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ1R5cGUpIHttLm1lZXRpbmdUeXBlID0gTWVldGluZ1R5cGUuZnJvbVByb3RvKHByb3RvLm1lZXRpbmdUeXBlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSG9zdEdldE1lZXRpbmdUeXBlUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZWV0aW5nVHlwZSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5nVHlwZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nVHlwZSA/ICh0aGlzLm1lZXRpbmdUeXBlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdUeXBlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhvc3RMaXN0TWVldGluZ1R5cGVzUmVxdWVzdCBpbXBsZW1lbnRzIGkuSG9zdExpc3RNZWV0aW5nVHlwZXNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEhvc3RMaXN0TWVldGluZ1R5cGVzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEhvc3RMaXN0TWVldGluZ1R5cGVzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSG9zdExpc3RNZWV0aW5nVHlwZXNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhvc3RMaXN0TWVldGluZ1R5cGVzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkhvc3RMaXN0TWVldGluZ1R5cGVzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdUeXBlczogTWVldGluZ1R5cGVbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEhvc3RMaXN0TWVldGluZ1R5cGVzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBIb3N0TGlzdE1lZXRpbmdUeXBlc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm1lZXRpbmdUeXBlcykge20ubWVldGluZ1R5cGVzID0gcHJvdG8ubWVldGluZ1R5cGVzLm1hcChNZWV0aW5nVHlwZS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5Ib3N0TGlzdE1lZXRpbmdUeXBlc1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmdUeXBlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5nVHlwZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWVldGluZ1R5cGVzID8gKHRoaXMubWVldGluZ1R5cGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdUeXBlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJc0hvc3RDb25maWd1cmVkUmVxdWVzdCBpbXBsZW1lbnRzIGkuSXNIb3N0Q29uZmlndXJlZFJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGhvc3RJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogSXNIb3N0Q29uZmlndXJlZFJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBJc0hvc3RDb25maWd1cmVkUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSXNIb3N0Q29uZmlndXJlZFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgSXNIb3N0Q29uZmlndXJlZFJlc3BvbnNlIGltcGxlbWVudHMgaS5Jc0hvc3RDb25maWd1cmVkUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGlzQ29uZmlndXJlZDogYm9vbGVhbjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IElzSG9zdENvbmZpZ3VyZWRSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IElzSG9zdENvbmZpZ3VyZWRSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuSXNIb3N0Q29uZmlndXJlZFJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNDb25maWd1cmVkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpc0NvbmZpZ3VyZWQnXSA9IHRoaXMuaXNDb25maWd1cmVkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0IGltcGxlbWVudHMgaS5MaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSB7XG4gICAgcGFnaW5nT3B0aW9uczogUGFnZWRSZXF1ZXN0T3B0aW9ucztcbiAgICBmaWx0ZXJzOiBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdEZpbHRlcnM7XG4gICAgdGltZVpvbmU6IFRpbWVab25lO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0QXZhaWxhYmlsaXR5UmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wYWdpbmdPcHRpb25zKSB7bS5wYWdpbmdPcHRpb25zID0gUGFnZWRSZXF1ZXN0T3B0aW9ucy5mcm9tUHJvdG8ocHJvdG8ucGFnaW5nT3B0aW9ucyk7fVxuICAgICAgICBpZiAocHJvdG8uZmlsdGVycykge20uZmlsdGVycyA9IExpc3RBdmFpbGFiaWxpdHlSZXF1ZXN0RmlsdGVycy5mcm9tUHJvdG8ocHJvdG8uZmlsdGVycyk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVpvbmUpIHttLnRpbWVab25lID0gVGltZVpvbmUuZnJvbVByb3RvKHByb3RvLnRpbWVab25lKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdEF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYWdpbmdPcHRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhZ2luZ09wdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsncGFnaW5nT3B0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wYWdpbmdPcHRpb25zID8gKHRoaXMucGFnaW5nT3B0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYWdpbmdPcHRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbHRlcnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZmlsdGVycyAhPT0gbnVsbCkge3RvUmV0dXJuWydmaWx0ZXJzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmZpbHRlcnMgPyAodGhpcy5maWx0ZXJzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZpbHRlcnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVpvbmUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVpvbmUgIT09IG51bGwpIHt0b1JldHVyblsndGltZVpvbmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVpvbmUgPyAodGhpcy50aW1lWm9uZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lWm9uZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0QXZhaWxhYmlsaXR5UmVzcG9uc2UgaW1wbGVtZW50cyBpLkxpc3RBdmFpbGFiaWxpdHlSZXNwb25zZUludGVyZmFjZSB7XG4gICAgYXZhaWxhYmlsaXR5UnVsZXM6IEF2YWlsYWJpbGl0eVJ1bGVbXTtcbiAgICBtZXRhZGF0YTogUGFnZWRSZXNwb25zZU1ldGFkYXRhO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdEF2YWlsYWJpbGl0eVJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTGlzdEF2YWlsYWJpbGl0eVJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmF2YWlsYWJpbGl0eVJ1bGVzKSB7bS5hdmFpbGFiaWxpdHlSdWxlcyA9IHByb3RvLmF2YWlsYWJpbGl0eVJ1bGVzLm1hcChBdmFpbGFiaWxpdHlSdWxlLmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8ubWV0YWRhdGEpIHttLm1ldGFkYXRhID0gUGFnZWRSZXNwb25zZU1ldGFkYXRhLmZyb21Qcm90byhwcm90by5tZXRhZGF0YSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RBdmFpbGFiaWxpdHlSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF2YWlsYWJpbGl0eVJ1bGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmF2YWlsYWJpbGl0eVJ1bGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F2YWlsYWJpbGl0eVJ1bGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF2YWlsYWJpbGl0eVJ1bGVzID8gKHRoaXMuYXZhaWxhYmlsaXR5UnVsZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXZhaWxhYmlsaXR5UnVsZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWV0YWRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMubWV0YWRhdGEgIT09IG51bGwpIHt0b1JldHVyblsnbWV0YWRhdGEnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWV0YWRhdGEgPyAodGhpcy5tZXRhZGF0YSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5tZXRhZGF0YTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0IGltcGxlbWVudHMgaS5MaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBmaWx0ZXJzOiBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVycztcbiAgICBwYWdpbmdPcHRpb25zOiBQYWdlZFJlcXVlc3RPcHRpb25zO1xuICAgIHRpbWVab25lOiBUaW1lWm9uZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmZpbHRlcnMpIHttLmZpbHRlcnMgPSBMaXN0Qm9va2VkTWVldGluZ3NSZXF1ZXN0RmlsdGVycy5mcm9tUHJvdG8ocHJvdG8uZmlsdGVycyk7fVxuICAgICAgICBpZiAocHJvdG8ucGFnaW5nT3B0aW9ucykge20ucGFnaW5nT3B0aW9ucyA9IFBhZ2VkUmVxdWVzdE9wdGlvbnMuZnJvbVByb3RvKHByb3RvLnBhZ2luZ09wdGlvbnMpO31cbiAgICAgICAgaWYgKHByb3RvLnRpbWVab25lKSB7bS50aW1lWm9uZSA9IFRpbWVab25lLmZyb21Qcm90byhwcm90by50aW1lWm9uZSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RCb29rZWRNZWV0aW5nc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpbHRlcnMgIT09IG51bGwpIHt0b1JldHVyblsnZmlsdGVycyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5maWx0ZXJzID8gKHRoaXMuZmlsdGVycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5maWx0ZXJzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2luZ09wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nT3B0aW9ucyAhPT0gbnVsbCkge3RvUmV0dXJuWydwYWdpbmdPcHRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhZ2luZ09wdGlvbnMgPyAodGhpcy5wYWdpbmdPcHRpb25zIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBhZ2luZ09wdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudGltZVpvbmUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZVpvbmUgIT09IG51bGwpIHt0b1JldHVyblsndGltZVpvbmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudGltZVpvbmUgPyAodGhpcy50aW1lWm9uZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lWm9uZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXN0Qm9va2VkTWVldGluZ3NSZXNwb25zZSBpbXBsZW1lbnRzIGkuTGlzdEJvb2tlZE1lZXRpbmdzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdzOiBNZWV0aW5nW107XG4gICAgcGFnaW5nTWV0YWRhdGE6IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RCb29rZWRNZWV0aW5nc1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTGlzdEJvb2tlZE1lZXRpbmdzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubWVldGluZ3MpIHttLm1lZXRpbmdzID0gcHJvdG8ubWVldGluZ3MubWFwKE1lZXRpbmcuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5wYWdpbmdNZXRhZGF0YSkge20ucGFnaW5nTWV0YWRhdGEgPSBQYWdlZFJlc3BvbnNlTWV0YWRhdGEuZnJvbVByb3RvKHByb3RvLnBhZ2luZ01ldGFkYXRhKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdEJvb2tlZE1lZXRpbmdzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5ncyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZWV0aW5ncyAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5ncyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5ncyA/ICh0aGlzLm1lZXRpbmdzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2luZ01ldGFkYXRhICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhZ2luZ01ldGFkYXRhICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhZ2luZ01ldGFkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhZ2luZ01ldGFkYXRhID8gKHRoaXMucGFnaW5nTWV0YWRhdGEgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFnaW5nTWV0YWRhdGE7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWVldGluZyBpbXBsZW1lbnRzIGkuTWVldGluZ0ludGVyZmFjZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBldmVudFR5cGVJZDogc3RyaW5nO1xuICAgIGhvc3RJZDogc3RyaW5nO1xuICAgIHN0YXJ0OiBEYXRlO1xuICAgIGVuZDogRGF0ZTtcbiAgICBjcmVhdGVkOiBEYXRlO1xuICAgIHVwZGF0ZWQ6IERhdGU7XG4gICAgYXR0ZW5kZWVzOiBBdHRlbmRlZVtdO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgam9pbk1lZXRpbmdVcmw6IHN0cmluZztcbiAgICB0b3BpYzogc3RyaW5nO1xuICAgIGZvcm1BbnN3ZXJzOiBBbnN3ZXJzO1xuICAgIG1ldGFkYXRhOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudFtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTWVldGluZyB7XG4gICAgICAgIGxldCBtID0gbmV3IE1lZXRpbmcoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc3RhcnQpIHttLnN0YXJ0ID0gbmV3IERhdGUocHJvdG8uc3RhcnQpO31cbiAgICAgICAgaWYgKHByb3RvLmVuZCkge20uZW5kID0gbmV3IERhdGUocHJvdG8uZW5kKTt9XG4gICAgICAgIGlmIChwcm90by5jcmVhdGVkKSB7bS5jcmVhdGVkID0gbmV3IERhdGUocHJvdG8uY3JlYXRlZCk7fVxuICAgICAgICBpZiAocHJvdG8udXBkYXRlZCkge20udXBkYXRlZCA9IG5ldyBEYXRlKHByb3RvLnVwZGF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLmF0dGVuZGVlcykge20uYXR0ZW5kZWVzID0gcHJvdG8uYXR0ZW5kZWVzLm1hcChBdHRlbmRlZS5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmZvcm1BbnN3ZXJzKSB7bS5mb3JtQW5zd2VycyA9IEFuc3dlcnMuZnJvbVByb3RvKHByb3RvLmZvcm1BbnN3ZXJzKTt9XG4gICAgICAgIGlmIChwcm90by5tZXRhZGF0YSkge20ubWV0YWRhdGEgPSBPYmplY3Qua2V5cyhwcm90by5tZXRhZGF0YSkucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwcm90by5tZXRhZGF0YVtrXTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgaWYgKHByb3RvLmF0dGFjaG1lbnRzKSB7bS5hdHRhY2htZW50cyA9IHByb3RvLmF0dGFjaG1lbnRzLm1hcChBdHRhY2htZW50LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk1lZXRpbmdJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaWQnXSA9IHRoaXMuaWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXZlbnRUeXBlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2V2ZW50VHlwZUlkJ10gPSB0aGlzLmV2ZW50VHlwZUlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhvc3RJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaG9zdElkJ10gPSB0aGlzLmhvc3RJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGFydCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdGFydCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdGFydCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdGFydCA/ICh0aGlzLnN0YXJ0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0YXJ0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVuZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5lbmQgIT09IG51bGwpIHt0b1JldHVyblsnZW5kJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmVuZCA/ICh0aGlzLmVuZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5lbmQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY3JlYXRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jcmVhdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NyZWF0ZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY3JlYXRlZCA/ICh0aGlzLmNyZWF0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY3JlYXRlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cGRhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnVwZGF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsndXBkYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy51cGRhdGVkID8gKHRoaXMudXBkYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy51cGRhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dGVuZGVlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRlbmRlZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXR0ZW5kZWVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF0dGVuZGVlcyA/ICh0aGlzLmF0dGVuZGVlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdHRlbmRlZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2Rlc2NyaXB0aW9uJ10gPSB0aGlzLmRlc2NyaXB0aW9uO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmpvaW5NZWV0aW5nVXJsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydqb2luTWVldGluZ1VybCddID0gdGhpcy5qb2luTWVldGluZ1VybDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50b3BpYyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndG9waWMnXSA9IHRoaXMudG9waWM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybUFuc3dlcnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZm9ybUFuc3dlcnMgIT09IG51bGwpIHt0b1JldHVyblsnZm9ybUFuc3dlcnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZm9ybUFuc3dlcnMgPyAodGhpcy5mb3JtQW5zd2VycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5mb3JtQW5zd2Vyczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXRhZGF0YSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZXRhZGF0YSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZXRhZGF0YSA/ICh0aGlzLm1ldGFkYXRhIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1ldGFkYXRhO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dGFjaG1lbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmF0dGFjaG1lbnRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dGFjaG1lbnRzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF0dGFjaG1lbnRzID8gKHRoaXMuYXR0YWNobWVudHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0YWNobWVudHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWVldGluZ1R5cGVMaXN0IGltcGxlbWVudHMgaS5NZWV0aW5nVHlwZUxpc3RJbnRlcmZhY2Uge1xuICAgIG1lZXRpbmdUeXBlczogTWVldGluZ1R5cGVbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IE1lZXRpbmdUeXBlTGlzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IE1lZXRpbmdUeXBlTGlzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZWV0aW5nVHlwZXMpIHttLm1lZXRpbmdUeXBlcyA9IHByb3RvLm1lZXRpbmdUeXBlcy5tYXAoTWVldGluZ1R5cGUuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTWVldGluZ1R5cGVMaXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lZXRpbmdUeXBlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5nVHlwZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWVldGluZ1R5cGVzID8gKHRoaXMubWVldGluZ1R5cGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdUeXBlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZWV0aW5nTWV0YWRhdGFFbnRyeSBpbXBsZW1lbnRzIGkuTWVldGluZ01ldGFkYXRhRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBNZWV0aW5nTWV0YWRhdGFFbnRyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IE1lZXRpbmdNZXRhZGF0YUVudHJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5NZWV0aW5nTWV0YWRhdGFFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWUnXSA9IHRoaXMudmFsdWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlTWVldGluZ01ldGFkYXRhUmVxdWVzdE1ldGFkYXRhRW50cnkgaW1wbGVtZW50cyBpLlVwZGF0ZU1lZXRpbmdNZXRhZGF0YVJlcXVlc3RNZXRhZGF0YUVudHJ5SW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogVXBkYXRlTWVldGluZ01ldGFkYXRhUmVxdWVzdE1ldGFkYXRhRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0TWV0YWRhdGFFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVXBkYXRlTWVldGluZ01ldGFkYXRhUmVxdWVzdE1ldGFkYXRhRW50cnlJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZhbHVlJ10gPSB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlc2NoZWR1bGVNZWV0aW5nUmVxdWVzdCBpbXBsZW1lbnRzIGkuUmVzY2hlZHVsZU1lZXRpbmdSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nSWQ6IHN0cmluZztcbiAgICBzdGFydDogRGF0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFJlc2NoZWR1bGVNZWV0aW5nUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IFJlc2NoZWR1bGVNZWV0aW5nUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdGFydCkge20uc3RhcnQgPSBuZXcgRGF0ZShwcm90by5zdGFydCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlJlc2NoZWR1bGVNZWV0aW5nUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lZXRpbmdJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ0lkJ10gPSB0aGlzLm1lZXRpbmdJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdGFydCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdGFydCAhPT0gbnVsbCkge3RvUmV0dXJuWydzdGFydCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdGFydCA/ICh0aGlzLnN0YXJ0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnN0YXJ0O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldEdlbmVyYWxBdmFpbGFiaWxpdHlSZXF1ZXN0IGltcGxlbWVudHMgaS5TZXRHZW5lcmFsQXZhaWxhYmlsaXR5UmVxdWVzdEludGVyZmFjZSB7XG4gICAgaG9zdElkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGVJZDogc3RyaW5nO1xuICAgIGRheXM6IGUuRGF5T2ZXZWVrW107XG4gICAgdGltZVNsb3Q6IFRpbWVSYW5nZTtcbiAgICB0aW1lWm9uZTogVGltZVpvbmU7XG4gICAgd2Vla2RheXNBdmFpbGFiaWxpdHk6IFdlZWtkYXlBdmFpbGFiaWxpdHlbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNldEdlbmVyYWxBdmFpbGFiaWxpdHlSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2V0R2VuZXJhbEF2YWlsYWJpbGl0eVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZGF5cykge20uZGF5cyA9IHByb3RvLmRheXMubWFwKCh2OiBzdHJpbmcpID0+IGVudW1TdHJpbmdUb1ZhbHVlPGUuRGF5T2ZXZWVrPihlLkRheU9mV2VlaywgdikpO31cbiAgICAgICAgaWYgKHByb3RvLnRpbWVTbG90KSB7bS50aW1lU2xvdCA9IFRpbWVSYW5nZS5mcm9tUHJvdG8ocHJvdG8udGltZVNsb3QpO31cbiAgICAgICAgaWYgKHByb3RvLnRpbWVab25lKSB7bS50aW1lWm9uZSA9IFRpbWVab25lLmZyb21Qcm90byhwcm90by50aW1lWm9uZSk7fVxuICAgICAgICBpZiAocHJvdG8ud2Vla2RheXNBdmFpbGFiaWxpdHkpIHttLndlZWtkYXlzQXZhaWxhYmlsaXR5ID0gcHJvdG8ud2Vla2RheXNBdmFpbGFiaWxpdHkubWFwKFdlZWtkYXlBdmFpbGFiaWxpdHkuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2V0R2VuZXJhbEF2YWlsYWJpbGl0eVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ob3N0SWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hvc3RJZCddID0gdGhpcy5ob3N0SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ1R5cGVJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVldGluZ1R5cGVJZCddID0gdGhpcy5tZWV0aW5nVHlwZUlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRheXMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2RheXMnXSA9IHRoaXMuZGF5czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lU2xvdCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lU2xvdCAhPT0gbnVsbCkge3RvUmV0dXJuWyd0aW1lU2xvdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lU2xvdCA/ICh0aGlzLnRpbWVTbG90IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnRpbWVTbG90O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVab25lICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRpbWVab25lICE9PSBudWxsKSB7dG9SZXR1cm5bJ3RpbWVab25lJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnRpbWVab25lID8gKHRoaXMudGltZVpvbmUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudGltZVpvbmU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMud2Vla2RheXNBdmFpbGFiaWxpdHkgIT09ICd1bmRlZmluZWQnICYmIHRoaXMud2Vla2RheXNBdmFpbGFiaWxpdHkgIT09IG51bGwpIHt0b1JldHVyblsnd2Vla2RheXNBdmFpbGFiaWxpdHknXSA9ICd0b0FwaUpzb24nIGluIHRoaXMud2Vla2RheXNBdmFpbGFiaWxpdHkgPyAodGhpcy53ZWVrZGF5c0F2YWlsYWJpbGl0eSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy53ZWVrZGF5c0F2YWlsYWJpbGl0eTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVBdmFpbGFiaWxpdHlSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlIHtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFVwZGF0ZUF2YWlsYWJpbGl0eVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVBdmFpbGFiaWxpdHlSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVBdmFpbGFiaWxpdHlSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlQ2FsZW5kYXJSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVDYWxlbmRhclJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNhbGVuZGFySWQ6IHN0cmluZztcbiAgICBjYWxlbmRhclVwZGF0ZTogQ2FsZW5kYXI7XG4gICAgZmllbGRNYXNrOiBGaWVsZE1hc2s7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBVcGRhdGVDYWxlbmRhclJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVDYWxlbmRhclJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY2FsZW5kYXJVcGRhdGUpIHttLmNhbGVuZGFyVXBkYXRlID0gQ2FsZW5kYXIuZnJvbVByb3RvKHByb3RvLmNhbGVuZGFyVXBkYXRlKTt9XG4gICAgICAgIGlmIChwcm90by5maWVsZE1hc2spIHttLmZpZWxkTWFzayA9IEZpZWxkTWFzay5mcm9tUHJvdG8ocHJvdG8uZmllbGRNYXNrKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuVXBkYXRlQ2FsZW5kYXJSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2FsZW5kYXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2FsZW5kYXJJZCddID0gdGhpcy5jYWxlbmRhcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNhbGVuZGFyVXBkYXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNhbGVuZGFyVXBkYXRlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NhbGVuZGFyVXBkYXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNhbGVuZGFyVXBkYXRlID8gKHRoaXMuY2FsZW5kYXJVcGRhdGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY2FsZW5kYXJVcGRhdGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmllbGRNYXNrICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpZWxkTWFzayAhPT0gbnVsbCkge3RvUmV0dXJuWydmaWVsZE1hc2snXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmllbGRNYXNrID8gKHRoaXMuZmllbGRNYXNrIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZpZWxkTWFzazt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBob3N0SWQ6IHN0cmluZztcbiAgICBwcmVmZXJlbmNlczogUHJlZmVyZW5jZXM7XG4gICAgZmllbGRNYXNrOiBGaWVsZE1hc2s7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBVcGRhdGVIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgVXBkYXRlSG9zdFByZWZlcmVuY2VzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wcmVmZXJlbmNlcykge20ucHJlZmVyZW5jZXMgPSBQcmVmZXJlbmNlcy5mcm9tUHJvdG8ocHJvdG8ucHJlZmVyZW5jZXMpO31cbiAgICAgICAgaWYgKHByb3RvLmZpZWxkTWFzaykge20uZmllbGRNYXNrID0gRmllbGRNYXNrLmZyb21Qcm90byhwcm90by5maWVsZE1hc2spO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVIb3N0UHJlZmVyZW5jZXNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaG9zdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydob3N0SWQnXSA9IHRoaXMuaG9zdElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZWZlcmVuY2VzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnByZWZlcmVuY2VzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3ByZWZlcmVuY2VzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnByZWZlcmVuY2VzID8gKHRoaXMucHJlZmVyZW5jZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucHJlZmVyZW5jZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmllbGRNYXNrICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpZWxkTWFzayAhPT0gbnVsbCkge3RvUmV0dXJuWydmaWVsZE1hc2snXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmllbGRNYXNrID8gKHRoaXMuZmllbGRNYXNrIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmZpZWxkTWFzazt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZWV0aW5nSWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBVcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgVXBkYXRlTWVldGluZ01ldGFkYXRhUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZXRhZGF0YSkge20ubWV0YWRhdGEgPSBPYmplY3Qua2V5cyhwcm90by5tZXRhZGF0YSkucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwcm90by5tZXRhZGF0YVtrXTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVNZWV0aW5nTWV0YWRhdGFSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVldGluZ0lkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZWV0aW5nSWQnXSA9IHRoaXMubWVldGluZ0lkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1ldGFkYXRhICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1ldGFkYXRhICE9PSBudWxsKSB7dG9SZXR1cm5bJ21ldGFkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1ldGFkYXRhID8gKHRoaXMubWV0YWRhdGEgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWV0YWRhdGE7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVXBkYXRlTWVldGluZ1R5cGVSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVNZWV0aW5nVHlwZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbWVldGluZ1R5cGU6IE1lZXRpbmdUeXBlO1xuICAgIGZpZWxkTWFzazogRmllbGRNYXNrO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogVXBkYXRlTWVldGluZ1R5cGVSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgVXBkYXRlTWVldGluZ1R5cGVSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm1lZXRpbmdUeXBlKSB7bS5tZWV0aW5nVHlwZSA9IE1lZXRpbmdUeXBlLmZyb21Qcm90byhwcm90by5tZWV0aW5nVHlwZSk7fVxuICAgICAgICBpZiAocHJvdG8uZmllbGRNYXNrKSB7bS5maWVsZE1hc2sgPSBGaWVsZE1hc2suZnJvbVByb3RvKHByb3RvLmZpZWxkTWFzayk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlVwZGF0ZU1lZXRpbmdUeXBlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZWV0aW5nVHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZWV0aW5nVHlwZSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZWV0aW5nVHlwZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZWV0aW5nVHlwZSA/ICh0aGlzLm1lZXRpbmdUeXBlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lZXRpbmdUeXBlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpZWxkTWFzayAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maWVsZE1hc2sgIT09IG51bGwpIHt0b1JldHVyblsnZmllbGRNYXNrJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmZpZWxkTWFzayA/ICh0aGlzLmZpZWxkTWFzayBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5maWVsZE1hc2s7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2Vla2RheUF2YWlsYWJpbGl0eSBpbXBsZW1lbnRzIGkuV2Vla2RheUF2YWlsYWJpbGl0eUludGVyZmFjZSB7XG4gICAgZGF5OiBlLkRheU9mV2VlaztcbiAgICB0aW1lU2xvdHM6IFRpbWVSYW5nZVtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogV2Vla2RheUF2YWlsYWJpbGl0eSB7XG4gICAgICAgIGxldCBtID0gbmV3IFdlZWtkYXlBdmFpbGFiaWxpdHkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZGF5KSB7bS5kYXkgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkRheU9mV2Vlaz4oZS5EYXlPZldlZWssIHByb3RvLmRheSk7fVxuICAgICAgICBpZiAocHJvdG8udGltZVNsb3RzKSB7bS50aW1lU2xvdHMgPSBwcm90by50aW1lU2xvdHMubWFwKFRpbWVSYW5nZS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5XZWVrZGF5QXZhaWxhYmlsaXR5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkYXknXSA9IHRoaXMuZGF5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVTbG90cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50aW1lU2xvdHMgIT09IG51bGwpIHt0b1JldHVyblsndGltZVNsb3RzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnRpbWVTbG90cyA/ICh0aGlzLnRpbWVTbG90cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy50aW1lU2xvdHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG4iXX0=