@aws-amplify/graphql-api-construct 1.15.1-ai-streaming.0 → 1.15.1-ai-streaming.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. package/.jsii +5 -5
  2. package/CHANGELOG.md +4 -0
  3. package/lib/amplify-dynamodb-table-wrapper.js +1 -1
  4. package/lib/amplify-graphql-api.js +1 -1
  5. package/lib/amplify-graphql-definition.js +1 -1
  6. package/lib/sql-model-datasource-strategy.js +1 -1
  7. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/conversation_handler_construct.js +5 -2
  8. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.d.ts +4 -8
  9. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/bedrock_converse_adapter.js +160 -133
  10. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_message_history_retriever.js +18 -2
  11. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.d.ts +5 -1
  12. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_executor.js +16 -4
  13. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_streaming_response_sender.d.ts +1 -15
  14. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/conversation_turn_streaming_response_sender.js +1 -1
  15. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.d.ts +21 -0
  16. package/node_modules/@aws-amplify/ai-constructs/lib/conversation/runtime/types.js +1 -1
  17. package/node_modules/@aws-amplify/ai-constructs/package.json +1 -1
  18. package/node_modules/@aws-amplify/graphql-conversation-transformer/CHANGELOG.md +6 -0
  19. package/node_modules/@aws-amplify/graphql-conversation-transformer/lib/resolvers/invoke-lambda-resolver-fn.template.js +2 -2
  20. package/node_modules/@aws-amplify/graphql-conversation-transformer/package.json +3 -3
  21. package/node_modules/@aws-amplify/graphql-maps-to-transformer/lib/assets/mapping-lambda.zip +0 -0
  22. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-lambda.zip +0 -0
  23. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-notification-lambda.zip +0 -0
  24. package/node_modules/@aws-amplify/graphql-model-transformer/lib/rds-patching-lambda.zip +0 -0
  25. package/node_modules/@aws-amplify/graphql-predictions-transformer/lib/predictionsLambdaFunction.zip +0 -0
  26. package/node_modules/@aws-amplify/graphql-searchable-transformer/lib/streaming-lambda.zip +0 -0
  27. package/node_modules/@aws-amplify/graphql-transformer/CHANGELOG.md +4 -0
  28. package/node_modules/@aws-amplify/graphql-transformer/package.json +3 -3
  29. package/package.json +5 -5
@@ -4,7 +4,6 @@ exports.BedrockConverseAdapter = void 0;
4
4
  const client_bedrock_runtime_1 = require("@aws-sdk/client-bedrock-runtime");
5
5
  const event_tools_provider_1 = require("./event-tools-provider");
6
6
  const conversation_message_history_retriever_1 = require("./conversation_message_history_retriever");
7
- const conversation_turn_streaming_response_sender_1 = require("./conversation_turn_streaming_response_sender");
8
7
  /**
9
8
  * This class is responsible for interacting with Bedrock Converse API
10
9
  * in order to produce final response that can be sent back to caller.
@@ -13,26 +12,19 @@ class BedrockConverseAdapter {
13
12
  /**
14
13
  * Creates Bedrock Converse Adapter.
15
14
  */
16
- constructor(event, additionalTools, bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({ region: event.modelConfiguration.region }), eventToolsProvider = new event_tools_provider_1.ConversationTurnEventToolsProvider(event), messageHistoryRetriever = new conversation_message_history_retriever_1.ConversationMessageHistoryRetriever(event), streamingResponseSender = new conversation_turn_streaming_response_sender_1.ConversationTurnStreamingResponseSender(event), logger = console) {
15
+ constructor(event, additionalTools, bedrockClient = new client_bedrock_runtime_1.BedrockRuntimeClient({ region: event.modelConfiguration.region }), eventToolsProvider = new event_tools_provider_1.ConversationTurnEventToolsProvider(event), messageHistoryRetriever = new conversation_message_history_retriever_1.ConversationMessageHistoryRetriever(event), logger = console) {
17
16
  var _a, _b;
18
17
  this.event = event;
19
18
  this.bedrockClient = bedrockClient;
20
19
  this.messageHistoryRetriever = messageHistoryRetriever;
21
- this.streamingResponseSender = streamingResponseSender;
22
20
  this.logger = logger;
23
21
  this.executableToolByName = new Map();
24
22
  this.clientToolByName = new Map();
25
23
  this.askBedrock = async () => {
26
- var _a, _b;
24
+ var _a, _b, _c, _d, _e, _f, _g, _h;
27
25
  const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
28
26
  const messages = await this.getEventMessagesAsBedrockMessages();
29
27
  let bedrockResponse;
30
- let assistantMessage;
31
- let stopReason;
32
- const chunkIndexTracker = {
33
- blockIndex: 0,
34
- lastBlockIndex: 0,
35
- };
36
28
  do {
37
29
  const toolConfig = this.createToolConfiguration();
38
30
  const converseCommandInput = {
@@ -44,20 +36,14 @@ class BedrockConverseAdapter {
44
36
  };
45
37
  this.logger.info('Sending Bedrock Converse request');
46
38
  this.logger.debug('Bedrock Converse request:', converseCommandInput);
47
- bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseStreamCommand(converseCommandInput));
48
- this.logger.info(`Received Bedrock Converse response, requestId=${bedrockResponse.$metadata.requestId}`);
49
- this.logger.debug('Bedrock Converse response metadata:', bedrockResponse.$metadata);
50
- if (!bedrockResponse.stream) {
51
- throw new Error('Bedrock response is missing stream');
39
+ bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseCommand(converseCommandInput));
40
+ this.logger.info(`Received Bedrock Converse response, requestId=${bedrockResponse.$metadata.requestId}`, bedrockResponse.usage);
41
+ this.logger.debug('Bedrock Converse response:', bedrockResponse);
42
+ if ((_a = bedrockResponse.output) === null || _a === void 0 ? void 0 : _a.message) {
43
+ messages.push((_b = bedrockResponse.output) === null || _b === void 0 ? void 0 : _b.message);
52
44
  }
53
- const streamingResult = await this.streamAssistantMessage(bedrockResponse.stream, chunkIndexTracker);
54
- assistantMessage = streamingResult.assistantMessage;
55
- stopReason = streamingResult.stopReason;
56
- this.logger.info(`Bedrock Converse response stopReason=${stopReason}`);
57
- this.logger.debug('Bedrock Converse assistant message:', assistantMessage);
58
- messages.push(assistantMessage);
59
- if (stopReason === 'tool_use') {
60
- const responseContentBlocks = (_a = assistantMessage.content) !== null && _a !== void 0 ? _a : [];
45
+ if (bedrockResponse.stopReason === 'tool_use') {
46
+ const responseContentBlocks = (_e = (_d = (_c = bedrockResponse.output) === null || _c === void 0 ? void 0 : _c.message) === null || _d === void 0 ? void 0 : _d.content) !== null && _e !== void 0 ? _e : [];
61
47
  const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
62
48
  const clientToolUseBlocks = responseContentBlocks.filter((block) => {
63
49
  var _a, _b;
@@ -67,12 +53,6 @@ class BedrockConverseAdapter {
67
53
  if (clientToolUseBlocks.length > 0) {
68
54
  // For now if any of client tools is used we ignore executable tools
69
55
  // and propagate result back to client.
70
- await this.streamingResponseSender.sendResponseChunk({
71
- conversationId: this.event.conversationId,
72
- associatedUserMessageId: this.event.currentMessageId,
73
- contentBlockIndex: chunkIndexTracker.lastBlockIndex,
74
- stopReason: stopReason,
75
- });
76
56
  return clientToolUseBlocks;
77
57
  }
78
58
  const toolResponseContentBlocks = [];
@@ -86,109 +66,8 @@ class BedrockConverseAdapter {
86
66
  content: toolResponseContentBlocks,
87
67
  });
88
68
  }
89
- } while (stopReason === 'tool_use');
90
- await this.streamingResponseSender.sendResponseChunk({
91
- conversationId: this.event.conversationId,
92
- associatedUserMessageId: this.event.currentMessageId,
93
- contentBlockIndex: chunkIndexTracker.lastBlockIndex,
94
- stopReason: stopReason,
95
- });
96
- return (_b = assistantMessage.content) !== null && _b !== void 0 ? _b : [];
97
- };
98
- /**
99
- * Handles bedrock response stream.
100
- *
101
- * See: https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use-examples.html
102
- */
103
- this.streamAssistantMessage = async (stream, chunkIndexTracker) => {
104
- var _a, _b, _c, _d, _e, _f, _g;
105
- let stopReason = '';
106
- let toolUseBlock;
107
- let text = '';
108
- let toolUseInput = '';
109
- let clientToolsRequested = false;
110
- // keep our own indexing for blocks and chunks since we stream subset of these upstream.
111
- let blockDeltaIndex = 0;
112
- let lastBlockDeltaIndex = 0;
113
- const assistantMessage = {
114
- role: undefined,
115
- content: [],
116
- };
117
- for await (const chunk of stream) {
118
- if (chunk.messageStart) {
119
- assistantMessage.role = chunk.messageStart.role;
120
- }
121
- else if (chunk.contentBlockStart) {
122
- blockDeltaIndex = 0;
123
- lastBlockDeltaIndex = 0;
124
- if ((_a = chunk.contentBlockStart.start) === null || _a === void 0 ? void 0 : _a.toolUse) {
125
- toolUseBlock = {
126
- toolUse: {
127
- ...(_b = chunk.contentBlockStart.start) === null || _b === void 0 ? void 0 : _b.toolUse,
128
- input: undefined,
129
- },
130
- };
131
- }
132
- }
133
- else if (chunk.contentBlockDelta) {
134
- if ((_c = chunk.contentBlockDelta.delta) === null || _c === void 0 ? void 0 : _c.toolUse) {
135
- if (!chunk.contentBlockDelta.delta.toolUse.input) {
136
- toolUseInput = '';
137
- }
138
- toolUseInput += chunk.contentBlockDelta.delta.toolUse.input;
139
- }
140
- else if ((_d = chunk.contentBlockDelta.delta) === null || _d === void 0 ? void 0 : _d.text) {
141
- text += chunk.contentBlockDelta.delta.text;
142
- await this.streamingResponseSender.sendResponseChunk({
143
- conversationId: this.event.conversationId,
144
- associatedUserMessageId: this.event.currentMessageId,
145
- contentBlockText: chunk.contentBlockDelta.delta.text,
146
- contentBlockIndex: chunkIndexTracker.blockIndex,
147
- contentBlockDeltaIndex: blockDeltaIndex,
148
- });
149
- lastBlockDeltaIndex = blockDeltaIndex;
150
- blockDeltaIndex++;
151
- }
152
- }
153
- else if (chunk.contentBlockStop) {
154
- if (toolUseBlock) {
155
- toolUseBlock.toolUse.input = JSON.parse(toolUseInput);
156
- (_e = assistantMessage.content) === null || _e === void 0 ? void 0 : _e.push(toolUseBlock);
157
- if (toolUseBlock.toolUse.name &&
158
- this.clientToolByName.has(toolUseBlock.toolUse.name)) {
159
- clientToolsRequested = true;
160
- await this.streamingResponseSender.sendResponseChunk({
161
- conversationId: this.event.conversationId,
162
- associatedUserMessageId: this.event.currentMessageId,
163
- contentBlockIndex: chunkIndexTracker.blockIndex,
164
- contentBlockToolUse: JSON.stringify(toolUseBlock),
165
- });
166
- chunkIndexTracker.lastBlockIndex = chunkIndexTracker.blockIndex;
167
- chunkIndexTracker.blockIndex++;
168
- }
169
- toolUseBlock = undefined;
170
- toolUseInput = '';
171
- }
172
- else {
173
- (_f = assistantMessage.content) === null || _f === void 0 ? void 0 : _f.push({
174
- text,
175
- });
176
- await this.streamingResponseSender.sendResponseChunk({
177
- conversationId: this.event.conversationId,
178
- associatedUserMessageId: this.event.currentMessageId,
179
- contentBlockIndex: chunkIndexTracker.blockIndex,
180
- contentBlockDoneAtIndex: lastBlockDeltaIndex,
181
- });
182
- text = '';
183
- chunkIndexTracker.lastBlockIndex = chunkIndexTracker.blockIndex;
184
- chunkIndexTracker.blockIndex++;
185
- }
186
- }
187
- else if (chunk.messageStop) {
188
- stopReason = (_g = chunk.messageStop.stopReason) !== null && _g !== void 0 ? _g : '';
189
- }
190
- }
191
- return { assistantMessage, stopReason, clientToolsRequested };
69
+ } while (bedrockResponse.stopReason === 'tool_use');
70
+ return (_h = (_g = (_f = bedrockResponse.output) === null || _f === void 0 ? void 0 : _f.message) === null || _g === void 0 ? void 0 : _g.content) !== null && _h !== void 0 ? _h : [];
192
71
  };
193
72
  /**
194
73
  * Maps event messages to Bedrock types.
@@ -323,6 +202,154 @@ class BedrockConverseAdapter {
323
202
  ].join(', ')}.`);
324
203
  }
325
204
  }
205
+ /**
206
+ * Asks Bedrock for response using streaming version of Converse API.
207
+ */
208
+ async *askBedrockStreaming() {
209
+ var _a, _b, _c, _d, _e, _f, _g, _h;
210
+ const { modelId, systemPrompt, inferenceConfiguration } = this.event.modelConfiguration;
211
+ const messages = await this.getEventMessagesAsBedrockMessages();
212
+ let bedrockResponse;
213
+ let blockIndex = 0;
214
+ let lastBlockIndex = 0;
215
+ let stopReason = '';
216
+ do {
217
+ const toolConfig = this.createToolConfiguration();
218
+ const converseCommandInput = {
219
+ modelId,
220
+ messages: [...messages],
221
+ system: [{ text: systemPrompt }],
222
+ inferenceConfig: inferenceConfiguration,
223
+ toolConfig,
224
+ };
225
+ this.logger.info('Sending Bedrock Converse Stream request');
226
+ this.logger.debug('Bedrock Converse Stream request:', converseCommandInput);
227
+ bedrockResponse = await this.bedrockClient.send(new client_bedrock_runtime_1.ConverseStreamCommand(converseCommandInput));
228
+ this.logger.info(`Received Bedrock Converse Stream response, requestId=${bedrockResponse.$metadata.requestId}`);
229
+ if (!bedrockResponse.stream) {
230
+ throw new Error('Bedrock response is missing stream');
231
+ }
232
+ let toolUseBlock;
233
+ let clientToolsRequested = false;
234
+ let text = '';
235
+ let toolUseInput = '';
236
+ // keep our own indexing for blocks and chunks since we stream subset of these upstream.
237
+ let blockDeltaIndex = 0;
238
+ let lastBlockDeltaIndex = 0;
239
+ const accumulatedAssistantMessage = {
240
+ role: undefined,
241
+ content: [],
242
+ };
243
+ for await (const chunk of bedrockResponse.stream) {
244
+ this.logger.debug('Bedrock Converse Stream response chunk:', chunk);
245
+ if (chunk.messageStart) {
246
+ accumulatedAssistantMessage.role = chunk.messageStart.role;
247
+ }
248
+ else if (chunk.contentBlockStart) {
249
+ blockDeltaIndex = 0;
250
+ lastBlockDeltaIndex = 0;
251
+ if ((_a = chunk.contentBlockStart.start) === null || _a === void 0 ? void 0 : _a.toolUse) {
252
+ toolUseBlock = {
253
+ toolUse: {
254
+ ...(_b = chunk.contentBlockStart.start) === null || _b === void 0 ? void 0 : _b.toolUse,
255
+ input: undefined,
256
+ },
257
+ };
258
+ }
259
+ }
260
+ else if (chunk.contentBlockDelta) {
261
+ if ((_c = chunk.contentBlockDelta.delta) === null || _c === void 0 ? void 0 : _c.toolUse) {
262
+ if (!chunk.contentBlockDelta.delta.toolUse.input) {
263
+ toolUseInput = '';
264
+ }
265
+ toolUseInput += chunk.contentBlockDelta.delta.toolUse.input;
266
+ }
267
+ else if ((_d = chunk.contentBlockDelta.delta) === null || _d === void 0 ? void 0 : _d.text) {
268
+ text += chunk.contentBlockDelta.delta.text;
269
+ yield {
270
+ conversationId: this.event.conversationId,
271
+ associatedUserMessageId: this.event.currentMessageId,
272
+ contentBlockText: chunk.contentBlockDelta.delta.text,
273
+ contentBlockIndex: blockIndex,
274
+ contentBlockDeltaIndex: blockDeltaIndex,
275
+ };
276
+ lastBlockDeltaIndex = blockDeltaIndex;
277
+ blockDeltaIndex++;
278
+ }
279
+ }
280
+ else if (chunk.contentBlockStop) {
281
+ if (toolUseBlock) {
282
+ toolUseBlock.toolUse.input = JSON.parse(toolUseInput);
283
+ (_e = accumulatedAssistantMessage.content) === null || _e === void 0 ? void 0 : _e.push(toolUseBlock);
284
+ if (toolUseBlock.toolUse.name &&
285
+ this.clientToolByName.has(toolUseBlock.toolUse.name)) {
286
+ clientToolsRequested = true;
287
+ yield {
288
+ conversationId: this.event.conversationId,
289
+ associatedUserMessageId: this.event.currentMessageId,
290
+ contentBlockIndex: blockIndex,
291
+ contentBlockToolUse: JSON.stringify(toolUseBlock),
292
+ };
293
+ lastBlockIndex = blockIndex;
294
+ blockIndex++;
295
+ }
296
+ toolUseBlock = undefined;
297
+ toolUseInput = '';
298
+ }
299
+ else {
300
+ (_f = accumulatedAssistantMessage.content) === null || _f === void 0 ? void 0 : _f.push({
301
+ text,
302
+ });
303
+ yield {
304
+ conversationId: this.event.conversationId,
305
+ associatedUserMessageId: this.event.currentMessageId,
306
+ contentBlockIndex: blockIndex,
307
+ contentBlockDoneAtIndex: lastBlockDeltaIndex,
308
+ };
309
+ text = '';
310
+ lastBlockIndex = blockIndex;
311
+ blockIndex++;
312
+ }
313
+ }
314
+ else if (chunk.messageStop) {
315
+ stopReason = (_g = chunk.messageStop.stopReason) !== null && _g !== void 0 ? _g : '';
316
+ }
317
+ }
318
+ this.logger.debug('Accumulated Bedrock Converse Stream response:', accumulatedAssistantMessage);
319
+ if (clientToolsRequested) {
320
+ // For now if any of client tools is used we ignore executable tools
321
+ // and propagate result back to client.
322
+ yield {
323
+ conversationId: this.event.conversationId,
324
+ associatedUserMessageId: this.event.currentMessageId,
325
+ contentBlockIndex: lastBlockIndex,
326
+ stopReason: stopReason,
327
+ };
328
+ return;
329
+ }
330
+ messages.push(accumulatedAssistantMessage);
331
+ if (stopReason === 'tool_use') {
332
+ const responseContentBlocks = (_h = accumulatedAssistantMessage.content) !== null && _h !== void 0 ? _h : [];
333
+ const toolUseBlocks = responseContentBlocks.filter((block) => 'toolUse' in block);
334
+ const toolResponseContentBlocks = [];
335
+ for (const responseContentBlock of toolUseBlocks) {
336
+ const toolUseBlock = responseContentBlock;
337
+ const toolResultContentBlock = await this.executeTool(toolUseBlock);
338
+ toolResponseContentBlocks.push(toolResultContentBlock);
339
+ }
340
+ messages.push({
341
+ role: 'user',
342
+ content: toolResponseContentBlocks,
343
+ });
344
+ }
345
+ } while (stopReason === 'tool_use');
346
+ yield {
347
+ conversationId: this.event.conversationId,
348
+ associatedUserMessageId: this.event.currentMessageId,
349
+ contentBlockIndex: lastBlockIndex,
350
+ stopReason: stopReason,
351
+ };
352
+ }
326
353
  }
327
354
  exports.BedrockConverseAdapter = BedrockConverseAdapter;
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFXeUM7QUFNekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUMvRiwrR0FBd0c7QUFPeEc7OztHQUdHO0FBQ0gsTUFBYSxzQkFBc0I7SUFRakM7O09BRUc7SUFDSCxZQUNtQixLQUE0QixFQUM3QyxlQUFzQyxFQUNyQixnQkFBc0MsSUFBSSw2Q0FBb0IsQ0FDN0UsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUM1QyxFQUNELGtCQUFrQixHQUFHLElBQUkseURBQWtDLENBQUMsS0FBSyxDQUFDLEVBQ2pELDBCQUEwQixJQUFJLDRFQUFtQyxDQUNoRixLQUFLLENBQ04sRUFDZ0IsMEJBQTBCLElBQUkscUZBQXVDLENBQ3BGLEtBQUssQ0FDTixFQUNnQixTQUFTLE9BQU87O1FBWmhCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBRTVCLGtCQUFhLEdBQWIsYUFBYSxDQUU3QjtRQUVnQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBRXZDO1FBQ2dCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FFdkM7UUFDZ0IsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQXBCbEIseUJBQW9CLEdBQ25DLElBQUksR0FBRyxFQUFFLENBQUM7UUFDSyxxQkFBZ0IsR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQWtFM0UsZUFBVSxHQUFHLEtBQUssSUFBNkIsRUFBRTs7WUFDL0MsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsR0FDckQsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQztZQUVoQyxNQUFNLFFBQVEsR0FDWixNQUFNLElBQUksQ0FBQyxpQ0FB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Q3JDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRDtnQkFDaEQsR0FBRyxjQUFjO2FBQ2xCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2hCLENBQUM7U0FDSDtJQUNILENBQUM7Q0FzU0Y7QUE1V0Qsd0RBNFdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmVkcm9ja1J1bnRpbWVDbGllbnQsXG4gIENvbnRlbnRCbG9jayxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kLFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCxcbiAgQ29udmVyc2VTdHJlYW1Db21tYW5kT3V0cHV0LFxuICBDb252ZXJzZVN0cmVhbU91dHB1dCxcbiAgTWVzc2FnZSxcbiAgVG9vbCxcbiAgVG9vbENvbmZpZ3VyYXRpb24sXG4gIFRvb2xJbnB1dFNjaGVtYSxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWJlZHJvY2stcnVudGltZSc7XG5pbXBvcnQge1xuICBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gIEV4ZWN1dGFibGVUb29sLFxuICBUb29sRGVmaW5pdGlvbixcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyIH0gZnJvbSAnLi9ldmVudC10b29scy1wcm92aWRlcic7XG5pbXBvcnQgeyBDb252ZXJzYXRpb25NZXNzYWdlSGlzdG9yeVJldHJpZXZlciB9IGZyb20gJy4vY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXInO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uVHVyblN0cmVhbWluZ1Jlc3BvbnNlU2VuZGVyIH0gZnJvbSAnLi9jb252ZXJzYXRpb25fdHVybl9zdHJlYW1pbmdfcmVzcG9uc2Vfc2VuZGVyJztcblxudHlwZSBDaHVua0luZGV4VHJhY2tlciA9IHtcbiAgYmxvY2tJbmRleDogbnVtYmVyO1xuICBsYXN0QmxvY2tJbmRleDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmFjdGluZyB3aXRoIEJlZHJvY2sgQ29udmVyc2UgQVBJXG4gKiBpbiBvcmRlciB0byBwcm9kdWNlIGZpbmFsIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHNlbnQgYmFjayB0byBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBCZWRyb2NrQ29udmVyc2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xzOiBBcnJheTxUb29sRGVmaW5pdGlvbj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0YWJsZVRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIEV4ZWN1dGFibGVUb29sPiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIFRvb2xEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBCZWRyb2NrIENvbnZlcnNlIEFkYXB0ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgYWRkaXRpb25hbFRvb2xzOiBBcnJheTxFeGVjdXRhYmxlVG9vbD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBiZWRyb2NrQ2xpZW50OiBCZWRyb2NrUnVudGltZUNsaWVudCA9IG5ldyBCZWRyb2NrUnVudGltZUNsaWVudChcbiAgICAgIHsgcmVnaW9uOiBldmVudC5tb2RlbENvbmZpZ3VyYXRpb24ucmVnaW9uIH1cbiAgICApLFxuICAgIGV2ZW50VG9vbHNQcm92aWRlciA9IG5ldyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyKGV2ZW50KSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyID0gbmV3IENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyKFxuICAgICAgZXZlbnRcbiAgICApLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtaW5nUmVzcG9uc2VTZW5kZXIgPSBuZXcgQ29udmVyc2F0aW9uVHVyblN0cmVhbWluZ1Jlc3BvbnNlU2VuZGVyKFxuICAgICAgZXZlbnRcbiAgICApLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gY29uc29sZVxuICApIHtcbiAgICBpZiAoZXZlbnQucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J10pIHtcbiAgICAgIHRoaXMuYmVkcm9ja0NsaWVudC5taWRkbGV3YXJlU3RhY2suYWRkKFxuICAgICAgICAobmV4dCkgPT4gKGFyZ3MpID0+IHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFJlcXVlc3QgaXMgdHlwZWQgYXMgdW5rbm93bi5cbiAgICAgICAgICAvLyBCdXQgdGhpcyBpcyByZWNvbW1lbmRlZCB3YXkgdG8gYWx0ZXIgaGVhZGVycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzL2Jsb2IvbWFpbi9SRUFETUUubWQuXG4gICAgICAgICAgYXJncy5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXSA9XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXTtcbiAgICAgICAgICByZXR1cm4gbmV4dChhcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0ZXA6ICdidWlsZCcsXG4gICAgICAgICAgbmFtZTogJ2FtcGxpZnktdXNlci1hZ2VudC1pbmplY3RvcicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xzID0gW1xuICAgICAgLi4uZXZlbnRUb29sc1Byb3ZpZGVyLmdldEV2ZW50VG9vbHMoKSxcbiAgICAgIC4uLmFkZGl0aW9uYWxUb29scyxcbiAgICBdO1xuICAgIHRoaXMuY2xpZW50VG9vbHMgPSB0aGlzLmV2ZW50LnRvb2xzQ29uZmlndXJhdGlvbj8uY2xpZW50VG9vbHMgPz8gW107XG4gICAgdGhpcy5hbGxUb29scyA9IFsuLi50aGlzLmV4ZWN1dGFibGVUb29scywgLi4udGhpcy5jbGllbnRUb29sc107XG4gICAgY29uc3QgZHVwbGljYXRlVG9vbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbGllbnRUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgaWYgKGR1cGxpY2F0ZVRvb2xzLnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb29scyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzLiBEdXBsaWNhdGUgdG9vbHM6ICR7W1xuICAgICAgICAgIC4uLmR1cGxpY2F0ZVRvb2xzLFxuICAgICAgICBdLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNrQmVkcm9jayA9IGFzeW5jICgpOiBQcm9taXNlPENvbnRlbnRCbG9ja1tdPiA9PiB7XG4gICAgY29uc3QgeyBtb2RlbElkLCBzeXN0ZW1Qcm9tcHQsIGluZmVyZW5jZUNvbmZpZ3VyYXRpb24gfSA9XG4gICAgICB0aGlzLmV2ZW50Lm1vZGVsQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9XG4gICAgICBhd2FpdCB0aGlzLmdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcygpO1xuXG4gICAgbGV0IGJlZHJvY2tSZXNwb25zZTogQ29udmVyc2VTdHJlYW1Db21tYW5kT3V0cHV0O1xuICAgIGxldCBhc3Npc3RhbnRNZXNzYWdlOiBNZXNzYWdlO1xuICAgIGxldCBzdG9wUmVhc29uOiBzdHJpbmc7XG4gICAgY29uc3QgY2h1bmtJbmRleFRyYWNrZXI6IENodW5rSW5kZXhUcmFja2VyID0ge1xuICAgICAgYmxvY2tJbmRleDogMCxcbiAgICAgIGxhc3RCbG9ja0luZGV4OiAwLFxuICAgIH07XG4gICAgZG8ge1xuICAgICAgY29uc3QgdG9vbENvbmZpZyA9IHRoaXMuY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24oKTtcbiAgICAgIGNvbnN0IGNvbnZlcnNlQ29tbWFuZElucHV0OiBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgICAgbW9kZWxJZCxcbiAgICAgICAgbWVzc2FnZXM6IFsuLi5tZXNzYWdlc10sXG4gICAgICAgIHN5c3RlbTogW3sgdGV4dDogc3lzdGVtUHJvbXB0IH1dLFxuICAgICAgICBpbmZlcmVuY2VDb25maWc6IGluZmVyZW5jZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHRvb2xDb25maWcsXG4gICAgICB9O1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnU2VuZGluZyBCZWRyb2NrIENvbnZlcnNlIHJlcXVlc3QnKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdCZWRyb2NrIENvbnZlcnNlIHJlcXVlc3Q6JywgY29udmVyc2VDb21tYW5kSW5wdXQpO1xuICAgICAgYmVkcm9ja1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iZWRyb2NrQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBDb252ZXJzZVN0cmVhbUNvbW1hbmQoY29udmVyc2VDb21tYW5kSW5wdXQpXG4gICAgICApO1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFJlY2VpdmVkIEJlZHJvY2sgQ29udmVyc2UgcmVzcG9uc2UsIHJlcXVlc3RJZD0ke2JlZHJvY2tSZXNwb25zZS4kbWV0YWRhdGEucmVxdWVzdElkfWBcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0JlZHJvY2sgQ29udmVyc2UgcmVzcG9uc2UgbWV0YWRhdGE6JyxcbiAgICAgICAgYmVkcm9ja1Jlc3BvbnNlLiRtZXRhZGF0YVxuICAgICAgKTtcbiAgICAgIGlmICghYmVkcm9ja1Jlc3BvbnNlLnN0cmVhbSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JlZHJvY2sgcmVzcG9uc2UgaXMgbWlzc2luZyBzdHJlYW0nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyZWFtaW5nUmVzdWx0ID0gYXdhaXQgdGhpcy5zdHJlYW1Bc3Npc3RhbnRNZXNzYWdlKFxuICAgICAgICBiZWRyb2NrUmVzcG9uc2Uuc3RyZWFtLFxuICAgICAgICBjaHVua0luZGV4VHJhY2tlclxuICAgICAgKTtcbiAgICAgIGFzc2lzdGFudE1lc3NhZ2UgPSBzdHJlYW1pbmdSZXN1bHQuYXNzaXN0YW50TWVzc2FnZTtcbiAgICAgIHN0b3BSZWFzb24gPSBzdHJlYW1pbmdSZXN1bHQuc3RvcFJlYXNvbjtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEJlZHJvY2sgQ29udmVyc2UgcmVzcG9uc2Ugc3RvcFJlYXNvbj0ke3N0b3BSZWFzb259YCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0JlZHJvY2sgQ29udmVyc2UgYXNzaXN0YW50IG1lc3NhZ2U6JyxcbiAgICAgICAgYXNzaXN0YW50TWVzc2FnZVxuICAgICAgKTtcblxuICAgICAgbWVzc2FnZXMucHVzaChhc3Npc3RhbnRNZXNzYWdlKTtcblxuICAgICAgaWYgKHN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2tzID0gYXNzaXN0YW50TWVzc2FnZS5jb250ZW50ID8/IFtdO1xuICAgICAgICBjb25zdCB0b29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+ICd0b29sVXNlJyBpbiBibG9ja1xuICAgICAgICApIGFzIEFycmF5PENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyPjtcbiAgICAgICAgY29uc3QgY2xpZW50VG9vbFVzZUJsb2NrcyA9IHJlc3BvbnNlQ29udGVudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgKGJsb2NrKSA9PlxuICAgICAgICAgICAgYmxvY2sudG9vbFVzZT8ubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy5jbGllbnRUb29sQnlOYW1lLmhhcyhibG9jay50b29sVXNlPy5uYW1lKVxuICAgICAgICApO1xuICAgICAgICBpZiAoY2xpZW50VG9vbFVzZUJsb2Nrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gRm9yIG5vdyBpZiBhbnkgb2YgY2xpZW50IHRvb2xzIGlzIHVzZWQgd2UgaWdub3JlIGV4ZWN1dGFibGUgdG9vbHNcbiAgICAgICAgICAvLyBhbmQgcHJvcGFnYXRlIHJlc3VsdCBiYWNrIHRvIGNsaWVudC5cbiAgICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbWluZ1Jlc3BvbnNlU2VuZGVyLnNlbmRSZXNwb25zZUNodW5rKHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBjaHVua0luZGV4VHJhY2tlci5sYXN0QmxvY2tJbmRleCxcbiAgICAgICAgICAgIHN0b3BSZWFzb246IHN0b3BSZWFzb24sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNsaWVudFRvb2xVc2VCbG9ja3M7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrczogQXJyYXk8Q29udGVudEJsb2NrPiA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29udGVudEJsb2NrIG9mIHRvb2xVc2VCbG9ja3MpIHtcbiAgICAgICAgICBjb25zdCB0b29sVXNlQmxvY2sgPVxuICAgICAgICAgICAgcmVzcG9uc2VDb250ZW50QmxvY2sgYXMgQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI7XG4gICAgICAgICAgY29uc3QgdG9vbFJlc3VsdENvbnRlbnRCbG9jayA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRvb2wodG9vbFVzZUJsb2NrKTtcbiAgICAgICAgICB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzLnB1c2godG9vbFJlc3VsdENvbnRlbnRCbG9jayk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgcm9sZTogJ3VzZXInLFxuICAgICAgICAgIGNvbnRlbnQ6IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gd2hpbGUgKHN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpO1xuXG4gICAgYXdhaXQgdGhpcy5zdHJlYW1pbmdSZXNwb25zZVNlbmRlci5zZW5kUmVzcG9uc2VDaHVuayh7XG4gICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICBjb250ZW50QmxvY2tJbmRleDogY2h1bmtJbmRleFRyYWNrZXIubGFzdEJsb2NrSW5kZXgsXG4gICAgICBzdG9wUmVhc29uOiBzdG9wUmVhc29uLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFzc2lzdGFudE1lc3NhZ2UuY29udGVudCA/PyBbXTtcbiAgfTtcblxuICAvKipcbiAgICogSGFuZGxlcyBiZWRyb2NrIHJlc3BvbnNlIHN0cmVhbS5cbiAgICpcbiAgICogU2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay9sYXRlc3QvdXNlcmd1aWRlL3Rvb2wtdXNlLWV4YW1wbGVzLmh0bWxcbiAgICovXG4gIHByaXZhdGUgc3RyZWFtQXNzaXN0YW50TWVzc2FnZSA9IGFzeW5jIChcbiAgICBzdHJlYW06IEFzeW5jSXRlcmFibGU8Q29udmVyc2VTdHJlYW1PdXRwdXQ+LFxuICAgIGNodW5rSW5kZXhUcmFja2VyOiBDaHVua0luZGV4VHJhY2tlclxuICApID0+IHtcbiAgICBsZXQgc3RvcFJlYXNvbiA9ICcnO1xuICAgIGxldCB0b29sVXNlQmxvY2s6IENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0ZXh0OiBzdHJpbmcgPSAnJztcbiAgICBsZXQgdG9vbFVzZUlucHV0OiBzdHJpbmcgPSAnJztcbiAgICBsZXQgY2xpZW50VG9vbHNSZXF1ZXN0ZWQgPSBmYWxzZTtcbiAgICAvLyBrZWVwIG91ciBvd24gaW5kZXhpbmcgZm9yIGJsb2NrcyBhbmQgY2h1bmtzIHNpbmNlIHdlIHN0cmVhbSBzdWJzZXQgb2YgdGhlc2UgdXBzdHJlYW0uXG4gICAgbGV0IGJsb2NrRGVsdGFJbmRleCA9IDA7XG4gICAgbGV0IGxhc3RCbG9ja0RlbHRhSW5kZXggPSAwO1xuICAgIGNvbnN0IGFzc2lzdGFudE1lc3NhZ2U6IE1lc3NhZ2UgPSB7XG4gICAgICByb2xlOiB1bmRlZmluZWQsXG4gICAgICBjb250ZW50OiBbXSxcbiAgICB9O1xuICAgIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2Ygc3RyZWFtKSB7XG4gICAgICBpZiAoY2h1bmsubWVzc2FnZVN0YXJ0KSB7XG4gICAgICAgIGFzc2lzdGFudE1lc3NhZ2Uucm9sZSA9IGNodW5rLm1lc3NhZ2VTdGFydC5yb2xlO1xuICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tTdGFydCkge1xuICAgICAgICBibG9ja0RlbHRhSW5kZXggPSAwO1xuICAgICAgICBsYXN0QmxvY2tEZWx0YUluZGV4ID0gMDtcbiAgICAgICAgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0YXJ0LnN0YXJ0Py50b29sVXNlKSB7XG4gICAgICAgICAgdG9vbFVzZUJsb2NrID0ge1xuICAgICAgICAgICAgdG9vbFVzZToge1xuICAgICAgICAgICAgICAuLi5jaHVuay5jb250ZW50QmxvY2tTdGFydC5zdGFydD8udG9vbFVzZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YSkge1xuICAgICAgICBpZiAoY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGE/LnRvb2xVc2UpIHtcbiAgICAgICAgICBpZiAoIWNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRvb2xVc2UuaW5wdXQpIHtcbiAgICAgICAgICAgIHRvb2xVc2VJbnB1dCA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0b29sVXNlSW5wdXQgKz0gY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudG9vbFVzZS5pbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YT8udGV4dCkge1xuICAgICAgICAgIHRleHQgKz0gY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudGV4dDtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbWluZ1Jlc3BvbnNlU2VuZGVyLnNlbmRSZXNwb25zZUNodW5rKHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgIGNvbnRlbnRCbG9ja1RleHQ6IGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRleHQsXG4gICAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogY2h1bmtJbmRleFRyYWNrZXIuYmxvY2tJbmRleCxcbiAgICAgICAgICAgIGNvbnRlbnRCbG9ja0RlbHRhSW5kZXg6IGJsb2NrRGVsdGFJbmRleCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBsYXN0QmxvY2tEZWx0YUluZGV4ID0gYmxvY2tEZWx0YUluZGV4O1xuICAgICAgICAgIGJsb2NrRGVsdGFJbmRleCsrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja1N0b3ApIHtcbiAgICAgICAgaWYgKHRvb2xVc2VCbG9jaykge1xuICAgICAgICAgIHRvb2xVc2VCbG9jay50b29sVXNlLmlucHV0ID0gSlNPTi5wYXJzZSh0b29sVXNlSW5wdXQpO1xuICAgICAgICAgIGFzc2lzdGFudE1lc3NhZ2UuY29udGVudD8ucHVzaCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUgJiZcbiAgICAgICAgICAgIHRoaXMuY2xpZW50VG9vbEJ5TmFtZS5oYXModG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNsaWVudFRvb2xzUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtaW5nUmVzcG9uc2VTZW5kZXIuc2VuZFJlc3BvbnNlQ2h1bmsoe1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGNodW5rSW5kZXhUcmFja2VyLmJsb2NrSW5kZXgsXG4gICAgICAgICAgICAgIGNvbnRlbnRCbG9ja1Rvb2xVc2U6IEpTT04uc3RyaW5naWZ5KHRvb2xVc2VCbG9jayksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNodW5rSW5kZXhUcmFja2VyLmxhc3RCbG9ja0luZGV4ID0gY2h1bmtJbmRleFRyYWNrZXIuYmxvY2tJbmRleDtcbiAgICAgICAgICAgIGNodW5rSW5kZXhUcmFja2VyLmJsb2NrSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgdG9vbFVzZUJsb2NrID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRvb2xVc2VJbnB1dCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lzdGFudE1lc3NhZ2UuY29udGVudD8ucHVzaCh7XG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtaW5nUmVzcG9uc2VTZW5kZXIuc2VuZFJlc3BvbnNlQ2h1bmsoe1xuICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgY29udGVudEJsb2NrSW5kZXg6IGNodW5rSW5kZXhUcmFja2VyLmJsb2NrSW5kZXgsXG4gICAgICAgICAgICBjb250ZW50QmxvY2tEb25lQXRJbmRleDogbGFzdEJsb2NrRGVsdGFJbmRleCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0ZXh0ID0gJyc7XG4gICAgICAgICAgY2h1bmtJbmRleFRyYWNrZXIubGFzdEJsb2NrSW5kZXggPSBjaHVua0luZGV4VHJhY2tlci5ibG9ja0luZGV4O1xuICAgICAgICAgIGNodW5rSW5kZXhUcmFja2VyLmJsb2NrSW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaHVuay5tZXNzYWdlU3RvcCkge1xuICAgICAgICBzdG9wUmVhc29uID0gY2h1bmsubWVzc2FnZVN0b3Auc3RvcFJlYXNvbiA/PyAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYXNzaXN0YW50TWVzc2FnZSwgc3RvcFJlYXNvbiwgY2xpZW50VG9vbHNSZXF1ZXN0ZWQgfTtcbiAgfTtcblxuICAvKipcbiAgICogTWFwcyBldmVudCBtZXNzYWdlcyB0byBCZWRyb2NrIHR5cGVzLlxuICAgKiAxLiBNYWtlcyBhIGNvcHkgc28gdGhhdCB3ZSBkb24ndCBtdXRhdGUgZXZlbnQuXG4gICAqIDIuIERlY29kZXMgQmFzZTY0IGVuY29kZWQgaW1hZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFdmVudE1lc3NhZ2VzQXNCZWRyb2NrTWVzc2FnZXMgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICBBcnJheTxNZXNzYWdlPlxuICA+ID0+IHtcbiAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBbXTtcbiAgICBjb25zdCBldmVudE1lc3NhZ2VzID1cbiAgICAgIGF3YWl0IHRoaXMubWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIuZ2V0TWVzc2FnZUhpc3RvcnkoKTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgZXZlbnRNZXNzYWdlcykge1xuICAgICAgY29uc3QgbWVzc2FnZUNvbnRlbnQ6IEFycmF5PENvbnRlbnRCbG9jaz4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29udGVudEVsZW1lbnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudEVsZW1lbnQuaW1hZ2U/LnNvdXJjZT8uYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgICBmb3JtYXQ6IGNvbnRlbnRFbGVtZW50LmltYWdlLmZvcm1hdCxcbiAgICAgICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICAgICAgYnl0ZXM6IEJ1ZmZlci5mcm9tKGNvbnRlbnRFbGVtZW50LmltYWdlLnNvdXJjZS5ieXRlcywgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgdHlwZSBjb25mb3JtcyB0byBCZWRyb2NrJ3MgdHlwZSBhbmQgaXQncyBzYWZlIHRvIGNhc3QuXG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaChjb250ZW50RWxlbWVudCBhcyBDb250ZW50QmxvY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogbWVzc2FnZS5yb2xlLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlQ29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZXM7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sQ29uZmlndXJhdGlvbiA9ICgpOiBUb29sQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRoaXMuYWxsVG9vbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b29sczogdGhpcy5hbGxUb29scy5tYXAoKHQpOiBUb29sID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b29sU3BlYzoge1xuICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGNhc3QgdG8gYmVkcm9jayB0eXBlIGFzIHdlJ3JlIHVzaW5nIGRpZmZlcmVudCB0eXBlcyB0byBkZXNjcmliZSBKU09OIHNjaGVtYSBpbiBvdXIgQVBJLlxuICAgICAgICAgICAgLy8gVGhlc2UgdHlwZXMgYXJlIHJ1bnRpbWUgY29tcGF0aWJsZS5cbiAgICAgICAgICAgIGlucHV0U2NoZW1hOiB0LmlucHV0U2NoZW1hIGFzIFRvb2xJbnB1dFNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcbiAgfTtcblxuICBwcml2YXRlIGV4ZWN1dGVUb29sID0gYXN5bmMgKFxuICAgIHRvb2xVc2VCbG9jazogQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXJcbiAgKTogUHJvbWlzZTxDb250ZW50QmxvY2s+ID0+IHtcbiAgICBpZiAoIXRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUpIHtcbiAgICAgIHRocm93IEVycm9yKCdCZWRyb2NrIHRvb2wgdXNlIHJlc3BvbnNlIGlzIG1pc3NpbmcgYSB0b29sIG5hbWUnKTtcbiAgICB9XG4gICAgY29uc3QgdG9vbCA9IHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuZ2V0KHRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUpO1xuICAgIGlmICghdG9vbCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBCZWRyb2NrIHRvb2wgdXNlIHJlc3BvbnNlIGNvbnRhaW5zIHVua25vd24gdG9vbCAnJHt0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lfSdgXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW52b2tpbmcgdG9vbCAke3Rvb2wubmFtZX1gKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdUb29sIGlucHV0OicsIHRvb2xVc2VCbG9jay50b29sVXNlLmlucHV0KTtcbiAgICAgIGNvbnN0IHRvb2xSZXNwb25zZSA9IGF3YWl0IHRvb2wuZXhlY3V0ZSh0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKGBSZWNlaXZlZCByZXNwb25zZSBmcm9tICR7dG9vbC5uYW1lfSB0b29sYCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh0b29sUmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbFJlc3VsdDoge1xuICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IFt0b29sUmVzcG9uc2VdLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbFJlc3VsdDoge1xuICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgICBjb250ZW50OiBbeyB0ZXh0OiBlLnRvU3RyaW5nKCkgfV0sXG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VCbG9jay50b29sVXNlLnRvb2xVc2VJZCxcbiAgICAgICAgICBjb250ZW50OiBbeyB0ZXh0OiAndW5rbm93biBlcnJvciBvY2N1cnJlZCcgfV0sXG4gICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG4iXX0=
355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9ja19jb252ZXJzZV9hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnZlcnNhdGlvbi9ydW50aW1lL2JlZHJvY2tfY29udmVyc2VfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFheUM7QUFPekMsaUVBQTRFO0FBQzVFLHFHQUErRjtBQUUvRjs7O0dBR0c7QUFDSCxNQUFhLHNCQUFzQjtJQVFqQzs7T0FFRztJQUNILFlBQ21CLEtBQTRCLEVBQzdDLGVBQXNDLEVBQ3JCLGdCQUFzQyxJQUFJLDZDQUFvQixDQUM3RSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQzVDLEVBQ0Qsa0JBQWtCLEdBQUcsSUFBSSx5REFBa0MsQ0FBQyxLQUFLLENBQUMsRUFDakQsMEJBQTBCLElBQUksNEVBQW1DLENBQ2hGLEtBQUssQ0FDTixFQUNnQixTQUFTLE9BQU87O1FBVGhCLFVBQUssR0FBTCxLQUFLLENBQXVCO1FBRTVCLGtCQUFhLEdBQWIsYUFBYSxDQUU3QjtRQUVnQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBRXZDO1FBQ2dCLFdBQU0sR0FBTixNQUFNLENBQVU7UUFqQmxCLHlCQUFvQixHQUNuQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ0sscUJBQWdCLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUM7UUErRDNFLGVBQVUsR0FBRyxLQUFLLElBQTZCLEVBQUU7O1lBQy9DLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLEdBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7WUFFaEMsTUFBTSxRQUFRLEdBQ1osTUFBTSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUVqRCxJQUFJLGVBQXNDLENBQUM7WUFDM0MsR0FBRztnQkFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVB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O1FBRXBDLE1BQU07WUFDSixjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjO1lBQ3pDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1lBQ3BELGlCQUFpQixFQUFFLGNBQWM7WUFDakMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQUNKLENBQUM7Q0FzR0Y7QUExWUQsd0RBMFlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmVkcm9ja1J1bnRpbWVDbGllbnQsXG4gIENvbnRlbnRCbG9jayxcbiAgQ29udmVyc2VDb21tYW5kLFxuICBDb252ZXJzZUNvbW1hbmRJbnB1dCxcbiAgQ29udmVyc2VDb21tYW5kT3V0cHV0LFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmQsXG4gIENvbnZlcnNlU3RyZWFtQ29tbWFuZElucHV0LFxuICBDb252ZXJzZVN0cmVhbUNvbW1hbmRPdXRwdXQsXG4gIE1lc3NhZ2UsXG4gIFRvb2wsXG4gIFRvb2xDb25maWd1cmF0aW9uLFxuICBUb29sSW5wdXRTY2hlbWEsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1iZWRyb2NrLXJ1bnRpbWUnO1xuaW1wb3J0IHtcbiAgQ29udmVyc2F0aW9uVHVybkV2ZW50LFxuICBFeGVjdXRhYmxlVG9vbCxcbiAgU3RyZWFtaW5nUmVzcG9uc2VDaHVuayxcbiAgVG9vbERlZmluaXRpb24sXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uVHVybkV2ZW50VG9vbHNQcm92aWRlciB9IGZyb20gJy4vZXZlbnQtdG9vbHMtcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uTWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIgfSBmcm9tICcuL2NvbnZlcnNhdGlvbl9tZXNzYWdlX2hpc3RvcnlfcmV0cmlldmVyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBpbnRlcmFjdGluZyB3aXRoIEJlZHJvY2sgQ29udmVyc2UgQVBJXG4gKiBpbiBvcmRlciB0byBwcm9kdWNlIGZpbmFsIHJlc3BvbnNlIHRoYXQgY2FuIGJlIHNlbnQgYmFjayB0byBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBCZWRyb2NrQ29udmVyc2VBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGxUb29sczogQXJyYXk8VG9vbERlZmluaXRpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGFibGVUb29sczogQXJyYXk8RXhlY3V0YWJsZVRvb2w+O1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xzOiBBcnJheTxUb29sRGVmaW5pdGlvbj47XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0YWJsZVRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIEV4ZWN1dGFibGVUb29sPiA9XG4gICAgbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudFRvb2xCeU5hbWU6IE1hcDxzdHJpbmcsIFRvb2xEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBCZWRyb2NrIENvbnZlcnNlIEFkYXB0ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgYWRkaXRpb25hbFRvb2xzOiBBcnJheTxFeGVjdXRhYmxlVG9vbD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBiZWRyb2NrQ2xpZW50OiBCZWRyb2NrUnVudGltZUNsaWVudCA9IG5ldyBCZWRyb2NrUnVudGltZUNsaWVudChcbiAgICAgIHsgcmVnaW9uOiBldmVudC5tb2RlbENvbmZpZ3VyYXRpb24ucmVnaW9uIH1cbiAgICApLFxuICAgIGV2ZW50VG9vbHNQcm92aWRlciA9IG5ldyBDb252ZXJzYXRpb25UdXJuRXZlbnRUb29sc1Byb3ZpZGVyKGV2ZW50KSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyID0gbmV3IENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyKFxuICAgICAgZXZlbnRcbiAgICApLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gY29uc29sZVxuICApIHtcbiAgICBpZiAoZXZlbnQucmVxdWVzdC5oZWFkZXJzWyd4LWFtei11c2VyLWFnZW50J10pIHtcbiAgICAgIHRoaXMuYmVkcm9ja0NsaWVudC5taWRkbGV3YXJlU3RhY2suYWRkKFxuICAgICAgICAobmV4dCkgPT4gKGFyZ3MpID0+IHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFJlcXVlc3QgaXMgdHlwZWQgYXMgdW5rbm93bi5cbiAgICAgICAgICAvLyBCdXQgdGhpcyBpcyByZWNvbW1lbmRlZCB3YXkgdG8gYWx0ZXIgaGVhZGVycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3Mtc2RrLWpzLXYzL2Jsb2IvbWFpbi9SRUFETUUubWQuXG4gICAgICAgICAgYXJncy5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXSA9XG4gICAgICAgICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnNbJ3gtYW16LXVzZXItYWdlbnQnXTtcbiAgICAgICAgICByZXR1cm4gbmV4dChhcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHN0ZXA6ICdidWlsZCcsXG4gICAgICAgICAgbmFtZTogJ2FtcGxpZnktdXNlci1hZ2VudC1pbmplY3RvcicsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xzID0gW1xuICAgICAgLi4uZXZlbnRUb29sc1Byb3ZpZGVyLmdldEV2ZW50VG9vbHMoKSxcbiAgICAgIC4uLmFkZGl0aW9uYWxUb29scyxcbiAgICBdO1xuICAgIHRoaXMuY2xpZW50VG9vbHMgPSB0aGlzLmV2ZW50LnRvb2xzQ29uZmlndXJhdGlvbj8uY2xpZW50VG9vbHMgPz8gW107XG4gICAgdGhpcy5hbGxUb29scyA9IFsuLi50aGlzLmV4ZWN1dGFibGVUb29scywgLi4udGhpcy5jbGllbnRUb29sc107XG4gICAgY29uc3QgZHVwbGljYXRlVG9vbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbGllbnRUb29scy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBpZiAodGhpcy5leGVjdXRhYmxlVG9vbEJ5TmFtZS5oYXModC5uYW1lKSkge1xuICAgICAgICBkdXBsaWNhdGVUb29scy5hZGQodC5uYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKHQubmFtZSkpIHtcbiAgICAgICAgZHVwbGljYXRlVG9vbHMuYWRkKHQubmFtZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuc2V0KHQubmFtZSwgdCk7XG4gICAgfSk7XG4gICAgaWYgKGR1cGxpY2F0ZVRvb2xzLnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUb29scyBtdXN0IGhhdmUgdW5pcXVlIG5hbWVzLiBEdXBsaWNhdGUgdG9vbHM6ICR7W1xuICAgICAgICAgIC4uLmR1cGxpY2F0ZVRvb2xzLFxuICAgICAgICBdLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNrQmVkcm9jayA9IGFzeW5jICgpOiBQcm9taXNlPENvbnRlbnRCbG9ja1tdPiA9PiB7XG4gICAgY29uc3QgeyBtb2RlbElkLCBzeXN0ZW1Qcm9tcHQsIGluZmVyZW5jZUNvbmZpZ3VyYXRpb24gfSA9XG4gICAgICB0aGlzLmV2ZW50Lm1vZGVsQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9XG4gICAgICBhd2FpdCB0aGlzLmdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcygpO1xuXG4gICAgbGV0IGJlZHJvY2tSZXNwb25zZTogQ29udmVyc2VDb21tYW5kT3V0cHV0O1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHRvb2xDb25maWcgPSB0aGlzLmNyZWF0ZVRvb2xDb25maWd1cmF0aW9uKCk7XG4gICAgICBjb25zdCBjb252ZXJzZUNvbW1hbmRJbnB1dDogQ29udmVyc2VDb21tYW5kSW5wdXQgPSB7XG4gICAgICAgIG1vZGVsSWQsXG4gICAgICAgIG1lc3NhZ2VzOiBbLi4ubWVzc2FnZXNdLFxuICAgICAgICBzeXN0ZW06IFt7IHRleHQ6IHN5c3RlbVByb21wdCB9XSxcbiAgICAgICAgaW5mZXJlbmNlQ29uZmlnOiBpbmZlcmVuY2VDb25maWd1cmF0aW9uLFxuICAgICAgICB0b29sQ29uZmlnLFxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1NlbmRpbmcgQmVkcm9jayBDb252ZXJzZSByZXF1ZXN0Jyk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQmVkcm9jayBDb252ZXJzZSByZXF1ZXN0OicsIGNvbnZlcnNlQ29tbWFuZElucHV0KTtcbiAgICAgIGJlZHJvY2tSZXNwb25zZSA9IGF3YWl0IHRoaXMuYmVkcm9ja0NsaWVudC5zZW5kKFxuICAgICAgICBuZXcgQ29udmVyc2VDb21tYW5kKGNvbnZlcnNlQ29tbWFuZElucHV0KVxuICAgICAgKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBSZWNlaXZlZCBCZWRyb2NrIENvbnZlcnNlIHJlc3BvbnNlLCByZXF1ZXN0SWQ9JHtiZWRyb2NrUmVzcG9uc2UuJG1ldGFkYXRhLnJlcXVlc3RJZH1gLFxuICAgICAgICBiZWRyb2NrUmVzcG9uc2UudXNhZ2VcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQmVkcm9jayBDb252ZXJzZSByZXNwb25zZTonLCBiZWRyb2NrUmVzcG9uc2UpO1xuICAgICAgaWYgKGJlZHJvY2tSZXNwb25zZS5vdXRwdXQ/Lm1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZXMucHVzaChiZWRyb2NrUmVzcG9uc2Uub3V0cHV0Py5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIGlmIChiZWRyb2NrUmVzcG9uc2Uuc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJykge1xuICAgICAgICBjb25zdCByZXNwb25zZUNvbnRlbnRCbG9ja3MgPVxuICAgICAgICAgIGJlZHJvY2tSZXNwb25zZS5vdXRwdXQ/Lm1lc3NhZ2U/LmNvbnRlbnQgPz8gW107XG4gICAgICAgIGNvbnN0IHRvb2xVc2VCbG9ja3MgPSByZXNwb25zZUNvbnRlbnRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT4gJ3Rvb2xVc2UnIGluIGJsb2NrXG4gICAgICAgICkgYXMgQXJyYXk8Q29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI+O1xuICAgICAgICBjb25zdCBjbGllbnRUb29sVXNlQmxvY2tzID0gcmVzcG9uc2VDb250ZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAoYmxvY2spID0+XG4gICAgICAgICAgICBibG9jay50b29sVXNlPy5uYW1lICYmXG4gICAgICAgICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKGJsb2NrLnRvb2xVc2U/Lm5hbWUpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjbGllbnRUb29sVXNlQmxvY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBGb3Igbm93IGlmIGFueSBvZiBjbGllbnQgdG9vbHMgaXMgdXNlZCB3ZSBpZ25vcmUgZXhlY3V0YWJsZSB0b29sc1xuICAgICAgICAgIC8vIGFuZCBwcm9wYWdhdGUgcmVzdWx0IGJhY2sgdG8gY2xpZW50LlxuICAgICAgICAgIHJldHVybiBjbGllbnRUb29sVXNlQmxvY2tzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3M6IEFycmF5PENvbnRlbnRCbG9jaz4gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZUNvbnRlbnRCbG9jayBvZiB0b29sVXNlQmxvY2tzKSB7XG4gICAgICAgICAgY29uc3QgdG9vbFVzZUJsb2NrID1cbiAgICAgICAgICAgIHJlc3BvbnNlQ29udGVudEJsb2NrIGFzIENvbnRlbnRCbG9jay5Ub29sVXNlTWVtYmVyO1xuICAgICAgICAgIGNvbnN0IHRvb2xSZXN1bHRDb250ZW50QmxvY2sgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUb29sKHRvb2xVc2VCbG9jayk7XG4gICAgICAgICAgdG9vbFJlc3BvbnNlQ29udGVudEJsb2Nrcy5wdXNoKHRvb2xSZXN1bHRDb250ZW50QmxvY2spO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICAgIHJvbGU6ICd1c2VyJyxcbiAgICAgICAgICBjb250ZW50OiB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChiZWRyb2NrUmVzcG9uc2Uuc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJyk7XG5cbiAgICByZXR1cm4gYmVkcm9ja1Jlc3BvbnNlLm91dHB1dD8ubWVzc2FnZT8uY29udGVudCA/PyBbXTtcbiAgfTtcblxuICAvKipcbiAgICogQXNrcyBCZWRyb2NrIGZvciByZXNwb25zZSB1c2luZyBzdHJlYW1pbmcgdmVyc2lvbiBvZiBDb252ZXJzZSBBUEkuXG4gICAqL1xuICBhc3luYyAqYXNrQmVkcm9ja1N0cmVhbWluZygpOiBBc3luY0dlbmVyYXRvcjxTdHJlYW1pbmdSZXNwb25zZUNodW5rPiB7XG4gICAgY29uc3QgeyBtb2RlbElkLCBzeXN0ZW1Qcm9tcHQsIGluZmVyZW5jZUNvbmZpZ3VyYXRpb24gfSA9XG4gICAgICB0aGlzLmV2ZW50Lm1vZGVsQ29uZmlndXJhdGlvbjtcblxuICAgIGNvbnN0IG1lc3NhZ2VzOiBBcnJheTxNZXNzYWdlPiA9XG4gICAgICBhd2FpdCB0aGlzLmdldEV2ZW50TWVzc2FnZXNBc0JlZHJvY2tNZXNzYWdlcygpO1xuXG4gICAgbGV0IGJlZHJvY2tSZXNwb25zZTogQ29udmVyc2VTdHJlYW1Db21tYW5kT3V0cHV0O1xuICAgIGxldCBibG9ja0luZGV4ID0gMDtcbiAgICBsZXQgbGFzdEJsb2NrSW5kZXggPSAwO1xuICAgIGxldCBzdG9wUmVhc29uID0gJyc7XG4gICAgZG8ge1xuICAgICAgY29uc3QgdG9vbENvbmZpZyA9IHRoaXMuY3JlYXRlVG9vbENvbmZpZ3VyYXRpb24oKTtcbiAgICAgIGNvbnN0IGNvbnZlcnNlQ29tbWFuZElucHV0OiBDb252ZXJzZVN0cmVhbUNvbW1hbmRJbnB1dCA9IHtcbiAgICAgICAgbW9kZWxJZCxcbiAgICAgICAgbWVzc2FnZXM6IFsuLi5tZXNzYWdlc10sXG4gICAgICAgIHN5c3RlbTogW3sgdGV4dDogc3lzdGVtUHJvbXB0IH1dLFxuICAgICAgICBpbmZlcmVuY2VDb25maWc6IGluZmVyZW5jZUNvbmZpZ3VyYXRpb24sXG4gICAgICAgIHRvb2xDb25maWcsXG4gICAgICB9O1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnU2VuZGluZyBCZWRyb2NrIENvbnZlcnNlIFN0cmVhbSByZXF1ZXN0Jyk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0JlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlcXVlc3Q6JyxcbiAgICAgICAgY29udmVyc2VDb21tYW5kSW5wdXRcbiAgICAgICk7XG4gICAgICBiZWRyb2NrUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJlZHJvY2tDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IENvbnZlcnNlU3RyZWFtQ29tbWFuZChjb252ZXJzZUNvbW1hbmRJbnB1dClcbiAgICAgICk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgUmVjZWl2ZWQgQmVkcm9jayBDb252ZXJzZSBTdHJlYW0gcmVzcG9uc2UsIHJlcXVlc3RJZD0ke2JlZHJvY2tSZXNwb25zZS4kbWV0YWRhdGEucmVxdWVzdElkfWBcbiAgICAgICk7XG4gICAgICBpZiAoIWJlZHJvY2tSZXNwb25zZS5zdHJlYW0pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCZWRyb2NrIHJlc3BvbnNlIGlzIG1pc3Npbmcgc3RyZWFtJyk7XG4gICAgICB9XG4gICAgICBsZXQgdG9vbFVzZUJsb2NrOiBDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBjbGllbnRUb29sc1JlcXVlc3RlZCA9IGZhbHNlO1xuICAgICAgbGV0IHRleHQ6IHN0cmluZyA9ICcnO1xuICAgICAgbGV0IHRvb2xVc2VJbnB1dDogc3RyaW5nID0gJyc7XG4gICAgICAvLyBrZWVwIG91ciBvd24gaW5kZXhpbmcgZm9yIGJsb2NrcyBhbmQgY2h1bmtzIHNpbmNlIHdlIHN0cmVhbSBzdWJzZXQgb2YgdGhlc2UgdXBzdHJlYW0uXG4gICAgICBsZXQgYmxvY2tEZWx0YUluZGV4ID0gMDtcbiAgICAgIGxldCBsYXN0QmxvY2tEZWx0YUluZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZTogTWVzc2FnZSA9IHtcbiAgICAgICAgcm9sZTogdW5kZWZpbmVkLFxuICAgICAgICBjb250ZW50OiBbXSxcbiAgICAgIH07XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGNodW5rIG9mIGJlZHJvY2tSZXNwb25zZS5zdHJlYW0pIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0JlZHJvY2sgQ29udmVyc2UgU3RyZWFtIHJlc3BvbnNlIGNodW5rOicsIGNodW5rKTtcbiAgICAgICAgaWYgKGNodW5rLm1lc3NhZ2VTdGFydCkge1xuICAgICAgICAgIGFjY3VtdWxhdGVkQXNzaXN0YW50TWVzc2FnZS5yb2xlID0gY2h1bmsubWVzc2FnZVN0YXJ0LnJvbGU7XG4gICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrU3RhcnQpIHtcbiAgICAgICAgICBibG9ja0RlbHRhSW5kZXggPSAwO1xuICAgICAgICAgIGxhc3RCbG9ja0RlbHRhSW5kZXggPSAwO1xuICAgICAgICAgIGlmIChjaHVuay5jb250ZW50QmxvY2tTdGFydC5zdGFydD8udG9vbFVzZSkge1xuICAgICAgICAgICAgdG9vbFVzZUJsb2NrID0ge1xuICAgICAgICAgICAgICB0b29sVXNlOiB7XG4gICAgICAgICAgICAgICAgLi4uY2h1bmsuY29udGVudEJsb2NrU3RhcnQuc3RhcnQ/LnRvb2xVc2UsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhKSB7XG4gICAgICAgICAgaWYgKGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhPy50b29sVXNlKSB7XG4gICAgICAgICAgICBpZiAoIWNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRvb2xVc2UuaW5wdXQpIHtcbiAgICAgICAgICAgICAgdG9vbFVzZUlucHV0ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b29sVXNlSW5wdXQgKz0gY2h1bmsuY29udGVudEJsb2NrRGVsdGEuZGVsdGEudG9vbFVzZS5pbnB1dDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhPy50ZXh0KSB7XG4gICAgICAgICAgICB0ZXh0ICs9IGNodW5rLmNvbnRlbnRCbG9ja0RlbHRhLmRlbHRhLnRleHQ7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiB0aGlzLmV2ZW50LmNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBhc3NvY2lhdGVkVXNlck1lc3NhZ2VJZDogdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tUZXh0OiBjaHVuay5jb250ZW50QmxvY2tEZWx0YS5kZWx0YS50ZXh0LFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogYmxvY2tJbmRleCxcbiAgICAgICAgICAgICAgY29udGVudEJsb2NrRGVsdGFJbmRleDogYmxvY2tEZWx0YUluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxhc3RCbG9ja0RlbHRhSW5kZXggPSBibG9ja0RlbHRhSW5kZXg7XG4gICAgICAgICAgICBibG9ja0RlbHRhSW5kZXgrKztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY2h1bmsuY29udGVudEJsb2NrU3RvcCkge1xuICAgICAgICAgIGlmICh0b29sVXNlQmxvY2spIHtcbiAgICAgICAgICAgIHRvb2xVc2VCbG9jay50b29sVXNlLmlucHV0ID0gSlNPTi5wYXJzZSh0b29sVXNlSW5wdXQpO1xuICAgICAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQ/LnB1c2godG9vbFVzZUJsb2NrKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdG9vbFVzZUJsb2NrLnRvb2xVc2UubmFtZSAmJlxuICAgICAgICAgICAgICB0aGlzLmNsaWVudFRvb2xCeU5hbWUuaGFzKHRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY2xpZW50VG9vbHNSZXF1ZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogYmxvY2tJbmRleCxcbiAgICAgICAgICAgICAgICBjb250ZW50QmxvY2tUb29sVXNlOiBKU09OLnN0cmluZ2lmeSh0b29sVXNlQmxvY2spLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBsYXN0QmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7XG4gICAgICAgICAgICAgIGJsb2NrSW5kZXgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvb2xVc2VCbG9jayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRvb2xVc2VJbnB1dCA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UuY29udGVudD8ucHVzaCh7XG4gICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICAgICAgICAgIGNvbnRlbnRCbG9ja0luZGV4OiBibG9ja0luZGV4LFxuICAgICAgICAgICAgICBjb250ZW50QmxvY2tEb25lQXRJbmRleDogbGFzdEJsb2NrRGVsdGFJbmRleCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0ZXh0ID0gJyc7XG4gICAgICAgICAgICBsYXN0QmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7XG4gICAgICAgICAgICBibG9ja0luZGV4Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNodW5rLm1lc3NhZ2VTdG9wKSB7XG4gICAgICAgICAgc3RvcFJlYXNvbiA9IGNodW5rLm1lc3NhZ2VTdG9wLnN0b3BSZWFzb24gPz8gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAnQWNjdW11bGF0ZWQgQmVkcm9jayBDb252ZXJzZSBTdHJlYW0gcmVzcG9uc2U6JyxcbiAgICAgICAgYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlXG4gICAgICApO1xuICAgICAgaWYgKGNsaWVudFRvb2xzUmVxdWVzdGVkKSB7XG4gICAgICAgIC8vIEZvciBub3cgaWYgYW55IG9mIGNsaWVudCB0b29scyBpcyB1c2VkIHdlIGlnbm9yZSBleGVjdXRhYmxlIHRvb2xzXG4gICAgICAgIC8vIGFuZCBwcm9wYWdhdGUgcmVzdWx0IGJhY2sgdG8gY2xpZW50LlxuICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHRoaXMuZXZlbnQuY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQ6IHRoaXMuZXZlbnQuY3VycmVudE1lc3NhZ2VJZCxcbiAgICAgICAgICBjb250ZW50QmxvY2tJbmRleDogbGFzdEJsb2NrSW5kZXgsXG4gICAgICAgICAgc3RvcFJlYXNvbjogc3RvcFJlYXNvbixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWVzc2FnZXMucHVzaChhY2N1bXVsYXRlZEFzc2lzdGFudE1lc3NhZ2UpO1xuICAgICAgaWYgKHN0b3BSZWFzb24gPT09ICd0b29sX3VzZScpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2tzID0gYWNjdW11bGF0ZWRBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQgPz8gW107XG4gICAgICAgIGNvbnN0IHRvb2xVc2VCbG9ja3MgPSByZXNwb25zZUNvbnRlbnRCbG9ja3MuZmlsdGVyKFxuICAgICAgICAgIChibG9jaykgPT4gJ3Rvb2xVc2UnIGluIGJsb2NrXG4gICAgICAgICkgYXMgQXJyYXk8Q29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXI+O1xuICAgICAgICBjb25zdCB0b29sUmVzcG9uc2VDb250ZW50QmxvY2tzOiBBcnJheTxDb250ZW50QmxvY2s+ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VDb250ZW50QmxvY2sgb2YgdG9vbFVzZUJsb2Nrcykge1xuICAgICAgICAgIGNvbnN0IHRvb2xVc2VCbG9jayA9XG4gICAgICAgICAgICByZXNwb25zZUNvbnRlbnRCbG9jayBhcyBDb250ZW50QmxvY2suVG9vbFVzZU1lbWJlcjtcbiAgICAgICAgICBjb25zdCB0b29sUmVzdWx0Q29udGVudEJsb2NrID0gYXdhaXQgdGhpcy5leGVjdXRlVG9vbCh0b29sVXNlQmxvY2spO1xuICAgICAgICAgIHRvb2xSZXNwb25zZUNvbnRlbnRCbG9ja3MucHVzaCh0b29sUmVzdWx0Q29udGVudEJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICByb2xlOiAndXNlcicsXG4gICAgICAgICAgY29udGVudDogdG9vbFJlc3BvbnNlQ29udGVudEJsb2NrcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoc3RvcFJlYXNvbiA9PT0gJ3Rvb2xfdXNlJyk7XG5cbiAgICB5aWVsZCB7XG4gICAgICBjb252ZXJzYXRpb25JZDogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICBjb250ZW50QmxvY2tJbmRleDogbGFzdEJsb2NrSW5kZXgsXG4gICAgICBzdG9wUmVhc29uOiBzdG9wUmVhc29uLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWFwcyBldmVudCBtZXNzYWdlcyB0byBCZWRyb2NrIHR5cGVzLlxuICAgKiAxLiBNYWtlcyBhIGNvcHkgc28gdGhhdCB3ZSBkb24ndCBtdXRhdGUgZXZlbnQuXG4gICAqIDIuIERlY29kZXMgQmFzZTY0IGVuY29kZWQgaW1hZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFdmVudE1lc3NhZ2VzQXNCZWRyb2NrTWVzc2FnZXMgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICBBcnJheTxNZXNzYWdlPlxuICA+ID0+IHtcbiAgICBjb25zdCBtZXNzYWdlczogQXJyYXk8TWVzc2FnZT4gPSBbXTtcbiAgICBjb25zdCBldmVudE1lc3NhZ2VzID1cbiAgICAgIGF3YWl0IHRoaXMubWVzc2FnZUhpc3RvcnlSZXRyaWV2ZXIuZ2V0TWVzc2FnZUhpc3RvcnkoKTtcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgZXZlbnRNZXNzYWdlcykge1xuICAgICAgY29uc3QgbWVzc2FnZUNvbnRlbnQ6IEFycmF5PENvbnRlbnRCbG9jaz4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY29udGVudEVsZW1lbnQgb2YgbWVzc2FnZS5jb250ZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudEVsZW1lbnQuaW1hZ2U/LnNvdXJjZT8uYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaCh7XG4gICAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgICBmb3JtYXQ6IGNvbnRlbnRFbGVtZW50LmltYWdlLmZvcm1hdCxcbiAgICAgICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICAgICAgYnl0ZXM6IEJ1ZmZlci5mcm9tKGNvbnRlbnRFbGVtZW50LmltYWdlLnNvdXJjZS5ieXRlcywgJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgdHlwZSBjb25mb3JtcyB0byBCZWRyb2NrJ3MgdHlwZSBhbmQgaXQncyBzYWZlIHRvIGNhc3QuXG4gICAgICAgICAgbWVzc2FnZUNvbnRlbnQucHVzaChjb250ZW50RWxlbWVudCBhcyBDb250ZW50QmxvY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogbWVzc2FnZS5yb2xlLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlQ29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZXM7XG4gIH07XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sQ29uZmlndXJhdGlvbiA9ICgpOiBUb29sQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHRoaXMuYWxsVG9vbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0b29sczogdGhpcy5hbGxUb29scy5tYXAoKHQpOiBUb29sID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b29sU3BlYzoge1xuICAgICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGNhc3QgdG8gYmVkcm9jayB0eXBlIGFzIHdlJ3JlIHVzaW5nIGRpZmZlcmVudCB0eXBlcyB0byBkZXNjcmliZSBKU09OIHNjaGVtYSBpbiBvdXIgQVBJLlxuICAgICAgICAgICAgLy8gVGhlc2UgdHlwZXMgYXJlIHJ1bnRpbWUgY29tcGF0aWJsZS5cbiAgICAgICAgICAgIGlucHV0U2NoZW1hOiB0LmlucHV0U2NoZW1hIGFzIFRvb2xJbnB1dFNjaGVtYSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcbiAgfTtcblxuICBwcml2YXRlIGV4ZWN1dGVUb29sID0gYXN5bmMgKFxuICAgIHRvb2xVc2VCbG9jazogQ29udGVudEJsb2NrLlRvb2xVc2VNZW1iZXJcbiAgKTogUHJvbWlzZTxDb250ZW50QmxvY2s+ID0+IHtcbiAgICBpZiAoIXRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUpIHtcbiAgICAgIHRocm93IEVycm9yKCdCZWRyb2NrIHRvb2wgdXNlIHJlc3BvbnNlIGlzIG1pc3NpbmcgYSB0b29sIG5hbWUnKTtcbiAgICB9XG4gICAgY29uc3QgdG9vbCA9IHRoaXMuZXhlY3V0YWJsZVRvb2xCeU5hbWUuZ2V0KHRvb2xVc2VCbG9jay50b29sVXNlLm5hbWUpO1xuICAgIGlmICghdG9vbCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBCZWRyb2NrIHRvb2wgdXNlIHJlc3BvbnNlIGNvbnRhaW5zIHVua25vd24gdG9vbCAnJHt0b29sVXNlQmxvY2sudG9vbFVzZS5uYW1lfSdgXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW52b2tpbmcgdG9vbCAke3Rvb2wubmFtZX1gKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdUb29sIGlucHV0OicsIHRvb2xVc2VCbG9jay50b29sVXNlLmlucHV0KTtcbiAgICAgIGNvbnN0IHRvb2xSZXNwb25zZSA9IGF3YWl0IHRvb2wuZXhlY3V0ZSh0b29sVXNlQmxvY2sudG9vbFVzZS5pbnB1dCk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKGBSZWNlaXZlZCByZXNwb25zZSBmcm9tICR7dG9vbC5uYW1lfSB0b29sYCk7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1Zyh0b29sUmVzcG9uc2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9vbFJlc3VsdDoge1xuICAgICAgICAgIHRvb2xVc2VJZDogdG9vbFVzZUJsb2NrLnRvb2xVc2UudG9vbFVzZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IFt0b29sUmVzcG9uc2VdLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2Nlc3MnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9vbFJlc3VsdDoge1xuICAgICAgICAgICAgdG9vbFVzZUlkOiB0b29sVXNlQmxvY2sudG9vbFVzZS50b29sVXNlSWQsXG4gICAgICAgICAgICBjb250ZW50OiBbeyB0ZXh0OiBlLnRvU3RyaW5nKCkgfV0sXG4gICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvb2xSZXN1bHQ6IHtcbiAgICAgICAgICB0b29sVXNlSWQ6IHRvb2xVc2VCbG9jay50b29sVXNlLnRvb2xVc2VJZCxcbiAgICAgICAgICBjb250ZW50OiBbeyB0ZXh0OiAndW5rbm93biBlcnJvciBvY2N1cnJlZCcgfV0sXG4gICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH07XG59XG4iXX0=
@@ -165,9 +165,25 @@ class ConversationMessageHistoryRetriever {
165
165
  query,
166
166
  variables,
167
167
  });
168
- return response.data[this.event.messageHistoryQuery.listQueryName].items;
168
+ const items = response.data[this.event.messageHistoryQuery.listQueryName].items;
169
+ items.forEach((item) => {
170
+ var _a;
171
+ (_a = item.content) === null || _a === void 0 ? void 0 : _a.forEach((contentBlock) => {
172
+ let property;
173
+ for (property in contentBlock) {
174
+ // Deserialization of GraphQl query result sets these properties to 'null'
175
+ // This can trigger Bedrock SDK validation as it expects 'undefined' if properties are not set.
176
+ // We can't fix how GraphQl response is deserialized.
177
+ // Therefore, we apply this transformation to fix the data.
178
+ if (contentBlock[property] === null) {
179
+ contentBlock[property] = undefined;
180
+ }
181
+ }
182
+ });
183
+ });
184
+ return items;
169
185
  };
170
186
  }
171
187
  }
172
188
  exports.ConversationMessageHistoryRetriever = ConversationMessageHistoryRetriever;
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udmVyc2F0aW9uL3J1bnRpbWUvY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUVBQW9FO0FBbUNwRTs7OztHQUlHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0QvQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQWEsbUNBQW1DO0lBQzlDOztPQUVHO0lBQ0gsWUFDbUIsS0FBNEIsRUFDNUIseUJBQXlCLElBQUksaURBQXNCLENBQ2xFLEtBQUssQ0FBQyxrQkFBa0IsRUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUMxQztRQUxnQixVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUM1QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBSXRDO1FBR0gsc0JBQWlCLEdBQUcsS0FBSyxJQUF5QyxFQUFFOztZQUNsRSxJQUFJLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLDBDQUFFLE1BQU0sRUFBRTtnQkFDL0Isb0ZBQW9GO2dCQUNwRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFM0MsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUMsQ0FBQztZQUVGLG1G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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDO1FBRUksaUJBQVksR0FBRyxLQUFLLElBRTFCLEVBQUU7O1lBQ0YsTUFBTSxLQUFLLEdBQUc7c0NBQ29CLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCO2NBQzdFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsYUFBYTs7a0JBRXhDLHVCQUF1Qjs7OztLQUlwQyxDQUFDO1lBQ0YsTUFBTSxTQUFTLEdBQW1CO2dCQUNoQyxNQUFNLEVBQUU7b0JBQ04sY0FBYyxFQUFFO3dCQUNkLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWM7cUJBQzlCO2lCQUNGO2dCQUNELEtBQUssRUFBRSxNQUFBLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsY0FBYyxtQ0FBSSxJQUFJO2FBQzdELENBQUM7WUFFRixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBRy9EO2dCQUNBLEtBQUs7Z0JBQ0wsU0FBUzthQUNWLENBQUMsQ0FBQztZQUVILE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMzRSxDQUFDLENBQUM7SUFuSUMsQ0FBQztDQW9JTDtBQS9JRCxrRkErSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb252ZXJzYXRpb25NZXNzYWdlLCBDb252ZXJzYXRpb25UdXJuRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEdyYXBocWxSZXF1ZXN0RXhlY3V0b3IgfSBmcm9tICcuL2dyYXBocWxfcmVxdWVzdF9leGVjdXRvcic7XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbkhpc3RvcnlNZXNzYWdlSXRlbSA9IENvbnZlcnNhdGlvbk1lc3NhZ2UgJiB7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkPzogc3RyaW5nO1xuICBhaUNvbnRleHQ/OiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0UXVlcnlJbnB1dCA9IHtcbiAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdldFF1ZXJ5T3V0cHV0ID0ge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW0+O1xufTtcblxuZXhwb3J0IHR5cGUgTGlzdFF1ZXJ5SW5wdXQgPSB7XG4gIGZpbHRlcjoge1xuICAgIGNvbnZlcnNhdGlvbklkOiB7XG4gICAgICBlcTogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIGxpbWl0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaXN0UXVlcnlPdXRwdXQgPSB7XG4gIGRhdGE6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgaXRlbXM6IEFycmF5PENvbnZlcnNhdGlvbkhpc3RvcnlNZXNzYWdlSXRlbT47XG4gICAgfVxuICA+O1xufTtcblxuLyoqXG4gKiBUaGVzZSBhcmUgYWxsIHByb3BlcnRpZXMgd2UgaGF2ZSB0byBwdWxsLlxuICogVW5mb3J0dW5hdGVseSwgR1FMIGRvZXNuJ3Qgc3VwcG9ydCB3aWxkY2FyZHMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC9ncmFwaHFsLXNwZWMvaXNzdWVzLzEyN1xuICovXG5jb25zdCBtZXNzYWdlSXRlbVNlbGVjdGlvblNldCA9IGBcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWRcbiAgICAgICAgICAgICAgICBhaUNvbnRleHRcbiAgICAgICAgICAgICAgICByb2xlXG4gICAgICAgICAgICAgICAgY29udGVudCB7XG4gICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgYnl0ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaW1hZ2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgc291cmNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0b29sUmVzdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGpzb25cbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIHRvb2xVc2VJZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdG9vbFVzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgdG9vbFVzZUlkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuYDtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIG1lc3NhZ2UgaGlzdG9yeSB0aGF0IGJlbG9uZ3MgdG8gY29udmVyc2F0aW9uIHR1cm4gZXZlbnQuXG4gKiBJdCBxdWVyaWVzIEFwcFN5bmMgdG8gbGlzdCBtZXNzYWdlcyB0aGF0IGJlbG9uZyB0byBjb252ZXJzYXRpb24uXG4gKiBBZGRpdGlvbmFsbHksIGl0IGxvb2tzIHVwIGEgY3VycmVudCBtZXNzYWdlIGluIGNhc2UgaXQncyBtaXNzaW5nIGluIHRoZSBsaXN0IGR1ZSB0byBldmVudHVhbCBjb25zaXN0ZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgY29udmVyc2F0aW9uIG1lc3NhZ2UgaGlzdG9yeSByZXRyaWV2ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBncmFwaHFsUmVxdWVzdEV4ZWN1dG9yID0gbmV3IEdyYXBocWxSZXF1ZXN0RXhlY3V0b3IoXG4gICAgICBldmVudC5ncmFwaHFsQXBpRW5kcG9pbnQsXG4gICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbixcbiAgICAgIGV2ZW50LnJlcXVlc3QuaGVhZGVyc1sneC1hbXotdXNlci1hZ2VudCddXG4gICAgKVxuICApIHt9XG5cbiAgZ2V0TWVzc2FnZUhpc3RvcnkgPSBhc3luYyAoKTogUHJvbWlzZTxBcnJheTxDb252ZXJzYXRpb25NZXNzYWdlPj4gPT4ge1xuICAgIGlmICh0aGlzLmV2ZW50Lm1lc3NhZ2VzPy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aXRoIG1lc3NhZ2VzIHByb3BlcnR5LlxuICAgICAgcmV0dXJuIHRoaXMuZXZlbnQubWVzc2FnZXM7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5saXN0TWVzc2FnZXMoKTtcblxuICAgIGxldCBjdXJyZW50TWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5pZCA9PT0gdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgYSBmYWxsYmFjayBpbiBjYXNlIGN1cnJlbnQgbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBtZXNzYWdlIGxpc3QuXG4gICAgLy8gSS5lLiBpbiBhIHNpdHVhdGlvbiB3aGVuIGZyZXNobHkgd3JpdHRlbiBtZXNzYWdlIGlzIG5vdCB5ZXQgdmlzaWJsZSBpblxuICAgIC8vIGV2ZW50dWFsbHkgY29uc2lzdGVudCByZWFkcy5cbiAgICBpZiAoIWN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICBjdXJyZW50TWVzc2FnZSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudE1lc3NhZ2UoKTtcbiAgICAgIG1lc3NhZ2VzLnB1c2goY3VycmVudE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEluZGV4IGFzc2lzdGFudCBtZXNzYWdlcyBieSBjb3JyZXNwb25kaW5nIHVzZXIgbWVzc2FnZS5cbiAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQnlVc2VyTWVzc2FnZUlkOiBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW1cbiAgICA+ID0gbmV3IE1hcCgpO1xuICAgIG1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UuYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQpIHtcbiAgICAgICAgYXNzaXN0YW50TWVzc2FnZUJ5VXNlck1lc3NhZ2VJZC5zZXQoXG4gICAgICAgICAgbWVzc2FnZS5hc3NvY2lhdGVkVXNlck1lc3NhZ2VJZCxcbiAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZWNvbmNpbGUgaGlzdG9yeSBhbmQgaW5qZWN0IGFpQ29udGV4dFxuICAgIHJldHVybiBtZXNzYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4ge1xuICAgICAgLy8gQmVkcm9jayBleHBlY3RzIHRoYXQgbWVzc2FnZSBoaXN0b3J5IGlzIHVzZXItPmFzc2lzdGFudC0+dXNlci0+YXNzaXN0YW50LT4uLi4gYW5kIHNvIG9uLlxuICAgICAgLy8gVGhlIGNocm9ub2xvZ2ljYWwgb3JkZXIgZG9lc24ndCBhc3N1cmUgdGhpcyBvcmRlcmluZyBpZiB0aGVyZSB3ZXJlIGFueSBjb25jdXJyZW50IG1lc3NhZ2VzIHNlbnQuXG4gICAgICAvLyBUaGVyZWZvcmUsIGNvbnZlcnNhdGlvbiBpcyBvcmRlcmVkIGJ5IHVzZXIncyBtZXNzYWdlcyBvbmx5IGFuZCBjb3JyZXNwb25kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyBhcmUgaW5zZXJ0ZWRcbiAgICAgIC8vIGludG8gcmlnaHQgcGxhY2UgcmVnYXJkbGVzcyBvZiB0aGVpciBjcmVhdGVkQXQgdmFsdWUuXG4gICAgICAvLyBUaGlzIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgR1FMIHF1ZXJ5IHJldHVybnMgbWVzc2FnZXMgc29ydGVkIGJ5IGNyZWF0ZWRBdC5cbiAgICAgIGlmIChjdXJyZW50LnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgIC8vIEluaXRpYWxseSwgc2tpcCBhc3Npc3RhbnQgbWVzc2FnZXMsIHRoZXNlIG1pZ2h0IGJlIG91dCBvZiBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50LnJvbGUgPT09ICd1c2VyJyAmJlxuICAgICAgICAhYXNzaXN0YW50TWVzc2FnZUJ5VXNlck1lc3NhZ2VJZC5oYXMoY3VycmVudC5pZCkgJiZcbiAgICAgICAgY3VycmVudC5pZCAhPT0gdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkXG4gICAgICApIHtcbiAgICAgICAgLy8gU2tpcCB1c2VyIG1lc3NhZ2VzIHRoYXQgZGlkbid0IGdldCBhbnN3ZXIgZnJvbSBhc3Npc3RhbnQgeWV0LlxuICAgICAgICAvLyBUaGVzZSBtaWdodCBiZSBzdGlsbCBcImluLWZsaWdodFwiLCBpLmUuIGFzc2lzdGFudCBpcyBzdGlsbCB3b3JraW5nIG9uIHRoZW0gaW4gc2VwYXJhdGUgaW52b2NhdGlvbi5cbiAgICAgICAgLy8gRXhjZXB0IGN1cnJlbnQgbWVzc2FnZSwgd2Ugd2FudCB0byBwcm9jZXNzIHRoYXQgb25lLlxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgY29uc3QgYWlDb250ZXh0ID0gY3VycmVudC5haUNvbnRleHQ7XG4gICAgICBjb25zdCBjb250ZW50ID0gYWlDb250ZXh0XG4gICAgICAgID8gWy4uLmN1cnJlbnQuY29udGVudCwgeyB0ZXh0OiBKU09OLnN0cmluZ2lmeShhaUNvbnRleHQpIH1dXG4gICAgICAgIDogY3VycmVudC5jb250ZW50O1xuXG4gICAgICBhY2MucHVzaCh7IHJvbGU6IGN1cnJlbnQucm9sZSwgY29udGVudCB9KTtcblxuICAgICAgLy8gRmluZCBhbmQgaW5zZXJ0IGNvcnJlc3BvbmRpbmcgYXNzaXN0YW50IG1lc3NhZ2UuXG4gICAgICBjb25zdCBjb3JyZXNwb25kaW5nQXNzaXN0YW50TWVzc2FnZSA9IGFzc2lzdGFudE1lc3NhZ2VCeVVzZXJNZXNzYWdlSWQuZ2V0KFxuICAgICAgICBjdXJyZW50LmlkXG4gICAgICApO1xuICAgICAgaWYgKGNvcnJlc3BvbmRpbmdBc3Npc3RhbnRNZXNzYWdlKSB7XG4gICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBjb3JyZXNwb25kaW5nQXNzaXN0YW50TWVzc2FnZS5yb2xlLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvcnJlc3BvbmRpbmdBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBBcnJheTxDb252ZXJzYXRpb25NZXNzYWdlPik7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50TWVzc2FnZSA9XG4gICAgYXN5bmMgKCk6IFByb21pc2U8Q29udmVyc2F0aW9uSGlzdG9yeU1lc3NhZ2VJdGVtPiA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgICAgcXVlcnkgR2V0TWVzc2FnZSgkaWQ6ICR7dGhpcy5ldmVudC5tZXNzYWdlSGlzdG9yeVF1ZXJ5LmdldFF1ZXJ5SW5wdXRUeXBlTmFtZX0hKSB7XG4gICAgICAgICAgICAke3RoaXMuZXZlbnQubWVzc2FnZUhpc3RvcnlRdWVyeS5nZXRRdWVyeU5hbWV9KGlkOiAkaWQpIHtcbiAgICAgICAgICAgICAgJHttZXNzYWdlSXRlbVNlbGVjdGlvblNldH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGA7XG4gICAgICBjb25zdCB2YXJpYWJsZXM6IEdldFF1ZXJ5SW5wdXQgPSB7XG4gICAgICAgIGlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ3JhcGhxbFJlcXVlc3RFeGVjdXRvci5leGVjdXRlR3JhcGhxbDxcbiAgICAgICAgR2V0UXVlcnlJbnB1dCxcbiAgICAgICAgR2V0UXVlcnlPdXRwdXRcbiAgICAgID4oe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgdmFyaWFibGVzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW3RoaXMuZXZlbnQubWVzc2FnZUhpc3RvcnlRdWVyeS5nZXRRdWVyeU5hbWVdO1xuICAgIH07XG5cbiAgcHJpdmF0ZSBsaXN0TWVzc2FnZXMgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICBBcnJheTxDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW0+XG4gID4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgICBxdWVyeSBMaXN0TWVzc2FnZXMoJGZpbHRlcjogJHt0aGlzLmV2ZW50Lm1lc3NhZ2VIaXN0b3J5UXVlcnkubGlzdFF1ZXJ5SW5wdXRUeXBlTmFtZX0hLCAkbGltaXQ6IEludCkge1xuICAgICAgICAgICAgJHt0aGlzLmV2ZW50Lm1lc3NhZ2VIaXN0b3J5UXVlcnkubGlzdFF1ZXJ5TmFtZX0oZmlsdGVyOiAkZmlsdGVyLCBsaW1pdDogJGxpbWl0KSB7XG4gICAgICAgICAgICAgIGl0ZW1zIHtcbiAgICAgICAgICAgICAgICAke21lc3NhZ2VJdGVtU2VsZWN0aW9uU2V0fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBgO1xuICAgIGNvbnN0IHZhcmlhYmxlczogTGlzdFF1ZXJ5SW5wdXQgPSB7XG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHtcbiAgICAgICAgICBlcTogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsaW1pdDogdGhpcy5ldmVudC5tZXNzYWdlSGlzdG9yeVF1ZXJ5Lmxpc3RRdWVyeUxpbWl0ID8/IDEwMDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ncmFwaHFsUmVxdWVzdEV4ZWN1dG9yLmV4ZWN1dGVHcmFwaHFsPFxuICAgICAgTGlzdFF1ZXJ5SW5wdXQsXG4gICAgICBMaXN0UXVlcnlPdXRwdXRcbiAgICA+KHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgdmFyaWFibGVzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlLmRhdGFbdGhpcy5ldmVudC5tZXNzYWdlSGlzdG9yeVF1ZXJ5Lmxpc3RRdWVyeU5hbWVdLml0ZW1zO1xuICB9O1xufVxuIl19
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29udmVyc2F0aW9uL3J1bnRpbWUvY29udmVyc2F0aW9uX21lc3NhZ2VfaGlzdG9yeV9yZXRyaWV2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUVBQW9FO0FBbUNwRTs7OztHQUlHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBZ0QvQixDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQWEsbUNBQW1DO0lBQzlDOztPQUVHO0lBQ0gsWUFDbUIsS0FBNEIsRUFDNUIseUJBQXlCLElBQUksaURBQXNCLENBQ2xFLEtBQUssQ0FBQyxrQkFBa0IsRUFDeEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUNuQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUMxQztRQUxnQixVQUFLLEdBQUwsS0FBSyxDQUF1QjtRQUM1QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBSXRDO1FBR0gsc0JBQWlCLEdBQUcsS0FBSyxJQUF5QyxFQUFFOztZQUNsRSxJQUFJLE1BQUEsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLDBDQUFFLE1BQU0sRUFBRTtnQkFDL0Isb0ZBQW9GO2dCQUNwRixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFM0MsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FDaEMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUMsQ0FBQztZQUVGLG1G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QyxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsU0FBUyxDQUFDO3lCQUNwQztxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7SUFySkMsQ0FBQztDQXNKTDtBQWpLRCxrRkFpS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb252ZXJzYXRpb25NZXNzYWdlLCBDb252ZXJzYXRpb25UdXJuRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IEdyYXBocWxSZXF1ZXN0RXhlY3V0b3IgfSBmcm9tICcuL2dyYXBocWxfcmVxdWVzdF9leGVjdXRvcic7XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNhdGlvbkhpc3RvcnlNZXNzYWdlSXRlbSA9IENvbnZlcnNhdGlvbk1lc3NhZ2UgJiB7XG4gIGlkOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIGFzc29jaWF0ZWRVc2VyTWVzc2FnZUlkPzogc3RyaW5nO1xuICBhaUNvbnRleHQ/OiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgR2V0UXVlcnlJbnB1dCA9IHtcbiAgaWQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEdldFF1ZXJ5T3V0cHV0ID0ge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW0+O1xufTtcblxuZXhwb3J0IHR5cGUgTGlzdFF1ZXJ5SW5wdXQgPSB7XG4gIGZpbHRlcjoge1xuICAgIGNvbnZlcnNhdGlvbklkOiB7XG4gICAgICBlcTogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIGxpbWl0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBMaXN0UXVlcnlPdXRwdXQgPSB7XG4gIGRhdGE6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgaXRlbXM6IEFycmF5PENvbnZlcnNhdGlvbkhpc3RvcnlNZXNzYWdlSXRlbT47XG4gICAgfVxuICA+O1xufTtcblxuLyoqXG4gKiBUaGVzZSBhcmUgYWxsIHByb3BlcnRpZXMgd2UgaGF2ZSB0byBwdWxsLlxuICogVW5mb3J0dW5hdGVseSwgR1FMIGRvZXNuJ3Qgc3VwcG9ydCB3aWxkY2FyZHMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZ3JhcGhxbC9ncmFwaHFsLXNwZWMvaXNzdWVzLzEyN1xuICovXG5jb25zdCBtZXNzYWdlSXRlbVNlbGVjdGlvblNldCA9IGBcbiAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWRcbiAgICAgICAgICAgICAgICBhaUNvbnRleHRcbiAgICAgICAgICAgICAgICByb2xlXG4gICAgICAgICAgICAgICAgY29udGVudCB7XG4gICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgYnl0ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaW1hZ2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgc291cmNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0b29sUmVzdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCB7XG4gICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBpbWFnZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGpzb25cbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgIHRvb2xVc2VJZFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdG9vbFVzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgdG9vbFVzZUlkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuYDtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIG1lc3NhZ2UgaGlzdG9yeSB0aGF0IGJlbG9uZ3MgdG8gY29udmVyc2F0aW9uIHR1cm4gZXZlbnQuXG4gKiBJdCBxdWVyaWVzIEFwcFN5bmMgdG8gbGlzdCBtZXNzYWdlcyB0aGF0IGJlbG9uZyB0byBjb252ZXJzYXRpb24uXG4gKiBBZGRpdGlvbmFsbHksIGl0IGxvb2tzIHVwIGEgY3VycmVudCBtZXNzYWdlIGluIGNhc2UgaXQncyBtaXNzaW5nIGluIHRoZSBsaXN0IGR1ZSB0byBldmVudHVhbCBjb25zaXN0ZW5jeS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnZlcnNhdGlvbk1lc3NhZ2VIaXN0b3J5UmV0cmlldmVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgY29udmVyc2F0aW9uIG1lc3NhZ2UgaGlzdG9yeSByZXRyaWV2ZXIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50OiBDb252ZXJzYXRpb25UdXJuRXZlbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBncmFwaHFsUmVxdWVzdEV4ZWN1dG9yID0gbmV3IEdyYXBocWxSZXF1ZXN0RXhlY3V0b3IoXG4gICAgICBldmVudC5ncmFwaHFsQXBpRW5kcG9pbnQsXG4gICAgICBldmVudC5yZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbixcbiAgICAgIGV2ZW50LnJlcXVlc3QuaGVhZGVyc1sneC1hbXotdXNlci1hZ2VudCddXG4gICAgKVxuICApIHt9XG5cbiAgZ2V0TWVzc2FnZUhpc3RvcnkgPSBhc3luYyAoKTogUHJvbWlzZTxBcnJheTxDb252ZXJzYXRpb25NZXNzYWdlPj4gPT4ge1xuICAgIGlmICh0aGlzLmV2ZW50Lm1lc3NhZ2VzPy5sZW5ndGgpIHtcbiAgICAgIC8vIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aXRoIG1lc3NhZ2VzIHByb3BlcnR5LlxuICAgICAgcmV0dXJuIHRoaXMuZXZlbnQubWVzc2FnZXM7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2VzID0gYXdhaXQgdGhpcy5saXN0TWVzc2FnZXMoKTtcblxuICAgIGxldCBjdXJyZW50TWVzc2FnZSA9IG1lc3NhZ2VzLmZpbmQoXG4gICAgICAobSkgPT4gbS5pZCA9PT0gdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkXG4gICAgKTtcblxuICAgIC8vIFRoaXMgaXMgYSBmYWxsYmFjayBpbiBjYXNlIGN1cnJlbnQgbWVzc2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBtZXNzYWdlIGxpc3QuXG4gICAgLy8gSS5lLiBpbiBhIHNpdHVhdGlvbiB3aGVuIGZyZXNobHkgd3JpdHRlbiBtZXNzYWdlIGlzIG5vdCB5ZXQgdmlzaWJsZSBpblxuICAgIC8vIGV2ZW50dWFsbHkgY29uc2lzdGVudCByZWFkcy5cbiAgICBpZiAoIWN1cnJlbnRNZXNzYWdlKSB7XG4gICAgICBjdXJyZW50TWVzc2FnZSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudE1lc3NhZ2UoKTtcbiAgICAgIG1lc3NhZ2VzLnB1c2goY3VycmVudE1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEluZGV4IGFzc2lzdGFudCBtZXNzYWdlcyBieSBjb3JyZXNwb25kaW5nIHVzZXIgbWVzc2FnZS5cbiAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQnlVc2VyTWVzc2FnZUlkOiBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW1cbiAgICA+ID0gbmV3IE1hcCgpO1xuICAgIG1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UuYXNzb2NpYXRlZFVzZXJNZXNzYWdlSWQpIHtcbiAgICAgICAgYXNzaXN0YW50TWVzc2FnZUJ5VXNlck1lc3NhZ2VJZC5zZXQoXG4gICAgICAgICAgbWVzc2FnZS5hc3NvY2lhdGVkVXNlck1lc3NhZ2VJZCxcbiAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZWNvbmNpbGUgaGlzdG9yeSBhbmQgaW5qZWN0IGFpQ29udGV4dFxuICAgIHJldHVybiBtZXNzYWdlcy5yZWR1Y2UoKGFjYywgY3VycmVudCkgPT4ge1xuICAgICAgLy8gQmVkcm9jayBleHBlY3RzIHRoYXQgbWVzc2FnZSBoaXN0b3J5IGlzIHVzZXItPmFzc2lzdGFudC0+dXNlci0+YXNzaXN0YW50LT4uLi4gYW5kIHNvIG9uLlxuICAgICAgLy8gVGhlIGNocm9ub2xvZ2ljYWwgb3JkZXIgZG9lc24ndCBhc3N1cmUgdGhpcyBvcmRlcmluZyBpZiB0aGVyZSB3ZXJlIGFueSBjb25jdXJyZW50IG1lc3NhZ2VzIHNlbnQuXG4gICAgICAvLyBUaGVyZWZvcmUsIGNvbnZlcnNhdGlvbiBpcyBvcmRlcmVkIGJ5IHVzZXIncyBtZXNzYWdlcyBvbmx5IGFuZCBjb3JyZXNwb25kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyBhcmUgaW5zZXJ0ZWRcbiAgICAgIC8vIGludG8gcmlnaHQgcGxhY2UgcmVnYXJkbGVzcyBvZiB0aGVpciBjcmVhdGVkQXQgdmFsdWUuXG4gICAgICAvLyBUaGlzIGFsZ29yaXRobSBhc3N1bWVzIHRoYXQgR1FMIHF1ZXJ5IHJldHVybnMgbWVzc2FnZXMgc29ydGVkIGJ5IGNyZWF0ZWRBdC5cbiAgICAgIGlmIChjdXJyZW50LnJvbGUgPT09ICdhc3Npc3RhbnQnKSB7XG4gICAgICAgIC8vIEluaXRpYWxseSwgc2tpcCBhc3Npc3RhbnQgbWVzc2FnZXMsIHRoZXNlIG1pZ2h0IGJlIG91dCBvZiBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50LnJvbGUgPT09ICd1c2VyJyAmJlxuICAgICAgICAhYXNzaXN0YW50TWVzc2FnZUJ5VXNlck1lc3NhZ2VJZC5oYXMoY3VycmVudC5pZCkgJiZcbiAgICAgICAgY3VycmVudC5pZCAhPT0gdGhpcy5ldmVudC5jdXJyZW50TWVzc2FnZUlkXG4gICAgICApIHtcbiAgICAgICAgLy8gU2tpcCB1c2VyIG1lc3NhZ2VzIHRoYXQgZGlkbid0IGdldCBhbnN3ZXIgZnJvbSBhc3Npc3RhbnQgeWV0LlxuICAgICAgICAvLyBUaGVzZSBtaWdodCBiZSBzdGlsbCBcImluLWZsaWdodFwiLCBpLmUuIGFzc2lzdGFudCBpcyBzdGlsbCB3b3JraW5nIG9uIHRoZW0gaW4gc2VwYXJhdGUgaW52b2NhdGlvbi5cbiAgICAgICAgLy8gRXhjZXB0IGN1cnJlbnQgbWVzc2FnZSwgd2Ugd2FudCB0byBwcm9jZXNzIHRoYXQgb25lLlxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuICAgICAgY29uc3QgYWlDb250ZXh0ID0gY3VycmVudC5haUNvbnRleHQ7XG4gICAgICBjb25zdCBjb250ZW50ID0gYWlDb250ZXh0XG4gICAgICAgID8gWy4uLmN1cnJlbnQuY29udGVudCwgeyB0ZXh0OiBKU09OLnN0cmluZ2lmeShhaUNvbnRleHQpIH1dXG4gICAgICAgIDogY3VycmVudC5jb250ZW50O1xuXG4gICAgICBhY2MucHVzaCh7IHJvbGU6IGN1cnJlbnQucm9sZSwgY29udGVudCB9KTtcblxuICAgICAgLy8gRmluZCBhbmQgaW5zZXJ0IGNvcnJlc3BvbmRpbmcgYXNzaXN0YW50IG1lc3NhZ2UuXG4gICAgICBjb25zdCBjb3JyZXNwb25kaW5nQXNzaXN0YW50TWVzc2FnZSA9IGFzc2lzdGFudE1lc3NhZ2VCeVVzZXJNZXNzYWdlSWQuZ2V0KFxuICAgICAgICBjdXJyZW50LmlkXG4gICAgICApO1xuICAgICAgaWYgKGNvcnJlc3BvbmRpbmdBc3Npc3RhbnRNZXNzYWdlKSB7XG4gICAgICAgIGFjYy5wdXNoKHtcbiAgICAgICAgICByb2xlOiBjb3JyZXNwb25kaW5nQXNzaXN0YW50TWVzc2FnZS5yb2xlLFxuICAgICAgICAgIGNvbnRlbnQ6IGNvcnJlc3BvbmRpbmdBc3Npc3RhbnRNZXNzYWdlLmNvbnRlbnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSBhcyBBcnJheTxDb252ZXJzYXRpb25NZXNzYWdlPik7XG4gIH07XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50TWVzc2FnZSA9XG4gICAgYXN5bmMgKCk6IFByb21pc2U8Q29udmVyc2F0aW9uSGlzdG9yeU1lc3NhZ2VJdGVtPiA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgICAgcXVlcnkgR2V0TWVzc2FnZSgkaWQ6ICR7dGhpcy5ldmVudC5tZXNzYWdlSGlzdG9yeVF1ZXJ5LmdldFF1ZXJ5SW5wdXRUeXBlTmFtZX0hKSB7XG4gICAgICAgICAgICAke3RoaXMuZXZlbnQubWVzc2FnZUhpc3RvcnlRdWVyeS5nZXRRdWVyeU5hbWV9KGlkOiAkaWQpIHtcbiAgICAgICAgICAgICAgJHttZXNzYWdlSXRlbVNlbGVjdGlvblNldH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGA7XG4gICAgICBjb25zdCB2YXJpYWJsZXM6IEdldFF1ZXJ5SW5wdXQgPSB7XG4gICAgICAgIGlkOiB0aGlzLmV2ZW50LmN1cnJlbnRNZXNzYWdlSWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ3JhcGhxbFJlcXVlc3RFeGVjdXRvci5leGVjdXRlR3JhcGhxbDxcbiAgICAgICAgR2V0UXVlcnlJbnB1dCxcbiAgICAgICAgR2V0UXVlcnlPdXRwdXRcbiAgICAgID4oe1xuICAgICAgICBxdWVyeSxcbiAgICAgICAgdmFyaWFibGVzLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXNwb25zZS5kYXRhW3RoaXMuZXZlbnQubWVzc2FnZUhpc3RvcnlRdWVyeS5nZXRRdWVyeU5hbWVdO1xuICAgIH07XG5cbiAgcHJpdmF0ZSBsaXN0TWVzc2FnZXMgPSBhc3luYyAoKTogUHJvbWlzZTxcbiAgICBBcnJheTxDb252ZXJzYXRpb25IaXN0b3J5TWVzc2FnZUl0ZW0+XG4gID4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFxuICAgICAgICBxdWVyeSBMaXN0TWVzc2FnZXMoJGZpbHRlcjogJHt0aGlzLmV2ZW50Lm1lc3NhZ2VIaXN0b3J5UXVlcnkubGlzdFF1ZXJ5SW5wdXRUeXBlTmFtZX0hLCAkbGltaXQ6IEludCkge1xuICAgICAgICAgICAgJHt0aGlzLmV2ZW50Lm1lc3NhZ2VIaXN0b3J5UXVlcnkubGlzdFF1ZXJ5TmFtZX0oZmlsdGVyOiAkZmlsdGVyLCBsaW1pdDogJGxpbWl0KSB7XG4gICAgICAgICAgICAgIGl0ZW1zIHtcbiAgICAgICAgICAgICAgICAke21lc3NhZ2VJdGVtU2VsZWN0aW9uU2V0fVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBgO1xuICAgIGNvbnN0IHZhcmlhYmxlczogTGlzdFF1ZXJ5SW5wdXQgPSB7XG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHtcbiAgICAgICAgICBlcTogdGhpcy5ldmVudC5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsaW1pdDogdGhpcy5ldmVudC5tZXNzYWdlSGlzdG9yeVF1ZXJ5Lmxpc3RRdWVyeUxpbWl0ID8/IDEwMDAsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5ncmFwaHFsUmVxdWVzdEV4ZWN1dG9yLmV4ZWN1dGVHcmFwaHFsPFxuICAgICAgTGlzdFF1ZXJ5SW5wdXQsXG4gICAgICBMaXN0UXVlcnlPdXRwdXRcbiAgICA+KHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgdmFyaWFibGVzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaXRlbXMgPVxuICAgICAgcmVzcG9uc2UuZGF0YVt0aGlzLmV2ZW50Lm1lc3NhZ2VIaXN0b3J5UXVlcnkubGlzdFF1ZXJ5TmFtZV0uaXRlbXM7XG5cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpdGVtLmNvbnRlbnQ/LmZvckVhY2goKGNvbnRlbnRCbG9jaykgPT4ge1xuICAgICAgICBsZXQgcHJvcGVydHk6IGtleW9mIHR5cGVvZiBjb250ZW50QmxvY2s7XG4gICAgICAgIGZvciAocHJvcGVydHkgaW4gY29udGVudEJsb2NrKSB7XG4gICAgICAgICAgLy8gRGVzZXJpYWxpemF0aW9uIG9mIEdyYXBoUWwgcXVlcnkgcmVzdWx0IHNldHMgdGhlc2UgcHJvcGVydGllcyB0byAnbnVsbCdcbiAgICAgICAgICAvLyBUaGlzIGNhbiB0cmlnZ2VyIEJlZHJvY2sgU0RLIHZhbGlkYXRpb24gYXMgaXQgZXhwZWN0cyAndW5kZWZpbmVkJyBpZiBwcm9wZXJ0aWVzIGFyZSBub3Qgc2V0LlxuICAgICAgICAgIC8vIFdlIGNhbid0IGZpeCBob3cgR3JhcGhRbCByZXNwb25zZSBpcyBkZXNlcmlhbGl6ZWQuXG4gICAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBhcHBseSB0aGlzIHRyYW5zZm9ybWF0aW9uIHRvIGZpeCB0aGUgZGF0YS5cbiAgICAgICAgICBpZiAoY29udGVudEJsb2NrW3Byb3BlcnR5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGVudEJsb2NrW3Byb3BlcnR5XSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9O1xufVxuIl19
@@ -1,6 +1,8 @@
1
1
  /// <reference types="node" />
2
+ import { ConversationTurnResponseSender } from './conversation_turn_response_sender.js';
2
3
  import { ConversationTurnEvent, ExecutableTool, JSONSchema } from './types.js';
3
4
  import { BedrockConverseAdapter } from './bedrock_converse_adapter.js';
5
+ import { ConversationTurnStreamingResponseSender } from './conversation_turn_streaming_response_sender';
4
6
  /**
5
7
  * This class is responsible for orchestrating conversation turn execution.
6
8
  * The conversation turn consist of:
@@ -11,11 +13,13 @@ import { BedrockConverseAdapter } from './bedrock_converse_adapter.js';
11
13
  export declare class ConversationTurnExecutor {
12
14
  private readonly event;
13
15
  private readonly bedrockConverseAdapter;
16
+ private readonly responseSender;
17
+ private readonly streamingResponseSender;
14
18
  private readonly logger;
15
19
  /**
16
20
  * Creates conversation turn executor.
17
21
  */
18
- constructor(event: ConversationTurnEvent, additionalTools: Array<ExecutableTool>, bedrockConverseAdapter?: BedrockConverseAdapter, logger?: Console);
22
+ constructor(event: ConversationTurnEvent, additionalTools: Array<ExecutableTool>, bedrockConverseAdapter?: BedrockConverseAdapter, responseSender?: ConversationTurnResponseSender, streamingResponseSender?: ConversationTurnStreamingResponseSender, logger?: Console);
19
23
  execute: () => Promise<void>;
20
24
  }
21
25
  /**