@workflow/world-local 5.0.0-beta.21 → 5.0.0-beta.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/queue.js CHANGED
@@ -139,36 +139,77 @@ export function createQueue(config) {
139
139
  // The actual max delivery enforcement happens in the workflow/step handlers
140
140
  // (at MAX_QUEUE_DELIVERIES = 48), so this just needs to be comfortably higher.
141
141
  const MAX_LOCAL_SAFETY_LIMIT = 256;
142
+ // Number of times the message has actually reached a handler (returned
143
+ // ok, a timeoutSeconds re-delivery, or an HTTP error response). This —
144
+ // not the loop counter — is the attempt the handler sees via
145
+ // `x-vqs-message-attempt`, which it counts against MAX_QUEUE_DELIVERIES.
146
+ // Transport-level failures (below) never reach the handler, so they must
147
+ // not advance this, or a burst of "fetch failed"/ETIMEDOUT timeouts under
148
+ // local load would exhaust the handler's delivery budget before its first
149
+ // real execution.
150
+ let delivery = 0;
142
151
  try {
143
- for (let attempt = 0; attempt < MAX_LOCAL_SAFETY_LIMIT; attempt++) {
152
+ for (let loop = 0; loop < MAX_LOCAL_SAFETY_LIMIT; loop++) {
144
153
  const headers = {
145
154
  ...opts?.headers,
146
155
  'content-type': 'application/json',
147
156
  'x-vqs-queue-name': queueName,
148
157
  'x-vqs-message-id': messageId,
149
- 'x-vqs-message-attempt': String(attempt + 1),
158
+ 'x-vqs-message-attempt': String(delivery + 1),
150
159
  };
151
160
  const directHandler = directHandlers.get(prefix);
152
161
  let response;
153
- if (directHandler) {
154
- const req = new Request(`http://localhost/.well-known/workflow/v1/${pathname}`, {
155
- method: 'POST',
156
- headers,
157
- body,
158
- });
159
- response = await directHandler(req);
162
+ try {
163
+ if (directHandler) {
164
+ const req = new Request(`http://localhost/.well-known/workflow/v1/${pathname}`, {
165
+ method: 'POST',
166
+ headers,
167
+ body,
168
+ });
169
+ response = await directHandler(req);
170
+ }
171
+ else {
172
+ const baseUrl = await resolveBaseUrl(config);
173
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- undici v7 dispatcher types don't match @types/node's RequestInit
174
+ response = await fetch(`${baseUrl}/.well-known/workflow/v1/${pathname}`, {
175
+ method: 'POST',
176
+ duplex: 'half',
177
+ dispatcher: httpAgent,
178
+ headers,
179
+ body,
180
+ });
181
+ }
160
182
  }
161
- else {
162
- const baseUrl = await resolveBaseUrl(config);
163
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- undici v7 dispatcher types don't match @types/node's RequestInit
164
- response = await fetch(`${baseUrl}/.well-known/workflow/v1/${pathname}`, {
165
- method: 'POST',
166
- duplex: 'half',
167
- dispatcher: httpAgent,
168
- headers,
169
- body,
183
+ catch (err) {
184
+ // The delivery never reached the handler: undici threw before a
185
+ // response. Under heavy local concurrency the single-process dev
186
+ // server can't accept every connection, so undici reports
187
+ // `TypeError: fetch failed` with an ETIMEDOUT/ECONNRESET cause.
188
+ // These are transient — back off and retry the *same* delivery
189
+ // rather than dropping the message (which would leave the step
190
+ // never started, with no retry). Two failures are not retryable:
191
+ // - shutdown: close() aborted the agent / the backoff sleep.
192
+ // - a detached-ArrayBuffer proxy misconfig, which never succeeds —
193
+ // rethrow so the outer catch surfaces the actionable guidance.
194
+ const name = err?.name;
195
+ if (closeSignal.aborted ||
196
+ name === 'AbortError' ||
197
+ name === 'ResponseAborted') {
198
+ return;
199
+ }
200
+ if (isDetachedArrayBufferQueueError(err))
201
+ throw err;
202
+ console.error(`[world-local] Queue delivery failed at the transport (loop ${loop + 1}), retrying`, {
203
+ queueName,
204
+ messageId,
205
+ ...(runId && { runId }),
206
+ ...(stepId && { stepId }),
207
+ error: String(err),
170
208
  });
209
+ await setTimeout(5000, undefined, { signal: closeSignal });
210
+ continue;
171
211
  }
212
+ delivery++;
172
213
  const text = await response.text();
173
214
  if (response.ok) {
174
215
  try {
@@ -189,7 +230,7 @@ export function createQueue(config) {
189
230
  catch { }
190
231
  return;
191
232
  }
192
- console.error(`[world-local] Queue message failed (attempt ${attempt + 1}, HTTP ${response.status})`, {
233
+ console.error(`[world-local] Queue message failed (attempt ${delivery}, HTTP ${response.status})`, {
193
234
  queueName,
194
235
  messageId,
195
236
  ...(runId && { runId }),
@@ -301,4 +342,4 @@ export function createQueue(config) {
301
342
  },
302
343
  };
303
344
  }
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUdkLGNBQWMsR0FDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCO0lBQ2IsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0lBRTFDLFNBQVMsQ0FBQyxLQUFjO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWtDO1FBQ2xELE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSTtnQkFB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QWUsQ0FBQyxNQUFtQixFQUFFLE9BQXNCO1lBQ3pELGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSztZQUNULGtFQUFrRTtZQUNsRSxzQ0FBc0M7WUFDdEMsSUFBSSxXQUFXLENBQUMsT0FBTztnQkFBRSxPQUFPO1lBQ2hDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QixNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRUaW1lb3V0IH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc3BvcnQgfSBmcm9tICdAdmVyY2VsL3F1ZXVlJztcbmltcG9ydCB7XG4gIE1lc3NhZ2VJZCxcbiAgcGFyc2VRdWV1ZU5hbWUsXG4gIHR5cGUgUXVldWUsXG4gIHR5cGUgUXVldWVQcmVmaXgsXG4gIFZhbGlkUXVldWVOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgU2VtYSB9IGZyb20gJ2FzeW5jLXNlbWEnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICd1bmRpY2knO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZC92NCc7XG5pbXBvcnQgdHlwZSB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnLmpzJztcbmltcG9ydCB7IHJlc29sdmVCYXNlVXJsIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsganNvblJlcGxhY2VyLCBqc29uUmV2aXZlciB9IGZyb20gJy4vZnMuanMnO1xuaW1wb3J0IHsgZ2V0UGFja2FnZUluZm8gfSBmcm9tICcuL2luaXQuanMnO1xuXG4vKipcbiAqIEpTT04gdHJhbnNwb3J0IHRoYXQgcHJlc2VydmVzIFVpbnQ4QXJyYXkgdmFsdWVzIHVzaW5nIHRoZSBzYW1lXG4gKiByZXBsYWNlci9yZXZpdmVyIHRoYXQgd29ybGQtbG9jYWwgdXNlcyBmb3IgZmlsZXN5c3RlbSBzdG9yYWdlLlxuICogVWludDhBcnJheSDihpIgeyBfX3R5cGU6ICdVaW50OEFycmF5JywgZGF0YTogJzxiYXNlNjQ+JyB9IGluIEpTT04uXG4gKi9cbmNsYXNzIFR5cGVkSnNvblRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydDx1bmtub3duPiB7XG4gIHJlYWRvbmx5IGNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogdW5rbm93bik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlLCBqc29uUmVwbGFjZXIpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc2VyaWFsaXplKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChkb25lKSBicmVhaztcbiAgICAgIGlmICh2YWx1ZSkgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCwganNvblJldml2ZXIpO1xuICB9XG59XG5cbi8vIEZvciBsb2NhbCBxdWV1ZSwgdGhlcmUgaXMgbm8gdGVjaG5pY2FsIGxpbWl0IG9uIHRoZSBtZXNzYWdlIHZpc2liaWxpdHkgbGlmZXNwYW4sXG4vLyBidXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHRvIHNldCBhIG1heCB2aXNpYmlsaXR5IGxpbWl0LlxuY29uc3QgTE9DQUxfUVVFVUVfTUFYX1ZJU0lCSUxJVFkgPVxuICBwYXJzZUludChwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9RVUVVRV9NQVhfVklTSUJJTElUWSA/PyAnMCcsIDEwKSB8fFxuICBJbmZpbml0eTtcblxuLy8gTWF4aW11bSBzYWZlIGRlbGF5IGZvciBzZXRUaW1lb3V0IGluIE5vZGUuanMgKDJeMzEgLSAxIG1pbGxpc2Vjb25kcyDiiYggMjQuODUgZGF5cylcbi8vIExhcmdlciB2YWx1ZXMgY2F1c2UgXCJUaW1lb3V0T3ZlcmZsb3dXYXJuaW5nOiBYIGRvZXMgbm90IGZpdCBpbnRvIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyXCJcbi8vIFdoZW4gdGhlIGNsYW1wZWQgdGltZW91dCBmaXJlcywgdGhlIGhhbmRsZXIgd2lsbCByZWNhbGN1bGF0ZSByZW1haW5pbmcgdGltZSBmcm9tXG4vLyBwZXJzaXN0ZW50IHN0YXRlIGFuZCByZXR1cm4gYW5vdGhlciB0aW1lb3V0U2Vjb25kcyBpZiBuZWVkZWQuXG5jb25zdCBNQVhfU0FGRV9USU1FT1VUX01TID0gMjE0NzQ4MzY0NztcblxuLy8gVGhlIGxvY2FsIHdvcmtlcnMgc2hhcmUgdGhlIHNhbWUgTm9kZS5qcyBwcm9jZXNzIGFuZCBldmVudCBsb29wLFxuLy8gc28gd2UgbmVlZCB0byBsaW1pdCBjb25jdXJyZW5jeSB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbS5cbmNvbnN0IERFRkFVTFRfQ09OQ1VSUkVOQ1lfTElNSVQgPSAxMDAwO1xuY29uc3QgV09SS0ZMT1dfTE9DQUxfUVVFVUVfQ09OQ1VSUkVOQ1kgPVxuICBwYXJzZUludChwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9RVUVVRV9DT05DVVJSRU5DWSA/PyAnMCcsIDEwKSB8fFxuICBERUZBVUxUX0NPTkNVUlJFTkNZX0xJTUlUO1xuXG5leHBvcnQgdHlwZSBEaXJlY3RIYW5kbGVyID0gKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT47XG5cbmV4cG9ydCB0eXBlIExvY2FsUXVldWUgPSBRdWV1ZSAmIHtcbiAgLyoqIENsb3NlIHRoZSBIVFRQIGFnZW50IGFuZCByZWxlYXNlIHJlc291cmNlcy4gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlZ2lzdGVyIGEgZGlyZWN0IGluLXByb2Nlc3MgaGFuZGxlciBmb3IgYSBxdWV1ZSBwcmVmaXgsIGJ5cGFzc2luZyBIVFRQLiAqL1xuICByZWdpc3RlckhhbmRsZXIocHJlZml4OiBRdWV1ZVByZWZpeCwgaGFuZGxlcjogRGlyZWN0SGFuZGxlcik6IHZvaWQ7XG59O1xuXG5jb25zdCBERVRBQ0hFRF9BUlJBWUJVRkZFUl9FUlJPUiA9XG4gICdDYW5ub3QgcGVyZm9ybSBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Ugb24gYSBkZXRhY2hlZCBBcnJheUJ1ZmZlcic7XG5jb25zdCBQUk9YWV9IQU5ETEVSX0RPQ1NfVVJMID1cbiAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2dldHRpbmctc3RhcnRlZC9uZXh0I2NvbmZpZ3VyZS1wcm94eS1oYW5kbGVyJztcblxuZnVuY3Rpb24gaXNEZXRhY2hlZEFycmF5QnVmZmVyUXVldWVFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudCA9IGVycm9yO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDx1bmtub3duPigpO1xuXG4gIHdoaWxlIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0JyAmJiAhdmlzaXRlZC5oYXMoY3VycmVudCkpIHtcbiAgICB2aXNpdGVkLmFkZChjdXJyZW50KTtcbiAgICBpZiAoXG4gICAgICAnbWVzc2FnZScgaW4gY3VycmVudCAmJlxuICAgICAgdHlwZW9mIGN1cnJlbnQubWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGN1cnJlbnQubWVzc2FnZS5pbmNsdWRlcyhERVRBQ0hFRF9BUlJBWUJVRkZFUl9FUlJPUilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjdXJyZW50ID0gJ2NhdXNlJyBpbiBjdXJyZW50ID8gY3VycmVudC5jYXVzZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0UXVldWVSb3V0ZShxdWV1ZU5hbWU6IFZhbGlkUXVldWVOYW1lKToge1xuICBwYXRobmFtZTogJ2Zsb3cnIHwgJ3N0ZXAnO1xuICBwcmVmaXg6IFF1ZXVlUHJlZml4O1xufSB7XG4gIGNvbnN0IHsga2luZCwgcHJlZml4IH0gPSBwYXJzZVF1ZXVlTmFtZShxdWV1ZU5hbWUpO1xuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWU6IGtpbmQgPT09ICd3b3JrZmxvdycgPyAnZmxvdycgOiAnc3RlcCcsXG4gICAgcHJlZml4LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUXVldWUoY29uZmlnOiBQYXJ0aWFsPENvbmZpZz4pOiBMb2NhbFF1ZXVlIHtcbiAgLy8gQ3JlYXRlIGEgY3VzdG9tIGFnZW50IG9wdGltaXplZCBmb3IgaGlnaC1jb25jdXJyZW5jeSBsb2NhbCB3b3JrZmxvd3M6XG4gIC8vIC0gaGVhZGVyc1RpbWVvdXQ6IDAgYWxsb3dzIGxvbmctcnVubmluZyBzdGVwc1xuICAvLyAtIGNvbm5lY3Rpb25zOiAxMDAwIGFsbG93cyBtYW55IHBhcmFsbGVsIGNvbm5lY3Rpb25zIHRvIHRoZSBzYW1lIGhvc3RcbiAgLy8gLSBwaXBlbGluaW5nOiAxIChkZWZhdWx0KSBmb3IgSFRUUC8xLjEgY29tcGF0aWJpbGl0eVxuICAvLyAtIGtlZXBBbGl2ZVRpbWVvdXQ6IDMwcyBrZWVwcyBjb25uZWN0aW9ucyB3YXJtIGZvciByYXBpZCBzdGVwIGV4ZWN1dGlvblxuICBjb25zdCBodHRwQWdlbnQgPSBuZXcgQWdlbnQoe1xuICAgIGhlYWRlcnNUaW1lb3V0OiAwLFxuICAgIGNvbm5lY3Rpb25zOiAxMDAwLFxuICAgIGtlZXBBbGl2ZVRpbWVvdXQ6IDMwXzAwMCxcbiAgfSk7XG4gIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUeXBlZEpzb25UcmFuc3BvcnQoKTtcbiAgY29uc3QgZ2VuZXJhdGVJZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcbiAgY29uc3Qgc2VtYXBob3JlID0gbmV3IFNlbWEoV09SS0ZMT1dfTE9DQUxfUVVFVUVfQ09OQ1VSUkVOQ1kpO1xuXG4gIC8vIEFib3J0ZWQgYnkgY2xvc2UoKTogY2FuY2VscyBldmVyeSBwZW5kaW5nIHNsZWVwIChkZWxheWVkIGRlbGl2ZXJpZXMsXG4gIC8vIHRpbWVvdXRTZWNvbmRzIHJlLWRlbGl2ZXJpZXMsIHJldHJ5IGJhY2tvZmZzKSBzbyBzaHV0ZG93biBpc24ndCBoZWxkXG4gIC8vIGhvc3RhZ2UgYnkgYSB0aW1lciBhbmQgbm8gZGVsaXZlcnkgaXMgYXR0ZW1wdGVkIGFnYWluc3QgdGhlIGNsb3NlZFxuICAvLyBhZ2VudC4gVGhlIHJlc3VsdGluZyBBYm9ydEVycm9yIGlzIHNpbGVudGx5IGRyb3BwZWQgYnkgdGhlXG4gIC8vIGlzQWJvcnRFcnJvciBjaGVjayBpbiB0aGUgZGVsaXZlcnkgY2F0Y2ggaGFuZGxlci5cbiAgY29uc3QgY2xvc2VDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBjbG9zZVNpZ25hbCA9IGNsb3NlQ29udHJvbGxlci5zaWduYWw7XG5cbiAgLyoqXG4gICAqIGhvbGRzIGluZmxpZ2h0IG1lc3NhZ2VzIGJ5IGlkZW1wb3RlbmN5IGtleSB0byBlbnN1cmVcbiAgICogdGhhdCB3ZSBkb24ndCBxdWV1ZSB0aGUgc2FtZSBtZXNzYWdlIG11bHRpcGxlIHRpbWVzXG4gICAqL1xuICBjb25zdCBpbmZsaWdodE1lc3NhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIE1lc3NhZ2VJZD4oKTtcbiAgLyoqIERpcmVjdCBpbi1wcm9jZXNzIGhhbmRsZXJzIGJ5IHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAgd2hlbiBzZXQuICovXG4gIGNvbnN0IGRpcmVjdEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIERpcmVjdEhhbmRsZXI+KCk7XG5cbiAgY29uc3QgcXVldWU6IFF1ZXVlWydxdWV1ZSddID0gYXN5bmMgKHF1ZXVlTmFtZSwgbWVzc2FnZSwgb3B0cykgPT4ge1xuICAgIGNvbnN0IGNsZWFudXAgPSBbXSBhcyAoKCkgPT4gdm9pZClbXTtcblxuICAgIGlmIChvcHRzPy5pZGVtcG90ZW5jeUtleSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpbmZsaWdodE1lc3NhZ2VzLmdldChvcHRzLmlkZW1wb3RlbmN5S2V5KTtcbiAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICByZXR1cm4geyBtZXNzYWdlSWQ6IGV4aXN0aW5nIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IHRyYW5zcG9ydC5zZXJpYWxpemUobWVzc2FnZSk7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgcHJlZml4IH0gPSBnZXRRdWV1ZVJvdXRlKHF1ZXVlTmFtZSk7XG4gICAgY29uc3QgbWVzc2FnZUlkID0gTWVzc2FnZUlkLnBhcnNlKGBtc2dfJHtnZW5lcmF0ZUlkKCl9YCk7XG5cbiAgICAvLyBFeHRyYWN0IGlkZW50aWZpZXJzIGZyb20gdGhlIG1lc3NhZ2UgZm9yIHN0cnVjdHVyZWQgbG9nZ2luZy5cbiAgICAvLyBXb3JrZmxvdyBtZXNzYWdlcyBoYXZlIGBydW5JZGAsIHN0ZXAgbWVzc2FnZXMgaGF2ZSBgd29ya2Zsb3dSdW5JZGAgKyBgc3RlcElkYC5cbiAgICBjb25zdCBtc2cgPSBtZXNzYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHJ1bklkID0gKG1zZy5ydW5JZCA/PyBtc2cud29ya2Zsb3dSdW5JZCA/PyB1bmRlZmluZWQpIGFzXG4gICAgICB8IHN0cmluZ1xuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcElkID0gKG1zZy5zdGVwSWQgPz8gdW5kZWZpbmVkKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3B0cz8uaWRlbXBvdGVuY3lLZXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IG9wdHMuaWRlbXBvdGVuY3lLZXk7XG4gICAgICBpbmZsaWdodE1lc3NhZ2VzLnNldChrZXksIG1lc3NhZ2VJZCk7XG4gICAgICBjbGVhbnVwLnB1c2goKCkgPT4ge1xuICAgICAgICBpbmZsaWdodE1lc3NhZ2VzLmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEhvbm9yIHRoZSBjYWxsZXIncyByZXF1ZXN0ZWQgZGVsaXZlcnkgZGVsYXkgYmVmb3JlIGFjcXVpcmluZyBhIHF1ZXVlXG4gICAgICAvLyBzbG90LiBTbGVlcGluZyBvdXRzaWRlIHRoZSBzZW1hcGhvcmUgc28gYSBkZWxheWVkIG1lc3NhZ2UgZG9lc24ndFxuICAgICAgLy8gaG9sZCBhIHdvcmtlciBob3N0YWdlIGZvciBpdHMgZGVsYXkgd2luZG93IOKAlCB0aGUgd29ya2VyIHNob3VsZCBiZVxuICAgICAgLy8gZnJlZSB0byBwcm9jZXNzIG90aGVyIChpbW1lZGlhdGUpIG1lc3NhZ2VzIHVudGlsIHRoaXMgb25lIGlzIHJlYWR5LlxuICAgICAgLy8gVlFTLXNpZGUgcXVldWVzIGhvbm9yIGRlbGF5U2Vjb25kcyBhdCB0aGUgYnJva2VyLCBzbyB0aGlzIGJyaW5nc1xuICAgICAgLy8gd29ybGQtbG9jYWwgaW4gbGluZSB3aXRoIHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gICAgICBpZiAob3B0cz8uZGVsYXlTZWNvbmRzICYmIG9wdHMuZGVsYXlTZWNvbmRzID4gMCkge1xuICAgICAgICBjb25zdCBkZWxheU1zID0gTWF0aC5taW4ob3B0cy5kZWxheVNlY29uZHMgKiAxMDAwLCBNQVhfU0FGRV9USU1FT1VUX01TKTtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dChkZWxheU1zLCB1bmRlZmluZWQsIHsgc2lnbmFsOiBjbG9zZVNpZ25hbCB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBzZW1hcGhvcmUudHJ5QWNxdWlyZSgpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFt3b3JsZC1sb2NhbF06IGNvbmN1cnJlbmN5IGxpbWl0ICgke1dPUktGTE9XX0xPQ0FMX1FVRVVFX0NPTkNVUlJFTkNZfSkgcmVhY2hlZCwgd2FpdGluZyBmb3IgcXVldWUgdG8gZnJlZSB1cGBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2VtYXBob3JlLmFjcXVpcmUoKTtcbiAgICAgIH1cbiAgICAgIC8vIFNhZmV0eSBsaW1pdCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzIGluIHRoZSBsb2NhbCBxdWV1ZS5cbiAgICAgIC8vIFRoZSBhY3R1YWwgbWF4IGRlbGl2ZXJ5IGVuZm9yY2VtZW50IGhhcHBlbnMgaW4gdGhlIHdvcmtmbG93L3N0ZXAgaGFuZGxlcnNcbiAgICAgIC8vIChhdCBNQVhfUVVFVUVfREVMSVZFUklFUyA9IDQ4KSwgc28gdGhpcyBqdXN0IG5lZWRzIHRvIGJlIGNvbWZvcnRhYmx5IGhpZ2hlci5cbiAgICAgIGNvbnN0IE1BWF9MT0NBTF9TQUZFVFlfTElNSVQgPSAyNTY7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IE1BWF9MT0NBTF9TQUZFVFlfTElNSVQ7IGF0dGVtcHQrKykge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5vcHRzPy5oZWFkZXJzLFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd4LXZxcy1xdWV1ZS1uYW1lJzogcXVldWVOYW1lLFxuICAgICAgICAgICAgJ3gtdnFzLW1lc3NhZ2UtaWQnOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAneC12cXMtbWVzc2FnZS1hdHRlbXB0JzogU3RyaW5nKGF0dGVtcHQgKyAxKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRpcmVjdEhhbmRsZXIgPSBkaXJlY3RIYW5kbGVycy5nZXQocHJlZml4KTtcbiAgICAgICAgICBsZXQgcmVzcG9uc2U6IFJlc3BvbnNlO1xuXG4gICAgICAgICAgaWYgKGRpcmVjdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KFxuICAgICAgICAgICAgICBgaHR0cDovL2xvY2FsaG9zdC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS8ke3BhdGhuYW1lfWAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGRpcmVjdEhhbmRsZXIocmVxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IGF3YWl0IHJlc29sdmVCYXNlVXJsKGNvbmZpZyk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSB1bmRpY2kgdjcgZGlzcGF0Y2hlciB0eXBlcyBkb24ndCBtYXRjaCBAdHlwZXMvbm9kZSdzIFJlcXVlc3RJbml0XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICBgJHtiYXNlVXJsfS8ud2VsbC1rbm93bi93b3JrZmxvdy92MS8ke3BhdGhuYW1lfWAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICBkdXBsZXg6ICdoYWxmJyxcbiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyOiBodHRwQWdlbnQsXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICB9IGFzIGFueVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE51bWJlcihKU09OLnBhcnNlKHRleHQpLnRpbWVvdXRTZWNvbmRzKTtcbiAgICAgICAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZSh0aW1lb3V0U2Vjb25kcykgJiYgdGltZW91dFNlY29uZHMgPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIENsYW1wIHRvIE1BWF9TQUZFX1RJTUVPVVRfTVMgdG8gYXZvaWQgTm9kZS5qcyBzZXRUaW1lb3V0IG92ZXJmbG93IHdhcm5pbmcuXG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGlzIGZpcmVzIGVhcmx5LCB0aGUgaGFuZGxlciByZWNhbGN1bGF0ZXMgcmVtYWluaW5nIHRpbWUgZnJvbVxuICAgICAgICAgICAgICAgIC8vIHBlcnNpc3RlbnQgc3RhdGUgYW5kIHJldHVybnMgYW5vdGhlciB0aW1lb3V0U2Vjb25kcyBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGltZW91dE1zID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzICogMTAwMCxcbiAgICAgICAgICAgICAgICAgICAgTUFYX1NBRkVfVElNRU9VVF9NU1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHNldFRpbWVvdXQodGltZW91dE1zLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjbG9zZVNpZ25hbCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3dvcmxkLWxvY2FsXSBRdWV1ZSBtZXNzYWdlIGZhaWxlZCAoYXR0ZW1wdCAke2F0dGVtcHQgKyAxfSwgSFRUUCAke3Jlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIC4uLihydW5JZCAmJiB7IHJ1bklkIH0pLFxuICAgICAgICAgICAgICAuLi4oc3RlcElkICYmIHsgc3RlcElkIH0pLFxuICAgICAgICAgICAgICBoYW5kbGVyRXJyb3I6IHRleHQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIDVzIGxpbmVhciBiYWNrb2ZmIHRvIGFwcHJveGltYXRlIFZRUyByZXRyeSB0aW1pbmcgaW4gbG9jYWwgZGV2LlxuICAgICAgICAgIC8vIFZRUyB1c2VzIDVzIGxpbmVhciBmb3IgYXR0ZW1wdHMgMeKAkzMyLCB0aGVuIGV4cG9uZW50aWFsLCBidXQgZm9yXG4gICAgICAgICAgLy8gbG9jYWwgZGV2IGxpbmVhciA1cyBpcyBzdWZmaWNpZW50IOKAlCB0aGUgaGFuZGxlciBlbmZvcmNlcyB0aGUgcmVhbFxuICAgICAgICAgIC8vIGNhcCBhdCBNQVhfUVVFVUVfREVMSVZFUklFUyAoNDgpIHdoaWNoIGtlZXBzIHRvdGFsIHRpbWUgdW5kZXIgfjRtaW4uXG4gICAgICAgICAgYXdhaXQgc2V0VGltZW91dCg1MDAwLCB1bmRlZmluZWQsIHsgc2lnbmFsOiBjbG9zZVNpZ25hbCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFt3b3JsZC1sb2NhbF0gUXVldWUgbWVzc2FnZSBleGhhdXN0ZWQgc2FmZXR5IGxpbWl0ICgke01BWF9MT0NBTF9TQUZFVFlfTElNSVR9IGF0dGVtcHRzKWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgLi4uKHJ1bklkICYmIHsgcnVuSWQgfSksXG4gICAgICAgICAgICAuLi4oc3RlcElkICYmIHsgc3RlcElkIH0pLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNlbWFwaG9yZS5yZWxlYXNlKCk7XG4gICAgICB9XG4gICAgfSkoKVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIGNsaWVudCBkaXNjb25uZWN0IGVycm9ycyAoZS5nLiwgYnJvd3NlciByZWZyZXNoIGR1cmluZyBzdHJlYW1pbmcpXG4gICAgICAgIC8vIFRoZXNlIGFyZSBleHBlY3RlZCBhbmQgc2hvdWxkIG5vdCBjYXVzZSB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzXG4gICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgZXJyPy5uYW1lID09PSAnQWJvcnRFcnJvcicgfHwgZXJyPy5uYW1lID09PSAnUmVzcG9uc2VBYm9ydGVkJztcbiAgICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNEZXRhY2hlZEFycmF5QnVmZmVyUXVldWVFcnJvcihlcnIpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgW2xvY2FsIHdvcmxkXSBRdWV1ZSBvcGVyYXRpb24gZmFpbGVkOiBkZXRlY3RlZCBcIiR7REVUQUNIRURfQVJSQVlCVUZGRVJfRVJST1J9XCIuIGAgK1xuICAgICAgICAgICAgICAgIFwiVGhpcyB1c3VhbGx5IG1lYW5zIGEgTmV4dC5qcyBwcm94eS9taWRkbGV3YXJlIGNvbnN1bWVkIFdvcmtmbG93J3MgaW50ZXJuYWwgXCIgK1xuICAgICAgICAgICAgICAgICdyZXF1ZXN0IGJlZm9yZSB0aGUgZXhlY3V0b3IgY291bGQgcmVhZCBpdC4gRXhjbHVkZSBgLy53ZWxsLWtub3duL3dvcmtmbG93LypgICcgK1xuICAgICAgICAgICAgICAgIGBmcm9tIHlvdXIgbWF0Y2hlci4gU2VlICR7UFJPWFlfSEFORExFUl9ET0NTX1VSTH1gLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAuLi4ocnVuSWQgJiYgeyBydW5JZCB9KSxcbiAgICAgICAgICAgICAgICAuLi4oc3RlcElkICYmIHsgc3RlcElkIH0pLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXJyb3I6IGVycixcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2xvY2FsIHdvcmxkXSBRdWV1ZSBvcGVyYXRpb24gZmFpbGVkOicsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGNsZWFudXApIHtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7IG1lc3NhZ2VJZCB9O1xuICB9O1xuXG4gIGNvbnN0IEhlYWRlclBhcnNlciA9IHoub2JqZWN0KHtcbiAgICAneC12cXMtcXVldWUtbmFtZSc6IFZhbGlkUXVldWVOYW1lLFxuICAgICd4LXZxcy1tZXNzYWdlLWlkJzogTWVzc2FnZUlkLFxuICAgICd4LXZxcy1tZXNzYWdlLWF0dGVtcHQnOiB6LmNvZXJjZS5udW1iZXIoKSxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRlUXVldWVIYW5kbGVyOiBRdWV1ZVsnY3JlYXRlUXVldWVIYW5kbGVyJ10gPSAocHJlZml4LCBoYW5kbGVyKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChyZXEpID0+IHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBIZWFkZXJQYXJzZXIuc2FmZVBhcnNlKE9iamVjdC5mcm9tRW50cmllcyhyZXEuaGVhZGVycykpO1xuXG4gICAgICBpZiAoIWhlYWRlcnMuc3VjY2VzcyB8fCAhcmVxLmJvZHkpIHtcbiAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3I6ICFyZXEuYm9keVxuICAgICAgICAgICAgICA/ICdNaXNzaW5nIHJlcXVlc3QgYm9keSdcbiAgICAgICAgICAgICAgOiAnTWlzc2luZyByZXF1aXJlZCBoZWFkZXJzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgc3RhdHVzOiA0MDAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWV1ZU5hbWUgPSBoZWFkZXJzLmRhdGFbJ3gtdnFzLXF1ZXVlLW5hbWUnXTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IGhlYWRlcnMuZGF0YVsneC12cXMtbWVzc2FnZS1pZCddO1xuICAgICAgY29uc3QgYXR0ZW1wdCA9IGhlYWRlcnMuZGF0YVsneC12cXMtbWVzc2FnZS1hdHRlbXB0J107XG5cbiAgICAgIGlmICghcXVldWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IGVycm9yOiAnVW5oYW5kbGVkIHF1ZXVlJyB9LCB7IHN0YXR1czogNDAwIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgbmV3IFR5cGVkSnNvblRyYW5zcG9ydCgpLmRlc2VyaWFsaXplKHJlcS5ib2R5KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoYm9keSwgeyBhdHRlbXB0LCBxdWV1ZU5hbWUsIG1lc3NhZ2VJZCB9KTtcblxuICAgICAgICBsZXQgdGltZW91dFNlY29uZHM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdD8udGltZW91dFNlY29uZHMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGltZW91dFNlY29uZHMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHJlc3VsdC50aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgIExPQ0FMX1FVRVVFX01BWF9WSVNJQklMSVRZXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aW1lb3V0U2Vjb25kcyAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oeyB0aW1lb3V0U2Vjb25kcyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKHsgb2s6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihTdHJpbmcoZXJyb3IpLCB7IHN0YXR1czogNTAwIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgZ2V0RGVwbG95bWVudElkOiBRdWV1ZVsnZ2V0RGVwbG95bWVudElkJ10gPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBnZXRQYWNrYWdlSW5mbygpO1xuICAgIHJldHVybiBgZHBsX2xvY2FsQCR7cGFja2FnZUluZm8udmVyc2lvbn1gO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcXVldWUsXG4gICAgY3JlYXRlUXVldWVIYW5kbGVyLFxuICAgIGdldERlcGxveW1lbnRJZCxcbiAgICByZWdpc3RlckhhbmRsZXIocHJlZml4OiBRdWV1ZVByZWZpeCwgaGFuZGxlcjogRGlyZWN0SGFuZGxlcikge1xuICAgICAgZGlyZWN0SGFuZGxlcnMuc2V0KHByZWZpeCwgaGFuZGxlcik7XG4gICAgfSxcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIC8vIElkZW1wb3RlbnQ6IHNodXRkb3duIHBhdGhzIChDTEkgc2lnbmFsIGhhbmRsZXJzLCB0ZXN0IHRlYXJkb3duKVxuICAgICAgLy8gbWF5IGNsb3NlIHRoZSBxdWV1ZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgIGlmIChjbG9zZVNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBjbG9zZUNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGF3YWl0IGh0dHBBZ2VudC5jbG9zZSgpO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUdkLGNBQWMsR0FDZixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCO0lBQ2IsV0FBVyxHQUFHLGtCQUFrQixDQUFDO0lBRTFDLFNBQVMsQ0FBQyxLQUFjO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQWtDO1FBQ2xELE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7UUFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWixNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksSUFBSTtnQkFB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Y0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLO1lBQ1Qsa0VBQWtFO1lBQ2xFLHNDQUFzQztZQUN0QyxJQUFJLFdBQVcsQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFDaEMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNldFRpbWVvdXQgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5pbXBvcnQgdHlwZSB7IFRyYW5zcG9ydCB9IGZyb20gJ0B2ZXJjZWwvcXVldWUnO1xuaW1wb3J0IHtcbiAgTWVzc2FnZUlkLFxuICBwYXJzZVF1ZXVlTmFtZSxcbiAgdHlwZSBRdWV1ZSxcbiAgdHlwZSBRdWV1ZVByZWZpeCxcbiAgVmFsaWRRdWV1ZU5hbWUsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTZW1hIH0gZnJvbSAnYXN5bmMtc2VtYSc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJ3VuZGljaSc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kL3Y0JztcbmltcG9ydCB0eXBlIHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJhc2VVcmwgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBqc29uUmVwbGFjZXIsIGpzb25SZXZpdmVyIH0gZnJvbSAnLi9mcy5qcyc7XG5pbXBvcnQgeyBnZXRQYWNrYWdlSW5mbyB9IGZyb20gJy4vaW5pdC5qcyc7XG5cbi8qKlxuICogSlNPTiB0cmFuc3BvcnQgdGhhdCBwcmVzZXJ2ZXMgVWludDhBcnJheSB2YWx1ZXMgdXNpbmcgdGhlIHNhbWVcbiAqIHJlcGxhY2VyL3Jldml2ZXIgdGhhdCB3b3JsZC1sb2NhbCB1c2VzIGZvciBmaWxlc3lzdGVtIHN0b3JhZ2UuXG4gKiBVaW50OEFycmF5IOKGkiB7IF9fdHlwZTogJ1VpbnQ4QXJyYXknLCBkYXRhOiAnPGJhc2U2ND4nIH0gaW4gSlNPTi5cbiAqL1xuY2xhc3MgVHlwZWRKc29uVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0PHVua25vd24+IHtcbiAgcmVhZG9ubHkgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgc2VyaWFsaXplKHZhbHVlOiB1bmtub3duKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWUsIGpzb25SZXBsYWNlcikpO1xuICB9XG5cbiAgYXN5bmMgZGVzZXJpYWxpemUoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgaWYgKHZhbHVlKSBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0LCBqc29uUmV2aXZlcik7XG4gIH1cbn1cblxuLy8gRm9yIGxvY2FsIHF1ZXVlLCB0aGVyZSBpcyBubyB0ZWNobmljYWwgbGltaXQgb24gdGhlIG1lc3NhZ2UgdmlzaWJpbGl0eSBsaWZlc3Bhbixcbi8vIGJ1dCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMgdG8gc2V0IGEgbWF4IHZpc2liaWxpdHkgbGltaXQuXG5jb25zdCBMT0NBTF9RVUVVRV9NQVhfVklTSUJJTElUWSA9XG4gIHBhcnNlSW50KHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX1FVRVVFX01BWF9WSVNJQklMSVRZID8/ICcwJywgMTApIHx8XG4gIEluZmluaXR5O1xuXG4vLyBNYXhpbXVtIHNhZmUgZGVsYXkgZm9yIHNldFRpbWVvdXQgaW4gTm9kZS5qcyAoMl4zMSAtIDEgbWlsbGlzZWNvbmRzIOKJiCAyNC44NSBkYXlzKVxuLy8gTGFyZ2VyIHZhbHVlcyBjYXVzZSBcIlRpbWVvdXRPdmVyZmxvd1dhcm5pbmc6IFggZG9lcyBub3QgZml0IGludG8gYSAzMi1iaXQgc2lnbmVkIGludGVnZXJcIlxuLy8gV2hlbiB0aGUgY2xhbXBlZCB0aW1lb3V0IGZpcmVzLCB0aGUgaGFuZGxlciB3aWxsIHJlY2FsY3VsYXRlIHJlbWFpbmluZyB0aW1lIGZyb21cbi8vIHBlcnNpc3RlbnQgc3RhdGUgYW5kIHJldHVybiBhbm90aGVyIHRpbWVvdXRTZWNvbmRzIGlmIG5lZWRlZC5cbmNvbnN0IE1BWF9TQUZFX1RJTUVPVVRfTVMgPSAyMTQ3NDgzNjQ3O1xuXG4vLyBUaGUgbG9jYWwgd29ya2VycyBzaGFyZSB0aGUgc2FtZSBOb2RlLmpzIHByb2Nlc3MgYW5kIGV2ZW50IGxvb3AsXG4vLyBzbyB3ZSBuZWVkIHRvIGxpbWl0IGNvbmN1cnJlbmN5IHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtLlxuY29uc3QgREVGQVVMVF9DT05DVVJSRU5DWV9MSU1JVCA9IDEwMDA7XG5jb25zdCBXT1JLRkxPV19MT0NBTF9RVUVVRV9DT05DVVJSRU5DWSA9XG4gIHBhcnNlSW50KHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX1FVRVVFX0NPTkNVUlJFTkNZID8/ICcwJywgMTApIHx8XG4gIERFRkFVTFRfQ09OQ1VSUkVOQ1lfTElNSVQ7XG5cbmV4cG9ydCB0eXBlIERpcmVjdEhhbmRsZXIgPSAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPjtcblxuZXhwb3J0IHR5cGUgTG9jYWxRdWV1ZSA9IFF1ZXVlICYge1xuICAvKiogQ2xvc2UgdGhlIEhUVFAgYWdlbnQgYW5kIHJlbGVhc2UgcmVzb3VyY2VzLiAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKTogdm9pZDtcbn07XG5cbmNvbnN0IERFVEFDSEVEX0FSUkFZQlVGRkVSX0VSUk9SID1cbiAgJ0Nhbm5vdCBwZXJmb3JtIEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZSBvbiBhIGRldGFjaGVkIEFycmF5QnVmZmVyJztcbmNvbnN0IFBST1hZX0hBTkRMRVJfRE9DU19VUkwgPVxuICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvZ2V0dGluZy1zdGFydGVkL25leHQjY29uZmlndXJlLXByb3h5LWhhbmRsZXInO1xuXG5mdW5jdGlvbiBpc0RldGFjaGVkQXJyYXlCdWZmZXJRdWV1ZUVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50ID0gZXJyb3I7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHVua25vd24+KCk7XG5cbiAgd2hpbGUgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmICF2aXNpdGVkLmhhcyhjdXJyZW50KSkge1xuICAgIHZpc2l0ZWQuYWRkKGN1cnJlbnQpO1xuICAgIGlmIChcbiAgICAgICdtZXNzYWdlJyBpbiBjdXJyZW50ICYmXG4gICAgICB0eXBlb2YgY3VycmVudC5tZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgY3VycmVudC5tZXNzYWdlLmluY2x1ZGVzKERFVEFDSEVEX0FSUkFZQlVGRkVSX0VSUk9SKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGN1cnJlbnQgPSAnY2F1c2UnIGluIGN1cnJlbnQgPyBjdXJyZW50LmNhdXNlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRRdWV1ZVJvdXRlKHF1ZXVlTmFtZTogVmFsaWRRdWV1ZU5hbWUpOiB7XG4gIHBhdGhuYW1lOiAnZmxvdycgfCAnc3RlcCc7XG4gIHByZWZpeDogUXVldWVQcmVmaXg7XG59IHtcbiAgY29uc3QgeyBraW5kLCBwcmVmaXggfSA9IHBhcnNlUXVldWVOYW1lKHF1ZXVlTmFtZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZToga2luZCA9PT0gJ3dvcmtmbG93JyA/ICdmbG93JyA6ICdzdGVwJyxcbiAgICBwcmVmaXgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWV1ZShjb25maWc6IFBhcnRpYWw8Q29uZmlnPik6IExvY2FsUXVldWUge1xuICAvLyBDcmVhdGUgYSBjdXN0b20gYWdlbnQgb3B0aW1pemVkIGZvciBoaWdoLWNvbmN1cnJlbmN5IGxvY2FsIHdvcmtmbG93czpcbiAgLy8gLSBoZWFkZXJzVGltZW91dDogMCBhbGxvd3MgbG9uZy1ydW5uaW5nIHN0ZXBzXG4gIC8vIC0gY29ubmVjdGlvbnM6IDEwMDAgYWxsb3dzIG1hbnkgcGFyYWxsZWwgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgaG9zdFxuICAvLyAtIHBpcGVsaW5pbmc6IDEgKGRlZmF1bHQpIGZvciBIVFRQLzEuMSBjb21wYXRpYmlsaXR5XG4gIC8vIC0ga2VlcEFsaXZlVGltZW91dDogMzBzIGtlZXBzIGNvbm5lY3Rpb25zIHdhcm0gZm9yIHJhcGlkIHN0ZXAgZXhlY3V0aW9uXG4gIGNvbnN0IGh0dHBBZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgaGVhZGVyc1RpbWVvdXQ6IDAsXG4gICAgY29ubmVjdGlvbnM6IDEwMDAsXG4gICAga2VlcEFsaXZlVGltZW91dDogMzBfMDAwLFxuICB9KTtcbiAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFR5cGVkSnNvblRyYW5zcG9ydCgpO1xuICBjb25zdCBnZW5lcmF0ZUlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuICBjb25zdCBzZW1hcGhvcmUgPSBuZXcgU2VtYShXT1JLRkxPV19MT0NBTF9RVUVVRV9DT05DVVJSRU5DWSk7XG5cbiAgLy8gQWJvcnRlZCBieSBjbG9zZSgpOiBjYW5jZWxzIGV2ZXJ5IHBlbmRpbmcgc2xlZXAgKGRlbGF5ZWQgZGVsaXZlcmllcyxcbiAgLy8gdGltZW91dFNlY29uZHMgcmUtZGVsaXZlcmllcywgcmV0cnkgYmFja29mZnMpIHNvIHNodXRkb3duIGlzbid0IGhlbGRcbiAgLy8gaG9zdGFnZSBieSBhIHRpbWVyIGFuZCBubyBkZWxpdmVyeSBpcyBhdHRlbXB0ZWQgYWdhaW5zdCB0aGUgY2xvc2VkXG4gIC8vIGFnZW50LiBUaGUgcmVzdWx0aW5nIEFib3J0RXJyb3IgaXMgc2lsZW50bHkgZHJvcHBlZCBieSB0aGVcbiAgLy8gaXNBYm9ydEVycm9yIGNoZWNrIGluIHRoZSBkZWxpdmVyeSBjYXRjaCBoYW5kbGVyLlxuICBjb25zdCBjbG9zZUNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNsb3NlU2lnbmFsID0gY2xvc2VDb250cm9sbGVyLnNpZ25hbDtcblxuICAvKipcbiAgICogaG9sZHMgaW5mbGlnaHQgbWVzc2FnZXMgYnkgaWRlbXBvdGVuY3kga2V5IHRvIGVuc3VyZVxuICAgKiB0aGF0IHdlIGRvbid0IHF1ZXVlIHRoZSBzYW1lIG1lc3NhZ2UgbXVsdGlwbGUgdGltZXNcbiAgICovXG4gIGNvbnN0IGluZmxpZ2h0TWVzc2FnZXMgPSBuZXcgTWFwPHN0cmluZywgTWVzc2FnZUlkPigpO1xuICAvKiogRGlyZWN0IGluLXByb2Nlc3MgaGFuZGxlcnMgYnkgcXVldWUgcHJlZml4LCBieXBhc3NpbmcgSFRUUCB3aGVuIHNldC4gKi9cbiAgY29uc3QgZGlyZWN0SGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgRGlyZWN0SGFuZGxlcj4oKTtcblxuICBjb25zdCBxdWV1ZTogUXVldWVbJ3F1ZXVlJ10gPSBhc3luYyAocXVldWVOYW1lLCBtZXNzYWdlLCBvcHRzKSA9PiB7XG4gICAgY29uc3QgY2xlYW51cCA9IFtdIGFzICgoKSA9PiB2b2lkKVtdO1xuXG4gICAgaWYgKG9wdHM/LmlkZW1wb3RlbmN5S2V5KSB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGluZmxpZ2h0TWVzc2FnZXMuZ2V0KG9wdHMuaWRlbXBvdGVuY3lLZXkpO1xuICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2VJZDogZXhpc3RpbmcgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gdHJhbnNwb3J0LnNlcmlhbGl6ZShtZXNzYWdlKTtcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBwcmVmaXggfSA9IGdldFF1ZXVlUm91dGUocXVldWVOYW1lKTtcbiAgICBjb25zdCBtZXNzYWdlSWQgPSBNZXNzYWdlSWQucGFyc2UoYG1zZ18ke2dlbmVyYXRlSWQoKX1gKTtcblxuICAgIC8vIEV4dHJhY3QgaWRlbnRpZmllcnMgZnJvbSB0aGUgbWVzc2FnZSBmb3Igc3RydWN0dXJlZCBsb2dnaW5nLlxuICAgIC8vIFdvcmtmbG93IG1lc3NhZ2VzIGhhdmUgYHJ1bklkYCwgc3RlcCBtZXNzYWdlcyBoYXZlIGB3b3JrZmxvd1J1bklkYCArIGBzdGVwSWRgLlxuICAgIGNvbnN0IG1zZyA9IG1lc3NhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgcnVuSWQgPSAobXNnLnJ1bklkID8/IG1zZy53b3JrZmxvd1J1bklkID8/IHVuZGVmaW5lZCkgYXNcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGVwSWQgPSAobXNnLnN0ZXBJZCA/PyB1bmRlZmluZWQpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChvcHRzPy5pZGVtcG90ZW5jeUtleSkge1xuICAgICAgY29uc3Qga2V5ID0gb3B0cy5pZGVtcG90ZW5jeUtleTtcbiAgICAgIGluZmxpZ2h0TWVzc2FnZXMuc2V0KGtleSwgbWVzc2FnZUlkKTtcbiAgICAgIGNsZWFudXAucHVzaCgoKSA9PiB7XG4gICAgICAgIGluZmxpZ2h0TWVzc2FnZXMuZGVsZXRlKGtleSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gSG9ub3IgdGhlIGNhbGxlcidzIHJlcXVlc3RlZCBkZWxpdmVyeSBkZWxheSBiZWZvcmUgYWNxdWlyaW5nIGEgcXVldWVcbiAgICAgIC8vIHNsb3QuIFNsZWVwaW5nIG91dHNpZGUgdGhlIHNlbWFwaG9yZSBzbyBhIGRlbGF5ZWQgbWVzc2FnZSBkb2Vzbid0XG4gICAgICAvLyBob2xkIGEgd29ya2VyIGhvc3RhZ2UgZm9yIGl0cyBkZWxheSB3aW5kb3cg4oCUIHRoZSB3b3JrZXIgc2hvdWxkIGJlXG4gICAgICAvLyBmcmVlIHRvIHByb2Nlc3Mgb3RoZXIgKGltbWVkaWF0ZSkgbWVzc2FnZXMgdW50aWwgdGhpcyBvbmUgaXMgcmVhZHkuXG4gICAgICAvLyBWUVMtc2lkZSBxdWV1ZXMgaG9ub3IgZGVsYXlTZWNvbmRzIGF0IHRoZSBicm9rZXIsIHNvIHRoaXMgYnJpbmdzXG4gICAgICAvLyB3b3JsZC1sb2NhbCBpbiBsaW5lIHdpdGggcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgICAgIGlmIChvcHRzPy5kZWxheVNlY29uZHMgJiYgb3B0cy5kZWxheVNlY29uZHMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5TXMgPSBNYXRoLm1pbihvcHRzLmRlbGF5U2Vjb25kcyAqIDEwMDAsIE1BWF9TQUZFX1RJTUVPVVRfTVMpO1xuICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KGRlbGF5TXMsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGNsb3NlU2lnbmFsIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b2tlbiA9IHNlbWFwaG9yZS50cnlBY3F1aXJlKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3dvcmxkLWxvY2FsXTogY29uY3VycmVuY3kgbGltaXQgKCR7V09SS0ZMT1dfTE9DQUxfUVVFVUVfQ09OQ1VSUkVOQ1l9KSByZWFjaGVkLCB3YWl0aW5nIGZvciBxdWV1ZSB0byBmcmVlIHVwYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzZW1hcGhvcmUuYWNxdWlyZSgpO1xuICAgICAgfVxuICAgICAgLy8gU2FmZXR5IGxpbWl0IHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgaW4gdGhlIGxvY2FsIHF1ZXVlLlxuICAgICAgLy8gVGhlIGFjdHVhbCBtYXggZGVsaXZlcnkgZW5mb3JjZW1lbnQgaGFwcGVucyBpbiB0aGUgd29ya2Zsb3cvc3RlcCBoYW5kbGVyc1xuICAgICAgLy8gKGF0IE1BWF9RVUVVRV9ERUxJVkVSSUVTID0gNDgpLCBzbyB0aGlzIGp1c3QgbmVlZHMgdG8gYmUgY29tZm9ydGFibHkgaGlnaGVyLlxuICAgICAgY29uc3QgTUFYX0xPQ0FMX1NBRkVUWV9MSU1JVCA9IDI1NjtcbiAgICAgIC8vIE51bWJlciBvZiB0aW1lcyB0aGUgbWVzc2FnZSBoYXMgYWN0dWFsbHkgcmVhY2hlZCBhIGhhbmRsZXIgKHJldHVybmVkXG4gICAgICAvLyBvaywgYSB0aW1lb3V0U2Vjb25kcyByZS1kZWxpdmVyeSwgb3IgYW4gSFRUUCBlcnJvciByZXNwb25zZSkuIFRoaXMg4oCUXG4gICAgICAvLyBub3QgdGhlIGxvb3AgY291bnRlciDigJQgaXMgdGhlIGF0dGVtcHQgdGhlIGhhbmRsZXIgc2VlcyB2aWFcbiAgICAgIC8vIGB4LXZxcy1tZXNzYWdlLWF0dGVtcHRgLCB3aGljaCBpdCBjb3VudHMgYWdhaW5zdCBNQVhfUVVFVUVfREVMSVZFUklFUy5cbiAgICAgIC8vIFRyYW5zcG9ydC1sZXZlbCBmYWlsdXJlcyAoYmVsb3cpIG5ldmVyIHJlYWNoIHRoZSBoYW5kbGVyLCBzbyB0aGV5IG11c3RcbiAgICAgIC8vIG5vdCBhZHZhbmNlIHRoaXMsIG9yIGEgYnVyc3Qgb2YgXCJmZXRjaCBmYWlsZWRcIi9FVElNRURPVVQgdGltZW91dHMgdW5kZXJcbiAgICAgIC8vIGxvY2FsIGxvYWQgd291bGQgZXhoYXVzdCB0aGUgaGFuZGxlcidzIGRlbGl2ZXJ5IGJ1ZGdldCBiZWZvcmUgaXRzIGZpcnN0XG4gICAgICAvLyByZWFsIGV4ZWN1dGlvbi5cbiAgICAgIGxldCBkZWxpdmVyeSA9IDA7XG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGxldCBsb29wID0gMDsgbG9vcCA8IE1BWF9MT0NBTF9TQUZFVFlfTElNSVQ7IGxvb3ArKykge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAuLi5vcHRzPy5oZWFkZXJzLFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd4LXZxcy1xdWV1ZS1uYW1lJzogcXVldWVOYW1lLFxuICAgICAgICAgICAgJ3gtdnFzLW1lc3NhZ2UtaWQnOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAneC12cXMtbWVzc2FnZS1hdHRlbXB0JzogU3RyaW5nKGRlbGl2ZXJ5ICsgMSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBkaXJlY3RIYW5kbGVyID0gZGlyZWN0SGFuZGxlcnMuZ2V0KHByZWZpeCk7XG4gICAgICAgICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0SGFuZGxlcikge1xuICAgICAgICAgICAgICBjb25zdCByZXEgPSBuZXcgUmVxdWVzdChcbiAgICAgICAgICAgICAgICBgaHR0cDovL2xvY2FsaG9zdC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS8ke3BhdGhuYW1lfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgZGlyZWN0SGFuZGxlcihyZXEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IGF3YWl0IHJlc29sdmVCYXNlVXJsKGNvbmZpZyk7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIHVuZGljaSB2NyBkaXNwYXRjaGVyIHR5cGVzIGRvbid0IG1hdGNoIEB0eXBlcy9ub2RlJ3MgUmVxdWVzdEluaXRcbiAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICBgJHtiYXNlVXJsfS8ud2VsbC1rbm93bi93b3JrZmxvdy92MS8ke3BhdGhuYW1lfWAsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICBkdXBsZXg6ICdoYWxmJyxcbiAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXI6IGh0dHBBZ2VudCxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgIH0gYXMgYW55XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAvLyBUaGUgZGVsaXZlcnkgbmV2ZXIgcmVhY2hlZCB0aGUgaGFuZGxlcjogdW5kaWNpIHRocmV3IGJlZm9yZSBhXG4gICAgICAgICAgICAvLyByZXNwb25zZS4gVW5kZXIgaGVhdnkgbG9jYWwgY29uY3VycmVuY3kgdGhlIHNpbmdsZS1wcm9jZXNzIGRldlxuICAgICAgICAgICAgLy8gc2VydmVyIGNhbid0IGFjY2VwdCBldmVyeSBjb25uZWN0aW9uLCBzbyB1bmRpY2kgcmVwb3J0c1xuICAgICAgICAgICAgLy8gYFR5cGVFcnJvcjogZmV0Y2ggZmFpbGVkYCB3aXRoIGFuIEVUSU1FRE9VVC9FQ09OTlJFU0VUIGNhdXNlLlxuICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRyYW5zaWVudCDigJQgYmFjayBvZmYgYW5kIHJldHJ5IHRoZSAqc2FtZSogZGVsaXZlcnlcbiAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBtZXNzYWdlICh3aGljaCB3b3VsZCBsZWF2ZSB0aGUgc3RlcFxuICAgICAgICAgICAgLy8gbmV2ZXIgc3RhcnRlZCwgd2l0aCBubyByZXRyeSkuIFR3byBmYWlsdXJlcyBhcmUgbm90IHJldHJ5YWJsZTpcbiAgICAgICAgICAgIC8vICAtIHNodXRkb3duOiBjbG9zZSgpIGFib3J0ZWQgdGhlIGFnZW50IC8gdGhlIGJhY2tvZmYgc2xlZXAuXG4gICAgICAgICAgICAvLyAgLSBhIGRldGFjaGVkLUFycmF5QnVmZmVyIHByb3h5IG1pc2NvbmZpZywgd2hpY2ggbmV2ZXIgc3VjY2VlZHMg4oCUXG4gICAgICAgICAgICAvLyAgICByZXRocm93IHNvIHRoZSBvdXRlciBjYXRjaCBzdXJmYWNlcyB0aGUgYWN0aW9uYWJsZSBndWlkYW5jZS5cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9IHwgdW5kZWZpbmVkKT8ubmFtZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY2xvc2VTaWduYWwuYWJvcnRlZCB8fFxuICAgICAgICAgICAgICBuYW1lID09PSAnQWJvcnRFcnJvcicgfHxcbiAgICAgICAgICAgICAgbmFtZSA9PT0gJ1Jlc3BvbnNlQWJvcnRlZCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEZXRhY2hlZEFycmF5QnVmZmVyUXVldWVFcnJvcihlcnIpKSB0aHJvdyBlcnI7XG5cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBbd29ybGQtbG9jYWxdIFF1ZXVlIGRlbGl2ZXJ5IGZhaWxlZCBhdCB0aGUgdHJhbnNwb3J0IChsb29wICR7bG9vcCArIDF9KSwgcmV0cnlpbmdgLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcXVldWVOYW1lLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAuLi4ocnVuSWQgJiYgeyBydW5JZCB9KSxcbiAgICAgICAgICAgICAgICAuLi4oc3RlcElkICYmIHsgc3RlcElkIH0pLFxuICAgICAgICAgICAgICAgIGVycm9yOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHNldFRpbWVvdXQoNTAwMCwgdW5kZWZpbmVkLCB7IHNpZ25hbDogY2xvc2VTaWduYWwgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWxpdmVyeSsrO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTnVtYmVyKEpTT04ucGFyc2UodGV4dCkudGltZW91dFNlY29uZHMpO1xuICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRTZWNvbmRzKSAmJiB0aW1lb3V0U2Vjb25kcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2xhbXAgdG8gTUFYX1NBRkVfVElNRU9VVF9NUyB0byBhdm9pZCBOb2RlLmpzIHNldFRpbWVvdXQgb3ZlcmZsb3cgd2FybmluZy5cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMgZmlyZXMgZWFybHksIHRoZSBoYW5kbGVyIHJlY2FsY3VsYXRlcyByZW1haW5pbmcgdGltZSBmcm9tXG4gICAgICAgICAgICAgICAgLy8gcGVyc2lzdGVudCBzdGF0ZSBhbmQgcmV0dXJucyBhbm90aGVyIHRpbWVvdXRTZWNvbmRzIGlmIG5lZWRlZC5cbiAgICAgICAgICAgICAgICBpZiAodGltZW91dFNlY29uZHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0TXMgPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dFNlY29uZHMgKiAxMDAwLFxuICAgICAgICAgICAgICAgICAgICBNQVhfU0FGRV9USU1FT1VUX01TXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgc2V0VGltZW91dCh0aW1lb3V0TXMsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGNsb3NlU2lnbmFsLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbd29ybGQtbG9jYWxdIFF1ZXVlIG1lc3NhZ2UgZmFpbGVkIChhdHRlbXB0ICR7ZGVsaXZlcnl9LCBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgLi4uKHJ1bklkICYmIHsgcnVuSWQgfSksXG4gICAgICAgICAgICAgIC4uLihzdGVwSWQgJiYgeyBzdGVwSWQgfSksXG4gICAgICAgICAgICAgIGhhbmRsZXJFcnJvcjogdGV4dCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gNXMgbGluZWFyIGJhY2tvZmYgdG8gYXBwcm94aW1hdGUgVlFTIHJldHJ5IHRpbWluZyBpbiBsb2NhbCBkZXYuXG4gICAgICAgICAgLy8gVlFTIHVzZXMgNXMgbGluZWFyIGZvciBhdHRlbXB0cyAx4oCTMzIsIHRoZW4gZXhwb25lbnRpYWwsIGJ1dCBmb3JcbiAgICAgICAgICAvLyBsb2NhbCBkZXYgbGluZWFyIDVzIGlzIHN1ZmZpY2llbnQg4oCUIHRoZSBoYW5kbGVyIGVuZm9yY2VzIHRoZSByZWFsXG4gICAgICAgICAgLy8gY2FwIGF0IE1BWF9RVUVVRV9ERUxJVkVSSUVTICg0OCkgd2hpY2gga2VlcHMgdG90YWwgdGltZSB1bmRlciB+NG1pbi5cbiAgICAgICAgICBhd2FpdCBzZXRUaW1lb3V0KDUwMDAsIHVuZGVmaW5lZCwgeyBzaWduYWw6IGNsb3NlU2lnbmFsIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3dvcmxkLWxvY2FsXSBRdWV1ZSBtZXNzYWdlIGV4aGF1c3RlZCBzYWZldHkgbGltaXQgKCR7TUFYX0xPQ0FMX1NBRkVUWV9MSU1JVH0gYXR0ZW1wdHMpYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgICAuLi4ocnVuSWQgJiYgeyBydW5JZCB9KSxcbiAgICAgICAgICAgIC4uLihzdGVwSWQgJiYgeyBzdGVwSWQgfSksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2VtYXBob3JlLnJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICB9KSgpXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgY2xpZW50IGRpc2Nvbm5lY3QgZXJyb3JzIChlLmcuLCBicm93c2VyIHJlZnJlc2ggZHVyaW5nIHN0cmVhbWluZylcbiAgICAgICAgLy8gVGhlc2UgYXJlIGV4cGVjdGVkIGFuZCBzaG91bGQgbm90IGNhdXNlIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3NcbiAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgICBpZiAoIWlzQWJvcnRFcnJvcikge1xuICAgICAgICAgIGlmIChpc0RldGFjaGVkQXJyYXlCdWZmZXJRdWV1ZUVycm9yKGVycikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBbbG9jYWwgd29ybGRdIFF1ZXVlIG9wZXJhdGlvbiBmYWlsZWQ6IGRldGVjdGVkIFwiJHtERVRBQ0hFRF9BUlJBWUJVRkZFUl9FUlJPUn1cIi4gYCArXG4gICAgICAgICAgICAgICAgXCJUaGlzIHVzdWFsbHkgbWVhbnMgYSBOZXh0LmpzIHByb3h5L21pZGRsZXdhcmUgY29uc3VtZWQgV29ya2Zsb3cncyBpbnRlcm5hbCBcIiArXG4gICAgICAgICAgICAgICAgJ3JlcXVlc3QgYmVmb3JlIHRoZSBleGVjdXRvciBjb3VsZCByZWFkIGl0LiBFeGNsdWRlIGAvLndlbGwta25vd24vd29ya2Zsb3cvKmAgJyArXG4gICAgICAgICAgICAgICAgYGZyb20geW91ciBtYXRjaGVyLiBTZWUgJHtQUk9YWV9IQU5ETEVSX0RPQ1NfVVJMfWAsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBxdWV1ZU5hbWUsXG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgIC4uLihydW5JZCAmJiB7IHJ1bklkIH0pLFxuICAgICAgICAgICAgICAgIC4uLihzdGVwSWQgJiYgeyBzdGVwSWQgfSksXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFcnJvcjogZXJyLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbbG9jYWwgd29ybGRdIFF1ZXVlIG9wZXJhdGlvbiBmYWlsZWQ6JywgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2xlYW51cCkge1xuICAgICAgICAgIGZuKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgbWVzc2FnZUlkIH07XG4gIH07XG5cbiAgY29uc3QgSGVhZGVyUGFyc2VyID0gei5vYmplY3Qoe1xuICAgICd4LXZxcy1xdWV1ZS1uYW1lJzogVmFsaWRRdWV1ZU5hbWUsXG4gICAgJ3gtdnFzLW1lc3NhZ2UtaWQnOiBNZXNzYWdlSWQsXG4gICAgJ3gtdnFzLW1lc3NhZ2UtYXR0ZW1wdCc6IHouY29lcmNlLm51bWJlcigpLFxuICB9KTtcblxuICBjb25zdCBjcmVhdGVRdWV1ZUhhbmRsZXI6IFF1ZXVlWydjcmVhdGVRdWV1ZUhhbmRsZXInXSA9IChwcmVmaXgsIGhhbmRsZXIpID0+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcSkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVycyA9IEhlYWRlclBhcnNlci5zYWZlUGFyc2UoT2JqZWN0LmZyb21FbnRyaWVzKHJlcS5oZWFkZXJzKSk7XG5cbiAgICAgIGlmICghaGVhZGVycy5zdWNjZXNzIHx8ICFyZXEuYm9keSkge1xuICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvcjogIXJlcS5ib2R5XG4gICAgICAgICAgICAgID8gJ01pc3NpbmcgcmVxdWVzdCBib2R5J1xuICAgICAgICAgICAgICA6ICdNaXNzaW5nIHJlcXVpcmVkIGhlYWRlcnMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHF1ZXVlTmFtZSA9IGhlYWRlcnMuZGF0YVsneC12cXMtcXVldWUtbmFtZSddO1xuICAgICAgY29uc3QgbWVzc2FnZUlkID0gaGVhZGVycy5kYXRhWyd4LXZxcy1tZXNzYWdlLWlkJ107XG4gICAgICBjb25zdCBhdHRlbXB0ID0gaGVhZGVycy5kYXRhWyd4LXZxcy1tZXNzYWdlLWF0dGVtcHQnXTtcblxuICAgICAgaWYgKCFxdWV1ZU5hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKHsgZXJyb3I6ICdVbmhhbmRsZWQgcXVldWUnIH0sIHsgc3RhdHVzOiA0MDAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBuZXcgVHlwZWRKc29uVHJhbnNwb3J0KCkuZGVzZXJpYWxpemUocmVxLmJvZHkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihib2R5LCB7IGF0dGVtcHQsIHF1ZXVlTmFtZSwgbWVzc2FnZUlkIH0pO1xuXG4gICAgICAgIGxldCB0aW1lb3V0U2Vjb25kczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0Py50aW1lb3V0U2Vjb25kcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWluKFxuICAgICAgICAgICAgcmVzdWx0LnRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgTE9DQUxfUVVFVUVfTUFYX1ZJU0lCSUxJVFlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVvdXRTZWNvbmRzICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHRpbWVvdXRTZWNvbmRzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oeyBvazogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFN0cmluZyhlcnJvciksIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBnZXREZXBsb3ltZW50SWQ6IFF1ZXVlWydnZXREZXBsb3ltZW50SWQnXSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBwYWNrYWdlSW5mbyA9IGF3YWl0IGdldFBhY2thZ2VJbmZvKCk7XG4gICAgcmV0dXJuIGBkcGxfbG9jYWxAJHtwYWNrYWdlSW5mby52ZXJzaW9ufWA7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBxdWV1ZSxcbiAgICBjcmVhdGVRdWV1ZUhhbmRsZXIsXG4gICAgZ2V0RGVwbG95bWVudElkLFxuICAgIHJlZ2lzdGVySGFuZGxlcihwcmVmaXg6IFF1ZXVlUHJlZml4LCBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyKSB7XG4gICAgICBkaXJlY3RIYW5kbGVycy5zZXQocHJlZml4LCBoYW5kbGVyKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgLy8gSWRlbXBvdGVudDogc2h1dGRvd24gcGF0aHMgKENMSSBzaWduYWwgaGFuZGxlcnMsIHRlc3QgdGVhcmRvd24pXG4gICAgICAvLyBtYXkgY2xvc2UgdGhlIHF1ZXVlIG1vcmUgdGhhbiBvbmNlLlxuICAgICAgaWYgKGNsb3NlU2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGNsb3NlQ29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgYXdhaXQgaHR0cEFnZW50LmNsb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -3,5 +3,8 @@ import type { Storage } from '@workflow/world';
3
3
  * Creates the events storage implementation using the filesystem.
4
4
  * Implements the Storage['events'] interface with create, list, and listByCorrelationId operations.
5
5
  */
6
- export declare function createEventsStorage(basedir: string, tag?: string): Storage['events'];
6
+ export type LocalEventsStorage = Storage['events'] & {
7
+ clearCache(): void;
8
+ };
9
+ export declare function createEventsStorage(basedir: string, tag?: string): LocalEventsStorage;
7
10
  //# sourceMappingURL=events-storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AAsXzB;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,QAAQ,CAAC,CA8oDnB"}
1
+ {"version":3,"file":"events-storage.d.ts","sourceRoot":"","sources":["../../src/storage/events-storage.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAMV,OAAO,EAGR,MAAM,iBAAiB,CAAC;AA8XzB;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG;IACnD,UAAU,IAAI,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,GACX,kBAAkB,CA6vDpB"}