@vendasta/conversation 0.12.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/_generated/host.service.mjs +25 -0
- package/esm2020/lib/_internal/conversation.api.service.mjs +116 -0
- package/esm2020/lib/_internal/enums/api.enum.mjs +14 -0
- package/esm2020/lib/_internal/enums/conversation.enum.mjs +25 -0
- package/esm2020/lib/_internal/enums/index.mjs +11 -0
- package/esm2020/lib/_internal/enums/message.enum.mjs +21 -0
- package/esm2020/lib/_internal/enums/participant.enum.mjs +18 -0
- package/esm2020/lib/_internal/index.mjs +11 -0
- package/esm2020/lib/_internal/interfaces/api.interface.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/conversation.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
- package/esm2020/lib/_internal/interfaces/message.interface.mjs +8 -0
- package/esm2020/lib/_internal/interfaces/participant.interface.mjs +8 -0
- package/esm2020/lib/_internal/objects/api.mjs +1135 -0
- package/esm2020/lib/_internal/objects/conversation.mjs +73 -0
- package/esm2020/lib/_internal/objects/index.mjs +11 -0
- package/esm2020/lib/_internal/objects/message.mjs +105 -0
- package/esm2020/lib/_internal/objects/participant.mjs +129 -0
- package/esm2020/lib/index.mjs +3 -0
- package/esm2020/public_api.mjs +2 -0
- package/esm2020/vendasta-conversation.mjs +5 -0
- package/fesm2015/vendasta-conversation.mjs +1658 -0
- package/fesm2015/vendasta-conversation.mjs.map +1 -0
- package/{fesm2015/vendasta-conversation.js → fesm2020/vendasta-conversation.mjs} +138 -125
- package/fesm2020/vendasta-conversation.mjs.map +1 -0
- package/lib/_generated/host.service.d.ts +5 -9
- package/lib/_internal/conversation.api.service.d.ts +7 -2
- package/lib/_internal/interfaces/api.interface.d.ts +8 -2
- package/lib/_internal/interfaces/index.d.ts +1 -1
- package/lib/_internal/interfaces/participant.interface.d.ts +1 -0
- package/lib/_internal/objects/api.d.ts +18 -6
- package/lib/_internal/objects/index.d.ts +1 -1
- package/lib/_internal/objects/participant.d.ts +1 -0
- package/package.json +27 -16
- package/src/README.md +1 -0
- package/vendasta-conversation.d.ts +1 -1
- package/bundles/vendasta-conversation.umd.js +0 -1712
- package/bundles/vendasta-conversation.umd.js.map +0 -1
- package/bundles/vendasta-conversation.umd.min.js +0 -2
- package/bundles/vendasta-conversation.umd.min.js.map +0 -1
- package/esm2015/lib/_generated/host.service.js +0 -65
- package/esm2015/lib/_internal/conversation.api.service.js +0 -112
- package/esm2015/lib/_internal/enums/api.enum.js +0 -14
- package/esm2015/lib/_internal/enums/conversation.enum.js +0 -25
- package/esm2015/lib/_internal/enums/index.js +0 -11
- package/esm2015/lib/_internal/enums/message.enum.js +0 -21
- package/esm2015/lib/_internal/enums/participant.enum.js +0 -18
- package/esm2015/lib/_internal/index.js +0 -11
- package/esm2015/lib/_internal/interfaces/api.interface.js +0 -2
- package/esm2015/lib/_internal/interfaces/conversation.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/index.js +0 -2
- package/esm2015/lib/_internal/interfaces/message.interface.js +0 -8
- package/esm2015/lib/_internal/interfaces/participant.interface.js +0 -8
- package/esm2015/lib/_internal/objects/api.js +0 -1092
- package/esm2015/lib/_internal/objects/conversation.js +0 -73
- package/esm2015/lib/_internal/objects/index.js +0 -11
- package/esm2015/lib/_internal/objects/message.js +0 -105
- package/esm2015/lib/_internal/objects/participant.js +0 -126
- package/esm2015/lib/index.js +0 -3
- package/esm2015/public_api.js +0 -2
- package/esm2015/vendasta-conversation.js +0 -6
- package/fesm2015/vendasta-conversation.js.map +0 -1
- package/vendasta-conversation.metadata.json +0 -1
|
@@ -0,0 +1,1135 @@
|
|
|
1
|
+
import { Conversation } from './conversation';
|
|
2
|
+
import { Message } from './message';
|
|
3
|
+
import { Participant } from './participant';
|
|
4
|
+
import * as e from '../enums';
|
|
5
|
+
export function enumStringToValue(enumRef, value) {
|
|
6
|
+
if (typeof value === 'number') {
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
return enumRef[value];
|
|
10
|
+
}
|
|
11
|
+
export class AddMultiParticipantsRequest {
|
|
12
|
+
constructor(kwargs) {
|
|
13
|
+
if (!kwargs) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
Object.assign(this, kwargs);
|
|
17
|
+
}
|
|
18
|
+
static fromProto(proto) {
|
|
19
|
+
let m = new AddMultiParticipantsRequest();
|
|
20
|
+
m = Object.assign(m, proto);
|
|
21
|
+
if (proto.participants) {
|
|
22
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
23
|
+
}
|
|
24
|
+
return m;
|
|
25
|
+
}
|
|
26
|
+
toApiJson() {
|
|
27
|
+
const toReturn = {};
|
|
28
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
29
|
+
toReturn['conversationId'] = this.conversationId;
|
|
30
|
+
}
|
|
31
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
32
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
33
|
+
}
|
|
34
|
+
return toReturn;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class AddMultiParticipantsResponse {
|
|
38
|
+
constructor(kwargs) {
|
|
39
|
+
if (!kwargs) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
Object.assign(this, kwargs);
|
|
43
|
+
}
|
|
44
|
+
static fromProto(proto) {
|
|
45
|
+
let m = new AddMultiParticipantsResponse();
|
|
46
|
+
m = Object.assign(m, proto);
|
|
47
|
+
if (proto.participants) {
|
|
48
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
49
|
+
}
|
|
50
|
+
return m;
|
|
51
|
+
}
|
|
52
|
+
toApiJson() {
|
|
53
|
+
const toReturn = {};
|
|
54
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
55
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
56
|
+
}
|
|
57
|
+
return toReturn;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class ConversationMessageCount {
|
|
61
|
+
constructor(kwargs) {
|
|
62
|
+
if (!kwargs) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
Object.assign(this, kwargs);
|
|
66
|
+
}
|
|
67
|
+
static fromProto(proto) {
|
|
68
|
+
let m = new ConversationMessageCount();
|
|
69
|
+
m = Object.assign(m, proto);
|
|
70
|
+
if (proto.count) {
|
|
71
|
+
m.count = parseInt(proto.count, 10);
|
|
72
|
+
}
|
|
73
|
+
return m;
|
|
74
|
+
}
|
|
75
|
+
toApiJson() {
|
|
76
|
+
const toReturn = {};
|
|
77
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
78
|
+
toReturn['conversationId'] = this.conversationId;
|
|
79
|
+
}
|
|
80
|
+
if (typeof this.count !== 'undefined') {
|
|
81
|
+
toReturn['count'] = this.count;
|
|
82
|
+
}
|
|
83
|
+
return toReturn;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export class LookupConversationsResponseConversations {
|
|
87
|
+
constructor(kwargs) {
|
|
88
|
+
if (!kwargs) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
Object.assign(this, kwargs);
|
|
92
|
+
}
|
|
93
|
+
static fromProto(proto) {
|
|
94
|
+
let m = new LookupConversationsResponseConversations();
|
|
95
|
+
m = Object.assign(m, proto);
|
|
96
|
+
if (proto.conversation) {
|
|
97
|
+
m.conversation = Conversation.fromProto(proto.conversation);
|
|
98
|
+
}
|
|
99
|
+
if (proto.participants) {
|
|
100
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
101
|
+
}
|
|
102
|
+
return m;
|
|
103
|
+
}
|
|
104
|
+
toApiJson() {
|
|
105
|
+
const toReturn = {};
|
|
106
|
+
if (typeof this.conversation !== 'undefined' && this.conversation !== null) {
|
|
107
|
+
toReturn['conversation'] = 'toApiJson' in this.conversation ? this.conversation.toApiJson() : this.conversation;
|
|
108
|
+
}
|
|
109
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
110
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
111
|
+
}
|
|
112
|
+
return toReturn;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export class GetMultiConversationMessageCountResponseCountsEntry {
|
|
116
|
+
constructor(kwargs) {
|
|
117
|
+
if (!kwargs) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
Object.assign(this, kwargs);
|
|
121
|
+
}
|
|
122
|
+
static fromProto(proto) {
|
|
123
|
+
let m = new GetMultiConversationMessageCountResponseCountsEntry();
|
|
124
|
+
m = Object.assign(m, proto);
|
|
125
|
+
if (proto.value) {
|
|
126
|
+
m.value = parseInt(proto.value, 10);
|
|
127
|
+
}
|
|
128
|
+
return m;
|
|
129
|
+
}
|
|
130
|
+
toApiJson() {
|
|
131
|
+
const toReturn = {};
|
|
132
|
+
if (typeof this.key !== 'undefined') {
|
|
133
|
+
toReturn['key'] = this.key;
|
|
134
|
+
}
|
|
135
|
+
if (typeof this.value !== 'undefined') {
|
|
136
|
+
toReturn['value'] = this.value;
|
|
137
|
+
}
|
|
138
|
+
return toReturn;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export class CreateConversationRequest {
|
|
142
|
+
constructor(kwargs) {
|
|
143
|
+
if (!kwargs) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
Object.assign(this, kwargs);
|
|
147
|
+
}
|
|
148
|
+
static fromProto(proto) {
|
|
149
|
+
let m = new CreateConversationRequest();
|
|
150
|
+
m = Object.assign(m, proto);
|
|
151
|
+
if (proto.participants) {
|
|
152
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
153
|
+
}
|
|
154
|
+
if (proto.channel) {
|
|
155
|
+
m.channel = enumStringToValue(e.ConversationChannel, proto.channel);
|
|
156
|
+
}
|
|
157
|
+
if (proto.created) {
|
|
158
|
+
m.created = new Date(proto.created);
|
|
159
|
+
}
|
|
160
|
+
if (proto.updated) {
|
|
161
|
+
m.updated = new Date(proto.updated);
|
|
162
|
+
}
|
|
163
|
+
if (proto.originLocation) {
|
|
164
|
+
m.originLocation = enumStringToValue(e.PlatformLocation, proto.originLocation);
|
|
165
|
+
}
|
|
166
|
+
return m;
|
|
167
|
+
}
|
|
168
|
+
toApiJson() {
|
|
169
|
+
const toReturn = {};
|
|
170
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
171
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
172
|
+
}
|
|
173
|
+
if (typeof this.channel !== 'undefined') {
|
|
174
|
+
toReturn['channel'] = this.channel;
|
|
175
|
+
}
|
|
176
|
+
if (typeof this.externalConversationId !== 'undefined') {
|
|
177
|
+
toReturn['externalConversationId'] = this.externalConversationId;
|
|
178
|
+
}
|
|
179
|
+
if (typeof this.created !== 'undefined' && this.created !== null) {
|
|
180
|
+
toReturn['created'] = 'toApiJson' in this.created ? this.created.toApiJson() : this.created;
|
|
181
|
+
}
|
|
182
|
+
if (typeof this.updated !== 'undefined' && this.updated !== null) {
|
|
183
|
+
toReturn['updated'] = 'toApiJson' in this.updated ? this.updated.toApiJson() : this.updated;
|
|
184
|
+
}
|
|
185
|
+
if (typeof this.originLocation !== 'undefined') {
|
|
186
|
+
toReturn['originLocation'] = this.originLocation;
|
|
187
|
+
}
|
|
188
|
+
if (typeof this.originLocationExternalId !== 'undefined') {
|
|
189
|
+
toReturn['originLocationExternalId'] = this.originLocationExternalId;
|
|
190
|
+
}
|
|
191
|
+
return toReturn;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export class CreateConversationResponse {
|
|
195
|
+
constructor(kwargs) {
|
|
196
|
+
if (!kwargs) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
Object.assign(this, kwargs);
|
|
200
|
+
}
|
|
201
|
+
static fromProto(proto) {
|
|
202
|
+
let m = new CreateConversationResponse();
|
|
203
|
+
m = Object.assign(m, proto);
|
|
204
|
+
if (proto.conversation) {
|
|
205
|
+
m.conversation = Conversation.fromProto(proto.conversation);
|
|
206
|
+
}
|
|
207
|
+
if (proto.participants) {
|
|
208
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
209
|
+
}
|
|
210
|
+
return m;
|
|
211
|
+
}
|
|
212
|
+
toApiJson() {
|
|
213
|
+
const toReturn = {};
|
|
214
|
+
if (typeof this.conversation !== 'undefined' && this.conversation !== null) {
|
|
215
|
+
toReturn['conversation'] = 'toApiJson' in this.conversation ? this.conversation.toApiJson() : this.conversation;
|
|
216
|
+
}
|
|
217
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
218
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
219
|
+
}
|
|
220
|
+
return toReturn;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export class CreateMultiMessagesRequest {
|
|
224
|
+
constructor(kwargs) {
|
|
225
|
+
if (!kwargs) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
Object.assign(this, kwargs);
|
|
229
|
+
}
|
|
230
|
+
static fromProto(proto) {
|
|
231
|
+
let m = new CreateMultiMessagesRequest();
|
|
232
|
+
m = Object.assign(m, proto);
|
|
233
|
+
if (proto.messages) {
|
|
234
|
+
m.messages = proto.messages.map(Message.fromProto);
|
|
235
|
+
}
|
|
236
|
+
if (proto.lastSeen) {
|
|
237
|
+
m.lastSeen = new Date(proto.lastSeen);
|
|
238
|
+
}
|
|
239
|
+
return m;
|
|
240
|
+
}
|
|
241
|
+
toApiJson() {
|
|
242
|
+
const toReturn = {};
|
|
243
|
+
if (typeof this.messages !== 'undefined' && this.messages !== null) {
|
|
244
|
+
toReturn['messages'] = 'toApiJson' in this.messages ? this.messages.toApiJson() : this.messages;
|
|
245
|
+
}
|
|
246
|
+
if (typeof this.lastSeen !== 'undefined' && this.lastSeen !== null) {
|
|
247
|
+
toReturn['lastSeen'] = 'toApiJson' in this.lastSeen ? this.lastSeen.toApiJson() : this.lastSeen;
|
|
248
|
+
}
|
|
249
|
+
return toReturn;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export class MetadataDataEntry {
|
|
253
|
+
constructor(kwargs) {
|
|
254
|
+
if (!kwargs) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
Object.assign(this, kwargs);
|
|
258
|
+
}
|
|
259
|
+
static fromProto(proto) {
|
|
260
|
+
let m = new MetadataDataEntry();
|
|
261
|
+
m = Object.assign(m, proto);
|
|
262
|
+
return m;
|
|
263
|
+
}
|
|
264
|
+
toApiJson() {
|
|
265
|
+
const toReturn = {};
|
|
266
|
+
if (typeof this.key !== 'undefined') {
|
|
267
|
+
toReturn['key'] = this.key;
|
|
268
|
+
}
|
|
269
|
+
if (typeof this.value !== 'undefined') {
|
|
270
|
+
toReturn['value'] = this.value;
|
|
271
|
+
}
|
|
272
|
+
return toReturn;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
export class DeleteConversationRequest {
|
|
276
|
+
constructor(kwargs) {
|
|
277
|
+
if (!kwargs) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
Object.assign(this, kwargs);
|
|
281
|
+
}
|
|
282
|
+
static fromProto(proto) {
|
|
283
|
+
let m = new DeleteConversationRequest();
|
|
284
|
+
m = Object.assign(m, proto);
|
|
285
|
+
return m;
|
|
286
|
+
}
|
|
287
|
+
toApiJson() {
|
|
288
|
+
const toReturn = {};
|
|
289
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
290
|
+
toReturn['conversationId'] = this.conversationId;
|
|
291
|
+
}
|
|
292
|
+
return toReturn;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
export class DeleteMessageRequest {
|
|
296
|
+
constructor(kwargs) {
|
|
297
|
+
if (!kwargs) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
Object.assign(this, kwargs);
|
|
301
|
+
}
|
|
302
|
+
static fromProto(proto) {
|
|
303
|
+
let m = new DeleteMessageRequest();
|
|
304
|
+
m = Object.assign(m, proto);
|
|
305
|
+
return m;
|
|
306
|
+
}
|
|
307
|
+
toApiJson() {
|
|
308
|
+
const toReturn = {};
|
|
309
|
+
if (typeof this.messageId !== 'undefined') {
|
|
310
|
+
toReturn['messageId'] = this.messageId;
|
|
311
|
+
}
|
|
312
|
+
return toReturn;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
export class SearchConversationsResponseDetailedConversation {
|
|
316
|
+
constructor(kwargs) {
|
|
317
|
+
if (!kwargs) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
Object.assign(this, kwargs);
|
|
321
|
+
}
|
|
322
|
+
static fromProto(proto) {
|
|
323
|
+
let m = new SearchConversationsResponseDetailedConversation();
|
|
324
|
+
m = Object.assign(m, proto);
|
|
325
|
+
if (proto.conversation) {
|
|
326
|
+
m.conversation = Conversation.fromProto(proto.conversation);
|
|
327
|
+
}
|
|
328
|
+
if (proto.latestMessage) {
|
|
329
|
+
m.latestMessage = Message.fromProto(proto.latestMessage);
|
|
330
|
+
}
|
|
331
|
+
if (proto.participants) {
|
|
332
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
333
|
+
}
|
|
334
|
+
return m;
|
|
335
|
+
}
|
|
336
|
+
toApiJson() {
|
|
337
|
+
const toReturn = {};
|
|
338
|
+
if (typeof this.conversation !== 'undefined' && this.conversation !== null) {
|
|
339
|
+
toReturn['conversation'] = 'toApiJson' in this.conversation ? this.conversation.toApiJson() : this.conversation;
|
|
340
|
+
}
|
|
341
|
+
if (typeof this.latestMessage !== 'undefined' && this.latestMessage !== null) {
|
|
342
|
+
toReturn['latestMessage'] = 'toApiJson' in this.latestMessage ? this.latestMessage.toApiJson() : this.latestMessage;
|
|
343
|
+
}
|
|
344
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
345
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
346
|
+
}
|
|
347
|
+
return toReturn;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
export class GetMultiConversationDetailsResponseDetailedConversation {
|
|
351
|
+
constructor(kwargs) {
|
|
352
|
+
if (!kwargs) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
Object.assign(this, kwargs);
|
|
356
|
+
}
|
|
357
|
+
static fromProto(proto) {
|
|
358
|
+
let m = new GetMultiConversationDetailsResponseDetailedConversation();
|
|
359
|
+
m = Object.assign(m, proto);
|
|
360
|
+
if (proto.conversation) {
|
|
361
|
+
m.conversation = Conversation.fromProto(proto.conversation);
|
|
362
|
+
}
|
|
363
|
+
if (proto.latestMessage) {
|
|
364
|
+
m.latestMessage = Message.fromProto(proto.latestMessage);
|
|
365
|
+
}
|
|
366
|
+
if (proto.participants) {
|
|
367
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
368
|
+
}
|
|
369
|
+
return m;
|
|
370
|
+
}
|
|
371
|
+
toApiJson() {
|
|
372
|
+
const toReturn = {};
|
|
373
|
+
if (typeof this.conversation !== 'undefined' && this.conversation !== null) {
|
|
374
|
+
toReturn['conversation'] = 'toApiJson' in this.conversation ? this.conversation.toApiJson() : this.conversation;
|
|
375
|
+
}
|
|
376
|
+
if (typeof this.latestMessage !== 'undefined' && this.latestMessage !== null) {
|
|
377
|
+
toReturn['latestMessage'] = 'toApiJson' in this.latestMessage ? this.latestMessage.toApiJson() : this.latestMessage;
|
|
378
|
+
}
|
|
379
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
380
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
381
|
+
}
|
|
382
|
+
return toReturn;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
export class GetMessageRequest {
|
|
386
|
+
constructor(kwargs) {
|
|
387
|
+
if (!kwargs) {
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
Object.assign(this, kwargs);
|
|
391
|
+
}
|
|
392
|
+
static fromProto(proto) {
|
|
393
|
+
let m = new GetMessageRequest();
|
|
394
|
+
m = Object.assign(m, proto);
|
|
395
|
+
return m;
|
|
396
|
+
}
|
|
397
|
+
toApiJson() {
|
|
398
|
+
const toReturn = {};
|
|
399
|
+
if (typeof this.messageId !== 'undefined') {
|
|
400
|
+
toReturn['messageId'] = this.messageId;
|
|
401
|
+
}
|
|
402
|
+
return toReturn;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
export class GetMultiConversationDetailsRequest {
|
|
406
|
+
constructor(kwargs) {
|
|
407
|
+
if (!kwargs) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
Object.assign(this, kwargs);
|
|
411
|
+
}
|
|
412
|
+
static fromProto(proto) {
|
|
413
|
+
let m = new GetMultiConversationDetailsRequest();
|
|
414
|
+
m = Object.assign(m, proto);
|
|
415
|
+
return m;
|
|
416
|
+
}
|
|
417
|
+
toApiJson() {
|
|
418
|
+
const toReturn = {};
|
|
419
|
+
if (typeof this.conversationIds !== 'undefined') {
|
|
420
|
+
toReturn['conversationIds'] = this.conversationIds;
|
|
421
|
+
}
|
|
422
|
+
return toReturn;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
export class GetMultiConversationDetailsResponse {
|
|
426
|
+
constructor(kwargs) {
|
|
427
|
+
if (!kwargs) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
Object.assign(this, kwargs);
|
|
431
|
+
}
|
|
432
|
+
static fromProto(proto) {
|
|
433
|
+
let m = new GetMultiConversationDetailsResponse();
|
|
434
|
+
m = Object.assign(m, proto);
|
|
435
|
+
if (proto.conversations) {
|
|
436
|
+
m.conversations = proto.conversations.map(GetMultiConversationDetailsResponseDetailedConversation.fromProto);
|
|
437
|
+
}
|
|
438
|
+
return m;
|
|
439
|
+
}
|
|
440
|
+
toApiJson() {
|
|
441
|
+
const toReturn = {};
|
|
442
|
+
if (typeof this.conversations !== 'undefined' && this.conversations !== null) {
|
|
443
|
+
toReturn['conversations'] = 'toApiJson' in this.conversations ? this.conversations.toApiJson() : this.conversations;
|
|
444
|
+
}
|
|
445
|
+
return toReturn;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
export class GetMultiConversationMessageCountRequest {
|
|
449
|
+
constructor(kwargs) {
|
|
450
|
+
if (!kwargs) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
Object.assign(this, kwargs);
|
|
454
|
+
}
|
|
455
|
+
static fromProto(proto) {
|
|
456
|
+
let m = new GetMultiConversationMessageCountRequest();
|
|
457
|
+
m = Object.assign(m, proto);
|
|
458
|
+
return m;
|
|
459
|
+
}
|
|
460
|
+
toApiJson() {
|
|
461
|
+
const toReturn = {};
|
|
462
|
+
if (typeof this.conversationIds !== 'undefined') {
|
|
463
|
+
toReturn['conversationIds'] = this.conversationIds;
|
|
464
|
+
}
|
|
465
|
+
return toReturn;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
export class GetMultiConversationMessageCountResponse {
|
|
469
|
+
constructor(kwargs) {
|
|
470
|
+
if (!kwargs) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
Object.assign(this, kwargs);
|
|
474
|
+
}
|
|
475
|
+
static fromProto(proto) {
|
|
476
|
+
let m = new GetMultiConversationMessageCountResponse();
|
|
477
|
+
m = Object.assign(m, proto);
|
|
478
|
+
if (proto.messageCounts) {
|
|
479
|
+
m.messageCounts = proto.messageCounts.map(ConversationMessageCount.fromProto);
|
|
480
|
+
}
|
|
481
|
+
if (proto.counts) {
|
|
482
|
+
m.counts = Object.keys(proto.counts).reduce((obj, k) => { obj[k] = parseInt(proto.counts[k], 10); return obj; }, {});
|
|
483
|
+
}
|
|
484
|
+
return m;
|
|
485
|
+
}
|
|
486
|
+
toApiJson() {
|
|
487
|
+
const toReturn = {};
|
|
488
|
+
if (typeof this.messageCounts !== 'undefined' && this.messageCounts !== null) {
|
|
489
|
+
toReturn['messageCounts'] = 'toApiJson' in this.messageCounts ? this.messageCounts.toApiJson() : this.messageCounts;
|
|
490
|
+
}
|
|
491
|
+
if (typeof this.counts !== 'undefined' && this.counts !== null) {
|
|
492
|
+
toReturn['counts'] = 'toApiJson' in this.counts ? this.counts.toApiJson() : this.counts;
|
|
493
|
+
}
|
|
494
|
+
return toReturn;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
export class GetMultiMessagesRequest {
|
|
498
|
+
constructor(kwargs) {
|
|
499
|
+
if (!kwargs) {
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
Object.assign(this, kwargs);
|
|
503
|
+
}
|
|
504
|
+
static fromProto(proto) {
|
|
505
|
+
let m = new GetMultiMessagesRequest();
|
|
506
|
+
m = Object.assign(m, proto);
|
|
507
|
+
return m;
|
|
508
|
+
}
|
|
509
|
+
toApiJson() {
|
|
510
|
+
const toReturn = {};
|
|
511
|
+
if (typeof this.messageIds !== 'undefined') {
|
|
512
|
+
toReturn['messageIds'] = this.messageIds;
|
|
513
|
+
}
|
|
514
|
+
return toReturn;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
export class GetMultiMessagesResponse {
|
|
518
|
+
constructor(kwargs) {
|
|
519
|
+
if (!kwargs) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
Object.assign(this, kwargs);
|
|
523
|
+
}
|
|
524
|
+
static fromProto(proto) {
|
|
525
|
+
let m = new GetMultiMessagesResponse();
|
|
526
|
+
m = Object.assign(m, proto);
|
|
527
|
+
if (proto.messages) {
|
|
528
|
+
m.messages = proto.messages.map(Message.fromProto);
|
|
529
|
+
}
|
|
530
|
+
return m;
|
|
531
|
+
}
|
|
532
|
+
toApiJson() {
|
|
533
|
+
const toReturn = {};
|
|
534
|
+
if (typeof this.messages !== 'undefined' && this.messages !== null) {
|
|
535
|
+
toReturn['messages'] = 'toApiJson' in this.messages ? this.messages.toApiJson() : this.messages;
|
|
536
|
+
}
|
|
537
|
+
return toReturn;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
export class GetMultiParticipantsRequest {
|
|
541
|
+
constructor(kwargs) {
|
|
542
|
+
if (!kwargs) {
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
Object.assign(this, kwargs);
|
|
546
|
+
}
|
|
547
|
+
static fromProto(proto) {
|
|
548
|
+
let m = new GetMultiParticipantsRequest();
|
|
549
|
+
m = Object.assign(m, proto);
|
|
550
|
+
return m;
|
|
551
|
+
}
|
|
552
|
+
toApiJson() {
|
|
553
|
+
const toReturn = {};
|
|
554
|
+
if (typeof this.participantIds !== 'undefined') {
|
|
555
|
+
toReturn['participantIds'] = this.participantIds;
|
|
556
|
+
}
|
|
557
|
+
return toReturn;
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
export class GetMultiParticipantsResponse {
|
|
561
|
+
constructor(kwargs) {
|
|
562
|
+
if (!kwargs) {
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
Object.assign(this, kwargs);
|
|
566
|
+
}
|
|
567
|
+
static fromProto(proto) {
|
|
568
|
+
let m = new GetMultiParticipantsResponse();
|
|
569
|
+
m = Object.assign(m, proto);
|
|
570
|
+
if (proto.participants) {
|
|
571
|
+
m.participants = proto.participants.map(Participant.fromProto);
|
|
572
|
+
}
|
|
573
|
+
return m;
|
|
574
|
+
}
|
|
575
|
+
toApiJson() {
|
|
576
|
+
const toReturn = {};
|
|
577
|
+
if (typeof this.participants !== 'undefined' && this.participants !== null) {
|
|
578
|
+
toReturn['participants'] = 'toApiJson' in this.participants ? this.participants.toApiJson() : this.participants;
|
|
579
|
+
}
|
|
580
|
+
return toReturn;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
export class ListMessagesRequestListMessagesFilters {
|
|
584
|
+
constructor(kwargs) {
|
|
585
|
+
if (!kwargs) {
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
Object.assign(this, kwargs);
|
|
589
|
+
}
|
|
590
|
+
static fromProto(proto) {
|
|
591
|
+
let m = new ListMessagesRequestListMessagesFilters();
|
|
592
|
+
m = Object.assign(m, proto);
|
|
593
|
+
return m;
|
|
594
|
+
}
|
|
595
|
+
toApiJson() {
|
|
596
|
+
const toReturn = {};
|
|
597
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
598
|
+
toReturn['conversationId'] = this.conversationId;
|
|
599
|
+
}
|
|
600
|
+
return toReturn;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
export class ListMessagesRequest {
|
|
604
|
+
constructor(kwargs) {
|
|
605
|
+
if (!kwargs) {
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
Object.assign(this, kwargs);
|
|
609
|
+
}
|
|
610
|
+
static fromProto(proto) {
|
|
611
|
+
let m = new ListMessagesRequest();
|
|
612
|
+
m = Object.assign(m, proto);
|
|
613
|
+
if (proto.filters) {
|
|
614
|
+
m.filters = ListMessagesRequestListMessagesFilters.fromProto(proto.filters);
|
|
615
|
+
}
|
|
616
|
+
if (proto.pagingOptions) {
|
|
617
|
+
m.pagingOptions = PagedRequestOptions.fromProto(proto.pagingOptions);
|
|
618
|
+
}
|
|
619
|
+
return m;
|
|
620
|
+
}
|
|
621
|
+
toApiJson() {
|
|
622
|
+
const toReturn = {};
|
|
623
|
+
if (typeof this.filters !== 'undefined' && this.filters !== null) {
|
|
624
|
+
toReturn['filters'] = 'toApiJson' in this.filters ? this.filters.toApiJson() : this.filters;
|
|
625
|
+
}
|
|
626
|
+
if (typeof this.pagingOptions !== 'undefined' && this.pagingOptions !== null) {
|
|
627
|
+
toReturn['pagingOptions'] = 'toApiJson' in this.pagingOptions ? this.pagingOptions.toApiJson() : this.pagingOptions;
|
|
628
|
+
}
|
|
629
|
+
return toReturn;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
export class ListMessagesResponse {
|
|
633
|
+
constructor(kwargs) {
|
|
634
|
+
if (!kwargs) {
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
Object.assign(this, kwargs);
|
|
638
|
+
}
|
|
639
|
+
static fromProto(proto) {
|
|
640
|
+
let m = new ListMessagesResponse();
|
|
641
|
+
m = Object.assign(m, proto);
|
|
642
|
+
if (proto.messages) {
|
|
643
|
+
m.messages = proto.messages.map(Message.fromProto);
|
|
644
|
+
}
|
|
645
|
+
if (proto.pagingMetadata) {
|
|
646
|
+
m.pagingMetadata = PagedResponseMetadata.fromProto(proto.pagingMetadata);
|
|
647
|
+
}
|
|
648
|
+
return m;
|
|
649
|
+
}
|
|
650
|
+
toApiJson() {
|
|
651
|
+
const toReturn = {};
|
|
652
|
+
if (typeof this.messages !== 'undefined' && this.messages !== null) {
|
|
653
|
+
toReturn['messages'] = 'toApiJson' in this.messages ? this.messages.toApiJson() : this.messages;
|
|
654
|
+
}
|
|
655
|
+
if (typeof this.pagingMetadata !== 'undefined' && this.pagingMetadata !== null) {
|
|
656
|
+
toReturn['pagingMetadata'] = 'toApiJson' in this.pagingMetadata ? this.pagingMetadata.toApiJson() : this.pagingMetadata;
|
|
657
|
+
}
|
|
658
|
+
return toReturn;
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
export class LookupConversationsRequestLookupConversationsFilters {
|
|
662
|
+
constructor(kwargs) {
|
|
663
|
+
if (!kwargs) {
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
Object.assign(this, kwargs);
|
|
667
|
+
}
|
|
668
|
+
static fromProto(proto) {
|
|
669
|
+
let m = new LookupConversationsRequestLookupConversationsFilters();
|
|
670
|
+
m = Object.assign(m, proto);
|
|
671
|
+
if (proto.location) {
|
|
672
|
+
m.location = enumStringToValue(e.PlatformLocation, proto.location);
|
|
673
|
+
}
|
|
674
|
+
if (proto.channel) {
|
|
675
|
+
m.channel = enumStringToValue(e.ConversationChannel, proto.channel);
|
|
676
|
+
}
|
|
677
|
+
if (proto.originLocation) {
|
|
678
|
+
m.originLocation = enumStringToValue(e.PlatformLocation, proto.originLocation);
|
|
679
|
+
}
|
|
680
|
+
return m;
|
|
681
|
+
}
|
|
682
|
+
toApiJson() {
|
|
683
|
+
const toReturn = {};
|
|
684
|
+
if (typeof this.internalParticipantId !== 'undefined') {
|
|
685
|
+
toReturn['internalParticipantId'] = this.internalParticipantId;
|
|
686
|
+
}
|
|
687
|
+
if (typeof this.location !== 'undefined') {
|
|
688
|
+
toReturn['location'] = this.location;
|
|
689
|
+
}
|
|
690
|
+
if (typeof this.channel !== 'undefined') {
|
|
691
|
+
toReturn['channel'] = this.channel;
|
|
692
|
+
}
|
|
693
|
+
if (typeof this.accountGroupId !== 'undefined') {
|
|
694
|
+
toReturn['accountGroupId'] = this.accountGroupId;
|
|
695
|
+
}
|
|
696
|
+
if (typeof this.externalConversationId !== 'undefined') {
|
|
697
|
+
toReturn['externalConversationId'] = this.externalConversationId;
|
|
698
|
+
}
|
|
699
|
+
if (typeof this.originLocation !== 'undefined') {
|
|
700
|
+
toReturn['originLocation'] = this.originLocation;
|
|
701
|
+
}
|
|
702
|
+
if (typeof this.originLocationExternalId !== 'undefined') {
|
|
703
|
+
toReturn['originLocationExternalId'] = this.originLocationExternalId;
|
|
704
|
+
}
|
|
705
|
+
return toReturn;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
export class LookupConversationsRequest {
|
|
709
|
+
constructor(kwargs) {
|
|
710
|
+
if (!kwargs) {
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
Object.assign(this, kwargs);
|
|
714
|
+
}
|
|
715
|
+
static fromProto(proto) {
|
|
716
|
+
let m = new LookupConversationsRequest();
|
|
717
|
+
m = Object.assign(m, proto);
|
|
718
|
+
if (proto.filters) {
|
|
719
|
+
m.filters = LookupConversationsRequestLookupConversationsFilters.fromProto(proto.filters);
|
|
720
|
+
}
|
|
721
|
+
if (proto.pagingOptions) {
|
|
722
|
+
m.pagingOptions = PagedRequestOptions.fromProto(proto.pagingOptions);
|
|
723
|
+
}
|
|
724
|
+
return m;
|
|
725
|
+
}
|
|
726
|
+
toApiJson() {
|
|
727
|
+
const toReturn = {};
|
|
728
|
+
if (typeof this.filters !== 'undefined' && this.filters !== null) {
|
|
729
|
+
toReturn['filters'] = 'toApiJson' in this.filters ? this.filters.toApiJson() : this.filters;
|
|
730
|
+
}
|
|
731
|
+
if (typeof this.pagingOptions !== 'undefined' && this.pagingOptions !== null) {
|
|
732
|
+
toReturn['pagingOptions'] = 'toApiJson' in this.pagingOptions ? this.pagingOptions.toApiJson() : this.pagingOptions;
|
|
733
|
+
}
|
|
734
|
+
return toReturn;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
export class LookupConversationsResponse {
|
|
738
|
+
constructor(kwargs) {
|
|
739
|
+
if (!kwargs) {
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
Object.assign(this, kwargs);
|
|
743
|
+
}
|
|
744
|
+
static fromProto(proto) {
|
|
745
|
+
let m = new LookupConversationsResponse();
|
|
746
|
+
m = Object.assign(m, proto);
|
|
747
|
+
if (proto.conversations) {
|
|
748
|
+
m.conversations = proto.conversations.map(LookupConversationsResponseConversations.fromProto);
|
|
749
|
+
}
|
|
750
|
+
if (proto.pagingMetadata) {
|
|
751
|
+
m.pagingMetadata = PagedResponseMetadata.fromProto(proto.pagingMetadata);
|
|
752
|
+
}
|
|
753
|
+
return m;
|
|
754
|
+
}
|
|
755
|
+
toApiJson() {
|
|
756
|
+
const toReturn = {};
|
|
757
|
+
if (typeof this.conversations !== 'undefined' && this.conversations !== null) {
|
|
758
|
+
toReturn['conversations'] = 'toApiJson' in this.conversations ? this.conversations.toApiJson() : this.conversations;
|
|
759
|
+
}
|
|
760
|
+
if (typeof this.pagingMetadata !== 'undefined' && this.pagingMetadata !== null) {
|
|
761
|
+
toReturn['pagingMetadata'] = 'toApiJson' in this.pagingMetadata ? this.pagingMetadata.toApiJson() : this.pagingMetadata;
|
|
762
|
+
}
|
|
763
|
+
return toReturn;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
export class Metadata {
|
|
767
|
+
constructor(kwargs) {
|
|
768
|
+
if (!kwargs) {
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
Object.assign(this, kwargs);
|
|
772
|
+
}
|
|
773
|
+
static fromProto(proto) {
|
|
774
|
+
let m = new Metadata();
|
|
775
|
+
m = Object.assign(m, proto);
|
|
776
|
+
if (proto.identifier) {
|
|
777
|
+
m.identifier = enumStringToValue(e.MetadataIdentifier, proto.identifier);
|
|
778
|
+
}
|
|
779
|
+
if (proto.data) {
|
|
780
|
+
m.data = Object.keys(proto.data).reduce((obj, k) => { obj[k] = proto.data[k]; return obj; }, {});
|
|
781
|
+
}
|
|
782
|
+
return m;
|
|
783
|
+
}
|
|
784
|
+
toApiJson() {
|
|
785
|
+
const toReturn = {};
|
|
786
|
+
if (typeof this.identifier !== 'undefined') {
|
|
787
|
+
toReturn['identifier'] = this.identifier;
|
|
788
|
+
}
|
|
789
|
+
if (typeof this.data !== 'undefined' && this.data !== null) {
|
|
790
|
+
toReturn['data'] = 'toApiJson' in this.data ? this.data.toApiJson() : this.data;
|
|
791
|
+
}
|
|
792
|
+
return toReturn;
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
export class ReceiveMessageRequestMetadataEntry {
|
|
796
|
+
constructor(kwargs) {
|
|
797
|
+
if (!kwargs) {
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
Object.assign(this, kwargs);
|
|
801
|
+
}
|
|
802
|
+
static fromProto(proto) {
|
|
803
|
+
let m = new ReceiveMessageRequestMetadataEntry();
|
|
804
|
+
m = Object.assign(m, proto);
|
|
805
|
+
return m;
|
|
806
|
+
}
|
|
807
|
+
toApiJson() {
|
|
808
|
+
const toReturn = {};
|
|
809
|
+
if (typeof this.key !== 'undefined') {
|
|
810
|
+
toReturn['key'] = this.key;
|
|
811
|
+
}
|
|
812
|
+
if (typeof this.value !== 'undefined') {
|
|
813
|
+
toReturn['value'] = this.value;
|
|
814
|
+
}
|
|
815
|
+
return toReturn;
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
export class PagedRequestOptions {
|
|
819
|
+
constructor(kwargs) {
|
|
820
|
+
if (!kwargs) {
|
|
821
|
+
return;
|
|
822
|
+
}
|
|
823
|
+
Object.assign(this, kwargs);
|
|
824
|
+
}
|
|
825
|
+
static fromProto(proto) {
|
|
826
|
+
let m = new PagedRequestOptions();
|
|
827
|
+
m = Object.assign(m, proto);
|
|
828
|
+
return m;
|
|
829
|
+
}
|
|
830
|
+
toApiJson() {
|
|
831
|
+
const toReturn = {};
|
|
832
|
+
if (typeof this.cursor !== 'undefined') {
|
|
833
|
+
toReturn['cursor'] = this.cursor;
|
|
834
|
+
}
|
|
835
|
+
if (typeof this.pageSize !== 'undefined') {
|
|
836
|
+
toReturn['pageSize'] = this.pageSize;
|
|
837
|
+
}
|
|
838
|
+
return toReturn;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
export class PagedResponseMetadata {
|
|
842
|
+
constructor(kwargs) {
|
|
843
|
+
if (!kwargs) {
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
846
|
+
Object.assign(this, kwargs);
|
|
847
|
+
}
|
|
848
|
+
static fromProto(proto) {
|
|
849
|
+
let m = new PagedResponseMetadata();
|
|
850
|
+
m = Object.assign(m, proto);
|
|
851
|
+
return m;
|
|
852
|
+
}
|
|
853
|
+
toApiJson() {
|
|
854
|
+
const toReturn = {};
|
|
855
|
+
if (typeof this.nextCursor !== 'undefined') {
|
|
856
|
+
toReturn['nextCursor'] = this.nextCursor;
|
|
857
|
+
}
|
|
858
|
+
if (typeof this.hasMore !== 'undefined') {
|
|
859
|
+
toReturn['hasMore'] = this.hasMore;
|
|
860
|
+
}
|
|
861
|
+
return toReturn;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
export class ReceiveMessageRequest {
|
|
865
|
+
constructor(kwargs) {
|
|
866
|
+
if (!kwargs) {
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
Object.assign(this, kwargs);
|
|
870
|
+
}
|
|
871
|
+
static fromProto(proto) {
|
|
872
|
+
let m = new ReceiveMessageRequest();
|
|
873
|
+
m = Object.assign(m, proto);
|
|
874
|
+
if (proto.channel) {
|
|
875
|
+
m.channel = enumStringToValue(e.ConversationChannel, proto.channel);
|
|
876
|
+
}
|
|
877
|
+
if (proto.type) {
|
|
878
|
+
m.type = enumStringToValue(e.MessageType, proto.type);
|
|
879
|
+
}
|
|
880
|
+
if (proto.location) {
|
|
881
|
+
m.location = enumStringToValue(e.PlatformLocation, proto.location);
|
|
882
|
+
}
|
|
883
|
+
if (proto.metadata) {
|
|
884
|
+
m.metadata = Object.keys(proto.metadata).reduce((obj, k) => { obj[k] = proto.metadata[k]; return obj; }, {});
|
|
885
|
+
}
|
|
886
|
+
return m;
|
|
887
|
+
}
|
|
888
|
+
toApiJson() {
|
|
889
|
+
const toReturn = {};
|
|
890
|
+
if (typeof this.senderId !== 'undefined') {
|
|
891
|
+
toReturn['senderId'] = this.senderId;
|
|
892
|
+
}
|
|
893
|
+
if (typeof this.recipientId !== 'undefined') {
|
|
894
|
+
toReturn['recipientId'] = this.recipientId;
|
|
895
|
+
}
|
|
896
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
897
|
+
toReturn['conversationId'] = this.conversationId;
|
|
898
|
+
}
|
|
899
|
+
if (typeof this.messageId !== 'undefined') {
|
|
900
|
+
toReturn['messageId'] = this.messageId;
|
|
901
|
+
}
|
|
902
|
+
if (typeof this.body !== 'undefined') {
|
|
903
|
+
toReturn['body'] = this.body;
|
|
904
|
+
}
|
|
905
|
+
if (typeof this.channel !== 'undefined') {
|
|
906
|
+
toReturn['channel'] = this.channel;
|
|
907
|
+
}
|
|
908
|
+
if (typeof this.type !== 'undefined') {
|
|
909
|
+
toReturn['type'] = this.type;
|
|
910
|
+
}
|
|
911
|
+
if (typeof this.location !== 'undefined') {
|
|
912
|
+
toReturn['location'] = this.location;
|
|
913
|
+
}
|
|
914
|
+
if (typeof this.partnerId !== 'undefined') {
|
|
915
|
+
toReturn['partnerId'] = this.partnerId;
|
|
916
|
+
}
|
|
917
|
+
if (typeof this.accountGroupId !== 'undefined') {
|
|
918
|
+
toReturn['accountGroupId'] = this.accountGroupId;
|
|
919
|
+
}
|
|
920
|
+
if (typeof this.metadata !== 'undefined' && this.metadata !== null) {
|
|
921
|
+
toReturn['metadata'] = 'toApiJson' in this.metadata ? this.metadata.toApiJson() : this.metadata;
|
|
922
|
+
}
|
|
923
|
+
if (typeof this.media !== 'undefined') {
|
|
924
|
+
toReturn['media'] = this.media;
|
|
925
|
+
}
|
|
926
|
+
return toReturn;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
export class SearchConversationsRequest {
|
|
930
|
+
constructor(kwargs) {
|
|
931
|
+
if (!kwargs) {
|
|
932
|
+
return;
|
|
933
|
+
}
|
|
934
|
+
Object.assign(this, kwargs);
|
|
935
|
+
}
|
|
936
|
+
static fromProto(proto) {
|
|
937
|
+
let m = new SearchConversationsRequest();
|
|
938
|
+
m = Object.assign(m, proto);
|
|
939
|
+
if (proto.location) {
|
|
940
|
+
m.location = enumStringToValue(e.PlatformLocation, proto.location);
|
|
941
|
+
}
|
|
942
|
+
if (proto.pagingOptions) {
|
|
943
|
+
m.pagingOptions = PagedRequestOptions.fromProto(proto.pagingOptions);
|
|
944
|
+
}
|
|
945
|
+
return m;
|
|
946
|
+
}
|
|
947
|
+
toApiJson() {
|
|
948
|
+
const toReturn = {};
|
|
949
|
+
if (typeof this.partnerId !== 'undefined') {
|
|
950
|
+
toReturn['partnerId'] = this.partnerId;
|
|
951
|
+
}
|
|
952
|
+
if (typeof this.accountGroupId !== 'undefined') {
|
|
953
|
+
toReturn['accountGroupId'] = this.accountGroupId;
|
|
954
|
+
}
|
|
955
|
+
if (typeof this.location !== 'undefined') {
|
|
956
|
+
toReturn['location'] = this.location;
|
|
957
|
+
}
|
|
958
|
+
if (typeof this.searchTerm !== 'undefined') {
|
|
959
|
+
toReturn['searchTerm'] = this.searchTerm;
|
|
960
|
+
}
|
|
961
|
+
if (typeof this.pagingOptions !== 'undefined' && this.pagingOptions !== null) {
|
|
962
|
+
toReturn['pagingOptions'] = 'toApiJson' in this.pagingOptions ? this.pagingOptions.toApiJson() : this.pagingOptions;
|
|
963
|
+
}
|
|
964
|
+
return toReturn;
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
export class SearchConversationsResponse {
|
|
968
|
+
constructor(kwargs) {
|
|
969
|
+
if (!kwargs) {
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
Object.assign(this, kwargs);
|
|
973
|
+
}
|
|
974
|
+
static fromProto(proto) {
|
|
975
|
+
let m = new SearchConversationsResponse();
|
|
976
|
+
m = Object.assign(m, proto);
|
|
977
|
+
if (proto.conversations) {
|
|
978
|
+
m.conversations = proto.conversations.map(SearchConversationsResponseDetailedConversation.fromProto);
|
|
979
|
+
}
|
|
980
|
+
if (proto.pagingMetadata) {
|
|
981
|
+
m.pagingMetadata = PagedResponseMetadata.fromProto(proto.pagingMetadata);
|
|
982
|
+
}
|
|
983
|
+
return m;
|
|
984
|
+
}
|
|
985
|
+
toApiJson() {
|
|
986
|
+
const toReturn = {};
|
|
987
|
+
if (typeof this.conversations !== 'undefined' && this.conversations !== null) {
|
|
988
|
+
toReturn['conversations'] = 'toApiJson' in this.conversations ? this.conversations.toApiJson() : this.conversations;
|
|
989
|
+
}
|
|
990
|
+
if (typeof this.pagingMetadata !== 'undefined' && this.pagingMetadata !== null) {
|
|
991
|
+
toReturn['pagingMetadata'] = 'toApiJson' in this.pagingMetadata ? this.pagingMetadata.toApiJson() : this.pagingMetadata;
|
|
992
|
+
}
|
|
993
|
+
return toReturn;
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
export class SendMessageRequest {
|
|
997
|
+
constructor(kwargs) {
|
|
998
|
+
if (!kwargs) {
|
|
999
|
+
return;
|
|
1000
|
+
}
|
|
1001
|
+
Object.assign(this, kwargs);
|
|
1002
|
+
}
|
|
1003
|
+
static fromProto(proto) {
|
|
1004
|
+
let m = new SendMessageRequest();
|
|
1005
|
+
m = Object.assign(m, proto);
|
|
1006
|
+
if (proto.sender) {
|
|
1007
|
+
m.sender = Participant.fromProto(proto.sender);
|
|
1008
|
+
}
|
|
1009
|
+
if (proto.recipient) {
|
|
1010
|
+
m.recipient = Participant.fromProto(proto.recipient);
|
|
1011
|
+
}
|
|
1012
|
+
if (proto.type) {
|
|
1013
|
+
m.type = enumStringToValue(e.MessageType, proto.type);
|
|
1014
|
+
}
|
|
1015
|
+
if (proto.metadata) {
|
|
1016
|
+
m.metadata = proto.metadata.map(Metadata.fromProto);
|
|
1017
|
+
}
|
|
1018
|
+
return m;
|
|
1019
|
+
}
|
|
1020
|
+
toApiJson() {
|
|
1021
|
+
const toReturn = {};
|
|
1022
|
+
if (typeof this.sender !== 'undefined' && this.sender !== null) {
|
|
1023
|
+
toReturn['sender'] = 'toApiJson' in this.sender ? this.sender.toApiJson() : this.sender;
|
|
1024
|
+
}
|
|
1025
|
+
if (typeof this.recipient !== 'undefined' && this.recipient !== null) {
|
|
1026
|
+
toReturn['recipient'] = 'toApiJson' in this.recipient ? this.recipient.toApiJson() : this.recipient;
|
|
1027
|
+
}
|
|
1028
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
1029
|
+
toReturn['conversationId'] = this.conversationId;
|
|
1030
|
+
}
|
|
1031
|
+
if (typeof this.type !== 'undefined') {
|
|
1032
|
+
toReturn['type'] = this.type;
|
|
1033
|
+
}
|
|
1034
|
+
if (typeof this.body !== 'undefined') {
|
|
1035
|
+
toReturn['body'] = this.body;
|
|
1036
|
+
}
|
|
1037
|
+
if (typeof this.metadata !== 'undefined' && this.metadata !== null) {
|
|
1038
|
+
toReturn['metadata'] = 'toApiJson' in this.metadata ? this.metadata.toApiJson() : this.metadata;
|
|
1039
|
+
}
|
|
1040
|
+
return toReturn;
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
export class SendMessageResponse {
|
|
1044
|
+
constructor(kwargs) {
|
|
1045
|
+
if (!kwargs) {
|
|
1046
|
+
return;
|
|
1047
|
+
}
|
|
1048
|
+
Object.assign(this, kwargs);
|
|
1049
|
+
}
|
|
1050
|
+
static fromProto(proto) {
|
|
1051
|
+
let m = new SendMessageResponse();
|
|
1052
|
+
m = Object.assign(m, proto);
|
|
1053
|
+
return m;
|
|
1054
|
+
}
|
|
1055
|
+
toApiJson() {
|
|
1056
|
+
const toReturn = {};
|
|
1057
|
+
if (typeof this.workflowId !== 'undefined') {
|
|
1058
|
+
toReturn['workflowId'] = this.workflowId;
|
|
1059
|
+
}
|
|
1060
|
+
return toReturn;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
export class SetLastSeenRequest {
|
|
1064
|
+
constructor(kwargs) {
|
|
1065
|
+
if (!kwargs) {
|
|
1066
|
+
return;
|
|
1067
|
+
}
|
|
1068
|
+
Object.assign(this, kwargs);
|
|
1069
|
+
}
|
|
1070
|
+
static fromProto(proto) {
|
|
1071
|
+
let m = new SetLastSeenRequest();
|
|
1072
|
+
m = Object.assign(m, proto);
|
|
1073
|
+
return m;
|
|
1074
|
+
}
|
|
1075
|
+
toApiJson() {
|
|
1076
|
+
const toReturn = {};
|
|
1077
|
+
if (typeof this.conversationId !== 'undefined') {
|
|
1078
|
+
toReturn['conversationId'] = this.conversationId;
|
|
1079
|
+
}
|
|
1080
|
+
return toReturn;
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
export class SetLastSeenResponse {
|
|
1084
|
+
constructor(kwargs) {
|
|
1085
|
+
if (!kwargs) {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
Object.assign(this, kwargs);
|
|
1089
|
+
}
|
|
1090
|
+
static fromProto(proto) {
|
|
1091
|
+
let m = new SetLastSeenResponse();
|
|
1092
|
+
m = Object.assign(m, proto);
|
|
1093
|
+
if (proto.lastSeen) {
|
|
1094
|
+
m.lastSeen = new Date(proto.lastSeen);
|
|
1095
|
+
}
|
|
1096
|
+
return m;
|
|
1097
|
+
}
|
|
1098
|
+
toApiJson() {
|
|
1099
|
+
const toReturn = {};
|
|
1100
|
+
if (typeof this.lastSeen !== 'undefined' && this.lastSeen !== null) {
|
|
1101
|
+
toReturn['lastSeen'] = 'toApiJson' in this.lastSeen ? this.lastSeen.toApiJson() : this.lastSeen;
|
|
1102
|
+
}
|
|
1103
|
+
return toReturn;
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
export class UpdateMessageStatusRequest {
|
|
1107
|
+
constructor(kwargs) {
|
|
1108
|
+
if (!kwargs) {
|
|
1109
|
+
return;
|
|
1110
|
+
}
|
|
1111
|
+
Object.assign(this, kwargs);
|
|
1112
|
+
}
|
|
1113
|
+
static fromProto(proto) {
|
|
1114
|
+
let m = new UpdateMessageStatusRequest();
|
|
1115
|
+
m = Object.assign(m, proto);
|
|
1116
|
+
if (proto.status) {
|
|
1117
|
+
m.status = enumStringToValue(e.MessageStatus, proto.status);
|
|
1118
|
+
}
|
|
1119
|
+
return m;
|
|
1120
|
+
}
|
|
1121
|
+
toApiJson() {
|
|
1122
|
+
const toReturn = {};
|
|
1123
|
+
if (typeof this.messageId !== 'undefined') {
|
|
1124
|
+
toReturn['messageId'] = this.messageId;
|
|
1125
|
+
}
|
|
1126
|
+
if (typeof this.participantId !== 'undefined') {
|
|
1127
|
+
toReturn['participantId'] = this.participantId;
|
|
1128
|
+
}
|
|
1129
|
+
if (typeof this.status !== 'undefined') {
|
|
1130
|
+
toReturn['status'] = this.status;
|
|
1131
|
+
}
|
|
1132
|
+
return toReturn;
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vY29udmVyc2F0aW9uX3Nkay9zcmMvbGliL19pbnRlcm5hbC9vYmplY3RzL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxpQkFBaUIsQ0FBSSxPQUFZLEVBQUUsS0FBYTtJQUM5RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sT0FBTywyQkFBMkI7SUFXcEMsWUFBWSxNQUErQztRQUN2RCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsT0FBTztTQUNWO1FBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVpELE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsR0FBRyxJQUFJLDJCQUEyQixFQUFFLENBQUM7UUFDMUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQUM7UUFDekYsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBU0QsU0FBUztRQUNMLE1B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TCxNQUFNLFFBQVEsR0FFVixFQUFFLENBQUM7UUFFUCxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUU7WUFBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUFDO1FBQ3BGLElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFdBQVcsRUFBRTtZQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQUM7UUFDaEcsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FBQztRQUMzRSxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vIENvZGUgZ2VuZXJhdGVkIGJ5IHNka2dlblxuLy8gRE8gTk9UIEVESVQhLlxuLy9cbi8vIE9iamVjdHMuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCAqIGFzIGkgZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NvbnZlcnNhdGlvbn0gZnJvbSAnLi9jb252ZXJzYXRpb24nO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHtQYXJ0aWNpcGFudH0gZnJvbSAnLi9wYXJ0aWNpcGFudCc7XG5pbXBvcnQgKiBhcyBlIGZyb20gJy4uL2VudW1zJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVudW1TdHJpbmdUb1ZhbHVlPEU+KGVudW1SZWY6IGFueSwgdmFsdWU6IHN0cmluZyk6IEUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gZW51bVJlZlt2YWx1ZV07XG59XG5cbmV4cG9ydCBjbGFzcyBBZGRNdWx0aVBhcnRpY2lwYW50c1JlcXVlc3QgaW1wbGVtZW50cyBpLkFkZE11bHRpUGFydGljaXBhbnRzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgICBwYXJ0aWNpcGFudHM6IFBhcnRpY2lwYW50W107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBBZGRNdWx0aVBhcnRpY2lwYW50c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBBZGRNdWx0aVBhcnRpY2lwYW50c1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ucGFydGljaXBhbnRzKSB7bS5wYXJ0aWNpcGFudHMgPSBwcm90by5wYXJ0aWNpcGFudHMubWFwKFBhcnRpY2lwYW50LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkFkZE11bHRpUGFydGljaXBhbnRzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0aWNpcGFudHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFydGljaXBhbnRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhcnRpY2lwYW50cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wYXJ0aWNpcGFudHMgPyAodGhpcy5wYXJ0aWNpcGFudHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFydGljaXBhbnRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkZE11bHRpUGFydGljaXBhbnRzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkFkZE11bHRpUGFydGljaXBhbnRzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEFkZE11bHRpUGFydGljaXBhbnRzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBBZGRNdWx0aVBhcnRpY2lwYW50c1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBhcnRpY2lwYW50cykge20ucGFydGljaXBhbnRzID0gcHJvdG8ucGFydGljaXBhbnRzLm1hcChQYXJ0aWNpcGFudC5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5BZGRNdWx0aVBhcnRpY2lwYW50c1Jlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFydGljaXBhbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gbnVsbCkge3RvUmV0dXJuWydwYXJ0aWNpcGFudHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFydGljaXBhbnRzID8gKHRoaXMucGFydGljaXBhbnRzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBhcnRpY2lwYW50czt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252ZXJzYXRpb25NZXNzYWdlQ291bnQgaW1wbGVtZW50cyBpLkNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudEludGVyZmFjZSB7XG4gICAgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgICBjb3VudDogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ29udmVyc2F0aW9uTWVzc2FnZUNvdW50IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgQ29udmVyc2F0aW9uTWVzc2FnZUNvdW50KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNvdW50KSB7bS5jb3VudCA9IHBhcnNlSW50KHByb3RvLmNvdW50LCAxMCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY291bnQnXSA9IHRoaXMuY291bnQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlQ29udmVyc2F0aW9ucyBpbXBsZW1lbnRzIGkuTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlQ29udmVyc2F0aW9uc0ludGVyZmFjZSB7XG4gICAgY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb247XG4gICAgcGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlQ29udmVyc2F0aW9ucyB7XG4gICAgICAgIGxldCBtID0gbmV3IExvb2t1cENvbnZlcnNhdGlvbnNSZXNwb25zZUNvbnZlcnNhdGlvbnMoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY29udmVyc2F0aW9uKSB7bS5jb252ZXJzYXRpb24gPSBDb252ZXJzYXRpb24uZnJvbVByb3RvKHByb3RvLmNvbnZlcnNhdGlvbik7fVxuICAgICAgICBpZiAocHJvdG8ucGFydGljaXBhbnRzKSB7bS5wYXJ0aWNpcGFudHMgPSBwcm90by5wYXJ0aWNpcGFudHMubWFwKFBhcnRpY2lwYW50LmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxvb2t1cENvbnZlcnNhdGlvbnNSZXNwb25zZUNvbnZlcnNhdGlvbnNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb24gIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY29udmVyc2F0aW9uICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvbnZlcnNhdGlvbiddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jb252ZXJzYXRpb24gPyAodGhpcy5jb252ZXJzYXRpb24gYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY29udmVyc2F0aW9uO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYXJ0aWNpcGFudHMgIT09IG51bGwpIHt0b1JldHVyblsncGFydGljaXBhbnRzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhcnRpY2lwYW50cyA/ICh0aGlzLnBhcnRpY2lwYW50cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYXJ0aWNpcGFudHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXNwb25zZUNvdW50c0VudHJ5IGltcGxlbWVudHMgaS5HZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlc3BvbnNlQ291bnRzRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBudW1iZXI7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlc3BvbnNlQ291bnRzRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlc3BvbnNlQ291bnRzRW50cnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8udmFsdWUpIHttLnZhbHVlID0gcGFyc2VJbnQocHJvdG8udmFsdWUsIDEwKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXNwb25zZUNvdW50c0VudHJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZSddID0gdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVDb252ZXJzYXRpb25SZXF1ZXN0IGltcGxlbWVudHMgaS5DcmVhdGVDb252ZXJzYXRpb25SZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBwYXJ0aWNpcGFudHM6IFBhcnRpY2lwYW50W107XG4gICAgY2hhbm5lbDogZS5Db252ZXJzYXRpb25DaGFubmVsO1xuICAgIGV4dGVybmFsQ29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgICBjcmVhdGVkOiBEYXRlO1xuICAgIHVwZGF0ZWQ6IERhdGU7XG4gICAgb3JpZ2luTG9jYXRpb246IGUuUGxhdGZvcm1Mb2NhdGlvbjtcbiAgICBvcmlnaW5Mb2NhdGlvbkV4dGVybmFsSWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IENyZWF0ZUNvbnZlcnNhdGlvblJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVDb252ZXJzYXRpb25SZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnBhcnRpY2lwYW50cykge20ucGFydGljaXBhbnRzID0gcHJvdG8ucGFydGljaXBhbnRzLm1hcChQYXJ0aWNpcGFudC5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmNoYW5uZWwpIHttLmNoYW5uZWwgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkNvbnZlcnNhdGlvbkNoYW5uZWw+KGUuQ29udmVyc2F0aW9uQ2hhbm5lbCwgcHJvdG8uY2hhbm5lbCk7fVxuICAgICAgICBpZiAocHJvdG8uY3JlYXRlZCkge20uY3JlYXRlZCA9IG5ldyBEYXRlKHByb3RvLmNyZWF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLnVwZGF0ZWQpIHttLnVwZGF0ZWQgPSBuZXcgRGF0ZShwcm90by51cGRhdGVkKTt9XG4gICAgICAgIGlmIChwcm90by5vcmlnaW5Mb2NhdGlvbikge20ub3JpZ2luTG9jYXRpb24gPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLlBsYXRmb3JtTG9jYXRpb24+KGUuUGxhdGZvcm1Mb2NhdGlvbiwgcHJvdG8ub3JpZ2luTG9jYXRpb24pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5DcmVhdGVDb252ZXJzYXRpb25SZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFydGljaXBhbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gbnVsbCkge3RvUmV0dXJuWydwYXJ0aWNpcGFudHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFydGljaXBhbnRzID8gKHRoaXMucGFydGljaXBhbnRzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBhcnRpY2lwYW50czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jaGFubmVsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjaGFubmVsJ10gPSB0aGlzLmNoYW5uZWw7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZXh0ZXJuYWxDb252ZXJzYXRpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZXh0ZXJuYWxDb252ZXJzYXRpb25JZCddID0gdGhpcy5leHRlcm5hbENvbnZlcnNhdGlvbklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNyZWF0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY3JlYXRlZCAhPT0gbnVsbCkge3RvUmV0dXJuWydjcmVhdGVkJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNyZWF0ZWQgPyAodGhpcy5jcmVhdGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmNyZWF0ZWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudXBkYXRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy51cGRhdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ3VwZGF0ZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudXBkYXRlZCA/ICh0aGlzLnVwZGF0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudXBkYXRlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcmlnaW5Mb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3JpZ2luTG9jYXRpb24nXSA9IHRoaXMub3JpZ2luTG9jYXRpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luTG9jYXRpb25FeHRlcm5hbElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydvcmlnaW5Mb2NhdGlvbkV4dGVybmFsSWQnXSA9IHRoaXMub3JpZ2luTG9jYXRpb25FeHRlcm5hbElkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyZWF0ZUNvbnZlcnNhdGlvblJlc3BvbnNlIGltcGxlbWVudHMgaS5DcmVhdGVDb252ZXJzYXRpb25SZXNwb25zZUludGVyZmFjZSB7XG4gICAgY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb247XG4gICAgcGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlQ29udmVyc2F0aW9uUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVDb252ZXJzYXRpb25SZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5jb252ZXJzYXRpb24pIHttLmNvbnZlcnNhdGlvbiA9IENvbnZlcnNhdGlvbi5mcm9tUHJvdG8ocHJvdG8uY29udmVyc2F0aW9uKTt9XG4gICAgICAgIGlmIChwcm90by5wYXJ0aWNpcGFudHMpIHttLnBhcnRpY2lwYW50cyA9IHByb3RvLnBhcnRpY2lwYW50cy5tYXAoUGFydGljaXBhbnQuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlQ29udmVyc2F0aW9uUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb24gIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY29udmVyc2F0aW9uICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvbnZlcnNhdGlvbiddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jb252ZXJzYXRpb24gPyAodGhpcy5jb252ZXJzYXRpb24gYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY29udmVyc2F0aW9uO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYXJ0aWNpcGFudHMgIT09IG51bGwpIHt0b1JldHVyblsncGFydGljaXBhbnRzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhcnRpY2lwYW50cyA/ICh0aGlzLnBhcnRpY2lwYW50cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYXJ0aWNpcGFudHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ3JlYXRlTXVsdGlNZXNzYWdlc1JlcXVlc3QgaW1wbGVtZW50cyBpLkNyZWF0ZU11bHRpTWVzc2FnZXNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZXNzYWdlczogTWVzc2FnZVtdO1xuICAgIGxhc3RTZWVuOiBEYXRlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ3JlYXRlTXVsdGlNZXNzYWdlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBDcmVhdGVNdWx0aU1lc3NhZ2VzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZXNzYWdlcykge20ubWVzc2FnZXMgPSBwcm90by5tZXNzYWdlcy5tYXAoTWVzc2FnZS5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLmxhc3RTZWVuKSB7bS5sYXN0U2VlbiA9IG5ldyBEYXRlKHByb3RvLmxhc3RTZWVuKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ3JlYXRlTXVsdGlNZXNzYWdlc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXNzYWdlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXNzYWdlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydtZXNzYWdlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZXNzYWdlcyA/ICh0aGlzLm1lc3NhZ2VzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lc3NhZ2VzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxhc3RTZWVuICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxhc3RTZWVuICE9PSBudWxsKSB7dG9SZXR1cm5bJ2xhc3RTZWVuJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmxhc3RTZWVuID8gKHRoaXMubGFzdFNlZW4gYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubGFzdFNlZW47fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWV0YWRhdGFEYXRhRW50cnkgaW1wbGVtZW50cyBpLk1ldGFkYXRhRGF0YUVudHJ5SW50ZXJmYWNlIHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB2YWx1ZTogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTWV0YWRhdGFEYXRhRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBNZXRhZGF0YURhdGFFbnRyeSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTWV0YWRhdGFEYXRhRW50cnlJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3ZhbHVlJ10gPSB0aGlzLnZhbHVlO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlbGV0ZUNvbnZlcnNhdGlvblJlcXVlc3QgaW1wbGVtZW50cyBpLkRlbGV0ZUNvbnZlcnNhdGlvblJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBEZWxldGVDb252ZXJzYXRpb25SZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgRGVsZXRlQ29udmVyc2F0aW9uUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRGVsZXRlQ29udmVyc2F0aW9uUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWxldGVNZXNzYWdlUmVxdWVzdCBpbXBsZW1lbnRzIGkuRGVsZXRlTWVzc2FnZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIG1lc3NhZ2VJZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogRGVsZXRlTWVzc2FnZVJlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBEZWxldGVNZXNzYWdlUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuRGVsZXRlTWVzc2FnZVJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXNzYWdlSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lc3NhZ2VJZCddID0gdGhpcy5tZXNzYWdlSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VhcmNoQ29udmVyc2F0aW9uc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb24gaW1wbGVtZW50cyBpLlNlYXJjaENvbnZlcnNhdGlvbnNSZXNwb25zZURldGFpbGVkQ29udmVyc2F0aW9uSW50ZXJmYWNlIHtcbiAgICBjb252ZXJzYXRpb246IENvbnZlcnNhdGlvbjtcbiAgICBsYXRlc3RNZXNzYWdlOiBNZXNzYWdlO1xuICAgIHBhcnRpY2lwYW50czogUGFydGljaXBhbnRbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNlYXJjaENvbnZlcnNhdGlvbnNSZXNwb25zZURldGFpbGVkQ29udmVyc2F0aW9uIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2VhcmNoQ29udmVyc2F0aW9uc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY29udmVyc2F0aW9uKSB7bS5jb252ZXJzYXRpb24gPSBDb252ZXJzYXRpb24uZnJvbVByb3RvKHByb3RvLmNvbnZlcnNhdGlvbik7fVxuICAgICAgICBpZiAocHJvdG8ubGF0ZXN0TWVzc2FnZSkge20ubGF0ZXN0TWVzc2FnZSA9IE1lc3NhZ2UuZnJvbVByb3RvKHByb3RvLmxhdGVzdE1lc3NhZ2UpO31cbiAgICAgICAgaWYgKHByb3RvLnBhcnRpY2lwYW50cykge20ucGFydGljaXBhbnRzID0gcHJvdG8ucGFydGljaXBhbnRzLm1hcChQYXJ0aWNpcGFudC5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TZWFyY2hDb252ZXJzYXRpb25zUmVzcG9uc2VEZXRhaWxlZENvbnZlcnNhdGlvbkludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jb252ZXJzYXRpb24gIT09IG51bGwpIHt0b1JldHVyblsnY29udmVyc2F0aW9uJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNvbnZlcnNhdGlvbiA/ICh0aGlzLmNvbnZlcnNhdGlvbiBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jb252ZXJzYXRpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGF0ZXN0TWVzc2FnZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5sYXRlc3RNZXNzYWdlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2xhdGVzdE1lc3NhZ2UnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubGF0ZXN0TWVzc2FnZSA/ICh0aGlzLmxhdGVzdE1lc3NhZ2UgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubGF0ZXN0TWVzc2FnZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0aWNpcGFudHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFydGljaXBhbnRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhcnRpY2lwYW50cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wYXJ0aWNpcGFudHMgPyAodGhpcy5wYXJ0aWNpcGFudHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFydGljaXBhbnRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb24gaW1wbGVtZW50cyBpLkdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb25JbnRlcmZhY2Uge1xuICAgIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uO1xuICAgIGxhdGVzdE1lc3NhZ2U6IE1lc3NhZ2U7XG4gICAgcGFydGljaXBhbnRzOiBQYXJ0aWNpcGFudFtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVzcG9uc2VEZXRhaWxlZENvbnZlcnNhdGlvbiB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb24oKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY29udmVyc2F0aW9uKSB7bS5jb252ZXJzYXRpb24gPSBDb252ZXJzYXRpb24uZnJvbVByb3RvKHByb3RvLmNvbnZlcnNhdGlvbik7fVxuICAgICAgICBpZiAocHJvdG8ubGF0ZXN0TWVzc2FnZSkge20ubGF0ZXN0TWVzc2FnZSA9IE1lc3NhZ2UuZnJvbVByb3RvKHByb3RvLmxhdGVzdE1lc3NhZ2UpO31cbiAgICAgICAgaWYgKHByb3RvLnBhcnRpY2lwYW50cykge20ucGFydGljaXBhbnRzID0gcHJvdG8ucGFydGljaXBhbnRzLm1hcChQYXJ0aWNpcGFudC5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aUNvbnZlcnNhdGlvbkRldGFpbHNSZXNwb25zZURldGFpbGVkQ29udmVyc2F0aW9uSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29udmVyc2F0aW9uICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNvbnZlcnNhdGlvbiAhPT0gbnVsbCkge3RvUmV0dXJuWydjb252ZXJzYXRpb24nXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY29udmVyc2F0aW9uID8gKHRoaXMuY29udmVyc2F0aW9uIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmNvbnZlcnNhdGlvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sYXRlc3RNZXNzYWdlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmxhdGVzdE1lc3NhZ2UgIT09IG51bGwpIHt0b1JldHVyblsnbGF0ZXN0TWVzc2FnZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5sYXRlc3RNZXNzYWdlID8gKHRoaXMubGF0ZXN0TWVzc2FnZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5sYXRlc3RNZXNzYWdlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYXJ0aWNpcGFudHMgIT09IG51bGwpIHt0b1JldHVyblsncGFydGljaXBhbnRzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhcnRpY2lwYW50cyA/ICh0aGlzLnBhcnRpY2lwYW50cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYXJ0aWNpcGFudHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TWVzc2FnZVJlcXVlc3QgaW1wbGVtZW50cyBpLkdldE1lc3NhZ2VSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBtZXNzYWdlSWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE1lc3NhZ2VSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TWVzc2FnZVJlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE1lc3NhZ2VSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZXNzYWdlSWQnXSA9IHRoaXMubWVzc2FnZUlkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1JlcXVlc3QgaW1wbGVtZW50cyBpLkdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGNvbnZlcnNhdGlvbklkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aUNvbnZlcnNhdGlvbkRldGFpbHNSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbklkcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY29udmVyc2F0aW9uSWRzJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRNdWx0aUNvbnZlcnNhdGlvbkRldGFpbHNSZXNwb25zZSBpbXBsZW1lbnRzIGkuR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGNvbnZlcnNhdGlvbnM6IEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb25bXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVzcG9uc2UoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uY29udmVyc2F0aW9ucykge20uY29udmVyc2F0aW9ucyA9IHByb3RvLmNvbnZlcnNhdGlvbnMubWFwKEdldE11bHRpQ29udmVyc2F0aW9uRGV0YWlsc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb24uZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0TXVsdGlDb252ZXJzYXRpb25EZXRhaWxzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNvbnZlcnNhdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsnY29udmVyc2F0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jb252ZXJzYXRpb25zID8gKHRoaXMuY29udmVyc2F0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jb252ZXJzYXRpb25zO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpQ29udmVyc2F0aW9uTWVzc2FnZUNvdW50UmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjb252ZXJzYXRpb25JZHM6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25JZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2NvbnZlcnNhdGlvbklkcyddID0gdGhpcy5jb252ZXJzYXRpb25JZHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXNwb25zZSBpbXBsZW1lbnRzIGkuR2V0TXVsdGlDb252ZXJzYXRpb25NZXNzYWdlQ291bnRSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVzc2FnZUNvdW50czogQ29udmVyc2F0aW9uTWVzc2FnZUNvdW50W107XG4gICAgY291bnRzOiB7W2tleTogc3RyaW5nXTogbnVtYmVyfTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE11bHRpQ29udmVyc2F0aW9uTWVzc2FnZUNvdW50UmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLm1lc3NhZ2VDb3VudHMpIHttLm1lc3NhZ2VDb3VudHMgPSBwcm90by5tZXNzYWdlQ291bnRzLm1hcChDb252ZXJzYXRpb25NZXNzYWdlQ291bnQuZnJvbVByb3RvKTt9XG4gICAgICAgIGlmIChwcm90by5jb3VudHMpIHttLmNvdW50cyA9IE9iamVjdC5rZXlzKHByb3RvLmNvdW50cykucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwYXJzZUludChwcm90by5jb3VudHNba10sIDEwKTsgcmV0dXJuIG9iajsgfSwge30pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aUNvbnZlcnNhdGlvbk1lc3NhZ2VDb3VudFJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVzc2FnZUNvdW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXNzYWdlQ291bnRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lc3NhZ2VDb3VudHMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubWVzc2FnZUNvdW50cyA/ICh0aGlzLm1lc3NhZ2VDb3VudHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVzc2FnZUNvdW50czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb3VudHMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY291bnRzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NvdW50cyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jb3VudHMgPyAodGhpcy5jb3VudHMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY291bnRzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpTWVzc2FnZXNSZXF1ZXN0IGltcGxlbWVudHMgaS5HZXRNdWx0aU1lc3NhZ2VzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgbWVzc2FnZUlkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aU1lc3NhZ2VzUmVxdWVzdCB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE11bHRpTWVzc2FnZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aU1lc3NhZ2VzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lc3NhZ2VJZHMgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lc3NhZ2VJZHMnXSA9IHRoaXMubWVzc2FnZUlkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRNdWx0aU1lc3NhZ2VzUmVzcG9uc2UgaW1wbGVtZW50cyBpLkdldE11bHRpTWVzc2FnZXNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdldE11bHRpTWVzc2FnZXNSZXNwb25zZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEdldE11bHRpTWVzc2FnZXNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZXNzYWdlcykge20ubWVzc2FnZXMgPSBwcm90by5tZXNzYWdlcy5tYXAoTWVzc2FnZS5mcm9tUHJvdG8pO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5HZXRNdWx0aU1lc3NhZ2VzUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXNzYWdlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXNzYWdlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydtZXNzYWdlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZXNzYWdlcyA/ICh0aGlzLm1lc3NhZ2VzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1lc3NhZ2VzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldE11bHRpUGFydGljaXBhbnRzUmVxdWVzdCBpbXBsZW1lbnRzIGkuR2V0TXVsdGlQYXJ0aWNpcGFudHNSZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBwYXJ0aWNpcGFudElkczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVBhcnRpY2lwYW50c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBHZXRNdWx0aVBhcnRpY2lwYW50c1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdldE11bHRpUGFydGljaXBhbnRzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRpY2lwYW50SWRzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYXJ0aWNpcGFudElkcyddID0gdGhpcy5wYXJ0aWNpcGFudElkczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRNdWx0aVBhcnRpY2lwYW50c1Jlc3BvbnNlIGltcGxlbWVudHMgaS5HZXRNdWx0aVBhcnRpY2lwYW50c1Jlc3BvbnNlSW50ZXJmYWNlIHtcbiAgICBwYXJ0aWNpcGFudHM6IFBhcnRpY2lwYW50W107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBHZXRNdWx0aVBhcnRpY2lwYW50c1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2V0TXVsdGlQYXJ0aWNpcGFudHNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5wYXJ0aWNpcGFudHMpIHttLnBhcnRpY2lwYW50cyA9IHByb3RvLnBhcnRpY2lwYW50cy5tYXAoUGFydGljaXBhbnQuZnJvbVByb3RvKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuR2V0TXVsdGlQYXJ0aWNpcGFudHNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhcnRpY2lwYW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYXJ0aWNpcGFudHMgIT09IG51bGwpIHt0b1JldHVyblsncGFydGljaXBhbnRzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhcnRpY2lwYW50cyA/ICh0aGlzLnBhcnRpY2lwYW50cyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYXJ0aWNpcGFudHM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdE1lc3NhZ2VzUmVxdWVzdExpc3RNZXNzYWdlc0ZpbHRlcnMgaW1wbGVtZW50cyBpLkxpc3RNZXNzYWdlc1JlcXVlc3RMaXN0TWVzc2FnZXNGaWx0ZXJzSW50ZXJmYWNlIHtcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdE1lc3NhZ2VzUmVxdWVzdExpc3RNZXNzYWdlc0ZpbHRlcnMge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0TWVzc2FnZXNSZXF1ZXN0TGlzdE1lc3NhZ2VzRmlsdGVycygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTGlzdE1lc3NhZ2VzUmVxdWVzdExpc3RNZXNzYWdlc0ZpbHRlcnNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdE1lc3NhZ2VzUmVxdWVzdCBpbXBsZW1lbnRzIGkuTGlzdE1lc3NhZ2VzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgZmlsdGVyczogTGlzdE1lc3NhZ2VzUmVxdWVzdExpc3RNZXNzYWdlc0ZpbHRlcnM7XG4gICAgcGFnaW5nT3B0aW9uczogUGFnZWRSZXF1ZXN0T3B0aW9ucztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExpc3RNZXNzYWdlc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0TWVzc2FnZXNSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmZpbHRlcnMpIHttLmZpbHRlcnMgPSBMaXN0TWVzc2FnZXNSZXF1ZXN0TGlzdE1lc3NhZ2VzRmlsdGVycy5mcm9tUHJvdG8ocHJvdG8uZmlsdGVycyk7fVxuICAgICAgICBpZiAocHJvdG8ucGFnaW5nT3B0aW9ucykge20ucGFnaW5nT3B0aW9ucyA9IFBhZ2VkUmVxdWVzdE9wdGlvbnMuZnJvbVByb3RvKHByb3RvLnBhZ2luZ09wdGlvbnMpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0TWVzc2FnZXNSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmlsdGVycyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5maWx0ZXJzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2ZpbHRlcnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuZmlsdGVycyA/ICh0aGlzLmZpbHRlcnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZmlsdGVyczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYWdpbmdPcHRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhZ2luZ09wdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsncGFnaW5nT3B0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5wYWdpbmdPcHRpb25zID8gKHRoaXMucGFnaW5nT3B0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYWdpbmdPcHRpb25zO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpc3RNZXNzYWdlc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5MaXN0TWVzc2FnZXNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcbiAgICBwYWdpbmdNZXRhZGF0YTogUGFnZWRSZXNwb25zZU1ldGFkYXRhO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTGlzdE1lc3NhZ2VzUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBMaXN0TWVzc2FnZXNSZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5tZXNzYWdlcykge20ubWVzc2FnZXMgPSBwcm90by5tZXNzYWdlcy5tYXAoTWVzc2FnZS5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ01ldGFkYXRhKSB7bS5wYWdpbmdNZXRhZGF0YSA9IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YS5mcm9tUHJvdG8ocHJvdG8ucGFnaW5nTWV0YWRhdGEpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5MaXN0TWVzc2FnZXNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lc3NhZ2VzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1lc3NhZ2VzICE9PSBudWxsKSB7dG9SZXR1cm5bJ21lc3NhZ2VzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1lc3NhZ2VzID8gKHRoaXMubWVzc2FnZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWVzc2FnZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09IG51bGwpIHt0b1JldHVyblsncGFnaW5nTWV0YWRhdGEnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFnaW5nTWV0YWRhdGEgPyAodGhpcy5wYWdpbmdNZXRhZGF0YSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYWdpbmdNZXRhZGF0YTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMb29rdXBDb252ZXJzYXRpb25zUmVxdWVzdExvb2t1cENvbnZlcnNhdGlvbnNGaWx0ZXJzIGltcGxlbWVudHMgaS5Mb29rdXBDb252ZXJzYXRpb25zUmVxdWVzdExvb2t1cENvbnZlcnNhdGlvbnNGaWx0ZXJzSW50ZXJmYWNlIHtcbiAgICBpbnRlcm5hbFBhcnRpY2lwYW50SWQ6IHN0cmluZ1tdO1xuICAgIGxvY2F0aW9uOiBlLlBsYXRmb3JtTG9jYXRpb247XG4gICAgY2hhbm5lbDogZS5Db252ZXJzYXRpb25DaGFubmVsO1xuICAgIGFjY291bnRHcm91cElkOiBzdHJpbmc7XG4gICAgZXh0ZXJuYWxDb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICAgIG9yaWdpbkxvY2F0aW9uOiBlLlBsYXRmb3JtTG9jYXRpb247XG4gICAgb3JpZ2luTG9jYXRpb25FeHRlcm5hbElkOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMb29rdXBDb252ZXJzYXRpb25zUmVxdWVzdExvb2t1cENvbnZlcnNhdGlvbnNGaWx0ZXJzIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTG9va3VwQ29udmVyc2F0aW9uc1JlcXVlc3RMb29rdXBDb252ZXJzYXRpb25zRmlsdGVycygpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5sb2NhdGlvbikge20ubG9jYXRpb24gPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLlBsYXRmb3JtTG9jYXRpb24+KGUuUGxhdGZvcm1Mb2NhdGlvbiwgcHJvdG8ubG9jYXRpb24pO31cbiAgICAgICAgaWYgKHByb3RvLmNoYW5uZWwpIHttLmNoYW5uZWwgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkNvbnZlcnNhdGlvbkNoYW5uZWw+KGUuQ29udmVyc2F0aW9uQ2hhbm5lbCwgcHJvdG8uY2hhbm5lbCk7fVxuICAgICAgICBpZiAocHJvdG8ub3JpZ2luTG9jYXRpb24pIHttLm9yaWdpbkxvY2F0aW9uID0gZW51bVN0cmluZ1RvVmFsdWU8ZS5QbGF0Zm9ybUxvY2F0aW9uPihlLlBsYXRmb3JtTG9jYXRpb24sIHByb3RvLm9yaWdpbkxvY2F0aW9uKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTG9va3VwQ29udmVyc2F0aW9uc1JlcXVlc3RMb29rdXBDb252ZXJzYXRpb25zRmlsdGVyc0ludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmludGVybmFsUGFydGljaXBhbnRJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaW50ZXJuYWxQYXJ0aWNpcGFudElkJ10gPSB0aGlzLmludGVybmFsUGFydGljaXBhbnRJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbG9jYXRpb24nXSA9IHRoaXMubG9jYXRpb247fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY2hhbm5lbCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY2hhbm5lbCddID0gdGhpcy5jaGFubmVsO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmFjY291bnRHcm91cElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhY2NvdW50R3JvdXBJZCddID0gdGhpcy5hY2NvdW50R3JvdXBJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5leHRlcm5hbENvbnZlcnNhdGlvbklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydleHRlcm5hbENvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmV4dGVybmFsQ29udmVyc2F0aW9uSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3JpZ2luTG9jYXRpb24gIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ29yaWdpbkxvY2F0aW9uJ10gPSB0aGlzLm9yaWdpbkxvY2F0aW9uO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9yaWdpbkxvY2F0aW9uRXh0ZXJuYWxJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnb3JpZ2luTG9jYXRpb25FeHRlcm5hbElkJ10gPSB0aGlzLm9yaWdpbkxvY2F0aW9uRXh0ZXJuYWxJZDt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBMb29rdXBDb252ZXJzYXRpb25zUmVxdWVzdCBpbXBsZW1lbnRzIGkuTG9va3VwQ29udmVyc2F0aW9uc1JlcXVlc3RJbnRlcmZhY2Uge1xuICAgIGZpbHRlcnM6IExvb2t1cENvbnZlcnNhdGlvbnNSZXF1ZXN0TG9va3VwQ29udmVyc2F0aW9uc0ZpbHRlcnM7XG4gICAgcGFnaW5nT3B0aW9uczogUGFnZWRSZXF1ZXN0T3B0aW9ucztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IExvb2t1cENvbnZlcnNhdGlvbnNSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTG9va3VwQ29udmVyc2F0aW9uc1JlcXVlc3QoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uZmlsdGVycykge20uZmlsdGVycyA9IExvb2t1cENvbnZlcnNhdGlvbnNSZXF1ZXN0TG9va3VwQ29udmVyc2F0aW9uc0ZpbHRlcnMuZnJvbVByb3RvKHByb3RvLmZpbHRlcnMpO31cbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ09wdGlvbnMpIHttLnBhZ2luZ09wdGlvbnMgPSBQYWdlZFJlcXVlc3RPcHRpb25zLmZyb21Qcm90byhwcm90by5wYWdpbmdPcHRpb25zKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTG9va3VwQ29udmVyc2F0aW9uc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5maWx0ZXJzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmZpbHRlcnMgIT09IG51bGwpIHt0b1JldHVyblsnZmlsdGVycyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5maWx0ZXJzID8gKHRoaXMuZmlsdGVycyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5maWx0ZXJzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2luZ09wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nT3B0aW9ucyAhPT0gbnVsbCkge3RvUmV0dXJuWydwYWdpbmdPcHRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhZ2luZ09wdGlvbnMgPyAodGhpcy5wYWdpbmdPcHRpb25zIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnBhZ2luZ09wdGlvbnM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlIGltcGxlbWVudHMgaS5Mb29rdXBDb252ZXJzYXRpb25zUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIGNvbnZlcnNhdGlvbnM6IExvb2t1cENvbnZlcnNhdGlvbnNSZXNwb25zZUNvbnZlcnNhdGlvbnNbXTtcbiAgICBwYWdpbmdNZXRhZGF0YTogUGFnZWRSZXNwb25zZU1ldGFkYXRhO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTG9va3VwQ29udmVyc2F0aW9uc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNvbnZlcnNhdGlvbnMpIHttLmNvbnZlcnNhdGlvbnMgPSBwcm90by5jb252ZXJzYXRpb25zLm1hcChMb29rdXBDb252ZXJzYXRpb25zUmVzcG9uc2VDb252ZXJzYXRpb25zLmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8ucGFnaW5nTWV0YWRhdGEpIHttLnBhZ2luZ01ldGFkYXRhID0gUGFnZWRSZXNwb25zZU1ldGFkYXRhLmZyb21Qcm90byhwcm90by5wYWdpbmdNZXRhZGF0YSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxvb2t1cENvbnZlcnNhdGlvbnNSZXNwb25zZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnZlcnNhdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY29udmVyc2F0aW9ucyAhPT0gbnVsbCkge3RvUmV0dXJuWydjb252ZXJzYXRpb25zJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNvbnZlcnNhdGlvbnMgPyAodGhpcy5jb252ZXJzYXRpb25zIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmNvbnZlcnNhdGlvbnM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucGFnaW5nTWV0YWRhdGEgIT09IG51bGwpIHt0b1JldHVyblsncGFnaW5nTWV0YWRhdGEnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFnaW5nTWV0YWRhdGEgPyAodGhpcy5wYWdpbmdNZXRhZGF0YSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5wYWdpbmdNZXRhZGF0YTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRhZGF0YSBpbXBsZW1lbnRzIGkuTWV0YWRhdGFJbnRlcmZhY2Uge1xuICAgIGlkZW50aWZpZXI6IGUuTWV0YWRhdGFJZGVudGlmaWVyO1xuICAgIGRhdGE6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogTWV0YWRhdGEge1xuICAgICAgICBsZXQgbSA9IG5ldyBNZXRhZGF0YSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5pZGVudGlmaWVyKSB7bS5pZGVudGlmaWVyID0gZW51bVN0cmluZ1RvVmFsdWU8ZS5NZXRhZGF0YUlkZW50aWZpZXI+KGUuTWV0YWRhdGFJZGVudGlmaWVyLCBwcm90by5pZGVudGlmaWVyKTt9XG4gICAgICAgIGlmIChwcm90by5kYXRhKSB7bS5kYXRhID0gT2JqZWN0LmtleXMocHJvdG8uZGF0YSkucmVkdWNlPGFueT4oKG9iaiwgaykgPT4geyBvYmpba10gPSBwcm90by5kYXRhW2tdOyByZXR1cm4gb2JqOyB9LCB7fSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk1ldGFkYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaWRlbnRpZmllciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnaWRlbnRpZmllciddID0gdGhpcy5pZGVudGlmaWVyO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuZGF0YSAhPT0gbnVsbCkge3RvUmV0dXJuWydkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmRhdGEgPyAodGhpcy5kYXRhIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmRhdGE7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjZWl2ZU1lc3NhZ2VSZXF1ZXN0TWV0YWRhdGFFbnRyeSBpbXBsZW1lbnRzIGkuUmVjZWl2ZU1lc3NhZ2VSZXF1ZXN0TWV0YWRhdGFFbnRyeUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFJlY2VpdmVNZXNzYWdlUmVxdWVzdE1ldGFkYXRhRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBSZWNlaXZlTWVzc2FnZVJlcXVlc3RNZXRhZGF0YUVudHJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5SZWNlaXZlTWVzc2FnZVJlcXVlc3RNZXRhZGF0YUVudHJ5SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd2YWx1ZSddID0gdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYWdlZFJlcXVlc3RPcHRpb25zIGltcGxlbWVudHMgaS5QYWdlZFJlcXVlc3RPcHRpb25zSW50ZXJmYWNlIHtcbiAgICBjdXJzb3I6IHN0cmluZztcbiAgICBwYWdlU2l6ZTogbnVtYmVyO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGFnZWRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgICAgIGxldCBtID0gbmV3IFBhZ2VkUmVxdWVzdE9wdGlvbnMoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlBhZ2VkUmVxdWVzdE9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jdXJzb3IgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2N1cnNvciddID0gdGhpcy5jdXJzb3I7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnZVNpemUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhZ2VTaXplJ10gPSB0aGlzLnBhZ2VTaXplO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhZ2VkUmVzcG9uc2VNZXRhZGF0YSBpbXBsZW1lbnRzIGkuUGFnZWRSZXNwb25zZU1ldGFkYXRhSW50ZXJmYWNlIHtcbiAgICBuZXh0Q3Vyc29yOiBzdHJpbmc7XG4gICAgaGFzTW9yZTogYm9vbGVhbjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YSB7XG4gICAgICAgIGxldCBtID0gbmV3IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUGFnZWRSZXNwb25zZU1ldGFkYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubmV4dEN1cnNvciAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbmV4dEN1cnNvciddID0gdGhpcy5uZXh0Q3Vyc29yO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmhhc01vcmUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2hhc01vcmUnXSA9IHRoaXMuaGFzTW9yZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNlaXZlTWVzc2FnZVJlcXVlc3QgaW1wbGVtZW50cyBpLlJlY2VpdmVNZXNzYWdlUmVxdWVzdEludGVyZmFjZSB7XG4gICAgc2VuZGVySWQ6IHN0cmluZztcbiAgICByZWNpcGllbnRJZDogc3RyaW5nO1xuICAgIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gICAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIGNoYW5uZWw6IGUuQ29udmVyc2F0aW9uQ2hhbm5lbDtcbiAgICB0eXBlOiBlLk1lc3NhZ2VUeXBlO1xuICAgIGxvY2F0aW9uOiBlLlBsYXRmb3JtTG9jYXRpb247XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYWNjb3VudEdyb3VwSWQ6IHN0cmluZztcbiAgICBtZXRhZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUmVjZWl2ZU1lc3NhZ2VSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUmVjZWl2ZU1lc3NhZ2VSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNoYW5uZWwpIHttLmNoYW5uZWwgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkNvbnZlcnNhdGlvbkNoYW5uZWw+KGUuQ29udmVyc2F0aW9uQ2hhbm5lbCwgcHJvdG8uY2hhbm5lbCk7fVxuICAgICAgICBpZiAocHJvdG8udHlwZSkge20udHlwZSA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuTWVzc2FnZVR5cGU+KGUuTWVzc2FnZVR5cGUsIHByb3RvLnR5cGUpO31cbiAgICAgICAgaWYgKHByb3RvLmxvY2F0aW9uKSB7bS5sb2NhdGlvbiA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuUGxhdGZvcm1Mb2NhdGlvbj4oZS5QbGF0Zm9ybUxvY2F0aW9uLCBwcm90by5sb2NhdGlvbik7fVxuICAgICAgICBpZiAocHJvdG8ubWV0YWRhdGEpIHttLm1ldGFkYXRhID0gT2JqZWN0LmtleXMocHJvdG8ubWV0YWRhdGEpLnJlZHVjZTxhbnk+KChvYmosIGspID0+IHsgb2JqW2tdID0gcHJvdG8ubWV0YWRhdGFba107IHJldHVybiBvYmo7IH0sIHt9KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUmVjZWl2ZU1lc3NhZ2VSZXF1ZXN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VuZGVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3NlbmRlcklkJ10gPSB0aGlzLnNlbmRlcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlY2lwaWVudElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydyZWNpcGllbnRJZCddID0gdGhpcy5yZWNpcGllbnRJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVzc2FnZUlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydtZXNzYWdlSWQnXSA9IHRoaXMubWVzc2FnZUlkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2JvZHknXSA9IHRoaXMuYm9keTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jaGFubmVsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydjaGFubmVsJ10gPSB0aGlzLmNoYW5uZWw7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndHlwZSddID0gdGhpcy50eXBlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydsb2NhdGlvbiddID0gdGhpcy5sb2NhdGlvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWNjb3VudEdyb3VwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjY291bnRHcm91cElkJ10gPSB0aGlzLmFjY291bnRHcm91cElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1ldGFkYXRhICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLm1ldGFkYXRhICE9PSBudWxsKSB7dG9SZXR1cm5bJ21ldGFkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLm1ldGFkYXRhID8gKHRoaXMubWV0YWRhdGEgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubWV0YWRhdGE7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubWVkaWEgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ21lZGlhJ10gPSB0aGlzLm1lZGlhO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlYXJjaENvbnZlcnNhdGlvbnNSZXF1ZXN0IGltcGxlbWVudHMgaS5TZWFyY2hDb252ZXJzYXRpb25zUmVxdWVzdEludGVyZmFjZSB7XG4gICAgcGFydG5lcklkOiBzdHJpbmc7XG4gICAgYWNjb3VudEdyb3VwSWQ6IHN0cmluZztcbiAgICBsb2NhdGlvbjogZS5QbGF0Zm9ybUxvY2F0aW9uO1xuICAgIHNlYXJjaFRlcm06IHN0cmluZztcbiAgICBwYWdpbmdPcHRpb25zOiBQYWdlZFJlcXVlc3RPcHRpb25zO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2VhcmNoQ29udmVyc2F0aW9uc1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBTZWFyY2hDb252ZXJzYXRpb25zUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5sb2NhdGlvbikge20ubG9jYXRpb24gPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLlBsYXRmb3JtTG9jYXRpb24+KGUuUGxhdGZvcm1Mb2NhdGlvbiwgcHJvdG8ubG9jYXRpb24pO31cbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ09wdGlvbnMpIHttLnBhZ2luZ09wdGlvbnMgPSBQYWdlZFJlcXVlc3RPcHRpb25zLmZyb21Qcm90byhwcm90by5wYWdpbmdPcHRpb25zKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU2VhcmNoQ29udmVyc2F0aW9uc1JlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0bmVySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3BhcnRuZXJJZCddID0gdGhpcy5wYXJ0bmVySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYWNjb3VudEdyb3VwSWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2FjY291bnRHcm91cElkJ10gPSB0aGlzLmFjY291bnRHcm91cElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxvY2F0aW9uICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydsb2NhdGlvbiddID0gdGhpcy5sb2NhdGlvbjt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWFyY2hUZXJtICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzZWFyY2hUZXJtJ10gPSB0aGlzLnNlYXJjaFRlcm07fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFnaW5nT3B0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wYWdpbmdPcHRpb25zICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhZ2luZ09wdGlvbnMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucGFnaW5nT3B0aW9ucyA/ICh0aGlzLnBhZ2luZ09wdGlvbnMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFnaW5nT3B0aW9uczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hDb252ZXJzYXRpb25zUmVzcG9uc2UgaW1wbGVtZW50cyBpLlNlYXJjaENvbnZlcnNhdGlvbnNSZXNwb25zZUludGVyZmFjZSB7XG4gICAgY29udmVyc2F0aW9uczogU2VhcmNoQ29udmVyc2F0aW9uc1Jlc3BvbnNlRGV0YWlsZWRDb252ZXJzYXRpb25bXTtcbiAgICBwYWdpbmdNZXRhZGF0YTogUGFnZWRSZXNwb25zZU1ldGFkYXRhO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2VhcmNoQ29udmVyc2F0aW9uc1Jlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2VhcmNoQ29udmVyc2F0aW9uc1Jlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmNvbnZlcnNhdGlvbnMpIHttLmNvbnZlcnNhdGlvbnMgPSBwcm90by5jb252ZXJzYXRpb25zLm1hcChTZWFyY2hDb252ZXJzYXRpb25zUmVzcG9uc2VEZXRhaWxlZENvbnZlcnNhdGlvbi5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLnBhZ2luZ01ldGFkYXRhKSB7bS5wYWdpbmdNZXRhZGF0YSA9IFBhZ2VkUmVzcG9uc2VNZXRhZGF0YS5mcm9tUHJvdG8ocHJvdG8ucGFnaW5nTWV0YWRhdGEpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TZWFyY2hDb252ZXJzYXRpb25zUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmNvbnZlcnNhdGlvbnMgIT09IG51bGwpIHt0b1JldHVyblsnY29udmVyc2F0aW9ucyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5jb252ZXJzYXRpb25zID8gKHRoaXMuY29udmVyc2F0aW9ucyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5jb252ZXJzYXRpb25zO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnBhZ2luZ01ldGFkYXRhICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnBhZ2luZ01ldGFkYXRhICE9PSBudWxsKSB7dG9SZXR1cm5bJ3BhZ2luZ01ldGFkYXRhJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnBhZ2luZ01ldGFkYXRhID8gKHRoaXMucGFnaW5nTWV0YWRhdGEgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucGFnaW5nTWV0YWRhdGE7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VuZE1lc3NhZ2VSZXF1ZXN0IGltcGxlbWVudHMgaS5TZW5kTWVzc2FnZVJlcXVlc3RJbnRlcmZhY2Uge1xuICAgIHNlbmRlcjogUGFydGljaXBhbnQ7XG4gICAgcmVjaXBpZW50OiBQYXJ0aWNpcGFudDtcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuICAgIHR5cGU6IGUuTWVzc2FnZVR5cGU7XG4gICAgYm9keTogc3RyaW5nO1xuICAgIG1ldGFkYXRhOiBNZXRhZGF0YVtdO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2VuZE1lc3NhZ2VSZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2VuZE1lc3NhZ2VSZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLnNlbmRlcikge20uc2VuZGVyID0gUGFydGljaXBhbnQuZnJvbVByb3RvKHByb3RvLnNlbmRlcik7fVxuICAgICAgICBpZiAocHJvdG8ucmVjaXBpZW50KSB7bS5yZWNpcGllbnQgPSBQYXJ0aWNpcGFudC5mcm9tUHJvdG8ocHJvdG8ucmVjaXBpZW50KTt9XG4gICAgICAgIGlmIChwcm90by50eXBlKSB7bS50eXBlID0gZW51bVN0cmluZ1RvVmFsdWU8ZS5NZXNzYWdlVHlwZT4oZS5NZXNzYWdlVHlwZSwgcHJvdG8udHlwZSk7fVxuICAgICAgICBpZiAocHJvdG8ubWV0YWRhdGEpIHttLm1ldGFkYXRhID0gcHJvdG8ubWV0YWRhdGEubWFwKE1ldGFkYXRhLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNlbmRNZXNzYWdlUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNlbmRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zZW5kZXIgIT09IG51bGwpIHt0b1JldHVyblsnc2VuZGVyJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnNlbmRlciA/ICh0aGlzLnNlbmRlciBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zZW5kZXI7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVjaXBpZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnJlY2lwaWVudCAhPT0gbnVsbCkge3RvUmV0dXJuWydyZWNpcGllbnQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVjaXBpZW50ID8gKHRoaXMucmVjaXBpZW50IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlY2lwaWVudDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndHlwZSddID0gdGhpcy50eXBlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2JvZHknXSA9IHRoaXMuYm9keTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5tZXRhZGF0YSAhPT0gbnVsbCkge3RvUmV0dXJuWydtZXRhZGF0YSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5tZXRhZGF0YSA/ICh0aGlzLm1ldGFkYXRhIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLm1ldGFkYXRhO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNlbmRNZXNzYWdlUmVzcG9uc2UgaW1wbGVtZW50cyBpLlNlbmRNZXNzYWdlUmVzcG9uc2VJbnRlcmZhY2Uge1xuICAgIHdvcmtmbG93SWQ6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNlbmRNZXNzYWdlUmVzcG9uc2Uge1xuICAgICAgICBsZXQgbSA9IG5ldyBTZW5kTWVzc2FnZVJlc3BvbnNlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TZW5kTWVzc2FnZVJlc3BvbnNlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMud29ya2Zsb3dJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnd29ya2Zsb3dJZCddID0gdGhpcy53b3JrZmxvd0lkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldExhc3RTZWVuUmVxdWVzdCBpbXBsZW1lbnRzIGkuU2V0TGFzdFNlZW5SZXF1ZXN0SW50ZXJmYWNlIHtcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU2V0TGFzdFNlZW5SZXF1ZXN0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2V0TGFzdFNlZW5SZXF1ZXN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TZXRMYXN0U2VlblJlcXVlc3RJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb252ZXJzYXRpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2V0TGFzdFNlZW5SZXNwb25zZSBpbXBsZW1lbnRzIGkuU2V0TGFzdFNlZW5SZXNwb25zZUludGVyZmFjZSB7XG4gICAgbGFzdFNlZW46IERhdGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTZXRMYXN0U2VlblJlc3BvbnNlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2V0TGFzdFNlZW5SZXNwb25zZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5sYXN0U2Vlbikge20ubGFzdFNlZW4gPSBuZXcgRGF0ZShwcm90by5sYXN0U2Vlbik7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNldExhc3RTZWVuUmVzcG9uc2VJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sYXN0U2VlbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5sYXN0U2VlbiAhPT0gbnVsbCkge3RvUmV0dXJuWydsYXN0U2VlbiddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5sYXN0U2VlbiA/ICh0aGlzLmxhc3RTZWVuIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmxhc3RTZWVuO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVwZGF0ZU1lc3NhZ2VTdGF0dXNSZXF1ZXN0IGltcGxlbWVudHMgaS5VcGRhdGVNZXNzYWdlU3RhdHVzUmVxdWVzdEludGVyZmFjZSB7XG4gICAgbWVzc2FnZUlkOiBzdHJpbmc7XG4gICAgcGFydGljaXBhbnRJZDogc3RyaW5nO1xuICAgIHN0YXR1czogZS5NZXNzYWdlU3RhdHVzO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogVXBkYXRlTWVzc2FnZVN0YXR1c1JlcXVlc3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBVcGRhdGVNZXNzYWdlU3RhdHVzUmVxdWVzdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdGF0dXMpIHttLnN0YXR1cyA9IGVudW1TdHJpbmdUb1ZhbHVlPGUuTWVzc2FnZVN0YXR1cz4oZS5NZXNzYWdlU3RhdHVzLCBwcm90by5zdGF0dXMpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5VcGRhdGVNZXNzYWdlU3RhdHVzUmVxdWVzdEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm1lc3NhZ2VJZCAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbWVzc2FnZUlkJ10gPSB0aGlzLm1lc3NhZ2VJZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYXJ0aWNpcGFudElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYXJ0aWNpcGFudElkJ10gPSB0aGlzLnBhcnRpY2lwYW50SWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3RhdHVzICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzdGF0dXMnXSA9IHRoaXMuc3RhdHVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuIl19
|