@workflow/core 5.0.0-beta.50 → 5.0.0-beta.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +5 -0
  2. package/dist/events-consumer.d.ts +26 -0
  3. package/dist/events-consumer.d.ts.map +1 -1
  4. package/dist/events-consumer.js +28 -1
  5. package/dist/flushable-stream.d.ts +41 -0
  6. package/dist/flushable-stream.d.ts.map +1 -1
  7. package/dist/flushable-stream.js +169 -1
  8. package/dist/log-format.js +13 -6
  9. package/dist/replay-divergence.d.ts +25 -0
  10. package/dist/replay-divergence.d.ts.map +1 -0
  11. package/dist/replay-divergence.js +61 -0
  12. package/dist/runtime/helpers.d.ts +75 -1
  13. package/dist/runtime/helpers.d.ts.map +1 -1
  14. package/dist/runtime/helpers.js +129 -2
  15. package/dist/runtime/quickjs-entrypoint.d.ts +30 -8
  16. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
  17. package/dist/runtime/quickjs-entrypoint.js +209 -32
  18. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  19. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  20. package/dist/runtime/quickjs-log-view.js +229 -0
  21. package/dist/runtime/step-executor.d.ts +2 -21
  22. package/dist/runtime/step-executor.d.ts.map +1 -1
  23. package/dist/runtime/step-executor.js +85 -80
  24. package/dist/runtime/suspension-handler.d.ts +0 -22
  25. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  26. package/dist/runtime/suspension-handler.js +126 -75
  27. package/dist/runtime.d.ts.map +1 -1
  28. package/dist/runtime.js +262 -91
  29. package/dist/serialization.d.ts +2 -2
  30. package/dist/serialization.d.ts.map +1 -1
  31. package/dist/serialization.js +16 -13
  32. package/dist/step/context-storage.d.ts +2 -0
  33. package/dist/step/context-storage.d.ts.map +1 -1
  34. package/dist/step/context-storage.js +1 -1
  35. package/dist/step/writable-stream.d.ts.map +1 -1
  36. package/dist/step/writable-stream.js +14 -10
  37. package/dist/telemetry/semantic-conventions.d.ts +36 -0
  38. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  39. package/dist/telemetry/semantic-conventions.js +23 -1
  40. package/dist/test-support/orchestrator-context.d.ts.map +1 -1
  41. package/dist/test-support/orchestrator-context.js +8 -2
  42. package/dist/version.d.ts +1 -1
  43. package/dist/version.js +2 -2
  44. package/dist/workflow.d.ts.map +1 -1
  45. package/dist/workflow.js +8 -3
  46. package/docs/foundations/streaming.mdx +1 -1
  47. package/docs/how-it-works/event-sourcing.mdx +27 -0
  48. package/package.json +6 -6
@@ -83,6 +83,9 @@ export function createFlushableState() {
83
83
  const state = {
84
84
  ...withResolvers(),
85
85
  pendingOps: 0,
86
+ producedFrames: 0,
87
+ acceptedFrames: 0,
88
+ frameWaiters: [],
86
89
  doneResolved: false,
87
90
  streamEnded: false,
88
91
  };
@@ -163,6 +166,150 @@ function resolveAfterDrain(state) {
163
166
  }
164
167
  barrier().then(() => state.resolve(), (err) => state.reject(err));
165
168
  }
169
+ /** Record a frame synchronously when its producer emits it into this pipe. */
170
+ function markFlushableFrameProduced(state) {
171
+ state.producedFrames++;
172
+ }
173
+ /**
174
+ * Capture a step-end producer watermark, wait until the pipe has handed every
175
+ * frame through that watermark to its sink, then await the sink's durability
176
+ * barrier. Unlike {@link FlushableStreamState.promise}, this never waits for a
177
+ * user writer lock to be released.
178
+ */
179
+ export async function drainFlushableSnapshot(state) {
180
+ const drainBeforeThrow = async (error) => {
181
+ // A later frame can fail after an earlier frame was early-acked by the
182
+ // group-commit sink. Keep the earlier accepted prefix durable before
183
+ // surfacing the producer error, matching flushablePipe's failure path.
184
+ await state.drainBarrier?.().catch(() => { });
185
+ throw error;
186
+ };
187
+ const target = state.producedFrames;
188
+ if (state.acceptedFrames < target) {
189
+ if (state.pipeError !== undefined) {
190
+ return drainBeforeThrow(state.pipeError);
191
+ }
192
+ try {
193
+ await new Promise((resolve, reject) => {
194
+ state.frameWaiters.push({ target, resolve, reject });
195
+ });
196
+ }
197
+ catch (error) {
198
+ return drainBeforeThrow(error);
199
+ }
200
+ }
201
+ if (state.pipeError !== undefined) {
202
+ return drainBeforeThrow(state.pipeError);
203
+ }
204
+ await state.drainBarrier?.();
205
+ }
206
+ /**
207
+ * Mark byte-stream chunks at the producer side of a flushable pipe. Serialized
208
+ * streams should instead use `getSerializeStream`'s synchronous output hook.
209
+ */
210
+ /**
211
+ * Wrap the user-facing producer boundary of a flushable writable. A completed
212
+ * write through this handle has a sequence number before step-end snapshots,
213
+ * while the original writable remains the input to the serialization pipe.
214
+ */
215
+ export function trackFlushableWritable(writable, state, WritableStreamConstructor = WritableStream) {
216
+ const targetWriter = writable.getWriter();
217
+ const checkpoint = Symbol('workflow-stream-release-checkpoint');
218
+ let trackedController;
219
+ const tracked = new WritableStreamConstructor({
220
+ start(controller) {
221
+ trackedController = controller;
222
+ },
223
+ async write(chunk) {
224
+ if (chunk === checkpoint)
225
+ return;
226
+ markFlushableFrameProduced(state);
227
+ await targetWriter.write(chunk);
228
+ },
229
+ async close() {
230
+ state.userWritableClosing = true;
231
+ try {
232
+ await targetWriter.close();
233
+ }
234
+ finally {
235
+ targetWriter.releaseLock();
236
+ }
237
+ },
238
+ async abort(reason) {
239
+ try {
240
+ await targetWriter.abort(reason);
241
+ }
242
+ finally {
243
+ targetWriter.releaseLock();
244
+ }
245
+ },
246
+ });
247
+ // A downstream sink can fail after its early-acknowledged write has already
248
+ // resolved. Forward that terminal error into the public writable even while
249
+ // its producer is idle, so native pipeTo() rejects and cancels its source.
250
+ targetWriter.closed.catch((error) => {
251
+ trackedController.error(error);
252
+ });
253
+ let settlement;
254
+ state.settleReleasedWrites = () => {
255
+ state.releaseSettlementArmed = true;
256
+ if (settlement)
257
+ return settlement;
258
+ if (tracked.locked)
259
+ return Promise.resolve(false);
260
+ if (state.userWritableClosing) {
261
+ settlement = state.promise.then(() => true);
262
+ return settlement;
263
+ }
264
+ let checkpointWriter;
265
+ try {
266
+ checkpointWriter = tracked.getWriter();
267
+ }
268
+ catch {
269
+ // Closed/errored streams settle through the pipe's normal completion.
270
+ return Promise.resolve(false);
271
+ }
272
+ settlement = (async () => {
273
+ try {
274
+ // Native writable ordering puts this behind writes queued by the
275
+ // released writer, including write promises it did not await.
276
+ try {
277
+ await checkpointWriter.write(checkpoint);
278
+ }
279
+ catch (checkpointError) {
280
+ // A close can move from requested to terminal between getWriter()
281
+ // and write(). Its normal pipe completion already drains the sink;
282
+ // an errored pipe rejects here with its actual failure instead.
283
+ try {
284
+ await state.promise;
285
+ return true;
286
+ }
287
+ catch (pipeError) {
288
+ throw pipeError ?? checkpointError;
289
+ }
290
+ }
291
+ await drainFlushableSnapshot(state);
292
+ if (!state.doneResolved) {
293
+ state.doneResolved = true;
294
+ state.resolve();
295
+ }
296
+ return true;
297
+ }
298
+ catch (error) {
299
+ if (!state.doneResolved) {
300
+ state.doneResolved = true;
301
+ state.reject(error);
302
+ }
303
+ throw error;
304
+ }
305
+ finally {
306
+ checkpointWriter.releaseLock();
307
+ }
308
+ })();
309
+ return settlement;
310
+ };
311
+ return tracked;
312
+ }
166
313
  /**
167
314
  * Polls a WritableStream to check if the user has released their lock.
168
315
  * Resolves the done promise when lock is released and no pending ops remain.
@@ -185,6 +332,17 @@ export function pollWritableLock(writable, state) {
185
332
  state.writablePollingInterval = undefined;
186
333
  return;
187
334
  }
335
+ if (state.settleReleasedWrites) {
336
+ if ((!state.deferReleaseSettlement || state.releaseSettlementArmed) &&
337
+ !writable.locked) {
338
+ clearInterval(intervalId);
339
+ state.writablePollingInterval = undefined;
340
+ void state.settleReleasedWrites().catch(() => {
341
+ // Failure is surfaced through state.promise.
342
+ });
343
+ }
344
+ return;
345
+ }
188
346
  // Check if lock is released (not closed) and no pending ops
189
347
  if (isWritableUnlockedNotClosed(writable) && state.pendingOps === 0) {
190
348
  state.doneResolved = true;
@@ -297,6 +455,11 @@ async function flushablePipePerChunk(source, sink, state) {
297
455
  state.pendingOps++;
298
456
  try {
299
457
  await writer.write(readResult.value);
458
+ state.acceptedFrames++;
459
+ const ready = state.frameWaiters.filter((waiter) => waiter.target <= state.acceptedFrames);
460
+ state.frameWaiters = state.frameWaiters.filter((waiter) => waiter.target > state.acceptedFrames);
461
+ for (const waiter of ready)
462
+ waiter.resolve();
300
463
  }
301
464
  finally {
302
465
  state.pendingOps--;
@@ -305,7 +468,12 @@ async function flushablePipePerChunk(source, sink, state) {
305
468
  }
306
469
  catch (err) {
307
470
  state.streamEnded = true;
471
+ state.pipeError = err;
308
472
  cancelReason = err;
473
+ const frameWaiters = state.frameWaiters;
474
+ state.frameWaiters = [];
475
+ for (const waiter of frameWaiters)
476
+ waiter.reject(err);
309
477
  // Against an early-ack sink, chunks can still be buffered or in flight
310
478
  // when the pipe fails (pendingOps only counts un-acked writes). Deliver
311
479
  // that accepted prefix before settling the failure: once the state
@@ -336,4 +504,4 @@ async function flushablePipePerChunk(source, sink, state) {
336
504
  writer.releaseLock();
337
505
  }
338
506
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVNuRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHNDQUFzQyxFQUFFLG9CQUFvQixFQUFFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLG9DQUFvQyxFQUFFLGtCQUFrQixFQUFFO0lBQ2xFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFeEMsZ0ZBQWdGO0FBQ2hGLE1BQU0scUJBQXFCLEdBQUcsR0FBVyxFQUFFLENBQ3pDLFNBQVMsQ0FBQyxnQ0FBZ0MsRUFBRSxxQkFBcUIsRUFBRTtJQUNqRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSxDQUFDO0NBQ1AsQ0FBQyxDQUFDO0FBb0NMLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxLQUFLLEdBQXlCO1FBQ2xDLEdBQUcsYUFBYSxFQUFRO1FBQ3hCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsWUFBWSxFQUFFLEtBQUs7UUFDbkIsV0FBVyxFQUFFLEtBQUs7S0FDbkIsQ0FBQztJQUVGLHlFQUF5RTtJQUN6RSx3RUFBd0U7SUFDeEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQXdCO0lBQzNELElBQUksUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsQyxJQUFJLE1BQStDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNFQUFzRTtRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsZ0VBQWdFO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxRQUF3QjtJQUMzRCxJQUFJLFFBQVEsQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFbEMsSUFBSSxNQUErQyxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILHlFQUF5RTtRQUN6RSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxzRUFBc0U7UUFDdEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLGdFQUFnRTtRQUNoRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBMkI7SUFDcEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsT0FBTztJQUNULENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQ1osR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUNyQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLFFBQXdCLEVBQ3hCLEtBQTJCO0lBRTNCLDBEQUEwRDtJQUMxRCxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsbURBQW1EO1FBQ25ELElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDMUMsT0FBTztRQUNULENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsSUFBSSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixLQUFLLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQzFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBRTVCLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsUUFBd0IsRUFDeEIsS0FBMkI7SUFFM0IsMERBQTBEO0lBQzFELElBQUksS0FBSyxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNsQyxtREFBbUQ7UUFDbkQsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUIsS0FBSyxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDMUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFFNUIsS0FBSyxDQUFDLHVCQUF1QixHQUFHLFVBQVUsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLE1BQXNCLEVBQ3RCLElBQW9CLEVBQ3BCLEtBQTJCO0lBRTNCLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSxnRUFBZ0U7SUFDaEUsMkRBQTJEO0lBQzNELE1BQU0sS0FBSyxHQUFJLElBQWlELENBQzlELG1CQUFtQixDQUNwQixDQUFDO0lBQ0YsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsTUFBc0IsRUFDdEIsSUFBb0IsRUFDcEIsS0FBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFlBQXFCLENBQUM7SUFFMUIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLDRCQUE0QjtZQUM1QixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsT0FBTztZQUNULENBQUM7WUFFRCx3RUFBd0U7WUFDeEUsd0VBQXdFO1lBQ3hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDYixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ3RCLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxtRkFBbUY7WUFDbkYsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLG1EQUFtRDtnQkFDbkQsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQiwrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxtRUFBbUU7UUFDbkUsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELCtEQUErRDtRQUMvRCw0RUFBNEU7UUFDNUUsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSw2Q0FBNkM7UUFDN0MsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO1lBQVMsQ0FBQztRQUNULDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLHVEQUF1RDtRQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkL2Vudi1jb25maWcnO1xuaW1wb3J0IHsgU1RSRUFNX0RSQUlOX1NZTUJPTCB9IGZyb20gJy4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogQSBkdXJhYmlsaXR5IGJhcnJpZXIgYSBzaW5rIG1heSBleHBvc2UgdW5kZXIge0BsaW5rIFNUUkVBTV9EUkFJTl9TWU1CT0x9OlxuICogcmVzb2x2ZXMgb25jZSBldmVyeSBjaHVuayB0aGUgc2luayBoYXMgYWNjZXB0ZWQgaXMgZHVyYWJseSB3cml0dGVuLCByZWplY3RzXG4gKiBpZiBhbnkgc2VydmVyIHdyaXRlIGZhaWxlZC4gU2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYC5cbiAqL1xudHlwZSBEcmFpbkJhcnJpZXIgPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEZsb3ctY29udHJvbCBrbm9iOiB1cHBlciBib3VuZCBvbiBjaHVua3MgcmVhZC1idXQtbm90LXlldC1kdXJhYmx5LXdyaXR0ZW5cbiAqIHdoaWxlIGNvYWxlc2NpbmcuIE9uY2UgdGhpcyBtYW55IGNodW5rcyBhcmUgb3V0c3RhbmRpbmcgdGhlIHByb2R1Y2VyIHN0b3BzXG4gKiByZWFkaW5nIHVudGlsIHRoZSBjb25zdW1lciBkcmFpbnMgYSBiYXRjaCwgc28gYSBmYXN0IHByb2R1Y2VyIHBhaXJlZCB3aXRoIGFcbiAqIHNsb3cgc2VydmVyIGNhbid0IGdyb3cgdGhlIGluLW1lbW9yeSBxdWV1ZSB3aXRob3V0IGJvdW5kLiBPdmVycmlkZTpcbiAqIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2AuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgZGlzdGluY3QgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYmF0Y2ggY2FwcyBiZWxvdzogdGhpc1xuICogYm91bmRzIGhvdyBtdWNoIGlzICpidWZmZXJlZCosIHRob3NlIGJvdW5kIGhvdyBtdWNoIGdvZXMgb3V0IGluIG9uZVxuICogYHdyaXRlTXVsdGlgLiBSYWlzaW5nIHRoaXMgbXVzdCBuZXZlciBsZXQgYSBzaW5nbGUgcmVxdWVzdCBleGNlZWQgYSB3aXJlXG4gKiBsaW1pdCwgc2luY2UgYmF0Y2ggc2l6aW5nIGVuZm9yY2VzIHRoYXQgaW5kZXBlbmRlbnRseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkZMSUdIVF9DSFVOS1MgPSAxMDAwO1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4SW5mbGlnaHRDaHVua3MgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9JTkZMSUdIVF9DSFVOS1MnLCBNQVhfSU5GTElHSFRfQ0hVTktTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFdpcmUgbGltaXQ6IG1heGltdW0gbnVtYmVyIG9mIGNodW5rcyBpbiBhIHNpbmdsZSBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLlxuICogVGhlIHNlcnZlciBlbmZvcmNlcyBhIHBlci1tdWx0aS13cml0ZSBjaHVuayBjYXAgKDEsMDAwIHRvZGF5KTsgYSBiYXRjaCBpc1xuICogc3BsaXQgYXQgdGhpcyBib3VuZCBzbyBpdCBjYW4gbmV2ZXIgYmUgcmVqZWN0ZWQgd2hvbGVzYWxlLCBpbmRlcGVuZGVudGx5IG9mXG4gKiB0aGUgYmFja3ByZXNzdXJlIGtub2IgYWJvdmUuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9DSFVOS1NfUEVSX0JBVENIYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DSFVOS1NfUEVSX0JBVENIID0gMTAwMDtcblxuZXhwb3J0IGNvbnN0IGdldE1heENodW5rc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQ0hVTktTX1BFUl9CQVRDSCcsIE1BWF9DSFVOS1NfUEVSX0JBVENILCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFdpcmUgbGltaXQ6IG1heGltdW0gY3VtdWxhdGl2ZSBieXRlcyBpbiBhIHNpbmdsZSBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLlxuICogQ2h1bmsgKmNvdW50KiBhbG9uZSBpcyBub3QgZW5vdWdoOiAxLDAwMCBzbWFsbCBjaHVua3MgYXJlIH4xMDBLQiBidXQgMSwwMDBcbiAqIGZpbGUtc2l6ZWQgY2h1bmtzIGNhbiBiZSBodW5kcmVkcyBvZiBNQiwgd2hpY2ggcGxhdGZvcm0gcmVxdWVzdC1ib2R5IGxpbWl0c1xuICogcmVqZWN0IGxvbmcgYmVmb3JlIHRoZSBjb3VudCBjYXAgbWF0dGVycy4gQSBiYXRjaCBpcyBzcGxpdCBvbmNlIGFkZGluZyB0aGVcbiAqIG5leHQgY2h1bmsgd291bGQgZXhjZWVkIHRoaXMgKGEgc2luZ2xlIGNodW5rIGxhcmdlciB0aGFuIHRoZSBjYXAgc3RpbGwgZ29lc1xuICogb3V0IGFsb25lKS4gRGVmYXVsdCAxIE1pQi4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0JZVEVTX1BFUl9CQVRDSGAuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQllURVNfUEVSX0JBVENIID0gMTAyNCAqIDEwMjQ7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhCeXRlc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIJywgTUFYX0JZVEVTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBCdWZmZXIgYm91bmQgKGJ5dGVzKSBmb3IgdGhlIHNlcnZlciB3cml0YWJsZSdzIGdyb3VwLWNvbW1pdCBidWZmZXIsIHRoZVxuICogYnl0ZS1kZW5vbWluYXRlZCBjb3VudGVycGFydCBvZiB7QGxpbmsgTUFYX0lORkxJR0hUX0NIVU5LU30uIGB3cml0ZSgpYFxuICogYmxvY2tzIG9uY2UgdGhpcyBtdWNoIGRhdGEgaXMgYnVmZmVyZWQtYnV0LW5vdC1kdXJhYmxlLCBzbyBhIGZhc3QgcHJvZHVjZXJcbiAqIG9mIGxhcmdlIGNodW5rcyBjYW4ndCBncm93IGNsaWVudCBtZW1vcnkgd2l0aG91dCBib3VuZC4gRGVmYXVsdCA4IE1pQlxuICogKGVpZ2h0IHJlcXVlc3Qtc2l6ZWQgZ3JvdXBzKS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0JVRkZFUkVEX0JZVEVTYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CVUZGRVJFRF9CWVRFUyA9IDggKiAxMDI0ICogMTAyNDtcblxuZXhwb3J0IGNvbnN0IGdldE1heEJ1ZmZlcmVkQnl0ZXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9CVUZGRVJFRF9CWVRFUycsIE1BWF9CVUZGRVJFRF9CWVRFUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwsIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqIEVmZmVjdGl2ZSBsb2NrLXBvbGwgaW50ZXJ2YWwuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TYC4gKi9cbmNvbnN0IGdldExvY2tQb2xsSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVMnLCBMT0NLX1BPTExfSU5URVJWQUxfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogU3RhdGUgdHJhY2tlciBmb3IgZmx1c2hhYmxlIHN0cmVhbSBvcGVyYXRpb25zLlxuICogUmVzb2x2ZXMgd2hlbiBlaXRoZXI6XG4gKiAxLiBTdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBMb2NrIGlzIHJlbGVhc2VkIEFORCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBmbHVzaGVkXG4gKlxuICogTm90ZTogYGRvbmVSZXNvbHZlZGAgYW5kIGBzdHJlYW1FbmRlZGAgYXJlIHNlcGFyYXRlOlxuICogLSBgZG9uZVJlc29sdmVkYDogVGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkIChzdGVwIGNhbiBjb21wbGV0ZSlcbiAqIC0gYHN0cmVhbUVuZGVkYDogVGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZFxuICpcbiAqIE9uY2UgYGRvbmVSZXNvbHZlZGAgaXMgc2V0IHRvIHRydWUsIHRoZSBgZG9uZWAgcHJvbWlzZSB3aWxsIG5vdCByZXNvbHZlXG4gKiBhZ2Fpbi4gUmUtYWNxdWlyaW5nIGxvY2tzIGFmdGVyIHJlbGVhc2UgaXMgbm90IHN1cHBvcnRlZCBhcyBhIHdheSB0b1xuICogdHJpZ2dlciBhZGRpdGlvbmFsIGNvbXBsZXRpb24gc2lnbmFsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIGV4dGVuZHMgUHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4ge1xuICAvKiogTnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgY3VycmVudGx5IGluIGZsaWdodCB0byB0aGUgc2VydmVyICovXG4gIHBlbmRpbmdPcHM6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkICovXG4gIGRvbmVSZXNvbHZlZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZCAqL1xuICBzdHJlYW1FbmRlZDogYm9vbGVhbjtcbiAgLyoqIEludGVydmFsIElEIGZvciB3cml0YWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgd3JpdGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3IgcmVhZGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHJlYWRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICAvKipcbiAgICogRHVyYWJpbGl0eSBiYXJyaWVyIG9mIHRoZSBwaXBlJ3Mgc2luaywgd2hlbiBpdCBhY2tzIHdyaXRlcyBvbiBidWZmZXJcbiAgICogZW50cnkgKHNlZSB7QGxpbmsgU1RSRUFNX0RSQUlOX1NZTUJPTH0pLiBMb2NrLXJlbGVhc2UgY29tcGxldGlvbiBhd2FpdHNcbiAgICogdGhpcyBiZWZvcmUgcmVzb2x2aW5nIHNvIGBwZW5kaW5nT3BzID09PSAwYCAoZmFzdCwgYnVmZmVyZWQgYWNrcykgY2FuJ3RcbiAgICogY29tcGxldGUgYSBzdGVwIHdoaWxlIGRhdGEgaXMgc3RpbGwgY2xpZW50LXNpZGUuXG4gICAqL1xuICBkcmFpbkJhcnJpZXI/OiBEcmFpbkJhcnJpZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbHVzaGFibGVTdGF0ZSgpOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSB7XG4gIGNvbnN0IHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSA9IHtcbiAgICAuLi53aXRoUmVzb2x2ZXJzPHZvaWQ+KCksXG4gICAgcGVuZGluZ09wczogMCxcbiAgICBkb25lUmVzb2x2ZWQ6IGZhbHNlLFxuICAgIHN0cmVhbUVuZGVkOiBmYWxzZSxcbiAgfTtcblxuICAvLyBUaGUgcnVudGltZSBhd2FpdHMgdGhpcyBwcm9taXNlIGFmdGVyIHVzZXIgY29kZSByZXR1cm5zLiBPYnNlcnZlIGVhcmx5XG4gIC8vIHN0cmVhbSBmYWlsdXJlcyBub3cgc28gdGhleSBkbyBub3QgYmVjb21lIHVuaGFuZGxlZCByZWplY3Rpb25zIGZpcnN0LlxuICBzdGF0ZS5wcm9taXNlLmNhdGNoKCgpID0+IHt9KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgV3JpdGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICogV2hlbiBhIHN0cmVhbSBpcyBjbG9zZWQsIC5sb2NrZWQgaXMgZmFsc2UgYnV0IGdldFdyaXRlcigpIHRocm93cy5cbiAqIFdlIG9ubHkgd2FudCB0byByZXNvbHZlIHZpYSBwb2xsaW5nIHdoZW4gdGhlIHN0cmVhbSBpcyB1bmxvY2tlZCwgbm90IGNsb3NlZC5cbiAqIElmIGNsb3NlZCwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICovXG5mdW5jdGlvbiBpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGU6IFdyaXRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmICh3cml0YWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgd3JpdGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRXcml0ZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgd3JpdGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHdyaXRlciA9IHdyaXRhYmxlLmdldFdyaXRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRXcml0ZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBSZWFkYWJsZVN0cmVhbSBpcyB1bmxvY2tlZCAodXNlciByZWxlYXNlZCBsb2NrKSB2cyBjbG9zZWQuXG4gKi9cbmZ1bmN0aW9uIGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZTogUmVhZGFibGVTdHJlYW0pOiBib29sZWFuIHtcbiAgaWYgKHJlYWRhYmxlLmxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCByZWFkZXI6IFJlYWRhYmxlU3RyZWFtRGVmYXVsdFJlYWRlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gYWNxdWlyZSByZWFkZXIgLSBpZiBzdWNjZXNzZnVsLCBzdHJlYW0gaXMgdW5sb2NrZWQgKG5vdCBjbG9zZWQpXG4gICAgcmVhZGVyID0gcmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGdldFJlYWRlcigpIHRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkL2Vycm9yZWQgLSBsZXQgcHVtcCBoYW5kbGUgaXRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJlYWRlci5yZWxlYXNlTG9jaygpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiByZWxlYXNlTG9jaygpIHRocm93cyBmb3IgYW55IHJlYXNvbiwgY29uc2VydmF0aXZlbHkgdHJlYXQgdGhlXG4gICAgLy8gc3RyZWFtIGFzIGNsb3NlZC9lcnJvcmVkIHNvIGNhbGxlcnMgZG9uJ3QgYXNzdW1lIGl0J3Mgc2FmZSB0byB1c2UuXG4gICAgLy8gVGhlIHB1bXAgd2lsbCBvYnNlcnZlIHRoZSBmYWlsdXJlIHZpYSB0aGUgc3RyZWFtJ3MgZW5kIHN0YXRlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFNldHRsZSB0aGUgZmx1c2hhYmxlIGNvbXBsZXRpb24gYWZ0ZXIgdGhlIHNpbmsncyBkdXJhYmlsaXR5IGJhcnJpZXIuXG4gKlxuICogTG9jayByZWxlYXNlIG1lYW5zIHRoZSBwcm9kdWNlciBpcyBkb25lICp3cml0aW5nKjsgd2l0aCBhIGdyb3VwLWNvbW1pdFxuICogc2luaywgYWNjZXB0ZWQgY2h1bmtzIG1heSBzdGlsbCBiZSBjbGllbnQtYnVmZmVyZWQgb3IgaW4gYSByZXF1ZXN0IHRoYXQgaXNcbiAqIGluIGZsaWdodC4gQXdhaXRpbmcgdGhlIGJhcnJpZXIgaGVyZSBrZWVwcyB0aGUgY29tcGxldGlvbidzIG1lYW5pbmdcbiAqIChcImV2ZXJ5dGhpbmcgd3JpdHRlbiBzbyBmYXIgaXMgZHVyYWJsZVwiKSBpZGVudGljYWwgdG8gdGhlIHByZS1iYXRjaGluZ1xuICogYmVoYXZpb3Igd2hlcmUgZWFjaCB3cml0ZSgpIHdhcyBpbmRpdmlkdWFsbHkgZHVyYWJsZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlKTogdm9pZCB7XG4gIGNvbnN0IGJhcnJpZXIgPSBzdGF0ZS5kcmFpbkJhcnJpZXI7XG4gIGlmICghYmFycmllcikge1xuICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYmFycmllcigpLnRoZW4oXG4gICAgKCkgPT4gc3RhdGUucmVzb2x2ZSgpLFxuICAgIChlcnIpID0+IHN0YXRlLnJlamVjdChlcnIpXG4gICk7XG59XG5cbi8qKlxuICogUG9sbHMgYSBXcml0YWJsZVN0cmVhbSB0byBjaGVjayBpZiB0aGUgdXNlciBoYXMgcmVsZWFzZWQgdGhlaXIgbG9jay5cbiAqIFJlc29sdmVzIHRoZSBkb25lIHByb21pc2Ugd2hlbiBsb2NrIGlzIHJlbGVhc2VkIGFuZCBubyBwZW5kaW5nIG9wcyByZW1haW4uXG4gKlxuICogTm90ZTogT25seSByZXNvbHZlcyBpZiBzdHJlYW0gaXMgdW5sb2NrZWQgYnV0IE5PVCBjbG9zZWQuIElmIHRoZSB1c2VyIGNsb3Nlc1xuICogdGhlIHN0cmVhbSwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICpcbiAqIFByb3RlY3Rpb246IElmIHBvbGxpbmcgaXMgYWxyZWFkeSBhY3RpdmUgb24gdGhpcyBzdGF0ZSwgdGhlIGV4aXN0aW5nIGludGVydmFsXG4gKiBpcyB1c2VkIHRvIGF2b2lkIGNyZWF0aW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsV3JpdGFibGVMb2NrKFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogdm9pZCB7XG4gIC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb24gdGhlIHNhbWUgc3RhdGVcbiAgaWYgKHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vIFN0b3AgcG9sbGluZyBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIHN0cmVhbSBlbmRlZFxuICAgIGlmIChzdGF0ZS5kb25lUmVzb2x2ZWQgfHwgc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGUpO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFJlYWRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxSZWFkYWJsZUxvY2soXG4gIHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlQWZ0ZXJEcmFpbihzdGF0ZSk7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCYXRjaGluZyBsaXZlcyBpbiB0aGUgc2luayAoYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gIGdyb3VwLWNvbW1pdHNcbiAgLy8gaXRzIGJ1ZmZlciksIHNvIHRoaXMgcGlwZSBpcyBhIHBsYWluIHBlci1jaHVuayBwdW1wIHJlZ2FyZGxlc3Mgb2YgcGF0aDpcbiAgLy8gaXRzIG9ubHkgcmVzcG9uc2liaWxpdGllcyBhcmUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYW5kIGR1cmFiaWxpdHlcbiAgLy8gdHJhY2tpbmcuIEdyb3VwLWNvbW1pdCBzaW5rcyBhY2sgd3JpdGUoKSBvbiBidWZmZXIgZW50cnk7IGFkb3B0IHRoZWlyXG4gIC8vIGR1cmFiaWxpdHkgYmFycmllciBzbyB0aGUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gc3RpbGwgbWVhbnNcbiAgLy8gXCJldmVyeXRoaW5nIHdyaXR0ZW4gaXMgZHVyYWJsZVwiIChzZWUgcmVzb2x2ZUFmdGVyRHJhaW4pLlxuICBjb25zdCBkcmFpbiA9IChzaW5rIGFzIHsgW1NUUkVBTV9EUkFJTl9TWU1CT0xdPzogRHJhaW5CYXJyaWVyIH0pW1xuICAgIFNUUkVBTV9EUkFJTl9TWU1CT0xcbiAgXTtcbiAgaWYgKHR5cGVvZiBkcmFpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlLmRyYWluQmFycmllciA9IGRyYWluO1xuICB9XG4gIHJldHVybiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoc291cmNlLCBzaW5rLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogVGhlIHB1bXAgYmVoaW5kIHtAbGluayBmbHVzaGFibGVQaXBlfTogYXdhaXRzIGVhY2ggYHdyaXRlci53cml0ZSgpYCBiZWZvcmVcbiAqIHJlYWRpbmcgdGhlIG5leHQgY2h1bmsuIEFnYWluc3QgYSBncm91cC1jb21taXQgc2luaywgd3JpdGUoKSBhY2tzIG9uIGJ1ZmZlclxuICogZW50cnksIHNvIHRoaXMgbG9vcCBmZWVkcyB0aGUgc2luayBhcyBmYXN0IGFzIHRoZSBwcm9kdWNlciBlbWl0cyAoYm91bmRlZFxuICogYnkgdGhlIHNpbmsncyBidWZmZXIgYm91bmQpIGFuZCBiYXRjaGluZyBoYXBwZW5zIGluc2lkZSB0aGUgc2luazsgYWdhaW5zdCBhXG4gKiBwbGFpbiBzaW5rIGVhY2ggd3JpdGUgaXMgaW5kaXZpZHVhbGx5IGR1cmFibGUsIGFzIGJlZm9yZS4gVGhlIHNvdXJjZS1kb25lXG4gKiBwYXRoIGNsb3NlcyB0aGUgc2luaywgd2hpY2ggZHJhaW5zIGl0LCBzbyBjb21wbGV0aW9uIGFsd2F5cyBpbXBsaWVzXG4gKiBkdXJhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb3VyY2UuIERvbid0IGNvdW50IHRoaXMgYXMgYSBwZW5kaW5nIG9wZXJhdGlvbiBiZWNhdXNlXG4gICAgICAvLyByZWFkcyB3YWl0IGZvciBkYXRhLiBUaGUgaW1wb3J0YW50IG9wZXJhdGlvbnMgYXJlIHdyaXRlcyB0byB0aGUgc2luay5cbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nT3BzLS07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIC8vIEFnYWluc3QgYW4gZWFybHktYWNrIHNpbmssIGNodW5rcyBjYW4gc3RpbGwgYmUgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0XG4gICAgLy8gd2hlbiB0aGUgcGlwZSBmYWlscyAocGVuZGluZ09wcyBvbmx5IGNvdW50cyB1bi1hY2tlZCB3cml0ZXMpLiBEZWxpdmVyXG4gICAgLy8gdGhhdCBhY2NlcHRlZCBwcmVmaXggYmVmb3JlIHNldHRsaW5nIHRoZSBmYWlsdXJlOiBvbmNlIHRoZSBzdGF0ZVxuICAgIC8vIHJlamVjdHMsIHRoZSBzdGVwIG1heSBwZXJzaXN0IGl0cyBmYWlsdXJlIGFuZCB0aGUgaW52b2NhdGlvbiBmaW5pc2gsXG4gICAgLy8gYW5kIGFueXRoaW5nIHN0aWxsIGNsaWVudC1zaWRlIHdvdWxkIGJlIGxvc3QuIFRoZSBvcmlnaW5hbCBwaXBlIGVycm9yXG4gICAgLy8gc3RheXMgcHJpbWFyeSwgc2luY2UgYSBkcmFpbiBmYWlsdXJlIGlzIGFscmVhZHkgc3RpY2t5IG9uIHRoZSBzaW5rLlxuICAgIGlmIChzdGF0ZS5kcmFpbkJhcnJpZXIpIHtcbiAgICAgIGF3YWl0IHN0YXRlLmRyYWluQmFycmllcigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIGVycm9yIHRocm91Z2ggZmx1c2hhYmxlUGlwZSdzIG93biBwcm9taXNlIGFzIHdlbGwuXG4gICAgLy8gQ2FsbGVycyB0aGF0IHJlbHkgb24gdGhlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIHNob3VsZCB1c2UgYHN0YXRlLnByb21pc2VgLFxuICAgIC8vIHdoaWxlIG90aGVyIGNhbGxlcnMgbWF5IGRlcGVuZCBvbiB0aGlzIHJlamVjdGlvbi4gU29tZSBrbm93biBjYWxsZXJzXG4gICAgLy8gZXhwbGljaXRseSBpZ25vcmUgdGhpcyByZWplY3Rpb24gKGAuY2F0Y2goKCkgPT4ge30pYCkgYW5kIHJlbHkgc29sZWx5XG4gICAgLy8gb24gYHN0YXRlLnJlamVjdChlcnIpYCBmb3IgZXJyb3IgaGFuZGxpbmcuXG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENhbmNlbCB0aGUgdXBzdHJlYW0gcmVhZGVyIHNvIHRoZSBzb3VyY2Uga25vd3MgdG8gc3RvcCBnZW5lcmF0aW5nIGRhdGEuXG4gICAgLy8gVXNlcyBjYW5jZWxSZWFzb24gKHNldCBpbiB0aGUgY2F0Y2ggYmxvY2spIHNvIHRoZSBzb3VyY2UgcmVjZWl2ZXMgY29udGV4dFxuICAgIC8vIGFib3V0IHdoeSBpdCB3YXMgY2FuY2VsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
507
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVNuRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFXLEVBQUUsQ0FDL0MsU0FBUyxDQUFDLHNDQUFzQyxFQUFFLG9CQUFvQixFQUFFO0lBQ3RFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUVsRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDOUMsU0FBUyxDQUFDLG9DQUFvQyxFQUFFLGtCQUFrQixFQUFFO0lBQ2xFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFFeEMsZ0ZBQWdGO0FBQ2hGLE1BQU0scUJBQXFCLEdBQUcsR0FBVyxFQUFFLENBQ3pDLFNBQVMsQ0FBQyxnQ0FBZ0MsRUFBRSxxQkFBcUIsRUFBRTtJQUNqRSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSxDQUFDO0NBQ1AsQ0FBQyxDQUFDO0FBNERMLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxLQUFLLEdBQXlCO1FBQ2xDLEdBQUcsYUFBYSxFQUFRO1FBQ3hCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsY0FBYyxFQUFFLENBQUM7UUFDakIsY0FBYyxFQUFFLENBQUM7UUFDakIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsWUFBWSxFQUFFLEtBQUs7UUFDbkIsV0FBVyxFQUFFLEtBQUs7S0FDbkIsQ0FBQztJQUVGLHlFQUF5RTtJQUN6RSx3RUFBd0U7SUFDeEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFFOUIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLDJCQUEyQixDQUFDLFFBQXdCO0lBQzNELElBQUksUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsQyxJQUFJLE1BQStDLENBQUM7SUFDcEQsSUFBSSxDQUFDO1FBQ0gseUVBQXlFO1FBQ3pFLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNFQUFzRTtRQUN0RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsZ0VBQWdFO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxRQUF3QjtJQUMzRCxJQUFJLFFBQVEsQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFbEMsSUFBSSxNQUErQyxDQUFDO0lBQ3BELElBQUksQ0FBQztRQUNILHlFQUF5RTtRQUN6RSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxzRUFBc0U7UUFDdEUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLGdFQUFnRTtRQUNoRSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBMkI7SUFDcEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztJQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsT0FBTztJQUNULENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQ1osR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUNyQixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsU0FBUywwQkFBMEIsQ0FBQyxLQUEyQjtJQUM3RCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsS0FBMkI7SUFFM0IsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsS0FBYyxFQUFrQixFQUFFO1FBQ2hFLHVFQUF1RTtRQUN2RSxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLE1BQU0sS0FBSyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztJQUNwQyxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMxQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0g7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsUUFBMkIsRUFDM0IsS0FBMkIsRUFDM0IsNEJBQW1ELGNBQWM7SUFFakUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ2hFLElBQUksaUJBQWtELENBQUM7SUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQztRQUM1QyxLQUFLLENBQUMsVUFBVTtZQUNkLGlCQUFpQixHQUFHLFVBQVUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLO1lBQ2YsSUFBSSxLQUFLLEtBQUssVUFBVTtnQkFBRSxPQUFPO1lBQ2pDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUs7WUFDVCxLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM3QixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQ2hCLElBQUksQ0FBQztnQkFDSCxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsQ0FBQztvQkFBUyxDQUFDO2dCQUNULFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQXNCLENBQUM7SUFFeEIsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNsQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLFVBQXdDLENBQUM7SUFDN0MsS0FBSyxDQUFDLG9CQUFvQixHQUFHLEdBQXFCLEVBQUU7UUFDbEQsS0FBSyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLFVBQVU7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUNsQyxJQUFJLE9BQU8sQ0FBQyxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUIsVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLGdCQUFnRCxDQUFDO1FBQ3JELElBQUksQ0FBQztZQUNILGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asc0VBQXNFO1lBQ3RFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsVUFBVSxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDO2dCQUNILGlFQUFpRTtnQkFDakUsOERBQThEO2dCQUM5RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBZSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBQUMsT0FBTyxlQUFlLEVBQUUsQ0FBQztvQkFDekIsa0VBQWtFO29CQUNsRSxtRUFBbUU7b0JBQ25FLGdFQUFnRTtvQkFDaEUsSUFBSSxDQUFDO3dCQUNILE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDcEIsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFBQyxPQUFPLFNBQVMsRUFBRSxDQUFDO3dCQUNuQixNQUFNLFNBQVMsSUFBSSxlQUFlLENBQUM7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxNQUFNLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN4QixLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDMUIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQixDQUFDO2dCQUNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQzFCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLENBQUM7Z0JBQ0QsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakMsQ0FBQztRQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7SUFFRixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixRQUF3QixFQUN4QixLQUEyQjtJQUUzQiwwREFBMEQ7SUFDMUQsSUFBSSxLQUFLLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEQsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQ2xDLG1EQUFtRDtRQUNuRCxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzVDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixLQUFLLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQzFDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixJQUNFLENBQUMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDO2dCQUMvRCxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQ2hCLENBQUM7Z0JBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMxQixLQUFLLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO2dCQUMxQyxLQUFLLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7b0JBQzNDLDZDQUE2QztnQkFDL0MsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsSUFBSSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQixLQUFLLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQzFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBRTVCLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsUUFBd0IsRUFDeEIsS0FBMkI7SUFFM0IsMERBQTBEO0lBQzFELElBQUksS0FBSyxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNsQyxtREFBbUQ7UUFDbkQsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDMUIsS0FBSyxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELDREQUE0RDtRQUM1RCxJQUFJLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEUsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFCLEtBQUssQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDMUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7SUFFNUIsS0FBSyxDQUFDLHVCQUF1QixHQUFHLFVBQVUsQ0FBQztBQUM3QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQzNCLE1BQXNCLEVBQ3RCLElBQW9CLEVBQ3BCLEtBQTJCO0lBRTNCLDJFQUEyRTtJQUMzRSwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSxnRUFBZ0U7SUFDaEUsMkRBQTJEO0lBQzNELE1BQU0sS0FBSyxHQUFJLElBQWlELENBQzlELG1CQUFtQixDQUNwQixDQUFDO0lBQ0YsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNoQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsTUFBc0IsRUFDdEIsSUFBb0IsRUFDcEIsS0FBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNoQyxJQUFJLFlBQXFCLENBQUM7SUFFMUIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNaLDRCQUE0QjtZQUM1QixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDdEIsT0FBTztZQUNULENBQUM7WUFFRCx3RUFBd0U7WUFDeEUsd0VBQXdFO1lBQ3hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDcEMsTUFBTSxDQUFDLElBQUksRUFBRTtnQkFDYixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7b0JBQ3RCLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUN2RSxDQUFDLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxtRkFBbUY7WUFDbkYsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3BCLG1EQUFtRDtnQkFDbkQsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNyQiwrQ0FBK0M7Z0JBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2xCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUNyQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxDQUNsRCxDQUFDO2dCQUNGLEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzVDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQ2pELENBQUM7Z0JBQ0YsS0FBSyxNQUFNLE1BQU0sSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN6QixLQUFLLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUN0QixZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ25CLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDeEMsS0FBSyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDeEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxZQUFZO1lBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RCx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLHNFQUFzRTtRQUN0RSxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDMUIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQixDQUFDO1FBQ0QsK0RBQStEO1FBQy9ELDRFQUE0RTtRQUM1RSx1RUFBdUU7UUFDdkUsd0VBQXdFO1FBQ3hFLDZDQUE2QztRQUM3QyxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUM7WUFBUyxDQUFDO1FBQ1QsMEVBQTBFO1FBQzFFLDRFQUE0RTtRQUM1RSw2RUFBNkU7UUFDN0UsdURBQXVEO1FBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBQcm9taXNlV2l0aFJlc29sdmVycywgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQvZW52LWNvbmZpZyc7XG5pbXBvcnQgeyBTVFJFQU1fRFJBSU5fU1lNQk9MIH0gZnJvbSAnLi9zeW1ib2xzLmpzJztcblxuLyoqXG4gKiBBIGR1cmFiaWxpdHkgYmFycmllciBhIHNpbmsgbWF5IGV4cG9zZSB1bmRlciB7QGxpbmsgU1RSRUFNX0RSQUlOX1NZTUJPTH06XG4gKiByZXNvbHZlcyBvbmNlIGV2ZXJ5IGNodW5rIHRoZSBzaW5rIGhhcyBhY2NlcHRlZCBpcyBkdXJhYmx5IHdyaXR0ZW4sIHJlamVjdHNcbiAqIGlmIGFueSBzZXJ2ZXIgd3JpdGUgZmFpbGVkLiBTZWUgYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gLlxuICovXG50eXBlIERyYWluQmFycmllciA9ICgpID0+IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogRmxvdy1jb250cm9sIGtub2I6IHVwcGVyIGJvdW5kIG9uIGNodW5rcyByZWFkLWJ1dC1ub3QteWV0LWR1cmFibHktd3JpdHRlblxuICogd2hpbGUgY29hbGVzY2luZy4gT25jZSB0aGlzIG1hbnkgY2h1bmtzIGFyZSBvdXRzdGFuZGluZyB0aGUgcHJvZHVjZXIgc3RvcHNcbiAqIHJlYWRpbmcgdW50aWwgdGhlIGNvbnN1bWVyIGRyYWlucyBhIGJhdGNoLCBzbyBhIGZhc3QgcHJvZHVjZXIgcGFpcmVkIHdpdGggYVxuICogc2xvdyBzZXJ2ZXIgY2FuJ3QgZ3JvdyB0aGUgaW4tbWVtb3J5IHF1ZXVlIHdpdGhvdXQgYm91bmQuIE92ZXJyaWRlOlxuICogYFdPUktGTE9XX1NUUkVBTV9NQVhfSU5GTElHSFRfQ0hVTktTYC5cbiAqXG4gKiBUaGlzIGlzIGRlbGliZXJhdGVseSBkaXN0aW5jdCBmcm9tIHRoZSBwZXItcmVxdWVzdCBiYXRjaCBjYXBzIGJlbG93OiB0aGlzXG4gKiBib3VuZHMgaG93IG11Y2ggaXMgKmJ1ZmZlcmVkKiwgdGhvc2UgYm91bmQgaG93IG11Y2ggZ29lcyBvdXQgaW4gb25lXG4gKiBgd3JpdGVNdWx0aWAuIFJhaXNpbmcgdGhpcyBtdXN0IG5ldmVyIGxldCBhIHNpbmdsZSByZXF1ZXN0IGV4Y2VlZCBhIHdpcmVcbiAqIGxpbWl0LCBzaW5jZSBiYXRjaCBzaXppbmcgZW5mb3JjZXMgdGhhdCBpbmRlcGVuZGVudGx5LlxuICovXG5leHBvcnQgY29uc3QgTUFYX0lORkxJR0hUX0NIVU5LUyA9IDEwMDA7XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhJbmZsaWdodENodW5rcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LUycsIE1BWF9JTkZMSUdIVF9DSFVOS1MsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2YgY2h1bmtzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBUaGUgc2VydmVyIGVuZm9yY2VzIGEgcGVyLW11bHRpLXdyaXRlIGNodW5rIGNhcCAoMSwwMDAgdG9kYXkpOyBhIGJhdGNoIGlzXG4gKiBzcGxpdCBhdCB0aGlzIGJvdW5kIHNvIGl0IGNhbiBuZXZlciBiZSByZWplY3RlZCB3aG9sZXNhbGUsIGluZGVwZW5kZW50bHkgb2ZcbiAqIHRoZSBiYWNrcHJlc3N1cmUga25vYiBhYm92ZS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0NIVU5LU19QRVJfQkFUQ0ggPSAxMDAwO1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q2h1bmtzUGVyQmF0Y2ggPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9DSFVOS1NfUEVSX0JBVENIJywgTUFYX0NIVU5LU19QRVJfQkFUQ0gsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBjdW11bGF0aXZlIGJ5dGVzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBDaHVuayAqY291bnQqIGFsb25lIGlzIG5vdCBlbm91Z2g6IDEsMDAwIHNtYWxsIGNodW5rcyBhcmUgfjEwMEtCIGJ1dCAxLDAwMFxuICogZmlsZS1zaXplZCBjaHVua3MgY2FuIGJlIGh1bmRyZWRzIG9mIE1CLCB3aGljaCBwbGF0Zm9ybSByZXF1ZXN0LWJvZHkgbGltaXRzXG4gKiByZWplY3QgbG9uZyBiZWZvcmUgdGhlIGNvdW50IGNhcCBtYXR0ZXJzLiBBIGJhdGNoIGlzIHNwbGl0IG9uY2UgYWRkaW5nIHRoZVxuICogbmV4dCBjaHVuayB3b3VsZCBleGNlZWQgdGhpcyAoYSBzaW5nbGUgY2h1bmsgbGFyZ2VyIHRoYW4gdGhlIGNhcCBzdGlsbCBnb2VzXG4gKiBvdXQgYWxvbmUpLiBEZWZhdWx0IDEgTWlCLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9CWVRFU19QRVJfQkFUQ0ggPSAxMDI0ICogMTAyNDtcblxuZXhwb3J0IGNvbnN0IGdldE1heEJ5dGVzUGVyQmF0Y2ggPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfU1RSRUFNX01BWF9CWVRFU19QRVJfQkFUQ0gnLCBNQVhfQllURVNfUEVSX0JBVENILCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIEJ1ZmZlciBib3VuZCAoYnl0ZXMpIGZvciB0aGUgc2VydmVyIHdyaXRhYmxlJ3MgZ3JvdXAtY29tbWl0IGJ1ZmZlciwgdGhlXG4gKiBieXRlLWRlbm9taW5hdGVkIGNvdW50ZXJwYXJ0IG9mIHtAbGluayBNQVhfSU5GTElHSFRfQ0hVTktTfS4gYHdyaXRlKClgXG4gKiBibG9ja3Mgb25jZSB0aGlzIG11Y2ggZGF0YSBpcyBidWZmZXJlZC1idXQtbm90LWR1cmFibGUsIHNvIGEgZmFzdCBwcm9kdWNlclxuICogb2YgbGFyZ2UgY2h1bmtzIGNhbid0IGdyb3cgY2xpZW50IG1lbW9yeSB3aXRob3V0IGJvdW5kLiBEZWZhdWx0IDggTWlCXG4gKiAoZWlnaHQgcmVxdWVzdC1zaXplZCBncm91cHMpLiBPdmVycmlkZTogYFdPUktGTE9XX1NUUkVBTV9NQVhfQlVGRkVSRURfQllURVNgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JVRkZFUkVEX0JZVEVTID0gOCAqIDEwMjQgKiAxMDI0O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4QnVmZmVyZWRCeXRlcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0JVRkZFUkVEX0JZVEVTJywgTUFYX0JVRkZFUkVEX0JZVEVTLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFBvbGxpbmcgaW50ZXJ2YWwgKGluIG1zKSBmb3IgbG9jayByZWxlYXNlIGRldGVjdGlvbi5cbiAqXG4gKiBUaGUgV2ViIFN0cmVhbXMgQVBJIGRvZXMgbm90IGV4cG9zZSBhbiBldmVudCBmb3IgXCJsb2NrIHJlbGVhc2VkIGJ1dCBzdHJlYW1cbiAqIHN0aWxsIG9wZW5cIjsgd2UgY2FuIG9ubHkgZGlzdGluZ3Vpc2ggdGhhdCBzdGF0ZSBieSBwZXJpb2RpY2FsbHkgYXR0ZW1wdGluZ1xuICogdG8gYWNxdWlyZSBhIHJlYWRlci93cml0ZXIuIEZvciB0aGF0IHJlYXNvbiB3ZSB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGFcbiAqIGZ1bGx5IGV2ZW50LWRyaXZlbiBhcHByb2FjaCBoZXJlLlxuICpcbiAqIDEwbXMgaXMgY2hvc2VuIHNvIHRoZSBwb2xsaW5nIHRpY2sgYWxtb3N0IG5ldmVyIHNpdHMgb24gdGhlIGNyaXRpY2FsIHBhdGg6XG4gKiB0aGUgVjIgc3RlcC1leGVjdXRvcidzIGBvcHNTZXR0bGVkYCByYWNlIHdhaXRzIGZvciB0aGlzIHN0YXRlIHRvIHJlc29sdmVcbiAqIGFmdGVyIGVhY2ggc3RlcCBib2R5IHJldHVybnMsIHNvIGEgY29hcnNlciBpbnRlcnZhbCAodGhlIHByZXZpb3VzIDEwMG1zKVxuICogYWRkcyB2aXNpYmxlIHBlci1zdGVwIGxhdGVuY3kgdG8gc3RyZWFtaW5nIHdvcmtmbG93cy4gV2l0aCBhIHVuaWZvcm1seVxuICogZGlzdHJpYnV0ZWQgb2Zmc2V0IGJldHdlZW4gc3RlcCByZXR1cm4gYW5kIHRoZSBuZXh0IHRpY2ssIHRoZSBleHBlY3RlZFxuICogd2FpdCBpcyBoYWxmIHRoZSBpbnRlcnZhbCwgc28gMTBtcyBtZWFucyB+NW1zIGF2ZXJhZ2Ugd2FpdCBwZXIgc3RlcFxuICogaW5zdGVhZCBvZiB+NTBtcy4gVGhlIHBlci10aWNrIHdvcmsgaXMgYHdyaXRhYmxlLmxvY2tlZGAgcGx1cyBhXG4gKiBgZ2V0V3JpdGVyKClgL2ByZWxlYXNlTG9jaygpYCBwcm9iZSwgYm90aCBtaWNyb3NlY29uZC1zY2FsZTsgMTDDlyBtb3JlXG4gKiB0aWNrcyBkdXJpbmcgYSBzdHJlYW0ncyBsaWZldGltZSBpcyBub3QgbWVhc3VyYWJsZSBpbiBwcmFjdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9NUyA9IDEwO1xuXG4vKiogRWZmZWN0aXZlIGxvY2stcG9sbCBpbnRlcnZhbC4gT3ZlcnJpZGU6IGBXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVNgLiAqL1xuY29uc3QgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX0xPQ0tfUE9MTF9JTlRFUlZBTF9NUycsIExPQ0tfUE9MTF9JTlRFUlZBTF9NUywge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBTdGF0ZSB0cmFja2VyIGZvciBmbHVzaGFibGUgc3RyZWFtIG9wZXJhdGlvbnMuXG4gKiBSZXNvbHZlcyB3aGVuIGVpdGhlcjpcbiAqIDEuIFN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIExvY2sgaXMgcmVsZWFzZWQgQU5EIGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGZsdXNoZWRcbiAqXG4gKiBOb3RlOiBgZG9uZVJlc29sdmVkYCBhbmQgYHN0cmVhbUVuZGVkYCBhcmUgc2VwYXJhdGU6XG4gKiAtIGBkb25lUmVzb2x2ZWRgOiBUaGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKHN0ZXAgY2FuIGNvbXBsZXRlKVxuICogLSBgc3RyZWFtRW5kZWRgOiBUaGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkXG4gKlxuICogT25jZSBgZG9uZVJlc29sdmVkYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBkb25lYCBwcm9taXNlIHdpbGwgbm90IHJlc29sdmVcbiAqIGFnYWluLiBSZS1hY3F1aXJpbmcgbG9ja3MgYWZ0ZXIgcmVsZWFzZSBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgd2F5IHRvXG4gKiB0cmlnZ2VyIGFkZGl0aW9uYWwgY29tcGxldGlvbiBzaWduYWxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1c2hhYmxlU3RyZWFtU3RhdGUgZXh0ZW5kcyBQcm9taXNlV2l0aFJlc29sdmVyczx2b2lkPiB7XG4gIC8qKiBOdW1iZXIgb2Ygd3JpdGUgb3BlcmF0aW9ucyBjdXJyZW50bHkgaW4gZmxpZ2h0IHRvIHRoZSBzZXJ2ZXIgKi9cbiAgcGVuZGluZ09wczogbnVtYmVyO1xuICAvKiogRnJhbWVzIGVtaXR0ZWQgYnkgdGhpcyBwaXBlJ3MgcHJvZHVjZXIuICovXG4gIHByb2R1Y2VkRnJhbWVzOiBudW1iZXI7XG4gIC8qKiBQcm9kdWNlZCBmcmFtZXMgYWNjZXB0ZWQgYnkgdGhpcyBwaXBlJ3Mgc2luay4gKi9cbiAgYWNjZXB0ZWRGcmFtZXM6IG51bWJlcjtcbiAgLyoqIFRlcm1pbmFsIHBpcGUgZXJyb3IsIHJldGFpbmVkIGZvciBzbmFwc2hvdHMgcmVnaXN0ZXJlZCBhZnRlciBmYWlsdXJlLiAqL1xuICBwaXBlRXJyb3I/OiB1bmtub3duO1xuICAvKipcbiAgICogSWYgdGhlIHVzZXItZmFjaW5nIHdyaXRhYmxlIGlzIHVubG9ja2VkLCBlbnF1ZXVlIGFuIG9yZGVyZWQgY2hlY2twb2ludCBhbmRcbiAgICogZHVyYWJseSBkcmFpbiBldmVyeSB3cml0ZSBhaGVhZCBvZiBpdC4gUmV0dXJucyBmYWxzZSB3aGlsZSBhIHdyaXRlciByZW1haW5zXG4gICAqIGxvY2tlZCwgc28gbG9jay1oZWxkIHN0cmVhbXMgbmV2ZXIgYmxvY2sgc3RlcCBjb21wbGV0aW9uLlxuICAgKi9cbiAgc2V0dGxlUmVsZWFzZWRXcml0ZXM/OiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICAvKiogV2hldGhlciByZWxlYXNlIHNldHRsZW1lbnQgd2FpdHMgZm9yIGV4cGxpY2l0IHN0ZXAtZW5kIGFybWluZy4gKi9cbiAgZGVmZXJSZWxlYXNlU2V0dGxlbWVudD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHN0ZXAtZW5kIHByb2Nlc3NpbmcgaGFzIGFybWVkIHJlbGVhc2VkLXdyaXRlciBzZXR0bGVtZW50LiAqL1xuICByZWxlYXNlU2V0dGxlbWVudEFybWVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXItZmFjaW5nIHdyaXRhYmxlIGhhcyBiZWd1biBhIG5vcm1hbCBjbG9zZS4gKi9cbiAgdXNlcldyaXRhYmxlQ2xvc2luZz86IGJvb2xlYW47XG4gIC8qKiBTdGVwLWVuZCBzbmFwc2hvdCB3YWl0ZXJzIGJsb2NrZWQgdW50aWwgdGhlaXIgdGFyZ2V0IHJlYWNoZXMgdGhlIHNpbmsuICovXG4gIGZyYW1lV2FpdGVyczogQXJyYXk8e1xuICAgIHRhcmdldDogbnVtYmVyO1xuICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG4gIH0+O1xuICAvKiogV2hldGhlciB0aGUgYGRvbmVgIHByb21pc2UgaGFzIGJlZW4gcmVzb2x2ZWQgKi9cbiAgZG9uZVJlc29sdmVkOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdW5kZXJseWluZyBzdHJlYW0gaGFzIGFjdHVhbGx5IGNsb3NlZC9lcnJvcmVkICovXG4gIHN0cmVhbUVuZGVkOiBib29sZWFuO1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHdyaXRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICB3cml0YWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgLyoqIEludGVydmFsIElEIGZvciByZWFkYWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgcmVhZGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKlxuICAgKiBEdXJhYmlsaXR5IGJhcnJpZXIgb2YgdGhlIHBpcGUncyBzaW5rLCB3aGVuIGl0IGFja3Mgd3JpdGVzIG9uIGJ1ZmZlclxuICAgKiBlbnRyeSAoc2VlIHtAbGluayBTVFJFQU1fRFJBSU5fU1lNQk9MfSkuIExvY2stcmVsZWFzZSBjb21wbGV0aW9uIGF3YWl0c1xuICAgKiB0aGlzIGJlZm9yZSByZXNvbHZpbmcgc28gYHBlbmRpbmdPcHMgPT09IDBgIChmYXN0LCBidWZmZXJlZCBhY2tzKSBjYW4ndFxuICAgKiBjb21wbGV0ZSBhIHN0ZXAgd2hpbGUgZGF0YSBpcyBzdGlsbCBjbGllbnQtc2lkZS5cbiAgICovXG4gIGRyYWluQmFycmllcj86IERyYWluQmFycmllcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk6IEZsdXNoYWJsZVN0cmVhbVN0YXRlIHtcbiAgY29uc3Qgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlID0ge1xuICAgIC4uLndpdGhSZXNvbHZlcnM8dm9pZD4oKSxcbiAgICBwZW5kaW5nT3BzOiAwLFxuICAgIHByb2R1Y2VkRnJhbWVzOiAwLFxuICAgIGFjY2VwdGVkRnJhbWVzOiAwLFxuICAgIGZyYW1lV2FpdGVyczogW10sXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gVGhlIHJ1bnRpbWUgYXdhaXRzIHRoaXMgcHJvbWlzZSBhZnRlciB1c2VyIGNvZGUgcmV0dXJucy4gT2JzZXJ2ZSBlYXJseVxuICAvLyBzdHJlYW0gZmFpbHVyZXMgbm93IHNvIHRoZXkgZG8gbm90IGJlY29tZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyBmaXJzdC5cbiAgc3RhdGUucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFdyaXRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqIFdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLCAubG9ja2VkIGlzIGZhbHNlIGJ1dCBnZXRXcml0ZXIoKSB0aHJvd3MuXG4gKiBXZSBvbmx5IHdhbnQgdG8gcmVzb2x2ZSB2aWEgcG9sbGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgdW5sb2NrZWQsIG5vdCBjbG9zZWQuXG4gKiBJZiBjbG9zZWQsIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAod3JpdGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHdyaXRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0V3JpdGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgUmVhZGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmIChyZWFkYWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgcmVhZGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRSZWFkZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBTZXR0bGUgdGhlIGZsdXNoYWJsZSBjb21wbGV0aW9uIGFmdGVyIHRoZSBzaW5rJ3MgZHVyYWJpbGl0eSBiYXJyaWVyLlxuICpcbiAqIExvY2sgcmVsZWFzZSBtZWFucyB0aGUgcHJvZHVjZXIgaXMgZG9uZSAqd3JpdGluZyo7IHdpdGggYSBncm91cC1jb21taXRcbiAqIHNpbmssIGFjY2VwdGVkIGNodW5rcyBtYXkgc3RpbGwgYmUgY2xpZW50LWJ1ZmZlcmVkIG9yIGluIGEgcmVxdWVzdCB0aGF0IGlzXG4gKiBpbiBmbGlnaHQuIEF3YWl0aW5nIHRoZSBiYXJyaWVyIGhlcmUga2VlcHMgdGhlIGNvbXBsZXRpb24ncyBtZWFuaW5nXG4gKiAoXCJldmVyeXRoaW5nIHdyaXR0ZW4gc28gZmFyIGlzIGR1cmFibGVcIikgaWRlbnRpY2FsIHRvIHRoZSBwcmUtYmF0Y2hpbmdcbiAqIGJlaGF2aW9yIHdoZXJlIGVhY2ggd3JpdGUoKSB3YXMgaW5kaXZpZHVhbGx5IGR1cmFibGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBZnRlckRyYWluKHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSk6IHZvaWQge1xuICBjb25zdCBiYXJyaWVyID0gc3RhdGUuZHJhaW5CYXJyaWVyO1xuICBpZiAoIWJhcnJpZXIpIHtcbiAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJhcnJpZXIoKS50aGVuKFxuICAgICgpID0+IHN0YXRlLnJlc29sdmUoKSxcbiAgICAoZXJyKSA9PiBzdGF0ZS5yZWplY3QoZXJyKVxuICApO1xufVxuXG4vKiogUmVjb3JkIGEgZnJhbWUgc3luY2hyb25vdXNseSB3aGVuIGl0cyBwcm9kdWNlciBlbWl0cyBpdCBpbnRvIHRoaXMgcGlwZS4gKi9cbmZ1bmN0aW9uIG1hcmtGbHVzaGFibGVGcmFtZVByb2R1Y2VkKHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSk6IHZvaWQge1xuICBzdGF0ZS5wcm9kdWNlZEZyYW1lcysrO1xufVxuXG4vKipcbiAqIENhcHR1cmUgYSBzdGVwLWVuZCBwcm9kdWNlciB3YXRlcm1hcmssIHdhaXQgdW50aWwgdGhlIHBpcGUgaGFzIGhhbmRlZCBldmVyeVxuICogZnJhbWUgdGhyb3VnaCB0aGF0IHdhdGVybWFyayB0byBpdHMgc2luaywgdGhlbiBhd2FpdCB0aGUgc2luaydzIGR1cmFiaWxpdHlcbiAqIGJhcnJpZXIuIFVubGlrZSB7QGxpbmsgRmx1c2hhYmxlU3RyZWFtU3RhdGUucHJvbWlzZX0sIHRoaXMgbmV2ZXIgd2FpdHMgZm9yIGFcbiAqIHVzZXIgd3JpdGVyIGxvY2sgdG8gYmUgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkcmFpbkZsdXNoYWJsZVNuYXBzaG90KFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkcmFpbkJlZm9yZVRocm93ID0gYXN5bmMgKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxuZXZlcj4gPT4ge1xuICAgIC8vIEEgbGF0ZXIgZnJhbWUgY2FuIGZhaWwgYWZ0ZXIgYW4gZWFybGllciBmcmFtZSB3YXMgZWFybHktYWNrZWQgYnkgdGhlXG4gICAgLy8gZ3JvdXAtY29tbWl0IHNpbmsuIEtlZXAgdGhlIGVhcmxpZXIgYWNjZXB0ZWQgcHJlZml4IGR1cmFibGUgYmVmb3JlXG4gICAgLy8gc3VyZmFjaW5nIHRoZSBwcm9kdWNlciBlcnJvciwgbWF0Y2hpbmcgZmx1c2hhYmxlUGlwZSdzIGZhaWx1cmUgcGF0aC5cbiAgICBhd2FpdCBzdGF0ZS5kcmFpbkJhcnJpZXI/LigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfTtcblxuICBjb25zdCB0YXJnZXQgPSBzdGF0ZS5wcm9kdWNlZEZyYW1lcztcbiAgaWYgKHN0YXRlLmFjY2VwdGVkRnJhbWVzIDwgdGFyZ2V0KSB7XG4gICAgaWYgKHN0YXRlLnBpcGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZHJhaW5CZWZvcmVUaHJvdyhzdGF0ZS5waXBlRXJyb3IpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzdGF0ZS5mcmFtZVdhaXRlcnMucHVzaCh7IHRhcmdldCwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBkcmFpbkJlZm9yZVRocm93KGVycm9yKTtcbiAgICB9XG4gIH1cbiAgaWYgKHN0YXRlLnBpcGVFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRyYWluQmVmb3JlVGhyb3coc3RhdGUucGlwZUVycm9yKTtcbiAgfVxuICBhd2FpdCBzdGF0ZS5kcmFpbkJhcnJpZXI/LigpO1xufVxuXG4vKipcbiAqIE1hcmsgYnl0ZS1zdHJlYW0gY2h1bmtzIGF0IHRoZSBwcm9kdWNlciBzaWRlIG9mIGEgZmx1c2hhYmxlIHBpcGUuIFNlcmlhbGl6ZWRcbiAqIHN0cmVhbXMgc2hvdWxkIGluc3RlYWQgdXNlIGBnZXRTZXJpYWxpemVTdHJlYW1gJ3Mgc3luY2hyb25vdXMgb3V0cHV0IGhvb2suXG4gKi9cbi8qKlxuICogV3JhcCB0aGUgdXNlci1mYWNpbmcgcHJvZHVjZXIgYm91bmRhcnkgb2YgYSBmbHVzaGFibGUgd3JpdGFibGUuIEEgY29tcGxldGVkXG4gKiB3cml0ZSB0aHJvdWdoIHRoaXMgaGFuZGxlIGhhcyBhIHNlcXVlbmNlIG51bWJlciBiZWZvcmUgc3RlcC1lbmQgc25hcHNob3RzLFxuICogd2hpbGUgdGhlIG9yaWdpbmFsIHdyaXRhYmxlIHJlbWFpbnMgdGhlIGlucHV0IHRvIHRoZSBzZXJpYWxpemF0aW9uIHBpcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja0ZsdXNoYWJsZVdyaXRhYmxlPFQ+KFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW08VD4sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZSxcbiAgV3JpdGFibGVTdHJlYW1Db25zdHJ1Y3RvcjogdHlwZW9mIFdyaXRhYmxlU3RyZWFtID0gV3JpdGFibGVTdHJlYW1cbik6IFdyaXRhYmxlU3RyZWFtPFQ+IHtcbiAgY29uc3QgdGFyZ2V0V3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gIGNvbnN0IGNoZWNrcG9pbnQgPSBTeW1ib2woJ3dvcmtmbG93LXN0cmVhbS1yZWxlYXNlLWNoZWNrcG9pbnQnKTtcbiAgbGV0IHRyYWNrZWRDb250cm9sbGVyOiBXcml0YWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuICBjb25zdCB0cmFja2VkID0gbmV3IFdyaXRhYmxlU3RyZWFtQ29uc3RydWN0b3Ioe1xuICAgIHN0YXJ0KGNvbnRyb2xsZXIpIHtcbiAgICAgIHRyYWNrZWRDb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlKGNodW5rKSB7XG4gICAgICBpZiAoY2h1bmsgPT09IGNoZWNrcG9pbnQpIHJldHVybjtcbiAgICAgIG1hcmtGbHVzaGFibGVGcmFtZVByb2R1Y2VkKHN0YXRlKTtcbiAgICAgIGF3YWl0IHRhcmdldFdyaXRlci53cml0ZShjaHVuayk7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIHN0YXRlLnVzZXJXcml0YWJsZUNsb3NpbmcgPSB0cnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0V3JpdGVyLmNsb3NlKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0YXJnZXRXcml0ZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGFib3J0KHJlYXNvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGFyZ2V0V3JpdGVyLmFib3J0KHJlYXNvbik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0YXJnZXRXcml0ZXIucmVsZWFzZUxvY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KSBhcyBXcml0YWJsZVN0cmVhbTxUPjtcblxuICAvLyBBIGRvd25zdHJlYW0gc2luayBjYW4gZmFpbCBhZnRlciBpdHMgZWFybHktYWNrbm93bGVkZ2VkIHdyaXRlIGhhcyBhbHJlYWR5XG4gIC8vIHJlc29sdmVkLiBGb3J3YXJkIHRoYXQgdGVybWluYWwgZXJyb3IgaW50byB0aGUgcHVibGljIHdyaXRhYmxlIGV2ZW4gd2hpbGVcbiAgLy8gaXRzIHByb2R1Y2VyIGlzIGlkbGUsIHNvIG5hdGl2ZSBwaXBlVG8oKSByZWplY3RzIGFuZCBjYW5jZWxzIGl0cyBzb3VyY2UuXG4gIHRhcmdldFdyaXRlci5jbG9zZWQuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgdHJhY2tlZENvbnRyb2xsZXIuZXJyb3IoZXJyb3IpO1xuICB9KTtcblxuICBsZXQgc2V0dGxlbWVudDogUHJvbWlzZTxib29sZWFuPiB8IHVuZGVmaW5lZDtcbiAgc3RhdGUuc2V0dGxlUmVsZWFzZWRXcml0ZXMgPSAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgc3RhdGUucmVsZWFzZVNldHRsZW1lbnRBcm1lZCA9IHRydWU7XG4gICAgaWYgKHNldHRsZW1lbnQpIHJldHVybiBzZXR0bGVtZW50O1xuICAgIGlmICh0cmFja2VkLmxvY2tlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgaWYgKHN0YXRlLnVzZXJXcml0YWJsZUNsb3NpbmcpIHtcbiAgICAgIHNldHRsZW1lbnQgPSBzdGF0ZS5wcm9taXNlLnRoZW4oKCkgPT4gdHJ1ZSk7XG4gICAgICByZXR1cm4gc2V0dGxlbWVudDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2twb2ludFdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyPFQ+O1xuICAgIHRyeSB7XG4gICAgICBjaGVja3BvaW50V3JpdGVyID0gdHJhY2tlZC5nZXRXcml0ZXIoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENsb3NlZC9lcnJvcmVkIHN0cmVhbXMgc2V0dGxlIHRocm91Z2ggdGhlIHBpcGUncyBub3JtYWwgY29tcGxldGlvbi5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIH1cblxuICAgIHNldHRsZW1lbnQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTmF0aXZlIHdyaXRhYmxlIG9yZGVyaW5nIHB1dHMgdGhpcyBiZWhpbmQgd3JpdGVzIHF1ZXVlZCBieSB0aGVcbiAgICAgICAgLy8gcmVsZWFzZWQgd3JpdGVyLCBpbmNsdWRpbmcgd3JpdGUgcHJvbWlzZXMgaXQgZGlkIG5vdCBhd2FpdC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjaGVja3BvaW50V3JpdGVyLndyaXRlKGNoZWNrcG9pbnQgYXMgVCk7XG4gICAgICAgIH0gY2F0Y2ggKGNoZWNrcG9pbnRFcnJvcikge1xuICAgICAgICAgIC8vIEEgY2xvc2UgY2FuIG1vdmUgZnJvbSByZXF1ZXN0ZWQgdG8gdGVybWluYWwgYmV0d2VlbiBnZXRXcml0ZXIoKVxuICAgICAgICAgIC8vIGFuZCB3cml0ZSgpLiBJdHMgbm9ybWFsIHBpcGUgY29tcGxldGlvbiBhbHJlYWR5IGRyYWlucyB0aGUgc2luaztcbiAgICAgICAgICAvLyBhbiBlcnJvcmVkIHBpcGUgcmVqZWN0cyBoZXJlIHdpdGggaXRzIGFjdHVhbCBmYWlsdXJlIGluc3RlYWQuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHN0YXRlLnByb21pc2U7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChwaXBlRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IHBpcGVFcnJvciA/PyBjaGVja3BvaW50RXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGRyYWluRmx1c2hhYmxlU25hcHNob3Qoc3RhdGUpO1xuICAgICAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjaGVja3BvaW50V3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgICByZXR1cm4gc2V0dGxlbWVudDtcbiAgfTtcblxuICByZXR1cm4gdHJhY2tlZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFdyaXRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxXcml0YWJsZUxvY2soXG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5zZXR0bGVSZWxlYXNlZFdyaXRlcykge1xuICAgICAgaWYgKFxuICAgICAgICAoIXN0YXRlLmRlZmVyUmVsZWFzZVNldHRsZW1lbnQgfHwgc3RhdGUucmVsZWFzZVNldHRsZW1lbnRBcm1lZCkgJiZcbiAgICAgICAgIXdyaXRhYmxlLmxvY2tlZFxuICAgICAgKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgICB2b2lkIHN0YXRlLnNldHRsZVJlbGVhc2VkV3JpdGVzKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIEZhaWx1cmUgaXMgc3VyZmFjZWQgdGhyb3VnaCBzdGF0ZS5wcm9taXNlLlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmVzb2x2ZUFmdGVyRHJhaW4oc3RhdGUpO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFJlYWRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxSZWFkYWJsZUxvY2soXG4gIHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXNvbHZlQWZ0ZXJEcmFpbihzdGF0ZSk7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBCYXRjaGluZyBsaXZlcyBpbiB0aGUgc2luayAoYFdvcmtmbG93U2VydmVyV3JpdGFibGVTdHJlYW1gIGdyb3VwLWNvbW1pdHNcbiAgLy8gaXRzIGJ1ZmZlciksIHNvIHRoaXMgcGlwZSBpcyBhIHBsYWluIHBlci1jaHVuayBwdW1wIHJlZ2FyZGxlc3Mgb2YgcGF0aDpcbiAgLy8gaXRzIG9ubHkgcmVzcG9uc2liaWxpdGllcyBhcmUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gYW5kIGR1cmFiaWxpdHlcbiAgLy8gdHJhY2tpbmcuIEdyb3VwLWNvbW1pdCBzaW5rcyBhY2sgd3JpdGUoKSBvbiBidWZmZXIgZW50cnk7IGFkb3B0IHRoZWlyXG4gIC8vIGR1cmFiaWxpdHkgYmFycmllciBzbyB0aGUgbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gc3RpbGwgbWVhbnNcbiAgLy8gXCJldmVyeXRoaW5nIHdyaXR0ZW4gaXMgZHVyYWJsZVwiIChzZWUgcmVzb2x2ZUFmdGVyRHJhaW4pLlxuICBjb25zdCBkcmFpbiA9IChzaW5rIGFzIHsgW1NUUkVBTV9EUkFJTl9TWU1CT0xdPzogRHJhaW5CYXJyaWVyIH0pW1xuICAgIFNUUkVBTV9EUkFJTl9TWU1CT0xcbiAgXTtcbiAgaWYgKHR5cGVvZiBkcmFpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHN0YXRlLmRyYWluQmFycmllciA9IGRyYWluO1xuICB9XG4gIHJldHVybiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoc291cmNlLCBzaW5rLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogVGhlIHB1bXAgYmVoaW5kIHtAbGluayBmbHVzaGFibGVQaXBlfTogYXdhaXRzIGVhY2ggYHdyaXRlci53cml0ZSgpYCBiZWZvcmVcbiAqIHJlYWRpbmcgdGhlIG5leHQgY2h1bmsuIEFnYWluc3QgYSBncm91cC1jb21taXQgc2luaywgd3JpdGUoKSBhY2tzIG9uIGJ1ZmZlclxuICogZW50cnksIHNvIHRoaXMgbG9vcCBmZWVkcyB0aGUgc2luayBhcyBmYXN0IGFzIHRoZSBwcm9kdWNlciBlbWl0cyAoYm91bmRlZFxuICogYnkgdGhlIHNpbmsncyBidWZmZXIgYm91bmQpIGFuZCBiYXRjaGluZyBoYXBwZW5zIGluc2lkZSB0aGUgc2luazsgYWdhaW5zdCBhXG4gKiBwbGFpbiBzaW5rIGVhY2ggd3JpdGUgaXMgaW5kaXZpZHVhbGx5IGR1cmFibGUsIGFzIGJlZm9yZS4gVGhlIHNvdXJjZS1kb25lXG4gKiBwYXRoIGNsb3NlcyB0aGUgc2luaywgd2hpY2ggZHJhaW5zIGl0LCBzbyBjb21wbGV0aW9uIGFsd2F5cyBpbXBsaWVzXG4gKiBkdXJhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmbHVzaGFibGVQaXBlUGVyQ2h1bmsoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHRoZSBzb3VyY2UuIERvbid0IGNvdW50IHRoaXMgYXMgYSBwZW5kaW5nIG9wZXJhdGlvbiBiZWNhdXNlXG4gICAgICAvLyByZWFkcyB3YWl0IGZvciBkYXRhLiBUaGUgaW1wb3J0YW50IG9wZXJhdGlvbnMgYXJlIHdyaXRlcyB0byB0aGUgc2luay5cbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHN0YXRlLmFjY2VwdGVkRnJhbWVzKys7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0gc3RhdGUuZnJhbWVXYWl0ZXJzLmZpbHRlcihcbiAgICAgICAgICAod2FpdGVyKSA9PiB3YWl0ZXIudGFyZ2V0IDw9IHN0YXRlLmFjY2VwdGVkRnJhbWVzXG4gICAgICAgICk7XG4gICAgICAgIHN0YXRlLmZyYW1lV2FpdGVycyA9IHN0YXRlLmZyYW1lV2FpdGVycy5maWx0ZXIoXG4gICAgICAgICAgKHdhaXRlcikgPT4gd2FpdGVyLnRhcmdldCA+IHN0YXRlLmFjY2VwdGVkRnJhbWVzXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3Qgd2FpdGVyIG9mIHJlYWR5KSB3YWl0ZXIucmVzb2x2ZSgpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUucGVuZGluZ09wcy0tO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgIHN0YXRlLnBpcGVFcnJvciA9IGVycjtcbiAgICBjYW5jZWxSZWFzb24gPSBlcnI7XG4gICAgY29uc3QgZnJhbWVXYWl0ZXJzID0gc3RhdGUuZnJhbWVXYWl0ZXJzO1xuICAgIHN0YXRlLmZyYW1lV2FpdGVycyA9IFtdO1xuICAgIGZvciAoY29uc3Qgd2FpdGVyIG9mIGZyYW1lV2FpdGVycykgd2FpdGVyLnJlamVjdChlcnIpO1xuICAgIC8vIEFnYWluc3QgYW4gZWFybHktYWNrIHNpbmssIGNodW5rcyBjYW4gc3RpbGwgYmUgYnVmZmVyZWQgb3IgaW4gZmxpZ2h0XG4gICAgLy8gd2hlbiB0aGUgcGlwZSBmYWlscyAocGVuZGluZ09wcyBvbmx5IGNvdW50cyB1bi1hY2tlZCB3cml0ZXMpLiBEZWxpdmVyXG4gICAgLy8gdGhhdCBhY2NlcHRlZCBwcmVmaXggYmVmb3JlIHNldHRsaW5nIHRoZSBmYWlsdXJlOiBvbmNlIHRoZSBzdGF0ZVxuICAgIC8vIHJlamVjdHMsIHRoZSBzdGVwIG1heSBwZXJzaXN0IGl0cyBmYWlsdXJlIGFuZCB0aGUgaW52b2NhdGlvbiBmaW5pc2gsXG4gICAgLy8gYW5kIGFueXRoaW5nIHN0aWxsIGNsaWVudC1zaWRlIHdvdWxkIGJlIGxvc3QuIFRoZSBvcmlnaW5hbCBwaXBlIGVycm9yXG4gICAgLy8gc3RheXMgcHJpbWFyeSwgc2luY2UgYSBkcmFpbiBmYWlsdXJlIGlzIGFscmVhZHkgc3RpY2t5IG9uIHRoZSBzaW5rLlxuICAgIGlmIChzdGF0ZS5kcmFpbkJhcnJpZXIpIHtcbiAgICAgIGF3YWl0IHN0YXRlLmRyYWluQmFycmllcigpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gICAgLy8gUHJvcGFnYXRlIGVycm9yIHRocm91Z2ggZmx1c2hhYmxlUGlwZSdzIG93biBwcm9taXNlIGFzIHdlbGwuXG4gICAgLy8gQ2FsbGVycyB0aGF0IHJlbHkgb24gdGhlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIHNob3VsZCB1c2UgYHN0YXRlLnByb21pc2VgLFxuICAgIC8vIHdoaWxlIG90aGVyIGNhbGxlcnMgbWF5IGRlcGVuZCBvbiB0aGlzIHJlamVjdGlvbi4gU29tZSBrbm93biBjYWxsZXJzXG4gICAgLy8gZXhwbGljaXRseSBpZ25vcmUgdGhpcyByZWplY3Rpb24gKGAuY2F0Y2goKCkgPT4ge30pYCkgYW5kIHJlbHkgc29sZWx5XG4gICAgLy8gb24gYHN0YXRlLnJlamVjdChlcnIpYCBmb3IgZXJyb3IgaGFuZGxpbmcuXG4gICAgdGhyb3cgZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENhbmNlbCB0aGUgdXBzdHJlYW0gcmVhZGVyIHNvIHRoZSBzb3VyY2Uga25vd3MgdG8gc3RvcCBnZW5lcmF0aW5nIGRhdGEuXG4gICAgLy8gVXNlcyBjYW5jZWxSZWFzb24gKHNldCBpbiB0aGUgY2F0Y2ggYmxvY2spIHNvIHRoZSBzb3VyY2UgcmVjZWl2ZXMgY29udGV4dFxuICAgIC8vIGFib3V0IHdoeSBpdCB3YXMgY2FuY2VsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
@@ -26,7 +26,7 @@ import { formatStepName, formatWorkflowName, parseStepName, parseWorkflowName, }
26
26
  export function composeLogLine(prefix, message, metadata) {
27
27
  const [framing, ...rest] = message.split('\n');
28
28
  const body = rest.join('\n');
29
- const fields = renderStructuredFields(framing ?? '', metadata);
29
+ const fields = renderStructuredFields(framing ?? '', body, metadata);
30
30
  const trimmedBody = trimStackBody(body);
31
31
  const lines = [`${prefix} ${framing ?? ''}`];
32
32
  if (fields)
@@ -35,16 +35,20 @@ export function composeLogLine(prefix, message, metadata) {
35
35
  lines.push(trimmedBody);
36
36
  return lines.join('\n');
37
37
  }
38
- function renderStructuredFields(framing, metadata) {
38
+ function renderStructuredFields(framing, body, metadata) {
39
39
  if (!metadata || Object.keys(metadata).length === 0)
40
40
  return null;
41
41
  // Drop fields that the message already encodes. We render framings and
42
42
  // stacks into the message string itself in step executor / combined runtime, so
43
- // repeating them here would be pure noise.
43
+ // repeating them here would be pure noise. A message with neither (a WARN
44
+ // whose framing is a fixed sentence and whose `errorMessage` is the only
45
+ // place the underlying error's text appears) keeps `errorMessage` and
46
+ // renders it as its own row below.
44
47
  const redundant = new Set();
45
48
  redundant.add('errorStack');
46
- if (typeof metadata.errorMessage === 'string' &&
47
- framing.includes(metadata.errorMessage)) {
49
+ const errorMessage = pickString(metadata, 'errorMessage');
50
+ if (errorMessage &&
51
+ (framing.includes(errorMessage) || body.includes(errorMessage))) {
48
52
  redundant.add('errorMessage');
49
53
  }
50
54
  const wellKnown = new Set([
@@ -107,6 +111,9 @@ function renderStructuredFields(framing, metadata) {
107
111
  if (errorCode && errorCode !== errorName) {
108
112
  lines.push(` ${kvKey('code')} ${Ansi.dim(errorCode)}`);
109
113
  }
114
+ if (errorMessage && !redundant.has('errorMessage')) {
115
+ lines.push(` ${kvKey('error')} ${formatPassthroughValue(errorMessage)}`);
116
+ }
110
117
  const hint = pickString(metadata, 'hint');
111
118
  if (hint) {
112
119
  lines.push(` ${Ansi.hint(hint)}`);
@@ -247,4 +254,4 @@ function formatPassthroughValue(v) {
247
254
  return String(v);
248
255
  }
249
256
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2ctZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBYyxFQUNkLE9BQWUsRUFDZixRQUE2QztJQUU3QyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXhDLE1BQU0sS0FBSyxHQUFhLENBQUMsR0FBRyxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixJQUFJLFdBQVc7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsT0FBZSxFQUNmLFFBQTZDO0lBRTdDLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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QUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckIsT0FBTyxDQUFDO2lCQUNMLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQ1gsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxTQUFTO1FBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFuc2kgZnJvbSAnQHdvcmtmbG93L2Vycm9ycy9hbnNpJztcbmltcG9ydCB7XG4gIGZvcm1hdFN0ZXBOYW1lLFxuICBmb3JtYXRXb3JrZmxvd05hbWUsXG4gIHBhcnNlU3RlcE5hbWUsXG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuXG4vKipcbiAqIFN0cnVjdHVyZWQtbG9nIGNvbXBvc2l0aW9uIGZvciBgY29uc29sZS5lcnJvcmAgLyBgY29uc29sZS53YXJuYC4gRW1pdHNcbiAqIG9uZSBzdHJpbmcgaW4gdGhyZWUgc2VjdGlvbnMgc28gdGhlIG1vc3QgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGF0IHRoZVxuICogdG9wLCBzdGFjayB0cmFjZSBhdCB0aGUgYm90dG9tOlxuICpcbiAqICAgICBbd29ya2Zsb3ctc2RrXSA8ZnJhbWluZyBsaW5lPlxuICogICAgICAgdXNlciBlcnJvciDCtyBGYXRhbEVycm9yXG4gKiAgICAgICBydW4gICAgd3J1bl/igKZcbiAqICAgICAgIHN0ZXAgICBzdGVwX+KApiDCtyBhZGQgKC4vd29ya2Zsb3dzL3gpXG4gKiAgICAgICBoaW50OiAgTW92ZSB0aGUgY2FsbCB0byBhIHN0ZXAgZnVuY3Rpb24uXG4gKiAgICAgRmF0YWxFcnJvcjog4oCmXG4gKiAgICAgICAgIGF0IOKApiAodHJpbW1lZCBzdGFjaywgaW50ZXJuYWxzIGNvbGxhcHNlZClcbiAqXG4gKiBXaXRob3V0IHRoaXMgY29tcG9zaXRpb24sIGNhbGxlcnMgcGFzc2luZyBgJHtmcmFtaW5nfVxcbiR7c3RhY2t9YCBhcyB0aGVcbiAqIG1lc3NhZ2UgYW5kIHN0cnVjdHVyZWQgZmllbGRzIGFzIHRoZSBtZXRhZGF0YSBvYmplY3QgZ290IGB1dGlsLmluc3BlY3RgJ3NcbiAqIGRlZmF1bHQgb2JqZWN0IGR1bXAgYXBwZW5kZWQgKmFmdGVyKiB0aGUgc3RhY2ssIHdoaWNoIGJ1cmllcyB0aGUgcnVuIElEXG4gKiBhbmQgYXR0cmlidXRpb24gYmFkZ2UgdW5kZXIgMzArIGxpbmVzIG9mIGBub2RlX21vZHVsZXMvLnBucG0vLi4uYCBmcmFtZXMuXG4gKlxuICogVGhlIHNhbWUgbWV0YWRhdGEgaXMgYWxzbyBlbWl0dGVkIGFzIHN0cnVjdHVyZWQgT1RlbCBzcGFuIGV2ZW50cyBmcm9tXG4gKiB0aGUgbG9nZ2VyIGl0c2VsZiwgc28gYmFja2VuZHMgdGhhdCB3YW50IEpTT04tc2hhcGVkIGRhdGEgc3RpbGwgZ2V0IGl0LlxuICogd2ViL3dlYi1zaGFyZWQgZG8gbm90IGNvbnN1bWUgc3RkZXJyIGF0IGFsbDogdGhleSByZWFkIENCT1IvSlNPTiBldmVudFxuICogcGF5bG9hZHMgZnJvbSB0aGUgV29ybGQgZXZlbnQgbG9nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUxvZ0xpbmUoXG4gIHByZWZpeDogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHtcbiAgY29uc3QgW2ZyYW1pbmcsIC4uLnJlc3RdID0gbWVzc2FnZS5zcGxpdCgnXFxuJyk7XG4gIGNvbnN0IGJvZHkgPSByZXN0LmpvaW4oJ1xcbicpO1xuICBjb25zdCBmaWVsZHMgPSByZW5kZXJTdHJ1Y3R1cmVkRmllbGRzKGZyYW1pbmcgPz8gJycsIG1ldGFkYXRhKTtcbiAgY29uc3QgdHJpbW1lZEJvZHkgPSB0cmltU3RhY2tCb2R5KGJvZHkpO1xuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgJHtwcmVmaXh9ICR7ZnJhbWluZyA/PyAnJ31gXTtcbiAgaWYgKGZpZWxkcykgbGluZXMucHVzaChmaWVsZHMpO1xuICBpZiAodHJpbW1lZEJvZHkpIGxpbmVzLnB1c2godHJpbW1lZEJvZHkpO1xuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclN0cnVjdHVyZWRGaWVsZHMoXG4gIGZyYW1pbmc6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCBPYmplY3Qua2V5cyhtZXRhZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAvLyBEcm9wIGZpZWxkcyB0aGF0IHRoZSBtZXNzYWdlIGFscmVhZHkgZW5jb2Rlcy4gV2UgcmVuZGVyIGZyYW1pbmdzIGFuZFxuICAvLyBzdGFja3MgaW50byB0aGUgbWVzc2FnZSBzdHJpbmcgaXRzZWxmIGluIHN0ZXAgZXhlY3V0b3IgLyBjb21iaW5lZCBydW50aW1lLCBzb1xuICAvLyByZXBlYXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHB1cmUgbm9pc2UuXG4gIGNvbnN0IHJlZHVuZGFudCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZWR1bmRhbnQuYWRkKCdlcnJvclN0YWNrJyk7XG4gIGlmIChcbiAgICB0eXBlb2YgbWV0YWRhdGEuZXJyb3JNZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgIGZyYW1pbmcuaW5jbHVkZXMobWV0YWRhdGEuZXJyb3JNZXNzYWdlIGFzIHN0cmluZylcbiAgKSB7XG4gICAgcmVkdW5kYW50LmFkZCgnZXJyb3JNZXNzYWdlJyk7XG4gIH1cblxuICBjb25zdCB3ZWxsS25vd24gPSBuZXcgU2V0KFtcbiAgICAnd29ya2Zsb3dSdW5JZCcsXG4gICAgJ3dvcmtmbG93TmFtZScsXG4gICAgJ3N0ZXBJZCcsXG4gICAgJ3N0ZXBOYW1lJyxcbiAgICAnZXJyb3JBdHRyaWJ1dGlvbicsXG4gICAgJ2Vycm9yQ29kZScsXG4gICAgJ2Vycm9yTmFtZScsXG4gICAgJ2Vycm9yTWVzc2FnZScsXG4gICAgJ2Vycm9yU3RhY2snLFxuICAgICdoaW50JyxcbiAgICAnYXR0ZW1wdCcsXG4gICAgJ3JldHJ5Q291bnQnLFxuICBdKTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBIZWFkZXI6IGVycm9yIGNsYXNzICsgYXR0cmlidXRpb24gYmFkZ2UuXG4gIGNvbnN0IGVycm9yTmFtZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdlcnJvck5hbWUnKTtcbiAgY29uc3QgYXR0cmlidXRpb24gPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnZXJyb3JBdHRyaWJ1dGlvbicpO1xuICBpZiAoZXJyb3JOYW1lIHx8IGF0dHJpYnV0aW9uKSB7XG4gICAgY29uc3QgYmFkZ2UgPSBhdHRyaWJ1dGlvblxuICAgICAgPyBhdHRyaWJ1dGlvbiA9PT0gJ3NkaydcbiAgICAgICAgPyBBbnNpLm1hZ2VudGEoJ3NkayBlcnJvcicpXG4gICAgICAgIDogQW5zaS5yZWQoJ3VzZXIgZXJyb3InKVxuICAgICAgOiAnJztcbiAgICBjb25zdCBjbHMgPSBlcnJvck5hbWUgPyBBbnNpLmJvbGQoZXJyb3JOYW1lKSA6ICcnO1xuICAgIGNvbnN0IHNlcCA9IGJhZGdlICYmIGNscyA/IEFuc2kuZGltKCcgwrcgJykgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAgICR7YmFkZ2V9JHtzZXB9JHtjbHN9YCk7XG4gIH1cblxuICAvLyBJRCArIHBhcnNlZCBmcmllbmRseS1uYW1lIHJvd3MuXG4gIGNvbnN0IHJ1bklkID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3dvcmtmbG93UnVuSWQnKTtcbiAgY29uc3Qgd2ZOYW1lID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3dvcmtmbG93TmFtZScpO1xuICBpZiAocnVuSWQpIHtcbiAgICBsaW5lcy5wdXNoKGZvcm1hdElkUm93KCdydW4nLCBydW5JZCwgd2ZOYW1lLCBmb3JtYXRXb3JrZmxvd05hbWUpKTtcbiAgfSBlbHNlIGlmICh3Zk5hbWUpIHtcbiAgICBsaW5lcy5wdXNoKGZvcm1hdElkUm93KCdydW4nLCBudWxsLCB3Zk5hbWUsIGZvcm1hdFdvcmtmbG93TmFtZSkpO1xuICB9XG5cbiAgY29uc3Qgc3RlcElkID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ3N0ZXBJZCcpO1xuICBjb25zdCBzdGVwTmFtZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdzdGVwTmFtZScpO1xuICBpZiAoc3RlcElkIHx8IHN0ZXBOYW1lKSB7XG4gICAgbGluZXMucHVzaChmb3JtYXRJZFJvdygnc3RlcCcsIHN0ZXBJZCwgc3RlcE5hbWUsIGZvcm1hdFN0ZXBOYW1lKSk7XG4gIH1cblxuICBpZiAobWV0YWRhdGEuYXR0ZW1wdCAhPT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnJldHJ5Q291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGBhdHRlbXB0YCBhbmQgYHJldHJ5Q291bnRgIHJlYWQgYW1iaWd1b3VzbHkgbmV4dCB0byBlYWNoIG90aGVyIChpc1xuICAgIC8vIFwiMyByZXRyaWVzXCIgdGhlIGxpbWl0IG9yIHdoYXQgYWxyZWFkeSBoYXBwZW5lZD8pLiBSZW5kZXIgdGhlIGxpbWl0XG4gICAgLy8gYXMgXCJtYXggcmV0cmllc1wiIHRvIG1ha2UgdGhlIGJvdW5kYXJ5IGV4cGxpY2l0LCBhbmQga2VlcCBgYXR0ZW1wdGBcbiAgICAvLyBhcyB0aGUgY291bnQgb2YgdG90YWwgaW52b2NhdGlvbnMgaW5jbHVkaW5nIHRoZSBvcmlnaW5hbC5cbiAgICBjb25zdCBhID0gbWV0YWRhdGEuYXR0ZW1wdDtcbiAgICBjb25zdCByID0gbWV0YWRhdGEucmV0cnlDb3VudDtcbiAgICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIHIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYCAgJHtrdktleSgncmV0cnknKX0gJHthfSAke0Fuc2kuZGltKCdhdHRlbXB0cyDCtycpfSAke3J9ICR7QW5zaS5kaW0oJ21heCByZXRyaWVzJyl9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGluZXMucHVzaChgICAke2t2S2V5KCdyZXRyeScpfSAke2F9ICR7QW5zaS5kaW0oJ2F0dGVtcHRzJyl9YCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXJyb3JDb2RlID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2Vycm9yQ29kZScpO1xuICBpZiAoZXJyb3JDb2RlICYmIGVycm9yQ29kZSAhPT0gZXJyb3JOYW1lKSB7XG4gICAgbGluZXMucHVzaChgICAke2t2S2V5KCdjb2RlJyl9ICR7QW5zaS5kaW0oZXJyb3JDb2RlKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGhpbnQgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnaGludCcpO1xuICBpZiAoaGludCkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtBbnNpLmhpbnQoaGludCl9YCk7XG4gIH1cblxuICAvLyBTb3J0ZWQgcGFzcy10aHJvdWdoIGZvciB1bmtub3duIGZpZWxkcy5cbiAgY29uc3QgcGFzc1Rocm91Z2ggPSBPYmplY3QuZW50cmllcyhtZXRhZGF0YSlcbiAgICAuZmlsdGVyKFxuICAgICAgKFtrLCB2XSkgPT5cbiAgICAgICAgIXdlbGxLbm93bi5oYXMoaykgJiYgIXJlZHVuZGFudC5oYXMoaykgJiYgdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbiAgICApXG4gICAgLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBwYXNzVGhyb3VnaCkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtrdktleShrKX0gJHtmb3JtYXRQYXNzdGhyb3VnaFZhbHVlKHYpfWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmxlbmd0aCA/IGxpbmVzLmpvaW4oJ1xcbicpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBTdHJpcCB0aGUgc3RhY2sgZG93biB0byBmcmFtZXMgdGhlIHVzZXIgY2FuIGFjdCBvbi4gVjggc3RhY2tzIGZvciBvdXJcbiAqIHJ1bnRpbWUgZXJyb3JzIGxvb2sgbGlrZTpcbiAqXG4gKiAgICAgTmFtZTogbWVzc2FnZVxuICogICAgICAgICBhdCB1c2VyU3RlcCAoLi93b3JrZmxvd3MvZm9vLnRzOjEyOjExKVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3J1bnRpbWUvc3RlcC1leGVjdXRvci50czo1MzU6MzIpXG4gKiAgICAgICAgIGF0IDx1bmtub3duPiAoLi4uL25vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QOKApi/igKYvYmFzZS1zZXJ2ZXIuanM6MTQ1NDo5KVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLi9ub2RlX21vZHVsZXMvLnBucG0vQG9wZW50ZWxlbWV0cnkrYXBpQOKApi/igKYvYXBpLmpzOjU0NDApXG4gKiAgICAgICAgIGF0IOKApiAoMTUgbW9yZSBmcmFtZXMgaW50byBOZXh0LmpzIC8gcG5wbSBpbnRlcm5hbHMpXG4gKlxuICogVHdvLXBhc3MgdHJpbTpcbiAqXG4gKiAgIDEuIERyb3AgZnJhbWV3b3JrLWludGVybmFsIGZyYW1lcyAoYG5vZGVfbW9kdWxlcy8ucG5wbS9gLCBgbm9kZTppbnRlcm5hbC9gLFxuICogICAgICBUdXJib3BhY2stYnVuZGxlZCBgbm9kZV9tb2R1bGVzX19wbnBtXypgIC8gYF9uZXh0X2Rpc3RfKmAgY2h1bmtzKS5cbiAqICAgMi4gQ2FwIHRoZSBzdXJ2aXZpbmcgZnJhbWVzIGF0IGBNQVhfVklTSUJMRV9GUkFNRVNgOiBwYXN0IHRoYXQsIGV2ZW5cbiAqICAgICAgXCJ1c2VyLWlzaFwiIGZyYW1lcyBhcmUgdXN1YWxseSBkZWVwIGFzeW5jIHdyYXBwaW5nIHRoYXQgZG9lc24ndCBoZWxwXG4gKiAgICAgIHBpbnBvaW50IHRoZSB0aHJvdy4gVGhlIHVzZXIgY2FuIGRyb3AgaW50byB0aGUgaW5zcGVjdCBDTEkgZm9yIHRoZVxuICogICAgICBmdWxsIHN0YWNrIG9uIGRlbWFuZC5cbiAqXG4gKiBFYWNoIHN1cHByZXNzZWQgcnVuIGVtaXRzIG9uZSBzdW1tYXJ5IGxpbmUgc28gcGVvcGxlIGtub3cgaG93IG11Y2ggd2FzXG4gKiB0cmltbWVkLlxuICovXG5jb25zdCBNQVhfVklTSUJMRV9GUkFNRVMgPSA2O1xuXG5mdW5jdGlvbiB0cmltU3RhY2tCb2R5KGJvZHk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIWJvZHkpIHJldHVybiBudWxsO1xuICBjb25zdCBsaW5lcyA9IGJvZHkuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBkcm9wcGVkUnVuID0gMDtcbiAgbGV0IHZpc2libGVGcmFtZUNvdW50ID0gMDtcbiAgbGV0IGNhcHBlZEZyYW1lcyA9IDA7XG5cbiAgY29uc3QgZmx1c2hEcm9wcGVkID0gKCkgPT4ge1xuICAgIGlmIChkcm9wcGVkUnVuID4gMCkge1xuICAgICAgb3V0LnB1c2goXG4gICAgICAgIEFuc2kuZGltKFxuICAgICAgICAgIGAgICAgICAgIOKApiAke2Ryb3BwZWRSdW59IG1vcmUgJHtkcm9wcGVkUnVuID09PSAxID8gJ2ZyYW1lJyA6ICdmcmFtZXMnfSBpbiBmcmFtZXdvcmsgaW50ZXJuYWxzYFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZHJvcHBlZFJ1biA9IDA7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgIGNvbnN0IGlzRnJhbWUgPSBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoJ2F0ICcpO1xuICAgIGlmIChpc0ZyYW1lICYmIGlzRnJhbWV3b3JrRnJhbWUobGluZSkpIHtcbiAgICAgIGRyb3BwZWRSdW4rKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNGcmFtZSAmJiB2aXNpYmxlRnJhbWVDb3VudCA+PSBNQVhfVklTSUJMRV9GUkFNRVMpIHtcbiAgICAgIGNhcHBlZEZyYW1lcysrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZsdXNoRHJvcHBlZCgpO1xuICAgIG91dC5wdXNoKGxpbmUpO1xuICAgIGlmIChpc0ZyYW1lKSB2aXNpYmxlRnJhbWVDb3VudCsrO1xuICB9XG4gIGZsdXNoRHJvcHBlZCgpO1xuICBpZiAoY2FwcGVkRnJhbWVzID4gMCkge1xuICAgIG91dC5wdXNoKFxuICAgICAgQW5zaS5kaW0oXG4gICAgICAgIGAgICAgICAgIOKApiAke2NhcHBlZEZyYW1lc30gbW9yZSAke2NhcHBlZEZyYW1lcyA9PT0gMSA/ICdmcmFtZScgOiAnZnJhbWVzJ30gKHJ1biBcXGBwbnBtIHdmIGluc3BlY3QgcnVuIDxpZD5cXGAgZm9yIHRoZSBmdWxsIHN0YWNrKWBcbiAgICAgIClcbiAgICApO1xuICB9XG4gIHJldHVybiBvdXQuam9pbignXFxuJyk7XG59XG5cbmZ1bmN0aW9uIGlzRnJhbWV3b3JrRnJhbWUobGluZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgYXQtZnJhbWVzIGFyZSBjYW5kaWRhdGVzIGZvciBzdHJpcHBpbmcuIEhlYWRlciBsaW5lcyAoYE5hbWU6IOKApmApXG4gIC8vIGFuZCBhcmJpdHJhcnkgdHJhaWxpbmcgY29udGV4dCAoZS5nLiBgY29kZTogJ1VTRVJfRVJST1InYCkgcGFzcyB0aHJvdWdoLlxuICBjb25zdCB0cmltbWVkID0gbGluZS50cmltU3RhcnQoKTtcbiAgaWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoJ2F0ICcpKSByZXR1cm4gZmFsc2U7XG4gIC8vIG5vZGU6KiBpbnRlcm5hbHMgKHRpbWVycywgYXN5bmMgaG9va3MsIHZtLCBldGMuKSBuZXZlciBoZWxwIHVzZXJzLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZTppbnRlcm5hbC8nKSkgcmV0dXJuIHRydWU7XG4gIC8vIHBucG0tcm9vdGVkIGZyYW1ld29ya3MgaW5zdGFsbGVkIGFzIG5vZGVfbW9kdWxlcyBkZXBlbmRlbmNpZXMuXG4gIGlmICh0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvLnBucG0vJykpIHJldHVybiB0cnVlO1xuICAvLyBUdXJib3BhY2svTmV4dCBidW5kbGUgdGhlIHNhbWUgZnJhbWV3b3JrIGNvZGUgaW50byBjaHVua3MgbGlrZVxuICAvLyBgbm9kZV9tb2R1bGVzX19wbnBtXzxoYXNoPi5fLmpzYCBhbmQgYDwuLi4+X25leHRfZGlzdF88aGFzaD4uXy5qc2AsXG4gIC8vIGFuZCBlbWl0cyBOZXh0LmpzIGxvYWRlciBydW50aW1lIGFzIGAwZHg2X25leHRfZGlzdF88aGFzaD4uXy5qc2AuXG4gIC8vIFRoZXNlIGFyZSB0aGUgZnJhbWVzIHRoYXQgc2hvdyB1cCBhZnRlciBUdXJib3BhY2sgRENFLCBzYW1lIGludGVudFxuICAvLyBhcyB0aGUgcmF3IGBub2RlX21vZHVsZXMvLnBucG0vYCBmaWx0ZXIgYWJvdmUuXG4gIGlmICh0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXNfX3BucG1fJykpIHJldHVybiB0cnVlO1xuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnX25leHRfZGlzdF8nKSkgcmV0dXJuIHRydWU7XG4gIC8vIFBsYWluIG5vZGVfbW9kdWxlcyAobm9uLXBucG0gc2V0dXBzKSBmb3IgdGhlIHNhbWUga2luZHMgb2YgZnJhbWV3b3Jrcy5cbiAgaWYgKFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9uZXh0LycpIHx8XG4gICAgdHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzL0BvcGVudGVsZW1ldHJ5LycpIHx8XG4gICAgdHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzL3ZpdGVzdC8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9Adml0ZXN0LycpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGlja1N0cmluZyhcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBrZXk6IHN0cmluZ1xuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHYgPSBtZXRhZGF0YVtrZXldO1xuICByZXR1cm4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCA/IHYgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBrdktleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBBbnNpLmRpbShrZXkucGFkRW5kKDYpKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SWRSb3coXG4gIGxhYmVsOiBzdHJpbmcsXG4gIGlkOiBzdHJpbmcgfCBudWxsLFxuICBuYW1lOiBzdHJpbmcgfCBudWxsLFxuICBmb3JtYXROYW1lOiAobjogc3RyaW5nKSA9PiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IGlkQ2VsbCA9IGlkID8gaWQgOiBBbnNpLmRpbSgn4oCUJyk7XG4gIGNvbnN0IHBhcnNlZCA9IG5hbWVcbiAgICA/IGxhYmVsID09PSAncnVuJ1xuICAgICAgPyBwYXJzZVdvcmtmbG93TmFtZShuYW1lKVxuICAgICAgOiBwYXJzZVN0ZXBOYW1lKG5hbWUpXG4gICAgOiBudWxsO1xuICBjb25zdCBuYW1lQ2VsbCA9IHBhcnNlZFxuICAgID8gYCR7QW5zaS5kaW0oJ8K3Jyl9ICR7Zm9ybWF0TmFtZShuYW1lIGFzIHN0cmluZyl9YFxuICAgIDogJyc7XG4gIHJldHVybiBgICAke2t2S2V5KGxhYmVsKX0gJHtpZENlbGx9JHtuYW1lQ2VsbCA/ICcgJyArIG5hbWVDZWxsIDogJyd9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGFzc3Rocm91Z2hWYWx1ZSh2OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2LmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgcmV0dXJuIHZcbiAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAubWFwKChsaW5lLCBpKSA9PiAoaSA9PT0gMCA/IGxpbmUgOiBgICAgICAgICAgJHtsaW5lfWApKVxuICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuICAgIHJldHVybiB2O1xuICB9XG4gIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHYgPT09ICdib29sZWFuJykgcmV0dXJuIFN0cmluZyh2KTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodik7XG4gIH1cbn1cbiJdfQ==
257
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2ctZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sdUJBQXVCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBYyxFQUNkLE9BQWUsRUFDZixRQUE2QztJQUU3QyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV4QyxNQUFNLEtBQUssR0FBYSxDQUFDLEdBQUcsTUFBTSxJQUFJLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELElBQUksTUFBTTtRQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsSUFBSSxXQUFXO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQzdCLE9BQWUsRUFDZixJQUFZLEVBQ1osUUFBNkM7SUFFN0MsSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFB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QUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBYyxDQUFDLEVBQUU7UUFDbEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLE9BQU8sS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7QUFDeEUsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsQ0FBVTtJQUN4QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQztpQkFDTCxLQUFLLENBQUMsSUFBSSxDQUFDO2lCQUNYLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBbnNpIGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMvYW5zaSc7XG5pbXBvcnQge1xuICBmb3JtYXRTdGVwTmFtZSxcbiAgZm9ybWF0V29ya2Zsb3dOYW1lLFxuICBwYXJzZVN0ZXBOYW1lLFxuICBwYXJzZVdvcmtmbG93TmFtZSxcbn0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcblxuLyoqXG4gKiBTdHJ1Y3R1cmVkLWxvZyBjb21wb3NpdGlvbiBmb3IgYGNvbnNvbGUuZXJyb3JgIC8gYGNvbnNvbGUud2FybmAuIEVtaXRzXG4gKiBvbmUgc3RyaW5nIGluIHRocmVlIHNlY3Rpb25zIHNvIHRoZSBtb3N0IHVzZWZ1bCBpbmZvcm1hdGlvbiBpcyBhdCB0aGVcbiAqIHRvcCwgc3RhY2sgdHJhY2UgYXQgdGhlIGJvdHRvbTpcbiAqXG4gKiAgICAgW3dvcmtmbG93LXNka10gPGZyYW1pbmcgbGluZT5cbiAqICAgICAgIHVzZXIgZXJyb3IgwrcgRmF0YWxFcnJvclxuICogICAgICAgcnVuICAgIHdydW5f4oCmXG4gKiAgICAgICBzdGVwICAgc3RlcF/igKYgwrcgYWRkICguL3dvcmtmbG93cy94KVxuICogICAgICAgaGludDogIE1vdmUgdGhlIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uLlxuICogICAgIEZhdGFsRXJyb3I6IOKAplxuICogICAgICAgICBhdCDigKYgKHRyaW1tZWQgc3RhY2ssIGludGVybmFscyBjb2xsYXBzZWQpXG4gKlxuICogV2l0aG91dCB0aGlzIGNvbXBvc2l0aW9uLCBjYWxsZXJzIHBhc3NpbmcgYCR7ZnJhbWluZ31cXG4ke3N0YWNrfWAgYXMgdGhlXG4gKiBtZXNzYWdlIGFuZCBzdHJ1Y3R1cmVkIGZpZWxkcyBhcyB0aGUgbWV0YWRhdGEgb2JqZWN0IGdvdCBgdXRpbC5pbnNwZWN0YCdzXG4gKiBkZWZhdWx0IG9iamVjdCBkdW1wIGFwcGVuZGVkICphZnRlciogdGhlIHN0YWNrLCB3aGljaCBidXJpZXMgdGhlIHJ1biBJRFxuICogYW5kIGF0dHJpYnV0aW9uIGJhZGdlIHVuZGVyIDMwKyBsaW5lcyBvZiBgbm9kZV9tb2R1bGVzLy5wbnBtLy4uLmAgZnJhbWVzLlxuICpcbiAqIFRoZSBzYW1lIG1ldGFkYXRhIGlzIGFsc28gZW1pdHRlZCBhcyBzdHJ1Y3R1cmVkIE9UZWwgc3BhbiBldmVudHMgZnJvbVxuICogdGhlIGxvZ2dlciBpdHNlbGYsIHNvIGJhY2tlbmRzIHRoYXQgd2FudCBKU09OLXNoYXBlZCBkYXRhIHN0aWxsIGdldCBpdC5cbiAqIHdlYi93ZWItc2hhcmVkIGRvIG5vdCBjb25zdW1lIHN0ZGVyciBhdCBhbGw6IHRoZXkgcmVhZCBDQk9SL0pTT04gZXZlbnRcbiAqIHBheWxvYWRzIGZyb20gdGhlIFdvcmxkIGV2ZW50IGxvZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VMb2dMaW5lKFxuICBwcmVmaXg6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IHN0cmluZyB7XG4gIGNvbnN0IFtmcmFtaW5nLCAuLi5yZXN0XSA9IG1lc3NhZ2Uuc3BsaXQoJ1xcbicpO1xuICBjb25zdCBib2R5ID0gcmVzdC5qb2luKCdcXG4nKTtcbiAgY29uc3QgZmllbGRzID0gcmVuZGVyU3RydWN0dXJlZEZpZWxkcyhmcmFtaW5nID8/ICcnLCBib2R5LCBtZXRhZGF0YSk7XG4gIGNvbnN0IHRyaW1tZWRCb2R5ID0gdHJpbVN0YWNrQm9keShib2R5KTtcblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbYCR7cHJlZml4fSAke2ZyYW1pbmcgPz8gJyd9YF07XG4gIGlmIChmaWVsZHMpIGxpbmVzLnB1c2goZmllbGRzKTtcbiAgaWYgKHRyaW1tZWRCb2R5KSBsaW5lcy5wdXNoKHRyaW1tZWRCb2R5KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTdHJ1Y3R1cmVkRmllbGRzKFxuICBmcmFtaW5nOiBzdHJpbmcsXG4gIGJvZHk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFtZXRhZGF0YSB8fCBPYmplY3Qua2V5cyhtZXRhZGF0YSkubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAvLyBEcm9wIGZpZWxkcyB0aGF0IHRoZSBtZXNzYWdlIGFscmVhZHkgZW5jb2Rlcy4gV2UgcmVuZGVyIGZyYW1pbmdzIGFuZFxuICAvLyBzdGFja3MgaW50byB0aGUgbWVzc2FnZSBzdHJpbmcgaXRzZWxmIGluIHN0ZXAgZXhlY3V0b3IgLyBjb21iaW5lZCBydW50aW1lLCBzb1xuICAvLyByZXBlYXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHB1cmUgbm9pc2UuIEEgbWVzc2FnZSB3aXRoIG5laXRoZXIgKGEgV0FSTlxuICAvLyB3aG9zZSBmcmFtaW5nIGlzIGEgZml4ZWQgc2VudGVuY2UgYW5kIHdob3NlIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSBvbmx5XG4gIC8vIHBsYWNlIHRoZSB1bmRlcmx5aW5nIGVycm9yJ3MgdGV4dCBhcHBlYXJzKSBrZWVwcyBgZXJyb3JNZXNzYWdlYCBhbmRcbiAgLy8gcmVuZGVycyBpdCBhcyBpdHMgb3duIHJvdyBiZWxvdy5cbiAgY29uc3QgcmVkdW5kYW50ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJlZHVuZGFudC5hZGQoJ2Vycm9yU3RhY2snKTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2Vycm9yTWVzc2FnZScpO1xuICBpZiAoXG4gICAgZXJyb3JNZXNzYWdlICYmXG4gICAgKGZyYW1pbmcuaW5jbHVkZXMoZXJyb3JNZXNzYWdlKSB8fCBib2R5LmluY2x1ZGVzKGVycm9yTWVzc2FnZSkpXG4gICkge1xuICAgIHJlZHVuZGFudC5hZGQoJ2Vycm9yTWVzc2FnZScpO1xuICB9XG5cbiAgY29uc3Qgd2VsbEtub3duID0gbmV3IFNldChbXG4gICAgJ3dvcmtmbG93UnVuSWQnLFxuICAgICd3b3JrZmxvd05hbWUnLFxuICAgICdzdGVwSWQnLFxuICAgICdzdGVwTmFtZScsXG4gICAgJ2Vycm9yQXR0cmlidXRpb24nLFxuICAgICdlcnJvckNvZGUnLFxuICAgICdlcnJvck5hbWUnLFxuICAgICdlcnJvck1lc3NhZ2UnLFxuICAgICdlcnJvclN0YWNrJyxcbiAgICAnaGludCcsXG4gICAgJ2F0dGVtcHQnLFxuICAgICdyZXRyeUNvdW50JyxcbiAgXSk7XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gSGVhZGVyOiBlcnJvciBjbGFzcyArIGF0dHJpYnV0aW9uIGJhZGdlLlxuICBjb25zdCBlcnJvck5hbWUgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnZXJyb3JOYW1lJyk7XG4gIGNvbnN0IGF0dHJpYnV0aW9uID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2Vycm9yQXR0cmlidXRpb24nKTtcbiAgaWYgKGVycm9yTmFtZSB8fCBhdHRyaWJ1dGlvbikge1xuICAgIGNvbnN0IGJhZGdlID0gYXR0cmlidXRpb25cbiAgICAgID8gYXR0cmlidXRpb24gPT09ICdzZGsnXG4gICAgICAgID8gQW5zaS5tYWdlbnRhKCdzZGsgZXJyb3InKVxuICAgICAgICA6IEFuc2kucmVkKCd1c2VyIGVycm9yJylcbiAgICAgIDogJyc7XG4gICAgY29uc3QgY2xzID0gZXJyb3JOYW1lID8gQW5zaS5ib2xkKGVycm9yTmFtZSkgOiAnJztcbiAgICBjb25zdCBzZXAgPSBiYWRnZSAmJiBjbHMgPyBBbnNpLmRpbSgnIMK3ICcpIDogJyc7XG4gICAgbGluZXMucHVzaChgICAke2JhZGdlfSR7c2VwfSR7Y2xzfWApO1xuICB9XG5cbiAgLy8gSUQgKyBwYXJzZWQgZnJpZW5kbHktbmFtZSByb3dzLlxuICBjb25zdCBydW5JZCA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICd3b3JrZmxvd1J1bklkJyk7XG4gIGNvbnN0IHdmTmFtZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICd3b3JrZmxvd05hbWUnKTtcbiAgaWYgKHJ1bklkKSB7XG4gICAgbGluZXMucHVzaChmb3JtYXRJZFJvdygncnVuJywgcnVuSWQsIHdmTmFtZSwgZm9ybWF0V29ya2Zsb3dOYW1lKSk7XG4gIH0gZWxzZSBpZiAod2ZOYW1lKSB7XG4gICAgbGluZXMucHVzaChmb3JtYXRJZFJvdygncnVuJywgbnVsbCwgd2ZOYW1lLCBmb3JtYXRXb3JrZmxvd05hbWUpKTtcbiAgfVxuXG4gIGNvbnN0IHN0ZXBJZCA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdzdGVwSWQnKTtcbiAgY29uc3Qgc3RlcE5hbWUgPSBwaWNrU3RyaW5nKG1ldGFkYXRhLCAnc3RlcE5hbWUnKTtcbiAgaWYgKHN0ZXBJZCB8fCBzdGVwTmFtZSkge1xuICAgIGxpbmVzLnB1c2goZm9ybWF0SWRSb3coJ3N0ZXAnLCBzdGVwSWQsIHN0ZXBOYW1lLCBmb3JtYXRTdGVwTmFtZSkpO1xuICB9XG5cbiAgaWYgKG1ldGFkYXRhLmF0dGVtcHQgIT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS5yZXRyeUNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBgYXR0ZW1wdGAgYW5kIGByZXRyeUNvdW50YCByZWFkIGFtYmlndW91c2x5IG5leHQgdG8gZWFjaCBvdGhlciAoaXNcbiAgICAvLyBcIjMgcmV0cmllc1wiIHRoZSBsaW1pdCBvciB3aGF0IGFscmVhZHkgaGFwcGVuZWQ/KS4gUmVuZGVyIHRoZSBsaW1pdFxuICAgIC8vIGFzIFwibWF4IHJldHJpZXNcIiB0byBtYWtlIHRoZSBib3VuZGFyeSBleHBsaWNpdCwgYW5kIGtlZXAgYGF0dGVtcHRgXG4gICAgLy8gYXMgdGhlIGNvdW50IG9mIHRvdGFsIGludm9jYXRpb25zIGluY2x1ZGluZyB0aGUgb3JpZ2luYWwuXG4gICAgY29uc3QgYSA9IG1ldGFkYXRhLmF0dGVtcHQ7XG4gICAgY29uc3QgciA9IG1ldGFkYXRhLnJldHJ5Q291bnQ7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiByICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGAgICR7a3ZLZXkoJ3JldHJ5Jyl9ICR7YX0gJHtBbnNpLmRpbSgnYXR0ZW1wdHMgwrcnKX0gJHtyfSAke0Fuc2kuZGltKCdtYXggcmV0cmllcycpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtrdktleSgncmV0cnknKX0gJHthfSAke0Fuc2kuZGltKCdhdHRlbXB0cycpfWApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVycm9yQ29kZSA9IHBpY2tTdHJpbmcobWV0YWRhdGEsICdlcnJvckNvZGUnKTtcbiAgaWYgKGVycm9yQ29kZSAmJiBlcnJvckNvZGUgIT09IGVycm9yTmFtZSkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtrdktleSgnY29kZScpfSAke0Fuc2kuZGltKGVycm9yQ29kZSl9YCk7XG4gIH1cblxuICBpZiAoZXJyb3JNZXNzYWdlICYmICFyZWR1bmRhbnQuaGFzKCdlcnJvck1lc3NhZ2UnKSkge1xuICAgIGxpbmVzLnB1c2goYCAgJHtrdktleSgnZXJyb3InKX0gJHtmb3JtYXRQYXNzdGhyb3VnaFZhbHVlKGVycm9yTWVzc2FnZSl9YCk7XG4gIH1cblxuICBjb25zdCBoaW50ID0gcGlja1N0cmluZyhtZXRhZGF0YSwgJ2hpbnQnKTtcbiAgaWYgKGhpbnQpIHtcbiAgICBsaW5lcy5wdXNoKGAgICR7QW5zaS5oaW50KGhpbnQpfWApO1xuICB9XG5cbiAgLy8gU29ydGVkIHBhc3MtdGhyb3VnaCBmb3IgdW5rbm93biBmaWVsZHMuXG4gIGNvbnN0IHBhc3NUaHJvdWdoID0gT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpXG4gICAgLmZpbHRlcihcbiAgICAgIChbaywgdl0pID0+XG4gICAgICAgICF3ZWxsS25vd24uaGFzKGspICYmICFyZWR1bmRhbnQuaGFzKGspICYmIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG4gICAgKVxuICAgIC5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgcGFzc1Rocm91Z2gpIHtcbiAgICBsaW5lcy5wdXNoKGAgICR7a3ZLZXkoayl9ICR7Zm9ybWF0UGFzc3Rocm91Z2hWYWx1ZSh2KX1gKTtcbiAgfVxuXG4gIHJldHVybiBsaW5lcy5sZW5ndGggPyBsaW5lcy5qb2luKCdcXG4nKSA6IG51bGw7XG59XG5cbi8qKlxuICogU3RyaXAgdGhlIHN0YWNrIGRvd24gdG8gZnJhbWVzIHRoZSB1c2VyIGNhbiBhY3Qgb24uIFY4IHN0YWNrcyBmb3Igb3VyXG4gKiBydW50aW1lIGVycm9ycyBsb29rIGxpa2U6XG4gKlxuICogICAgIE5hbWU6IG1lc3NhZ2VcbiAqICAgICAgICAgYXQgdXNlclN0ZXAgKC4vd29ya2Zsb3dzL2Zvby50czoxMjoxMSlcbiAqICAgICAgICAgYXQgPHVua25vd24+ICguLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9ydW50aW1lL3N0ZXAtZXhlY3V0b3IudHM6NTM1OjMyKVxuICogICAgICAgICBhdCA8dW5rbm93bj4gKC4uLi9ub2RlX21vZHVsZXMvLnBucG0vbmV4dEDigKYv4oCmL2Jhc2Utc2VydmVyLmpzOjE0NTQ6OSlcbiAqICAgICAgICAgYXQgPHVua25vd24+ICguLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BvcGVudGVsZW1ldHJ5K2FwaUDigKYv4oCmL2FwaS5qczo1NDQwKVxuICogICAgICAgICBhdCDigKYgKDE1IG1vcmUgZnJhbWVzIGludG8gTmV4dC5qcyAvIHBucG0gaW50ZXJuYWxzKVxuICpcbiAqIFR3by1wYXNzIHRyaW06XG4gKlxuICogICAxLiBEcm9wIGZyYW1ld29yay1pbnRlcm5hbCBmcmFtZXMgKGBub2RlX21vZHVsZXMvLnBucG0vYCwgYG5vZGU6aW50ZXJuYWwvYCxcbiAqICAgICAgVHVyYm9wYWNrLWJ1bmRsZWQgYG5vZGVfbW9kdWxlc19fcG5wbV8qYCAvIGBfbmV4dF9kaXN0XypgIGNodW5rcykuXG4gKiAgIDIuIENhcCB0aGUgc3Vydml2aW5nIGZyYW1lcyBhdCBgTUFYX1ZJU0lCTEVfRlJBTUVTYDogcGFzdCB0aGF0LCBldmVuXG4gKiAgICAgIFwidXNlci1pc2hcIiBmcmFtZXMgYXJlIHVzdWFsbHkgZGVlcCBhc3luYyB3cmFwcGluZyB0aGF0IGRvZXNuJ3QgaGVscFxuICogICAgICBwaW5wb2ludCB0aGUgdGhyb3cuIFRoZSB1c2VyIGNhbiBkcm9wIGludG8gdGhlIGluc3BlY3QgQ0xJIGZvciB0aGVcbiAqICAgICAgZnVsbCBzdGFjayBvbiBkZW1hbmQuXG4gKlxuICogRWFjaCBzdXBwcmVzc2VkIHJ1biBlbWl0cyBvbmUgc3VtbWFyeSBsaW5lIHNvIHBlb3BsZSBrbm93IGhvdyBtdWNoIHdhc1xuICogdHJpbW1lZC5cbiAqL1xuY29uc3QgTUFYX1ZJU0lCTEVfRlJBTUVTID0gNjtcblxuZnVuY3Rpb24gdHJpbVN0YWNrQm9keShib2R5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKCFib2R5KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbGluZXMgPSBib2R5LnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZHJvcHBlZFJ1biA9IDA7XG4gIGxldCB2aXNpYmxlRnJhbWVDb3VudCA9IDA7XG4gIGxldCBjYXBwZWRGcmFtZXMgPSAwO1xuXG4gIGNvbnN0IGZsdXNoRHJvcHBlZCA9ICgpID0+IHtcbiAgICBpZiAoZHJvcHBlZFJ1biA+IDApIHtcbiAgICAgIG91dC5wdXNoKFxuICAgICAgICBBbnNpLmRpbShcbiAgICAgICAgICBgICAgICAgICDigKYgJHtkcm9wcGVkUnVufSBtb3JlICR7ZHJvcHBlZFJ1biA9PT0gMSA/ICdmcmFtZScgOiAnZnJhbWVzJ30gaW4gZnJhbWV3b3JrIGludGVybmFsc2BcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGRyb3BwZWRSdW4gPSAwO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCBpc0ZyYW1lID0gbGluZS50cmltU3RhcnQoKS5zdGFydHNXaXRoKCdhdCAnKTtcbiAgICBpZiAoaXNGcmFtZSAmJiBpc0ZyYW1ld29ya0ZyYW1lKGxpbmUpKSB7XG4gICAgICBkcm9wcGVkUnVuKys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGlzRnJhbWUgJiYgdmlzaWJsZUZyYW1lQ291bnQgPj0gTUFYX1ZJU0lCTEVfRlJBTUVTKSB7XG4gICAgICBjYXBwZWRGcmFtZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmbHVzaERyb3BwZWQoKTtcbiAgICBvdXQucHVzaChsaW5lKTtcbiAgICBpZiAoaXNGcmFtZSkgdmlzaWJsZUZyYW1lQ291bnQrKztcbiAgfVxuICBmbHVzaERyb3BwZWQoKTtcbiAgaWYgKGNhcHBlZEZyYW1lcyA+IDApIHtcbiAgICBvdXQucHVzaChcbiAgICAgIEFuc2kuZGltKFxuICAgICAgICBgICAgICAgICDigKYgJHtjYXBwZWRGcmFtZXN9IG1vcmUgJHtjYXBwZWRGcmFtZXMgPT09IDEgPyAnZnJhbWUnIDogJ2ZyYW1lcyd9IChydW4gXFxgcG5wbSB3ZiBpbnNwZWN0IHJ1biA8aWQ+XFxgIGZvciB0aGUgZnVsbCBzdGFjaylgXG4gICAgICApXG4gICAgKTtcbiAgfVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBpc0ZyYW1ld29ya0ZyYW1lKGxpbmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBPbmx5IGF0LWZyYW1lcyBhcmUgY2FuZGlkYXRlcyBmb3Igc3RyaXBwaW5nLiBIZWFkZXIgbGluZXMgKGBOYW1lOiDigKZgKVxuICAvLyBhbmQgYXJiaXRyYXJ5IHRyYWlsaW5nIGNvbnRleHQgKGUuZy4gYGNvZGU6ICdVU0VSX0VSUk9SJ2ApIHBhc3MgdGhyb3VnaC5cbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbVN0YXJ0KCk7XG4gIGlmICghdHJpbW1lZC5zdGFydHNXaXRoKCdhdCAnKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBub2RlOiogaW50ZXJuYWxzICh0aW1lcnMsIGFzeW5jIGhvb2tzLCB2bSwgZXRjLikgbmV2ZXIgaGVscCB1c2Vycy5cbiAgaWYgKHRyaW1tZWQuaW5jbHVkZXMoJ25vZGU6aW50ZXJuYWwvJykpIHJldHVybiB0cnVlO1xuICAvLyBwbnBtLXJvb3RlZCBmcmFtZXdvcmtzIGluc3RhbGxlZCBhcyBub2RlX21vZHVsZXMgZGVwZW5kZW5jaWVzLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzLy5wbnBtLycpKSByZXR1cm4gdHJ1ZTtcbiAgLy8gVHVyYm9wYWNrL05leHQgYnVuZGxlIHRoZSBzYW1lIGZyYW1ld29yayBjb2RlIGludG8gY2h1bmtzIGxpa2VcbiAgLy8gYG5vZGVfbW9kdWxlc19fcG5wbV88aGFzaD4uXy5qc2AgYW5kIGA8Li4uPl9uZXh0X2Rpc3RfPGhhc2g+Ll8uanNgLFxuICAvLyBhbmQgZW1pdHMgTmV4dC5qcyBsb2FkZXIgcnVudGltZSBhcyBgMGR4Nl9uZXh0X2Rpc3RfPGhhc2g+Ll8uanNgLlxuICAvLyBUaGVzZSBhcmUgdGhlIGZyYW1lcyB0aGF0IHNob3cgdXAgYWZ0ZXIgVHVyYm9wYWNrIERDRSwgc2FtZSBpbnRlbnRcbiAgLy8gYXMgdGhlIHJhdyBgbm9kZV9tb2R1bGVzLy5wbnBtL2AgZmlsdGVyIGFib3ZlLlxuICBpZiAodHJpbW1lZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzX19wbnBtXycpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHRyaW1tZWQuaW5jbHVkZXMoJ19uZXh0X2Rpc3RfJykpIHJldHVybiB0cnVlO1xuICAvLyBQbGFpbiBub2RlX21vZHVsZXMgKG5vbi1wbnBtIHNldHVwcykgZm9yIHRoZSBzYW1lIGtpbmRzIG9mIGZyYW1ld29ya3MuXG4gIGlmIChcbiAgICB0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvbmV4dC8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy9Ab3BlbnRlbGVtZXRyeS8nKSB8fFxuICAgIHRyaW1tZWQuaW5jbHVkZXMoJ25vZGVfbW9kdWxlcy92aXRlc3QvJykgfHxcbiAgICB0cmltbWVkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMvQHZpdGVzdC8nKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHBpY2tTdHJpbmcoXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAga2V5OiBzdHJpbmdcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2ID0gbWV0YWRhdGFba2V5XTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDAgPyB2IDogbnVsbDtcbn1cblxuZnVuY3Rpb24ga3ZLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gQW5zaS5kaW0oa2V5LnBhZEVuZCg2KSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdElkUm93KFxuICBsYWJlbDogc3RyaW5nLFxuICBpZDogc3RyaW5nIHwgbnVsbCxcbiAgbmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgZm9ybWF0TmFtZTogKG46IHN0cmluZykgPT4gc3RyaW5nXG4pOiBzdHJpbmcge1xuICBjb25zdCBpZENlbGwgPSBpZCA/IGlkIDogQW5zaS5kaW0oJ+KAlCcpO1xuICBjb25zdCBwYXJzZWQgPSBuYW1lXG4gICAgPyBsYWJlbCA9PT0gJ3J1bidcbiAgICAgID8gcGFyc2VXb3JrZmxvd05hbWUobmFtZSlcbiAgICAgIDogcGFyc2VTdGVwTmFtZShuYW1lKVxuICAgIDogbnVsbDtcbiAgY29uc3QgbmFtZUNlbGwgPSBwYXJzZWRcbiAgICA/IGAke0Fuc2kuZGltKCfCtycpfSAke2Zvcm1hdE5hbWUobmFtZSBhcyBzdHJpbmcpfWBcbiAgICA6ICcnO1xuICByZXR1cm4gYCAgJHtrdktleShsYWJlbCl9ICR7aWRDZWxsfSR7bmFtZUNlbGwgPyAnICcgKyBuYW1lQ2VsbCA6ICcnfWA7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhc3N0aHJvdWdoVmFsdWUodjogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodi5pbmNsdWRlcygnXFxuJykpIHtcbiAgICAgIHJldHVybiB2XG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCgobGluZSwgaSkgPT4gKGkgPT09IDAgPyBsaW5lIDogYCAgICAgICAgICR7bGluZX1gKSlcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfVxuICBpZiAodHlwZW9mIHYgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2ID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodik7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHYpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import type { Event } from '@workflow/world';
2
+ import type { EventsConsumer } from './events-consumer.js';
3
+ import type { QueueItem } from './global.js';
4
+ /**
5
+ * Step, wait, hook and attribute correlation ids share one ULID draw per
6
+ * entity, prefixed by kind (`step_<ulid>`, `wait_<ulid>`, `hook_<ulid>`,
7
+ * `attr_<ulid>`). A replay that drew the same ordinal for a different kind of
8
+ * entity than the one the log recorded there produces an event nobody can
9
+ * consume, and the decisive fact for diagnosing that is which pending
10
+ * invocation currently holds the ordinal. This looks it up by the shared ULID
11
+ * body, so a `wait_created` the log holds at a position where the replay is
12
+ * waiting on `step_<same ulid>` names that step.
13
+ */
14
+ export declare function findPendingItemAtOrdinal(invocationsQueue: Map<string, QueueItem>, correlationId: string): QueueItem | undefined;
15
+ /**
16
+ * The detail appended to a `ReplayDivergenceError` raised because the replay
17
+ * could not place an event. Callers keep their own leading sentence (tests and
18
+ * users match on it) and append this after it.
19
+ *
20
+ * Example:
21
+ * `pending at this id: step drainStep (step_01K…). consumer: index=41,
22
+ * length=44, parked=0, lastConsumed=evnt_01K…`
23
+ */
24
+ export declare function describeDivergenceContext(event: Event, invocationsQueue: Map<string, QueueItem>, eventsConsumer: EventsConsumer): string;
25
+ //# sourceMappingURL=replay-divergence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-divergence.d.ts","sourceRoot":"","sources":["../src/replay-divergence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,SAAS,CASvB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,cAAc,EAAE,cAAc,GAC7B,MAAM,CASR"}