@pipeline-builder/api-server 4.1.4 → 4.1.6

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.
@@ -161,6 +161,14 @@ export function setIdempotencyStore(store) {
161
161
  export function getIdempotencyStore() {
162
162
  return defaultStore;
163
163
  }
164
+ /**
165
+ * Marks a request idempotency has already handled. Route chains are stacked —
166
+ * several `app.use(prefix, ...createAuthenticatedWithOrgRoute(), router)` mounts
167
+ * share a prefix, and a request that falls through the first router runs the
168
+ * next chain's idempotency middleware again. That second pass found its OWN
169
+ * pending reservation and answered 409.
170
+ */
171
+ const IDEMPOTENCY_HANDLED = Symbol('pipeline-builder.idempotency.handled');
164
172
  /**
165
173
  * Middleware that supports idempotency keys for POST/PUT/DELETE mutations.
166
174
  *
@@ -187,6 +195,10 @@ export function idempotencyMiddleware(options = {}) {
187
195
  // Only apply to mutation methods
188
196
  if (!['POST', 'PUT', 'DELETE'].includes(req.method))
189
197
  return next();
198
+ // One pass per request: a later stacked chain must not re-check the key.
199
+ const marked = req;
200
+ if (marked[IDEMPOTENCY_HANDLED])
201
+ return next();
190
202
  // Namespace by orgId to prevent cross-org cache collisions. Prefer the
191
203
  // VERIFIED auth org (`req.user`, populated by requireAuth after signature
192
204
  // verification) over `req.context.identity`, which some services populate
@@ -195,6 +207,7 @@ export function idempotencyMiddleware(options = {}) {
195
207
  const orgId = req.user?.organizationId || req.context?.identity?.orgId;
196
208
  if (!orgId)
197
209
  return next(); // skip idempotency for unauthenticated requests
210
+ marked[IDEMPOTENCY_HANDLED] = true;
198
211
  // Namespace the stored key by (method, route, org, body) so an Idempotency-Key
199
212
  // is scoped to ONE specific endpoint+payload. Reusing a single key across two
200
213
  // routes (e.g. POST /pipelines then POST /plugins) previously replayed the
@@ -336,4 +349,4 @@ export function idempotencyMiddleware(options = {}) {
336
349
  });
337
350
  };
338
351
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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RUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBzZW5kRXJyb3IsIEVycm9yQ29kZSwgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdpZGVtcG90ZW5jeScpO1xuXG4vKipcbiAqIENhbm9uaWNhbCAoa2V5LXNvcnRlZCkgSlNPTiBzZXJpYWxpemF0aW9uIHNvIHRoZSBTQU1FIGxvZ2ljYWwgcGF5bG9hZCBoYXNoZXNcbiAqIGlkZW50aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgcHJvcGVydHkgaW5zZXJ0aW9uIG9yZGVyIOKAlCBhIHBsYWluIGBKU09OLnN0cmluZ2lmeWBcbiAqIHdvdWxkIGxldCBge2EsYn1gIGFuZCBge2IsYX1gIHByb2R1Y2UgZGlmZmVyZW50IGZpbmdlcnByaW50cyBmb3Igb25lIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZVN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpID8/ICdudWxsJztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ1snICsgdmFsdWUubWFwKHN0YWJsZVN0cmluZ2lmeSkuam9pbignLCcpICsgJ10nO1xuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuICd7JyArIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLm1hcCgoaykgPT4gSlNPTi5zdHJpbmdpZnkoaykgKyAnOicgKyBzdGFibGVTdHJpbmdpZnkob2JqW2tdKSkuam9pbignLCcpICsgJ30nO1xufVxuXG4vKipcbiAqIFNob3J0LCBzdGFibGUgZmluZ2VycHJpbnQgb2YgYSByZXF1ZXN0IGJvZHkuIEZvbGRzIHRoZSBwYXlsb2FkIGludG8gdGhlXG4gKiBpZGVtcG90ZW5jeSBrZXkgc28gcmVwbGF5aW5nIHRoZSBTQU1FIGtleSB3aXRoIGEgRElGRkVSRU5UIGJvZHkgaXMgdHJlYXRlZCBhc1xuICogYSBkaXN0aW5jdCBvcGVyYXRpb24gKGZyZXNoIGV4ZWN1dGlvbikgcmF0aGVyIHRoYW4gcmVwbGF5aW5nIHRoZSBvbGQgcmVzcG9uc2UuXG4gKiBFbXB0eS9hYnNlbnQgYm9kaWVzIGNvbGxhcHNlIHRvICctJyBzbyBib2R5LWxlc3MgbXV0YXRpb25zIHN0YXkgdW5hZmZlY3RlZC5cbiAqL1xuZnVuY3Rpb24gYm9keUZpbmdlcnByaW50KGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkIHx8IGJvZHkgPT09IG51bGwpIHJldHVybiAnLSc7XG4gIGlmICh0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoYm9keSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuICctJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHN0YWJsZVN0cmluZ2lmeShib2R5KSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vbi1zZXJpYWxpemFibGUgYm9keSAoZS5nLiBhIHN0cmVhbS9jaXJjdWxhciByZWYpOiBza2lwIGZpbmdlcnByaW50aW5nXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFpbCB0aGUgcmVxdWVzdCDigJQga2V5IHN0YXlzIHNjb3BlZCBieSBtZXRob2Qrcm91dGUrb3JnLlxuICAgIHJldHVybiAnLSc7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhY2hlZEVudHJ5IHtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBib2R5OiB1bmtub3duO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgLyoqIFJlc2VydmF0aW9uIHBsYWNlaG9sZGVyOiB0aGUgcmVxdWVzdCBpcyBpbi1mbGlnaHQsIG5vIHJlYWwgcmVzcG9uc2UgeWV0LlxuICAgKiAgQSBkdXBsaWNhdGUgdGhhdCBzZWVzIGEgcGVuZGluZyBlbnRyeSBpcyByZWplY3RlZCB3aXRoIDQwOSwgbm90IHJlcGxheWVkLiAqL1xuICBwZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQbHVnZ2FibGUgYmFja2VuZCBmb3IgaWRlbXBvdGVuY3kta2V5IHJlcGxheSBjYWNoZS4gVGhlIGRlZmF1bHQgaW4tbWVtb3J5XG4gKiBpbXBsZW1lbnRhdGlvbiB3b3JrcyBmaW5lIHNpbmdsZS1yZXBsaWNhOyBhIFJlZGlzLWJhY2tlZCBpbXBsZW1lbnRhdGlvblxuICogaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgZGVkdXBsaWNhdGlvbiBhY3Jvc3MgaG9yaXpvbnRhbGx5LXNjYWxlZCByZXBsaWNhc1xuICogKG90aGVyd2lzZSB0d28gcmVwbGljYXMgYmVoaW5kIGEgbG9hZC1iYWxhbmNlciBjYWNoZSBpbmRlcGVuZGVudGx5IGFuZCBhXG4gKiByZXRyeSBoaXR0aW5nIGEgZGlmZmVyZW50IHBvZCB3b24ndCByZXBsYXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW1wb3RlbmN5U3RvcmUge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPENhY2hlZEVudHJ5IHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgZW50cnk6IENhY2hlZEVudHJ5LCB0dGxTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogQXRvbWljYWxseSBjbGFpbSBga2V5YCBJRkYgaXQgaXMgY3VycmVudGx5IGFic2VudC4gUmV0dXJucyBgdHJ1ZWAgd2hlbiBUSElTXG4gICAqIGNhbGxlciBzZXQgdGhlIGVudHJ5ICh3b24gdGhlIHJhY2UpLCBgZmFsc2VgIHdoZW4gYW4gZW50cnkgYWxyZWFkeSBleGlzdHMuXG4gICAqIFRoaXMgaXMgd2hhdCBzZXJpYWxpemVzIGNvbmN1cnJlbnQgZmlyc3QtdGltZSByZXF1ZXN0cyB0aGF0IHNoYXJlIGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSDigJQgYSBwbGFpbiBnZXQtdGhlbi1zZXQgbGVhdmVzIGEgd2luZG93IHdoZXJlIHR3byByZXF1ZXN0c1xuICAgKiBib3RoIHNlZSBcIm5vdCBjYWNoZWRcIiBhbmQgYm90aCBleGVjdXRlIHRoZSBtdXRhdGlvbi5cbiAgICovXG4gIHJlc2VydmUoa2V5OiBzdHJpbmcsIGVudHJ5OiBDYWNoZWRFbnRyeSwgdHRsU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlbW92ZSBhIGtleSDigJQgcmVsZWFzZXMgYSByZXNlcnZhdGlvbiBhZnRlciBhIG5vbi1jYWNoZWFibGUgKG5vbi0yeHgpIHJlc3BvbnNlLiAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogRGVmYXVsdCBpbi1tZW1vcnkgc3RvcmUuIFNpbmdsZS1yZXBsaWNhIG9ubHkuIEV4cG9ydGVkIGZvciB0ZXN0aW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkRW50cnk+KCk7XG4gIGNvbnN0IGNsZWFudXBUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG1hcCkge1xuICAgICAgaWYgKG5vdyA+IHYuZXhwaXJlc0F0KSBtYXAuZGVsZXRlKGspO1xuICAgIH1cbiAgfSwgQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9DTEVBTlVQX0lOVEVSVkFMX01TKTtcbiAgY2xlYW51cFRpbWVyLnVucmVmKCk7XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSAobm9uLWV4cGlyZWQpIGVudHJ5LCBldmljdGluZyBpdCBsYXppbHkgaWYgZXhwaXJlZC4gKi9cbiAgY29uc3QgbGl2ZSA9IChrZXk6IHN0cmluZyk6IENhY2hlZEVudHJ5IHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBtYXAuZ2V0KGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH07XG4gIC8qKlxuICAgKiBBdCBjYXBhY2l0eSwgZXZpY3QgdGhlIE9MREVTVCBlbnRyeSAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpIHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBORVcga2V5IOKAlCBvdGhlcndpc2UsIG9uY2UgZnVsbCwgdGhlIHN0b3JlIHN0b3BzXG4gICAqIGRlZHVwbGljYXRpbmcgZnJlc2ggcmVxdWVzdHMgdW50aWwgdGhlIFRUTCBzd2VlcCBydW5zLiBTdGF5cyBib3VuZGVkOyBmYXZvcnNcbiAgICogcmVjZW50IGtleXMgKG1vc3QgbGlrZWx5IHRvIGJlIHJldHJpZWQpLlxuICAgKi9cbiAgY29uc3QgZXZpY3RJZkZ1bGwgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoIW1hcC5oYXMoa2V5KSAmJiBtYXAuc2l6ZSA+PSBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX01BWF9TVE9SRV9TSVpFKSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSBtYXAua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgbWFwLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gbGl2ZShrZXkpO1xuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleSwgZW50cnkpIHtcbiAgICAgIGV2aWN0SWZGdWxsKGtleSk7XG4gICAgICBtYXAuc2V0KGtleSwgZW50cnkpO1xuICAgIH0sXG4gICAgYXN5bmMgcmVzZXJ2ZShrZXksIGVudHJ5KSB7XG4gICAgICAvLyBBdG9taWMgaW4gYSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZTogbm8gYXdhaXQgYmV0d2VlbiB0aGUgbGl2ZW5lc3MgY2hlY2tcbiAgICAgIC8vIGFuZCB0aGUgc2V0LCBzbyB0d28gY29uY3VycmVudCBjYWxsZXJzIGNhbid0IGJvdGggb2JzZXJ2ZSBcImFic2VudFwiLlxuICAgICAgaWYgKGxpdmUoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZXZpY3RJZkZ1bGwoa2V5KTtcbiAgICAgIG1hcC5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGFzeW5jIGRlbGV0ZShrZXkpIHtcbiAgICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMgc3VyZmFjZSB0aGUgaWRlbXBvdGVuY3kgc3RvcmUgbmVlZHMgKGFuIGlvcmVkaXMgc3Vic2V0KS5cbiAqIGBzZXRgIHN1cHBvcnRzIHRoZSB2YXJpYWRpYyBvcHRpb24gdGFpbDogYFNFVCBrZXkgdmFsIEVYIDx0dGw+IFtOWF1gLCB3aGljaFxuICogcmV0dXJucyBgJ09LJ2Agb24gc3VjY2VzcyBhbmQgYG51bGxgIHdoZW4gYW4gYE5YYCBzZXQgd2FzIHJlZnVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNJZGVtcG90ZW5jeUNsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgUkVESVNfS0VZX1BSRUZJWCA9ICdpZGVtOic7XG5cbi8qKlxuICogUmVkaXMtYmFja2VkIHtAbGluayBJZGVtcG90ZW5jeVN0b3JlfSBmb3IgY29ycmVjdCBkZWR1cGxpY2F0aW9uIGFjcm9zc1xuICogaG9yaXpvbnRhbGx5LXNjYWxlZCByZXBsaWNhcy4gYHJlc2VydmVgIG1hcHMgdG8gYW4gYXRvbWljIGBTRVQg4oCmIE5YYCBzbyB0d29cbiAqIHBvZHMgYmVoaW5kIGEgbG9hZC1iYWxhbmNlciBjYW4ndCBib3RoIHdpbiBhIGZpcnN0LXRpbWUgcmVxdWVzdCBzaGFyaW5nIGFuXG4gKiBJZGVtcG90ZW5jeS1LZXk7IGEgcmV0cnkgbGFuZGluZyBvbiBBTlkgcG9kIHNlZXMgdGhlIHNhbWUgY29tbWl0dGVkIHJlc3BvbnNlLlxuICogUmVkaXMgVFRMIG93bnMgZXhwaXJ5ICh0aGUgYENhY2hlZEVudHJ5LmV4cGlyZXNBdGAgZmllbGQgaXMgY2FycmllZCBvbmx5IGZvclxuICogQVBJLXNoYXBlIHBhcml0eSB3aXRoIHRoZSBtZW1vcnkgc3RvcmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNJZGVtcG90ZW5jeVN0b3JlKHJlZGlzOiBSZWRpc0lkZW1wb3RlbmN5Q2xpZW50KTogSWRlbXBvdGVuY3lTdG9yZSB7XG4gIGNvbnN0IGsgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT4gYCR7UkVESVNfS0VZX1BSRUZJWH0ke2tleX1gO1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmdldChrKGtleSkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZWRFbnRyeTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb3JydXB0IGVudHJ5IOKGkiB0cmVhdCBhcyBhYnNlbnQgc28gdGhlIHJlcXVlc3QgcHJvY2VlZHMgZnJlc2guXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleSwgZW50cnksIHR0bFNlY29uZHMpIHtcbiAgICAgIGF3YWl0IHJlZGlzLnNldChrKGtleSksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSwgJ0VYJywgTWF0aC5tYXgoMSwgdHRsU2Vjb25kcykpO1xuICAgIH0sXG4gICAgYXN5bmMgcmVzZXJ2ZShrZXksIGVudHJ5LCB0dGxTZWNvbmRzKSB7XG4gICAgICAvLyBBdG9taWMgY2xhaW06IFNFVCBrZXkgdmFsIEVYIHR0bCBOWCDihpIgJ09LJyBvbmx5IGlmIHRoZSBrZXkgd2FzIGFic2VudC5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlZGlzLnNldChrKGtleSksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSwgJ0VYJywgTWF0aC5tYXgoMSwgdHRsU2Vjb25kcyksICdOWCcpO1xuICAgICAgcmV0dXJuIHJlcyA9PT0gJ09LJztcbiAgICB9LFxuICAgIGFzeW5jIGRlbGV0ZShrZXkpIHtcbiAgICAgIGF3YWl0IHJlZGlzLmRlbChrKGtleSkpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBSZWRpcy1iYWNrZWQgaWRlbXBvdGVuY3kgc3RvcmUgZnJvbSB0aGUgc2hhcmVkIGVudiBSZWRpcyAodGhlIHNhbWVcbiAqIGBSRURJU19VUkxgIC8gYFJFRElTX1NFTlRJTkVMU2Agd2lyaW5nIHRoZSByYXRlLWxpbWl0ZXIgYW5kIGF1ZGl0LXNwb29sIHVzZSkuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQvYXZhaWxhYmxlIHNvIHRoZSBjYWxsZXIga2VlcHMgdGhlXG4gKiBpbi1tZW1vcnkgZGVmYXVsdCAoc2luZ2xlLXJlcGxpY2EgY29ycmVjdG5lc3MpLiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUoKTogSWRlbXBvdGVuY3lTdG9yZSB8IG51bGwge1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc0lkZW1wb3RlbmN5Q2xpZW50PignaWRlbXBvdGVuY3knKTtcbiAgaWYgKCFjbGllbnQpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgaWRlbXBvdGVuY3kgc3RvcmUgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzSWRlbXBvdGVuY3lTdG9yZShjbGllbnQpO1xufVxuXG5jb25zdCBtZW1vcnlTdG9yZSA9IGNyZWF0ZU1lbW9yeVN0b3JlKCk7XG5cbi8qKlxuICogUHJvY2Vzcy13aWRlIGRlZmF1bHQgc3RvcmUgdXNlZCBieSBgaWRlbXBvdGVuY3lNaWRkbGV3YXJlKClgIHdoZW4gbm8gZXhwbGljaXRcbiAqIGBzdG9yZWAgaXMgcGFzc2VkLiBEZWZhdWx0cyB0byB0aGUgaW4tbWVtb3J5IHN0b3JlOyBgY3JlYXRlQXBwYCBwcm9tb3RlcyBpdCB0b1xuICogdGhlIHNoYXJlZCBlbnYtUmVkaXMgc3RvcmUgKG11bHRpLXJlcGxpY2EgZGVkdXApIGF0IHN0YXJ0dXAgdmlhXG4gKiB7QGxpbmsgc2V0SWRlbXBvdGVuY3lTdG9yZX0uIFRoZSByb3V0ZSBmYWN0b3JpZXMga2VlcCBjYWxsaW5nXG4gKiBgaWRlbXBvdGVuY3lNaWRkbGV3YXJlKClgIHdpdGggbm8gYXJncyBhbmQgdHJhbnNwYXJlbnRseSBwaWNrIHRoaXMgdXAuXG4gKi9cbmxldCBkZWZhdWx0U3RvcmU6IElkZW1wb3RlbmN5U3RvcmUgPSBtZW1vcnlTdG9yZTtcblxuLyoqIEluamVjdCB0aGUgcHJvY2Vzcy13aWRlIGlkZW1wb3RlbmN5IHN0b3JlIChlLmcuIGEgUmVkaXMtYmFja2VkIG9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SWRlbXBvdGVuY3lTdG9yZShzdG9yZTogSWRlbXBvdGVuY3lTdG9yZSk6IHZvaWQge1xuICBkZWZhdWx0U3RvcmUgPSBzdG9yZTtcbn1cblxuLyoqIFRoZSBjdXJyZW50IHByb2Nlc3Mtd2lkZSBkZWZhdWx0IHN0b3JlIChpbi1tZW1vcnkgdW5sZXNzIG92ZXJyaWRkZW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW1wb3RlbmN5U3RvcmUoKTogSWRlbXBvdGVuY3lTdG9yZSB7XG4gIHJldHVybiBkZWZhdWx0U3RvcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbXBvdGVuY3lNaWRkbGV3YXJlT3B0aW9ucyB7XG4gIC8qKiBDdXN0b20gc3RvcmUgYmFja2VuZC4gRGVmYXVsdHMgdG8gdGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSBzZXQgdmlhXG4gICAqICB7QGxpbmsgc2V0SWRlbXBvdGVuY3lTdG9yZX0gKGluLW1lbW9yeSB1bnRpbCBgY3JlYXRlQXBwYCB3aXJlcyBSZWRpcykuICovXG4gIHN0b3JlPzogSWRlbXBvdGVuY3lTdG9yZTtcbn1cblxuLyoqXG4gKiBNaWRkbGV3YXJlIHRoYXQgc3VwcG9ydHMgaWRlbXBvdGVuY3kga2V5cyBmb3IgUE9TVC9QVVQvREVMRVRFIG11dGF0aW9ucy5cbiAqXG4gKiBXaGVuIGEgcmVxdWVzdCBpbmNsdWRlcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyOlxuICogLSBGaXJzdCBjYWxsOiBwcm9jZXNzZXMgbm9ybWFsbHksIGNhY2hlcyB0aGUgcmVzcG9uc2VcbiAqIC0gU3Vic2VxdWVudCBjYWxscyB3aXRoIHNhbWUga2V5OiByZXR1cm5zIGNhY2hlZCByZXNwb25zZSAocHJldmVudHMgZHVwbGljYXRlIG11dGF0aW9ucylcbiAqXG4gKiBEZWZhdWx0cyB0byBhbiBpbi1tZW1vcnkgc3RvcmUgKHNpbmdsZS1yZXBsaWNhKS4gUGFzcyBhIGN1c3RvbVxuICogY3Jvc3MtcmVwbGljYSBgeyBzdG9yZSB9YCBpbXBsZW1lbnRpbmcgYElkZW1wb3RlbmN5U3RvcmVgIHRvIGRlZHVwZSBhY3Jvc3NcbiAqIHJlcGxpY2FzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbXBvdGVuY3lNaWRkbGV3YXJlKG9wdGlvbnM6IElkZW1wb3RlbmN5TWlkZGxld2FyZU9wdGlvbnMgPSB7fSkge1xuICAvLyBSZXNvbHZlIHRoZSBzdG9yZSBQRVIgUkVRVUVTVCAobm90IGF0IGZhY3RvcnkgdGltZSkgc28gYSBzdG9yZSBpbmplY3RlZCBieVxuICAvLyBjcmVhdGVBcHAgQUZURVIgdGhlIHJvdXRlIGNoYWlucyBhcmUgYnVpbHQgc3RpbGwgdGFrZXMgZWZmZWN0LiBBbiBleHBsaWNpdFxuICAvLyBgb3B0aW9ucy5zdG9yZWAgYWx3YXlzIHdpbnMuXG4gIGNvbnN0IGV4cGxpY2l0U3RvcmUgPSBvcHRpb25zLnN0b3JlO1xuICBjb25zdCB0dGxNcyA9IENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfVFRMX01TO1xuICBjb25zdCB0dGxTZWMgPSBNYXRoLmZsb29yKHR0bE1zIC8gMTAwMCk7XG5cbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gZXhwbGljaXRTdG9yZSA/PyBkZWZhdWx0U3RvcmU7XG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIE9ubHkgYXBwbHkgdG8gbXV0YXRpb24gbWV0aG9kc1xuICAgIGlmICghWydQT1NUJywgJ1BVVCcsICdERUxFVEUnXS5pbmNsdWRlcyhyZXEubWV0aG9kKSkgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIE5hbWVzcGFjZSBieSBvcmdJZCB0byBwcmV2ZW50IGNyb3NzLW9yZyBjYWNoZSBjb2xsaXNpb25zLiBQcmVmZXIgdGhlXG4gICAgLy8gVkVSSUZJRUQgYXV0aCBvcmcgKGByZXEudXNlcmAsIHBvcHVsYXRlZCBieSByZXF1aXJlQXV0aCBhZnRlciBzaWduYXR1cmVcbiAgICAvLyB2ZXJpZmljYXRpb24pIG92ZXIgYHJlcS5jb250ZXh0LmlkZW50aXR5YCwgd2hpY2ggc29tZSBzZXJ2aWNlcyBwb3B1bGF0ZVxuICAgIC8vIHByZS1hdXRoIGZyb20gYW4gVU5WRVJJRklFRCB0b2tlbiBwZWVrIOKAlCBuYW1lc3BhY2luZyBhIG11dGF0aW9uJ3MgcmVwbGF5XG4gICAgLy8gY2FjaGUgb24gYW4gdW52ZXJpZmllZCwgY2FsbGVyLWluZmx1ZW5jZWQgb3JnIGlkIHdvdWxkIGJlIHVuc2FmZS5cbiAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCB8fCByZXEuY29udGV4dD8uaWRlbnRpdHk/Lm9yZ0lkO1xuICAgIGlmICghb3JnSWQpIHJldHVybiBuZXh0KCk7IC8vIHNraXAgaWRlbXBvdGVuY3kgZm9yIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0c1xuXG4gICAgLy8gTmFtZXNwYWNlIHRoZSBzdG9yZWQga2V5IGJ5IChtZXRob2QsIHJvdXRlLCBvcmcsIGJvZHkpIHNvIGFuIElkZW1wb3RlbmN5LUtleVxuICAgIC8vIGlzIHNjb3BlZCB0byBPTkUgc3BlY2lmaWMgZW5kcG9pbnQrcGF5bG9hZC4gUmV1c2luZyBhIHNpbmdsZSBrZXkgYWNyb3NzIHR3b1xuICAgIC8vIHJvdXRlcyAoZS5nLiBQT1NUIC9waXBlbGluZXMgdGhlbiBQT1NUIC9wbHVnaW5zKSBwcmV2aW91c2x5IHJlcGxheWVkIHRoZVxuICAgIC8vIGZpcnN0IGVuZHBvaW50J3MgMnh4IGZvciB0aGUgc2Vjb25kIOKAlCB0aGUgc3RvcmUgaXMgYSBtb2R1bGUtbGV2ZWwgc2luZ2xldG9uXG4gICAgLy8gc2hhcmVkIGJ5IGV2ZXJ5IHJvdXRlLiBGb2xkaW5nIGluIG1ldGhvZCArIHJvdXRlIHBhdGggKyBhIGJvZHkgZmluZ2VycHJpbnRcbiAgICAvLyBvbmx5IG1ha2VzIGtleXMgTU9SRSBzcGVjaWZpYywgc28gdGhlcmUgaXMgbm8gY3Jvc3MtY29udGFtaW5hdGlvbiByaXNrLlxuICAgIC8vIEFsc28gbmFtZXNwYWNlIGJ5IHRoZSBWRVJJRklFRCB1c2VyLiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBjaG9zZW4gYnkgdGhlXG4gICAgLy8gY2xpZW50LCBzbyB0d28gdXNlcnMgaW4gdGhlIHNhbWUgb3JnIHNlbmRpbmcgdGhlIHNhbWUgYm9keSB3aXRoIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvbGxpZGVkOiB0aGUgc2Vjb25kIHVzZXIncyBtdXRhdGlvbiB3YXMgU0tJUFBFRCBhbmQgdGhleSB3ZXJlIHNlcnZlZFxuICAgIC8vIHRoZSBmaXJzdCB1c2VyJ3MgY2FjaGVkIHJlc3BvbnNlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmcgYWxvbmUgb25seSB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gdmVyaWZpZWQgc3ViamVjdCAoc2VydmljZSBwcmluY2lwYWxzIGNhcnJ5IG9uZSkuXG4gICAgY29uc3Qgc3ViID0gcmVxLnVzZXI/LnN1YjtcbiAgICBjb25zdCByb3V0ZVBhdGggPSAocmVxLmJhc2VVcmwgPz8gJycpICsgKHJlcS5yb3V0ZT8ucGF0aCA/PyByZXEucGF0aCA/PyAnJyk7XG4gICAgY29uc3QgZnVsbEtleSA9IGAke3JlcS5tZXRob2R9OiR7cm91dGVQYXRofToke29yZ0lkfToke3N1YiA/PyAnLSd9OiR7Ym9keUZpbmdlcnByaW50KHJlcS5ib2R5KX06JHtrZXl9YDtcblxuICAgIC8qKiBSZWplY3QgYSBkdXBsaWNhdGUgd2hvc2Ugb3JpZ2luYWwgaXMgc3RpbGwgaW4tZmxpZ2h0LiAqL1xuICAgIGNvbnN0IHNlbmRJblByb2dyZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcmVzLnNldEhlYWRlcignUmV0cnktQWZ0ZXInLCAnMScpO1xuICAgICAgc2VuZEVycm9yKHJlcywgNDA5LCAnQSByZXF1ZXN0IHdpdGggdGhpcyBJZGVtcG90ZW5jeS1LZXkgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQnLCBFcnJvckNvZGUuQ09ORkxJQ1QpO1xuICAgIH07XG5cbiAgICBzdG9yZS5nZXQoZnVsbEtleSkudGhlbihhc3luYyAoY2FjaGVkKSA9PiB7XG4gICAgICBpZiAoY2FjaGVkICYmICFjYWNoZWQucGVuZGluZykge1xuICAgICAgICAvLyBDb21wbGV0ZWQgcmVzcG9uc2Ugb24gcmVjb3JkIOKGkiByZXBsYXkgaXQuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlcGxheWVkJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoJ1gtSWRlbXBvdGVudC1SZXBsYXllZCcsICd0cnVlJyk7XG4gICAgICAgIHJlcy5zdGF0dXMoY2FjaGVkLnN0YXR1c0NvZGUpLmpzb24oY2FjaGVkLmJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5wZW5kaW5nKSB7XG4gICAgICAgIC8vIFRoZSBvcmlnaW5hbCBpcyBzdGlsbCBydW5uaW5nIOKAlCBkb24ndCBydW4gdGhlIG11dGF0aW9uIGEgc2Vjb25kIHRpbWUuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlamVjdGVkIChpbiBwcm9ncmVzcyknLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmV0dXJuIHNlbmRJblByb2dyZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0b21pY2FsbHkgcmVzZXJ2ZSB0aGUga2V5LiBMb3NpbmcgdGhpcyByYWNlIG1lYW5zIGEgY29uY3VycmVudCByZXF1ZXN0XG4gICAgICAvLyB3aXRoIHRoZSBzYW1lIGtleSBnb3QgdGhlcmUgZmlyc3QgYW5kIGlzIGluLWZsaWdodCDihpIgNDA5LlxuICAgICAgY29uc3Qgd29uID0gYXdhaXQgc3RvcmUucmVzZXJ2ZShcbiAgICAgICAgZnVsbEtleSxcbiAgICAgICAgeyBzdGF0dXNDb2RlOiAwLCBib2R5OiBudWxsLCBwZW5kaW5nOiB0cnVlLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9LFxuICAgICAgICB0dGxTZWMsXG4gICAgICApO1xuICAgICAgaWYgKCF3b24pIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVqZWN0ZWQgKGxvc3QgcmVzZXJ2ZSByYWNlKScsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXR1cm4gc2VuZEluUHJvZ3Jlc3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb3duIHRoZSByZXNlcnZhdGlvbi4gSXQgTVVTVCBiZSByZXNvbHZlZCBleGFjdGx5IG9uY2Ug4oCUIGVpdGhlciB0aGVcbiAgICAgIC8vIHJlYWwgMnh4IHJlc3BvbnNlIGlzIGNhY2hlZCBmb3IgcmVwbGF5LCBvciB0aGUgcmVzZXJ2YXRpb24gaXMgcmVsZWFzZWQgc29cbiAgICAgIC8vIGEgcmV0cnkgY2FuIHByb2NlZWQuIGBzZXR0bGVkYCBndWFyZHMgYWdhaW5zdCBhIGRvdWJsZS1yZXNvbHZlLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjYXB0dXJlZEJvZHk6IHVua25vd247XG4gICAgICBsZXQgYm9keUNhcHR1cmVkID0gZmFsc2U7XG5cbiAgICAgIC8qKiBSZW1lbWJlciB0aGUgcmVzcG9uc2UgYm9keSBmb3IgcmVwbGF5IChmaXJzdCBjYXB0dXJlIHdpbnMpLiAqL1xuICAgICAgY29uc3QgY2FwdHVyZUJvZHkgPSAoYm9keTogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWJvZHlDYXB0dXJlZCkge1xuICAgICAgICAgIGNhcHR1cmVkQm9keSA9IGJvZHk7XG4gICAgICAgICAgYm9keUNhcHR1cmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVsZWFzZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHN0b3JlLmRlbGV0ZShmdWxsS2V5KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHJlc2VydmF0aW9uIHJlbGVhc2UgZmFpbGVkJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgY2FjaGVTdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgc3RvcmUuc2V0KGZ1bGxLZXksIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgICBib2R5OiBib2R5Q2FwdHVyZWQgPyBjYXB0dXJlZEJvZHkgOiBudWxsLFxuICAgICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zLFxuICAgICAgICB9LCB0dGxTZWMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgc3RvcmUuc2V0IGZhaWxlZCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8qKiBSZXNvbHZlIHRoZSByZXNlcnZhdGlvbiBmcm9tIHRoZSBBQ1RVQUwgZmluYWwgc3RhdHVzOiBjYWNoZSAyeHgsIGVsc2UgcmVsZWFzZS4gKi9cbiAgICAgIGNvbnN0IHNldHRsZUZyb21TdGF0dXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDApIGNhY2hlU3VjY2VzcygpO1xuICAgICAgICBlbHNlIHJlbGVhc2UoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogcmVzLmpzb24gaXMgdGhlIGNvbW1vbiBjb21wbGV0aW9uLiBDYXB0dXJlIHRoZSBib2R5IGFuZCBzZXR0bGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IG9mZiB0aGUgc3RhdHVzIHNldCBieSByZXMuc3RhdHVzKC4uLikuanNvbiguLi4pLlxuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uID0gcmVzLmpzb24uYmluZChyZXMpO1xuICAgICAgcmVzLmpzb24gPSAoYm9keTogdW5rbm93bikgPT4ge1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdYLUlkZW1wb3RlbnQtUmVwbGF5ZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgY2FwdHVyZUJvZHkoYm9keSk7XG4gICAgICAgIHNldHRsZUZyb21TdGF0dXMoKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsSnNvbihib2R5KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEJvZHktY2FwdHVyZSBiYWNrc3RvcHMgZm9yIGNvbXBsZXRpb25zIHRoYXQgYnlwYXNzIHJlcy5qc29uXG4gICAgICAvLyAocmVzLnNlbmQgLyByZXMuZW5kIC8gcmVzLnNlbmRGaWxlIOKGkiByZXMuZW5kKS4gVGhlc2Ugb25seSBSRUNPUkQgdGhlIGJvZHk7XG4gICAgICAvLyB0aGUgYWN0dWFsIHNldHRsZSBoYXBwZW5zIG9uIGBmaW5pc2hgIGZyb20gdGhlIHJlYWwgc3RhdHVzIGNvZGUuIEZpcnN0XG4gICAgICAvLyBjYXB0dXJlIHdpbnMsIHNvIHJlcy5qc29uJ3MgYm9keSBpcyBuZXZlciBjbG9iYmVyZWQgYnkgaXRzIGludGVybmFsXG4gICAgICAvLyByZXMuc2VuZC9yZXMuZW5kIGNhbGxzLlxuICAgICAgY29uc3QgcGF0Y2hlZCA9IHJlcyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgc2VuZD86IChib2R5PzogdW5rbm93bikgPT4gdW5rbm93bjtcbiAgICAgICAgZW5kPzogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgY2I6ICgpID0+IHZvaWQpID0+IHVua25vd247XG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLnNlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTZW5kID0gcGF0Y2hlZC5zZW5kLmJpbmQocmVzKTtcbiAgICAgICAgcGF0Y2hlZC5zZW5kID0gKGJvZHk/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgY2FwdHVyZUJvZHkoYm9keSk7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2VuZChib2R5KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5lbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBwYXRjaGVkLmVuZC5iaW5kKHJlcyk7XG4gICAgICAgIHBhdGNoZWQuZW5kID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gYXJnc1swXTtcbiAgICAgICAgICBpZiAoY2h1bmsgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2h1bmsgIT09ICdmdW5jdGlvbicpIGNhcHR1cmVCb2R5KGNodW5rKTtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxFbmQoLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEJhY2tzdG9wIGZvciBBTlkgY29tcGxldGlvbiBwYXRoIOKAlCBpbmNsdWRpbmcgYSAyeHggdGhhdCBmaW5pc2hlZCB2aWFcbiAgICAgIC8vIHJlcy5zZW5kL3Jlcy5lbmQvcmVzLnNlbmRGaWxlLzIwNCBhbmQgbmV2ZXIgaGl0IHRoZSBwYXRjaGVkIHJlcy5qc29uLlxuICAgICAgLy8gRGVjaWRpbmcgb24gdGhlIHJlYWwgZmluYWwgc3RhdHVzIGhlcmUgbWVhbnMgYSBzdWNjZXNzZnVsIG9wIGlzIGNhY2hlZFxuICAgICAgLy8gKG9yIGEgZmFpbGVkIG9uZSByZWxlYXNlZCkgaW5zdGVhZCBvZiBzdHJhbmRpbmcgdGhlIHJlc2VydmF0aW9uIGFuZFxuICAgICAgLy8gNDA5LWluZyBldmVyeSByZXRyeSBmb3IgdGhlIGZ1bGwgVFRMLiBHdWFyZGVkIOKAlCB0ZXN0IGRvdWJsZXMgbWF5IG5vdCBiZVxuICAgICAgLy8gRXZlbnRFbWl0dGVyczsgcmVzLmpzb24ncyBmYXN0IHBhdGggYWxyZWFkeSBzZXR0bGVkIHRoZSBjb21tb24gY2FzZS5cbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwYXRjaGVkLm9uKCdmaW5pc2gnLCBzZXR0bGVGcm9tU3RhdHVzKTtcbiAgICAgICAgLy8gQSBjbGllbnQgdGhhdCBkaXNjb25uZWN0cyAob3IgYSBwcm9jZXNzIGtpbGxlZCBtaWQtaGFuZGxlcikgZW1pdHNcbiAgICAgICAgLy8gJ2Nsb3NlJyBXSVRIT1VUICdmaW5pc2gnLCB3aGljaCB1c2VkIHRvIGxlYXZlIHRoZSByZXNlcnZhdGlvblxuICAgICAgICAvLyBgcGVuZGluZ2AgZm9yIHRoZSBmdWxsIElERU1QT1RFTkNZX1RUTF9NUyDigJQgc28gZXZlcnkgcmV0cnkgZ290IGEgNDA5XG4gICAgICAgIC8vIGFuZCBhIHJldHJ5IHN0b3JtIGJlY2FtZSBhIG11bHRpLW1pbnV0ZSBvdXRhZ2UgZm9yIHRoYXQga2V5LlxuICAgICAgICAvLyBSRUxFQVNFIHJhdGhlciB0aGFuIGNhY2hlOiB0aGUgcmVzcG9uc2UgbmV2ZXIgY29tcGxldGVkLCBzbyB0aGVyZSBpc1xuICAgICAgICAvLyBubyByZXN1bHQgdG8gcmVwbGF5LCBhbmQgdGhlIHJldHJ5IHNob3VsZCBnZW51aW5lbHkgcmUtcnVuLlxuICAgICAgICBwYXRjaGVkLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghcmVzLndyaXRhYmxlRmluaXNoZWQpIHJlbGVhc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgc3RvcmUgYmFja2VuZCBpcyBkb3duLCBmYWlsIG9wZW4g4oCUIHByb2Nlc3MgdGhlIHJlcXVlc3Qgbm9ybWFsbHkuXG4gICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgc3RvcmUuZ2V0IGZhaWxlZDsgcHJvY2VlZGluZyB3aXRob3V0IGRlZHVwJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH07XG59XG4iXX0=
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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Q0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNmLDBFQUEwRTtZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqSixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgc2VuZEVycm9yLCBFcnJvckNvZGUsIGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaWRlbXBvdGVuY3knKTtcblxuLyoqXG4gKiBDYW5vbmljYWwgKGtleS1zb3J0ZWQpIEpTT04gc2VyaWFsaXphdGlvbiBzbyB0aGUgU0FNRSBsb2dpY2FsIHBheWxvYWQgaGFzaGVzXG4gKiBpZGVudGljYWxseSByZWdhcmRsZXNzIG9mIHByb3BlcnR5IGluc2VydGlvbiBvcmRlciDigJQgYSBwbGFpbiBgSlNPTi5zdHJpbmdpZnlgXG4gKiB3b3VsZCBsZXQgYHthLGJ9YCBhbmQgYHtiLGF9YCBwcm9kdWNlIGRpZmZlcmVudCBmaW5nZXJwcmludHMgZm9yIG9uZSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSA/PyAnbnVsbCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdbJyArIHZhbHVlLm1hcChzdGFibGVTdHJpbmdpZnkpLmpvaW4oJywnKSArICddJztcbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAneycgKyBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoKGspID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RhYmxlU3RyaW5naWZ5KG9ialtrXSkpLmpvaW4oJywnKSArICd9Jztcbn1cblxuLyoqXG4gKiBTaG9ydCwgc3RhYmxlIGZpbmdlcnByaW50IG9mIGEgcmVxdWVzdCBib2R5LiBGb2xkcyB0aGUgcGF5bG9hZCBpbnRvIHRoZVxuICogaWRlbXBvdGVuY3kga2V5IHNvIHJlcGxheWluZyB0aGUgU0FNRSBrZXkgd2l0aCBhIERJRkZFUkVOVCBib2R5IGlzIHRyZWF0ZWQgYXNcbiAqIGEgZGlzdGluY3Qgb3BlcmF0aW9uIChmcmVzaCBleGVjdXRpb24pIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgb2xkIHJlc3BvbnNlLlxuICogRW1wdHkvYWJzZW50IGJvZGllcyBjb2xsYXBzZSB0byAnLScgc28gYm9keS1sZXNzIG11dGF0aW9ucyBzdGF5IHVuYWZmZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGJvZHlGaW5nZXJwcmludChib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCB8fCBib2R5ID09PSBudWxsKSByZXR1cm4gJy0nO1xuICBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGJvZHkgYXMgb2JqZWN0KS5sZW5ndGggPT09IDApIHJldHVybiAnLSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzdGFibGVTdHJpbmdpZnkoYm9keSkpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMTYpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tc2VyaWFsaXphYmxlIGJvZHkgKGUuZy4gYSBzdHJlYW0vY2lyY3VsYXIgcmVmKTogc2tpcCBmaW5nZXJwcmludGluZ1xuICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHJlcXVlc3Qg4oCUIGtleSBzdGF5cyBzY29wZWQgYnkgbWV0aG9kK3JvdXRlK29yZy5cbiAgICByZXR1cm4gJy0nO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZWRFbnRyeSB7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgYm9keTogdW5rbm93bjtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIC8qKiBSZXNlcnZhdGlvbiBwbGFjZWhvbGRlcjogdGhlIHJlcXVlc3QgaXMgaW4tZmxpZ2h0LCBubyByZWFsIHJlc3BvbnNlIHlldC5cbiAgICogIEEgZHVwbGljYXRlIHRoYXQgc2VlcyBhIHBlbmRpbmcgZW50cnkgaXMgcmVqZWN0ZWQgd2l0aCA0MDksIG5vdCByZXBsYXllZC4gKi9cbiAgcGVuZGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIGJhY2tlbmQgZm9yIGlkZW1wb3RlbmN5LWtleSByZXBsYXkgY2FjaGUuIFRoZSBkZWZhdWx0IGluLW1lbW9yeVxuICogaW1wbGVtZW50YXRpb24gd29ya3MgZmluZSBzaW5nbGUtcmVwbGljYTsgYSBSZWRpcy1iYWNrZWQgaW1wbGVtZW50YXRpb25cbiAqIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IGRlZHVwbGljYXRpb24gYWNyb3NzIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXNcbiAqIChvdGhlcndpc2UgdHdvIHJlcGxpY2FzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FjaGUgaW5kZXBlbmRlbnRseSBhbmQgYVxuICogcmV0cnkgaGl0dGluZyBhIGRpZmZlcmVudCBwb2Qgd29uJ3QgcmVwbGF5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZWRFbnRyeSB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBDYWNoZWRFbnRyeSwgdHRsU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgY2xhaW0gYGtleWAgSUZGIGl0IGlzIGN1cnJlbnRseSBhYnNlbnQuIFJldHVybnMgYHRydWVgIHdoZW4gVEhJU1xuICAgKiBjYWxsZXIgc2V0IHRoZSBlbnRyeSAod29uIHRoZSByYWNlKSwgYGZhbHNlYCB3aGVuIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLlxuICAgKiBUaGlzIGlzIHdoYXQgc2VyaWFsaXplcyBjb25jdXJyZW50IGZpcnN0LXRpbWUgcmVxdWVzdHMgdGhhdCBzaGFyZSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXkg4oCUIGEgcGxhaW4gZ2V0LXRoZW4tc2V0IGxlYXZlcyBhIHdpbmRvdyB3aGVyZSB0d28gcmVxdWVzdHNcbiAgICogYm90aCBzZWUgXCJub3QgY2FjaGVkXCIgYW5kIGJvdGggZXhlY3V0ZSB0aGUgbXV0YXRpb24uXG4gICAqL1xuICByZXNlcnZlKGtleTogc3RyaW5nLCBlbnRyeTogQ2FjaGVkRW50cnksIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBSZW1vdmUgYSBrZXkg4oCUIHJlbGVhc2VzIGEgcmVzZXJ2YXRpb24gYWZ0ZXIgYSBub24tY2FjaGVhYmxlIChub24tMnh4KSByZXNwb25zZS4gKi9cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIERlZmF1bHQgaW4tbWVtb3J5IHN0b3JlLiBTaW5nbGUtcmVwbGljYSBvbmx5LiBFeHBvcnRlZCBmb3IgdGVzdGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlTdG9yZSgpOiBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZEVudHJ5PigpO1xuICBjb25zdCBjbGVhbnVwVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtYXApIHtcbiAgICAgIGlmIChub3cgPiB2LmV4cGlyZXNBdCkgbWFwLmRlbGV0ZShrKTtcbiAgICB9XG4gIH0sIENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfQ0xFQU5VUF9JTlRFUlZBTF9NUyk7XG4gIGNsZWFudXBUaW1lci51bnJlZigpO1xuXG4gIC8qKiBSZXR1cm4gdGhlIGxpdmUgKG5vbi1leHBpcmVkKSBlbnRyeSwgZXZpY3RpbmcgaXQgbGF6aWx5IGlmIGV4cGlyZWQuICovXG4gIGNvbnN0IGxpdmUgPSAoa2V5OiBzdHJpbmcpOiBDYWNoZWRFbnRyeSB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gbWFwLmdldChrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybiBudWxsO1xuICAgIGlmIChEYXRlLm5vdygpID4gZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9O1xuICAvKipcbiAgICogQXQgY2FwYWNpdHksIGV2aWN0IHRoZSBPTERFU1QgZW50cnkgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKSByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBkcm9wcGluZyB0aGUgTkVXIGtleSDigJQgb3RoZXJ3aXNlLCBvbmNlIGZ1bGwsIHRoZSBzdG9yZSBzdG9wc1xuICAgKiBkZWR1cGxpY2F0aW5nIGZyZXNoIHJlcXVlc3RzIHVudGlsIHRoZSBUVEwgc3dlZXAgcnVucy4gU3RheXMgYm91bmRlZDsgZmF2b3JzXG4gICAqIHJlY2VudCBrZXlzIChtb3N0IGxpa2VseSB0byBiZSByZXRyaWVkKS5cbiAgICovXG4gIGNvbnN0IGV2aWN0SWZGdWxsID0gKGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCFtYXAuaGFzKGtleSkgJiYgbWFwLnNpemUgPj0gQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9NQVhfU1RPUkVfU0laRSkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gbWFwLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIG1hcC5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGxpdmUoa2V5KTtcbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5KSB7XG4gICAgICBldmljdElmRnVsbChrZXkpO1xuICAgICAgbWFwLnNldChrZXksIGVudHJ5KTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSkge1xuICAgICAgLy8gQXRvbWljIGluIGEgc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWU6IG5vIGF3YWl0IGJldHdlZW4gdGhlIGxpdmVuZXNzIGNoZWNrXG4gICAgICAvLyBhbmQgdGhlIHNldCwgc28gdHdvIGNvbmN1cnJlbnQgY2FsbGVycyBjYW4ndCBib3RoIG9ic2VydmUgXCJhYnNlbnRcIi5cbiAgICAgIGlmIChsaXZlKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGV2aWN0SWZGdWxsKGtleSk7XG4gICAgICBtYXAuc2V0KGtleSwgZW50cnkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIHN1cmZhY2UgdGhlIGlkZW1wb3RlbmN5IHN0b3JlIG5lZWRzIChhbiBpb3JlZGlzIHN1YnNldCkuXG4gKiBgc2V0YCBzdXBwb3J0cyB0aGUgdmFyaWFkaWMgb3B0aW9uIHRhaWw6IGBTRVQga2V5IHZhbCBFWCA8dHRsPiBbTlhdYCwgd2hpY2hcbiAqIHJldHVybnMgYCdPSydgIG9uIHN1Y2Nlc3MgYW5kIGBudWxsYCB3aGVuIGFuIGBOWGAgc2V0IHdhcyByZWZ1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzSWRlbXBvdGVuY3lDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IFJFRElTX0tFWV9QUkVGSVggPSAnaWRlbTonO1xuXG4vKipcbiAqIFJlZGlzLWJhY2tlZCB7QGxpbmsgSWRlbXBvdGVuY3lTdG9yZX0gZm9yIGNvcnJlY3QgZGVkdXBsaWNhdGlvbiBhY3Jvc3NcbiAqIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXMuIGByZXNlcnZlYCBtYXBzIHRvIGFuIGF0b21pYyBgU0VUIOKApiBOWGAgc28gdHdvXG4gKiBwb2RzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FuJ3QgYm90aCB3aW4gYSBmaXJzdC10aW1lIHJlcXVlc3Qgc2hhcmluZyBhblxuICogSWRlbXBvdGVuY3ktS2V5OyBhIHJldHJ5IGxhbmRpbmcgb24gQU5ZIHBvZCBzZWVzIHRoZSBzYW1lIGNvbW1pdHRlZCByZXNwb25zZS5cbiAqIFJlZGlzIFRUTCBvd25zIGV4cGlyeSAodGhlIGBDYWNoZWRFbnRyeS5leHBpcmVzQXRgIGZpZWxkIGlzIGNhcnJpZWQgb25seSBmb3JcbiAqIEFQSS1zaGFwZSBwYXJpdHkgd2l0aCB0aGUgbWVtb3J5IHN0b3JlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzSWRlbXBvdGVuY3lTdG9yZShyZWRpczogUmVkaXNJZGVtcG90ZW5jeUNsaWVudCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICBjb25zdCBrID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+IGAke1JFRElTX0tFWV9QUkVGSVh9JHtrZXl9YDtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5KSB7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQoayhrZXkpKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2FjaGVkRW50cnk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ29ycnVwdCBlbnRyeSDihpIgdHJlYXQgYXMgYWJzZW50IHNvIHRoZSByZXF1ZXN0IHByb2NlZWRzIGZyZXNoLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5LCB0dGxTZWNvbmRzKSB7XG4gICAgICBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSwgdHRsU2Vjb25kcykge1xuICAgICAgLy8gQXRvbWljIGNsYWltOiBTRVQga2V5IHZhbCBFWCB0dGwgTlgg4oaSICdPSycgb25seSBpZiB0aGUga2V5IHdhcyBhYnNlbnQuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpLCAnTlgnKTtcbiAgICAgIHJldHVybiByZXMgPT09ICdPSyc7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBhd2FpdCByZWRpcy5kZWwoayhrZXkpKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUmVkaXMtYmFja2VkIGlkZW1wb3RlbmN5IHN0b3JlIGZyb20gdGhlIHNoYXJlZCBlbnYgUmVkaXMgKHRoZSBzYW1lXG4gKiBgUkVESVNfVVJMYCAvIGBSRURJU19TRU5USU5FTFNgIHdpcmluZyB0aGUgcmF0ZS1saW1pdGVyIGFuZCBhdWRpdC1zcG9vbCB1c2UpLlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkL2F2YWlsYWJsZSBzbyB0aGUgY2FsbGVyIGtlZXBzIHRoZVxuICogaW4tbWVtb3J5IGRlZmF1bHQgKHNpbmdsZS1yZXBsaWNhIGNvcnJlY3RuZXNzKS4gTmV2ZXIgdGhyb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNJZGVtcG90ZW5jeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUgfCBudWxsIHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJZGVtcG90ZW5jeUNsaWVudD4oJ2lkZW1wb3RlbmN5Jyk7XG4gIGlmICghY2xpZW50KSByZXR1cm4gbnVsbDtcbiAgbG9nZ2VyLmluZm8oJ1JlZGlzIGlkZW1wb3RlbmN5IHN0b3JlIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc0lkZW1wb3RlbmN5U3RvcmUoY2xpZW50KTtcbn1cblxuY29uc3QgbWVtb3J5U3RvcmUgPSBjcmVhdGVNZW1vcnlTdG9yZSgpO1xuXG4vKipcbiAqIFByb2Nlc3Mtd2lkZSBkZWZhdWx0IHN0b3JlIHVzZWQgYnkgYGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpYCB3aGVuIG5vIGV4cGxpY2l0XG4gKiBgc3RvcmVgIGlzIHBhc3NlZC4gRGVmYXVsdHMgdG8gdGhlIGluLW1lbW9yeSBzdG9yZTsgYGNyZWF0ZUFwcGAgcHJvbW90ZXMgaXQgdG9cbiAqIHRoZSBzaGFyZWQgZW52LVJlZGlzIHN0b3JlIChtdWx0aS1yZXBsaWNhIGRlZHVwKSBhdCBzdGFydHVwIHZpYVxuICoge0BsaW5rIHNldElkZW1wb3RlbmN5U3RvcmV9LiBUaGUgcm91dGUgZmFjdG9yaWVzIGtlZXAgY2FsbGluZ1xuICogYGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpYCB3aXRoIG5vIGFyZ3MgYW5kIHRyYW5zcGFyZW50bHkgcGljayB0aGlzIHVwLlxuICovXG5sZXQgZGVmYXVsdFN0b3JlOiBJZGVtcG90ZW5jeVN0b3JlID0gbWVtb3J5U3RvcmU7XG5cbi8qKiBJbmplY3QgdGhlIHByb2Nlc3Mtd2lkZSBpZGVtcG90ZW5jeSBzdG9yZSAoZS5nLiBhIFJlZGlzLWJhY2tlZCBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldElkZW1wb3RlbmN5U3RvcmUoc3RvcmU6IElkZW1wb3RlbmN5U3RvcmUpOiB2b2lkIHtcbiAgZGVmYXVsdFN0b3JlID0gc3RvcmU7XG59XG5cbi8qKiBUaGUgY3VycmVudCBwcm9jZXNzLXdpZGUgZGVmYXVsdCBzdG9yZSAoaW4tbWVtb3J5IHVubGVzcyBvdmVycmlkZGVuKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVtcG90ZW5jeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICByZXR1cm4gZGVmYXVsdFN0b3JlO1xufVxuXG4vKipcbiAqIE1hcmtzIGEgcmVxdWVzdCBpZGVtcG90ZW5jeSBoYXMgYWxyZWFkeSBoYW5kbGVkLiBSb3V0ZSBjaGFpbnMgYXJlIHN0YWNrZWQg4oCUXG4gKiBzZXZlcmFsIGBhcHAudXNlKHByZWZpeCwgLi4uY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZSgpLCByb3V0ZXIpYCBtb3VudHNcbiAqIHNoYXJlIGEgcHJlZml4LCBhbmQgYSByZXF1ZXN0IHRoYXQgZmFsbHMgdGhyb3VnaCB0aGUgZmlyc3Qgcm91dGVyIHJ1bnMgdGhlXG4gKiBuZXh0IGNoYWluJ3MgaWRlbXBvdGVuY3kgbWlkZGxld2FyZSBhZ2Fpbi4gVGhhdCBzZWNvbmQgcGFzcyBmb3VuZCBpdHMgT1dOXG4gKiBwZW5kaW5nIHJlc2VydmF0aW9uIGFuZCBhbnN3ZXJlZCA0MDkuXG4gKi9cbmNvbnN0IElERU1QT1RFTkNZX0hBTkRMRUQgPSBTeW1ib2woJ3BpcGVsaW5lLWJ1aWxkZXIuaWRlbXBvdGVuY3kuaGFuZGxlZCcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW1wb3RlbmN5TWlkZGxld2FyZU9wdGlvbnMge1xuICAvKiogQ3VzdG9tIHN0b3JlIGJhY2tlbmQuIERlZmF1bHRzIHRvIHRoZSBwcm9jZXNzLXdpZGUgc3RvcmUgc2V0IHZpYVxuICAgKiAge0BsaW5rIHNldElkZW1wb3RlbmN5U3RvcmV9IChpbi1tZW1vcnkgdW50aWwgYGNyZWF0ZUFwcGAgd2lyZXMgUmVkaXMpLiAqL1xuICBzdG9yZT86IElkZW1wb3RlbmN5U3RvcmU7XG59XG5cbi8qKlxuICogTWlkZGxld2FyZSB0aGF0IHN1cHBvcnRzIGlkZW1wb3RlbmN5IGtleXMgZm9yIFBPU1QvUFVUL0RFTEVURSBtdXRhdGlvbnMuXG4gKlxuICogV2hlbiBhIHJlcXVlc3QgaW5jbHVkZXMgdGhlIGBJZGVtcG90ZW5jeS1LZXlgIGhlYWRlcjpcbiAqIC0gRmlyc3QgY2FsbDogcHJvY2Vzc2VzIG5vcm1hbGx5LCBjYWNoZXMgdGhlIHJlc3BvbnNlXG4gKiAtIFN1YnNlcXVlbnQgY2FsbHMgd2l0aCBzYW1lIGtleTogcmV0dXJucyBjYWNoZWQgcmVzcG9uc2UgKHByZXZlbnRzIGR1cGxpY2F0ZSBtdXRhdGlvbnMpXG4gKlxuICogRGVmYXVsdHMgdG8gYW4gaW4tbWVtb3J5IHN0b3JlIChzaW5nbGUtcmVwbGljYSkuIFBhc3MgYSBjdXN0b21cbiAqIGNyb3NzLXJlcGxpY2EgYHsgc3RvcmUgfWAgaW1wbGVtZW50aW5nIGBJZGVtcG90ZW5jeVN0b3JlYCB0byBkZWR1cGUgYWNyb3NzXG4gKiByZXBsaWNhcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW1wb3RlbmN5TWlkZGxld2FyZShvcHRpb25zOiBJZGVtcG90ZW5jeU1pZGRsZXdhcmVPcHRpb25zID0ge30pIHtcbiAgLy8gUmVzb2x2ZSB0aGUgc3RvcmUgUEVSIFJFUVVFU1QgKG5vdCBhdCBmYWN0b3J5IHRpbWUpIHNvIGEgc3RvcmUgaW5qZWN0ZWQgYnlcbiAgLy8gY3JlYXRlQXBwIEFGVEVSIHRoZSByb3V0ZSBjaGFpbnMgYXJlIGJ1aWx0IHN0aWxsIHRha2VzIGVmZmVjdC4gQW4gZXhwbGljaXRcbiAgLy8gYG9wdGlvbnMuc3RvcmVgIGFsd2F5cyB3aW5zLlxuICBjb25zdCBleHBsaWNpdFN0b3JlID0gb3B0aW9ucy5zdG9yZTtcbiAgY29uc3QgdHRsTXMgPSBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX1RUTF9NUztcbiAgY29uc3QgdHRsU2VjID0gTWF0aC5mbG9vcih0dGxNcyAvIDEwMDApO1xuXG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGV4cGxpY2l0U3RvcmUgPz8gZGVmYXVsdFN0b3JlO1xuICAgIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBPbmx5IGFwcGx5IHRvIG11dGF0aW9uIG1ldGhvZHNcbiAgICBpZiAoIVsnUE9TVCcsICdQVVQnLCAnREVMRVRFJ10uaW5jbHVkZXMocmVxLm1ldGhvZCkpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBPbmUgcGFzcyBwZXIgcmVxdWVzdDogYSBsYXRlciBzdGFja2VkIGNoYWluIG11c3Qgbm90IHJlLWNoZWNrIHRoZSBrZXkuXG4gICAgY29uc3QgbWFya2VkID0gcmVxIGFzIFJlcXVlc3QgJiB7IFtJREVNUE9URU5DWV9IQU5ETEVEXT86IHRydWUgfTtcbiAgICBpZiAobWFya2VkW0lERU1QT1RFTkNZX0hBTkRMRURdKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gTmFtZXNwYWNlIGJ5IG9yZ0lkIHRvIHByZXZlbnQgY3Jvc3Mtb3JnIGNhY2hlIGNvbGxpc2lvbnMuIFByZWZlciB0aGVcbiAgICAvLyBWRVJJRklFRCBhdXRoIG9yZyAoYHJlcS51c2VyYCwgcG9wdWxhdGVkIGJ5IHJlcXVpcmVBdXRoIGFmdGVyIHNpZ25hdHVyZVxuICAgIC8vIHZlcmlmaWNhdGlvbikgb3ZlciBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCB3aGljaCBzb21lIHNlcnZpY2VzIHBvcHVsYXRlXG4gICAgLy8gcHJlLWF1dGggZnJvbSBhbiBVTlZFUklGSUVEIHRva2VuIHBlZWsg4oCUIG5hbWVzcGFjaW5nIGEgbXV0YXRpb24ncyByZXBsYXlcbiAgICAvLyBjYWNoZSBvbiBhbiB1bnZlcmlmaWVkLCBjYWxsZXItaW5mbHVlbmNlZCBvcmcgaWQgd291bGQgYmUgdW5zYWZlLlxuICAgIGNvbnN0IG9yZ0lkID0gcmVxLnVzZXI/Lm9yZ2FuaXphdGlvbklkIHx8IHJlcS5jb250ZXh0Py5pZGVudGl0eT8ub3JnSWQ7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuIG5leHQoKTsgLy8gc2tpcCBpZGVtcG90ZW5jeSBmb3IgdW5hdXRoZW50aWNhdGVkIHJlcXVlc3RzXG4gICAgbWFya2VkW0lERU1QT1RFTkNZX0hBTkRMRURdID0gdHJ1ZTtcblxuICAgIC8vIE5hbWVzcGFjZSB0aGUgc3RvcmVkIGtleSBieSAobWV0aG9kLCByb3V0ZSwgb3JnLCBib2R5KSBzbyBhbiBJZGVtcG90ZW5jeS1LZXlcbiAgICAvLyBpcyBzY29wZWQgdG8gT05FIHNwZWNpZmljIGVuZHBvaW50K3BheWxvYWQuIFJldXNpbmcgYSBzaW5nbGUga2V5IGFjcm9zcyB0d29cbiAgICAvLyByb3V0ZXMgKGUuZy4gUE9TVCAvcGlwZWxpbmVzIHRoZW4gUE9TVCAvcGx1Z2lucykgcHJldmlvdXNseSByZXBsYXllZCB0aGVcbiAgICAvLyBmaXJzdCBlbmRwb2ludCdzIDJ4eCBmb3IgdGhlIHNlY29uZCDigJQgdGhlIHN0b3JlIGlzIGEgbW9kdWxlLWxldmVsIHNpbmdsZXRvblxuICAgIC8vIHNoYXJlZCBieSBldmVyeSByb3V0ZS4gRm9sZGluZyBpbiBtZXRob2QgKyByb3V0ZSBwYXRoICsgYSBib2R5IGZpbmdlcnByaW50XG4gICAgLy8gb25seSBtYWtlcyBrZXlzIE1PUkUgc3BlY2lmaWMsIHNvIHRoZXJlIGlzIG5vIGNyb3NzLWNvbnRhbWluYXRpb24gcmlzay5cbiAgICAvLyBBbHNvIG5hbWVzcGFjZSBieSB0aGUgVkVSSUZJRUQgdXNlci4gYElkZW1wb3RlbmN5LUtleWAgaXMgY2hvc2VuIGJ5IHRoZVxuICAgIC8vIGNsaWVudCwgc28gdHdvIHVzZXJzIGluIHRoZSBzYW1lIG9yZyBzZW5kaW5nIHRoZSBzYW1lIGJvZHkgd2l0aCB0aGUgc2FtZVxuICAgIC8vIGtleSBjb2xsaWRlZDogdGhlIHNlY29uZCB1c2VyJ3MgbXV0YXRpb24gd2FzIFNLSVBQRUQgYW5kIHRoZXkgd2VyZSBzZXJ2ZWRcbiAgICAvLyB0aGUgZmlyc3QgdXNlcidzIGNhY2hlZCByZXNwb25zZS4gRmFsbHMgYmFjayB0byB0aGUgb3JnIGFsb25lIG9ubHkgd2hlblxuICAgIC8vIHRoZXJlIGlzIG5vIHZlcmlmaWVkIHN1YmplY3QgKHNlcnZpY2UgcHJpbmNpcGFscyBjYXJyeSBvbmUpLlxuICAgIGNvbnN0IHN1YiA9IHJlcS51c2VyPy5zdWI7XG4gICAgY29uc3Qgcm91dGVQYXRoID0gKHJlcS5iYXNlVXJsID8/ICcnKSArIChyZXEucm91dGU/LnBhdGggPz8gcmVxLnBhdGggPz8gJycpO1xuICAgIGNvbnN0IGZ1bGxLZXkgPSBgJHtyZXEubWV0aG9kfToke3JvdXRlUGF0aH06JHtvcmdJZH06JHtzdWIgPz8gJy0nfToke2JvZHlGaW5nZXJwcmludChyZXEuYm9keSl9OiR7a2V5fWA7XG5cbiAgICAvKiogUmVqZWN0IGEgZHVwbGljYXRlIHdob3NlIG9yaWdpbmFsIGlzIHN0aWxsIGluLWZsaWdodC4gKi9cbiAgICBjb25zdCBzZW5kSW5Qcm9ncmVzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgJzEnKTtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDQwOSwgJ0EgcmVxdWVzdCB3aXRoIHRoaXMgSWRlbXBvdGVuY3ktS2V5IGlzIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkJywgRXJyb3JDb2RlLkNPTkZMSUNUKTtcbiAgICB9O1xuXG4gICAgc3RvcmUuZ2V0KGZ1bGxLZXkpLnRoZW4oYXN5bmMgKGNhY2hlZCkgPT4ge1xuICAgICAgaWYgKGNhY2hlZCAmJiAhY2FjaGVkLnBlbmRpbmcpIHtcbiAgICAgICAgLy8gQ29tcGxldGVkIHJlc3BvbnNlIG9uIHJlY29yZCDihpIgcmVwbGF5IGl0LlxuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZXBsYXllZCcsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdYLUlkZW1wb3RlbnQtUmVwbGF5ZWQnLCAndHJ1ZScpO1xuICAgICAgICByZXMuc3RhdHVzKGNhY2hlZC5zdGF0dXNDb2RlKS5qc29uKGNhY2hlZC5ib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucGVuZGluZykge1xuICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaXMgc3RpbGwgcnVubmluZyDigJQgZG9uJ3QgcnVuIHRoZSBtdXRhdGlvbiBhIHNlY29uZCB0aW1lLlxuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZWplY3RlZCAoaW4gcHJvZ3Jlc3MpJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJldHVybiBzZW5kSW5Qcm9ncmVzcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdG9taWNhbGx5IHJlc2VydmUgdGhlIGtleS4gTG9zaW5nIHRoaXMgcmFjZSBtZWFucyBhIGNvbmN1cnJlbnQgcmVxdWVzdFxuICAgICAgLy8gd2l0aCB0aGUgc2FtZSBrZXkgZ290IHRoZXJlIGZpcnN0IGFuZCBpcyBpbi1mbGlnaHQg4oaSIDQwOS5cbiAgICAgIGNvbnN0IHdvbiA9IGF3YWl0IHN0b3JlLnJlc2VydmUoXG4gICAgICAgIGZ1bGxLZXksXG4gICAgICAgIHsgc3RhdHVzQ29kZTogMCwgYm9keTogbnVsbCwgcGVuZGluZzogdHJ1ZSwgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsTXMgfSxcbiAgICAgICAgdHRsU2VjLFxuICAgICAgKTtcbiAgICAgIGlmICghd29uKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlamVjdGVkIChsb3N0IHJlc2VydmUgcmFjZSknLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmV0dXJuIHNlbmRJblByb2dyZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG93biB0aGUgcmVzZXJ2YXRpb24uIEl0IE1VU1QgYmUgcmVzb2x2ZWQgZXhhY3RseSBvbmNlIOKAlCBlaXRoZXIgdGhlXG4gICAgICAvLyByZWFsIDJ4eCByZXNwb25zZSBpcyBjYWNoZWQgZm9yIHJlcGxheSwgb3IgdGhlIHJlc2VydmF0aW9uIGlzIHJlbGVhc2VkIHNvXG4gICAgICAvLyBhIHJldHJ5IGNhbiBwcm9jZWVkLiBgc2V0dGxlZGAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUtcmVzb2x2ZS5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgY2FwdHVyZWRCb2R5OiB1bmtub3duO1xuICAgICAgbGV0IGJvZHlDYXB0dXJlZCA9IGZhbHNlO1xuXG4gICAgICAvKiogUmVtZW1iZXIgdGhlIHJlc3BvbnNlIGJvZHkgZm9yIHJlcGxheSAoZmlyc3QgY2FwdHVyZSB3aW5zKS4gKi9cbiAgICAgIGNvbnN0IGNhcHR1cmVCb2R5ID0gKGJvZHk6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFib2R5Q2FwdHVyZWQpIHtcbiAgICAgICAgICBjYXB0dXJlZEJvZHkgPSBib2R5O1xuICAgICAgICAgIGJvZHlDYXB0dXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzdG9yZS5kZWxldGUoZnVsbEtleSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJZGVtcG90ZW5jeSByZXNlcnZhdGlvbiByZWxlYXNlIGZhaWxlZCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNhY2hlU3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHN0b3JlLnNldChmdWxsS2V5LCB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgICAgYm9keTogYm9keUNhcHR1cmVkID8gY2FwdHVyZWRCb2R5IDogbnVsbCxcbiAgICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyxcbiAgICAgICAgfSwgdHRsU2VjKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLnNldCBmYWlsZWQnLCB7IGtleTogZnVsbEtleSwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICAvKiogUmVzb2x2ZSB0aGUgcmVzZXJ2YXRpb24gZnJvbSB0aGUgQUNUVUFMIGZpbmFsIHN0YXR1czogY2FjaGUgMnh4LCBlbHNlIHJlbGVhc2UuICovXG4gICAgICBjb25zdCBzZXR0bGVGcm9tU3RhdHVzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwKSBjYWNoZVN1Y2Nlc3MoKTtcbiAgICAgICAgZWxzZSByZWxlYXNlKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHJlcy5qc29uIGlzIHRoZSBjb21tb24gY29tcGxldGlvbi4gQ2FwdHVyZSB0aGUgYm9keSBhbmQgc2V0dGxlXG4gICAgICAvLyBpbW1lZGlhdGVseSBvZmYgdGhlIHN0YXR1cyBzZXQgYnkgcmVzLnN0YXR1cyguLi4pLmpzb24oLi4uKS5cbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKTtcbiAgICAgIHJlcy5qc29uID0gKGJvZHk6IHVua25vd24pID0+IHtcbiAgICAgICAgcmVzLnNldEhlYWRlcignWC1JZGVtcG90ZW50LVJlcGxheWVkJywgJ2ZhbHNlJyk7XG4gICAgICAgIGNhcHR1cmVCb2R5KGJvZHkpO1xuICAgICAgICBzZXR0bGVGcm9tU3RhdHVzKCk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbEpzb24oYm9keSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBCb2R5LWNhcHR1cmUgYmFja3N0b3BzIGZvciBjb21wbGV0aW9ucyB0aGF0IGJ5cGFzcyByZXMuanNvblxuICAgICAgLy8gKHJlcy5zZW5kIC8gcmVzLmVuZCAvIHJlcy5zZW5kRmlsZSDihpIgcmVzLmVuZCkuIFRoZXNlIG9ubHkgUkVDT1JEIHRoZSBib2R5O1xuICAgICAgLy8gdGhlIGFjdHVhbCBzZXR0bGUgaGFwcGVucyBvbiBgZmluaXNoYCBmcm9tIHRoZSByZWFsIHN0YXR1cyBjb2RlLiBGaXJzdFxuICAgICAgLy8gY2FwdHVyZSB3aW5zLCBzbyByZXMuanNvbidzIGJvZHkgaXMgbmV2ZXIgY2xvYmJlcmVkIGJ5IGl0cyBpbnRlcm5hbFxuICAgICAgLy8gcmVzLnNlbmQvcmVzLmVuZCBjYWxscy5cbiAgICAgIGNvbnN0IHBhdGNoZWQgPSByZXMgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHNlbmQ/OiAoYm9keT86IHVua25vd24pID0+IHVua25vd247XG4gICAgICAgIGVuZD86ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gICAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkKSA9PiB1bmtub3duO1xuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5zZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2VuZCA9IHBhdGNoZWQuc2VuZC5iaW5kKHJlcyk7XG4gICAgICAgIHBhdGNoZWQuc2VuZCA9IChib2R5PzogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNhcHR1cmVCb2R5KGJvZHkpO1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbFNlbmQoYm9keSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQuZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gcGF0Y2hlZC5lbmQuYmluZChyZXMpO1xuICAgICAgICBwYXRjaGVkLmVuZCA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGFyZ3NbMF07XG4gICAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGNodW5rICE9PSAnZnVuY3Rpb24nKSBjYXB0dXJlQm9keShjaHVuayk7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRW5kKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBCYWNrc3RvcCBmb3IgQU5ZIGNvbXBsZXRpb24gcGF0aCDigJQgaW5jbHVkaW5nIGEgMnh4IHRoYXQgZmluaXNoZWQgdmlhXG4gICAgICAvLyByZXMuc2VuZC9yZXMuZW5kL3Jlcy5zZW5kRmlsZS8yMDQgYW5kIG5ldmVyIGhpdCB0aGUgcGF0Y2hlZCByZXMuanNvbi5cbiAgICAgIC8vIERlY2lkaW5nIG9uIHRoZSByZWFsIGZpbmFsIHN0YXR1cyBoZXJlIG1lYW5zIGEgc3VjY2Vzc2Z1bCBvcCBpcyBjYWNoZWRcbiAgICAgIC8vIChvciBhIGZhaWxlZCBvbmUgcmVsZWFzZWQpIGluc3RlYWQgb2Ygc3RyYW5kaW5nIHRoZSByZXNlcnZhdGlvbiBhbmRcbiAgICAgIC8vIDQwOS1pbmcgZXZlcnkgcmV0cnkgZm9yIHRoZSBmdWxsIFRUTC4gR3VhcmRlZCDigJQgdGVzdCBkb3VibGVzIG1heSBub3QgYmVcbiAgICAgIC8vIEV2ZW50RW1pdHRlcnM7IHJlcy5qc29uJ3MgZmFzdCBwYXRoIGFscmVhZHkgc2V0dGxlZCB0aGUgY29tbW9uIGNhc2UuXG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcGF0Y2hlZC5vbignZmluaXNoJywgc2V0dGxlRnJvbVN0YXR1cyk7XG4gICAgICAgIC8vIEEgY2xpZW50IHRoYXQgZGlzY29ubmVjdHMgKG9yIGEgcHJvY2VzcyBraWxsZWQgbWlkLWhhbmRsZXIpIGVtaXRzXG4gICAgICAgIC8vICdjbG9zZScgV0lUSE9VVCAnZmluaXNoJywgd2hpY2ggdXNlZCB0byBsZWF2ZSB0aGUgcmVzZXJ2YXRpb25cbiAgICAgICAgLy8gYHBlbmRpbmdgIGZvciB0aGUgZnVsbCBJREVNUE9URU5DWV9UVExfTVMg4oCUIHNvIGV2ZXJ5IHJldHJ5IGdvdCBhIDQwOVxuICAgICAgICAvLyBhbmQgYSByZXRyeSBzdG9ybSBiZWNhbWUgYSBtdWx0aS1taW51dGUgb3V0YWdlIGZvciB0aGF0IGtleS5cbiAgICAgICAgLy8gUkVMRUFTRSByYXRoZXIgdGhhbiBjYWNoZTogdGhlIHJlc3BvbnNlIG5ldmVyIGNvbXBsZXRlZCwgc28gdGhlcmUgaXNcbiAgICAgICAgLy8gbm8gcmVzdWx0IHRvIHJlcGxheSwgYW5kIHRoZSByZXRyeSBzaG91bGQgZ2VudWluZWx5IHJlLXJ1bi5cbiAgICAgICAgcGF0Y2hlZC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXJlcy53cml0YWJsZUZpbmlzaGVkKSByZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgLy8gSWYgdGhlIHN0b3JlIGJhY2tlbmQgaXMgZG93biwgZmFpbCBvcGVuIOKAlCBwcm9jZXNzIHRoZSByZXF1ZXN0IG5vcm1hbGx5LlxuICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLmdldCBmYWlsZWQ7IHByb2NlZWRpbmcgd2l0aG91dCBkZWR1cCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuIl19
@@ -1,4 +1,3 @@
1
- export * from './middleware.js';
2
1
  export * from './middleware-factory.js';
3
2
  export * from './context-middleware.js';
4
3
  export * from './check-quota.js';
package/lib/api/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  // Middleware
4
- export * from './middleware.js';
5
4
  export * from './middleware-factory.js';
6
5
  export * from './context-middleware.js';
7
6
  export * from './check-quota.js';
@@ -32,4 +31,4 @@ export * from './readiness.js';
32
31
  export * from './route-wrapper.js';
33
32
  // Request/Response types
34
33
  export * from './request-types.js';
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsYUFBYTtBQUNiLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtCQUFrQixDQUFDO0FBRWpDLGNBQWM7QUFDZCxjQUFjLGtCQUFrQixDQUFDO0FBRWpDLHVCQUF1QjtBQUN2QixjQUFjLG9CQUFvQixDQUFDO0FBRW5DLDJEQUEyRDtBQUMzRCxjQUFjLG9CQUFvQixDQUFDO0FBRW5DLGdCQUFnQjtBQUNoQixjQUFjLG9CQUFvQixDQUFDO0FBRW5DLGNBQWM7QUFDZCxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLGdCQUFnQjtBQUNoQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGNBQWMsQ0FBQztBQUU3QixtQkFBbUI7QUFDbkIsY0FBYyxhQUFhLENBQUM7QUFFNUIscUNBQXFDO0FBQ3JDLGNBQWMsZ0JBQWdCLENBQUM7QUFFL0IsZ0JBQWdCO0FBQ2hCLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMseUJBQXlCO0FBQ3pCLGNBQWMsb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLy8gTWlkZGxld2FyZVxuZXhwb3J0ICogZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWlkZGxld2FyZS1mYWN0b3J5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGV4dC1taWRkbGV3YXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2stcXVvdGEuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRlci1xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JhdGUtbGltaXQtYnktb3JnLmpzJztcbmV4cG9ydCB7IGNyZWF0ZVNoYXJlZFJhdGVMaW1pdFN0b3JlIH0gZnJvbSAnLi9yYXRlLWxpbWl0LXN0b3JlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWlyZS1vcmctaWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90ZW5hbnQtY29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dldC1jb250ZXh0LmpzJztcblxuLy8gQXBwIGZhY3RvcnlcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWZhY3RvcnkuanMnO1xuXG4vLyBIZWFsdGgtY2hlY2sgaGVscGVyc1xuZXhwb3J0ICogZnJvbSAnLi9oZWFsdGgtY2hlY2tzLmpzJztcblxuLy8gTW9uZ29EQiBjb25uZWN0aW9uIGhlbHBlciAoZGVwZW5kZW5jeS1pbmplY3RlZCBtb25nb29zZSlcbmV4cG9ydCAqIGZyb20gJy4vbW9uZ28tY29ubmVjdC5qcyc7XG5cbi8vIFF1b3RhIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEtaGVscGVycy5qcyc7XG5cbi8vIElkZW1wb3RlbmN5XG5leHBvcnQgKiBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuXG4vLyBPYnNlcnZhYmlsaXR5XG5leHBvcnQgKiBmcm9tICcuL3RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzLmpzJztcblxuLy8gU2VydmVyIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2ZXIuanMnO1xuXG4vLyBSZWFkaW5lc3Mgc3RhdGUgKyBndWFyZCBtaWRkbGV3YXJlXG5leHBvcnQgKiBmcm9tICcuL3JlYWRpbmVzcy5qcyc7XG5cbi8vIFJvdXRlIHdyYXBwZXJcbmV4cG9ydCAqIGZyb20gJy4vcm91dGUtd3JhcHBlci5qcyc7XG5cbi8vIFJlcXVlc3QvUmVzcG9uc2UgdHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWVzdC10eXBlcy5qcyc7XG4iXX0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsYUFBYTtBQUNiLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxjQUFjO0FBQ2QsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyx1QkFBdUI7QUFDdkIsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQywyREFBMkQ7QUFDM0QsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxnQkFBZ0I7QUFDaEIsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxjQUFjO0FBQ2QsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxnQkFBZ0I7QUFDaEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFFN0IsbUJBQW1CO0FBQ25CLGNBQWMsYUFBYSxDQUFDO0FBRTVCLHFDQUFxQztBQUNyQyxjQUFjLGdCQUFnQixDQUFDO0FBRS9CLGdCQUFnQjtBQUNoQixjQUFjLG9CQUFvQixDQUFDO0FBRW5DLHlCQUF5QjtBQUN6QixjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIE1pZGRsZXdhcmVcbmV4cG9ydCAqIGZyb20gJy4vbWlkZGxld2FyZS1mYWN0b3J5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGV4dC1taWRkbGV3YXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2stcXVvdGEuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRlci1xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JhdGUtbGltaXQtYnktb3JnLmpzJztcbmV4cG9ydCB7IGNyZWF0ZVNoYXJlZFJhdGVMaW1pdFN0b3JlIH0gZnJvbSAnLi9yYXRlLWxpbWl0LXN0b3JlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWlyZS1vcmctaWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90ZW5hbnQtY29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dldC1jb250ZXh0LmpzJztcblxuLy8gQXBwIGZhY3RvcnlcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWZhY3RvcnkuanMnO1xuXG4vLyBIZWFsdGgtY2hlY2sgaGVscGVyc1xuZXhwb3J0ICogZnJvbSAnLi9oZWFsdGgtY2hlY2tzLmpzJztcblxuLy8gTW9uZ29EQiBjb25uZWN0aW9uIGhlbHBlciAoZGVwZW5kZW5jeS1pbmplY3RlZCBtb25nb29zZSlcbmV4cG9ydCAqIGZyb20gJy4vbW9uZ28tY29ubmVjdC5qcyc7XG5cbi8vIFF1b3RhIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEtaGVscGVycy5qcyc7XG5cbi8vIElkZW1wb3RlbmN5XG5leHBvcnQgKiBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuXG4vLyBPYnNlcnZhYmlsaXR5XG5leHBvcnQgKiBmcm9tICcuL3RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzLmpzJztcblxuLy8gU2VydmVyIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2ZXIuanMnO1xuXG4vLyBSZWFkaW5lc3Mgc3RhdGUgKyBndWFyZCBtaWRkbGV3YXJlXG5leHBvcnQgKiBmcm9tICcuL3JlYWRpbmVzcy5qcyc7XG5cbi8vIFJvdXRlIHdyYXBwZXJcbmV4cG9ydCAqIGZyb20gJy4vcm91dGUtd3JhcHBlci5qcyc7XG5cbi8vIFJlcXVlc3QvUmVzcG9uc2UgdHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWVzdC10eXBlcy5qcyc7XG4iXX0=
@@ -1,4 +1,13 @@
1
1
  import type { Request, Response, NextFunction } from 'express';
2
+ import { Registry, Gauge } from 'prom-client';
3
+ /**
4
+ * Register the `secret_rotation_previous_set{secret}` gauge on `registry`: 1
5
+ * while a secret's `*_PREVIOUS` rotation value is still set, 0 otherwise. The
6
+ * value is read from api-core's probe registry at scrape time, so it always
7
+ * reflects the live process. Exported so platform (own registry) exposes the
8
+ * identical series; the `SecretRotationPreviousLingering` alert keys on it.
9
+ */
10
+ export declare function registerSecretRotationGauge(registry: Registry): Gauge<'secret'>;
2
11
  /**
3
12
  * Express middleware that records request duration and count.
4
13
  *
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { previousSecretStates, SECRET_ROTATION_PREVIOUS_GAUGE } from '@pipeline-builder/api-core';
3
4
  import { Config } from '@pipeline-builder/pipeline-core';
4
5
  import { Registry, collectDefaultMetrics, Counter, Histogram, Gauge } from 'prom-client';
5
6
  const SERVICE_NAME = Config.getAny('observability').serviceName;
@@ -9,6 +10,27 @@ const register = new Registry();
9
10
  register.setDefaultLabels({ service: SERVICE_NAME });
10
11
  // Collect default Node.js process metrics (CPU, memory, heap, event loop lag, GC)
11
12
  collectDefaultMetrics({ register });
13
+ /**
14
+ * Register the `secret_rotation_previous_set{secret}` gauge on `registry`: 1
15
+ * while a secret's `*_PREVIOUS` rotation value is still set, 0 otherwise. The
16
+ * value is read from api-core's probe registry at scrape time, so it always
17
+ * reflects the live process. Exported so platform (own registry) exposes the
18
+ * identical series; the `SecretRotationPreviousLingering` alert keys on it.
19
+ */
20
+ export function registerSecretRotationGauge(registry) {
21
+ return new Gauge({
22
+ name: SECRET_ROTATION_PREVIOUS_GAUGE,
23
+ help: '1 while a secret rotation previous value (e.g. SECRET_ENCRYPTION_KEY_PREVIOUS) or a retiring signing key is still accepted; see docs/runbooks/secret-rotation.md',
24
+ labelNames: ['secret'],
25
+ registers: [registry],
26
+ collect() {
27
+ for (const { secret, previousSet } of previousSecretStates()) {
28
+ this.set({ secret }, previousSet ? 1 : 0);
29
+ }
30
+ },
31
+ });
32
+ }
33
+ registerSecretRotationGauge(register);
12
34
  /** HTTP request duration histogram (seconds) */
13
35
  const httpRequestDuration = new Histogram({
14
36
  name: 'http_request_duration_seconds',
@@ -230,4 +252,4 @@ function humanizeName(metricName) {
230
252
  .replace(/_/g, ' ')
231
253
  .replace(/^./, (c) => c.toUpperCase());
232
254
  }
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQyxnREFBZ0Q7QUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUN4QyxJQUFJLEVBQUUsK0JBQStCO0lBQ3JDLElBQUksRUFBRSxzQ0FBc0M7SUFDNUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQVU7SUFDdkQsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNsRSxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsMkJBQTJCO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDcEMsSUFB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LENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDO1lBQ2hCLElBQUk7WUFDSixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQztZQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3RCLENBQUMsQ0FBQztRQUNILGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsNERBQTREO0lBQzVELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFJlZ2lzdHJ5LCBjb2xsZWN0RGVmYXVsdE1ldHJpY3MsIENvdW50ZXIsIEhpc3RvZ3JhbSwgR2F1Z2UgfSBmcm9tICdwcm9tLWNsaWVudCc7XG5cbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IChDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JykgYXMgeyBzZXJ2aWNlTmFtZTogc3RyaW5nIH0pLnNlcnZpY2VOYW1lO1xuXG4vKiogU2hhcmVkIFByb21ldGhldXMgcmVnaXN0cnkgKi9cbmNvbnN0IHJlZ2lzdGVyID0gbmV3IFJlZ2lzdHJ5KCk7XG5cbi8vIFNldCBkZWZhdWx0IGxhYmVscyBmb3IgYWxsIG1ldHJpY3NcbnJlZ2lzdGVyLnNldERlZmF1bHRMYWJlbHMoeyBzZXJ2aWNlOiBTRVJWSUNFX05BTUUgfSk7XG5cbi8vIENvbGxlY3QgZGVmYXVsdCBOb2RlLmpzIHByb2Nlc3MgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGhlYXAsIGV2ZW50IGxvb3AgbGFnLCBHQylcbmNvbGxlY3REZWZhdWx0TWV0cmljcyh7IHJlZ2lzdGVyIH0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGR1cmF0aW9uIGhpc3RvZ3JhbSAoc2Vjb25kcykgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0RHVyYXRpb24gPSBuZXcgSGlzdG9ncmFtKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdF9kdXJhdGlvbl9zZWNvbmRzJyxcbiAgaGVscDogJ0R1cmF0aW9uIG9mIEhUVFAgcmVxdWVzdHMgaW4gc2Vjb25kcycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIGJ1Y2tldHM6IFswLjAwNSwgMC4wMSwgMC4wMjUsIDAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwXSxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKiBIVFRQIHJlcXVlc3QgY291bnRlciAqL1xuY29uc3QgaHR0cFJlcXVlc3RzVG90YWwgPSBuZXcgQ291bnRlcih7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RzX3RvdGFsJyxcbiAgaGVscDogJ1RvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnXSBhcyBjb25zdCxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKlxuICogUGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnRlciDigJQgU0FNUExFRCB0byBrZWVwIFByb21ldGhldXMgY2FyZGluYWxpdHlcbiAqIHVuZGVyIGNvbnRyb2wuIENhcmRpbmFsaXR5IG9mIGBvcmdfaWQgKiBtZXRob2QgKiByb3V0ZSAqIHN0YXR1c19jb2RlYFxuICogZ3Jvd3MgbXVsdGlwbGljYXRpdmVseTsgd2l0aCBOIG9yZ3MgKiA1MCByb3V0ZXMgKiA1IHN0YXR1c19jb2RlcyB0aGF0J3NcbiAqIDI1MMOXTiBzZXJpZXMuIFdlIHNhbXBsZSAxLWluLU4gcmVxdWVzdHMgKGNvbmZpZ3VyYWJsZSB2aWFcbiAqIGBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFYCwgZGVmYXVsdCAxLjAgPSBldmVyeSByZXF1ZXN0KS5cbiAqXG4gKiBPcGVyYXRvcnMgYW5zd2VyIFwid2hhdCdzIG9yZyBYJ3MgcDk5P1wiIHZpYSBzZXBhcmF0ZSBwZXItb3JnIGhpc3RvZ3JhbXNcbiAqIHNjcmFwZWQgYXQgYSBsb3dlciByYXRlLCBPUiB2aWEgTG9raSBMb2dRTCBxdWVyaWVzIGFnYWluc3QgdGhlXG4gKiB1bnNhbXBsZWQgYWNjZXNzLWxvZyBzdHJlYW0uIFRoaXMgY291bnRlciBpcyB0aGUgZmFzdC1wYXRoIFwibm9pc3lcbiAqIG5laWdoYm9yIGRldGVjdGlvblwiIOKAlCBvcGVyYXRvcnMgYWxlcnQgd2hlbiBvbmUgb3JnJ3MgcmVxdWVzdCByYXRlXG4gKiBkZXZpYXRlcyBmcm9tIHRoZSBmbGVldCBtZWRpYW4uXG4gKlxuICogTk9UIGEgaGlzdG9ncmFtOiBoaXN0b2dyYW0gbGFiZWwgY2FyZGluYWxpdHkgaXMgZXZlbiBtb3JlIHNlbnNpdGl2ZVxuICogKGVhY2ggYnVja2V0IGlzIGEgc2VwYXJhdGUgc2VyaWVzKS4gSWYgcGVyLW9yZyBsYXRlbmN5IHBlcmNlbnRpbGVzIGFyZVxuICogbmVlZGVkIGxhdGVyLCBhZGQgYSBzZXBhcmF0ZSBoaXN0b2dyYW0gd2l0aCBhIGNvYXJzZXIgYnVja2V0IHNldCBhbmRcbiAqIGxvd2VyIHNhbXBsZSByYXRlLlxuICovXG5jb25zdCBodHRwUmVxdWVzdHNCeU9yZ1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c19ieV9vcmdfdG90YWwnLFxuICBoZWxwOiAnU2FtcGxlZCBwZXItb3JnIEhUVFAgcmVxdWVzdCBjb3VudCAoc2FtcGxlIHJhdGUgdmlhIEhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEUpJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnLCAnb3JnX2lkJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFNhbXBsZSByYXRlIGZvciB0aGUgcGVyLW9yZyBjb3VudGVyLiAxLjAgPSBldmVyeSByZXF1ZXN0LCAwLjAgPSBkaXNhYmxlZC5cbiAqIFBhcnNlZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlCBvcGVyYXRvcnMgdHVuZSBieSByZXN0YXJ0aW5nIHRoZSBzZXJ2aWNlLlxuICpcbiAqIERlZmF1bHRzIHRvIDAgKE9GRikuIGBvcmdfaWRgIGlzIGFuIFVOQk9VTkRFRCwgdGVuYW50LWlkZW50aWZ5aW5nIGxhYmVsIGFuZFxuICogcHJvbS1jbGllbnQgY291bnRlcnMgbmV2ZXIgZXhwaXJlLCBzbyBhdCB0aGUgb2xkIGRlZmF1bHQgb2YgMS4wIGV2ZXJ5IHNlcnZpY2VcbiAqIGFjY3VtdWxhdGVkIGEgc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmRcbiAqIGAvbWV0cmljc2Ag4oCUIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVkIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoXG4gKiBpdHMgcmVxdWVzdCB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjb3VsZCByZWFjaCB0aGUgcG9ydC5cbiAqXG4gKiBUdXJuIGl0IG9uIGRlbGliZXJhdGVseSAoYW5kIGlkZWFsbHkgd2l0aCBhIHNhbXBsZSByYXRlIHdlbGwgdW5kZXIgMS4wLCBwbHVzXG4gKiBgTUVUUklDU19TQ1JBUEVfVE9LRU5gIHNldCkgd2hlbiB5b3UgYWN0dWFsbHkgd2FudCBwZXItb3JnIG5vaXN5LW5laWdoYm91clxuICogZGV0ZWN0aW9uIGZyb20gbWV0cmljcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBhY2Nlc3MtbG9nIHN0cmVhbS5cbiAqL1xuY29uc3QgT1JHX1NBTVBMRV9SQVRFID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiAwO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhdyk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSB8fCBwYXJzZWQgPCAwIHx8IHBhcnNlZCA+IDEpIHJldHVybiAwO1xuICByZXR1cm4gcGFyc2VkO1xufSkoKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gRXhwcmVzcyByb3V0ZSBwYXRoIHRvIHByZXZlbnQgbGFiZWwgY2FyZGluYWxpdHkgZXhwbG9zaW9uLlxuICpcbiAqIFVzZXMgRXhwcmVzcydzIG1hdGNoZWQgcm91dGUgcGF0dGVybiAoZS5nLiBgL3BsdWdpbnMvOmlkYCkgd2hlbiBhdmFpbGFibGUsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgcmF3IHBhdGggd2l0aCBVVUlEL251bWVyaWMgc2VnbWVudHMgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlKHJlcTogUmVxdWVzdCk6IHN0cmluZyB7XG4gIC8vIFByZWZlciBFeHByZXNzIG1hdGNoZWQgcm91dGUgcGF0dGVyblxuICBpZiAocmVxLnJvdXRlPy5wYXRoKSB7XG4gICAgcmV0dXJuIHJlcS5iYXNlVXJsICsgcmVxLnJvdXRlLnBhdGg7XG4gIH1cblxuICAvLyBGYWxsYmFjazogcmVwbGFjZSBVVUlEcyBhbmQgbnVtZXJpYyBJRHMgd2l0aCA6aWRcbiAgcmV0dXJuIHJlcS5wYXRoXG4gICAgLnJlcGxhY2UoL1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfS9naSwgJzppZCcpXG4gICAgLnJlcGxhY2UoL1xcL1xcZCsoPz1cXC98JCkvZywgJy86aWQnKTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50LlxuICpcbiAqIE11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgcm91dGUgaGFuZGxlcnMgc28gYHJlcy5vbignZmluaXNoJylgIGZpcmVzXG4gKiBhZnRlciB0aGUgcmVzcG9uc2UgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NNaWRkbGV3YXJlKCkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgLy8gTk9URTogbm8gL21ldHJpY3Mgb3IgL2hlYWx0aCBza2lwIG5lZWRlZCBoZXJlIOKAlCBib3RoIGVuZHBvaW50cyBhcmVcbiAgICAvLyByZWdpc3RlcmVkIGluIGFwcC1mYWN0b3J5IEJFRk9SRSB0aGlzIG1pZGRsZXdhcmUgKGNyZWF0ZUhlYWx0aFJvdXRlciBhbmRcbiAgICAvLyBhcHAuZ2V0KCcvbWV0cmljcycpIGJvdGggdGVybWluYXRlIHRoZSByZXNwb25zZSksIHNvIG5laXRoZXIgZXZlciByZWFjaGVzXG4gICAgLy8gdGhpcyBoYW5kbGVyLlxuICAgIGNvbnN0IGVuZCA9IGh0dHBSZXF1ZXN0RHVyYXRpb24uc3RhcnRUaW1lcigpO1xuXG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZSA9IG5vcm1hbGl6ZVJvdXRlKHJlcSk7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHN0YXR1c19jb2RlOiBTdHJpbmcocmVzLnN0YXR1c0NvZGUpLFxuICAgICAgfTtcblxuICAgICAgZW5kKGxhYmVscyk7XG4gICAgICBodHRwUmVxdWVzdHNUb3RhbC5pbmMobGFiZWxzKTtcblxuICAgICAgLy8gUGVyLW9yZyBzYW1wbGVkIGNvdW50ZXIuIFNraXAgd2hlbjpcbiAgICAgIC8vICAgLSBubyBvcmcgY29udGV4dCBvbiB0aGUgcmVxdWVzdCAoYW5vbnltb3VzIC8gaGVhbHRoIGVuZHBvaW50cylcbiAgICAgIC8vICAgLSBzYW1wbGUgcmF0ZSBpcyAwIChkaXNhYmxlZClcbiAgICAgIC8vICAgLSBkaWNlIHJvbGwgZmFpbHNcbiAgICAgIC8vIFVzaW5nIE1hdGgucmFuZG9tIGZvciB0aGUgc2FtcGxlciDigJQgZm9yIHVuYmlhc2VkIGxvdy1yYXRlIHNhbXBsaW5nXG4gICAgICAvLyBhIGRldGVybWluaXN0aWMgcGVyLXJlcXVlc3QgaGFzaCB3b3VsZCBiZSBtb3JlIHVuaWZvcm0sIGJ1dCBhdCB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmF0ZSBvZiAxLjAgZXZlcnkgcmVxdWVzdCBsYW5kcyBzbyB0aGlzIGlzIGZpbmUuXG4gICAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZDtcbiAgICAgIGlmIChvcmdJZCAmJiBPUkdfU0FNUExFX1JBVEUgPiAwICYmIE1hdGgucmFuZG9tKCkgPCBPUkdfU0FNUExFX1JBVEUpIHtcbiAgICAgICAgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbC5pbmMoeyAuLi5sYWJlbHMsIG9yZ19pZDogb3JnSWQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBoYW5kbGVyIHRoYXQgcmV0dXJucyBQcm9tZXRoZXVzIG1ldHJpY3MgaW4gdGV4dCBleHBvc2l0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NIYW5kbGVyKCkge1xuICByZXR1cm4gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCByZWdpc3Rlci5jb250ZW50VHlwZSk7XG4gICAgcmVzLmVuZChhd2FpdCByZWdpc3Rlci5tZXRyaWNzKCkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1c2luZXNzIC8gZG9tYWluIG1ldHJpY3Ncbi8vXG4vLyBTZXJ2aWNlcyBzaG91bGQgZW1pdCBjb3VudGVycyBmb3IgdGhlIHRoaW5ncyBvcGVyYXRvcnMgYWN0dWFsbHkgY2FyZSBhYm91dFxuLy8gKHBpcGVsaW5lcyBnZW5lcmF0ZWQsIHBsdWdpbiBidWlsZHMgY29tcGxldGVkLCBjb21wbGlhbmNlIHZpb2xhdGlvbnMsXG4vLyBBSSB0b2tlbnMgY29uc3VtZWQpIOKAlCBub3QganVzdCBIVFRQIHRyYWZmaWMuIFRoZSBoZWxwZXJzIGJlbG93IHJlZ2lzdGVyXG4vLyBjb3VudGVycyBsYXppbHkgb24gdGhlIHNoYXJlZCByZWdpc3RyeSBzbyBtdWx0aXBsZSBzZXJ2aWNlcyBjYW4gY2FsbFxuLy8gYGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSlgIHdpdGhvdXRcbi8vIHdvcnJ5aW5nIGFib3V0IGRvdWJsZS1yZWdpc3RyYXRpb24uXG4vL1xuLy8gTmFtaW5nIGNvbnZlbnRpb246IGA8ZG9tYWluPl88bm91bj5fdG90YWxgIGZvciBjb3VudGVycywgYF9zZWNvbmRzYCBmb3Jcbi8vIGhpc3RvZ3JhbXMg4oCUIG1hdGNoZXMgUHJvbWV0aGV1cyBiZXN0LXByYWN0aWNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGJ1c2luZXNzQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgQ291bnRlcjxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIEhpc3RvZ3JhbTxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NHYXVnZXMgPSBuZXcgTWFwPHN0cmluZywgR2F1Z2U8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYSBidXNpbmVzcyBjb3VudGVyLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGluY0NvdW50ZXIoJ3BpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWwnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJyB9KTtcbiAqIGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbCcsIHsgdHlwZTogJ2FpQ2FsbHMnLCB0aWVyOiAncHJvJyB9KTtcbiAqIGluY0NvdW50ZXIoJ2NvbXBsaWFuY2VfdmlvbGF0aW9uc19mb3VuZF90b3RhbCcsIHsgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGxldCBjb3VudGVyID0gYnVzaW5lc3NDb3VudGVycy5nZXQobmFtZSk7XG4gIGlmICghY291bnRlcikge1xuICAgIGNvdW50ZXIgPSBuZXcgQ291bnRlcih7XG4gICAgICBuYW1lLFxuICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0NvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgfVxuICBjb3VudGVyLmluYyhsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgbW9kZWw6ICdzb25uZXQnIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBidWlsZFR5cGU6ICdkb2NrZXInIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBsZXQgaGlzdCA9IGJ1c2luZXNzSGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gIGlmICghaGlzdCkge1xuICAgIGhpc3QgPSBuZXcgSGlzdG9ncmFtKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGUgb2JzZXJ2YXRpb25zLlxuICAgICAgLy8gT3ZlcnJpZGUgYnkgcmVnaXN0ZXJpbmcgdGhlIGhpc3RvZ3JhbSBleHBsaWNpdGx5IGJlZm9yZSBmaXJzdCBjYWxsXG4gICAgICAvLyBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBidWNrZXQgZGlzdHJpYnV0aW9uLlxuICAgICAgYnVja2V0czogWzAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwLCAzMCwgNjAsIDEyMCwgMzAwXSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0hpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICB9XG4gIGhpc3Qub2JzZXJ2ZShsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGxldCBnYXVnZSA9IGJ1c2luZXNzR2F1Z2VzLmdldChuYW1lKTtcbiAgaWYgKCFnYXVnZSkge1xuICAgIGdhdWdlID0gbmV3IEdhdWdlKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxuICAgIH0pO1xuICAgIGJ1c2luZXNzR2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gIH1cbiAgZ2F1Z2Uuc2V0KGxhYmVscywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZU5hbWUobWV0cmljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gYHBpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWxgIOKGkiBcIlBpcGVsaW5lcyBnZW5lcmF0ZWQgdG90YWxcIlxuICByZXR1cm4gbWV0cmljTmFtZVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cbiJdfQ==
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxD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T0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7U0FDbEIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcmV2aW91c1NlY3JldFN0YXRlcywgU0VDUkVUX1JPVEFUSU9OX1BSRVZJT1VTX0dBVUdFIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFJlZ2lzdHJ5LCBjb2xsZWN0RGVmYXVsdE1ldHJpY3MsIENvdW50ZXIsIEhpc3RvZ3JhbSwgR2F1Z2UgfSBmcm9tICdwcm9tLWNsaWVudCc7XG5cbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IChDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JykgYXMgeyBzZXJ2aWNlTmFtZTogc3RyaW5nIH0pLnNlcnZpY2VOYW1lO1xuXG4vKiogU2hhcmVkIFByb21ldGhldXMgcmVnaXN0cnkgKi9cbmNvbnN0IHJlZ2lzdGVyID0gbmV3IFJlZ2lzdHJ5KCk7XG5cbi8vIFNldCBkZWZhdWx0IGxhYmVscyBmb3IgYWxsIG1ldHJpY3NcbnJlZ2lzdGVyLnNldERlZmF1bHRMYWJlbHMoeyBzZXJ2aWNlOiBTRVJWSUNFX05BTUUgfSk7XG5cbi8vIENvbGxlY3QgZGVmYXVsdCBOb2RlLmpzIHByb2Nlc3MgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGhlYXAsIGV2ZW50IGxvb3AgbGFnLCBHQylcbmNvbGxlY3REZWZhdWx0TWV0cmljcyh7IHJlZ2lzdGVyIH0pO1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgc2VjcmV0X3JvdGF0aW9uX3ByZXZpb3VzX3NldHtzZWNyZXR9YCBnYXVnZSBvbiBgcmVnaXN0cnlgOiAxXG4gKiB3aGlsZSBhIHNlY3JldCdzIGAqX1BSRVZJT1VTYCByb3RhdGlvbiB2YWx1ZSBpcyBzdGlsbCBzZXQsIDAgb3RoZXJ3aXNlLiBUaGVcbiAqIHZhbHVlIGlzIHJlYWQgZnJvbSBhcGktY29yZSdzIHByb2JlIHJlZ2lzdHJ5IGF0IHNjcmFwZSB0aW1lLCBzbyBpdCBhbHdheXNcbiAqIHJlZmxlY3RzIHRoZSBsaXZlIHByb2Nlc3MuIEV4cG9ydGVkIHNvIHBsYXRmb3JtIChvd24gcmVnaXN0cnkpIGV4cG9zZXMgdGhlXG4gKiBpZGVudGljYWwgc2VyaWVzOyB0aGUgYFNlY3JldFJvdGF0aW9uUHJldmlvdXNMaW5nZXJpbmdgIGFsZXJ0IGtleXMgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNlY3JldFJvdGF0aW9uR2F1Z2UocmVnaXN0cnk6IFJlZ2lzdHJ5KTogR2F1Z2U8J3NlY3JldCc+IHtcbiAgcmV0dXJuIG5ldyBHYXVnZSh7XG4gICAgbmFtZTogU0VDUkVUX1JPVEFUSU9OX1BSRVZJT1VTX0dBVUdFLFxuICAgIGhlbHA6ICcxIHdoaWxlIGEgc2VjcmV0IHJvdGF0aW9uIHByZXZpb3VzIHZhbHVlIChlLmcuIFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUykgb3IgYSByZXRpcmluZyBzaWduaW5nIGtleSBpcyBzdGlsbCBhY2NlcHRlZDsgc2VlIGRvY3MvcnVuYm9va3Mvc2VjcmV0LXJvdGF0aW9uLm1kJyxcbiAgICBsYWJlbE5hbWVzOiBbJ3NlY3JldCddIGFzIGNvbnN0LFxuICAgIHJlZ2lzdGVyczogW3JlZ2lzdHJ5XSxcbiAgICBjb2xsZWN0KCkge1xuICAgICAgZm9yIChjb25zdCB7IHNlY3JldCwgcHJldmlvdXNTZXQgfSBvZiBwcmV2aW91c1NlY3JldFN0YXRlcygpKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc2VjcmV0IH0sIHByZXZpb3VzU2V0ID8gMSA6IDApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5yZWdpc3RlclNlY3JldFJvdGF0aW9uR2F1Z2UocmVnaXN0ZXIpO1xuXG4vKiogSFRUUCByZXF1ZXN0IGR1cmF0aW9uIGhpc3RvZ3JhbSAoc2Vjb25kcykgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0RHVyYXRpb24gPSBuZXcgSGlzdG9ncmFtKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdF9kdXJhdGlvbl9zZWNvbmRzJyxcbiAgaGVscDogJ0R1cmF0aW9uIG9mIEhUVFAgcmVxdWVzdHMgaW4gc2Vjb25kcycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIGJ1Y2tldHM6IFswLjAwNSwgMC4wMSwgMC4wMjUsIDAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwXSxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKiBIVFRQIHJlcXVlc3QgY291bnRlciAqL1xuY29uc3QgaHR0cFJlcXVlc3RzVG90YWwgPSBuZXcgQ291bnRlcih7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RzX3RvdGFsJyxcbiAgaGVscDogJ1RvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnXSBhcyBjb25zdCxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKlxuICogUGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnRlciDigJQgU0FNUExFRCB0byBrZWVwIFByb21ldGhldXMgY2FyZGluYWxpdHlcbiAqIHVuZGVyIGNvbnRyb2wuIENhcmRpbmFsaXR5IG9mIGBvcmdfaWQgKiBtZXRob2QgKiByb3V0ZSAqIHN0YXR1c19jb2RlYFxuICogZ3Jvd3MgbXVsdGlwbGljYXRpdmVseTsgd2l0aCBOIG9yZ3MgKiA1MCByb3V0ZXMgKiA1IHN0YXR1c19jb2RlcyB0aGF0J3NcbiAqIDI1MMOXTiBzZXJpZXMuIFdlIHNhbXBsZSAxLWluLU4gcmVxdWVzdHMgKGNvbmZpZ3VyYWJsZSB2aWFcbiAqIGBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFYCwgZGVmYXVsdCAxLjAgPSBldmVyeSByZXF1ZXN0KS5cbiAqXG4gKiBPcGVyYXRvcnMgYW5zd2VyIFwid2hhdCdzIG9yZyBYJ3MgcDk5P1wiIHZpYSBzZXBhcmF0ZSBwZXItb3JnIGhpc3RvZ3JhbXNcbiAqIHNjcmFwZWQgYXQgYSBsb3dlciByYXRlLCBPUiB2aWEgTG9raSBMb2dRTCBxdWVyaWVzIGFnYWluc3QgdGhlXG4gKiB1bnNhbXBsZWQgYWNjZXNzLWxvZyBzdHJlYW0uIFRoaXMgY291bnRlciBpcyB0aGUgZmFzdC1wYXRoIFwibm9pc3lcbiAqIG5laWdoYm9yIGRldGVjdGlvblwiIOKAlCBvcGVyYXRvcnMgYWxlcnQgd2hlbiBvbmUgb3JnJ3MgcmVxdWVzdCByYXRlXG4gKiBkZXZpYXRlcyBmcm9tIHRoZSBmbGVldCBtZWRpYW4uXG4gKlxuICogTk9UIGEgaGlzdG9ncmFtOiBoaXN0b2dyYW0gbGFiZWwgY2FyZGluYWxpdHkgaXMgZXZlbiBtb3JlIHNlbnNpdGl2ZVxuICogKGVhY2ggYnVja2V0IGlzIGEgc2VwYXJhdGUgc2VyaWVzKS4gSWYgcGVyLW9yZyBsYXRlbmN5IHBlcmNlbnRpbGVzIGFyZVxuICogbmVlZGVkIGxhdGVyLCBhZGQgYSBzZXBhcmF0ZSBoaXN0b2dyYW0gd2l0aCBhIGNvYXJzZXIgYnVja2V0IHNldCBhbmRcbiAqIGxvd2VyIHNhbXBsZSByYXRlLlxuICovXG5jb25zdCBodHRwUmVxdWVzdHNCeU9yZ1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c19ieV9vcmdfdG90YWwnLFxuICBoZWxwOiAnU2FtcGxlZCBwZXItb3JnIEhUVFAgcmVxdWVzdCBjb3VudCAoc2FtcGxlIHJhdGUgdmlhIEhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEUpJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnLCAnb3JnX2lkJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFNhbXBsZSByYXRlIGZvciB0aGUgcGVyLW9yZyBjb3VudGVyLiAxLjAgPSBldmVyeSByZXF1ZXN0LCAwLjAgPSBkaXNhYmxlZC5cbiAqIFBhcnNlZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlCBvcGVyYXRvcnMgdHVuZSBieSByZXN0YXJ0aW5nIHRoZSBzZXJ2aWNlLlxuICpcbiAqIERlZmF1bHRzIHRvIDAgKE9GRikuIGBvcmdfaWRgIGlzIGFuIFVOQk9VTkRFRCwgdGVuYW50LWlkZW50aWZ5aW5nIGxhYmVsIGFuZFxuICogcHJvbS1jbGllbnQgY291bnRlcnMgbmV2ZXIgZXhwaXJlLCBzbyBhdCB0aGUgb2xkIGRlZmF1bHQgb2YgMS4wIGV2ZXJ5IHNlcnZpY2VcbiAqIGFjY3VtdWxhdGVkIGEgc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmRcbiAqIGAvbWV0cmljc2Ag4oCUIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVkIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoXG4gKiBpdHMgcmVxdWVzdCB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjb3VsZCByZWFjaCB0aGUgcG9ydC5cbiAqXG4gKiBUdXJuIGl0IG9uIGRlbGliZXJhdGVseSAoYW5kIGlkZWFsbHkgd2l0aCBhIHNhbXBsZSByYXRlIHdlbGwgdW5kZXIgMS4wLCBwbHVzXG4gKiBgTUVUUklDU19TQ1JBUEVfVE9LRU5gIHNldCkgd2hlbiB5b3UgYWN0dWFsbHkgd2FudCBwZXItb3JnIG5vaXN5LW5laWdoYm91clxuICogZGV0ZWN0aW9uIGZyb20gbWV0cmljcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBhY2Nlc3MtbG9nIHN0cmVhbS5cbiAqL1xuY29uc3QgT1JHX1NBTVBMRV9SQVRFID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiAwO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhdyk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSB8fCBwYXJzZWQgPCAwIHx8IHBhcnNlZCA+IDEpIHJldHVybiAwO1xuICByZXR1cm4gcGFyc2VkO1xufSkoKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gRXhwcmVzcyByb3V0ZSBwYXRoIHRvIHByZXZlbnQgbGFiZWwgY2FyZGluYWxpdHkgZXhwbG9zaW9uLlxuICpcbiAqIFVzZXMgRXhwcmVzcydzIG1hdGNoZWQgcm91dGUgcGF0dGVybiAoZS5nLiBgL3BsdWdpbnMvOmlkYCkgd2hlbiBhdmFpbGFibGUsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgcmF3IHBhdGggd2l0aCBVVUlEL251bWVyaWMgc2VnbWVudHMgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlKHJlcTogUmVxdWVzdCk6IHN0cmluZyB7XG4gIC8vIFByZWZlciBFeHByZXNzIG1hdGNoZWQgcm91dGUgcGF0dGVyblxuICBpZiAocmVxLnJvdXRlPy5wYXRoKSB7XG4gICAgcmV0dXJuIHJlcS5iYXNlVXJsICsgcmVxLnJvdXRlLnBhdGg7XG4gIH1cblxuICAvLyBGYWxsYmFjazogcmVwbGFjZSBVVUlEcyBhbmQgbnVtZXJpYyBJRHMgd2l0aCA6aWRcbiAgcmV0dXJuIHJlcS5wYXRoXG4gICAgLnJlcGxhY2UoL1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfS9naSwgJzppZCcpXG4gICAgLnJlcGxhY2UoL1xcL1xcZCsoPz1cXC98JCkvZywgJy86aWQnKTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50LlxuICpcbiAqIE11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgcm91dGUgaGFuZGxlcnMgc28gYHJlcy5vbignZmluaXNoJylgIGZpcmVzXG4gKiBhZnRlciB0aGUgcmVzcG9uc2UgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NNaWRkbGV3YXJlKCkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgLy8gTk9URTogbm8gL21ldHJpY3Mgb3IgL2hlYWx0aCBza2lwIG5lZWRlZCBoZXJlIOKAlCBib3RoIGVuZHBvaW50cyBhcmVcbiAgICAvLyByZWdpc3RlcmVkIGluIGFwcC1mYWN0b3J5IEJFRk9SRSB0aGlzIG1pZGRsZXdhcmUgKGNyZWF0ZUhlYWx0aFJvdXRlciBhbmRcbiAgICAvLyBhcHAuZ2V0KCcvbWV0cmljcycpIGJvdGggdGVybWluYXRlIHRoZSByZXNwb25zZSksIHNvIG5laXRoZXIgZXZlciByZWFjaGVzXG4gICAgLy8gdGhpcyBoYW5kbGVyLlxuICAgIGNvbnN0IGVuZCA9IGh0dHBSZXF1ZXN0RHVyYXRpb24uc3RhcnRUaW1lcigpO1xuXG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZSA9IG5vcm1hbGl6ZVJvdXRlKHJlcSk7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHN0YXR1c19jb2RlOiBTdHJpbmcocmVzLnN0YXR1c0NvZGUpLFxuICAgICAgfTtcblxuICAgICAgZW5kKGxhYmVscyk7XG4gICAgICBodHRwUmVxdWVzdHNUb3RhbC5pbmMobGFiZWxzKTtcblxuICAgICAgLy8gUGVyLW9yZyBzYW1wbGVkIGNvdW50ZXIuIFNraXAgd2hlbjpcbiAgICAgIC8vICAgLSBubyBvcmcgY29udGV4dCBvbiB0aGUgcmVxdWVzdCAoYW5vbnltb3VzIC8gaGVhbHRoIGVuZHBvaW50cylcbiAgICAgIC8vICAgLSBzYW1wbGUgcmF0ZSBpcyAwIChkaXNhYmxlZClcbiAgICAgIC8vICAgLSBkaWNlIHJvbGwgZmFpbHNcbiAgICAgIC8vIFVzaW5nIE1hdGgucmFuZG9tIGZvciB0aGUgc2FtcGxlciDigJQgZm9yIHVuYmlhc2VkIGxvdy1yYXRlIHNhbXBsaW5nXG4gICAgICAvLyBhIGRldGVybWluaXN0aWMgcGVyLXJlcXVlc3QgaGFzaCB3b3VsZCBiZSBtb3JlIHVuaWZvcm0sIGJ1dCBhdCB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmF0ZSBvZiAxLjAgZXZlcnkgcmVxdWVzdCBsYW5kcyBzbyB0aGlzIGlzIGZpbmUuXG4gICAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZDtcbiAgICAgIGlmIChvcmdJZCAmJiBPUkdfU0FNUExFX1JBVEUgPiAwICYmIE1hdGgucmFuZG9tKCkgPCBPUkdfU0FNUExFX1JBVEUpIHtcbiAgICAgICAgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbC5pbmMoeyAuLi5sYWJlbHMsIG9yZ19pZDogb3JnSWQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBoYW5kbGVyIHRoYXQgcmV0dXJucyBQcm9tZXRoZXVzIG1ldHJpY3MgaW4gdGV4dCBleHBvc2l0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NIYW5kbGVyKCkge1xuICByZXR1cm4gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCByZWdpc3Rlci5jb250ZW50VHlwZSk7XG4gICAgcmVzLmVuZChhd2FpdCByZWdpc3Rlci5tZXRyaWNzKCkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1c2luZXNzIC8gZG9tYWluIG1ldHJpY3Ncbi8vXG4vLyBTZXJ2aWNlcyBzaG91bGQgZW1pdCBjb3VudGVycyBmb3IgdGhlIHRoaW5ncyBvcGVyYXRvcnMgYWN0dWFsbHkgY2FyZSBhYm91dFxuLy8gKHBpcGVsaW5lcyBnZW5lcmF0ZWQsIHBsdWdpbiBidWlsZHMgY29tcGxldGVkLCBjb21wbGlhbmNlIHZpb2xhdGlvbnMsXG4vLyBBSSB0b2tlbnMgY29uc3VtZWQpIOKAlCBub3QganVzdCBIVFRQIHRyYWZmaWMuIFRoZSBoZWxwZXJzIGJlbG93IHJlZ2lzdGVyXG4vLyBjb3VudGVycyBsYXppbHkgb24gdGhlIHNoYXJlZCByZWdpc3RyeSBzbyBtdWx0aXBsZSBzZXJ2aWNlcyBjYW4gY2FsbFxuLy8gYGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSlgIHdpdGhvdXRcbi8vIHdvcnJ5aW5nIGFib3V0IGRvdWJsZS1yZWdpc3RyYXRpb24uXG4vL1xuLy8gTmFtaW5nIGNvbnZlbnRpb246IGA8ZG9tYWluPl88bm91bj5fdG90YWxgIGZvciBjb3VudGVycywgYF9zZWNvbmRzYCBmb3Jcbi8vIGhpc3RvZ3JhbXMg4oCUIG1hdGNoZXMgUHJvbWV0aGV1cyBiZXN0LXByYWN0aWNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGJ1c2luZXNzQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgQ291bnRlcjxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIEhpc3RvZ3JhbTxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NHYXVnZXMgPSBuZXcgTWFwPHN0cmluZywgR2F1Z2U8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYSBidXNpbmVzcyBjb3VudGVyLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGluY0NvdW50ZXIoJ3BpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWwnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJyB9KTtcbiAqIGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbCcsIHsgdHlwZTogJ2FpQ2FsbHMnLCB0aWVyOiAncHJvJyB9KTtcbiAqIGluY0NvdW50ZXIoJ2NvbXBsaWFuY2VfdmlvbGF0aW9uc19mb3VuZF90b3RhbCcsIHsgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGxldCBjb3VudGVyID0gYnVzaW5lc3NDb3VudGVycy5nZXQobmFtZSk7XG4gIGlmICghY291bnRlcikge1xuICAgIGNvdW50ZXIgPSBuZXcgQ291bnRlcih7XG4gICAgICBuYW1lLFxuICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0NvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgfVxuICBjb3VudGVyLmluYyhsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgbW9kZWw6ICdzb25uZXQnIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBidWlsZFR5cGU6ICdkb2NrZXInIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBsZXQgaGlzdCA9IGJ1c2luZXNzSGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gIGlmICghaGlzdCkge1xuICAgIGhpc3QgPSBuZXcgSGlzdG9ncmFtKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGUgb2JzZXJ2YXRpb25zLlxuICAgICAgLy8gT3ZlcnJpZGUgYnkgcmVnaXN0ZXJpbmcgdGhlIGhpc3RvZ3JhbSBleHBsaWNpdGx5IGJlZm9yZSBmaXJzdCBjYWxsXG4gICAgICAvLyBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBidWNrZXQgZGlzdHJpYnV0aW9uLlxuICAgICAgYnVja2V0czogWzAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwLCAzMCwgNjAsIDEyMCwgMzAwXSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0hpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICB9XG4gIGhpc3Qub2JzZXJ2ZShsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGxldCBnYXVnZSA9IGJ1c2luZXNzR2F1Z2VzLmdldChuYW1lKTtcbiAgaWYgKCFnYXVnZSkge1xuICAgIGdhdWdlID0gbmV3IEdhdWdlKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxuICAgIH0pO1xuICAgIGJ1c2luZXNzR2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gIH1cbiAgZ2F1Z2Uuc2V0KGxhYmVscywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZU5hbWUobWV0cmljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gYHBpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWxgIOKGkiBcIlBpcGVsaW5lcyBnZW5lcmF0ZWQgdG90YWxcIlxuICByZXR1cm4gbWV0cmljTmFtZVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cbiJdfQ==
@@ -1,8 +1,8 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { requireAuth } from '@pipeline-builder/api-core';
3
4
  import { checkQuota } from './check-quota.js';
4
5
  import { idempotencyMiddleware } from './idempotency-middleware.js';
5
- import { requireAuth } from './middleware.js';
6
6
  import { requireOrgId } from './require-org-id.js';
7
7
  import { withTenantContext } from './tenant-context.js';
8
8
  /**
@@ -77,4 +77,4 @@ export function createAuthenticatedWithOrgRoute() {
77
77
  withTenantContext(),
78
78
  ];
79
79
  }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUl0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQTBCLEVBQzFCLFNBQW9CO0lBRXBCLE9BQU87UUFDTCxXQUE2QjtRQUM3QixZQUFZLEVBQW9CO1FBQ2hDLHFCQUFxQixFQUFvQjtRQUN6QyxpQkFBaUIsRUFBb0I7UUFDckMsVUFBVSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQW1CO0tBQ3RELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSwrQkFBK0I7SUFDN0MsT0FBTztRQUNMLFdBQTZCO1FBQzdCLFlBQVksRUFBb0I7UUFDaEMsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UscUJBQXFCLEVBQW9CO1FBQ3pDLGlCQUFpQixFQUFvQjtLQUN0QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSwgUXVvdGFTZXJ2aWNlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0SGFuZGxlciB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgY2hlY2tRdW90YSB9IGZyb20gJy4vY2hlY2stcXVvdGEuanMnO1xuaW1wb3J0IHsgaWRlbXBvdGVuY3lNaWRkbGV3YXJlIH0gZnJvbSAnLi9pZGVtcG90ZW5jeS1taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IHJlcXVpcmVBdXRoIH0gZnJvbSAnLi9taWRkbGV3YXJlLmpzJztcbmltcG9ydCB7IHJlcXVpcmVPcmdJZCB9IGZyb20gJy4vcmVxdWlyZS1vcmctaWQuanMnO1xuaW1wb3J0IHsgd2l0aFRlbmFudENvbnRleHQgfSBmcm9tICcuL3RlbmFudC1jb250ZXh0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWlkZGxld2FyZSBjaGFpbiBmb3IgcHJvdGVjdGVkIHJvdXRlcyByZXF1aXJpbmcgYXV0aGVudGljYXRpb24sIG9yZyBJRCwgYW5kIHF1b3RhIGNoZWNrLlxuICpcbiAqIEFwcGxpZXMgbWlkZGxld2FyZSBpbiBvcmRlcjpcbiAqIDEuIHJlcXVpcmVBdXRoIC0gVmFsaWRhdGVzIEpXVCBhbmQgZXh0cmFjdHMgdXNlciBpZGVudGl0eVxuICogMi4gcmVxdWlyZU9yZ0lkIC0gRW5zdXJlcyByZXF1ZXN0IGhhcyB4LW9yZy1pZCBoZWFkZXJcbiAqIDMuIGlkZW1wb3RlbmN5TWlkZGxld2FyZSAtIERlZHVwZXMga2V5ZWQgbXV0YXRpb24gcmV0cmllcyAobm8tb3Agd2l0aG91dCBhblxuICogICAgSWRlbXBvdGVuY3ktS2V5IGhlYWRlciBvciBvbiBub24tbXV0YXRpb24gbWV0aG9kcylcbiAqIDQuIHdpdGhUZW5hbnRDb250ZXh0IC0gT3BlbnMgdGhlIFJMUyB0ZW5hbnQgc2NvcGUgKG9yZ0lkICsgaXNTdXBlckFkbWluKSBmb3IgdGhlIHJlcXVlc3RcbiAqIDUuIGNoZWNrUXVvdGEgLSBWYWxpZGF0ZXMgcXVvdGEgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZVxuICpcbiAqIElkZW1wb3RlbmN5IHNpdHMgQUZURVIgYXV0aCtvcmdJZCAoc28gaXQgY2FuIG5hbWVzcGFjZSB0aGUgcmVwbGF5IGNhY2hlIG9uIHRoZVxuICogVkVSSUZJRUQgb3JnIOKAlCBhIHByZS1hdXRoIGdsb2JhbCBtb3VudCBzYXcgbm8gaWRlbnRpdHkgYW5kIHdhcyBhIHBlcm1hbmVudFxuICogbm8tb3ApIGFuZCBCRUZPUkUgd2l0aFRlbmFudENvbnRleHQvY2hlY2tRdW90YSAoc28gYSByZXBsYXllZCByZXF1ZXN0IHNob3J0LVxuICogY2lyY3VpdHMgd2l0aG91dCBvcGVuaW5nIGFuIFJMUyBzY29wZSBvciBzcGVuZGluZyBhIHF1b3RhIGNoZWNrKS5cbiAqXG4gKiBAcGFyYW0gcXVvdGFTZXJ2aWNlIC0gUXVvdGEgc2VydmljZSBjbGllbnRcbiAqIEBwYXJhbSBxdW90YVR5cGUgLSBXaGljaCBxdW90YSB0byBjaGVjayAoZS5nLiwgJ2FwaUNhbGxzJywgJ3BpcGVsaW5lcycsICdwbHVnaW5zJylcbiAqIEByZXR1cm5zIEFycmF5IG9mIG1pZGRsZXdhcmUgaGFuZGxlcnMgcmVhZHkgdG8gc3ByZWFkIGludG8gcm91dGUgZGVmaW5pdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiByb3V0ZXIucG9zdCgnLycsXG4gKiAgIC4uLmNyZWF0ZVByb3RlY3RlZFJvdXRlKHF1b3RhU2VydmljZSwgJ3BpcGVsaW5lcycpLFxuICogICBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgICAvLyBIYW5kbGVyIGltcGxlbWVudGF0aW9uXG4gKiAgIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3RlY3RlZFJvdXRlKFxuICBxdW90YVNlcnZpY2U6IFF1b3RhU2VydmljZSxcbiAgcXVvdGFUeXBlOiBRdW90YVR5cGUsXG4pOiBSZXF1ZXN0SGFuZGxlcltdIHtcbiAgcmV0dXJuIFtcbiAgICByZXF1aXJlQXV0aCBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgICByZXF1aXJlT3JnSWQoKSBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgICBpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKSBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgICB3aXRoVGVuYW50Q29udGV4dCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIGNoZWNrUXVvdGEocXVvdGFTZXJ2aWNlLCBxdW90YVR5cGUpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtaWRkbGV3YXJlIGNoYWluIGZvciBhdXRoZW50aWNhdGVkIHJvdXRlcyB3aXRoIG9yZyBJRCByZXF1aXJlbWVudCBidXQgbm8gcXVvdGEgY2hlY2suXG4gKlxuICogQXBwbGllcyBtaWRkbGV3YXJlIGluIG9yZGVyOlxuICogMS4gcmVxdWlyZUF1dGggLSBWYWxpZGF0ZXMgSldUIGFuZCBleHRyYWN0cyB1c2VyIGlkZW50aXR5XG4gKiAyLiByZXF1aXJlT3JnSWQgLSBFbnN1cmVzIHJlcXVlc3QgaGFzIHgtb3JnLWlkIGhlYWRlclxuICogMy4gd2l0aFRlbmFudENvbnRleHQgLSBPcGVucyB0aGUgUkxTIHRlbmFudCBzY29wZSAob3JnSWQgKyBpc1N1cGVyQWRtaW4pIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIFVzZSB0aGlzIGZvciByZWFkLW9ubHkgcm91dGVzIHRoYXQgZG9uJ3QgY29uc3VtZSBxdW90YS5cbiAqXG4gKiBAcmV0dXJucyBBcnJheSBvZiBtaWRkbGV3YXJlIGhhbmRsZXJzIHJlYWR5IHRvIHNwcmVhZCBpbnRvIHJvdXRlIGRlZmluaXRpb25cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcm91dGVyLmdldCgnLycsXG4gKiAgIC4uLmNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUoKSxcbiAqICAgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgICAgLy8gSGFuZGxlciBpbXBsZW1lbnRhdGlvblxuICogICB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKCk6IFJlcXVlc3RIYW5kbGVyW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVBdXRoIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHJlcXVpcmVPcmdJZCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIC8vIE1vdW50ZWQgcG9zdC1vcmdJZCAoaWRlbnRpdHkgcG9wdWxhdGVkKSBzbyBrZXllZCBtdXRhdGlvbiByZXRyaWVzIG9uIHRoZVxuICAgIC8vIG5vbi1xdW90YSByb3V0ZXMg4oCUIG5vdGFibHkgdGhlIGNyZWF0ZSBwYXRocywgd2hpY2ggdXNlIHRoaXMgZmFjdG9yeSB0b1xuICAgIC8vIGF2b2lkIHRoZSBjaGVja1F1b3RhIHByZS1mbGlnaHQgcmFjaW5nIHRoZWlyIHJlc2VydmUg4oCUIGFyZSBkZWR1cGxpY2F0ZWQuXG4gICAgaWRlbXBvdGVuY3lNaWRkbGV3YXJlKCkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgd2l0aFRlbmFudENvbnRleHQoKSBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgXTtcbn1cbiJdfQ==
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQTBCLEVBQzFCLFNBQW9CO0lBRXBCLE9BQU87UUFDTCxXQUE2QjtRQUM3QixZQUFZLEVBQW9CO1FBQ2hDLHFCQUFxQixFQUFvQjtRQUN6QyxpQkFBaUIsRUFBb0I7UUFDckMsVUFBVSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQW1CO0tBQ3RELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSwrQkFBK0I7SUFDN0MsT0FBTztRQUNMLFdBQTZCO1FBQzdCLFlBQVksRUFBb0I7UUFDaEMsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UscUJBQXFCLEVBQW9CO1FBQ3pDLGlCQUFpQixFQUFvQjtLQUN0QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZXF1aXJlQXV0aCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlLCBRdW90YVNlcnZpY2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVja1F1b3RhIH0gZnJvbSAnLi9jaGVjay1xdW90YS5qcyc7XG5pbXBvcnQgeyBpZGVtcG90ZW5jeU1pZGRsZXdhcmUgfSBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZU9yZ0lkIH0gZnJvbSAnLi9yZXF1aXJlLW9yZy1pZC5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4vdGVuYW50LWNvbnRleHQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtaWRkbGV3YXJlIGNoYWluIGZvciBwcm90ZWN0ZWQgcm91dGVzIHJlcXVpcmluZyBhdXRoZW50aWNhdGlvbiwgb3JnIElELCBhbmQgcXVvdGEgY2hlY2suXG4gKlxuICogQXBwbGllcyBtaWRkbGV3YXJlIGluIG9yZGVyOlxuICogMS4gcmVxdWlyZUF1dGggLSBWYWxpZGF0ZXMgSldUIGFuZCBleHRyYWN0cyB1c2VyIGlkZW50aXR5XG4gKiAyLiByZXF1aXJlT3JnSWQgLSBFbnN1cmVzIHJlcXVlc3QgaGFzIHgtb3JnLWlkIGhlYWRlclxuICogMy4gaWRlbXBvdGVuY3lNaWRkbGV3YXJlIC0gRGVkdXBlcyBrZXllZCBtdXRhdGlvbiByZXRyaWVzIChuby1vcCB3aXRob3V0IGFuXG4gKiAgICBJZGVtcG90ZW5jeS1LZXkgaGVhZGVyIG9yIG9uIG5vbi1tdXRhdGlvbiBtZXRob2RzKVxuICogNC4gd2l0aFRlbmFudENvbnRleHQgLSBPcGVucyB0aGUgUkxTIHRlbmFudCBzY29wZSAob3JnSWQgKyBpc1N1cGVyQWRtaW4pIGZvciB0aGUgcmVxdWVzdFxuICogNS4gY2hlY2tRdW90YSAtIFZhbGlkYXRlcyBxdW90YSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlXG4gKlxuICogSWRlbXBvdGVuY3kgc2l0cyBBRlRFUiBhdXRoK29yZ0lkIChzbyBpdCBjYW4gbmFtZXNwYWNlIHRoZSByZXBsYXkgY2FjaGUgb24gdGhlXG4gKiBWRVJJRklFRCBvcmcg4oCUIGEgcHJlLWF1dGggZ2xvYmFsIG1vdW50IHNhdyBubyBpZGVudGl0eSBhbmQgd2FzIGEgcGVybWFuZW50XG4gKiBuby1vcCkgYW5kIEJFRk9SRSB3aXRoVGVuYW50Q29udGV4dC9jaGVja1F1b3RhIChzbyBhIHJlcGxheWVkIHJlcXVlc3Qgc2hvcnQtXG4gKiBjaXJjdWl0cyB3aXRob3V0IG9wZW5pbmcgYW4gUkxTIHNjb3BlIG9yIHNwZW5kaW5nIGEgcXVvdGEgY2hlY2spLlxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFdoaWNoIHF1b3RhIHRvIGNoZWNrIChlLmcuLCAnYXBpQ2FsbHMnLCAncGlwZWxpbmVzJywgJ3BsdWdpbnMnKVxuICogQHJldHVybnMgQXJyYXkgb2YgbWlkZGxld2FyZSBoYW5kbGVycyByZWFkeSB0byBzcHJlYWQgaW50byByb3V0ZSBkZWZpbml0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHJvdXRlci5wb3N0KCcvJyxcbiAqICAgLi4uY3JlYXRlUHJvdGVjdGVkUm91dGUocXVvdGFTZXJ2aWNlLCAncGlwZWxpbmVzJyksXG4gKiAgIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAgIC8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvdGVjdGVkUm91dGUoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbik6IFJlcXVlc3RIYW5kbGVyW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVBdXRoIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHJlcXVpcmVPcmdJZCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHdpdGhUZW5hbnRDb250ZXh0KCkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgY2hlY2tRdW90YShxdW90YVNlcnZpY2UsIHF1b3RhVHlwZSkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gIF07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1pZGRsZXdhcmUgY2hhaW4gZm9yIGF1dGhlbnRpY2F0ZWQgcm91dGVzIHdpdGggb3JnIElEIHJlcXVpcmVtZW50IGJ1dCBubyBxdW90YSBjaGVjay5cbiAqXG4gKiBBcHBsaWVzIG1pZGRsZXdhcmUgaW4gb3JkZXI6XG4gKiAxLiByZXF1aXJlQXV0aCAtIFZhbGlkYXRlcyBKV1QgYW5kIGV4dHJhY3RzIHVzZXIgaWRlbnRpdHlcbiAqIDIuIHJlcXVpcmVPcmdJZCAtIEVuc3VyZXMgcmVxdWVzdCBoYXMgeC1vcmctaWQgaGVhZGVyXG4gKiAzLiB3aXRoVGVuYW50Q29udGV4dCAtIE9wZW5zIHRoZSBSTFMgdGVuYW50IHNjb3BlIChvcmdJZCArIGlzU3VwZXJBZG1pbikgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogVXNlIHRoaXMgZm9yIHJlYWQtb25seSByb3V0ZXMgdGhhdCBkb24ndCBjb25zdW1lIHF1b3RhLlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIG1pZGRsZXdhcmUgaGFuZGxlcnMgcmVhZHkgdG8gc3ByZWFkIGludG8gcm91dGUgZGVmaW5pdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiByb3V0ZXIuZ2V0KCcvJyxcbiAqICAgLi4uY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZSgpLFxuICogICBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgICAvLyBIYW5kbGVyIGltcGxlbWVudGF0aW9uXG4gKiAgIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUoKTogUmVxdWVzdEhhbmRsZXJbXSB7XG4gIHJldHVybiBbXG4gICAgcmVxdWlyZUF1dGggYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgcmVxdWlyZU9yZ0lkKCkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgLy8gTW91bnRlZCBwb3N0LW9yZ0lkIChpZGVudGl0eSBwb3B1bGF0ZWQpIHNvIGtleWVkIG11dGF0aW9uIHJldHJpZXMgb24gdGhlXG4gICAgLy8gbm9uLXF1b3RhIHJvdXRlcyDigJQgbm90YWJseSB0aGUgY3JlYXRlIHBhdGhzLCB3aGljaCB1c2UgdGhpcyBmYWN0b3J5IHRvXG4gICAgLy8gYXZvaWQgdGhlIGNoZWNrUXVvdGEgcHJlLWZsaWdodCByYWNpbmcgdGhlaXIgcmVzZXJ2ZSDigJQgYXJlIGRlZHVwbGljYXRlZC5cbiAgICBpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKSBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgICB3aXRoVGVuYW50Q29udGV4dCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICBdO1xufVxuIl19
@@ -1,5 +1,4 @@
1
1
  import { type QuotaService, type QuotaType } from '@pipeline-builder/api-core';
2
- import type { Request } from 'express';
3
2
  import type { RequestContext } from './request-types.js';
4
3
  /**
5
4
  * Increment (meter) a quota counter using values pulled from a route context.
@@ -11,14 +10,13 @@ import type { RequestContext } from './request-types.js';
11
10
  *
12
11
  * @example
13
12
  * ```typescript
14
- * router.get('/', withRoute(async ({ req, res, ctx, orgId }) => {
13
+ * router.get('/', withRoute(async ({ res, ctx, orgId }) => {
15
14
  * // ...
16
- * incrementQuotaFromCtx(quotaService, { req, ctx, orgId }, 'apiCalls');
15
+ * incrementQuotaFromCtx(quotaService, { ctx, orgId }, 'apiCalls');
17
16
  * }));
18
17
  * ```
19
18
  */
20
19
  export declare function incrementQuotaFromCtx(quotaService: QuotaService, rc: {
21
- req: Request;
22
20
  ctx: RequestContext;
23
21
  orgId: string;
24
22
  }, type: QuotaType): void;
@@ -11,13 +11,13 @@ import { incrementQuota } from '@pipeline-builder/api-core';
11
11
  *
12
12
  * @example
13
13
  * ```typescript
14
- * router.get('/', withRoute(async ({ req, res, ctx, orgId }) => {
14
+ * router.get('/', withRoute(async ({ res, ctx, orgId }) => {
15
15
  * // ...
16
- * incrementQuotaFromCtx(quotaService, { req, ctx, orgId }, 'apiCalls');
16
+ * incrementQuotaFromCtx(quotaService, { ctx, orgId }, 'apiCalls');
17
17
  * }));
18
18
  * ```
19
19
  */
20
20
  export function incrementQuotaFromCtx(quotaService, rc, type) {
21
21
  incrementQuota(quotaService, rc.orgId, type, rc.ctx.log.bind(null, 'WARN'));
22
22
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcXVvdGEtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQXFDLE1BQU0sNEJBQTRCLENBQUM7QUFJL0Y7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUEwQixFQUMxQixFQUF3RCxFQUN4RCxJQUFlO0lBRWYsY0FBYyxDQUNaLFlBQVksRUFDWixFQUFFLENBQUMsS0FBSyxFQUNSLElBQUksRUFDSixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBpbmNyZW1lbnRRdW90YSwgdHlwZSBRdW90YVNlcnZpY2UsIHR5cGUgUXVvdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSAnLi9yZXF1ZXN0LXR5cGVzLmpzJztcblxuLyoqXG4gKiBJbmNyZW1lbnQgKG1ldGVyKSBhIHF1b3RhIGNvdW50ZXIgdXNpbmcgdmFsdWVzIHB1bGxlZCBmcm9tIGEgcm91dGUgY29udGV4dC5cbiAqXG4gKiBXcmFwcyBgaW5jcmVtZW50UXVvdGEocXVvdGFTZXJ2aWNlLCBvcmdJZCwgdHlwZSwgbG9nV2FybilgIHNvIHJvdXRlIGhhbmRsZXJzXG4gKiBkb24ndCBoYXZlIHRvIHJlLWRlcml2ZSBgY3R4LmxvZy5iaW5kKG51bGwsICdXQVJOJylgIGF0IGV2ZXJ5IGNhbGwgc2l0ZS4gVGhlXG4gKiBpbmNyZW1lbnQgYXV0aGVudGljYXRlcyBhcyB0aGUgY2FsbGluZyBzZXJ2aWNlIChzZWUgYGluY3JlbWVudFF1b3RhYCksIG5ldmVyXG4gKiB3aXRoIHRoZSBlbmQgdXNlcidzIHRva2VuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiByb3V0ZXIuZ2V0KCcvJywgd2l0aFJvdXRlKGFzeW5jICh7IHJlcSwgcmVzLCBjdHgsIG9yZ0lkIH0pID0+IHtcbiAqICAgLy8gLi4uXG4gKiAgIGluY3JlbWVudFF1b3RhRnJvbUN0eChxdW90YVNlcnZpY2UsIHsgcmVxLCBjdHgsIG9yZ0lkIH0sICdhcGlDYWxscycpO1xuICogfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRRdW90YUZyb21DdHgoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICByYzogeyByZXE6IFJlcXVlc3Q7IGN0eDogUmVxdWVzdENvbnRleHQ7IG9yZ0lkOiBzdHJpbmcgfSxcbiAgdHlwZTogUXVvdGFUeXBlLFxuKTogdm9pZCB7XG4gIGluY3JlbWVudFF1b3RhKFxuICAgIHF1b3RhU2VydmljZSxcbiAgICByYy5vcmdJZCxcbiAgICB0eXBlLFxuICAgIHJjLmN0eC5sb2cuYmluZChudWxsLCAnV0FSTicpLFxuICApO1xufVxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcXVvdGEtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQXFDLE1BQU0sNEJBQTRCLENBQUM7QUFHL0Y7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUEwQixFQUMxQixFQUEwQyxFQUMxQyxJQUFlO0lBRWYsY0FBYyxDQUNaLFlBQVksRUFDWixFQUFFLENBQUMsS0FBSyxFQUNSLElBQUksRUFDSixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBpbmNyZW1lbnRRdW90YSwgdHlwZSBRdW90YVNlcnZpY2UsIHR5cGUgUXVvdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gJy4vcmVxdWVzdC10eXBlcy5qcyc7XG5cbi8qKlxuICogSW5jcmVtZW50IChtZXRlcikgYSBxdW90YSBjb3VudGVyIHVzaW5nIHZhbHVlcyBwdWxsZWQgZnJvbSBhIHJvdXRlIGNvbnRleHQuXG4gKlxuICogV3JhcHMgYGluY3JlbWVudFF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsIHR5cGUsIGxvZ1dhcm4pYCBzbyByb3V0ZSBoYW5kbGVyc1xuICogZG9uJ3QgaGF2ZSB0byByZS1kZXJpdmUgYGN0eC5sb2cuYmluZChudWxsLCAnV0FSTicpYCBhdCBldmVyeSBjYWxsIHNpdGUuIFRoZVxuICogaW5jcmVtZW50IGF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxpbmcgc2VydmljZSAoc2VlIGBpbmNyZW1lbnRRdW90YWApLCBuZXZlclxuICogd2l0aCB0aGUgZW5kIHVzZXIncyB0b2tlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcm91dGVyLmdldCgnLycsIHdpdGhSb3V0ZShhc3luYyAoeyByZXMsIGN0eCwgb3JnSWQgfSkgPT4ge1xuICogICAvLyAuLi5cbiAqICAgaW5jcmVtZW50UXVvdGFGcm9tQ3R4KHF1b3RhU2VydmljZSwgeyBjdHgsIG9yZ0lkIH0sICdhcGlDYWxscycpO1xuICogfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRRdW90YUZyb21DdHgoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICByYzogeyBjdHg6IFJlcXVlc3RDb250ZXh0OyBvcmdJZDogc3RyaW5nIH0sXG4gIHR5cGU6IFF1b3RhVHlwZSxcbik6IHZvaWQge1xuICBpbmNyZW1lbnRRdW90YShcbiAgICBxdW90YVNlcnZpY2UsXG4gICAgcmMub3JnSWQsXG4gICAgdHlwZSxcbiAgICByYy5jdHgubG9nLmJpbmQobnVsbCwgJ1dBUk4nKSxcbiAgKTtcbn1cbiJdfQ==
@@ -31,11 +31,16 @@ export function rateLimitByOrg(opts) {
31
31
  skip: (req) => verifyServicePrincipal(req),
32
32
  // Redis store failure degrades to "not limited", never a 500 on the route.
33
33
  passOnStoreError: true,
34
- // Bucket by VERIFIED org (set by requireAuth), NOT the spoofable `x-org-id`
35
- // header. Fall back to a normalized client-IP bucket when unauthenticated so
36
- // the limiter still bounds pre-auth traffic. Namespaced (`org:`/`ip:`) so an
37
- // IP literal can never collide with an org id.
34
+ // Bucket by VERIFIED identity (set by requireAuth), NOT the spoofable
35
+ // `x-org-id` header. An ORG SERVICE ACCOUNT gets its OWN bucket rather than
36
+ // its org's: automation is exactly the traffic shape that would otherwise
37
+ // drain the window its org's people share, and the plan requires machine
38
+ // rate limits to be keyed per account. Falls back to a normalized client-IP
39
+ // bucket when unauthenticated so pre-auth traffic is still bounded.
40
+ // Namespaced (`sa:`/`org:`/`ip:`) so no two id spaces can collide.
38
41
  keyGenerator: (req) => {
42
+ if (req.user?.principalType === 'service_account' && req.user.sub)
43
+ return `sa:${req.user.sub}`;
39
44
  const orgId = req.user?.organizationId;
40
45
  return orgId ? `org:${orgId.toLowerCase()}` : `ip:${ipKeyGenerator(req.ip || 'anon', 64)}`;
41
46
  },
@@ -50,4 +55,4 @@ export function rateLimitByOrg(opts) {
50
55
  options.store = createSharedRateLimitStore(`${process.env.SERVICE_NAME || 'api'}:${name}`);
51
56
  return rateLimit(options);
52
57
  }
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdC1ieS1vcmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JhdGUtbGltaXQtYnktb3JnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRixPQUFPLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBY25FOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUF5QjtJQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRTlDLE1BQU0sT0FBTyxHQUFvQztRQUMvQyxHQUFHO1FBQ0gsUUFBUTtRQUNSLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLDJFQUEyRTtRQUMzRSxJQUFJLEVBQUUsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQztRQUNuRCwyRUFBMkU7UUFDM0UsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0Qiw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSwrQ0FBK0M7UUFDL0MsWUFBWSxFQUFFLENBQUMsR0FBWSxFQUFVLEVBQUU7WUFDckMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0YsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQVEsRUFBRTtZQUM5QyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUksWUFBWSxJQUFJLDhCQUE4QixFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hILENBQUM7S0FDRixDQUFDO0lBRUYsK0VBQStFO0lBQy9FLGlGQUFpRjtJQUNqRiwyRUFBMkU7SUFDM0UsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxLQUFLLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUzRixPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRFcnJvciwgRXJyb3JDb2RlLCB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHJhdGVMaW1pdCwgeyBpcEtleUdlbmVyYXRvciB9IGZyb20gJ2V4cHJlc3MtcmF0ZS1saW1pdCc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZWRSYXRlTGltaXRTdG9yZSB9IGZyb20gJy4vcmF0ZS1saW1pdC1zdG9yZS5qcyc7XG5cbi8qKiBDb25maWcgZm9yIGEge0BsaW5rIHJhdGVMaW1pdEJ5T3JnfSBsaW1pdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdSYXRlTGltaXRPcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBuYW1lIOKAlCBuYW1lc3BhY2VzIHRoZSBSZWRpcyBidWNrZXQgKyBsYWJlbHMgbG9ncy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTWF4IHJlcXVlc3RzIHBlciB3aW5kb3cgcGVyIG9yZyAob3IgcGVyIGNsaWVudCBJUCB3aGVuIHVuYXV0aGVudGljYXRlZCkuICovXG4gIG1heDogbnVtYmVyO1xuICAvKiogV2luZG93IGxlbmd0aCBpbiBtcy4gKi9cbiAgd2luZG93TXM6IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIDQyOSBtZXNzYWdlIG92ZXJyaWRlLiAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlci1PUkdBTklaQVRJT04gcmF0ZSBsaW1pdGVyIGZvciBhIHNwZWNpZmljIGhvdC9leHBlbnNpdmUgcm91dGUsIGtleWVkIG9uIHRoZVxuICogVkVSSUZJRUQgYXV0aCBvcmcg4oCUIHRoZSBjb21wbGVtZW50IHRvIHRoZSBjb2Fyc2UgZ2xvYmFsIHBlci1JUCBsaW1pdGVyIGluXG4gKiBgY3JlYXRlQXBwYCAod2hpY2ggYSB3aG9sZSBvcmcgYmVoaW5kIG9uZSBOQVQgc2hhcmVzLCBhbmQgYSBkaXN0cmlidXRlZFxuICogYXR0YWNrZXIgc3ByZWFkcyBhY3Jvc3MgSVAgYnVja2V0cyB0byBldmFkZSkuXG4gKlxuICogTVVTVCBiZSBtb3VudGVkIEFGVEVSIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyLm9yZ2FuaXphdGlvbklkYCBpcyBwb3B1bGF0ZWQ7XG4gKiBhbiB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBjbGllbnQtSVAgYnVja2V0IChuZXZlciBhIHNwb29mYWJsZVxuICogaGVhZGVyKSBzbyBpdCBzdGF5cyBib3VuZGVkLiBWZXJpZmllZCBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbHMgYXJlIGV4ZW1wdFxuICogKHRoZXkgY2FycnkgYSBzaWduZWQgc2VydmljZSBKV1QpLiBVc2VzIHRoZSBzaGFyZWQgZW52IFJlZGlzIHN0b3JlXG4gKiAoY3Jvc3MtcmVwbGljYSwgbmFtZXNwYWNlZCBieSBgbmFtZWApIHdoZW4gY29uZmlndXJlZCwgZWxzZSBpbi1tZW1vcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcm91dGVyLnBvc3QoJy8nLCAuLi5jcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKCksIHJlcXVpcmVQZXJtaXNzaW9uKCdtZXNzYWdlczp3cml0ZScpLFxuICogICAgIHJhdGVMaW1pdEJ5T3JnKHsgbmFtZTogJ21lc3NhZ2Utc2VuZCcsIG1heDogNjAsIHdpbmRvd01zOiA2MF8wMDAgfSksXG4gKiAgICAgd2l0aFJvdXRlKGhhbmRsZXIpKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhdGVMaW1pdEJ5T3JnKG9wdHM6IE9yZ1JhdGVMaW1pdE9wdGlvbnMpIHtcbiAgY29uc3QgeyBuYW1lLCBtYXgsIHdpbmRvd01zLCBtZXNzYWdlIH0gPSBvcHRzO1xuXG4gIGNvbnN0IG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgbWF4LFxuICAgIHdpbmRvd01zLFxuICAgIHN0YW5kYXJkSGVhZGVyczogdHJ1ZSxcbiAgICBsZWdhY3lIZWFkZXJzOiBmYWxzZSxcbiAgICAvLyBFeGVtcHQgY3J5cHRvZ3JhcGhpY2FsbHktdmVyaWZpZWQgaW50ZXJuYWwgc2VydmljZSBjYWxsZXJzIChzaWduZWQgSldUKS5cbiAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgLy8gUmVkaXMgc3RvcmUgZmFpbHVyZSBkZWdyYWRlcyB0byBcIm5vdCBsaW1pdGVkXCIsIG5ldmVyIGEgNTAwIG9uIHRoZSByb3V0ZS5cbiAgICBwYXNzT25TdG9yZUVycm9yOiB0cnVlLFxuICAgIC8vIEJ1Y2tldCBieSBWRVJJRklFRCBvcmcgKHNldCBieSByZXF1aXJlQXV0aCksIE5PVCB0aGUgc3Bvb2ZhYmxlIGB4LW9yZy1pZGBcbiAgICAvLyBoZWFkZXIuIEZhbGwgYmFjayB0byBhIG5vcm1hbGl6ZWQgY2xpZW50LUlQIGJ1Y2tldCB3aGVuIHVuYXV0aGVudGljYXRlZCBzb1xuICAgIC8vIHRoZSBsaW1pdGVyIHN0aWxsIGJvdW5kcyBwcmUtYXV0aCB0cmFmZmljLiBOYW1lc3BhY2VkIChgb3JnOmAvYGlwOmApIHNvIGFuXG4gICAgLy8gSVAgbGl0ZXJhbCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIGFuIG9yZyBpZC5cbiAgICBrZXlHZW5lcmF0b3I6IChyZXE6IFJlcXVlc3QpOiBzdHJpbmcgPT4ge1xuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICByZXR1cm4gb3JnSWQgPyBgb3JnOiR7b3JnSWQudG9Mb3dlckNhc2UoKX1gIDogYGlwOiR7aXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpfWA7XG4gICAgfSxcbiAgICBoYW5kbGVyOiAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IHZvaWQgPT4ge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCBtZXNzYWdlID8/IGBUb28gbWFueSAke25hbWV9IHJlcXVlc3RzLCBwbGVhc2Ugc2xvdyBkb3duLmAsIEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEKTtcbiAgICB9LFxuICB9O1xuXG4gIC8vIFNoYXJlZCBjcm9zcy1yZXBsaWNhIHN0b3JlIChvbmUgcHJvY2Vzcy13aWRlIFJlZGlzIGNvbm5lY3Rpb24pIHdoZW4gUmVkaXMgaXNcbiAgLy8gY29uZmlndXJlZCwgZWxzZSBwZXItcHJvY2VzcyBtZW1vcnkuIE5hbWVzcGFjZWQgYnkgc2VydmljZSBBTkQgbGltaXRlciBuYW1lIHNvXG4gIC8vIGRpc3RpbmN0IGxpbWl0ZXJzIOKAlCBvciBzYW1lLW5hbWVkIGxpbWl0ZXJzIGluIGRpZmZlcmVudCBzZXJ2aWNlcyDigJQgbmV2ZXJcbiAgLy8gc2hhcmUgYSBjb3VudGVyLlxuICBvcHRpb25zLnN0b3JlID0gY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUoYCR7cHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknfToke25hbWV9YCk7XG5cbiAgcmV0dXJuIHJhdGVMaW1pdChvcHRpb25zKTtcbn1cbiJdfQ==
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdC1ieS1vcmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JhdGUtbGltaXQtYnktb3JnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRixPQUFPLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBY25FOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUF5QjtJQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRTlDLE1BQU0sT0FBTyxHQUFvQztRQUMvQyxHQUFHO1FBQ0gsUUFBUTtRQUNSLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLDJFQUEyRTtRQUMzRSxJQUFJLEVBQUUsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQztRQUNuRCwyRUFBMkU7UUFDM0UsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixzRUFBc0U7UUFDdEUsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLG9FQUFvRTtRQUNwRSxtRUFBbUU7UUFDbkUsWUFBWSxFQUFFLENBQUMsR0FBWSxFQUFVLEVBQUU7WUFDckMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsS0FBSyxpQkFBaUIsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDL0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0YsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQVEsRUFBRTtZQUM5QyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUksWUFBWSxJQUFJLDhCQUE4QixFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hILENBQUM7S0FDRixDQUFDO0lBRUYsK0VBQStFO0lBQy9FLGlGQUFpRjtJQUNqRiwyRUFBMkU7SUFDM0UsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxLQUFLLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUzRixPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRFcnJvciwgRXJyb3JDb2RlLCB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHJhdGVMaW1pdCwgeyBpcEtleUdlbmVyYXRvciB9IGZyb20gJ2V4cHJlc3MtcmF0ZS1saW1pdCc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZWRSYXRlTGltaXRTdG9yZSB9IGZyb20gJy4vcmF0ZS1saW1pdC1zdG9yZS5qcyc7XG5cbi8qKiBDb25maWcgZm9yIGEge0BsaW5rIHJhdGVMaW1pdEJ5T3JnfSBsaW1pdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdSYXRlTGltaXRPcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBuYW1lIOKAlCBuYW1lc3BhY2VzIHRoZSBSZWRpcyBidWNrZXQgKyBsYWJlbHMgbG9ncy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTWF4IHJlcXVlc3RzIHBlciB3aW5kb3cgcGVyIG9yZyAob3IgcGVyIGNsaWVudCBJUCB3aGVuIHVuYXV0aGVudGljYXRlZCkuICovXG4gIG1heDogbnVtYmVyO1xuICAvKiogV2luZG93IGxlbmd0aCBpbiBtcy4gKi9cbiAgd2luZG93TXM6IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIDQyOSBtZXNzYWdlIG92ZXJyaWRlLiAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlci1PUkdBTklaQVRJT04gcmF0ZSBsaW1pdGVyIGZvciBhIHNwZWNpZmljIGhvdC9leHBlbnNpdmUgcm91dGUsIGtleWVkIG9uIHRoZVxuICogVkVSSUZJRUQgYXV0aCBvcmcg4oCUIHRoZSBjb21wbGVtZW50IHRvIHRoZSBjb2Fyc2UgZ2xvYmFsIHBlci1JUCBsaW1pdGVyIGluXG4gKiBgY3JlYXRlQXBwYCAod2hpY2ggYSB3aG9sZSBvcmcgYmVoaW5kIG9uZSBOQVQgc2hhcmVzLCBhbmQgYSBkaXN0cmlidXRlZFxuICogYXR0YWNrZXIgc3ByZWFkcyBhY3Jvc3MgSVAgYnVja2V0cyB0byBldmFkZSkuXG4gKlxuICogTVVTVCBiZSBtb3VudGVkIEFGVEVSIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyLm9yZ2FuaXphdGlvbklkYCBpcyBwb3B1bGF0ZWQ7XG4gKiBhbiB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBjbGllbnQtSVAgYnVja2V0IChuZXZlciBhIHNwb29mYWJsZVxuICogaGVhZGVyKSBzbyBpdCBzdGF5cyBib3VuZGVkLiBWZXJpZmllZCBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbHMgYXJlIGV4ZW1wdFxuICogKHRoZXkgY2FycnkgYSBzaWduZWQgc2VydmljZSBKV1QpLiBVc2VzIHRoZSBzaGFyZWQgZW52IFJlZGlzIHN0b3JlXG4gKiAoY3Jvc3MtcmVwbGljYSwgbmFtZXNwYWNlZCBieSBgbmFtZWApIHdoZW4gY29uZmlndXJlZCwgZWxzZSBpbi1tZW1vcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcm91dGVyLnBvc3QoJy8nLCAuLi5jcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKCksIHJlcXVpcmVQZXJtaXNzaW9uKCdtZXNzYWdlczp3cml0ZScpLFxuICogICAgIHJhdGVMaW1pdEJ5T3JnKHsgbmFtZTogJ21lc3NhZ2Utc2VuZCcsIG1heDogNjAsIHdpbmRvd01zOiA2MF8wMDAgfSksXG4gKiAgICAgd2l0aFJvdXRlKGhhbmRsZXIpKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhdGVMaW1pdEJ5T3JnKG9wdHM6IE9yZ1JhdGVMaW1pdE9wdGlvbnMpIHtcbiAgY29uc3QgeyBuYW1lLCBtYXgsIHdpbmRvd01zLCBtZXNzYWdlIH0gPSBvcHRzO1xuXG4gIGNvbnN0IG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgbWF4LFxuICAgIHdpbmRvd01zLFxuICAgIHN0YW5kYXJkSGVhZGVyczogdHJ1ZSxcbiAgICBsZWdhY3lIZWFkZXJzOiBmYWxzZSxcbiAgICAvLyBFeGVtcHQgY3J5cHRvZ3JhcGhpY2FsbHktdmVyaWZpZWQgaW50ZXJuYWwgc2VydmljZSBjYWxsZXJzIChzaWduZWQgSldUKS5cbiAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgLy8gUmVkaXMgc3RvcmUgZmFpbHVyZSBkZWdyYWRlcyB0byBcIm5vdCBsaW1pdGVkXCIsIG5ldmVyIGEgNTAwIG9uIHRoZSByb3V0ZS5cbiAgICBwYXNzT25TdG9yZUVycm9yOiB0cnVlLFxuICAgIC8vIEJ1Y2tldCBieSBWRVJJRklFRCBpZGVudGl0eSAoc2V0IGJ5IHJlcXVpcmVBdXRoKSwgTk9UIHRoZSBzcG9vZmFibGVcbiAgICAvLyBgeC1vcmctaWRgIGhlYWRlci4gQW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCBnZXRzIGl0cyBPV04gYnVja2V0IHJhdGhlciB0aGFuXG4gICAgLy8gaXRzIG9yZydzOiBhdXRvbWF0aW9uIGlzIGV4YWN0bHkgdGhlIHRyYWZmaWMgc2hhcGUgdGhhdCB3b3VsZCBvdGhlcndpc2VcbiAgICAvLyBkcmFpbiB0aGUgd2luZG93IGl0cyBvcmcncyBwZW9wbGUgc2hhcmUsIGFuZCB0aGUgcGxhbiByZXF1aXJlcyBtYWNoaW5lXG4gICAgLy8gcmF0ZSBsaW1pdHMgdG8gYmUga2V5ZWQgcGVyIGFjY291bnQuIEZhbGxzIGJhY2sgdG8gYSBub3JtYWxpemVkIGNsaWVudC1JUFxuICAgIC8vIGJ1Y2tldCB3aGVuIHVuYXV0aGVudGljYXRlZCBzbyBwcmUtYXV0aCB0cmFmZmljIGlzIHN0aWxsIGJvdW5kZWQuXG4gICAgLy8gTmFtZXNwYWNlZCAoYHNhOmAvYG9yZzpgL2BpcDpgKSBzbyBubyB0d28gaWQgc3BhY2VzIGNhbiBjb2xsaWRlLlxuICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAocmVxLnVzZXI/LnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlX2FjY291bnQnICYmIHJlcS51c2VyLnN1YikgcmV0dXJuIGBzYToke3JlcS51c2VyLnN1Yn1gO1xuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICByZXR1cm4gb3JnSWQgPyBgb3JnOiR7b3JnSWQudG9Mb3dlckNhc2UoKX1gIDogYGlwOiR7aXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpfWA7XG4gICAgfSxcbiAgICBoYW5kbGVyOiAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IHZvaWQgPT4ge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCBtZXNzYWdlID8/IGBUb28gbWFueSAke25hbWV9IHJlcXVlc3RzLCBwbGVhc2Ugc2xvdyBkb3duLmAsIEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEKTtcbiAgICB9LFxuICB9O1xuXG4gIC8vIFNoYXJlZCBjcm9zcy1yZXBsaWNhIHN0b3JlIChvbmUgcHJvY2Vzcy13aWRlIFJlZGlzIGNvbm5lY3Rpb24pIHdoZW4gUmVkaXMgaXNcbiAgLy8gY29uZmlndXJlZCwgZWxzZSBwZXItcHJvY2VzcyBtZW1vcnkuIE5hbWVzcGFjZWQgYnkgc2VydmljZSBBTkQgbGltaXRlciBuYW1lIHNvXG4gIC8vIGRpc3RpbmN0IGxpbWl0ZXJzIOKAlCBvciBzYW1lLW5hbWVkIGxpbWl0ZXJzIGluIGRpZmZlcmVudCBzZXJ2aWNlcyDigJQgbmV2ZXJcbiAgLy8gc2hhcmUgYSBjb3VudGVyLlxuICBvcHRpb25zLnN0b3JlID0gY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUoYCR7cHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknfToke25hbWV9YCk7XG5cbiAgcmV0dXJuIHJhdGVMaW1pdChvcHRpb25zKTtcbn1cbiJdfQ==
@@ -23,7 +23,7 @@ export interface RequestContext {
23
23
  requestId: string;
24
24
  /** Identity from headers */
25
25
  identity: RequestIdentity;
26
- /** Logging function that sends to console and SSE */
26
+ /** Logging function: logger always, plus the SSE log stream when the service enables it */
27
27
  log: RequestLogger;
28
28
  }
29
29
  /**
@@ -49,12 +49,17 @@ export function createRequestContext(req, sseManager) {
49
49
  logger.info(message, meta);
50
50
  break;
51
51
  }
52
+ // Only a service that serves a log stream (createApp `logStream: true`)
53
+ // pushes the line to SSE — otherwise every log line of every service would
54
+ // be serialized, written and relayed across Redis for no subscriber.
52
55
  // The Winston call above is redacted by the logger's `redactFormat`, but the
53
56
  // SSE frame bypasses the logger entirely — apply the SAME key-pattern
54
57
  // redaction to `data` before it's pushed to the client so a secret in the
55
58
  // log payload (e.g. an accidental `token`/`password` field) isn't streamed
56
59
  // out over the build-log SSE channel.
57
- sseManager.send(requestId, type, message, redactSensitive(data));
60
+ if (sseManager.logStreamEnabled) {
61
+ sseManager.send(requestId, type, message, redactSensitive(data));
62
+ }
58
63
  };
59
64
  return {
60
65
  requestId,
@@ -62,4 +67,4 @@ export function createRequestContext(req, sseManager) {
62
67
  log,
63
68
  };
64
69
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBMEMsTUFBTSw0QkFBNEIsQ0FBQztBQUVoSSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLG1DQUFtQyxDQUFDO0FBY2xGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQW1CMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEdBQVksRUFDWixVQUFzQjtJQUV0QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBa0IsQ0FBQyxDQUFDO0lBQ2pELG1FQUFtRTtJQUNuRSx5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRWhFLGdEQUFnRDtJQUNoRCxNQUFNLEdBQUcsR0FBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pELE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07UUFDVixDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHNDQUFzQztRQUN0QyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCByZWRhY3RTZW5zaXRpdmUsIHR5cGUgUmVxdWVzdElkZW50aXR5LCB0eXBlIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyB2NyBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCB0eXBlIFNTRUV2ZW50VHlwZSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8vIENvbnNvbGlkYXRlZCBFeHByZXNzIFJlcXVlc3QgYXVnbWVudGF0aW9uc1xuZGVjbGFyZSBnbG9iYWwge1xuICBuYW1lc3BhY2UgRXhwcmVzcyB7XG4gICAgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgICAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEIChzZXQgYnkgYXBwLWZhY3RvcnkgbWlkZGxld2FyZSkgKi9cbiAgICAgIHJlcXVlc3RJZD86IHN0cmluZztcbiAgICAgIC8qKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSwgbG9nZ2luZywgYW5kIFNTRSAqL1xuICAgICAgY29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2FwaS1zZXJ2ZXInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IGxvZ2dlciBmdW5jdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dnZXIgPSAodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuXG4vKipcbiAqIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHQge1xuICAvKiogVW5pcXVlIHJlcXVlc3QgSUQgKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIC8qKiBJZGVudGl0eSBmcm9tIGhlYWRlcnMgKi9cbiAgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eTtcbiAgLyoqIExvZ2dpbmcgZnVuY3Rpb24gdGhhdCBzZW5kcyB0byBjb25zb2xlIGFuZCBTU0UgKi9cbiAgbG9nOiBSZXF1ZXN0TG9nZ2VyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKlxuICogQ3JlYXRlcyBhIGxvZ2dlciB0aGF0IG91dHB1dHMgdG8gYm90aCBjb25zb2xlIGFuZCBTU0UuXG4gKlxuICogQHBhcmFtIHJlcSAtIEV4cHJlc3MgcmVxdWVzdFxuICogQHBhcmFtIHNzZU1hbmFnZXIgLSBTU0UgbWFuYWdlciBmb3IgcmVhbC10aW1lIGxvZ3NcbiAqIEByZXR1cm5zIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogYXBwLnBvc3QoJy9hcGkvcmVzb3VyY2UnLCByZXF1aXJlQXV0aCwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gKiAgIGNvbnN0IGN0eCA9IGNyZWF0ZVJlcXVlc3RDb250ZXh0KHJlcSwgc3NlTWFuYWdlcik7XG4gKlxuICogICBjdHgubG9nKCdJTkZPJywgJ1Byb2Nlc3NpbmcgcmVxdWVzdCcsIHsgZGF0YTogcmVxLmJvZHkgfSk7XG4gKlxuICogICBpZiAoIWN0eC5pZGVudGl0eS5vcmdJZCkge1xuICogICAgIGN0eC5sb2coJ0VSUk9SJywgJ01pc3Npbmcgb3JnYW5pemF0aW9uIElEJyk7XG4gKiAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KHJlcywgJ3gtb3JnLWlkIGhlYWRlciByZXF1aXJlZCcpO1xuICogICB9XG4gKlxuICogICAvLyBQcm9jZXNzIHJlcXVlc3QuLi5cbiAqICAgY3R4LmxvZygnQ09NUExFVEVEJywgJ1JlcXVlc3QgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseScpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RDb250ZXh0KFxuICByZXE6IFJlcXVlc3QsXG4gIHNzZU1hbmFnZXI6IFNTRU1hbmFnZXIsXG4pOiBSZXF1ZXN0Q29udGV4dCB7XG4gIGNvbnN0IGlkZW50aXR5ID0gZ2V0SWRlbnRpdHkocmVxIGFzIEh0dHBSZXF1ZXN0KTtcbiAgLy8gUHJlZmVyIHRoZSBhbHJlYWR5LXBhcnNlZCByZXF1ZXN0SWQgZnJvbSBhcHAtZmFjdG9yeSBtaWRkbGV3YXJlLFxuICAvLyBmYWxsIGJhY2sgdG8gaWRlbnRpdHkgaGVhZGVyLCB0aGVuIGdlbmVyYXRlIGEgbmV3IG9uZS5cbiAgY29uc3QgcmVxdWVzdElkID0gcmVxLnJlcXVlc3RJZCB8fCBpZGVudGl0eS5yZXF1ZXN0SWQgfHwgdXVpZCgpO1xuXG4gIC8vIENyZWF0ZSBsb2dnZXIgdGhhdCBvdXRwdXRzIHRvIFdpbnN0b24gYW5kIFNTRVxuICBjb25zdCBsb2c6IFJlcXVlc3RMb2dnZXIgPSAodHlwZSwgbWVzc2FnZSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSB7IHJlcXVlc3RJZCwgb3JnSWQ6IGlkZW50aXR5Lm9yZ0lkLCB0eXBlLCBkYXRhIH07XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdFUlJPUic6XG4gICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdXQVJOJzpcbiAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZSwgbWV0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBUaGUgV2luc3RvbiBjYWxsIGFib3ZlIGlzIHJlZGFjdGVkIGJ5IHRoZSBsb2dnZXIncyBgcmVkYWN0Rm9ybWF0YCwgYnV0IHRoZVxuICAgIC8vIFNTRSBmcmFtZSBieXBhc3NlcyB0aGUgbG9nZ2VyIGVudGlyZWx5IOKAlCBhcHBseSB0aGUgU0FNRSBrZXktcGF0dGVyblxuICAgIC8vIHJlZGFjdGlvbiB0byBgZGF0YWAgYmVmb3JlIGl0J3MgcHVzaGVkIHRvIHRoZSBjbGllbnQgc28gYSBzZWNyZXQgaW4gdGhlXG4gICAgLy8gbG9nIHBheWxvYWQgKGUuZy4gYW4gYWNjaWRlbnRhbCBgdG9rZW5gL2BwYXNzd29yZGAgZmllbGQpIGlzbid0IHN0cmVhbWVkXG4gICAgLy8gb3V0IG92ZXIgdGhlIGJ1aWxkLWxvZyBTU0UgY2hhbm5lbC5cbiAgICBzc2VNYW5hZ2VyLnNlbmQocmVxdWVzdElkLCB0eXBlLCBtZXNzYWdlLCByZWRhY3RTZW5zaXRpdmUoZGF0YSkpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcmVxdWVzdElkLFxuICAgIGlkZW50aXR5LFxuICAgIGxvZyxcbiAgfTtcbn1cbiJdfQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBMEMsTUFBTSw0QkFBNEIsQ0FBQztBQUVoSSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLG1DQUFtQyxDQUFDO0FBY2xGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQW1CMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEdBQVksRUFDWixVQUFzQjtJQUV0QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBa0IsQ0FBQyxDQUFDO0lBQ2pELG1FQUFtRTtJQUNuRSx5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRWhFLGdEQUFnRDtJQUNoRCxNQUFNLEdBQUcsR0FBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pELE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07UUFDVixDQUFDO1FBQ0Qsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxxRUFBcUU7UUFDckUsNkVBQTZFO1FBQzdFLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHNDQUFzQztRQUN0QyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCByZWRhY3RTZW5zaXRpdmUsIHR5cGUgUmVxdWVzdElkZW50aXR5LCB0eXBlIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyB2NyBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCB0eXBlIFNTRUV2ZW50VHlwZSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8vIENvbnNvbGlkYXRlZCBFeHByZXNzIFJlcXVlc3QgYXVnbWVudGF0aW9uc1xuZGVjbGFyZSBnbG9iYWwge1xuICBuYW1lc3BhY2UgRXhwcmVzcyB7XG4gICAgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgICAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEIChzZXQgYnkgYXBwLWZhY3RvcnkgbWlkZGxld2FyZSkgKi9cbiAgICAgIHJlcXVlc3RJZD86IHN0cmluZztcbiAgICAgIC8qKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSwgbG9nZ2luZywgYW5kIFNTRSAqL1xuICAgICAgY29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2FwaS1zZXJ2ZXInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IGxvZ2dlciBmdW5jdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dnZXIgPSAodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuXG4vKipcbiAqIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHQge1xuICAvKiogVW5pcXVlIHJlcXVlc3QgSUQgKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIC8qKiBJZGVudGl0eSBmcm9tIGhlYWRlcnMgKi9cbiAgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eTtcbiAgLyoqIExvZ2dpbmcgZnVuY3Rpb246IGxvZ2dlciBhbHdheXMsIHBsdXMgdGhlIFNTRSBsb2cgc3RyZWFtIHdoZW4gdGhlIHNlcnZpY2UgZW5hYmxlcyBpdCAqL1xuICBsb2c6IFJlcXVlc3RMb2dnZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHkgYW5kIGxvZ2dpbmdcbiAqXG4gKiBDcmVhdGVzIGEgbG9nZ2VyIHRoYXQgb3V0cHV0cyB0byBib3RoIGNvbnNvbGUgYW5kIFNTRS5cbiAqXG4gKiBAcGFyYW0gcmVxIC0gRXhwcmVzcyByZXF1ZXN0XG4gKiBAcGFyYW0gc3NlTWFuYWdlciAtIFNTRSBtYW5hZ2VyIGZvciByZWFsLXRpbWUgbG9nc1xuICogQHJldHVybnMgUmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHkgYW5kIGxvZ2dlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgY29uc3QgY3R4ID0gY3JlYXRlUmVxdWVzdENvbnRleHQocmVxLCBzc2VNYW5hZ2VyKTtcbiAqXG4gKiAgIGN0eC5sb2coJ0lORk8nLCAnUHJvY2Vzc2luZyByZXF1ZXN0JywgeyBkYXRhOiByZXEuYm9keSB9KTtcbiAqXG4gKiAgIGlmICghY3R4LmlkZW50aXR5Lm9yZ0lkKSB7XG4gKiAgICAgY3R4LmxvZygnRVJST1InLCAnTWlzc2luZyBvcmdhbml6YXRpb24gSUQnKTtcbiAqICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QocmVzLCAneC1vcmctaWQgaGVhZGVyIHJlcXVpcmVkJyk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIFByb2Nlc3MgcmVxdWVzdC4uLlxuICogICBjdHgubG9nKCdDT01QTEVURUQnLCAnUmVxdWVzdCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdENvbnRleHQoXG4gIHJlcTogUmVxdWVzdCxcbiAgc3NlTWFuYWdlcjogU1NFTWFuYWdlcixcbik6IFJlcXVlc3RDb250ZXh0IHtcbiAgY29uc3QgaWRlbnRpdHkgPSBnZXRJZGVudGl0eShyZXEgYXMgSHR0cFJlcXVlc3QpO1xuICAvLyBQcmVmZXIgdGhlIGFscmVhZHktcGFyc2VkIHJlcXVlc3RJZCBmcm9tIGFwcC1mYWN0b3J5IG1pZGRsZXdhcmUsXG4gIC8vIGZhbGwgYmFjayB0byBpZGVudGl0eSBoZWFkZXIsIHRoZW4gZ2VuZXJhdGUgYSBuZXcgb25lLlxuICBjb25zdCByZXF1ZXN0SWQgPSByZXEucmVxdWVzdElkIHx8IGlkZW50aXR5LnJlcXVlc3RJZCB8fCB1dWlkKCk7XG5cbiAgLy8gQ3JlYXRlIGxvZ2dlciB0aGF0IG91dHB1dHMgdG8gV2luc3RvbiBhbmQgU1NFXG4gIGNvbnN0IGxvZzogUmVxdWVzdExvZ2dlciA9ICh0eXBlLCBtZXNzYWdlLCBkYXRhKSA9PiB7XG4gICAgY29uc3QgbWV0YSA9IHsgcmVxdWVzdElkLCBvcmdJZDogaWRlbnRpdHkub3JnSWQsIHR5cGUsIGRhdGEgfTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dBUk4nOlxuICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE9ubHkgYSBzZXJ2aWNlIHRoYXQgc2VydmVzIGEgbG9nIHN0cmVhbSAoY3JlYXRlQXBwIGBsb2dTdHJlYW06IHRydWVgKVxuICAgIC8vIHB1c2hlcyB0aGUgbGluZSB0byBTU0Ug4oCUIG90aGVyd2lzZSBldmVyeSBsb2cgbGluZSBvZiBldmVyeSBzZXJ2aWNlIHdvdWxkXG4gICAgLy8gYmUgc2VyaWFsaXplZCwgd3JpdHRlbiBhbmQgcmVsYXllZCBhY3Jvc3MgUmVkaXMgZm9yIG5vIHN1YnNjcmliZXIuXG4gICAgLy8gVGhlIFdpbnN0b24gY2FsbCBhYm92ZSBpcyByZWRhY3RlZCBieSB0aGUgbG9nZ2VyJ3MgYHJlZGFjdEZvcm1hdGAsIGJ1dCB0aGVcbiAgICAvLyBTU0UgZnJhbWUgYnlwYXNzZXMgdGhlIGxvZ2dlciBlbnRpcmVseSDigJQgYXBwbHkgdGhlIFNBTUUga2V5LXBhdHRlcm5cbiAgICAvLyByZWRhY3Rpb24gdG8gYGRhdGFgIGJlZm9yZSBpdCdzIHB1c2hlZCB0byB0aGUgY2xpZW50IHNvIGEgc2VjcmV0IGluIHRoZVxuICAgIC8vIGxvZyBwYXlsb2FkIChlLmcuIGFuIGFjY2lkZW50YWwgYHRva2VuYC9gcGFzc3dvcmRgIGZpZWxkKSBpc24ndCBzdHJlYW1lZFxuICAgIC8vIG91dCBvdmVyIHRoZSBidWlsZC1sb2cgU1NFIGNoYW5uZWwuXG4gICAgaWYgKHNzZU1hbmFnZXIubG9nU3RyZWFtRW5hYmxlZCkge1xuICAgICAgc3NlTWFuYWdlci5zZW5kKHJlcXVlc3RJZCwgdHlwZSwgbWVzc2FnZSwgcmVkYWN0U2Vuc2l0aXZlKGRhdGEpKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0SWQsXG4gICAgaWRlbnRpdHksXG4gICAgbG9nLFxuICB9O1xufVxuIl19