@pipeline-builder/api-core 3.4.96 → 3.4.99

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/lib/errors/app-errors.js +1 -1
  2. package/lib/helpers/access-helpers.d.ts +2 -1
  3. package/lib/helpers/access-helpers.js +11 -5
  4. package/lib/helpers/org-hierarchy-http.d.ts +13 -3
  5. package/lib/helpers/org-hierarchy-http.js +10 -5
  6. package/lib/middleware/auth.d.ts +16 -5
  7. package/lib/middleware/auth.js +17 -7
  8. package/lib/services/audit-spool.d.ts +4 -5
  9. package/lib/services/audit-spool.js +10 -27
  10. package/lib/services/cache-service.js +11 -10
  11. package/lib/services/compliance-event-subscriber.js +1 -1
  12. package/lib/services/env-redis.d.ts +20 -0
  13. package/lib/services/env-redis.js +47 -0
  14. package/lib/services/leader-lock.d.ts +10 -0
  15. package/lib/services/leader-lock.js +19 -1
  16. package/lib/services/quota.js +14 -5
  17. package/lib/services/remote-audit-client.d.ts +19 -1
  18. package/lib/services/remote-audit-client.js +41 -1
  19. package/lib/services/scheduler.js +15 -1
  20. package/lib/services/token-revocation.js +8 -30
  21. package/lib/types/common.d.ts +1 -1
  22. package/lib/types/feature-flags.d.ts +1 -1
  23. package/lib/types/feature-flags.js +6 -1
  24. package/lib/types/pipeline.d.ts +9 -9
  25. package/lib/utils/crash-handlers.js +1 -1
  26. package/lib/utils/index.d.ts +0 -1
  27. package/lib/utils/index.js +1 -2
  28. package/lib/utils/logger.js +1 -1
  29. package/lib/utils/metric-emitter.js +1 -1
  30. package/lib/utils/params.d.ts +1 -1
  31. package/lib/utils/params.js +1 -1
  32. package/lib/utils/response.js +1 -1
  33. package/lib/utils/secret-encryption.js +1 -1
  34. package/lib/utils/ssrf.d.ts +1 -1
  35. package/lib/utils/ssrf.js +1 -1
  36. package/lib/validation/ai-schemas.d.ts +4 -4
  37. package/lib/validation/common-schemas.d.ts +8 -8
  38. package/lib/validation/message-schemas.d.ts +10 -10
  39. package/lib/validation/pipeline-schemas.d.ts +13 -13
  40. package/lib/validation/plugin-schemas.d.ts +18 -18
  41. package/package.json +11 -10
  42. package/lib/utils/org-aws-credentials.d.ts +0 -154
  43. package/lib/utils/org-aws-credentials.js +0 -139
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { createRequire } from 'module';
3
+ import { createEnvRedisClient } from './env-redis.js';
4
4
  import { createLogger } from '../utils/logger.js';
5
5
  import { emitCounter } from '../utils/metric-emitter.js';
6
6
  const logger = createLogger('audit-spool');
@@ -79,33 +79,16 @@ export function createRedisAuditSpool(redis, opts = {}) {
79
79
  }
80
80
  /**
81
81
  * Build a Redis-backed audit spool from the ambient `REDIS_URL` / `REDIS_HOST`
82
- * env (mirrors `createEnvRedisTokenRevocationStore`). Returns `null` when Redis
83
- * is not configured or the client can't be constructed — the caller then runs
84
- * without a spool (pre-spool best-effort behavior), never crashing. ioredis is a
85
- * runtime-only optional dep loaded via `createRequire`, so this stays importable
86
- * where Redis isn't present.
82
+ * env via the shared `createEnvRedisClient`. Returns `null` when Redis is not
83
+ * configured or the client can't be constructed — the caller then runs without a
84
+ * spool (pre-spool best-effort behavior), never crashing. The shared helper loads
85
+ * ioredis via `createRequire`, so this stays importable where Redis isn't present.
87
86
  */
88
87
  export function createEnvRedisAuditSpool(opts = {}) {
89
- try {
90
- const url = process.env.REDIS_URL;
91
- const host = process.env.REDIS_HOST;
92
- if (!url && !host)
93
- return null;
94
- const req = createRequire(import.meta.url);
95
- const mod = req('ioredis');
96
- const RedisCtor = (mod.Redis ?? mod.default ?? mod);
97
- const redisOpts = { maxRetriesPerRequest: 1, enableOfflineQueue: false };
98
- const inst = url
99
- ? new RedisCtor(url, redisOpts)
100
- : new RedisCtor({ host, port: parseInt(process.env.REDIS_PORT ?? '6379', 10), ...redisOpts });
101
- inst
102
- .on('error', (e) => logger.warn('Redis audit-spool client error', { error: errMsg(e) }));
103
- logger.info('Redis audit spool initialized');
104
- return createRedisAuditSpool(inst, opts);
105
- }
106
- catch (err) {
107
- logger.warn('Redis unavailable for audit spool; audit delivery is best-effort only', { error: errMsg(err) });
88
+ const inst = createEnvRedisClient('audit-spool');
89
+ if (!inst)
108
90
  return null;
109
- }
91
+ logger.info('Redis audit spool initialized');
92
+ return createRedisAuditSpool(inst, opts);
110
93
  }
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBNEMzQyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztBQUN4QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUVqQyxTQUFTLE1BQU0sQ0FBQyxHQUFZO0lBQzFCLE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFvQixDQUFDO1FBQ2xELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxLQUFzQixFQUN0QixPQUE0QyxFQUFFO0lBRTlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksaUJBQWlCLENBQUM7SUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO0lBRWpFLE9BQU87UUFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDakIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxXQUFXLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQzFFLElBQUksR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDO29CQUNuQixrRUFBa0U7b0JBQ2xFLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7b0JBQy9CLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLFdBQVcsQ0FBQywyQkFBMkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsdURBQXVELEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDOUYsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMseUNBQXlDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNaLElBQUksQ0FBQztnQkFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN4QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUF3QixFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQzVFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0QsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTztZQUNuQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPO1lBQ2pDLElBQUksQ0FBQztnQkFDSCx5RUFBeUU7Z0JBQ3pFLHVEQUF1RDtnQkFDdkQsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsRixDQUFDO1FBQ0gsQ0FBQztRQUVELEtBQUssQ0FBQyxLQUFLO1lBQ1QsSUFBSSxDQUFDO2dCQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxPQUE0QyxFQUFFO0lBQ3JGLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0IsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FHeEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBZ0QsQ0FBQztRQUNuRyxNQUFNLFNBQVMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN6RSxNQUFNLElBQUksR0FBRyxHQUFHO1lBQ2QsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRixJQUEyRTthQUN6RSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0csT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcblxuaW1wb3J0IHR5cGUgeyBSZW1vdGVBdWRpdEV2ZW50IH0gZnJvbSAnLi9yZW1vdGUtYXVkaXQtY2xpZW50LmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhdWRpdC1zcG9vbCcpO1xuXG4vKiogQSBidWZmZXJlZCBlbWlzc2lvbjogdGhlIGV2ZW50IHBsdXMgd2hpY2ggc2VydmljZSBtdXN0IHJlLWRlbGl2ZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2xFbnRyeSB7XG4gIGV2ZW50OiBSZW1vdGVBdWRpdEV2ZW50O1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIER1cmFibGUgYnVmZmVyIGZvciBhdWRpdCBldmVudHMgdGhhdCBmYWlsZWQgTElWRSBkZWxpdmVyeSB0byB0aGUgcGxhdGZvcm1cbiAqIChyZXRyaWVzIGV4aGF1c3RlZCBkdXJpbmcgYSBzdXN0YWluZWQgb3V0YWdlKS4gV2l0aG91dCB0aGlzLCB0aGUgYXVkaXQgdHJhaWwg4oCUXG4gKiBhIHNlY3VyaXR5IGxvZyDigJQgaXMgc2lsZW50bHkgbG9zdCB0aGUgbW9tZW50IHRoZSBwbGF0Zm9ybSBpcyBkb3duIGZvciBsb25nZXJcbiAqIHRoYW4gdGhlIGNsaWVudCdzIHNtYWxsIHJldHJ5IGJ1ZGdldC5cbiAqXG4gKiBDb250cmFjdDpcbiAqIC0gQk9VTkRFRC4gQSBzZWN1cml0eSBsb2cgbXVzdCBkZWdyYWRlIHRvIFwiZHJvcHBlZCB0aGUgb2xkZXN0LCBsb3VkbHlcIiAoYVxuICogICBtZXRyaWMpIHJhdGhlciB0aGFuIGdyb3cgd2l0aG91dCBsaW1pdCBhbmQgT09NIHRoZSBlbWl0dGVyLlxuICogLSBGQUlMLVNBRkUuIEV2ZXJ5IG1ldGhvZCBzd2FsbG93cyBpdHMgb3duIGVycm9ycyDigJQgYSBicm9rZW4vdW5yZWFjaGFibGUgc3Bvb2xcbiAqICAgbXVzdCBuZXZlciBicmVhayBvciBibG9jayB0aGUgYXVkaXQgZW1pc3Npb24gcGF0aCAod2hpY2ggaXMgaXRzZWxmXG4gKiAgIGZpcmUtYW5kLWZvcmdldCkuIEEgc3Bvb2wgcHJvYmxlbSBkZWdyYWRlcyB0byB0aGUgcHJlLXNwb29sIGJlaGF2aW9yLlxuICogLSBPcmRlcmluZyBpcyBiZXN0LWVmZm9ydC4gUmUtZGVsaXZlcmVkIGV2ZW50cyBjaGFpbiBhdCByZS1kZWxpdmVyeSB0aW1lXG4gKiAgICh0aGF0J3Mgd2hlbiB0aGUgcGxhdGZvcm0gaW5zZXJ0cyB0aGVtKSwgc28gZWFjaCBldmVudCBhbHNvIGNhcnJpZXMgYW5cbiAqICAgYG9jY3VycmVkQXRgIHN0YW1wZWQgYXQgZW1pc3Npb24gZm9yIHJldmlld2VycyDigJQgc2VlIFJlbW90ZUF1ZGl0RXZlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRTcG9vbCB7XG4gIC8qKiBCdWZmZXIgYW4gZXZlbnQgdGhhdCBmYWlsZWQgbGl2ZSBkZWxpdmVyeS4gKi9cbiAgZW5xdWV1ZShlbnRyeTogQXVkaXRTcG9vbEVudHJ5KTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlbW92ZSBhbmQgcmV0dXJuIHVwIHRvIGBtYXhgIGJ1ZmZlcmVkIGVudHJpZXMgZm9yIHJlLWRlbGl2ZXJ5IGF0dGVtcHRzLiAqL1xuICB0YWtlKG1heDogbnVtYmVyKTogUHJvbWlzZTxBdWRpdFNwb29sRW50cnlbXT47XG4gIC8qKiBSZXR1cm4gZW50cmllcyB3aG9zZSByZS1kZWxpdmVyeSBmYWlsZWQgdG8gdGhlIGJ1ZmZlciAoYmVzdC1lZmZvcnQpLiAqL1xuICByZXF1ZXVlKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEFwcHJveGltYXRlIGN1cnJlbnQgZGVwdGggKGZvciBtZXRyaWNzIC8gZHJhaW4gZGVjaXNpb25zKS4gKi9cbiAgZGVwdGgoKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vKiogTWluaW1hbCBSZWRpcyBMSVNUIHN1cmZhY2UgdGhlIHNwb29sIG5lZWRzIChhIHN1YnNldCBvZiBpb3JlZGlzKS4gKi9cbmludGVyZmFjZSBSZWRpc0xpc3RDbGllbnQge1xuICBycHVzaChrZXk6IHN0cmluZywgLi4udmFsdWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgbHB1c2goa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGxwb3Aoa2V5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZ1tdIHwgbnVsbD47XG4gIGx0cmltKGtleTogc3RyaW5nLCBzdGFydDogbnVtYmVyLCBzdG9wOiBudW1iZXIpOiBQcm9taXNlPHVua25vd24+O1xuICBsbGVuKGtleTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG5jb25zdCBERUZBVUxUX1NQT09MX0tFWSA9ICdhdWRpdDpzcG9vbCc7XG5jb25zdCBERUZBVUxUX01BWF9ERVBUSCA9IDEwXzAwMDtcblxuZnVuY3Rpb24gZXJyTXNnKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG59XG5cbmZ1bmN0aW9uIHNhZmVQYXJzZShyYXc6IHN0cmluZyk6IEF1ZGl0U3Bvb2xFbnRyeSB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyBBdWRpdFNwb29sRW50cnk7XG4gICAgcmV0dXJuIHBhcnNlZCAmJiBwYXJzZWQuZXZlbnQgJiYgcGFyc2VkLnNlcnZpY2VOYW1lID8gcGFyc2VkIDogbnVsbDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWRpcy1MSVNULWJhY2tlZCBzcG9vbC4gRHVyYWJsZSBhY3Jvc3MgcHJvY2VzcyByZXN0YXJ0cyAodW5saWtlIGFuIGluLW1lbW9yeVxuICogb3IgcGVyLXBvZC1kaXNrIGJ1ZmZlciksIHNoYXJlZCBieSBhbGwgcmVwbGljYXMgb2YgYSBzZXJ2aWNlLCBhbmQgYm91bmRlZCB2aWFcbiAqIGEgdHJpbS10by10YWlsIG9uIG92ZXJmbG93IChkcm9wcyB0aGUgT0xERVNULCBlbWl0dGluZyBgYXVkaXRfc3Bvb2xfZHJvcHBlZF90b3RhbGApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNBdWRpdFNwb29sKFxuICByZWRpczogUmVkaXNMaXN0Q2xpZW50LFxuICBvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9LFxuKTogQXVkaXRTcG9vbCB7XG4gIGNvbnN0IGtleSA9IG9wdHMua2V5ID8/IERFRkFVTFRfU1BPT0xfS0VZO1xuICBjb25zdCBtYXhEZXB0aCA9IE1hdGgubWF4KDEsIG9wdHMubWF4RGVwdGggPz8gREVGQVVMVF9NQVhfREVQVEgpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZW5xdWV1ZShlbnRyeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGVuID0gYXdhaXQgcmVkaXMucnB1c2goa2V5LCBKU09OLnN0cmluZ2lmeShlbnRyeSkpO1xuICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfZW5xdWV1ZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICBpZiAobGVuID4gbWF4RGVwdGgpIHtcbiAgICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIG5ld2VzdCBgbWF4RGVwdGhgOyBkcm9wIHRoZSBvdmVyZmxvdyBhdCB0aGUgaGVhZC5cbiAgICAgICAgICBjb25zdCBkcm9wcGVkID0gbGVuIC0gbWF4RGVwdGg7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHRyaW0oa2V5LCBkcm9wcGVkLCAtMSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0sIGRyb3BwZWQpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBvdmVyZmxvdyDigJQgZHJvcHBlZCBvbGRlc3QgYnVmZmVyZWQgZXZlbnRzJywgeyBkcm9wcGVkLCBtYXhEZXB0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBlbnF1ZXVlIGZhaWxlZCAoZXZlbnQgbG9zdCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdGFrZShtYXgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxwb3Aoa2V5LCBNYXRoLm1heCgxLCBtYXgpKTtcbiAgICAgICAgaWYgKCFyYXcgfHwgcmF3Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgICByZXR1cm4gcmF3Lm1hcChzYWZlUGFyc2UpLmZpbHRlcigoZSk6IGUgaXMgQXVkaXRTcG9vbEVudHJ5ID0+IGUgIT09IG51bGwpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCB0YWtlIGZhaWxlZCcsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlcXVldWUoZW50cmllcykge1xuICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICAvLyBQdXQgZmFpbGVkIHJlLWRlbGl2ZXJpZXMgYmFjayBhdCB0aGUgSEVBRCBzbyB0aGV5J3JlIHJldHJpZWQgZmlyc3QgYW5kXG4gICAgICAgIC8vIHJvdWdoIGVtaXNzaW9uIG9yZGVyIGlzIHByZXNlcnZlZCBhY3Jvc3MgdGhlIG91dGFnZS5cbiAgICAgICAgYXdhaXQgcmVkaXMubHB1c2goa2V5LCAuLi5lbnRyaWVzLm1hcCgoZSkgPT4gSlNPTi5zdHJpbmdpZnkoZSkpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgcmVxdWV1ZSBmYWlsZWQgKGV2ZW50cyBsb3N0KScsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkZXB0aCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy5sbGVuKGtleSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCBhdWRpdCBzcG9vbCBmcm9tIHRoZSBhbWJpZW50IGBSRURJU19VUkxgIC8gYFJFRElTX0hPU1RgXG4gKiBlbnYgKG1pcnJvcnMgYGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmVgKS4gUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpc1xuICogaXMgbm90IGNvbmZpZ3VyZWQgb3IgdGhlIGNsaWVudCBjYW4ndCBiZSBjb25zdHJ1Y3RlZCDigJQgdGhlIGNhbGxlciB0aGVuIHJ1bnNcbiAqIHdpdGhvdXQgYSBzcG9vbCAocHJlLXNwb29sIGJlc3QtZWZmb3J0IGJlaGF2aW9yKSwgbmV2ZXIgY3Jhc2hpbmcuIGlvcmVkaXMgaXMgYVxuICogcnVudGltZS1vbmx5IG9wdGlvbmFsIGRlcCBsb2FkZWQgdmlhIGBjcmVhdGVSZXF1aXJlYCwgc28gdGhpcyBzdGF5cyBpbXBvcnRhYmxlXG4gKiB3aGVyZSBSZWRpcyBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30pOiBBdWRpdFNwb29sIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuUkVESVNfVVJMO1xuICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5SRURJU19IT1NUO1xuICAgIGlmICghdXJsICYmICFob3N0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXEgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kID0gcmVxKCdpb3JlZGlzJykgYXMge1xuICAgICAgUmVkaXM/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgIGRlZmF1bHQ/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IFJlZGlzQ3RvciA9IChtb2QuUmVkaXMgPz8gbW9kLmRlZmF1bHQgPz8gbW9kKSBhcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUmVkaXNMaXN0Q2xpZW50O1xuICAgIGNvbnN0IHJlZGlzT3B0cyA9IHsgbWF4UmV0cmllc1BlclJlcXVlc3Q6IDEsIGVuYWJsZU9mZmxpbmVRdWV1ZTogZmFsc2UgfTtcbiAgICBjb25zdCBpbnN0ID0gdXJsXG4gICAgICA/IG5ldyBSZWRpc0N0b3IodXJsLCByZWRpc09wdHMpXG4gICAgICA6IG5ldyBSZWRpc0N0b3IoeyBob3N0LCBwb3J0OiBwYXJzZUludChwcm9jZXNzLmVudi5SRURJU19QT1JUID8/ICc2Mzc5JywgMTApLCAuLi5yZWRpc09wdHMgfSk7XG4gICAgKGluc3QgYXMgdW5rbm93biBhcyB7IG9uOiAoZXZ0OiBzdHJpbmcsIGNiOiAoZTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZCB9KVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiBsb2dnZXIud2FybignUmVkaXMgYXVkaXQtc3Bvb2wgY2xpZW50IGVycm9yJywgeyBlcnJvcjogZXJyTXNnKGUpIH0pKTtcbiAgICBsb2dnZXIuaW5mbygnUmVkaXMgYXVkaXQgc3Bvb2wgaW5pdGlhbGl6ZWQnKTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNBdWRpdFNwb29sKGluc3QsIG9wdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignUmVkaXMgdW5hdmFpbGFibGUgZm9yIGF1ZGl0IHNwb29sOyBhdWRpdCBkZWxpdmVyeSBpcyBiZXN0LWVmZm9ydCBvbmx5JywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQTRDM0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUM7QUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFFakMsU0FBUyxNQUFNLENBQUMsR0FBWTtJQUMxQixPQUFPLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBb0IsQ0FBQztRQUNsRCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RFLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsS0FBc0IsRUFDdEIsSUFBSSxHQUF3QyxFQUFFO0lBRTlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUks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QUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7WUFDWCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUksR0FBd0MsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBa0IsYUFBYSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZW1vdmUgYW5kIHJldHVybiB1cCB0byBgbWF4YCBidWZmZXJlZCBlbnRyaWVzIGZvciByZS1kZWxpdmVyeSBhdHRlbXB0cy4gKi9cbiAgdGFrZShtYXg6IG51bWJlcik6IFByb21pc2U8QXVkaXRTcG9vbEVudHJ5W10+O1xuICAvKiogUmV0dXJuIGVudHJpZXMgd2hvc2UgcmUtZGVsaXZlcnkgZmFpbGVkIHRvIHRoZSBidWZmZXIgKGJlc3QtZWZmb3J0KS4gKi9cbiAgcmVxdWV1ZShlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBBcHByb3hpbWF0ZSBjdXJyZW50IGRlcHRoIChmb3IgbWV0cmljcyAvIGRyYWluIGRlY2lzaW9ucykuICovXG4gIGRlcHRoKCk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLyoqIE1pbmltYWwgUmVkaXMgTElTVCBzdXJmYWNlIHRoZSBzcG9vbCBuZWVkcyAoYSBzdWJzZXQgb2YgaW9yZWRpcykuICovXG5pbnRlcmZhY2UgUmVkaXNMaXN0Q2xpZW50IHtcbiAgcnB1c2goa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGxwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscG9wKGtleTogc3RyaW5nLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+O1xuICBsdHJpbShrZXk6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogUHJvbWlzZTx1bmtub3duPjtcbiAgbGxlbihrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgREVGQVVMVF9TUE9PTF9LRVkgPSAnYXVkaXQ6c3Bvb2wnO1xuY29uc3QgREVGQVVMVF9NQVhfREVQVEggPSAxMF8wMDA7XG5cbmZ1bmN0aW9uIGVyck1zZyhlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xufVxuXG5mdW5jdGlvbiBzYWZlUGFyc2UocmF3OiBzdHJpbmcpOiBBdWRpdFNwb29sRW50cnkgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgQXVkaXRTcG9vbEVudHJ5O1xuICAgIHJldHVybiBwYXJzZWQgJiYgcGFyc2VkLmV2ZW50ICYmIHBhcnNlZC5zZXJ2aWNlTmFtZSA/IHBhcnNlZCA6IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmVkaXMtTElTVC1iYWNrZWQgc3Bvb2wuIER1cmFibGUgYWNyb3NzIHByb2Nlc3MgcmVzdGFydHMgKHVubGlrZSBhbiBpbi1tZW1vcnlcbiAqIG9yIHBlci1wb2QtZGlzayBidWZmZXIpLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzIG9mIGEgc2VydmljZSwgYW5kIGJvdW5kZWQgdmlhXG4gKiBhIHRyaW0tdG8tdGFpbCBvbiBvdmVyZmxvdyAoZHJvcHMgdGhlIE9MREVTVCwgZW1pdHRpbmcgYGF1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWxgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzQXVkaXRTcG9vbChcbiAgcmVkaXM6IFJlZGlzTGlzdENsaWVudCxcbiAgb3B0czogeyBtYXhEZXB0aD86IG51bWJlcjsga2V5Pzogc3RyaW5nIH0gPSB7fSxcbik6IEF1ZGl0U3Bvb2wge1xuICBjb25zdCBrZXkgPSBvcHRzLmtleSA/PyBERUZBVUxUX1NQT09MX0tFWTtcbiAgY29uc3QgbWF4RGVwdGggPSBNYXRoLm1heCgxLCBvcHRzLm1heERlcHRoID8/IERFRkFVTFRfTUFYX0RFUFRIKTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGVucXVldWUoZW50cnkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHJlZGlzLnJwdXNoKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2VucXVldWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgaWYgKGxlbiA+IG1heERlcHRoKSB7XG4gICAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBuZXdlc3QgYG1heERlcHRoYDsgZHJvcCB0aGUgb3ZlcmZsb3cgYXQgdGhlIGhlYWQuXG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGxlbiAtIG1heERlcHRoO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmx0cmltKGtleSwgZHJvcHBlZCwgLTEpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9LCBkcm9wcGVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgb3ZlcmZsb3cg4oCUIGRyb3BwZWQgb2xkZXN0IGJ1ZmZlcmVkIGV2ZW50cycsIHsgZHJvcHBlZCwgbWF4RGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZW5xdWV1ZSBmYWlsZWQgKGV2ZW50IGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHRha2UobWF4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5scG9wKGtleSwgTWF0aC5tYXgoMSwgbWF4KSk7XG4gICAgICAgIGlmICghcmF3IHx8IHJhdy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIHJhdy5tYXAoc2FmZVBhcnNlKS5maWx0ZXIoKGUpOiBlIGlzIEF1ZGl0U3Bvb2xFbnRyeSA9PiBlICE9PSBudWxsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgdGFrZSBmYWlsZWQnLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXVlKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUHV0IGZhaWxlZCByZS1kZWxpdmVyaWVzIGJhY2sgYXQgdGhlIEhFQUQgc28gdGhleSdyZSByZXRyaWVkIGZpcnN0IGFuZFxuICAgICAgICAvLyByb3VnaCBlbWlzc2lvbiBvcmRlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBvdXRhZ2UuXG4gICAgICAgIGF3YWl0IHJlZGlzLmxwdXNoKGtleSwgLi4uZW50cmllcy5tYXAoKGUpID0+IEpTT04uc3RyaW5naWZ5KGUpKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlcXVldWUgZmFpbGVkIChldmVudHMgbG9zdCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZGVwdGgoKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVkaXMubGxlbihrZXkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBSZWRpcy1iYWNrZWQgYXVkaXQgc3Bvb2wgZnJvbSB0aGUgYW1iaWVudCBgUkVESVNfVVJMYCAvIGBSRURJU19IT1NUYFxuICogZW52IHZpYSB0aGUgc2hhcmVkIGBjcmVhdGVFbnZSZWRpc0NsaWVudGAuIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXMgbm90XG4gKiBjb25maWd1cmVkIG9yIHRoZSBjbGllbnQgY2FuJ3QgYmUgY29uc3RydWN0ZWQg4oCUIHRoZSBjYWxsZXIgdGhlbiBydW5zIHdpdGhvdXQgYVxuICogc3Bvb2wgKHByZS1zcG9vbCBiZXN0LWVmZm9ydCBiZWhhdmlvciksIG5ldmVyIGNyYXNoaW5nLiBUaGUgc2hhcmVkIGhlbHBlciBsb2Fkc1xuICogaW9yZWRpcyB2aWEgYGNyZWF0ZVJlcXVpcmVgLCBzbyB0aGlzIHN0YXlzIGltcG9ydGFibGUgd2hlcmUgUmVkaXMgaXNuJ3QgcHJlc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudlJlZGlzQXVkaXRTcG9vbChvcHRzOiB7IG1heERlcHRoPzogbnVtYmVyOyBrZXk/OiBzdHJpbmcgfSA9IHt9KTogQXVkaXRTcG9vbCB8IG51bGwge1xuICBjb25zdCBpbnN0ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNMaXN0Q2xpZW50PignYXVkaXQtc3Bvb2wnKTtcbiAgaWYgKCFpbnN0KSByZXR1cm4gbnVsbDtcbiAgbG9nZ2VyLmluZm8oJ1JlZGlzIGF1ZGl0IHNwb29sIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woaW5zdCwgb3B0cyk7XG59XG4iXX0=
@@ -224,23 +224,24 @@ export class CacheService {
224
224
  if (cached !== null)
225
225
  return cached;
226
226
  const fk = this.fullKey(key);
227
- // Coalesce concurrent cold callers onto a single factory() invocation.
227
+ // Coalesce concurrent cold callers onto a single factory() invocation. The
228
+ // in-flight promise resolves to the RAW value; each awaiter (the primary
229
+ // caller below AND every coalesced caller here) clones it INDEPENDENTLY.
230
+ // Cloning inside the flight instead would hand one shared clone to all N
231
+ // coalesced callers, so one caller mutating its "independent" result would
232
+ // corrupt what the others read — the exact footgun get()'s clone-on-read
233
+ // prevents. (Redis backend is unaffected: set serializes, get JSON.parses.)
228
234
  const existing = this.inflight.get(fk);
229
235
  if (existing)
230
- return existing;
236
+ return cloneValue(await existing);
231
237
  const flight = (async () => {
232
238
  const value = await factory();
233
239
  await this.set(key, value, ttlSeconds);
234
- // Hand callers an INDEPENDENT clone, matching get()'s clone-on-read
235
- // contract. Without this the first caller (and every coalesced concurrent
236
- // caller) would get a mutable reference to the same object the memory
237
- // backend just stored, so mutating the result corrupts the cached entry.
238
- // The redis backend is unaffected (set serializes and get JSON.parses).
239
- return cloneValue(value);
240
+ return value;
240
241
  })();
241
242
  this.inflight.set(fk, flight);
242
243
  try {
243
- return await flight;
244
+ return cloneValue(await flight);
244
245
  }
245
246
  finally {
246
247
  this.inflight.delete(fk);
@@ -272,4 +273,4 @@ export class CacheService {
272
273
  export function createCacheService(prefix, defaultTtlSeconds = 300, redis) {
273
274
  return new CacheService({ prefix, defaultTtlSeconds, redis });
274
275
  }
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUEwQnRDOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQTBCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ2YsTUFBTSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBQ3hEOzs7O09BSUc7SUFDSyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdEMsTUFBTSxDQUFTO0lBQ2YsWUFBWSxDQUFTO0lBQ3JCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQW9CO0lBRTFDLDhEQUE4RDtJQUNyRCxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFckUsWUFBWSxNQUFtQjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdB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TSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGNhY2hpbmcgc2VydmljZSB3aXRoIFRUTCBzdXBwb3J0LlxuICpcbiAqIFR3byBpbXBsZW1lbnRhdGlvbnM6XG4gKiAtIEluLW1lbW9yeSAoZGVmYXVsdCk6IHRydWUtTFJVIE1hcCBjYWNoZSwgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKiAtIFJlZGlzOiBXaGVuIGEgUmVkaXMgY2xpZW50IGlzIHByb3ZpZGVkLCB1c2VzIFJlZGlzIGZvciBjcm9zcy1wcm9jZXNzIGNhY2hpbmdcbiAqXG4gKiBEZXNpZ246XG4gKiAtIEFsbCBvcGVyYXRpb25zIGFyZSBmYWlsLXNhZmU6IGNhY2hlIG1pc3Nlcy9lcnJvcnMgcmV0dXJuIG51bGwsIG5ldmVyIHRocm93XG4gKiAtIEpTT04gc2VyaWFsaXphdGlvbiBmb3IgUmVkaXM7IHRoZSBpbi1tZW1vcnkgYmFja2VuZCBkZWVwLWNsb25lcyBvbiByZWFkIHNvXG4gKiAgIGJvdGggYmFja2VuZHMgcmV0dXJuIGFuIGluZGVwZW5kZW50IGNvcHkgKG11dGF0aW5nIGEgcmVzdWx0IGlzIGFsd2F5cyBzYWZlKVxuICogLSBgZ2V0T3JTZXRgIGlzIHNpbmdsZS1mbGlnaHQ6IGNvbmN1cnJlbnQgbWlzc2VzIHNoYXJlIG9uZSBmYWN0b3J5KCkgY2FsbFxuICogLSBLZXkgbmFtZXNwYWNlIHByZWZpeGluZyB0byBhdm9pZCBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXNcbiAqL1xuXG5cbi8qKlxuICogQ2FjaGUgZW50cnkgd2l0aCB2YWx1ZSBhbmQgZXhwaXJhdGlvbiB0aW1lLlxuICovXG5pbnRlcmZhY2UgQ2FjaGVFbnRyeTxUPiB7XG4gIHZhbHVlOiBUO1xuICBleHBpcmVzQXQ6IG51bWJlcjsgLy8gVW5peCB0aW1lc3RhbXAgaW4gbXNcbn1cblxuLyoqXG4gKiBEZWVwLWNsb25lIGEgdmFsdWUgc28gdGhlIGluLW1lbW9yeSBiYWNrZW5kIGhhbmRzIGJhY2sgYW4gSU5ERVBFTkRFTlQgY29weSBvblxuICogZXZlcnkgcmVhZCDigJQgbWF0Y2hpbmcgdGhlIFJlZGlzIGJhY2tlbmQsIHdoaWNoIHJldHVybnMgYSBmcmVzaCBgSlNPTi5wYXJzZWBcbiAqIGNsb25lIGVhY2ggdGltZS4gV2l0aG91dCB0aGlzIHRoZSBpbi1tZW1vcnkgY2FjaGUgcmV0dXJucyB0aGUgc2FtZSBzdG9yZWRcbiAqIG9iamVjdCByZWZlcmVuY2UsIHNvIGEgY29uc3VtZXIgbXV0YXRpbmcgYSBcImNhY2hlZFwiIG9iamVjdCBzaWxlbnRseSBjb3JydXB0c1xuICogdGhlIHNoYXJlZCBjYWNoZSAoYSBmb290Z3VuIHRoYXQgb25seSBiaXRlcyB1bmRlciB0aGUgbWVtb3J5IGJhY2tlbmQpLlxuICpcbiAqIFByaW1pdGl2ZXMgYXJlIHJldHVybmVkIGFzLWlzLiBQcmVmZXJzIHRoZSBzdHJ1Y3R1cmVkLWNsb25lIGFsZ29yaXRobTsgZmFsbHNcbiAqIGJhY2sgdG8gYSBKU09OIHJvdW5kLXRyaXAgb24gb2xkZXIgcnVudGltZXMgb3IgZXhvdGljIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVWYWx1ZTxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzLWxpa2UgY2xpZW50IGludGVyZmFjZSAoc3Vic2V0IG9mIGlvcmVkaXMpLlxuICogU2VydmljZXMgcGFzcyB0aGVpciBvd24gUmVkaXMgY2xpZW50IGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzQ2FjaGVDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAga2V5cyhwYXR0ZXJuOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPjtcbiAgLyoqIFNDQU4tYmFzZWQgaXRlcmF0aW9uIChwcmVmZXJyZWQgb3ZlciBLRVlTIGZvciBwcm9kdWN0aW9uKS4gKi9cbiAgc2NhblN0cmVhbT8ob3B0aW9uczogeyBtYXRjaDogc3RyaW5nOyBjb3VudD86IG51bWJlciB9KTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlQ29uZmlnIHtcbiAgLyoqIEtleSBwcmVmaXggZm9yIG5hbWVzcGFjZSBpc29sYXRpb24gKGUuZy4sICdwbHVnaW46JywgJ2NvbXBsaWFuY2U6JykgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IFRUTCBpbiBzZWNvbmRzICovXG4gIGRlZmF1bHRUdGxTZWNvbmRzOiBudW1iZXI7XG4gIC8qKiBNYXggZW50cmllcyBmb3IgaW4tbWVtb3J5IGNhY2hlIChkZWZhdWx0IDEwMDApICovXG4gIG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCBSZWRpcyBjbGllbnQg4oCUIHVzZXMgaW4tbWVtb3J5IGNhY2hlIGlmIG5vdCBwcm92aWRlZCAqL1xuICByZWRpcz86IFJlZGlzQ2FjaGVDbGllbnQ7XG59XG5cbi8qKlxuICogQ2FjaGUgc2VydmljZSB3aXRoIGdldC9zZXQvZGVsIG9wZXJhdGlvbnMgYW5kIGF1dG9tYXRpYyBUVEwgZXhwaXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXg6ICdwbHVnaW46JywgZGVmYXVsdFR0bFNlY29uZHM6IDMwMCB9KTtcbiAqXG4gKiAvLyBTZXQgd2l0aCBkZWZhdWx0IFRUTFxuICogYXdhaXQgY2FjaGUuc2V0KCdvcmcxMjM6bGlzdCcsIHBsdWdpbnMpO1xuICpcbiAqIC8vIEdldCAocmV0dXJucyBudWxsIG9uIG1pc3MpXG4gKiBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8UGx1Z2luW10+KCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGVcbiAqIGF3YWl0IGNhY2hlLmRlbCgnb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlIGJ5IHBhdHRlcm5cbiAqIGF3YWl0IGNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKCdvcmcxMjM6KicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZVNlcnZpY2Uge1xuICBwcml2YXRlIG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PHVua25vd24+PigpO1xuICAvKipcbiAgICogSW4tZmxpZ2h0IGBnZXRPclNldGAgZmFjdG9yeSBwcm9taXNlcywga2V5ZWQgYnkgZnVsbCBjYWNoZSBrZXkuIENvYWxlc2Nlc1xuICAgKiBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGBmYWN0b3J5KClgIGludm9jYXRpb24gKHNpbmdsZS1mbGlnaHRcbiAgICogLyBzdGFtcGVkZSBwcm90ZWN0aW9uKTsgZW50cmllcyBhcmUgY2xlYXJlZCBvbmNlIHRoZSBwcm9taXNlIHNldHRsZXMuXG4gICAqL1xuICBwcml2YXRlIGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RW50cmllczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudDtcblxuICAvKiogQ2FjaGUgbWV0cmljcyDigJQgdHJhY2tzIGhpdHMsIG1pc3NlcywgYW5kIGludmFsaWRhdGlvbnMuICovXG4gIHJlYWRvbmx5IG1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgc2V0czogMCwgaW52YWxpZGF0aW9uczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2FjaGVDb25maWcpIHtcbiAgICB0aGlzLnByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgdGhpcy5kZWZhdWx0VHRsTXMgPSBjb25maWcuZGVmYXVsdFR0bFNlY29uZHMgKiAxMDAwO1xuICAgIHRoaXMubWF4RW50cmllcyA9IGNvbmZpZy5tYXhFbnRyaWVzID8/IDEwMDA7XG4gICAgdGhpcy5yZWRpcyA9IGNvbmZpZy5yZWRpcztcbiAgfVxuXG4gIHByaXZhdGUgZnVsbEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fSR7a2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY2FjaGVkIHZhbHVlLiBSZXR1cm5zIG51bGwgb24gbWlzcyBvciBlcnJvci5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIElOREVQRU5ERU5UIGRlZXAgY29weSDigJQgbXV0YXRpbmcgaXQgbmV2ZXIgYWZmZWN0c1xuICAgKiB0aGUgY2FjaGVkIGVudHJ5ICh0aGUgaW4tbWVtb3J5IGJhY2tlbmQgY2xvbmVzIG9uIHJlYWQgZm9yIHBhcml0eSB3aXRoXG4gICAqIFJlZGlzLCB3aGljaCByZXR1cm5zIGEgZnJlc2ggSlNPTiBjbG9uZSkuIENhbGxlcnMgbWF5IHN0aWxsIHRyZWF0IHJlc3VsdHMgYXNcbiAgICogaW1tdXRhYmxlLCBidXQgZG9pbmcgc28gaXMgbm8gbG9uZ2VyIGxvYWQtYmVhcmluZyBmb3IgY2FjaGUgaW50ZWdyaXR5LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQ+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5yZWRpcy5nZXQoZmspO1xuICAgICAgICBpZiAoIXJhdykgeyB0aGlzLm1ldHJpY3MubWlzc2VzKys7IHJldHVybiBudWxsOyB9XG4gICAgICAgIHRoaXMubWV0cmljcy5oaXRzKys7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgVDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMubWVtb3J5LmdldChmayk7XG4gICAgICBpZiAoIWVudHJ5KSB7IHRoaXMubWV0cmljcy5taXNzZXMrKzsgcmV0dXJuIG51bGw7IH1cbiAgICAgIGlmIChEYXRlLm5vdygpID4gZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICAvLyBMUlUgdG91Y2g6IGRlbGV0ZSArIHJlLWluc2VydCBtb3ZlcyB0aGlzIGtleSB0byB0aGUgbmV3ZXN0IHBvc2l0aW9uXG4gICAgICAvLyAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLCBzbyBgc2V0YCdzIG9sZGVzdC1maXJzdCBldmljdGlvbiBpcyBhXG4gICAgICAvLyB0cnVlIGxlYXN0LXJlY2VudGx5LVVTRUQgZXZpY3Rpb24gcmF0aGVyIHRoYW4gZmlyc3QtaW5zZXJ0ZWQgKEZJRk8pLlxuICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgIHRoaXMubWVtb3J5LnNldChmaywgZW50cnkpO1xuICAgICAgdGhpcy5tZXRyaWNzLmhpdHMrKztcbiAgICAgIC8vIENsb25lIHNvIGEgY2FsbGVyIG11dGF0aW5nIHRoZSByZXN1bHQgY2FuJ3QgY29ycnVwdCB0aGUgc2hhcmVkIGVudHJ5LlxuICAgICAgcmV0dXJuIGNsb25lVmFsdWUoZW50cnkudmFsdWUpIGFzIFQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLm1ldHJpY3MubWlzc2VzKys7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY2FjaGVkIHZhbHVlIHdpdGggb3B0aW9uYWwgVFRMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gQ2FjaGUga2V5IChwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSlcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2FjaGUgKG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUgZm9yIFJlZGlzKVxuICAgKiBAcGFyYW0gdHRsU2Vjb25kcyAtIFRUTCBvdmVycmlkZSAodXNlcyBkZWZhdWx0IGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGFzeW5jIHNldDxUPihrZXk6IHN0cmluZywgdmFsdWU6IFQsIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIGNvbnN0IHR0bCA9IHR0bFNlY29uZHMgPz8gdGhpcy5kZWZhdWx0VHRsTXMgLyAxMDAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubWV0cmljcy5zZXRzKys7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZGlzLnNldChmaywgSlNPTi5zdHJpbmdpZnkodmFsdWUpLCAnRVgnLCB0dGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEluLW1lbW9yeSDigJQgYSB3cml0ZSBjb3VudHMgYXMgYSB1c2UsIHNvIGRyb3AgYW55IGV4aXN0aW5nIGVudHJ5IGZpcnN0XG4gICAgICAvLyBhbmQgcmUtaW5zZXJ0IGJlbG93IGFzIHRoZSBuZXdlc3QgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKS4gVGhpc1xuICAgICAgLy8ga2VlcHMgdGhlIE1hcCBvcmRlcmVkIG9sZGVzdC1VU0VEIOKGkiBuZXdlc3QtVVNFRCBzbyB0aGUgZXZpY3Rpb24gYmVsb3cgaXNcbiAgICAgIC8vIHRydWUgTFJVLCBhbmQgYXZvaWRzIGV2aWN0aW5nIGEgdmljdGltIHdoZW4gbWVyZWx5IHVwZGF0aW5nIGEga2V5LlxuICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgIGlmICh0aGlzLm1lbW9yeS5zaXplID49IHRoaXMubWF4RW50cmllcykge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWVtb3J5LmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIGlmIChmaXJzdEtleSkgdGhpcy5tZW1vcnkuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGwgKiAxMDAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYWNoZSBzZXQgZmFpbHVyZSBpcyBub24tZmF0YWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY2FjaGVkIHZhbHVlLlxuICAgKi9cbiAgYXN5bmMgZGVsKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBhd2FpdCB0aGlzLnJlZGlzLmRlbChmayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYWNoZSBkZWxldGUgZmFpbHVyZSBpcyBub24tZmF0YWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBhbGwga2V5cyBtYXRjaGluZyBhIHBhdHRlcm4gKGUuZy4sICdvcmcxMjM6KicpLlxuICAgKiBVc2VzIFNDQU4gZm9yIFJlZGlzIChub24tYmxvY2tpbmcpIHdpdGggS0VZUyBmYWxsYmFjaywgb3IgcmVnZXggZm9yIGluLW1lbW9yeS5cbiAgICovXG4gIGFzeW5jIGludmFsaWRhdGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZnAgPSB0aGlzLmZ1bGxLZXkocGF0dGVybik7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHRoaXMucmVkaXMuc2NhblN0cmVhbVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5zY2FuS2V5cyhmcClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMucmVkaXMua2V5cyhmcCk7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZGlzLmRlbCguLi5rZXlzKTtcbiAgICAgICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIC8vIEluLW1lbW9yeSDigJQgbWF0Y2ggZ2xvYi1zdHlsZSBwYXR0ZXJuLiBFc2NhcGUgcmVnZXggbWV0YWNoYXJhY3RlcnMgZmlyc3RcbiAgICAgIC8vIHNvIGEgbGl0ZXJhbCBgLmAvYChgL2BbYCBpbiBhIGtleSBwcmVmaXggKGUuZy4gYG9yZzp2MS4yOipgKSBjYW4ndFxuICAgICAgLy8gb3Zlci1tYXRjaCBvciB0aHJvdyAoYSB0aHJvdyBoZXJlIGlzIHN3YWxsb3dlZCDihpIgbm90aGluZyBpbnZhbGlkYXRlZCDihpJcbiAgICAgIC8vIHN0YWxlIHJlYWRzKTsgb25seSBgKmAgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkLlxuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGZwLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvXFxcXFxcKi9nLCAnLionKSArICckJyk7XG4gICAgICBsZXQgZGVsZXRlZCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLm1lbW9yeS5rZXlzKCkpIHtcbiAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShrZXkpO1xuICAgICAgICAgIGRlbGV0ZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5tZXRyaWNzLmludmFsaWRhdGlvbnMgKz0gZGVsZXRlZDtcbiAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqIENvbGxlY3Qga2V5cyB2aWEgUmVkaXMgU0NBTiAobm9uLWJsb2NraW5nIGFsdGVybmF0aXZlIHRvIEtFWVMpLiAqL1xuICBwcml2YXRlIHNjYW5LZXlzKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5yZWRpcyEuc2NhblN0cmVhbSEoeyBtYXRjaDogcGF0dGVybiwgY291bnQ6IDEwMCB9KTtcbiAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICBzdHJlYW0ub24oJ2RhdGEnLCAoYmF0Y2g6IHN0cmluZ1tdKSA9PiBrZXlzLnB1c2goLi4uYmF0Y2gpKTtcbiAgICAgIHN0cmVhbS5vbmNlKCdlbmQnLCAoKSA9PiByZXNvbHZlKGtleXMpKTtcbiAgICAgIHN0cmVhbS5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIGNvbXB1dGU6IHJldHVybnMgY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNhbGxzIHRoZVxuICAgKiBmYWN0b3J5IGZ1bmN0aW9uLCBjYWNoZXMgdGhlIHJlc3VsdCwgYW5kIHJldHVybnMgaXQuXG4gICAqXG4gICAqIFNpbmdsZS1mbGlnaHQgLyBzdGFtcGVkZSBwcm90ZWN0aW9uOiB3aGVuIE4gY2FsbGVycyBtaXNzIGNvbmN1cnJlbnRseSBmb3JcbiAgICogdGhlIHNhbWUga2V5LCBvbmx5IE9ORSBgZmFjdG9yeSgpYCBydW5zIOKAlCB0aGUgcmVzdCBhd2FpdCBpdHMgc2hhcmVkIHByb21pc2UuXG4gICAqIFRoZSBpbi1mbGlnaHQgZW50cnkgaXMgY2xlYXJlZCBvbmNlIGl0IHNldHRsZXMgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSksIHNvIGFcbiAgICogZmFpbGVkIGZhY3RvcnkgZG9lc24ndCBwb2lzb24gbGF0ZXIgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXlcbiAgICogQHBhcmFtIGZhY3RvcnkgLSBBc3luYyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB2YWx1ZSBvbiBjYWNoZSBtaXNzXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gT3B0aW9uYWwgVFRMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgY29tcHV0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGdldE9yU2V0PFQ+KGtleTogc3RyaW5nLCBmYWN0b3J5OiAoKSA9PiBQcm9taXNlPFQ+LCB0dGxTZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5nZXQ8VD4oa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSBudWxsKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcbiAgICAvLyBDb2FsZXNjZSBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGZhY3RvcnkoKSBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nIGFzIFByb21pc2U8VD47XG5cbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICBhd2FpdCB0aGlzLnNldChrZXksIHZhbHVlLCB0dGxTZWNvbmRzKTtcbiAgICAgIC8vIEhhbmQgY2FsbGVycyBhbiBJTkRFUEVOREVOVCBjbG9uZSwgbWF0Y2hpbmcgZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgICAvLyBjb250cmFjdC4gV2l0aG91dCB0aGlzIHRoZSBmaXJzdCBjYWxsZXIgKGFuZCBldmVyeSBjb2FsZXNjZWQgY29uY3VycmVudFxuICAgICAgLy8gY2FsbGVyKSB3b3VsZCBnZXQgYSBtdXRhYmxlIHJlZmVyZW5jZSB0byB0aGUgc2FtZSBvYmplY3QgdGhlIG1lbW9yeVxuICAgICAgLy8gYmFja2VuZCBqdXN0IHN0b3JlZCwgc28gbXV0YXRpbmcgdGhlIHJlc3VsdCBjb3JydXB0cyB0aGUgY2FjaGVkIGVudHJ5LlxuICAgICAgLy8gVGhlIHJlZGlzIGJhY2tlbmQgaXMgdW5hZmZlY3RlZCAoc2V0IHNlcmlhbGl6ZXMgYW5kIGdldCBKU09OLnBhcnNlcykuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZSh2YWx1ZSk7XG4gICAgfSkoKTtcbiAgICB0aGlzLmluZmxpZ2h0LnNldChmaywgZmxpZ2h0KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZsaWdodDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodC5kZWxldGUoZmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyAodXNlZnVsIGZvciB0ZXN0aW5nKS5cbiAgICovXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVQYXR0ZXJuKCcqJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVtb3J5LmNsZWFyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEN1cnJlbnQgaW4tbWVtb3J5IGNhY2hlIHNpemUgKGZvciBkaWFnbm9zdGljcykuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5LnNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjYWNoZSBzZXJ2aWNlIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBOYW1lc3BhY2UgcHJlZml4IChlLmcuLCAnY29tcGxpYW5jZTonLCAncGx1Z2luOicpXG4gKiBAcGFyYW0gZGVmYXVsdFR0bFNlY29uZHMgLSBEZWZhdWx0IFRUTCBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCA9IDUgbWluKVxuICogQHBhcmFtIHJlZGlzIC0gT3B0aW9uYWwgUmVkaXMgY2xpZW50IGZvciBjcm9zcy1wcm9jZXNzIGNhY2hpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhY2hlU2VydmljZShcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlZmF1bHRUdGxTZWNvbmRzID0gMzAwLFxuICByZWRpcz86IFJlZGlzQ2FjaGVDbGllbnQsXG4pOiBDYWNoZVNlcnZpY2Uge1xuICByZXR1cm4gbmV3IENhY2hlU2VydmljZSh7IHByZWZpeCwgZGVmYXVsdFR0bFNlY29uZHMsIHJlZGlzIH0pO1xufVxuIl19
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUEwQnRDOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQTBCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ2YsTUFBTSxHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO0lBQ3hEOzs7O09BSUc7SUFDSyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdEMsTUFBTSxDQUFTO0lBQ2YsWUFBWSxDQUFTO0lBQ3JCLFVBQVUsQ0FBUztJQUNuQixLQUFLLENBQW9CO0lBRTFDLDhEQUE4RDtJQUNyRCxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFFckUsWUFBWSxNQUFtQjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdB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RXhCLE9BQU8sSUFBSSxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUNoRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgY2FjaGluZyBzZXJ2aWNlIHdpdGggVFRMIHN1cHBvcnQuXG4gKlxuICogVHdvIGltcGxlbWVudGF0aW9uczpcbiAqIC0gSW4tbWVtb3J5IChkZWZhdWx0KTogdHJ1ZS1MUlUgTWFwIGNhY2hlLCBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXNcbiAqIC0gUmVkaXM6IFdoZW4gYSBSZWRpcyBjbGllbnQgaXMgcHJvdmlkZWQsIHVzZXMgUmVkaXMgZm9yIGNyb3NzLXByb2Nlc3MgY2FjaGluZ1xuICpcbiAqIERlc2lnbjpcbiAqIC0gQWxsIG9wZXJhdGlvbnMgYXJlIGZhaWwtc2FmZTogY2FjaGUgbWlzc2VzL2Vycm9ycyByZXR1cm4gbnVsbCwgbmV2ZXIgdGhyb3dcbiAqIC0gSlNPTiBzZXJpYWxpemF0aW9uIGZvciBSZWRpczsgdGhlIGluLW1lbW9yeSBiYWNrZW5kIGRlZXAtY2xvbmVzIG9uIHJlYWQgc29cbiAqICAgYm90aCBiYWNrZW5kcyByZXR1cm4gYW4gaW5kZXBlbmRlbnQgY29weSAobXV0YXRpbmcgYSByZXN1bHQgaXMgYWx3YXlzIHNhZmUpXG4gKiAtIGBnZXRPclNldGAgaXMgc2luZ2xlLWZsaWdodDogY29uY3VycmVudCBtaXNzZXMgc2hhcmUgb25lIGZhY3RvcnkoKSBjYWxsXG4gKiAtIEtleSBuYW1lc3BhY2UgcHJlZml4aW5nIHRvIGF2b2lkIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlc1xuICovXG5cblxuLyoqXG4gKiBDYWNoZSBlbnRyeSB3aXRoIHZhbHVlIGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gKi9cbmludGVyZmFjZSBDYWNoZUVudHJ5PFQ+IHtcbiAgdmFsdWU6IFQ7XG4gIGV4cGlyZXNBdDogbnVtYmVyOyAvLyBVbml4IHRpbWVzdGFtcCBpbiBtc1xufVxuXG4vKipcbiAqIERlZXAtY2xvbmUgYSB2YWx1ZSBzbyB0aGUgaW4tbWVtb3J5IGJhY2tlbmQgaGFuZHMgYmFjayBhbiBJTkRFUEVOREVOVCBjb3B5IG9uXG4gKiBldmVyeSByZWFkIOKAlCBtYXRjaGluZyB0aGUgUmVkaXMgYmFja2VuZCwgd2hpY2ggcmV0dXJucyBhIGZyZXNoIGBKU09OLnBhcnNlYFxuICogY2xvbmUgZWFjaCB0aW1lLiBXaXRob3V0IHRoaXMgdGhlIGluLW1lbW9yeSBjYWNoZSByZXR1cm5zIHRoZSBzYW1lIHN0b3JlZFxuICogb2JqZWN0IHJlZmVyZW5jZSwgc28gYSBjb25zdW1lciBtdXRhdGluZyBhIFwiY2FjaGVkXCIgb2JqZWN0IHNpbGVudGx5IGNvcnJ1cHRzXG4gKiB0aGUgc2hhcmVkIGNhY2hlIChhIGZvb3RndW4gdGhhdCBvbmx5IGJpdGVzIHVuZGVyIHRoZSBtZW1vcnkgYmFja2VuZCkuXG4gKlxuICogUHJpbWl0aXZlcyBhcmUgcmV0dXJuZWQgYXMtaXMuIFByZWZlcnMgdGhlIHN0cnVjdHVyZWQtY2xvbmUgYWxnb3JpdGhtOyBmYWxsc1xuICogYmFjayB0byBhIEpTT04gcm91bmQtdHJpcCBvbiBvbGRlciBydW50aW1lcyBvciBleG90aWMgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjbG9uZVZhbHVlPFQ+KHZhbHVlOiBUKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgYXMgVDtcbiAgfVxufVxuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMtbGlrZSBjbGllbnQgaW50ZXJmYWNlIChzdWJzZXQgb2YgaW9yZWRpcykuXG4gKiBTZXJ2aWNlcyBwYXNzIHRoZWlyIG93biBSZWRpcyBjbGllbnQgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNDYWNoZUNsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZGVsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBrZXlzKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+O1xuICAvKiogU0NBTi1iYXNlZCBpdGVyYXRpb24gKHByZWZlcnJlZCBvdmVyIEtFWVMgZm9yIHByb2R1Y3Rpb24pLiAqL1xuICBzY2FuU3RyZWFtPyhvcHRpb25zOiB7IG1hdGNoOiBzdHJpbmc7IGNvdW50PzogbnVtYmVyIH0pOiBOb2RlSlMuUmVhZGFibGVTdHJlYW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVDb25maWcge1xuICAvKiogS2V5IHByZWZpeCBmb3IgbmFtZXNwYWNlIGlzb2xhdGlvbiAoZS5nLiwgJ3BsdWdpbjonLCAnY29tcGxpYW5jZTonKSAqL1xuICBwcmVmaXg6IHN0cmluZztcbiAgLyoqIERlZmF1bHQgVFRMIGluIHNlY29uZHMgKi9cbiAgZGVmYXVsdFR0bFNlY29uZHM6IG51bWJlcjtcbiAgLyoqIE1heCBlbnRyaWVzIGZvciBpbi1tZW1vcnkgY2FjaGUgKGRlZmF1bHQgMTAwMCkgKi9cbiAgbWF4RW50cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIFJlZGlzIGNsaWVudCDigJQgdXNlcyBpbi1tZW1vcnkgY2FjaGUgaWYgbm90IHByb3ZpZGVkICovXG4gIHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudDtcbn1cblxuLyoqXG4gKiBDYWNoZSBzZXJ2aWNlIHdpdGggZ2V0L3NldC9kZWwgb3BlcmF0aW9ucyBhbmQgYXV0b21hdGljIFRUTCBleHBpcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNhY2hlID0gbmV3IENhY2hlU2VydmljZSh7IHByZWZpeDogJ3BsdWdpbjonLCBkZWZhdWx0VHRsU2Vjb25kczogMzAwIH0pO1xuICpcbiAqIC8vIFNldCB3aXRoIGRlZmF1bHQgVFRMXG4gKiBhd2FpdCBjYWNoZS5zZXQoJ29yZzEyMzpsaXN0JywgcGx1Z2lucyk7XG4gKlxuICogLy8gR2V0IChyZXR1cm5zIG51bGwgb24gbWlzcylcbiAqIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlLmdldDxQbHVnaW5bXT4oJ29yZzEyMzpsaXN0Jyk7XG4gKlxuICogLy8gSW52YWxpZGF0ZVxuICogYXdhaXQgY2FjaGUuZGVsKCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGUgYnkgcGF0dGVyblxuICogYXdhaXQgY2FjaGUuaW52YWxpZGF0ZVBhdHRlcm4oJ29yZzEyMzoqJyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENhY2hlU2VydmljZSB7XG4gIHByaXZhdGUgbWVtb3J5ID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlRW50cnk8dW5rbm93bj4+KCk7XG4gIC8qKlxuICAgKiBJbi1mbGlnaHQgYGdldE9yU2V0YCBmYWN0b3J5IHByb21pc2VzLCBrZXllZCBieSBmdWxsIGNhY2hlIGtleS4gQ29hbGVzY2VzXG4gICAqIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgYGZhY3RvcnkoKWAgaW52b2NhdGlvbiAoc2luZ2xlLWZsaWdodFxuICAgKiAvIHN0YW1wZWRlIHByb3RlY3Rpb24pOyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uY2UgdGhlIHByb21pc2Ugc2V0dGxlcy5cbiAgICovXG4gIHByaXZhdGUgaW5mbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0VHRsTXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhFbnRyaWVzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50O1xuXG4gIC8qKiBDYWNoZSBtZXRyaWNzIOKAlCB0cmFja3MgaGl0cywgbWlzc2VzLCBhbmQgaW52YWxpZGF0aW9ucy4gKi9cbiAgcmVhZG9ubHkgbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBzZXRzOiAwLCBpbnZhbGlkYXRpb25zOiAwIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDYWNoZUNvbmZpZykge1xuICAgIHRoaXMucHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICB0aGlzLmRlZmF1bHRUdGxNcyA9IGNvbmZpZy5kZWZhdWx0VHRsU2Vjb25kcyAqIDEwMDA7XG4gICAgdGhpcy5tYXhFbnRyaWVzID0gY29uZmlnLm1heEVudHJpZXMgPz8gMTAwMDtcbiAgICB0aGlzLnJlZGlzID0gY29uZmlnLnJlZGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBmdWxsS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjYWNoZWQgdmFsdWUuIFJldHVybnMgbnVsbCBvbiBtaXNzIG9yIGVycm9yLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gSU5ERVBFTkRFTlQgZGVlcCBjb3B5IOKAlCBtdXRhdGluZyBpdCBuZXZlciBhZmZlY3RzXG4gICAqIHRoZSBjYWNoZWQgZW50cnkgKHRoZSBpbi1tZW1vcnkgYmFja2VuZCBjbG9uZXMgb24gcmVhZCBmb3IgcGFyaXR5IHdpdGhcbiAgICogUmVkaXMsIHdoaWNoIHJldHVybnMgYSBmcmVzaCBKU09OIGNsb25lKS4gQ2FsbGVycyBtYXkgc3RpbGwgdHJlYXQgcmVzdWx0cyBhc1xuICAgKiBpbW11dGFibGUsIGJ1dCBkb2luZyBzbyBpcyBubyBsb25nZXIgbG9hZC1iZWFyaW5nIGZvciBjYWNoZSBpbnRlZ3JpdHkuXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLnJlZGlzLmdldChmayk7XG4gICAgICAgIGlmICghcmF3KSB7IHRoaXMubWV0cmljcy5taXNzZXMrKzsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgdGhpcy5tZXRyaWNzLmhpdHMrKztcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUO1xuICAgICAgfVxuXG4gICAgICAvLyBJbi1tZW1vcnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tZW1vcnkuZ2V0KGZrKTtcbiAgICAgIGlmICghZW50cnkpIHsgdGhpcy5tZXRyaWNzLm1pc3NlcysrOyByZXR1cm4gbnVsbDsgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIExSVSB0b3VjaDogZGVsZXRlICsgcmUtaW5zZXJ0IG1vdmVzIHRoaXMga2V5IHRvIHRoZSBuZXdlc3QgcG9zaXRpb25cbiAgICAgIC8vIChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciksIHNvIGBzZXRgJ3Mgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIGlzIGFcbiAgICAgIC8vIHRydWUgbGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiByYXRoZXIgdGhhbiBmaXJzdC1pbnNlcnRlZCAoRklGTykuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCBlbnRyeSk7XG4gICAgICB0aGlzLm1ldHJpY3MuaGl0cysrO1xuICAgICAgLy8gQ2xvbmUgc28gYSBjYWxsZXIgbXV0YXRpbmcgdGhlIHJlc3VsdCBjYW4ndCBjb3JydXB0IHRoZSBzaGFyZWQgZW50cnkuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShlbnRyeS52YWx1ZSkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjYWNoZWQgdmFsdWUgd2l0aCBvcHRpb25hbCBUVEwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5KVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZSAobXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSBmb3IgUmVkaXMpXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuc2V0KGZrLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICdFWCcsIHR0bCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBhIHdyaXRlIGNvdW50cyBhcyBhIHVzZSwgc28gZHJvcCBhbnkgZXhpc3RpbmcgZW50cnkgZmlyc3RcbiAgICAgIC8vIGFuZCByZS1pbnNlcnQgYmVsb3cgYXMgdGhlIG5ld2VzdCAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLiBUaGlzXG4gICAgICAvLyBrZWVwcyB0aGUgTWFwIG9yZGVyZWQgb2xkZXN0LVVTRUQg4oaSIG5ld2VzdC1VU0VEIHNvIHRoZSBldmljdGlvbiBiZWxvdyBpc1xuICAgICAgLy8gdHJ1ZSBMUlUsIGFuZCBhdm9pZHMgZXZpY3RpbmcgYSB2aWN0aW0gd2hlbiBtZXJlbHkgdXBkYXRpbmcgYSBrZXkuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgaWYgKHRoaXMubWVtb3J5LnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tZW1vcnkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLm1lbW9yeS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bCAqIDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIHNldCBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWNoZWQgdmFsdWUuXG4gICAqL1xuICBhc3luYyBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKGZrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIGRlbGV0ZSBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGFsbCBrZXlzIG1hdGNoaW5nIGEgcGF0dGVybiAoZS5nLiwgJ29yZzEyMzoqJykuXG4gICAqIFVzZXMgU0NBTiBmb3IgUmVkaXMgKG5vbi1ibG9ja2luZykgd2l0aCBLRVlTIGZhbGxiYWNrLCBvciByZWdleCBmb3IgaW4tbWVtb3J5LlxuICAgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmcCA9IHRoaXMuZnVsbEtleShwYXR0ZXJuKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCBrZXlzID0gdGhpcy5yZWRpcy5zY2FuU3RyZWFtXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLnNjYW5LZXlzKGZwKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5yZWRpcy5rZXlzKGZwKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKC4uLmtleXMpO1xuICAgICAgICAgIHRoaXMubWV0cmljcy5pbnZhbGlkYXRpb25zICs9IGtleXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXlzLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBtYXRjaCBnbG9iLXN0eWxlIHBhdHRlcm4uIEVzY2FwZSByZWdleCBtZXRhY2hhcmFjdGVycyBmaXJzdFxuICAgICAgLy8gc28gYSBsaXRlcmFsIGAuYC9gKGAvYFtgIGluIGEga2V5IHByZWZpeCAoZS5nLiBgb3JnOnYxLjI6KmApIGNhbid0XG4gICAgICAvLyBvdmVyLW1hdGNoIG9yIHRocm93IChhIHRocm93IGhlcmUgaXMgc3dhbGxvd2VkIOKGkiBub3RoaW5nIGludmFsaWRhdGVkIOKGklxuICAgICAgLy8gc3RhbGUgcmVhZHMpOyBvbmx5IGAqYCBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuXG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgZnAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKS5yZXBsYWNlKC9cXFxcXFwqL2csICcuKicpICsgJyQnKTtcbiAgICAgIGxldCBkZWxldGVkID0gMDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubWVtb3J5LmtleXMoKSkge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGtleSk7XG4gICAgICAgICAgZGVsZXRlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBkZWxldGVkO1xuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sbGVjdCBrZXlzIHZpYSBSZWRpcyBTQ0FOIChub24tYmxvY2tpbmcgYWx0ZXJuYXRpdmUgdG8gS0VZUykuICovXG4gIHByaXZhdGUgc2NhbktleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnJlZGlzIS5zY2FuU3RyZWFtISh7IG1hdGNoOiBwYXR0ZXJuLCBjb3VudDogMTAwIH0pO1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChiYXRjaDogc3RyaW5nW10pID0+IGtleXMucHVzaCguLi5iYXRjaCkpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUoa2V5cykpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuIChSZWRpcyBiYWNrZW5kIGlzIHVuYWZmZWN0ZWQ6IHNldCBzZXJpYWxpemVzLCBnZXQgSlNPTi5wYXJzZXMuKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspIGFzIFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBleGlzdGluZyk7XG5cbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICBhd2FpdCB0aGlzLnNldChrZXksIHZhbHVlLCB0dGxTZWNvbmRzKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KSgpO1xuICAgIHRoaXMuaW5mbGlnaHQuc2V0KGZrLCBmbGlnaHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBmbGlnaHQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluZmxpZ2h0LmRlbGV0ZShmayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlbnRyaWVzICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW52YWxpZGF0ZVBhdHRlcm4oJyonKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3VycmVudCBpbi1tZW1vcnkgY2FjaGUgc2l6ZSAoZm9yIGRpYWdub3N0aWNzKS4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tZW1vcnkuc2l6ZTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlIHNlcnZpY2UgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHByZWZpeCAtIE5hbWVzcGFjZSBwcmVmaXggKGUuZy4sICdjb21wbGlhbmNlOicsICdwbHVnaW46JylcbiAqIEBwYXJhbSBkZWZhdWx0VHRsU2Vjb25kcyAtIERlZmF1bHQgVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwID0gNSBtaW4pXG4gKiBAcGFyYW0gcmVkaXMgLSBPcHRpb25hbCBSZWRpcyBjbGllbnQgZm9yIGNyb3NzLXByb2Nlc3MgY2FjaGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVTZXJ2aWNlKFxuICBwcmVmaXg6IHN0cmluZyxcbiAgZGVmYXVsdFR0bFNlY29uZHMgPSAzMDAsXG4gIHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudCxcbik6IENhY2hlU2VydmljZSB7XG4gIHJldHVybiBuZXcgQ2FjaGVTZXJ2aWNlKHsgcHJlZml4LCBkZWZhdWx0VHRsU2Vjb25kcywgcmVkaXMgfSk7XG59XG4iXX0=
@@ -69,4 +69,4 @@ export function registerComplianceEventSubscriber(config, serviceName = 'entity-
69
69
  port: serviceConfig.port,
70
70
  });
71
71
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFakQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsTUFBK0IsRUFDL0IsY0FBc0IsZUFBZTtJQUVyQyxNQUFNLGFBQWEsR0FBa0I7UUFDbkMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxZQUFZO1FBQ3pFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLE1BQU0sRUFBRSxFQUFFLENBQUM7S0FDbEYsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFckQsTUFBTSxVQUFVLEdBQTBCO1FBQ3hDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBa0I7WUFDcEMsSUFBSSxDQUFDO2dCQUNILGdFQUFnRTtnQkFDaEUsa0VBQWtFO2dCQUNsRSxvREFBb0Q7Z0JBQ3BELGdFQUFnRTtnQkFDaEUsc0RBQXNEO2dCQUN0RCxFQUFFO2dCQUNGLG9FQUFvRTtnQkFDcEUsNkRBQTZEO2dCQUM3RCxzRUFBc0U7Z0JBQ3RFLHVFQUF1RTtnQkFDdkUsd0VBQXdFO2dCQUN4RSw2REFBNkQ7Z0JBQzdELE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxLQUFLLEVBQUU7b0JBQ3BELE9BQU8sRUFBRTt3QkFDUCxlQUFlLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO3dCQUMxRixpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEVBQUU7cUJBQzNHO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLHNFQUFzRTtnQkFDdEUsd0VBQXdFO2dCQUN4RSx5REFBeUQ7Z0JBQ3pELFdBQVcsQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRixNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFO29CQUNqRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07b0JBQ3BCLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztvQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO29CQUN4QixLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDeEQsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0lBRUYsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFO1FBQ3BELElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtRQUN4QixJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7S0FDekIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnRpdHlFdmVudHMsIHR5cGUgRW50aXR5RXZlbnQsIHR5cGUgRW50aXR5RXZlbnRTdWJzY3JpYmVyIH0gZnJvbSAnLi9lbnRpdHktZXZlbnRzLmpzJztcbmltcG9ydCB7IEludGVybmFsSHR0cENsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL2F1dGguanMnO1xuaW1wb3J0IHsgdHlwZSBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdjb21wbGlhbmNlLWV2ZW50cycpO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBlbnRpdHkgZXZlbnQgc3Vic2NyaWJlciB0aGF0IGZvcndhcmRzIGV2ZW50cyB0byB0aGUgY29tcGxpYW5jZSBzZXJ2aWNlLlxuICpcbiAqIENhbGwgdGhpcyBhdCBzZXJ2aWNlIHN0YXJ0dXAgKGluIGluZGV4LnRzKSB0byBlbmFibGUgYXV0b21hdGljIGNvbXBsaWFuY2VcbiAqIG5vdGlmaWNhdGlvbiBvbiBlbnRpdHkgbXV0YXRpb25zLiBFdmVudHMgYXJlIGZpcmUtYW5kLWZvcmdldCDigJQgZmFpbHVyZXNcbiAqIGFyZSBsb2dnZWQgYnV0IG5ldmVyIGJsb2NrIHRoZSBvcmlnaW5hbCByZXF1ZXN0LlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBzZXJ2aWNlIGNvbmZpZyBvdmVycmlkZSAoZGVmYXVsdHMgdG8gQ09NUExJQU5DRV9TRVJWSUNFX0hPU1QvUE9SVCBlbnYgdmFycylcbiAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIFNlcnZpY2UgaWRlbnRpZmllciBiYWtlZCBpbnRvIHRoZSBzaWduZWQgSldUJ3MgYHN1YmBcbiAqICAgKGUuZy4gJ3BpcGVsaW5lJywgJ3BsdWdpbicpLiBUaGUgY29tcGxpYW5jZSByb3V0ZSByZXF1aXJlcyBhIHNlcnZpY2VcbiAqICAgcHJpbmNpcGFsIOKAlCBhIHNwb29mYWJsZSBgeC1pbnRlcm5hbC1zZXJ2aWNlOiB0cnVlYCBoZWFkZXIgaXMgbm8gbG9uZ2VyXG4gKiAgIGFjY2VwdGVkLiBEZWZhdWx0cyB0byBhIGdlbmVyaWMgJ2VudGl0eS1ldmVudHMnIHdoZW4gdW5zcGVjaWZpZWQsIGJ1dFxuICogICBjYWxsZXJzIHNob3VsZCBwYXNzIHRoZWlyIHNlcnZpY2UgbmFtZSBmb3IgYWNjdXJhdGUgYXVkaXQgdHJhaWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21wbGlhbmNlRXZlbnRTdWJzY3JpYmVyKFxuICBjb25maWc/OiBQYXJ0aWFsPFNlcnZpY2VDb25maWc+LFxuICBzZXJ2aWNlTmFtZTogc3RyaW5nID0gJ2VudGl0eS1ldmVudHMnLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnPy5ob3N0ID8/IHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9IT1NUID8/ICdjb21wbGlhbmNlJyxcbiAgICBwb3J0OiBjb25maWc/LnBvcnQgPz8gcGFyc2VJbnQocHJvY2Vzcy5lbnYuQ09NUExJQU5DRV9TRVJWSUNFX1BPUlQgPz8gJzMwMDAnLCAxMCksXG4gIH07XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudChzZXJ2aWNlQ29uZmlnKTtcblxuICBjb25zdCBzdWJzY3JpYmVyOiBFbnRpdHlFdmVudFN1YnNjcmliZXIgPSB7XG4gICAgYXN5bmMgb25FbnRpdHlFdmVudChldmVudDogRW50aXR5RXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE1pbnQgYSBwZXItZXZlbnQgc2VydmljZSBKV1Qgc2NvcGVkIHRvIHRoZSBldmVudCdzIG9yZyBzbyB0aGVcbiAgICAgICAgLy8gY29tcGxpYW5jZSByb3V0ZSdzIGBydW5XaXRoVGVuYW50Q29udGV4dGAgc2VlcyB0aGUgcmlnaHQgdGVuYW50XG4gICAgICAgIC8vIEdVQy4gVGhlIGNvbXBsaWFuY2Ugc2lkZSBlbmZvcmNlcyBgcmVxdWlyZUF1dGhgICtcbiAgICAgICAgLy8gYHJlcXVpcmVTZXJ2aWNlUHJpbmNpcGFsYCDigJQgdGhlIHByZXZpb3VzIGB4LWludGVybmFsLXNlcnZpY2VgXG4gICAgICAgIC8vIGhlYWRlciBpcyBubyBsb25nZXIgc3VmZmljaWVudCAoYW5kIHdhcyBzcG9vZmFibGUpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGlzIEhUVFAgbm90aWZ5IGlzIHRoZSBTSU5HTEUgZGVsaXZlcnkgY2hhbm5lbCBmb3IgcG9zdC1tdXRhdGlvblxuICAgICAgICAvLyByZS12YWxpZGF0aW9uIChwcmltYXJ5IGVuZm9yY2VtZW50IGlzIHRoZSBmYWlsLUNMT1NFRCBsaXZlXG4gICAgICAgIC8vIHZhbGlkYXRlIHBhdGgpLiBBIHN0YWJsZSBwZXItZXZlbnQgYElkZW1wb3RlbmN5LUtleWAgbWFrZXMgdGhlIFBPU1RcbiAgICAgICAgLy8gcmV0cnktc2FmZSBpbiB0aGUgaHR0cC1jbGllbnQsIHNvIGEgdHJhbnNpZW50IDV4eC90aW1lb3V0IGlzIHJldHJpZWRcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gZHJvcHBlZCBvbiB0aGUgZmlyc3QgYXR0ZW1wdDsgY29tcGxpYW5jZSByZS1ldmFsdWF0aW9uIGlzXG4gICAgICAgIC8vIG5hdHVyYWxseSBpZGVtcG90ZW50LCBzbyBhIGR1cGxpY2F0ZSBkZWxpdmVyeSBpcyBoYXJtbGVzcy5cbiAgICAgICAgYXdhaXQgY2xpZW50LnBvc3QoJy9jb21wbGlhbmNlL2V2ZW50cy9lbnRpdHknLCBldmVudCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgb3JnSWQ6IGV2ZW50Lm9yZ0lkLCByb2xlOiAnbWVtYmVyJyB9KSxcbiAgICAgICAgICAgICdJZGVtcG90ZW5jeS1LZXknOiBgJHtldmVudC50YXJnZXR9OiR7ZXZlbnQuZW50aXR5SWR9OiR7ZXZlbnQuZXZlbnRUeXBlfToke2V2ZW50LnRpbWVzdGFtcC50b0lTT1N0cmluZygpfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gRmlyZS1hbmQtZm9yZ2V0OiBsb2cgKyBhIGRyb3AgbWV0cmljIHNvIHN1c3RhaW5lZCBsb3NzIGlzIGFsZXJ0YWJsZVxuICAgICAgICAvLyAob3BlcmF0b3JzIGNhbid0IGFjdCBvbiBhIHdhcm4gbGluZSBhbG9uZSksIHRoZW4gc3dhbGxvdyDigJQgY29tcGxpYW5jZVxuICAgICAgICAvLyBub3RpZmljYXRpb24gaXMgbm9uLWZhdGFsIHRvIHRoZSBvcmlnaW5hdGluZyBtdXRhdGlvbi5cbiAgICAgICAgZW1pdENvdW50ZXIoJ2NvbXBsaWFuY2VfZXZlbnRfZHJvcF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWUsIHRhcmdldDogZXZlbnQudGFyZ2V0IH0pO1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIG5vdGlmeSBjb21wbGlhbmNlIHNlcnZpY2Ugb2YgZW50aXR5IGV2ZW50Jywge1xuICAgICAgICAgIHRhcmdldDogZXZlbnQudGFyZ2V0LFxuICAgICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICAgIGVudGl0eUlkOiBldmVudC5lbnRpdHlJZCxcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGVudGl0eUV2ZW50cy5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gIGxvZ2dlci5pbmZvKCdDb21wbGlhbmNlIGV2ZW50IHN1YnNjcmliZXIgcmVnaXN0ZXJlZCcsIHtcbiAgICBob3N0OiBzZXJ2aWNlQ29uZmlnLmhvc3QsXG4gICAgcG9ydDogc2VydmljZUNvbmZpZy5wb3J0LFxuICB9KTtcbn1cbiJdfQ==
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFakQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsTUFBK0IsRUFDL0IsV0FBVyxHQUFXLGVBQWU7SUFFckMsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksWUFBWTtRQUN6RSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO0tBQ2xGLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUEwQjtRQUN4QyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWtCO1lBQ3BDLElBQUksQ0FBQztnQkFDSCxnRUFBZ0U7Z0JBQ2hFLGtFQUFrRTtnQkFDbEUsb0RBQW9EO2dCQUNwRCxnRUFBZ0U7Z0JBQ2hFLHNEQUFzRDtnQkFDdEQsRUFBRTtnQkFDRixvRUFBb0U7Z0JBQ3BFLDZEQUE2RDtnQkFDN0Qsc0VBQXNFO2dCQUN0RSx1RUFBdUU7Z0JBQ3ZFLHdFQUF3RTtnQkFDeEUsNkRBQTZEO2dCQUM3RCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxFQUFFO29CQUNwRCxPQUFPLEVBQUU7d0JBQ1AsZUFBZSxFQUFFLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzt3QkFDMUYsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFO3FCQUMzRztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixzRUFBc0U7Z0JBQ3RFLHdFQUF3RTtnQkFDeEUseURBQXlEO2dCQUN6RCxXQUFXLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDM0YsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRTtvQkFDakUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDeEIsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ3hELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUVGLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRTtRQUNwRCxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDeEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO0tBQ3pCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZW50aXR5RXZlbnRzLCB0eXBlIEVudGl0eUV2ZW50LCB0eXBlIEVudGl0eUV2ZW50U3Vic2NyaWJlciB9IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB7IHR5cGUgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY29tcGxpYW5jZS1ldmVudHMnKTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gZW50aXR5IGV2ZW50IHN1YnNjcmliZXIgdGhhdCBmb3J3YXJkcyBldmVudHMgdG8gdGhlIGNvbXBsaWFuY2Ugc2VydmljZS5cbiAqXG4gKiBDYWxsIHRoaXMgYXQgc2VydmljZSBzdGFydHVwIChpbiBpbmRleC50cykgdG8gZW5hYmxlIGF1dG9tYXRpYyBjb21wbGlhbmNlXG4gKiBub3RpZmljYXRpb24gb24gZW50aXR5IG11dGF0aW9ucy4gRXZlbnRzIGFyZSBmaXJlLWFuZC1mb3JnZXQg4oCUIGZhaWx1cmVzXG4gKiBhcmUgbG9nZ2VkIGJ1dCBuZXZlciBibG9jayB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgc2VydmljZSBjb25maWcgb3ZlcnJpZGUgKGRlZmF1bHRzIHRvIENPTVBMSUFOQ0VfU0VSVklDRV9IT1NUL1BPUlQgZW52IHZhcnMpXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgLSBTZXJ2aWNlIGlkZW50aWZpZXIgYmFrZWQgaW50byB0aGUgc2lnbmVkIEpXVCdzIGBzdWJgXG4gKiAgIChlLmcuICdwaXBlbGluZScsICdwbHVnaW4nKS4gVGhlIGNvbXBsaWFuY2Ugcm91dGUgcmVxdWlyZXMgYSBzZXJ2aWNlXG4gKiAgIHByaW5jaXBhbCDigJQgYSBzcG9vZmFibGUgYHgtaW50ZXJuYWwtc2VydmljZTogdHJ1ZWAgaGVhZGVyIGlzIG5vIGxvbmdlclxuICogICBhY2NlcHRlZC4gRGVmYXVsdHMgdG8gYSBnZW5lcmljICdlbnRpdHktZXZlbnRzJyB3aGVuIHVuc3BlY2lmaWVkLCBidXRcbiAqICAgY2FsbGVycyBzaG91bGQgcGFzcyB0aGVpciBzZXJ2aWNlIG5hbWUgZm9yIGFjY3VyYXRlIGF1ZGl0IHRyYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcGxpYW5jZUV2ZW50U3Vic2NyaWJlcihcbiAgY29uZmlnPzogUGFydGlhbDxTZXJ2aWNlQ29uZmlnPixcbiAgc2VydmljZU5hbWU6IHN0cmluZyA9ICdlbnRpdHktZXZlbnRzJyxcbik6IHZvaWQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBwcm9jZXNzLmVudi5DT01QTElBTkNFX1NFUlZJQ0VfSE9TVCA/PyAnY29tcGxpYW5jZScsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgY29uc3Qgc3Vic2NyaWJlcjogRW50aXR5RXZlbnRTdWJzY3JpYmVyID0ge1xuICAgIGFzeW5jIG9uRW50aXR5RXZlbnQoZXZlbnQ6IEVudGl0eUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNaW50IGEgcGVyLWV2ZW50IHNlcnZpY2UgSldUIHNjb3BlZCB0byB0aGUgZXZlbnQncyBvcmcgc28gdGhlXG4gICAgICAgIC8vIGNvbXBsaWFuY2Ugcm91dGUncyBgcnVuV2l0aFRlbmFudENvbnRleHRgIHNlZXMgdGhlIHJpZ2h0IHRlbmFudFxuICAgICAgICAvLyBHVUMuIFRoZSBjb21wbGlhbmNlIHNpZGUgZW5mb3JjZXMgYHJlcXVpcmVBdXRoYCArXG4gICAgICAgIC8vIGByZXF1aXJlU2VydmljZVByaW5jaXBhbGAg4oCUIHRoZSBwcmV2aW91cyBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICAgICAgICAvLyBoZWFkZXIgaXMgbm8gbG9uZ2VyIHN1ZmZpY2llbnQgKGFuZCB3YXMgc3Bvb2ZhYmxlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBIVFRQIG5vdGlmeSBpcyB0aGUgU0lOR0xFIGRlbGl2ZXJ5IGNoYW5uZWwgZm9yIHBvc3QtbXV0YXRpb25cbiAgICAgICAgLy8gcmUtdmFsaWRhdGlvbiAocHJpbWFyeSBlbmZvcmNlbWVudCBpcyB0aGUgZmFpbC1DTE9TRUQgbGl2ZVxuICAgICAgICAvLyB2YWxpZGF0ZSBwYXRoKS4gQSBzdGFibGUgcGVyLWV2ZW50IGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoZSBQT1NUXG4gICAgICAgIC8vIHJldHJ5LXNhZmUgaW4gdGhlIGh0dHAtY2xpZW50LCBzbyBhIHRyYW5zaWVudCA1eHgvdGltZW91dCBpcyByZXRyaWVkXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwZWQgb24gdGhlIGZpcnN0IGF0dGVtcHQ7IGNvbXBsaWFuY2UgcmUtZXZhbHVhdGlvbiBpc1xuICAgICAgICAvLyBuYXR1cmFsbHkgaWRlbXBvdGVudCwgc28gYSBkdXBsaWNhdGUgZGVsaXZlcnkgaXMgaGFybWxlc3MuXG4gICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KCcvY29tcGxpYW5jZS9ldmVudHMvZW50aXR5JywgZXZlbnQsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSksXG4gICAgICAgICAgICAnSWRlbXBvdGVuY3ktS2V5JzogYCR7ZXZlbnQudGFyZ2V0fToke2V2ZW50LmVudGl0eUlkfToke2V2ZW50LmV2ZW50VHlwZX06JHtldmVudC50aW1lc3RhbXAudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogbG9nICsgYSBkcm9wIG1ldHJpYyBzbyBzdXN0YWluZWQgbG9zcyBpcyBhbGVydGFibGVcbiAgICAgICAgLy8gKG9wZXJhdG9ycyBjYW4ndCBhY3Qgb24gYSB3YXJuIGxpbmUgYWxvbmUpLCB0aGVuIHN3YWxsb3cg4oCUIGNvbXBsaWFuY2VcbiAgICAgICAgLy8gbm90aWZpY2F0aW9uIGlzIG5vbi1mYXRhbCB0byB0aGUgb3JpZ2luYXRpbmcgbXV0YXRpb24uXG4gICAgICAgIGVtaXRDb3VudGVyKCdjb21wbGlhbmNlX2V2ZW50X2Ryb3BfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBub3RpZnkgY29tcGxpYW5jZSBzZXJ2aWNlIG9mIGVudGl0eSBldmVudCcsIHtcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogZXZlbnQuZW50aXR5SWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBlbnRpdHlFdmVudHMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICBsb2dnZXIuaW5mbygnQ29tcGxpYW5jZSBldmVudCBzdWJzY3JpYmVyIHJlZ2lzdGVyZWQnLCB7XG4gICAgaG9zdDogc2VydmljZUNvbmZpZy5ob3N0LFxuICAgIHBvcnQ6IHNlcnZpY2VDb25maWcucG9ydCxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Construct an ioredis client from the standard `REDIS_URL` or
3
+ * `REDIS_HOST`/`REDIS_PORT` env — the shared construction previously duplicated
4
+ * across the leader-lock, audit-spool, and token-revocation env factories.
5
+ *
6
+ * Semantics every caller relies on (kept identical across the consolidation):
7
+ * - Returns `null` when neither `REDIS_URL` nor `REDIS_HOST` is set, so a caller
8
+ * degrades to its no-Redis fallback (run-on-every-pod / best-effort / fail-open).
9
+ * - FAIL-SAFE: any ioredis load or construction error is swallowed and returns
10
+ * `null` — Redis being unavailable must never crash the importing service.
11
+ * - `ioredis` is a runtime-only optional dep loaded via `createRequire`, so this
12
+ * module stays importable in CJS bundles and where Redis isn't installed.
13
+ * - `maxRetriesPerRequest: 1` + `enableOfflineQueue: false`: commands fail fast
14
+ * rather than queueing during an outage (callers are fail-open/best-effort).
15
+ * - An `error` listener is attached (ioredis auto-reconnects) so a dropped
16
+ * connection can't surface as an unhandled `'error'` event that crashes Node.
17
+ *
18
+ * @param label short human name for this client, used in the two warn logs.
19
+ */
20
+ export declare function createEnvRedisClient<T = unknown>(label: string): T | null;
@@ -0,0 +1,47 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { createRequire } from 'module';
4
+ import { createLogger } from '../utils/logger.js';
5
+ const logger = createLogger('env-redis');
6
+ /**
7
+ * Construct an ioredis client from the standard `REDIS_URL` or
8
+ * `REDIS_HOST`/`REDIS_PORT` env — the shared construction previously duplicated
9
+ * across the leader-lock, audit-spool, and token-revocation env factories.
10
+ *
11
+ * Semantics every caller relies on (kept identical across the consolidation):
12
+ * - Returns `null` when neither `REDIS_URL` nor `REDIS_HOST` is set, so a caller
13
+ * degrades to its no-Redis fallback (run-on-every-pod / best-effort / fail-open).
14
+ * - FAIL-SAFE: any ioredis load or construction error is swallowed and returns
15
+ * `null` — Redis being unavailable must never crash the importing service.
16
+ * - `ioredis` is a runtime-only optional dep loaded via `createRequire`, so this
17
+ * module stays importable in CJS bundles and where Redis isn't installed.
18
+ * - `maxRetriesPerRequest: 1` + `enableOfflineQueue: false`: commands fail fast
19
+ * rather than queueing during an outage (callers are fail-open/best-effort).
20
+ * - An `error` listener is attached (ioredis auto-reconnects) so a dropped
21
+ * connection can't surface as an unhandled `'error'` event that crashes Node.
22
+ *
23
+ * @param label short human name for this client, used in the two warn logs.
24
+ */
25
+ export function createEnvRedisClient(label) {
26
+ try {
27
+ const url = process.env.REDIS_URL;
28
+ const host = process.env.REDIS_HOST;
29
+ if (!url && !host)
30
+ return null;
31
+ const req = createRequire(import.meta.url);
32
+ const mod = req('ioredis');
33
+ const RedisCtor = (mod.Redis ?? mod.default ?? mod);
34
+ const redisOpts = { maxRetriesPerRequest: 1, enableOfflineQueue: false };
35
+ const inst = url
36
+ ? new RedisCtor(url, redisOpts)
37
+ : new RedisCtor({ host, port: parseInt(process.env.REDIS_PORT ?? '6379', 10), ...redisOpts });
38
+ inst
39
+ .on('error', (e) => logger.warn(`Redis ${label} client error`, { error: e instanceof Error ? e.message : String(e) }));
40
+ return inst;
41
+ }
42
+ catch (err) {
43
+ logger.warn(`Redis unavailable for ${label}`, { error: err instanceof Error ? err.message : String(err) });
44
+ return null;
45
+ }
46
+ }
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWxELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFjLEtBQWE7SUFDN0QsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvQixNQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FHeEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBa0MsQ0FBQztRQUNyRixNQUFNLFNBQVMsR0FBRyxFQUFFLG9CQUFvQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN6RSxNQUFNLElBQUksR0FBRyxHQUFHO1lBQ2QsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUM7WUFDL0IsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUMvRixJQUEyRTthQUN6RSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNHLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7XG5cbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZW52LXJlZGlzJyk7XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIGlvcmVkaXMgY2xpZW50IGZyb20gdGhlIHN0YW5kYXJkIGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfSE9TVGAvYFJFRElTX1BPUlRgIGVudiDigJQgdGhlIHNoYXJlZCBjb25zdHJ1Y3Rpb24gcHJldmlvdXNseSBkdXBsaWNhdGVkXG4gKiBhY3Jvc3MgdGhlIGxlYWRlci1sb2NrLCBhdWRpdC1zcG9vbCwgYW5kIHRva2VuLXJldm9jYXRpb24gZW52IGZhY3Rvcmllcy5cbiAqXG4gKiBTZW1hbnRpY3MgZXZlcnkgY2FsbGVyIHJlbGllcyBvbiAoa2VwdCBpZGVudGljYWwgYWNyb3NzIHRoZSBjb25zb2xpZGF0aW9uKTpcbiAqIC0gUmV0dXJucyBgbnVsbGAgd2hlbiBuZWl0aGVyIGBSRURJU19VUkxgIG5vciBgUkVESVNfSE9TVGAgaXMgc2V0LCBzbyBhIGNhbGxlclxuICogICBkZWdyYWRlcyB0byBpdHMgbm8tUmVkaXMgZmFsbGJhY2sgKHJ1bi1vbi1ldmVyeS1wb2QgLyBiZXN0LWVmZm9ydCAvIGZhaWwtb3BlbikuXG4gKiAtIEZBSUwtU0FGRTogYW55IGlvcmVkaXMgbG9hZCBvciBjb25zdHJ1Y3Rpb24gZXJyb3IgaXMgc3dhbGxvd2VkIGFuZCByZXR1cm5zXG4gKiAgIGBudWxsYCDigJQgUmVkaXMgYmVpbmcgdW5hdmFpbGFibGUgbXVzdCBuZXZlciBjcmFzaCB0aGUgaW1wb3J0aW5nIHNlcnZpY2UuXG4gKiAtIGBpb3JlZGlzYCBpcyBhIHJ1bnRpbWUtb25seSBvcHRpb25hbCBkZXAgbG9hZGVkIHZpYSBgY3JlYXRlUmVxdWlyZWAsIHNvIHRoaXNcbiAqICAgbW9kdWxlIHN0YXlzIGltcG9ydGFibGUgaW4gQ0pTIGJ1bmRsZXMgYW5kIHdoZXJlIFJlZGlzIGlzbid0IGluc3RhbGxlZC5cbiAqIC0gYG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxYCArIGBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlYDogY29tbWFuZHMgZmFpbCBmYXN0XG4gKiAgIHJhdGhlciB0aGFuIHF1ZXVlaW5nIGR1cmluZyBhbiBvdXRhZ2UgKGNhbGxlcnMgYXJlIGZhaWwtb3Blbi9iZXN0LWVmZm9ydCkuXG4gKiAtIEFuIGBlcnJvcmAgbGlzdGVuZXIgaXMgYXR0YWNoZWQgKGlvcmVkaXMgYXV0by1yZWNvbm5lY3RzKSBzbyBhIGRyb3BwZWRcbiAqICAgY29ubmVjdGlvbiBjYW4ndCBzdXJmYWNlIGFzIGFuIHVuaGFuZGxlZCBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBjcmFzaGVzIE5vZGUuXG4gKlxuICogQHBhcmFtIGxhYmVsIHNob3J0IGh1bWFuIG5hbWUgZm9yIHRoaXMgY2xpZW50LCB1c2VkIGluIHRoZSB0d28gd2FybiBsb2dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNDbGllbnQ8VCA9IHVua25vd24+KGxhYmVsOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuUkVESVNfVVJMO1xuICAgIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5SRURJU19IT1NUO1xuICAgIGlmICghdXJsICYmICFob3N0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXEgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kID0gcmVxKCdpb3JlZGlzJykgYXMge1xuICAgICAgUmVkaXM/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgIGRlZmF1bHQ/OiBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICB9O1xuICAgIGNvbnN0IFJlZGlzQ3RvciA9IChtb2QuUmVkaXMgPz8gbW9kLmRlZmF1bHQgPz8gbW9kKSBhcyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gVDtcbiAgICBjb25zdCByZWRpc09wdHMgPSB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH07XG4gICAgY29uc3QgaW5zdCA9IHVybFxuICAgICAgPyBuZXcgUmVkaXNDdG9yKHVybCwgcmVkaXNPcHRzKVxuICAgICAgOiBuZXcgUmVkaXNDdG9yKHsgaG9zdCwgcG9ydDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuUkVESVNfUE9SVCA/PyAnNjM3OScsIDEwKSwgLi4ucmVkaXNPcHRzIH0pO1xuICAgIChpbnN0IGFzIHVua25vd24gYXMgeyBvbjogKGV2dDogc3RyaW5nLCBjYjogKGU6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQgfSlcbiAgICAgIC5vbignZXJyb3InLCAoZSkgPT4gbG9nZ2VyLndhcm4oYFJlZGlzICR7bGFiZWx9IGNsaWVudCBlcnJvcmAsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBSZWRpcyB1bmF2YWlsYWJsZSBmb3IgJHtsYWJlbH1gLCB7IGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -22,3 +22,13 @@ export interface LockRedis {
22
22
  * @returns true if we held the lock and ran `fn`; false if another holder did.
23
23
  */
24
24
  export declare function withLeaderLock(redis: LockRedis, key: string, ttlMs: number, fn: () => Promise<void>): Promise<boolean>;
25
+ /**
26
+ * A `LockRedis` backed by an env-configured ioredis client (`REDIS_URL` or
27
+ * `REDIS_HOST`) — the leader-lock counterpart to `createEnvRedisAuditSpool` /
28
+ * `createEnvRedisTokenRevocationStore`, for a service that has no BullMQ client to
29
+ * borrow. Returns `null` when Redis isn't configured, so a caller can degrade to
30
+ * running on every pod (the atomic guards it wraps must still make that safe).
31
+ * The client is a real ioredis instance; ioredis exposes `set`/`get`/`del`/`eval`,
32
+ * satisfying `LockRedis` including the atomic CAS release.
33
+ */
34
+ export declare function createEnvRedisLock(): LockRedis | null;
@@ -1,6 +1,9 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { randomUUID } from 'crypto';
4
+ import { createEnvRedisClient } from './env-redis.js';
5
+ import { createLogger } from '../utils/logger.js';
6
+ const lockLogger = createLogger('leader-lock');
4
7
  /** Atomic "delete only if I still own it" — closes the get-then-del race where
5
8
  * the lock expires and is re-acquired between the two calls. */
6
9
  const RELEASE_IF_OWNER = 'if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end';
@@ -42,4 +45,19 @@ export async function withLeaderLock(redis, key, ttlMs, fn) {
42
45
  }
43
46
  return true;
44
47
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZGVyLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbGVhZGVyLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBZXBDO2lFQUNpRTtBQUNqRSxNQUFNLGdCQUFnQixHQUNwQixtR0FBbUcsQ0FBQztBQUV0Rzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQWdCLEVBQ2hCLEdBQVcsRUFDWCxLQUFhLEVBQ2IsRUFBdUI7SUFFdkIsTUFBTSxLQUFLLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFDM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVEsS0FBSyxJQUFJO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNiLENBQUM7WUFBUyxDQUFDO1FBQ1QsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw0RUFBNEU7UUFDNUUscURBQXFEO1FBQ3JELElBQUksQ0FBQztZQUNILElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDO2lCQUFNLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asb0RBQW9EO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMgY2xpZW50IHN1cmZhY2UgbmVlZGVkIGZvciBhIGxlYWRlciBsb2NrIChhIHN1YnNldCBvZiBpb3JlZGlzKS5cbiAqIGBzZXRgIGlzIHZhcmlhZGljIHNvIGNhbGxlcnMgY2FuIHBhc3MgYCdQWCcsIHR0bCwgJ05YJ2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja1JlZGlzIHtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+O1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBkZWwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBPcHRpb25hbCBMdWEgZXZhbCAoaW9yZWRpcyBoYXMgaXQpLiBXaGVuIHByZXNlbnQsIHJlbGVhc2UgdXNlcyBhbiBhdG9taWNcbiAgICogIGNvbXBhcmUtYW5kLWRlbGV0ZSBzbyBhIGxhcHNlZCBob2xkZXIgY2FuJ3QgZnJlZSBhIHN1Y2Nlc3NvcidzIGxvY2suICovXG4gIGV2YWw/KHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBBdG9taWMgXCJkZWxldGUgb25seSBpZiBJIHN0aWxsIG93biBpdFwiIOKAlCBjbG9zZXMgdGhlIGdldC10aGVuLWRlbCByYWNlIHdoZXJlXG4gKiAgdGhlIGxvY2sgZXhwaXJlcyBhbmQgaXMgcmUtYWNxdWlyZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzLiAqL1xuY29uc3QgUkVMRUFTRV9JRl9PV05FUiA9XG4gICdpZiByZWRpcy5jYWxsKFwiZ2V0XCIsIEtFWVNbMV0pID09IEFSR1ZbMV0gdGhlbiByZXR1cm4gcmVkaXMuY2FsbChcImRlbFwiLCBLRVlTWzFdKSBlbHNlIHJldHVybiAwIGVuZCc7XG5cbi8qKlxuICogUnVuIGBmbmAgb25seSBpZiB0aGlzIHByb2Nlc3Mgd2lucyBhIHNob3J0LWxpdmVkIGRpc3RyaWJ1dGVkIGxvY2sg4oCUIHRoZVxuICogYWNyb3NzLXBvZHMgXCJzaW5nbGUgcnVubmVyXCIgZ3VhcmQgZm9yIHBlcmlvZGljIGpvYnMgKGRpZ2VzdCBmbHVzaGVzLCBldGMuKS5cbiAqXG4gKiBVc2VzIGBTRVQga2V5IHRva2VuIE5YIFBYIHR0bGAsIHNvIGV4YWN0bHkgb25lIGhvbGRlciBydW5zIHBlciB3aW5kb3cgYW5kIHRoZVxuICogbG9jayBhdXRvLWV4cGlyZXMgaWYgdGhhdCBob2xkZXIgZGllcyBtaWQtcnVuIChubyBzdHVjayBsb2NrKS4gVGhlIGxvY2sgaXNcbiAqIHJlbGVhc2VkIG9uIGNvbXBsZXRpb24sIGJ1dCBvbmx5IGlmIHdlIHN0aWxsIG93biBpdCDigJQgYSBzbG93ZXIgcHJlZGVjZXNzb3JcbiAqIG5ldmVyIGRlbGV0ZXMgYSBzdWNjZXNzb3IncyBsb2NrLiBgdHRsTXNgIHNob3VsZCBjb21mb3J0YWJseSBleGNlZWQgb25lIHJ1bi5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHdlIGhlbGQgdGhlIGxvY2sgYW5kIHJhbiBgZm5gOyBmYWxzZSBpZiBhbm90aGVyIGhvbGRlciBkaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoTGVhZGVyTG9jayhcbiAgcmVkaXM6IExvY2tSZWRpcyxcbiAga2V5OiBzdHJpbmcsXG4gIHR0bE1zOiBudW1iZXIsXG4gIGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHRva2VuID0gcmFuZG9tVVVJRCgpO1xuICBjb25zdCBhY3F1aXJlZCA9IGF3YWl0IHJlZGlzLnNldChrZXksIHRva2VuLCAnUFgnLCB0dGxNcywgJ05YJyk7XG4gIGlmIChhY3F1aXJlZCAhPT0gJ09LJykgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIG9ubHkgaWYgdGhlIGxvY2sgaXMgc3RpbGwgb3VycyDigJQgaWYgb3VyIHJ1biBvdmVycmFuIHRoZSBUVEwgYW5kXG4gICAgLy8gYW5vdGhlciBob2xkZXIgdG9vayBvdmVyLCByZWxlYXNpbmcgaGVyZSB3b3VsZCBmcmVlIHRoZWlyIGxvY2sgZWFybHkuXG4gICAgLy8gUHJlZmVyIGFuIGF0b21pYyBDQVMgKEx1YSk7IGZhbGwgYmFjayB0byBnZXQtdGhlbi1kZWwgZm9yIGNsaWVudHMgd2l0aG91dFxuICAgIC8vIGV2YWwgKHRoZSBzbWFsbCBub24tYXRvbWljIHdpbmRvdyBpcyBUVEwtYm91bmRlZCkuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgcmVkaXMuZXZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhd2FpdCByZWRpcy5ldmFsKFJFTEVBU0VfSUZfT1dORVIsIDEsIGtleSwgdG9rZW4pO1xuICAgICAgfSBlbHNlIGlmICgoYXdhaXQgcmVkaXMuZ2V0KGtleSkpID09PSB0b2tlbikge1xuICAgICAgICBhd2FpdCByZWRpcy5kZWwoa2V5KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0OiB0aGUgVFRMIGV4cGlyZXMgdGhlIGxvY2sgcmVnYXJkbGVzcy5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
48
+ /**
49
+ * A `LockRedis` backed by an env-configured ioredis client (`REDIS_URL` or
50
+ * `REDIS_HOST`) — the leader-lock counterpart to `createEnvRedisAuditSpool` /
51
+ * `createEnvRedisTokenRevocationStore`, for a service that has no BullMQ client to
52
+ * borrow. Returns `null` when Redis isn't configured, so a caller can degrade to
53
+ * running on every pod (the atomic guards it wraps must still make that safe).
54
+ * The client is a real ioredis instance; ioredis exposes `set`/`get`/`del`/`eval`,
55
+ * satisfying `LockRedis` including the atomic CAS release.
56
+ */
57
+ export function createEnvRedisLock() {
58
+ const inst = createEnvRedisClient('leader-lock');
59
+ if (inst)
60
+ lockLogger.info('Redis leader-lock client initialized');
61
+ return inst;
62
+ }
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhZGVyLWxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbGVhZGVyLWxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFlL0M7aUVBQ2lFO0FBQ2pFLE1BQU0sZ0JBQWdCLEdBQ3BCLG1HQUFtRyxDQUFDO0FBRXRHOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBZ0IsRUFDaEIsR0FBVyxFQUNYLEtBQWEsRUFDYixFQUF1QjtJQUV2QixNQUFNLEtBQUssR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUMzQixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hFLElBQUksUUFBUSxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVwQyxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ2IsQ0FBQztZQUFTLENBQUM7UUFDVCwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSxxREFBcUQ7UUFDckQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3BELENBQUM7aUJBQU0sSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxvREFBb0Q7UUFDdEQsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsTUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQVksYUFBYSxDQUFDLENBQUM7SUFDNUQsSUFBSSxJQUFJO1FBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9ja0xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignbGVhZGVyLWxvY2snKTtcblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIGNsaWVudCBzdXJmYWNlIG5lZWRlZCBmb3IgYSBsZWFkZXIgbG9jayAoYSBzdWJzZXQgb2YgaW9yZWRpcykuXG4gKiBgc2V0YCBpcyB2YXJpYWRpYyBzbyBjYWxsZXJzIGNhbiBwYXNzIGAnUFgnLCB0dGwsICdOWCdgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZWRpcyB7XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgZGVsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogT3B0aW9uYWwgTHVhIGV2YWwgKGlvcmVkaXMgaGFzIGl0KS4gV2hlbiBwcmVzZW50LCByZWxlYXNlIHVzZXMgYW4gYXRvbWljXG4gICAqICBjb21wYXJlLWFuZC1kZWxldGUgc28gYSBsYXBzZWQgaG9sZGVyIGNhbid0IGZyZWUgYSBzdWNjZXNzb3IncyBsb2NrLiAqL1xuICBldmFsPyhzY3JpcHQ6IHN0cmluZywgbnVtS2V5czogbnVtYmVyLCAuLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKiogQXRvbWljIFwiZGVsZXRlIG9ubHkgaWYgSSBzdGlsbCBvd24gaXRcIiDigJQgY2xvc2VzIHRoZSBnZXQtdGhlbi1kZWwgcmFjZSB3aGVyZVxuICogIHRoZSBsb2NrIGV4cGlyZXMgYW5kIGlzIHJlLWFjcXVpcmVkIGJldHdlZW4gdGhlIHR3byBjYWxscy4gKi9cbmNvbnN0IFJFTEVBU0VfSUZfT1dORVIgPVxuICAnaWYgcmVkaXMuY2FsbChcImdldFwiLCBLRVlTWzFdKSA9PSBBUkdWWzFdIHRoZW4gcmV0dXJuIHJlZGlzLmNhbGwoXCJkZWxcIiwgS0VZU1sxXSkgZWxzZSByZXR1cm4gMCBlbmQnO1xuXG4vKipcbiAqIFJ1biBgZm5gIG9ubHkgaWYgdGhpcyBwcm9jZXNzIHdpbnMgYSBzaG9ydC1saXZlZCBkaXN0cmlidXRlZCBsb2NrIOKAlCB0aGVcbiAqIGFjcm9zcy1wb2RzIFwic2luZ2xlIHJ1bm5lclwiIGd1YXJkIGZvciBwZXJpb2RpYyBqb2JzIChkaWdlc3QgZmx1c2hlcywgZXRjLikuXG4gKlxuICogVXNlcyBgU0VUIGtleSB0b2tlbiBOWCBQWCB0dGxgLCBzbyBleGFjdGx5IG9uZSBob2xkZXIgcnVucyBwZXIgd2luZG93IGFuZCB0aGVcbiAqIGxvY2sgYXV0by1leHBpcmVzIGlmIHRoYXQgaG9sZGVyIGRpZXMgbWlkLXJ1biAobm8gc3R1Y2sgbG9jaykuIFRoZSBsb2NrIGlzXG4gKiByZWxlYXNlZCBvbiBjb21wbGV0aW9uLCBidXQgb25seSBpZiB3ZSBzdGlsbCBvd24gaXQg4oCUIGEgc2xvd2VyIHByZWRlY2Vzc29yXG4gKiBuZXZlciBkZWxldGVzIGEgc3VjY2Vzc29yJ3MgbG9jay4gYHR0bE1zYCBzaG91bGQgY29tZm9ydGFibHkgZXhjZWVkIG9uZSBydW4uXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiB3ZSBoZWxkIHRoZSBsb2NrIGFuZCByYW4gYGZuYDsgZmFsc2UgaWYgYW5vdGhlciBob2xkZXIgZGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aExlYWRlckxvY2soXG4gIHJlZGlzOiBMb2NrUmVkaXMsXG4gIGtleTogc3RyaW5nLFxuICB0dGxNczogbnVtYmVyLFxuICBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0b2tlbiA9IHJhbmRvbVVVSUQoKTtcbiAgY29uc3QgYWNxdWlyZWQgPSBhd2FpdCByZWRpcy5zZXQoa2V5LCB0b2tlbiwgJ1BYJywgdHRsTXMsICdOWCcpO1xuICBpZiAoYWNxdWlyZWQgIT09ICdPSycpIHJldHVybiBmYWxzZTtcblxuICB0cnkge1xuICAgIGF3YWl0IGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmVsZWFzZSBvbmx5IGlmIHRoZSBsb2NrIGlzIHN0aWxsIG91cnMg4oCUIGlmIG91ciBydW4gb3ZlcnJhbiB0aGUgVFRMIGFuZFxuICAgIC8vIGFub3RoZXIgaG9sZGVyIHRvb2sgb3ZlciwgcmVsZWFzaW5nIGhlcmUgd291bGQgZnJlZSB0aGVpciBsb2NrIGVhcmx5LlxuICAgIC8vIFByZWZlciBhbiBhdG9taWMgQ0FTIChMdWEpOyBmYWxsIGJhY2sgdG8gZ2V0LXRoZW4tZGVsIGZvciBjbGllbnRzIHdpdGhvdXRcbiAgICAvLyBldmFsICh0aGUgc21hbGwgbm9uLWF0b21pYyB3aW5kb3cgaXMgVFRMLWJvdW5kZWQpLlxuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHJlZGlzLmV2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZXZhbChSRUxFQVNFX0lGX09XTkVSLCAxLCBrZXksIHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAoKGF3YWl0IHJlZGlzLmdldChrZXkpKSA9PT0gdG9rZW4pIHtcbiAgICAgICAgYXdhaXQgcmVkaXMuZGVsKGtleSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydDogdGhlIFRUTCBleHBpcmVzIHRoZSBsb2NrIHJlZ2FyZGxlc3MuXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgYExvY2tSZWRpc2AgYmFja2VkIGJ5IGFuIGVudi1jb25maWd1cmVkIGlvcmVkaXMgY2xpZW50IChgUkVESVNfVVJMYCBvclxuICogYFJFRElTX0hPU1RgKSDigJQgdGhlIGxlYWRlci1sb2NrIGNvdW50ZXJwYXJ0IHRvIGBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2xgIC9cbiAqIGBjcmVhdGVFbnZSZWRpc1Rva2VuUmV2b2NhdGlvblN0b3JlYCwgZm9yIGEgc2VydmljZSB0aGF0IGhhcyBubyBCdWxsTVEgY2xpZW50IHRvXG4gKiBib3Jyb3cuIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc28gYSBjYWxsZXIgY2FuIGRlZ3JhZGUgdG9cbiAqIHJ1bm5pbmcgb24gZXZlcnkgcG9kICh0aGUgYXRvbWljIGd1YXJkcyBpdCB3cmFwcyBtdXN0IHN0aWxsIG1ha2UgdGhhdCBzYWZlKS5cbiAqIFRoZSBjbGllbnQgaXMgYSByZWFsIGlvcmVkaXMgaW5zdGFuY2U7IGlvcmVkaXMgZXhwb3NlcyBgc2V0YC9gZ2V0YC9gZGVsYC9gZXZhbGAsXG4gKiBzYXRpc2Z5aW5nIGBMb2NrUmVkaXNgIGluY2x1ZGluZyB0aGUgYXRvbWljIENBUyByZWxlYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNMb2NrKCk6IExvY2tSZWRpcyB8IG51bGwge1xuICBjb25zdCBpbnN0ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8TG9ja1JlZGlzPignbGVhZGVyLWxvY2snKTtcbiAgaWYgKGluc3QpIGxvY2tMb2dnZXIuaW5mbygnUmVkaXMgbGVhZGVyLWxvY2sgY2xpZW50IGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBpbnN0O1xufVxuIl19