@pipeline-builder/api-core 4.1.12 → 4.1.14

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 (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
@@ -38,10 +38,17 @@ export interface AuditSpool {
38
38
  /** Return entries whose re-delivery failed to the HEAD of the buffer (retried
39
39
  * first) and clear them from the in-progress list. Best-effort. */
40
40
  requeue(entries: AuditSpoolEntry[]): Promise<void>;
41
- /** Reclaim any entries stranded on the in-progress list by a prior crash,
42
- * moving them back to the head of the main buffer. Call once at startup.
43
- * Returns the number reclaimed. */
41
+ /**
42
+ * Reclaim entries stranded on ABANDONED in-progress lists — those of owners
43
+ * (spool instances, i.e. pods) whose heartbeat is older than the stale
44
+ * threshold — moving them back to the head of the main buffer. A LIVE owner's
45
+ * in-flight batch is never touched, so a peer's recover can't duplicate work
46
+ * that owner is still delivering. Safe to call periodically; returns the
47
+ * number reclaimed.
48
+ */
44
49
  recover(): Promise<number>;
50
+ /** Mark this owner alive (so no peer reclaims its in-flight batch). */
51
+ heartbeat(): Promise<void>;
45
52
  /** Approximate current depth (for metrics / drain decisions). */
46
53
  depth(): Promise<number>;
47
54
  }
@@ -56,24 +63,41 @@ interface RedisListClient {
56
63
  lmove(source: string, destination: string, from: 'LEFT' | 'RIGHT', to: 'LEFT' | 'RIGHT'): Promise<string | null>;
57
64
  /** Remove `count` occurrences of `value` from a list. */
58
65
  lrem(key: string, count: number, value: string): Promise<number>;
66
+ /** Owner heartbeats: a sorted set of owner id → last-seen epoch ms. */
67
+ zadd(key: string, score: number, member: string): Promise<unknown>;
68
+ zrangebyscore(key: string, min: number | string, max: number | string): Promise<string[]>;
69
+ zrem(key: string, member: string): Promise<number>;
59
70
  }
71
+ /**
72
+ * The spool key for one service's buffered audit events. Per SERVICE on
73
+ * purpose: re-delivery mints a service token as `entry.serviceName`, which only
74
+ * that service's pods can sign (per-service keys). A shared key let a pod of
75
+ * one service take another's entries, fail to sign for them, and requeue them
76
+ * forever — while that service's own pods never saw them.
77
+ */
78
+ export declare function auditSpoolKey(serviceName: string): string;
60
79
  /**
61
80
  * Redis-LIST-backed spool. Durable across process restarts (unlike an in-memory
62
81
  * or per-pod-disk buffer), shared by all replicas of a service, and bounded via
63
82
  * a trim-to-tail on overflow (drops the OLDEST, emitting `audit_spool_dropped_total`).
64
83
  */
65
- export declare function createRedisAuditSpool(redis: RedisListClient, opts?: {
84
+ export interface RedisAuditSpoolOptions {
85
+ /** The buffer's Redis key — one per service ({@link auditSpoolKey}). */
86
+ key: string;
66
87
  maxDepth?: number;
67
- key?: string;
68
- }): AuditSpool;
88
+ /** This instance's owner id (default: random per instance). */
89
+ ownerId?: string;
90
+ /** Heartbeat age after which an owner's in-flight batch is reclaimable. */
91
+ staleOwnerMs?: number;
92
+ /** Awaited before each command — e.g. a readiness gate for a lazily connecting client. */
93
+ ready?: () => Promise<void>;
94
+ }
95
+ export declare function createRedisAuditSpool(redis: RedisListClient, opts: RedisAuditSpoolOptions): AuditSpool;
69
96
  /**
70
97
  * Build a Redis-backed audit spool from the ambient `REDIS_URL` / `REDIS_SENTINELS`
71
98
  * env via the shared `createEnvRedisClient`. Returns `null` when Redis is not
72
99
  * configured — the caller then runs without a spool (best-effort behavior). The shared helper loads
73
100
  * ioredis via `createRequire`, so this stays importable where Redis isn't present.
74
101
  */
75
- export declare function createEnvRedisAuditSpool(opts?: {
76
- maxDepth?: number;
77
- key?: string;
78
- }): AuditSpool | null;
102
+ export declare function createEnvRedisAuditSpool(opts: Omit<RedisAuditSpoolOptions, 'ready'>): AuditSpool | null;
79
103
  export {};
@@ -1,17 +1,26 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { createEnvRedisClient } from './env-redis.js';
3
+ import { randomUUID } from 'crypto';
4
+ import { createEnvRedisClient, createRedisReadyGate } from './env-redis.js';
4
5
  import { createLogger } from '../utils/logger.js';
5
6
  import { emitCounter } from '../utils/metric-emitter.js';
6
7
  import { errorMessage } from '../utils/response.js';
7
8
  const logger = createLogger('audit-spool');
8
- const DEFAULT_SPOOL_KEY = 'audit:spool';
9
+ /**
10
+ * The spool key for one service's buffered audit events. Per SERVICE on
11
+ * purpose: re-delivery mints a service token as `entry.serviceName`, which only
12
+ * that service's pods can sign (per-service keys). A shared key let a pod of
13
+ * one service take another's entries, fail to sign for them, and requeue them
14
+ * forever — while that service's own pods never saw them.
15
+ */
16
+ export function auditSpoolKey(serviceName) {
17
+ return `audit:spool:${serviceName}`;
18
+ }
9
19
  const DEFAULT_MAX_DEPTH = 10_000;
20
+ /** An owner whose heartbeat is older than this is presumed dead (its pod crashed). */
21
+ const DEFAULT_STALE_OWNER_MS = 10 * 60_000;
10
22
  /** Guard so a pathological in-progress list can't spin `recover`/`take` forever. */
11
23
  const MAX_MOVE_ITERATIONS = 100_000;
12
- function errMsg(err) {
13
- return errorMessage(err);
14
- }
15
24
  function safeParse(raw) {
16
25
  try {
17
26
  const parsed = JSON.parse(raw);
@@ -21,19 +30,24 @@ function safeParse(raw) {
21
30
  return null;
22
31
  }
23
32
  }
24
- /**
25
- * Redis-LIST-backed spool. Durable across process restarts (unlike an in-memory
26
- * or per-pod-disk buffer), shared by all replicas of a service, and bounded via
27
- * a trim-to-tail on overflow (drops the OLDEST, emitting `audit_spool_dropped_total`).
28
- */
29
- export function createRedisAuditSpool(redis, opts = {}) {
30
- const key = opts.key ?? DEFAULT_SPOOL_KEY;
31
- // The in-progress "processing" list — a taken batch lives here until it is
32
- // acked (delivered) or requeued (still failing). It is a security log's
33
- // durability net: a crash between take and ack/requeue leaves the batch here,
34
- // and `recover` reclaims it on restart instead of silently losing it.
35
- const inProgressKey = `${key}:inflight`;
33
+ export function createRedisAuditSpool(redis, opts) {
34
+ const key = opts.key;
35
+ const ownerId = opts.ownerId ?? randomUUID();
36
+ const staleOwnerMs = Math.max(1, opts.staleOwnerMs ?? DEFAULT_STALE_OWNER_MS);
37
+ const ready = opts.ready ?? (() => Promise.resolve());
38
+ // PER-OWNER in-progress list — a taken batch lives here until it is acked
39
+ // (delivered) or requeued (still failing). It is a security log's durability
40
+ // net: a crash between take and ack/requeue leaves the batch here, and a peer's
41
+ // (or this pod's successor's) `recover` reclaims it once the owner's heartbeat
42
+ // goes stale. One shared in-flight list let any replica's startup recover
43
+ // steal batches its live siblings were mid-way through delivering.
44
+ const inflightKeyOf = (owner) => `${key}:inflight:${owner}`;
45
+ const inProgressKey = inflightKeyOf(ownerId);
46
+ const ownersKey = `${key}:owners`;
36
47
  const maxDepth = Math.max(1, opts.maxDepth ?? DEFAULT_MAX_DEPTH);
48
+ const beat = async () => {
49
+ await redis.zadd(ownersKey, Date.now(), ownerId);
50
+ };
37
51
  // The EXACT serialized string each returned entry was parsed from, so `ack` /
38
52
  // `requeue` can LREM the precise value off the in-progress list. Keyed by the
39
53
  // returned object identity (the drain consumer passes the SAME objects back),
@@ -43,6 +57,7 @@ export function createRedisAuditSpool(redis, opts = {}) {
43
57
  return {
44
58
  async enqueue(entry) {
45
59
  try {
60
+ await ready();
46
61
  const len = await redis.rpush(key, JSON.stringify(entry));
47
62
  emitCounter('audit_spool_enqueued_total', { service: entry.serviceName });
48
63
  if (len > maxDepth) {
@@ -54,11 +69,13 @@ export function createRedisAuditSpool(redis, opts = {}) {
54
69
  }
55
70
  }
56
71
  catch (err) {
57
- logger.warn('Audit spool enqueue failed (event lost)', { error: errMsg(err) });
72
+ logger.warn('Audit spool enqueue failed (event lost)', { error: errorMessage(err) });
58
73
  }
59
74
  },
60
75
  async take(max) {
61
76
  try {
77
+ await ready();
78
+ await beat();
62
79
  const out = [];
63
80
  const limit = Math.max(1, max);
64
81
  for (let i = 0; i < limit; i++) {
@@ -82,7 +99,7 @@ export function createRedisAuditSpool(redis, opts = {}) {
82
99
  return out;
83
100
  }
84
101
  catch (err) {
85
- logger.warn('Audit spool take failed', { error: errMsg(err) });
102
+ logger.warn('Audit spool take failed', { error: errorMessage(err) });
86
103
  return [];
87
104
  }
88
105
  },
@@ -90,13 +107,14 @@ export function createRedisAuditSpool(redis, opts = {}) {
90
107
  if (entries.length === 0)
91
108
  return;
92
109
  try {
110
+ await ready();
93
111
  for (const entry of entries) {
94
112
  await redis.lrem(inProgressKey, 1, rawOf(entry));
95
113
  rawByEntry.delete(entry);
96
114
  }
97
115
  }
98
116
  catch (err) {
99
- logger.warn('Audit spool ack failed (may re-deliver on recover)', { error: errMsg(err) });
117
+ logger.warn('Audit spool ack failed (may re-deliver on recover)', { error: errorMessage(err) });
100
118
  }
101
119
  },
102
120
  async requeue(entries) {
@@ -113,6 +131,7 @@ export function createRedisAuditSpool(redis, opts = {}) {
113
131
  // lists → harmless double-delivery (deduped downstream by idempotency
114
132
  // reuse), never a LOSS. The reverse order (lrem then lpush) would drop the
115
133
  // event outright on a crash in the gap, which a security log must not do.
134
+ await ready();
116
135
  for (let i = entries.length - 1; i >= 0; i--) {
117
136
  const raw = rawOf(entries[i]);
118
137
  await redis.lpush(key, raw);
@@ -121,31 +140,50 @@ export function createRedisAuditSpool(redis, opts = {}) {
121
140
  }
122
141
  }
123
142
  catch (err) {
124
- logger.warn('Audit spool requeue failed (events lost)', { error: errMsg(err) });
143
+ logger.warn('Audit spool requeue failed (events lost)', { error: errorMessage(err) });
125
144
  }
126
145
  },
127
146
  async recover() {
128
147
  try {
148
+ await ready();
149
+ await beat();
129
150
  let reclaimed = 0;
130
- for (let i = 0; i < MAX_MOVE_ITERATIONS; i++) {
131
- // Move in-progress-tail → main-head: an older stranded entry (nearer the
132
- // in-progress head) ends up ahead of a newer one, preserving order.
133
- const raw = await redis.lmove(inProgressKey, key, 'RIGHT', 'LEFT');
134
- if (raw === null || raw === undefined)
135
- break;
136
- reclaimed++;
151
+ const stale = await redis.zrangebyscore(ownersKey, '-inf', Date.now() - staleOwnerMs);
152
+ for (const owner of stale) {
153
+ if (owner === ownerId)
154
+ continue;
155
+ const source = inflightKeyOf(owner);
156
+ for (let i = 0; i < MAX_MOVE_ITERATIONS; i++) {
157
+ // Move in-progress-tail → main-head: an older stranded entry (nearer
158
+ // the in-progress head) ends up ahead of a newer one, preserving order.
159
+ const raw = await redis.lmove(source, key, 'RIGHT', 'LEFT');
160
+ if (raw === null || raw === undefined)
161
+ break;
162
+ reclaimed++;
163
+ }
164
+ // Only forget the owner once its list is empty.
165
+ await redis.zrem(ownersKey, owner);
137
166
  }
138
167
  if (reclaimed > 0) {
139
168
  emitCounter('audit_spool_recovered_total', {}, reclaimed);
140
- logger.warn('Audit spool recovered stranded in-progress events', { reclaimed });
169
+ logger.warn('Audit spool recovered events stranded by a dead owner', { reclaimed });
141
170
  }
142
171
  return reclaimed;
143
172
  }
144
173
  catch (err) {
145
- logger.warn('Audit spool recover failed', { error: errMsg(err) });
174
+ logger.warn('Audit spool recover failed', { error: errorMessage(err) });
146
175
  return 0;
147
176
  }
148
177
  },
178
+ async heartbeat() {
179
+ try {
180
+ await ready();
181
+ await beat();
182
+ }
183
+ catch (err) {
184
+ logger.debug('Audit spool heartbeat failed', { error: errorMessage(err) });
185
+ }
186
+ },
149
187
  async depth() {
150
188
  try {
151
189
  return await redis.llen(key);
@@ -162,11 +200,14 @@ export function createRedisAuditSpool(redis, opts = {}) {
162
200
  * configured — the caller then runs without a spool (best-effort behavior). The shared helper loads
163
201
  * ioredis via `createRequire`, so this stays importable where Redis isn't present.
164
202
  */
165
- export function createEnvRedisAuditSpool(opts = {}) {
203
+ export function createEnvRedisAuditSpool(opts) {
166
204
  const inst = createEnvRedisClient('audit-spool');
167
205
  if (!inst)
168
206
  return null;
169
- logger.info('Redis audit spool initialized');
170
- return createRedisAuditSpool(inst, opts);
207
+ logger.info('Redis audit spool initialized', { key: opts.key });
208
+ // The env client has no offline queue: a boot-time recover() run before the
209
+ // connection is up would fail and strand batches until the next restart, so
210
+ // every command waits (bounded) for readiness.
211
+ return createRedisAuditSpool(inst, { ...opts, ready: createRedisReadyGate(inst, 10_000) });
171
212
  }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUErRDNDLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLG9GQUFvRjtBQUNwRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQUVwQyxTQUFTLE1BQU0sQ0FBQyxHQUFZO0lBQzFCLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFvQixDQUFDO1FBQ2xELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxLQUFzQixFQUN0QixJQUFJLEdBQXdDLEVBQUU7SUFFOUMsTUFBTSxH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U0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNsQixXQUFXLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUMxRCxNQUFNLENBQUMsSUFBSSxDQUFDLG1EQUFtRCxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDbEYsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2xFLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSztZQUNULElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLE9BQU8sQ0FBQyxDQUFDO1lBQ1gsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQUksR0FBd0MsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBa0IsYUFBYSxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDN0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IE1PVkUgdXAgdG8gYG1heGAgYnVmZmVyZWQgZW50cmllcyBvbnRvIGFuIGluLXByb2dyZXNzIGxpc3QgYW5kXG4gICAqIHJldHVybiB0aGVtLiBCZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBtb3ZlZCAobm90IHBvcHBlZC1hbmQtZHJvcHBlZCksIGEgY3Jhc2hcbiAgICogbWlkLWRyYWluIGxlYXZlcyB0aGVtIHJlY292ZXJhYmxlIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IOKAlCBzZWUgYHJlY292ZXJgLlxuICAgKiBFYWNoIHRha2VuIGVudHJ5IE1VU1QgYmUgcmVzb2x2ZWQgd2l0aCBleGFjdGx5IG9uZSBvZiBgYWNrYCAoZGVsaXZlcmVkKSBvclxuICAgKiBgcmVxdWV1ZWAgKHN0aWxsIGZhaWxpbmcpLCBvciBpdCBsaW5nZXJzIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHVudGlsIHRoZVxuICAgKiBuZXh0IGByZWNvdmVyYC5cbiAgICovXG4gIHRha2UobWF4OiBudW1iZXIpOiBQcm9taXNlPEF1ZGl0U3Bvb2xFbnRyeVtdPjtcbiAgLyoqIEFja25vd2xlZGdlIHN1Y2Nlc3NmdWxseSByZS1kZWxpdmVyZWQgZW50cmllcyDigJQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlXG4gICAqICBpbi1wcm9ncmVzcyBsaXN0IHNvIHRoZXkgYXJlIG5vdCByZWNvdmVyZWQgYWdhaW4uICovXG4gIGFjayhlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZXR1cm4gZW50cmllcyB3aG9zZSByZS1kZWxpdmVyeSBmYWlsZWQgdG8gdGhlIEhFQUQgb2YgdGhlIGJ1ZmZlciAocmV0cmllZFxuICAgKiAgZmlyc3QpIGFuZCBjbGVhciB0aGVtIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3QuIEJlc3QtZWZmb3J0LiAqL1xuICByZXF1ZXVlKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFJlY2xhaW0gYW55IGVudHJpZXMgc3RyYW5kZWQgb24gdGhlIGluLXByb2dyZXNzIGxpc3QgYnkgYSBwcmlvciBjcmFzaCxcbiAgICogIG1vdmluZyB0aGVtIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIG1haW4gYnVmZmVyLiBDYWxsIG9uY2UgYXQgc3RhcnR1cC5cbiAgICogIFJldHVybnMgdGhlIG51bWJlciByZWNsYWltZWQuICovXG4gIHJlY292ZXIoKTogUHJvbWlzZTxudW1iZXI+O1xuICAvKiogQXBwcm94aW1hdGUgY3VycmVudCBkZXB0aCAoZm9yIG1ldHJpY3MgLyBkcmFpbiBkZWNpc2lvbnMpLiAqL1xuICBkZXB0aCgpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8qKiBNaW5pbWFsIFJlZGlzIExJU1Qgc3VyZmFjZSB0aGUgc3Bvb2wgbmVlZHMgKGEgc3Vic2V0IG9mIGlvcmVkaXMpLiAqL1xuaW50ZXJmYWNlIFJlZGlzTGlzdENsaWVudCB7XG4gIHJwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscHVzaChrZXk6IHN0cmluZywgLi4udmFsdWVzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgbHBvcChrZXk6IHN0cmluZywgY291bnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10gfCBudWxsPjtcbiAgbHRyaW0oa2V5OiBzdHJpbmcsIHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIGxsZW4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIC8qKiBBdG9taWNhbGx5IHBvcCBmcm9tIG9uZSBsaXN0IGVuZCBhbmQgcHVzaCB0byBhbm90aGVyIChSZWRpcyDiiaUgNi4yKS4gKi9cbiAgbG1vdmUoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGZyb206ICdMRUZUJyB8ICdSSUdIVCcsIHRvOiAnTEVGVCcgfCAnUklHSFQnKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIFJlbW92ZSBgY291bnRgIG9jY3VycmVuY2VzIG9mIGB2YWx1ZWAgZnJvbSBhIGxpc3QuICovXG4gIGxyZW0oa2V5OiBzdHJpbmcsIGNvdW50OiBudW1iZXIsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IERFRkFVTFRfU1BPT0xfS0VZID0gJ2F1ZGl0OnNwb29sJztcbmNvbnN0IERFRkFVTFRfTUFYX0RFUFRIID0gMTBfMDAwO1xuLyoqIEd1YXJkIHNvIGEgcGF0aG9sb2dpY2FsIGluLXByb2dyZXNzIGxpc3QgY2FuJ3Qgc3BpbiBgcmVjb3ZlcmAvYHRha2VgIGZvcmV2ZXIuICovXG5jb25zdCBNQVhfTU9WRV9JVEVSQVRJT05TID0gMTAwXzAwMDtcblxuZnVuY3Rpb24gZXJyTXNnKGVycjogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBlcnJvck1lc3NhZ2UoZXJyKTtcbn1cblxuZnVuY3Rpb24gc2FmZVBhcnNlKHJhdzogc3RyaW5nKTogQXVkaXRTcG9vbEVudHJ5IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpIGFzIEF1ZGl0U3Bvb2xFbnRyeTtcbiAgICByZXR1cm4gcGFyc2VkICYmIHBhcnNlZC5ldmVudCAmJiBwYXJzZWQuc2VydmljZU5hbWUgPyBwYXJzZWQgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJlZGlzLUxJU1QtYmFja2VkIHNwb29sLiBEdXJhYmxlIGFjcm9zcyBwcm9jZXNzIHJlc3RhcnRzICh1bmxpa2UgYW4gaW4tbWVtb3J5XG4gKiBvciBwZXItcG9kLWRpc2sgYnVmZmVyKSwgc2hhcmVkIGJ5IGFsbCByZXBsaWNhcyBvZiBhIHNlcnZpY2UsIGFuZCBib3VuZGVkIHZpYVxuICogYSB0cmltLXRvLXRhaWwgb24gb3ZlcmZsb3cgKGRyb3BzIHRoZSBPTERFU1QsIGVtaXR0aW5nIGBhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woXG4gIHJlZGlzOiBSZWRpc0xpc3RDbGllbnQsXG4gIG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30sXG4pOiBBdWRpdFNwb29sIHtcbiAgY29uc3Qga2V5ID0gb3B0cy5rZXkgPz8gREVGQVVMVF9TUE9PTF9LRVk7XG4gIC8vIFRoZSBpbi1wcm9ncmVzcyBcInByb2Nlc3NpbmdcIiBsaXN0IOKAlCBhIHRha2VuIGJhdGNoIGxpdmVzIGhlcmUgdW50aWwgaXQgaXNcbiAgLy8gYWNrZWQgKGRlbGl2ZXJlZCkgb3IgcmVxdWV1ZWQgKHN0aWxsIGZhaWxpbmcpLiBJdCBpcyBhIHNlY3VyaXR5IGxvZydzXG4gIC8vIGR1cmFiaWxpdHkgbmV0OiBhIGNyYXNoIGJldHdlZW4gdGFrZSBhbmQgYWNrL3JlcXVldWUgbGVhdmVzIHRoZSBiYXRjaCBoZXJlLFxuICAvLyBhbmQgYHJlY292ZXJgIHJlY2xhaW1zIGl0IG9uIHJlc3RhcnQgaW5zdGVhZCBvZiBzaWxlbnRseSBsb3NpbmcgaXQuXG4gIGNvbnN0IGluUHJvZ3Jlc3NLZXkgPSBgJHtrZXl9OmluZmxpZ2h0YDtcbiAgY29uc3QgbWF4RGVwdGggPSBNYXRoLm1heCgxLCBvcHRzLm1heERlcHRoID8/IERFRkFVTFRfTUFYX0RFUFRIKTtcblxuICAvLyBUaGUgRVhBQ1Qgc2VyaWFsaXplZCBzdHJpbmcgZWFjaCByZXR1cm5lZCBlbnRyeSB3YXMgcGFyc2VkIGZyb20sIHNvIGBhY2tgIC9cbiAgLy8gYHJlcXVldWVgIGNhbiBMUkVNIHRoZSBwcmVjaXNlIHZhbHVlIG9mZiB0aGUgaW4tcHJvZ3Jlc3MgbGlzdC4gS2V5ZWQgYnkgdGhlXG4gIC8vIHJldHVybmVkIG9iamVjdCBpZGVudGl0eSAodGhlIGRyYWluIGNvbnN1bWVyIHBhc3NlcyB0aGUgU0FNRSBvYmplY3RzIGJhY2spLFxuICAvLyBzbyBpdCBuZWVkcyBubyBzdGFibGUgcmUtc2VyaWFsaXphdGlvbi4gV2Vha01hcCDihpIgZW50cmllcyBHQyBuYXR1cmFsbHkuXG4gIGNvbnN0IHJhd0J5RW50cnkgPSBuZXcgV2Vha01hcDxBdWRpdFNwb29sRW50cnksIHN0cmluZz4oKTtcbiAgY29uc3QgcmF3T2YgPSAoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IHN0cmluZyA9PiByYXdCeUVudHJ5LmdldChlbnRyeSkgPz8gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZW5xdWV1ZShlbnRyeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGVuID0gYXdhaXQgcmVkaXMucnB1c2goa2V5LCBKU09OLnN0cmluZ2lmeShlbnRyeSkpO1xuICAgICAgICBlbWl0Q291bnRlcignYXVkaXRfc3Bvb2xfZW5xdWV1ZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0pO1xuICAgICAgICBpZiAobGVuID4gbWF4RGVwdGgpIHtcbiAgICAgICAgICAvLyBLZWVwIG9ubHkgdGhlIG5ld2VzdCBgbWF4RGVwdGhgOyBkcm9wIHRoZSBvdmVyZmxvdyBhdCB0aGUgaGVhZC5cbiAgICAgICAgICBjb25zdCBkcm9wcGVkID0gbGVuIC0gbWF4RGVwdGg7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHRyaW0oa2V5LCBkcm9wcGVkLCAtMSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWwnLCB7IHNlcnZpY2U6IGVudHJ5LnNlcnZpY2VOYW1lIH0sIGRyb3BwZWQpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBvdmVyZmxvdyDigJQgZHJvcHBlZCBvbGRlc3QgYnVmZmVyZWQgZXZlbnRzJywgeyBkcm9wcGVkLCBtYXhEZXB0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBlbnF1ZXVlIGZhaWxlZCAoZXZlbnQgbG9zdCknLCB7IGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdGFrZShtYXgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG91dDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgxLCBtYXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHtcbiAgICAgICAgICAvLyBBdG9taWNhbGx5IE1PVkUgaGVhZOKGkmluLXByb2dyZXNzLXRhaWwgc28gdGhlIGVudHJ5IGlzIG5ldmVyIGluIGxpbWJvOlxuICAgICAgICAgIC8vIGl0IGlzIG9uIGV4YWN0bHkgb25lIGxpc3QgYXQgYWxsIHRpbWVzLCByZWNvdmVyYWJsZSBhZnRlciBhIGNyYXNoLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGtleSwgaW5Qcm9ncmVzc0tleSwgJ0xFRlQnLCAnUklHSFQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBzYWZlUGFyc2UocmF3KTtcbiAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICByYXdCeUVudHJ5LnNldChwYXJzZWQsIHJhdyk7XG4gICAgICAgICAgICBvdXQucHVzaChwYXJzZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb3JydXB0IHBheWxvYWQg4oCUIGRyb3AgaXQgb2ZmIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHNvIGl0IGNhbid0IHdlZGdlXG4gICAgICAgICAgICAvLyB0aGUgZHJhaW4sIGFuZCBhY2NvdW50IGZvciBpdC5cbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiAndW5rbm93bicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHRha2UgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgYWNrKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHJlbShpblByb2dyZXNzS2V5LCAxLCByYXdPZihlbnRyeSkpO1xuICAgICAgICAgIHJhd0J5RW50cnkuZGVsZXRlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBhY2sgZmFpbGVkIChtYXkgcmUtZGVsaXZlciBvbiByZWNvdmVyKScsIHsgZXJyb3I6IGVyck1zZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXVlKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUHV0IGZhaWxlZCByZS1kZWxpdmVyaWVzIGJhY2sgYXQgdGhlIEhFQUQgc28gdGhleSdyZSByZXRyaWVkIGZpcnN0IGFuZFxuICAgICAgICAvLyByb3VnaCBlbWlzc2lvbiBvcmRlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBvdXRhZ2Ug4oCUIGFuZCBjbGVhciB0aGVtXG4gICAgICAgIC8vIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3Qgc28gYHJlY292ZXJgIGRvZXNuJ3QgZG91YmxlIHRoZW0uIEl0ZXJhdGUgaW5cbiAgICAgICAgLy8gcmV2ZXJzZSBzbyBscHVzaCByZXN0b3JlcyB0aGUgYmF0Y2gncyBvcmlnaW5hbCBvcmRlciBhdCB0aGUgaGVhZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT1JERVJJTkcgSU5WQVJJQU5UIChhdC1sZWFzdC1vbmNlKTogbHB1c2ggdG8gdGhlIG1haW4gbGlzdCBGSVJTVCwgVEhFTlxuICAgICAgICAvLyBscmVtIGZyb20gaW4tcHJvZ3Jlc3MuIEEgY3Jhc2ggYmV0d2VlbiB0aGUgdHdvIGxlYXZlcyB0aGUgZW50cnkgb24gQk9USFxuICAgICAgICAvLyBsaXN0cyDihpIgaGFybWxlc3MgZG91YmxlLWRlbGl2ZXJ5IChkZWR1cGVkIGRvd25zdHJlYW0gYnkgaWRlbXBvdGVuY3lcbiAgICAgICAgLy8gcmV1c2UpLCBuZXZlciBhIExPU1MuIFRoZSByZXZlcnNlIG9yZGVyIChscmVtIHRoZW4gbHB1c2gpIHdvdWxkIGRyb3AgdGhlXG4gICAgICAgIC8vIGV2ZW50IG91dHJpZ2h0IG9uIGEgY3Jhc2ggaW4gdGhlIGdhcCwgd2hpY2ggYSBzZWN1cml0eSBsb2cgbXVzdCBub3QgZG8uXG4gICAgICAgIGZvciAobGV0IGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gcmF3T2YoZW50cmllc1tpXSk7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHB1c2goa2V5LCByYXcpO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyaWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZXF1ZXVlIGZhaWxlZCAoZXZlbnRzIGxvc3QpJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlY292ZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVjbGFpbWVkID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNQVhfTU9WRV9JVEVSQVRJT05TOyBpKyspIHtcbiAgICAgICAgICAvLyBNb3ZlIGluLXByb2dyZXNzLXRhaWwg4oaSIG1haW4taGVhZDogYW4gb2xkZXIgc3RyYW5kZWQgZW50cnkgKG5lYXJlciB0aGVcbiAgICAgICAgICAvLyBpbi1wcm9ncmVzcyBoZWFkKSBlbmRzIHVwIGFoZWFkIG9mIGEgbmV3ZXIgb25lLCBwcmVzZXJ2aW5nIG9yZGVyLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGluUHJvZ3Jlc3NLZXksIGtleSwgJ1JJR0hUJywgJ0xFRlQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICByZWNsYWltZWQrKztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjbGFpbWVkID4gMCkge1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9yZWNvdmVyZWRfdG90YWwnLCB7fSwgcmVjbGFpbWVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgcmVjb3ZlcmVkIHN0cmFuZGVkIGluLXByb2dyZXNzIGV2ZW50cycsIHsgcmVjbGFpbWVkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNsYWltZWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlY292ZXIgZmFpbGVkJywgeyBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBkZXB0aCgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZWRpcy5sbGVuKGtleSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFJlZGlzLWJhY2tlZCBhdWRpdCBzcG9vbCBmcm9tIHRoZSBhbWJpZW50IGBSRURJU19VUkxgIC8gYFJFRElTX1NFTlRJTkVMU2BcbiAqIGVudiB2aWEgdGhlIHNoYXJlZCBgY3JlYXRlRW52UmVkaXNDbGllbnRgLiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzIG5vdFxuICogY29uZmlndXJlZCDigJQgdGhlIGNhbGxlciB0aGVuIHJ1bnMgd2l0aG91dCBhIHNwb29sIChiZXN0LWVmZm9ydCBiZWhhdmlvcikuIFRoZSBzaGFyZWQgaGVscGVyIGxvYWRzXG4gKiBpb3JlZGlzIHZpYSBgY3JlYXRlUmVxdWlyZWAsIHNvIHRoaXMgc3RheXMgaW1wb3J0YWJsZSB3aGVyZSBSZWRpcyBpc24ndCBwcmVzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNBdWRpdFNwb29sKG9wdHM6IHsgbWF4RGVwdGg/OiBudW1iZXI7IGtleT86IHN0cmluZyB9ID0ge30pOiBBdWRpdFNwb29sIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc0xpc3RDbGllbnQ+KCdhdWRpdC1zcG9vbCcpO1xuICBpZiAoIWluc3QpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgYXVkaXQgc3Bvb2wgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzQXVkaXRTcG9vbChpbnN0LCBvcHRzKTtcbn1cbiJdfQ==
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtc3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvYXVkaXQtc3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUEwRTNDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBbUI7SUFDL0MsT0FBTyxlQUFlLFdBQVcsRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztBQUNqQyxzRkFBc0Y7QUFDdEYsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQzNDLG9GQUFvRjtBQUNwRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQUVwQyxTQUFTLFNBQVMsQ0FBQyxHQUFXO0lBQzVCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFvQixDQUFDO1FBQ2xELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDdEUsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FB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RixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLElBQTJDO0lBQ2xGLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFvQyxhQUFhLENBQUMsQ0FBQztJQUNwRixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEUsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSwrQ0FBK0M7SUFDL0MsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVtb3RlQXVkaXRFdmVudCB9IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXVkaXQtc3Bvb2wnKTtcblxuLyoqIEEgYnVmZmVyZWQgZW1pc3Npb246IHRoZSBldmVudCBwbHVzIHdoaWNoIHNlcnZpY2UgbXVzdCByZS1kZWxpdmVyIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdWRpdFNwb29sRW50cnkge1xuICBldmVudDogUmVtb3RlQXVkaXRFdmVudDtcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEdXJhYmxlIGJ1ZmZlciBmb3IgYXVkaXQgZXZlbnRzIHRoYXQgZmFpbGVkIExJVkUgZGVsaXZlcnkgdG8gdGhlIHBsYXRmb3JtXG4gKiAocmV0cmllcyBleGhhdXN0ZWQgZHVyaW5nIGEgc3VzdGFpbmVkIG91dGFnZSkuIFdpdGhvdXQgdGhpcywgdGhlIGF1ZGl0IHRyYWlsIOKAlFxuICogYSBzZWN1cml0eSBsb2cg4oCUIGlzIHNpbGVudGx5IGxvc3QgdGhlIG1vbWVudCB0aGUgcGxhdGZvcm0gaXMgZG93biBmb3IgbG9uZ2VyXG4gKiB0aGFuIHRoZSBjbGllbnQncyBzbWFsbCByZXRyeSBidWRnZXQuXG4gKlxuICogQ29udHJhY3Q6XG4gKiAtIEJPVU5ERUQuIEEgc2VjdXJpdHkgbG9nIG11c3QgZGVncmFkZSB0byBcImRyb3BwZWQgdGhlIG9sZGVzdCwgbG91ZGx5XCIgKGFcbiAqICAgbWV0cmljKSByYXRoZXIgdGhhbiBncm93IHdpdGhvdXQgbGltaXQgYW5kIE9PTSB0aGUgZW1pdHRlci5cbiAqIC0gRkFJTC1TQUZFLiBFdmVyeSBtZXRob2Qgc3dhbGxvd3MgaXRzIG93biBlcnJvcnMg4oCUIGEgYnJva2VuL3VucmVhY2hhYmxlIHNwb29sXG4gKiAgIG11c3QgbmV2ZXIgYnJlYWsgb3IgYmxvY2sgdGhlIGF1ZGl0IGVtaXNzaW9uIHBhdGggKHdoaWNoIGlzIGl0c2VsZlxuICogICBmaXJlLWFuZC1mb3JnZXQpLiBBIHNwb29sIHByb2JsZW0gZGVncmFkZXMgdG8gdGhlIHByZS1zcG9vbCBiZWhhdmlvci5cbiAqIC0gT3JkZXJpbmcgaXMgYmVzdC1lZmZvcnQuIFJlLWRlbGl2ZXJlZCBldmVudHMgY2hhaW4gYXQgcmUtZGVsaXZlcnkgdGltZVxuICogICAodGhhdCdzIHdoZW4gdGhlIHBsYXRmb3JtIGluc2VydHMgdGhlbSksIHNvIGVhY2ggZXZlbnQgYWxzbyBjYXJyaWVzIGFuXG4gKiAgIGBvY2N1cnJlZEF0YCBzdGFtcGVkIGF0IGVtaXNzaW9uIGZvciByZXZpZXdlcnMg4oCUIHNlZSBSZW1vdGVBdWRpdEV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0U3Bvb2wge1xuICAvKiogQnVmZmVyIGFuIGV2ZW50IHRoYXQgZmFpbGVkIGxpdmUgZGVsaXZlcnkuICovXG4gIGVucXVldWUoZW50cnk6IEF1ZGl0U3Bvb2xFbnRyeSk6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IE1PVkUgdXAgdG8gYG1heGAgYnVmZmVyZWQgZW50cmllcyBvbnRvIGFuIGluLXByb2dyZXNzIGxpc3QgYW5kXG4gICAqIHJldHVybiB0aGVtLiBCZWNhdXNlIHRoZSBlbnRyaWVzIGFyZSBtb3ZlZCAobm90IHBvcHBlZC1hbmQtZHJvcHBlZCksIGEgY3Jhc2hcbiAgICogbWlkLWRyYWluIGxlYXZlcyB0aGVtIHJlY292ZXJhYmxlIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IOKAlCBzZWUgYHJlY292ZXJgLlxuICAgKiBFYWNoIHRha2VuIGVudHJ5IE1VU1QgYmUgcmVzb2x2ZWQgd2l0aCBleGFjdGx5IG9uZSBvZiBgYWNrYCAoZGVsaXZlcmVkKSBvclxuICAgKiBgcmVxdWV1ZWAgKHN0aWxsIGZhaWxpbmcpLCBvciBpdCBsaW5nZXJzIG9uIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHVudGlsIHRoZVxuICAgKiBuZXh0IGByZWNvdmVyYC5cbiAgICovXG4gIHRha2UobWF4OiBudW1iZXIpOiBQcm9taXNlPEF1ZGl0U3Bvb2xFbnRyeVtdPjtcbiAgLyoqIEFja25vd2xlZGdlIHN1Y2Nlc3NmdWxseSByZS1kZWxpdmVyZWQgZW50cmllcyDigJQgcmVtb3ZlcyB0aGVtIGZyb20gdGhlXG4gICAqICBpbi1wcm9ncmVzcyBsaXN0IHNvIHRoZXkgYXJlIG5vdCByZWNvdmVyZWQgYWdhaW4uICovXG4gIGFjayhlbnRyaWVzOiBBdWRpdFNwb29sRW50cnlbXSk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBSZXR1cm4gZW50cmllcyB3aG9zZSByZS1kZWxpdmVyeSBmYWlsZWQgdG8gdGhlIEhFQUQgb2YgdGhlIGJ1ZmZlciAocmV0cmllZFxuICAgKiAgZmlyc3QpIGFuZCBjbGVhciB0aGVtIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3QuIEJlc3QtZWZmb3J0LiAqL1xuICByZXF1ZXVlKGVudHJpZXM6IEF1ZGl0U3Bvb2xFbnRyeVtdKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIFJlY2xhaW0gZW50cmllcyBzdHJhbmRlZCBvbiBBQkFORE9ORUQgaW4tcHJvZ3Jlc3MgbGlzdHMg4oCUIHRob3NlIG9mIG93bmVyc1xuICAgKiAoc3Bvb2wgaW5zdGFuY2VzLCBpLmUuIHBvZHMpIHdob3NlIGhlYXJ0YmVhdCBpcyBvbGRlciB0aGFuIHRoZSBzdGFsZVxuICAgKiB0aHJlc2hvbGQg4oCUIG1vdmluZyB0aGVtIGJhY2sgdG8gdGhlIGhlYWQgb2YgdGhlIG1haW4gYnVmZmVyLiBBIExJVkUgb3duZXInc1xuICAgKiBpbi1mbGlnaHQgYmF0Y2ggaXMgbmV2ZXIgdG91Y2hlZCwgc28gYSBwZWVyJ3MgcmVjb3ZlciBjYW4ndCBkdXBsaWNhdGUgd29ya1xuICAgKiB0aGF0IG93bmVyIGlzIHN0aWxsIGRlbGl2ZXJpbmcuIFNhZmUgdG8gY2FsbCBwZXJpb2RpY2FsbHk7IHJldHVybnMgdGhlXG4gICAqIG51bWJlciByZWNsYWltZWQuXG4gICAqL1xuICByZWNvdmVyKCk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIE1hcmsgdGhpcyBvd25lciBhbGl2ZSAoc28gbm8gcGVlciByZWNsYWltcyBpdHMgaW4tZmxpZ2h0IGJhdGNoKS4gKi9cbiAgaGVhcnRiZWF0KCk6IFByb21pc2U8dm9pZD47XG4gIC8qKiBBcHByb3hpbWF0ZSBjdXJyZW50IGRlcHRoIChmb3IgbWV0cmljcyAvIGRyYWluIGRlY2lzaW9ucykuICovXG4gIGRlcHRoKCk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLyoqIE1pbmltYWwgUmVkaXMgTElTVCBzdXJmYWNlIHRoZSBzcG9vbCBuZWVkcyAoYSBzdWJzZXQgb2YgaW9yZWRpcykuICovXG5pbnRlcmZhY2UgUmVkaXNMaXN0Q2xpZW50IHtcbiAgcnB1c2goa2V5OiBzdHJpbmcsIC4uLnZhbHVlczogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGxwdXNoKGtleTogc3RyaW5nLCAuLi52YWx1ZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xuICBscG9wKGtleTogc3RyaW5nLCBjb3VudDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXSB8IG51bGw+O1xuICBsdHJpbShrZXk6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogUHJvbWlzZTx1bmtub3duPjtcbiAgbGxlbihrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIEF0b21pY2FsbHkgcG9wIGZyb20gb25lIGxpc3QgZW5kIGFuZCBwdXNoIHRvIGFub3RoZXIgKFJlZGlzIOKJpSA2LjIpLiAqL1xuICBsbW92ZShzb3VyY2U6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZywgZnJvbTogJ0xFRlQnIHwgJ1JJR0hUJywgdG86ICdMRUZUJyB8ICdSSUdIVCcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAvKiogUmVtb3ZlIGBjb3VudGAgb2NjdXJyZW5jZXMgb2YgYHZhbHVlYCBmcm9tIGEgbGlzdC4gKi9cbiAgbHJlbShrZXk6IHN0cmluZywgY291bnQ6IG51bWJlciwgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqIE93bmVyIGhlYXJ0YmVhdHM6IGEgc29ydGVkIHNldCBvZiBvd25lciBpZCDihpIgbGFzdC1zZWVuIGVwb2NoIG1zLiAqL1xuICB6YWRkKGtleTogc3RyaW5nLCBzY29yZTogbnVtYmVyLCBtZW1iZXI6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG4gIHpyYW5nZWJ5c2NvcmUoa2V5OiBzdHJpbmcsIG1pbjogbnVtYmVyIHwgc3RyaW5nLCBtYXg6IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+O1xuICB6cmVtKGtleTogc3RyaW5nLCBtZW1iZXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuLyoqXG4gKiBUaGUgc3Bvb2wga2V5IGZvciBvbmUgc2VydmljZSdzIGJ1ZmZlcmVkIGF1ZGl0IGV2ZW50cy4gUGVyIFNFUlZJQ0Ugb25cbiAqIHB1cnBvc2U6IHJlLWRlbGl2ZXJ5IG1pbnRzIGEgc2VydmljZSB0b2tlbiBhcyBgZW50cnkuc2VydmljZU5hbWVgLCB3aGljaCBvbmx5XG4gKiB0aGF0IHNlcnZpY2UncyBwb2RzIGNhbiBzaWduIChwZXItc2VydmljZSBrZXlzKS4gQSBzaGFyZWQga2V5IGxldCBhIHBvZCBvZlxuICogb25lIHNlcnZpY2UgdGFrZSBhbm90aGVyJ3MgZW50cmllcywgZmFpbCB0byBzaWduIGZvciB0aGVtLCBhbmQgcmVxdWV1ZSB0aGVtXG4gKiBmb3JldmVyIOKAlCB3aGlsZSB0aGF0IHNlcnZpY2UncyBvd24gcG9kcyBuZXZlciBzYXcgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1ZGl0U3Bvb2xLZXkoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgYXVkaXQ6c3Bvb2w6JHtzZXJ2aWNlTmFtZX1gO1xufVxuXG5jb25zdCBERUZBVUxUX01BWF9ERVBUSCA9IDEwXzAwMDtcbi8qKiBBbiBvd25lciB3aG9zZSBoZWFydGJlYXQgaXMgb2xkZXIgdGhhbiB0aGlzIGlzIHByZXN1bWVkIGRlYWQgKGl0cyBwb2QgY3Jhc2hlZCkuICovXG5jb25zdCBERUZBVUxUX1NUQUxFX09XTkVSX01TID0gMTAgKiA2MF8wMDA7XG4vKiogR3VhcmQgc28gYSBwYXRob2xvZ2ljYWwgaW4tcHJvZ3Jlc3MgbGlzdCBjYW4ndCBzcGluIGByZWNvdmVyYC9gdGFrZWAgZm9yZXZlci4gKi9cbmNvbnN0IE1BWF9NT1ZFX0lURVJBVElPTlMgPSAxMDBfMDAwO1xuXG5mdW5jdGlvbiBzYWZlUGFyc2UocmF3OiBzdHJpbmcpOiBBdWRpdFNwb29sRW50cnkgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdykgYXMgQXVkaXRTcG9vbEVudHJ5O1xuICAgIHJldHVybiBwYXJzZWQgJiYgcGFyc2VkLmV2ZW50ICYmIHBhcnNlZC5zZXJ2aWNlTmFtZSA/IHBhcnNlZCA6IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUmVkaXMtTElTVC1iYWNrZWQgc3Bvb2wuIER1cmFibGUgYWNyb3NzIHByb2Nlc3MgcmVzdGFydHMgKHVubGlrZSBhbiBpbi1tZW1vcnlcbiAqIG9yIHBlci1wb2QtZGlzayBidWZmZXIpLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzIG9mIGEgc2VydmljZSwgYW5kIGJvdW5kZWQgdmlhXG4gKiBhIHRyaW0tdG8tdGFpbCBvbiBvdmVyZmxvdyAoZHJvcHMgdGhlIE9MREVTVCwgZW1pdHRpbmcgYGF1ZGl0X3Nwb29sX2Ryb3BwZWRfdG90YWxgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0F1ZGl0U3Bvb2xPcHRpb25zIHtcbiAgLyoqIFRoZSBidWZmZXIncyBSZWRpcyBrZXkg4oCUIG9uZSBwZXIgc2VydmljZSAoe0BsaW5rIGF1ZGl0U3Bvb2xLZXl9KS4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKiogVGhpcyBpbnN0YW5jZSdzIG93bmVyIGlkIChkZWZhdWx0OiByYW5kb20gcGVyIGluc3RhbmNlKS4gKi9cbiAgb3duZXJJZD86IHN0cmluZztcbiAgLyoqIEhlYXJ0YmVhdCBhZ2UgYWZ0ZXIgd2hpY2ggYW4gb3duZXIncyBpbi1mbGlnaHQgYmF0Y2ggaXMgcmVjbGFpbWFibGUuICovXG4gIHN0YWxlT3duZXJNcz86IG51bWJlcjtcbiAgLyoqIEF3YWl0ZWQgYmVmb3JlIGVhY2ggY29tbWFuZCDigJQgZS5nLiBhIHJlYWRpbmVzcyBnYXRlIGZvciBhIGxhemlseSBjb25uZWN0aW5nIGNsaWVudC4gKi9cbiAgcmVhZHk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNBdWRpdFNwb29sKHJlZGlzOiBSZWRpc0xpc3RDbGllbnQsIG9wdHM6IFJlZGlzQXVkaXRTcG9vbE9wdGlvbnMpOiBBdWRpdFNwb29sIHtcbiAgY29uc3Qga2V5ID0gb3B0cy5rZXk7XG4gIGNvbnN0IG93bmVySWQgPSBvcHRzLm93bmVySWQgPz8gcmFuZG9tVVVJRCgpO1xuICBjb25zdCBzdGFsZU93bmVyTXMgPSBNYXRoLm1heCgxLCBvcHRzLnN0YWxlT3duZXJNcyA/PyBERUZBVUxUX1NUQUxFX09XTkVSX01TKTtcbiAgY29uc3QgcmVhZHkgPSBvcHRzLnJlYWR5ID8/ICgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG4gIC8vIFBFUi1PV05FUiBpbi1wcm9ncmVzcyBsaXN0IOKAlCBhIHRha2VuIGJhdGNoIGxpdmVzIGhlcmUgdW50aWwgaXQgaXMgYWNrZWRcbiAgLy8gKGRlbGl2ZXJlZCkgb3IgcmVxdWV1ZWQgKHN0aWxsIGZhaWxpbmcpLiBJdCBpcyBhIHNlY3VyaXR5IGxvZydzIGR1cmFiaWxpdHlcbiAgLy8gbmV0OiBhIGNyYXNoIGJldHdlZW4gdGFrZSBhbmQgYWNrL3JlcXVldWUgbGVhdmVzIHRoZSBiYXRjaCBoZXJlLCBhbmQgYSBwZWVyJ3NcbiAgLy8gKG9yIHRoaXMgcG9kJ3Mgc3VjY2Vzc29yJ3MpIGByZWNvdmVyYCByZWNsYWltcyBpdCBvbmNlIHRoZSBvd25lcidzIGhlYXJ0YmVhdFxuICAvLyBnb2VzIHN0YWxlLiBPbmUgc2hhcmVkIGluLWZsaWdodCBsaXN0IGxldCBhbnkgcmVwbGljYSdzIHN0YXJ0dXAgcmVjb3ZlclxuICAvLyBzdGVhbCBiYXRjaGVzIGl0cyBsaXZlIHNpYmxpbmdzIHdlcmUgbWlkLXdheSB0aHJvdWdoIGRlbGl2ZXJpbmcuXG4gIGNvbnN0IGluZmxpZ2h0S2V5T2YgPSAob3duZXI6IHN0cmluZykgPT4gYCR7a2V5fTppbmZsaWdodDoke293bmVyfWA7XG4gIGNvbnN0IGluUHJvZ3Jlc3NLZXkgPSBpbmZsaWdodEtleU9mKG93bmVySWQpO1xuICBjb25zdCBvd25lcnNLZXkgPSBgJHtrZXl9Om93bmVyc2A7XG4gIGNvbnN0IG1heERlcHRoID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhEZXB0aCA/PyBERUZBVUxUX01BWF9ERVBUSCk7XG5cbiAgY29uc3QgYmVhdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCByZWRpcy56YWRkKG93bmVyc0tleSwgRGF0ZS5ub3coKSwgb3duZXJJZCk7XG4gIH07XG5cbiAgLy8gVGhlIEVYQUNUIHNlcmlhbGl6ZWQgc3RyaW5nIGVhY2ggcmV0dXJuZWQgZW50cnkgd2FzIHBhcnNlZCBmcm9tLCBzbyBgYWNrYCAvXG4gIC8vIGByZXF1ZXVlYCBjYW4gTFJFTSB0aGUgcHJlY2lzZSB2YWx1ZSBvZmYgdGhlIGluLXByb2dyZXNzIGxpc3QuIEtleWVkIGJ5IHRoZVxuICAvLyByZXR1cm5lZCBvYmplY3QgaWRlbnRpdHkgKHRoZSBkcmFpbiBjb25zdW1lciBwYXNzZXMgdGhlIFNBTUUgb2JqZWN0cyBiYWNrKSxcbiAgLy8gc28gaXQgbmVlZHMgbm8gc3RhYmxlIHJlLXNlcmlhbGl6YXRpb24uIFdlYWtNYXAg4oaSIGVudHJpZXMgR0MgbmF0dXJhbGx5LlxuICBjb25zdCByYXdCeUVudHJ5ID0gbmV3IFdlYWtNYXA8QXVkaXRTcG9vbEVudHJ5LCBzdHJpbmc+KCk7XG4gIGNvbnN0IHJhd09mID0gKGVudHJ5OiBBdWRpdFNwb29sRW50cnkpOiBzdHJpbmcgPT4gcmF3QnlFbnRyeS5nZXQoZW50cnkpID8/IEpTT04uc3RyaW5naWZ5KGVudHJ5KTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGVucXVldWUoZW50cnkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGNvbnN0IGxlbiA9IGF3YWl0IHJlZGlzLnJwdXNoKGtleSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX2VucXVldWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9KTtcbiAgICAgICAgaWYgKGxlbiA+IG1heERlcHRoKSB7XG4gICAgICAgICAgLy8gS2VlcCBvbmx5IHRoZSBuZXdlc3QgYG1heERlcHRoYDsgZHJvcCB0aGUgb3ZlcmZsb3cgYXQgdGhlIGhlYWQuXG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IGxlbiAtIG1heERlcHRoO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmx0cmltKGtleSwgZHJvcHBlZCwgLTEpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBlbnRyeS5zZXJ2aWNlTmFtZSB9LCBkcm9wcGVkKTtcbiAgICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgb3ZlcmZsb3cg4oCUIGRyb3BwZWQgb2xkZXN0IGJ1ZmZlcmVkIGV2ZW50cycsIHsgZHJvcHBlZCwgbWF4RGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybignQXVkaXQgc3Bvb2wgZW5xdWV1ZSBmYWlsZWQgKGV2ZW50IGxvc3QpJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHRha2UobWF4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBhd2FpdCBiZWF0KCk7XG4gICAgICAgIGNvbnN0IG91dDogQXVkaXRTcG9vbEVudHJ5W10gPSBbXTtcbiAgICAgICAgY29uc3QgbGltaXQgPSBNYXRoLm1heCgxLCBtYXgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbWl0OyBpKyspIHtcbiAgICAgICAgICAvLyBBdG9taWNhbGx5IE1PVkUgaGVhZOKGkmluLXByb2dyZXNzLXRhaWwgc28gdGhlIGVudHJ5IGlzIG5ldmVyIGluIGxpbWJvOlxuICAgICAgICAgIC8vIGl0IGlzIG9uIGV4YWN0bHkgb25lIGxpc3QgYXQgYWxsIHRpbWVzLCByZWNvdmVyYWJsZSBhZnRlciBhIGNyYXNoLlxuICAgICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmxtb3ZlKGtleSwgaW5Qcm9ncmVzc0tleSwgJ0xFRlQnLCAnUklHSFQnKTtcbiAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBzYWZlUGFyc2UocmF3KTtcbiAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICByYXdCeUVudHJ5LnNldChwYXJzZWQsIHJhdyk7XG4gICAgICAgICAgICBvdXQucHVzaChwYXJzZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDb3JydXB0IHBheWxvYWQg4oCUIGRyb3AgaXQgb2ZmIHRoZSBpbi1wcm9ncmVzcyBsaXN0IHNvIGl0IGNhbid0IHdlZGdlXG4gICAgICAgICAgICAvLyB0aGUgZHJhaW4sIGFuZCBhY2NvdW50IGZvciBpdC5cbiAgICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdhdWRpdF9zcG9vbF9kcm9wcGVkX3RvdGFsJywgeyBzZXJ2aWNlOiAndW5rbm93bicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHRha2UgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgYWNrKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcmVhZHkoKTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHJlbShpblByb2dyZXNzS2V5LCAxLCByYXdPZihlbnRyeSkpO1xuICAgICAgICAgIHJhd0J5RW50cnkuZGVsZXRlKGVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCBhY2sgZmFpbGVkIChtYXkgcmUtZGVsaXZlciBvbiByZWNvdmVyKScsIHsgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyByZXF1ZXVlKGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUHV0IGZhaWxlZCByZS1kZWxpdmVyaWVzIGJhY2sgYXQgdGhlIEhFQUQgc28gdGhleSdyZSByZXRyaWVkIGZpcnN0IGFuZFxuICAgICAgICAvLyByb3VnaCBlbWlzc2lvbiBvcmRlciBpcyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBvdXRhZ2Ug4oCUIGFuZCBjbGVhciB0aGVtXG4gICAgICAgIC8vIGZyb20gdGhlIGluLXByb2dyZXNzIGxpc3Qgc28gYHJlY292ZXJgIGRvZXNuJ3QgZG91YmxlIHRoZW0uIEl0ZXJhdGUgaW5cbiAgICAgICAgLy8gcmV2ZXJzZSBzbyBscHVzaCByZXN0b3JlcyB0aGUgYmF0Y2gncyBvcmlnaW5hbCBvcmRlciBhdCB0aGUgaGVhZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gT1JERVJJTkcgSU5WQVJJQU5UIChhdC1sZWFzdC1vbmNlKTogbHB1c2ggdG8gdGhlIG1haW4gbGlzdCBGSVJTVCwgVEhFTlxuICAgICAgICAvLyBscmVtIGZyb20gaW4tcHJvZ3Jlc3MuIEEgY3Jhc2ggYmV0d2VlbiB0aGUgdHdvIGxlYXZlcyB0aGUgZW50cnkgb24gQk9USFxuICAgICAgICAvLyBsaXN0cyDihpIgaGFybWxlc3MgZG91YmxlLWRlbGl2ZXJ5IChkZWR1cGVkIGRvd25zdHJlYW0gYnkgaWRlbXBvdGVuY3lcbiAgICAgICAgLy8gcmV1c2UpLCBuZXZlciBhIExPU1MuIFRoZSByZXZlcnNlIG9yZGVyIChscmVtIHRoZW4gbHB1c2gpIHdvdWxkIGRyb3AgdGhlXG4gICAgICAgIC8vIGV2ZW50IG91dHJpZ2h0IG9uIGEgY3Jhc2ggaW4gdGhlIGdhcCwgd2hpY2ggYSBzZWN1cml0eSBsb2cgbXVzdCBub3QgZG8uXG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgcmF3ID0gcmF3T2YoZW50cmllc1tpXSk7XG4gICAgICAgICAgYXdhaXQgcmVkaXMubHB1c2goa2V5LCByYXcpO1xuICAgICAgICAgIGF3YWl0IHJlZGlzLmxyZW0oaW5Qcm9ncmVzc0tleSwgMSwgcmF3KTtcbiAgICAgICAgICByYXdCeUVudHJ5LmRlbGV0ZShlbnRyaWVzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZXF1ZXVlIGZhaWxlZCAoZXZlbnRzIGxvc3QpJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHJlY292ZXIoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBhd2FpdCBiZWF0KCk7XG4gICAgICAgIGxldCByZWNsYWltZWQgPSAwO1xuICAgICAgICBjb25zdCBzdGFsZSA9IGF3YWl0IHJlZGlzLnpyYW5nZWJ5c2NvcmUob3duZXJzS2V5LCAnLWluZicsIERhdGUubm93KCkgLSBzdGFsZU93bmVyTXMpO1xuICAgICAgICBmb3IgKGNvbnN0IG93bmVyIG9mIHN0YWxlKSB7XG4gICAgICAgICAgaWYgKG93bmVyID09PSBvd25lcklkKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBpbmZsaWdodEtleU9mKG93bmVyKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1BWF9NT1ZFX0lURVJBVElPTlM7IGkrKykge1xuICAgICAgICAgICAgLy8gTW92ZSBpbi1wcm9ncmVzcy10YWlsIOKGkiBtYWluLWhlYWQ6IGFuIG9sZGVyIHN0cmFuZGVkIGVudHJ5IChuZWFyZXJcbiAgICAgICAgICAgIC8vIHRoZSBpbi1wcm9ncmVzcyBoZWFkKSBlbmRzIHVwIGFoZWFkIG9mIGEgbmV3ZXIgb25lLCBwcmVzZXJ2aW5nIG9yZGVyLlxuICAgICAgICAgICAgY29uc3QgcmF3ID0gYXdhaXQgcmVkaXMubG1vdmUoc291cmNlLCBrZXksICdSSUdIVCcsICdMRUZUJyk7XG4gICAgICAgICAgICBpZiAocmF3ID09PSBudWxsIHx8IHJhdyA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgICAgICAgIHJlY2xhaW1lZCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBPbmx5IGZvcmdldCB0aGUgb3duZXIgb25jZSBpdHMgbGlzdCBpcyBlbXB0eS5cbiAgICAgICAgICBhd2FpdCByZWRpcy56cmVtKG93bmVyc0tleSwgb3duZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWNsYWltZWQgPiAwKSB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2F1ZGl0X3Nwb29sX3JlY292ZXJlZF90b3RhbCcsIHt9LCByZWNsYWltZWQpO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdBdWRpdCBzcG9vbCByZWNvdmVyZWQgZXZlbnRzIHN0cmFuZGVkIGJ5IGEgZGVhZCBvd25lcicsIHsgcmVjbGFpbWVkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWNsYWltZWQ7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0F1ZGl0IHNwb29sIHJlY292ZXIgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBoZWFydGJlYXQoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCByZWFkeSgpO1xuICAgICAgICBhd2FpdCBiZWF0KCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdBdWRpdCBzcG9vbCBoZWFydGJlYXQgZmFpbGVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGRlcHRoKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlZGlzLmxsZW4oa2V5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUmVkaXMtYmFja2VkIGF1ZGl0IHNwb29sIGZyb20gdGhlIGFtYmllbnQgYFJFRElTX1VSTGAgLyBgUkVESVNfU0VOVElORUxTYFxuICogZW52IHZpYSB0aGUgc2hhcmVkIGBjcmVhdGVFbnZSZWRpc0NsaWVudGAuIFJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXMgbm90XG4gKiBjb25maWd1cmVkIOKAlCB0aGUgY2FsbGVyIHRoZW4gcnVucyB3aXRob3V0IGEgc3Bvb2wgKGJlc3QtZWZmb3J0IGJlaGF2aW9yKS4gVGhlIHNoYXJlZCBoZWxwZXIgbG9hZHNcbiAqIGlvcmVkaXMgdmlhIGBjcmVhdGVSZXF1aXJlYCwgc28gdGhpcyBzdGF5cyBpbXBvcnRhYmxlIHdoZXJlIFJlZGlzIGlzbid0IHByZXNlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wob3B0czogT21pdDxSZWRpc0F1ZGl0U3Bvb2xPcHRpb25zLCAncmVhZHknPik6IEF1ZGl0U3Bvb2wgfCBudWxsIHtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzTGlzdENsaWVudCAmIFJlYWR5QXdhcmVSZWRpcz4oJ2F1ZGl0LXNwb29sJyk7XG4gIGlmICghaW5zdCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBhdWRpdCBzcG9vbCBpbml0aWFsaXplZCcsIHsga2V5OiBvcHRzLmtleSB9KTtcbiAgLy8gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWU6IGEgYm9vdC10aW1lIHJlY292ZXIoKSBydW4gYmVmb3JlIHRoZVxuICAvLyBjb25uZWN0aW9uIGlzIHVwIHdvdWxkIGZhaWwgYW5kIHN0cmFuZCBiYXRjaGVzIHVudGlsIHRoZSBuZXh0IHJlc3RhcnQsIHNvXG4gIC8vIGV2ZXJ5IGNvbW1hbmQgd2FpdHMgKGJvdW5kZWQpIGZvciByZWFkaW5lc3MuXG4gIHJldHVybiBjcmVhdGVSZWRpc0F1ZGl0U3Bvb2woaW5zdCwgeyAuLi5vcHRzLCByZWFkeTogY3JlYXRlUmVkaXNSZWFkeUdhdGUoaW5zdCwgMTBfMDAwKSB9KTtcbn1cbiJdfQ==
@@ -6,6 +6,13 @@ export interface RedisCacheClient {
6
6
  get(key: string): Promise<string | null>;
7
7
  set(key: string, value: string, ...args: unknown[]): Promise<unknown>;
8
8
  del(...keys: string[]): Promise<number>;
9
+ /**
10
+ * Server-side Lua (ioredis `eval(script, numKeys, ...keysAndArgs)`). Optional
11
+ * so a plain key/value fake still satisfies the interface; the writers that
12
+ * need atomic compare-and-set (e.g. `publishTokenRevocation`) refuse a client
13
+ * without it rather than fall back to a racy read-modify-write.
14
+ */
15
+ eval?(script: string, numKeys: number, ...args: Array<string | number>): Promise<unknown>;
9
16
  }
10
17
  export interface CacheConfig {
11
18
  /** Key prefix for namespace isolation (e.g., 'plugin:', 'compliance:') */
@@ -369,4 +369,4 @@ export class CacheService {
369
369
  export function createCacheService(prefix, defaultTtlSeconds = 300) {
370
370
  return new CacheService({ prefix, defaultTtlSeconds });
371
371
  }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUFVN0M7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQTJERCxNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxTQUFrQztJQUNoRixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQW1ELEVBQUUsQ0FBQztJQUMzRSxNQUFN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Q0FBQztRQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUM7WUFDSCxPQUFPLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsaUJBQWlCLEdBQUcsR0FBRztJQUN4RSxPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgY2FjaGluZyBzZXJ2aWNlIHdpdGggVFRMIHN1cHBvcnQuXG4gKlxuICogU3RvcmFnZSBpcyBhIHBlci1wcm9jZXNzIHRydWUtTFJVIE1hcCAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzKS5cbiAqXG4gKiBDcm9zcy1yZXBsaWNhIGludmFsaWRhdGlvbjogZXZlcnkgc2VydmljZSBydW5zIHNldmVyYWxcbiAqIHJlcGxpY2FzIChIUEEpLCBlYWNoIHdpdGggaXRzIE9XTiBpbi1tZW1vcnkgY2FjaGUuIEFuIGludmFsaWRhdGlvbiBwZXJmb3JtZWQgb25cbiAqIG9uZSBwb2QgKGBkZWxgIC8gYGludmFsaWRhdGVQYXR0ZXJuYCAvIGBjbGVhcmApIGlzIGJyb2FkY2FzdCBvdmVyIFJlZGlzIHB1Yi9zdWJcbiAqICh7QGxpbmsgQ2FjaGVJbnZhbGlkYXRpb25CdXN9LCB3aXJlZCBmcm9tIHRoZSBhbWJpZW50IFJlZGlzIGVudiBieSBkZWZhdWx0KSBhbmRcbiAqIGFwcGxpZWQgYnkgZXZlcnkgb3RoZXIgcG9kLCBzbyBhIHdyaXRlIG9uIHBvZCBBIGNhbid0IGxlYXZlIHBvZCBCIHNlcnZpbmcgdGhlXG4gKiBzdGFsZSBlbnRyeSB1bnRpbCBpdHMgVFRMIGxhcHNlcy4gQSBwb2Qgd2hvc2Ugc3Vic2NyaWJlciAocmUpY29ubmVjdHMgZmx1c2hlc1xuICogaXRzIGxvY2FsIGNhY2hlIOKAlCBpdCBtYXkgaGF2ZSBtaXNzZWQgaW52YWxpZGF0aW9ucyB3aGlsZSBkaXNjb25uZWN0ZWQg4oCUIGFuZCBhXG4gKiBgZ2V0T3JTZXRgIHdob3NlIGZhY3RvcnkgcmFjZWQgYW4gaW52YWxpZGF0aW9uIGRvZXMgbm90IGNhY2hlIGl0cyByZXN1bHQuXG4gKlxuICogRGVzaWduOlxuICogLSBBbGwgb3BlcmF0aW9ucyBhcmUgZmFpbC1zYWZlOiBjYWNoZSBtaXNzZXMvZXJyb3JzIHJldHVybiBudWxsLCBuZXZlciB0aHJvd1xuICogLSBSZWFkcyBkZWVwLWNsb25lLCBzbyBldmVyeSBjYWxsZXIgZ2V0cyBhbiBpbmRlcGVuZGVudCBjb3B5IChtdXRhdGluZyBhXG4gKiAgIHJlc3VsdCBpcyBhbHdheXMgc2FmZSlcbiAqIC0gYGdldE9yU2V0YCBpcyBzaW5nbGUtZmxpZ2h0OiBjb25jdXJyZW50IG1pc3NlcyBzaGFyZSBvbmUgZmFjdG9yeSgpIGNhbGxcbiAqIC0gS2V5IG5hbWVzcGFjZSBwcmVmaXhpbmcgdG8gYXZvaWQgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NhY2hlLXNlcnZpY2UnKTtcblxuLyoqXG4gKiBDYWNoZSBlbnRyeSB3aXRoIHZhbHVlIGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gKi9cbmludGVyZmFjZSBDYWNoZUVudHJ5PFQ+IHtcbiAgdmFsdWU6IFQ7XG4gIGV4cGlyZXNBdDogbnVtYmVyOyAvLyBVbml4IHRpbWVzdGFtcCBpbiBtc1xufVxuXG4vKipcbiAqIERlZXAtY2xvbmUgYSB2YWx1ZSBzbyB0aGUgY2FjaGUgaGFuZHMgYmFjayBhbiBJTkRFUEVOREVOVCBjb3B5IG9uIGV2ZXJ5IHJlYWQuXG4gKiBXaXRob3V0IHRoaXMgaXQgcmV0dXJucyB0aGUgc2FtZSBzdG9yZWQgb2JqZWN0IHJlZmVyZW5jZSwgc28gYSBjb25zdW1lclxuICogbXV0YXRpbmcgYSBcImNhY2hlZFwiIG9iamVjdCBzaWxlbnRseSBjb3JydXB0cyB0aGUgc2hhcmVkIGNhY2hlLlxuICpcbiAqIFByaW1pdGl2ZXMgYXJlIHJldHVybmVkIGFzLWlzLiBQcmVmZXJzIHRoZSBzdHJ1Y3R1cmVkLWNsb25lIGFsZ29yaXRobTsgZmFsbHNcbiAqIGJhY2sgdG8gYSBKU09OIHJvdW5kLXRyaXAgb24gb2xkZXIgcnVudGltZXMgb3IgZXhvdGljIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVWYWx1ZTxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIGtleS92YWx1ZSBjbGllbnQgc3VyZmFjZSAoc3Vic2V0IG9mIGlvcmVkaXMpIHNoYXJlZCBieSB0aGVcbiAqIHRva2VuLXJldm9jYXRpb24gcHVibGlzaGVyL3JlYWRlciBhbmQgcGxhdGZvcm0ncyBSZWRpcyBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzQ2FjaGVDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIC8qKiBLZXkgcHJlZml4IGZvciBuYW1lc3BhY2UgaXNvbGF0aW9uIChlLmcuLCAncGx1Z2luOicsICdjb21wbGlhbmNlOicpICovXG4gIHByZWZpeDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAqL1xuICBkZWZhdWx0VHRsU2Vjb25kczogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZm9yIHRoZSBjYWNoZSAoZGVmYXVsdCAxMDAwKSAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ3Jvc3MtcmVwbGljYSBpbnZhbGlkYXRpb24gYnVzLiBPbWl0IHRvIHVzZSB0aGUgc2hhcmVkIGVudi1SZWRpcyBidXMgKG51bGxcbiAgICogd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkIOKGkiBzaW5nbGUtcHJvY2VzcyBzZW1hbnRpY3MpOyBwYXNzIGBudWxsYCB0b1xuICAgKiBkaXNhYmxlIGV4cGxpY2l0bHkuXG4gICAqL1xuICBpbnZhbGlkYXRpb25CdXM/OiBDYWNoZUludmFsaWRhdGlvbkJ1cyB8IG51bGw7XG59XG5cbi8qKiBPbmUgaW52YWxpZGF0aW9uIGJyb2FkY2FzdCB0byBldmVyeSByZXBsaWNhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2Uge1xuICAvKiogSWQgb2YgdGhlIENhY2hlU2VydmljZSBpbnN0YW5jZSB0aGF0IGludmFsaWRhdGVkIChpdCBpZ25vcmVzIGl0cyBvd24gZWNobykuICovXG4gIG9yaWdpbjogc3RyaW5nO1xuICAvKiogVGhlIGNhY2hlIG5hbWVzcGFjZSAoYENhY2hlQ29uZmlnLnByZWZpeGApIHRoZSBpbnZhbGlkYXRpb24gYXBwbGllcyB0by4gKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIG9wOiAnZGVsJyB8ICdwYXR0ZXJuJyB8ICdjbGVhcic7XG4gIC8qKiBVbi1wcmVmaXhlZCBrZXkgKGBkZWxgKSBvciBnbG9iIHBhdHRlcm4gKGBwYXR0ZXJuYCkuICovXG4gIGtleT86IHN0cmluZztcbn1cblxuLyoqIFRyYW5zcG9ydCB0aGF0IGZhbnMgY2FjaGUgaW52YWxpZGF0aW9ucyBvdXQgdG8gZXZlcnkgcmVwbGljYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVJbnZhbGlkYXRpb25CdXMge1xuICAvKiogRmlyZS1hbmQtZm9yZ2V0IGJyb2FkY2FzdC4gTmV2ZXIgdGhyb3dzLiAqL1xuICBwdWJsaXNoKG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKTogdm9pZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGhhbmRsZXJzLiBgb25NZXNzYWdlYCByZWNlaXZlcyBldmVyeSBicm9hZGNhc3QgKGluY2x1ZGluZyB0aGlzXG4gICAqIHByb2Nlc3MncyBvd24pOyBgb25SZXN5bmNgIGZpcmVzIHdoZW5ldmVyIHRoZSBzdWJzY3JpcHRpb24gaXMgKHJlKWVzdGFibGlzaGVkLFxuICAgKiBpLmUuIHdoZW5ldmVyIGludmFsaWRhdGlvbnMgbWF5IGhhdmUgYmVlbiBtaXNzZWQuXG4gICAqL1xuICBzdWJzY3JpYmUob25NZXNzYWdlOiAobXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UpID0+IHZvaWQsIG9uUmVzeW5jOiAoKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuLyoqIE1pbmltYWwgaW9yZWRpcyBwdWIvc3ViIHN1cmZhY2UgdGhlIGVudiBidXMgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50IHtcbiAgcHVibGlzaChjaGFubmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc3Vic2NyaWJlKC4uLmNoYW5uZWxzOiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIG9uKGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB1bmtub3duO1xuICBkdXBsaWNhdGUoKTogUmVkaXNJbnZhbGlkYXRpb25DbGllbnQ7XG4gIHN0YXR1cz86IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwgPSAnY2FjaGU6aW52YWxpZGF0ZSc7XG5cbi8qKlxuICogUmVkaXMgcHViL3N1YiBpbnZhbGlkYXRpb24gYnVzLiBQVUJMSVNIIG9uIHRoZSBnaXZlbiBjbGllbnQ7IFNVQlNDUklCRSBvbiBhXG4gKiBgZHVwbGljYXRlKClgIChhIHN1YnNjcmliZWQgaW9yZWRpcyBjb25uZWN0aW9uIGNhbid0IHJ1biBvdGhlciBjb21tYW5kcykuXG4gKlxuICogVGhlIFNVQlNDUklCRSBpcyBpc3N1ZWQgb24gZXZlcnkgYHJlYWR5YCAoaW5pdGlhbCBjb25uZWN0IEFORCBlYWNoIHJlY29ubmVjdClcbiAqIHJhdGhlciB0aGFuIG9uY2UgYXQgY29uc3RydWN0aW9uOiB0aGUgZW52IGNsaWVudCBydW5zIHdpdGhvdXQgYW4gb2ZmbGluZVxuICogcXVldWUsIHNvIGEgc3Vic2NyaWJlIGlzc3VlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgdXAgaXMgcmVqZWN0ZWQgYW5kIHdvdWxkXG4gKiBuZXZlciBiZSByZXRyaWVkLiBFYWNoIGByZWFkeWAgYWxzbyB0cmlnZ2VycyBgb25SZXN5bmNgIHNvIGV2ZXJ5IGNhY2hlIGZsdXNoZXNcbiAqIHdoYXRldmVyIGl0IG1heSBoYXZlIG1pc3NlZCB3aGlsZSBkaXNjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKHB1Ymxpc2hlcjogUmVkaXNJbnZhbGlkYXRpb25DbGllbnQpOiBDYWNoZUludmFsaWRhdGlvbkJ1cyB7XG4gIGNvbnN0IHN1YnNjcmliZXIgPSBwdWJsaXNoZXIuZHVwbGljYXRlKCk7XG4gIGNvbnN0IG1lc3NhZ2VIYW5kbGVyczogQXJyYXk8KG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKSA9PiB2b2lkPiA9IFtdO1xuICBjb25zdCByZXN5bmNIYW5kbGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdCByZXN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBoIG9mIHJlc3luY0hhbmRsZXJzKSB7XG4gICAgICB0cnkgeyBoKCk7IH0gY2F0Y2ggeyAvKiBpc29sYXRlZCAqLyB9XG4gICAgfVxuICB9O1xuICBjb25zdCBkb1N1YnNjcmliZSA9ICgpOiB2b2lkID0+IHtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZShzdWJzY3JpYmVyLnN1YnNjcmliZShDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCkpXG4gICAgICAudGhlbigoKSA9PiByZXN5bmMoKSlcbiAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdjYWNoZV9pbnZhbGlkYXRpb25fc3Vic2NyaWJlX2ZhaWxlZF90b3RhbCcsIHt9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0NhY2hlIGludmFsaWRhdGlvbiBzdWJzY3JpYmUgZmFpbGVkOyB3aWxsIHJldHJ5IG9uIG5leHQgcmVjb25uZWN0Jywge1xuICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBzdWJzY3JpYmVyLm9uKCdtZXNzYWdlJywgKGNoYW5uZWw6IHN0cmluZywgcmF3OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY2hhbm5lbCAhPT0gQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwpIHJldHVybjtcbiAgICBsZXQgbXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIG1zZyA9IEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaCBvZiBtZXNzYWdlSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7IGgobXNnKTsgfSBjYXRjaCB7IC8qIG9uZSBjYWNoZSBjYW4ndCBicmVhayB0aGUgb3RoZXJzICovIH1cbiAgICB9XG4gIH0pO1xuICBzdWJzY3JpYmVyLm9uKCdyZWFkeScsIGRvU3Vic2NyaWJlKTtcbiAgc3Vic2NyaWJlci5vbignZXJyb3InLCAoZTogdW5rbm93bikgPT5cbiAgICBsb2dnZXIud2FybignQ2FjaGUgaW52YWxpZGF0aW9uIHN1YnNjcmliZXIgZXJyb3InLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZSkgfSkpO1xuICBpZiAoc3Vic2NyaWJlci5zdGF0dXMgPT09ICdyZWFkeScpIGRvU3Vic2NyaWJlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoKG1zZykge1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbigoKSA9PiBwdWJsaXNoZXIucHVibGlzaChDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCwgSlNPTi5zdHJpbmdpZnkobXNnKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2NhY2hlX2ludmFsaWRhdGlvbl9wdWJsaXNoX2ZhaWxlZF90b3RhbCcsIHsgcHJlZml4OiBtc2cucHJlZml4IH0pO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gcHVibGlzaCBmYWlsZWQgKG90aGVyIHJlcGxpY2FzIGtlZXAgdGhlIGVudHJ5IHVudGlsIFRUTCknLCB7XG4gICAgICAgICAgICBwcmVmaXg6IG1zZy5wcmVmaXgsIG9wOiBtc2cub3AsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUob25NZXNzYWdlLCBvblJlc3luYykge1xuICAgICAgbWVzc2FnZUhhbmRsZXJzLnB1c2gob25NZXNzYWdlKTtcbiAgICAgIHJlc3luY0hhbmRsZXJzLnB1c2gob25SZXN5bmMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkLCBSZWRpcyBub3QgY29uZmlndXJlZC5cbmxldCBlbnZJbnZhbGlkYXRpb25CdXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqIFByb2Nlc3Mtd2lkZSBpbnZhbGlkYXRpb24gYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IChudWxsIHdpdGhvdXQgUmVkaXMpLiAqL1xuZnVuY3Rpb24gZ2V0RW52Q2FjaGVJbnZhbGlkYXRpb25CdXMoKTogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsIHtcbiAgaWYgKGVudkludmFsaWRhdGlvbkJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJbnZhbGlkYXRpb25DbGllbnQ+KCdjYWNoZS1pbnZhbGlkYXRpb24nKTtcbiAgICBlbnZJbnZhbGlkYXRpb25CdXMgPSBjbGllbnQgPyBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKGNsaWVudCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBlbnZJbnZhbGlkYXRpb25CdXM7XG59XG5cbi8qKlxuICogQ2FjaGUgc2VydmljZSB3aXRoIGdldC9zZXQvZGVsIG9wZXJhdGlvbnMgYW5kIGF1dG9tYXRpYyBUVEwgZXhwaXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXg6ICdwbHVnaW46JywgZGVmYXVsdFR0bFNlY29uZHM6IDMwMCB9KTtcbiAqXG4gKiAvLyBTZXQgd2l0aCBkZWZhdWx0IFRUTFxuICogYXdhaXQgY2FjaGUuc2V0KCdvcmcxMjM6bGlzdCcsIHBsdWdpbnMpO1xuICpcbiAqIC8vIEdldCAocmV0dXJucyBudWxsIG9uIG1pc3MpXG4gKiBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8UGx1Z2luW10+KCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGVcbiAqIGF3YWl0IGNhY2hlLmRlbCgnb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlIGJ5IHBhdHRlcm5cbiAqIGF3YWl0IGNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKCdvcmcxMjM6KicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZVNlcnZpY2Uge1xuICBwcml2YXRlIG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PHVua25vd24+PigpO1xuICAvKipcbiAgICogSW4tZmxpZ2h0IGBnZXRPclNldGAgZmFjdG9yeSBwcm9taXNlcywga2V5ZWQgYnkgZnVsbCBjYWNoZSBrZXkuIENvYWxlc2Nlc1xuICAgKiBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGBmYWN0b3J5KClgIGludm9jYXRpb24gKHNpbmdsZS1mbGlnaHRcbiAgICogLyBzdGFtcGVkZSBwcm90ZWN0aW9uKTsgZW50cmllcyBhcmUgY2xlYXJlZCBvbmNlIHRoZSBwcm9taXNlIHNldHRsZXMuXG4gICAqL1xuICBwcml2YXRlIGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RW50cmllczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1czogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSByYW5kb21VVUlEKCk7XG4gIC8qKlxuICAgKiBCdW1wZWQgb24gRVZFUlkgaW52YWxpZGF0aW9uIChsb2NhbCBvciByZW1vdGUpLiBgZ2V0T3JTZXRgIG9ubHkgY2FjaGVzIGFcbiAgICogZmFjdG9yeSByZXN1bHQgaWYgbm8gaW52YWxpZGF0aW9uIGhhcHBlbmVkIHdoaWxlIHRoZSBmYWN0b3J5IHJhbiDigJQgb3RoZXJ3aXNlXG4gICAqIGl0IGNvdWxkIHJlLWNhY2hlIGEgdmFsdWUgcmVhZCBiZWZvcmUgdGhlIHdyaXRlIHRoYXQgaW52YWxpZGF0ZWQgaXQuXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRpb24gPSAwO1xuXG4gIC8qKiBDYWNoZSBtZXRyaWNzIOKAlCB0cmFja3MgaGl0cywgbWlzc2VzLCBhbmQgaW52YWxpZGF0aW9ucy4gKi9cbiAgcmVhZG9ubHkgbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBzZXRzOiAwLCBpbnZhbGlkYXRpb25zOiAwIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDYWNoZUNvbmZpZykge1xuICAgIHRoaXMucHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICB0aGlzLmRlZmF1bHRUdGxNcyA9IGNvbmZpZy5kZWZhdWx0VHRsU2Vjb25kcyAqIDEwMDA7XG4gICAgdGhpcy5tYXhFbnRyaWVzID0gY29uZmlnLm1heEVudHJpZXMgPz8gMTAwMDtcbiAgICB0aGlzLmJ1cyA9IGNvbmZpZy5pbnZhbGlkYXRpb25CdXMgPT09IHVuZGVmaW5lZCA/IGdldEVudkNhY2hlSW52YWxpZGF0aW9uQnVzKCkgOiBjb25maWcuaW52YWxpZGF0aW9uQnVzO1xuICAgIHRoaXMuYnVzPy5zdWJzY3JpYmUoXG4gICAgICAobXNnKSA9PiB7XG4gICAgICAgIGlmIChtc2cub3JpZ2luID09PSB0aGlzLmluc3RhbmNlSWQgfHwgbXNnLnByZWZpeCAhPT0gdGhpcy5wcmVmaXgpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKG1zZy5vcCwgbXNnLmtleSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdjbGVhcicpLFxuICAgICk7XG4gIH1cblxuICAvKiogQnJvYWRjYXN0IGFuIGludmFsaWRhdGlvbiB0byB0aGUgb3RoZXIgcmVwbGljYXMuICovXG4gIHByaXZhdGUgYnJvYWRjYXN0KG9wOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2VbJ29wJ10sIGtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYnVzPy5wdWJsaXNoKHsgb3JpZ2luOiB0aGlzLmluc3RhbmNlSWQsIHByZWZpeDogdGhpcy5wcmVmaXgsIG9wLCAuLi4oa2V5ICE9PSB1bmRlZmluZWQgJiYgeyBrZXkgfSkgfSk7XG4gIH1cblxuICAvKiogQXBwbHkgYW4gaW52YWxpZGF0aW9uIHRvIFRISVMgcHJvY2VzcydzIGluLW1lbW9yeSBlbnRyaWVzLiBSZXR1cm5zIHRoZSBjb3VudCByZW1vdmVkLiAqL1xuICBwcml2YXRlIGFwcGx5TG9jYWxJbnZhbGlkYXRpb24ob3A6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZVsnb3AnXSwga2V5Pzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcbiAgICBpZiAob3AgPT09ICdjbGVhcicpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm1lbW9yeS5zaXplO1xuICAgICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAob3AgPT09ICdkZWwnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vcnkuZGVsZXRlKHRoaXMuZnVsbEtleShrZXkgPz8gJycpKSA/IDEgOiAwO1xuICAgIH1cbiAgICAvLyBHbG9iIHBhdHRlcm4uIEVzY2FwZSByZWdleCBtZXRhY2hhcmFjdGVycyBmaXJzdCBzbyBhIGxpdGVyYWwgYC5gL2AoYC9gW2BcbiAgICAvLyBpbiBhIGtleSBwcmVmaXggKGUuZy4gYG9yZzp2MS4yOipgKSBjYW4ndCBvdmVyLW1hdGNoIG9yIHRocm93IChhIHRocm93XG4gICAgLy8gaGVyZSB3b3VsZCBsZWF2ZSBlbnRyaWVzIHN0YWxlKTsgb25seSBgKmAgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkLlxuICAgIGNvbnN0IGZwID0gdGhpcy5mdWxsS2V5KGtleSA/PyAnJyk7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGZwLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvXFxcXFxcKi9nLCAnLionKSArICckJyk7XG4gICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgIGZvciAoY29uc3QgayBvZiB0aGlzLm1lbW9yeS5rZXlzKCkpIHtcbiAgICAgIGlmIChyZWdleC50ZXN0KGspKSB7XG4gICAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShrKTtcbiAgICAgICAgZGVsZXRlZCsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHByaXZhdGUgZnVsbEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fSR7a2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY2FjaGVkIHZhbHVlLiBSZXR1cm5zIG51bGwgb24gbWlzcyBvciBlcnJvci5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIElOREVQRU5ERU5UIGRlZXAgY29weSDigJQgbXV0YXRpbmcgaXQgbmV2ZXIgYWZmZWN0c1xuICAgKiB0aGUgY2FjaGVkIGVudHJ5LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQ+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLm1lbW9yeS5nZXQoZmspO1xuICAgICAgaWYgKCFlbnRyeSkgeyB0aGlzLm1ldHJpY3MubWlzc2VzKys7IHJldHVybiBudWxsOyB9XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGVudHJ5LmV4cGlyZXNBdCkge1xuICAgICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgICB0aGlzLm1ldHJpY3MubWlzc2VzKys7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLy8gTFJVIHRvdWNoOiBkZWxldGUgKyByZS1pbnNlcnQgbW92ZXMgdGhpcyBrZXkgdG8gdGhlIG5ld2VzdCBwb3NpdGlvblxuICAgICAgLy8gKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKSwgc28gYHNldGAncyBvbGRlc3QtZmlyc3QgZXZpY3Rpb24gaXMgYVxuICAgICAgLy8gdHJ1ZSBsZWFzdC1yZWNlbnRseS1VU0VEIGV2aWN0aW9uIHJhdGhlciB0aGFuIGZpcnN0LWluc2VydGVkIChGSUZPKS5cbiAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIGVudHJ5KTtcbiAgICAgIHRoaXMubWV0cmljcy5oaXRzKys7XG4gICAgICAvLyBDbG9uZSBzbyBhIGNhbGxlciBtdXRhdGluZyB0aGUgcmVzdWx0IGNhbid0IGNvcnJ1cHQgdGhlIHNoYXJlZCBlbnRyeS5cbiAgICAgIHJldHVybiBjbG9uZVZhbHVlKGVudHJ5LnZhbHVlKSBhcyBUO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNhY2hlZCB2YWx1ZSB3aXRoIG9wdGlvbmFsIFRUTCBvdmVycmlkZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleSAocHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNhY2hlXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIC8vIEEgd3JpdGUgY291bnRzIGFzIGEgdXNlLCBzbyBkcm9wIGFueSBleGlzdGluZyBlbnRyeSBmaXJzdFxuICAgICAgLy8gYW5kIHJlLWluc2VydCBiZWxvdyBhcyB0aGUgbmV3ZXN0IChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlcikuIFRoaXNcbiAgICAgIC8vIGtlZXBzIHRoZSBNYXAgb3JkZXJlZCBvbGRlc3QtVVNFRCDihpIgbmV3ZXN0LVVTRUQgc28gdGhlIGV2aWN0aW9uIGJlbG93IGlzXG4gICAgICAvLyB0cnVlIExSVSwgYW5kIGF2b2lkcyBldmljdGluZyBhIHZpY3RpbSB3aGVuIG1lcmVseSB1cGRhdGluZyBhIGtleS5cbiAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgICBpZiAodGhpcy5tZW1vcnkuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLm1lbW9yeS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAoZmlyc3RLZXkpIHRoaXMubWVtb3J5LmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWVtb3J5LnNldChmaywge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsICogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ2FjaGUgc2V0IGZhaWx1cmUgaXMgbm9uLWZhdGFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGNhY2hlZCB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmFwcGx5TG9jYWxJbnZhbGlkYXRpb24oJ2RlbCcsIGtleSk7XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnZGVsJywga2V5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIGRlbGV0ZSBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGFsbCBrZXlzIG1hdGNoaW5nIGEgcGF0dGVybiAoZS5nLiwgJ29yZzEyMzoqJykuXG4gICAqIE9ubHkgYCpgIGlzIGEgd2lsZGNhcmQuXG4gICAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBBcHBseSBsb2NhbGx5LCB0aGVuIGZhbiBvdXQgdG8gdGhlIG90aGVyIHJlcGxpY2FzLlxuICAgICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbigncGF0dGVybicsIHBhdHRlcm4pO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ3BhdHRlcm4nLCBwYXR0ZXJuKTtcbiAgICAgIHRoaXMubWV0cmljcy5pbnZhbGlkYXRpb25zICs9IGRlbGV0ZWQ7XG4gICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmluZmxpZ2h0LmdldChmaykgYXMgUHJvbWlzZTxUPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBjbG9uZVZhbHVlKGF3YWl0IGV4aXN0aW5nKTtcblxuICAgIGNvbnN0IGdlbmVyYXRpb25BdFN0YXJ0ID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgIGNvbnN0IGZsaWdodCA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGZhY3RvcnkoKTtcbiAgICAgIC8vIEFuIGludmFsaWRhdGlvbiAoaGVyZSBvciBvbiBhbm90aGVyIHJlcGxpY2EpIGxhbmRlZCB3aGlsZSB0aGUgZmFjdG9yeVxuICAgICAgLy8gcmFuOiBpdHMgcmVhZCBtYXkgcHJlZGF0ZSB0aGF0IHdyaXRlLCBzbyBkb24ndCBjYWNoZSBpdC5cbiAgICAgIGlmICh0aGlzLmdlbmVyYXRpb24gPT09IGdlbmVyYXRpb25BdFN0YXJ0KSBhd2FpdCB0aGlzLnNldChrZXksIHZhbHVlLCB0dGxTZWNvbmRzKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KSgpO1xuICAgIHRoaXMuaW5mbGlnaHQuc2V0KGZrLCBmbGlnaHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBmbGlnaHQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluZmxpZ2h0LmRlbGV0ZShmayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlbnRyaWVzICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdjbGVhcicpO1xuICAgIHRoaXMuYnJvYWRjYXN0KCdjbGVhcicpO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaW4tbWVtb3J5IGNhY2hlIHNpemUgKGZvciBkaWFnbm9zdGljcykuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5LnNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjYWNoZSBzZXJ2aWNlIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBOYW1lc3BhY2UgcHJlZml4IChlLmcuLCAnY29tcGxpYW5jZTonLCAncGx1Z2luOicpXG4gKiBAcGFyYW0gZGVmYXVsdFR0bFNlY29uZHMgLSBEZWZhdWx0IFRUTCBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCA9IDUgbWluKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVTZXJ2aWNlKHByZWZpeDogc3RyaW5nLCBkZWZhdWx0VHRsU2Vjb25kcyA9IDMwMCk6IENhY2hlU2VydmljZSB7XG4gIHJldHVybiBuZXcgQ2FjaGVTZXJ2aWNlKHsgcHJlZml4LCBkZWZhdWx0VHRsU2Vjb25kcyB9KTtcbn1cbiJdfQ==
372
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7QUFVN0M7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQWtFRCxNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxTQUFrQztJQUNoRixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQW1ELEVBQUUsQ0FBQztJQUMzRSxNQUFN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Q0FBQztRQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUM7WUFDSCxPQUFPLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsS0FBSztRQUNULElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxzREFBc0Q7SUFDdEQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjLEVBQUUsaUJBQWlCLEdBQUcsR0FBRztJQUN4RSxPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogTGlnaHR3ZWlnaHQgY2FjaGluZyBzZXJ2aWNlIHdpdGggVFRMIHN1cHBvcnQuXG4gKlxuICogU3RvcmFnZSBpcyBhIHBlci1wcm9jZXNzIHRydWUtTFJVIE1hcCAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzKS5cbiAqXG4gKiBDcm9zcy1yZXBsaWNhIGludmFsaWRhdGlvbjogZXZlcnkgc2VydmljZSBydW5zIHNldmVyYWxcbiAqIHJlcGxpY2FzIChIUEEpLCBlYWNoIHdpdGggaXRzIE9XTiBpbi1tZW1vcnkgY2FjaGUuIEFuIGludmFsaWRhdGlvbiBwZXJmb3JtZWQgb25cbiAqIG9uZSBwb2QgKGBkZWxgIC8gYGludmFsaWRhdGVQYXR0ZXJuYCAvIGBjbGVhcmApIGlzIGJyb2FkY2FzdCBvdmVyIFJlZGlzIHB1Yi9zdWJcbiAqICh7QGxpbmsgQ2FjaGVJbnZhbGlkYXRpb25CdXN9LCB3aXJlZCBmcm9tIHRoZSBhbWJpZW50IFJlZGlzIGVudiBieSBkZWZhdWx0KSBhbmRcbiAqIGFwcGxpZWQgYnkgZXZlcnkgb3RoZXIgcG9kLCBzbyBhIHdyaXRlIG9uIHBvZCBBIGNhbid0IGxlYXZlIHBvZCBCIHNlcnZpbmcgdGhlXG4gKiBzdGFsZSBlbnRyeSB1bnRpbCBpdHMgVFRMIGxhcHNlcy4gQSBwb2Qgd2hvc2Ugc3Vic2NyaWJlciAocmUpY29ubmVjdHMgZmx1c2hlc1xuICogaXRzIGxvY2FsIGNhY2hlIOKAlCBpdCBtYXkgaGF2ZSBtaXNzZWQgaW52YWxpZGF0aW9ucyB3aGlsZSBkaXNjb25uZWN0ZWQg4oCUIGFuZCBhXG4gKiBgZ2V0T3JTZXRgIHdob3NlIGZhY3RvcnkgcmFjZWQgYW4gaW52YWxpZGF0aW9uIGRvZXMgbm90IGNhY2hlIGl0cyByZXN1bHQuXG4gKlxuICogRGVzaWduOlxuICogLSBBbGwgb3BlcmF0aW9ucyBhcmUgZmFpbC1zYWZlOiBjYWNoZSBtaXNzZXMvZXJyb3JzIHJldHVybiBudWxsLCBuZXZlciB0aHJvd1xuICogLSBSZWFkcyBkZWVwLWNsb25lLCBzbyBldmVyeSBjYWxsZXIgZ2V0cyBhbiBpbmRlcGVuZGVudCBjb3B5IChtdXRhdGluZyBhXG4gKiAgIHJlc3VsdCBpcyBhbHdheXMgc2FmZSlcbiAqIC0gYGdldE9yU2V0YCBpcyBzaW5nbGUtZmxpZ2h0OiBjb25jdXJyZW50IG1pc3NlcyBzaGFyZSBvbmUgZmFjdG9yeSgpIGNhbGxcbiAqIC0gS2V5IG5hbWVzcGFjZSBwcmVmaXhpbmcgdG8gYXZvaWQgY29sbGlzaW9ucyBiZXR3ZWVuIHNlcnZpY2VzXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NhY2hlLXNlcnZpY2UnKTtcblxuLyoqXG4gKiBDYWNoZSBlbnRyeSB3aXRoIHZhbHVlIGFuZCBleHBpcmF0aW9uIHRpbWUuXG4gKi9cbmludGVyZmFjZSBDYWNoZUVudHJ5PFQ+IHtcbiAgdmFsdWU6IFQ7XG4gIGV4cGlyZXNBdDogbnVtYmVyOyAvLyBVbml4IHRpbWVzdGFtcCBpbiBtc1xufVxuXG4vKipcbiAqIERlZXAtY2xvbmUgYSB2YWx1ZSBzbyB0aGUgY2FjaGUgaGFuZHMgYmFjayBhbiBJTkRFUEVOREVOVCBjb3B5IG9uIGV2ZXJ5IHJlYWQuXG4gKiBXaXRob3V0IHRoaXMgaXQgcmV0dXJucyB0aGUgc2FtZSBzdG9yZWQgb2JqZWN0IHJlZmVyZW5jZSwgc28gYSBjb25zdW1lclxuICogbXV0YXRpbmcgYSBcImNhY2hlZFwiIG9iamVjdCBzaWxlbnRseSBjb3JydXB0cyB0aGUgc2hhcmVkIGNhY2hlLlxuICpcbiAqIFByaW1pdGl2ZXMgYXJlIHJldHVybmVkIGFzLWlzLiBQcmVmZXJzIHRoZSBzdHJ1Y3R1cmVkLWNsb25lIGFsZ29yaXRobTsgZmFsbHNcbiAqIGJhY2sgdG8gYSBKU09OIHJvdW5kLXRyaXAgb24gb2xkZXIgcnVudGltZXMgb3IgZXhvdGljIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gY2xvbmVWYWx1ZTxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICB0cnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIGtleS92YWx1ZSBjbGllbnQgc3VyZmFjZSAoc3Vic2V0IG9mIGlvcmVkaXMpIHNoYXJlZCBieSB0aGVcbiAqIHRva2VuLXJldm9jYXRpb24gcHVibGlzaGVyL3JlYWRlciBhbmQgcGxhdGZvcm0ncyBSZWRpcyBoZWxwZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzQ2FjaGVDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IFByb21pc2U8dW5rbm93bj47XG4gIGRlbCguLi5rZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIEx1YSAoaW9yZWRpcyBgZXZhbChzY3JpcHQsIG51bUtleXMsIC4uLmtleXNBbmRBcmdzKWApLiBPcHRpb25hbFxuICAgKiBzbyBhIHBsYWluIGtleS92YWx1ZSBmYWtlIHN0aWxsIHNhdGlzZmllcyB0aGUgaW50ZXJmYWNlOyB0aGUgd3JpdGVycyB0aGF0XG4gICAqIG5lZWQgYXRvbWljIGNvbXBhcmUtYW5kLXNldCAoZS5nLiBgcHVibGlzaFRva2VuUmV2b2NhdGlvbmApIHJlZnVzZSBhIGNsaWVudFxuICAgKiB3aXRob3V0IGl0IHJhdGhlciB0aGFuIGZhbGwgYmFjayB0byBhIHJhY3kgcmVhZC1tb2RpZnktd3JpdGUuXG4gICAqL1xuICBldmFsPyhzY3JpcHQ6IHN0cmluZywgbnVtS2V5czogbnVtYmVyLCAuLi5hcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIC8qKiBLZXkgcHJlZml4IGZvciBuYW1lc3BhY2UgaXNvbGF0aW9uIChlLmcuLCAncGx1Z2luOicsICdjb21wbGlhbmNlOicpICovXG4gIHByZWZpeDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAqL1xuICBkZWZhdWx0VHRsU2Vjb25kczogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZm9yIHRoZSBjYWNoZSAoZGVmYXVsdCAxMDAwKSAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ3Jvc3MtcmVwbGljYSBpbnZhbGlkYXRpb24gYnVzLiBPbWl0IHRvIHVzZSB0aGUgc2hhcmVkIGVudi1SZWRpcyBidXMgKG51bGxcbiAgICogd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkIOKGkiBzaW5nbGUtcHJvY2VzcyBzZW1hbnRpY3MpOyBwYXNzIGBudWxsYCB0b1xuICAgKiBkaXNhYmxlIGV4cGxpY2l0bHkuXG4gICAqL1xuICBpbnZhbGlkYXRpb25CdXM/OiBDYWNoZUludmFsaWRhdGlvbkJ1cyB8IG51bGw7XG59XG5cbi8qKiBPbmUgaW52YWxpZGF0aW9uIGJyb2FkY2FzdCB0byBldmVyeSByZXBsaWNhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2Uge1xuICAvKiogSWQgb2YgdGhlIENhY2hlU2VydmljZSBpbnN0YW5jZSB0aGF0IGludmFsaWRhdGVkIChpdCBpZ25vcmVzIGl0cyBvd24gZWNobykuICovXG4gIG9yaWdpbjogc3RyaW5nO1xuICAvKiogVGhlIGNhY2hlIG5hbWVzcGFjZSAoYENhY2hlQ29uZmlnLnByZWZpeGApIHRoZSBpbnZhbGlkYXRpb24gYXBwbGllcyB0by4gKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIG9wOiAnZGVsJyB8ICdwYXR0ZXJuJyB8ICdjbGVhcic7XG4gIC8qKiBVbi1wcmVmaXhlZCBrZXkgKGBkZWxgKSBvciBnbG9iIHBhdHRlcm4gKGBwYXR0ZXJuYCkuICovXG4gIGtleT86IHN0cmluZztcbn1cblxuLyoqIFRyYW5zcG9ydCB0aGF0IGZhbnMgY2FjaGUgaW52YWxpZGF0aW9ucyBvdXQgdG8gZXZlcnkgcmVwbGljYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVJbnZhbGlkYXRpb25CdXMge1xuICAvKiogRmlyZS1hbmQtZm9yZ2V0IGJyb2FkY2FzdC4gTmV2ZXIgdGhyb3dzLiAqL1xuICBwdWJsaXNoKG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKTogdm9pZDtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGhhbmRsZXJzLiBgb25NZXNzYWdlYCByZWNlaXZlcyBldmVyeSBicm9hZGNhc3QgKGluY2x1ZGluZyB0aGlzXG4gICAqIHByb2Nlc3MncyBvd24pOyBgb25SZXN5bmNgIGZpcmVzIHdoZW5ldmVyIHRoZSBzdWJzY3JpcHRpb24gaXMgKHJlKWVzdGFibGlzaGVkLFxuICAgKiBpLmUuIHdoZW5ldmVyIGludmFsaWRhdGlvbnMgbWF5IGhhdmUgYmVlbiBtaXNzZWQuXG4gICAqL1xuICBzdWJzY3JpYmUob25NZXNzYWdlOiAobXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UpID0+IHZvaWQsIG9uUmVzeW5jOiAoKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuLyoqIE1pbmltYWwgaW9yZWRpcyBwdWIvc3ViIHN1cmZhY2UgdGhlIGVudiBidXMgbmVlZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50IHtcbiAgcHVibGlzaChjaGFubmVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbiAgc3Vic2NyaWJlKC4uLmNoYW5uZWxzOiBzdHJpbmdbXSk6IFByb21pc2U8dW5rbm93bj47XG4gIG9uKGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB1bmtub3duO1xuICBkdXBsaWNhdGUoKTogUmVkaXNJbnZhbGlkYXRpb25DbGllbnQ7XG4gIHN0YXR1cz86IHN0cmluZztcbn1cblxuY29uc3QgQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwgPSAnY2FjaGU6aW52YWxpZGF0ZSc7XG5cbi8qKlxuICogUmVkaXMgcHViL3N1YiBpbnZhbGlkYXRpb24gYnVzLiBQVUJMSVNIIG9uIHRoZSBnaXZlbiBjbGllbnQ7IFNVQlNDUklCRSBvbiBhXG4gKiBgZHVwbGljYXRlKClgIChhIHN1YnNjcmliZWQgaW9yZWRpcyBjb25uZWN0aW9uIGNhbid0IHJ1biBvdGhlciBjb21tYW5kcykuXG4gKlxuICogVGhlIFNVQlNDUklCRSBpcyBpc3N1ZWQgb24gZXZlcnkgYHJlYWR5YCAoaW5pdGlhbCBjb25uZWN0IEFORCBlYWNoIHJlY29ubmVjdClcbiAqIHJhdGhlciB0aGFuIG9uY2UgYXQgY29uc3RydWN0aW9uOiB0aGUgZW52IGNsaWVudCBydW5zIHdpdGhvdXQgYW4gb2ZmbGluZVxuICogcXVldWUsIHNvIGEgc3Vic2NyaWJlIGlzc3VlZCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgdXAgaXMgcmVqZWN0ZWQgYW5kIHdvdWxkXG4gKiBuZXZlciBiZSByZXRyaWVkLiBFYWNoIGByZWFkeWAgYWxzbyB0cmlnZ2VycyBgb25SZXN5bmNgIHNvIGV2ZXJ5IGNhY2hlIGZsdXNoZXNcbiAqIHdoYXRldmVyIGl0IG1heSBoYXZlIG1pc3NlZCB3aGlsZSBkaXNjb25uZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKHB1Ymxpc2hlcjogUmVkaXNJbnZhbGlkYXRpb25DbGllbnQpOiBDYWNoZUludmFsaWRhdGlvbkJ1cyB7XG4gIGNvbnN0IHN1YnNjcmliZXIgPSBwdWJsaXNoZXIuZHVwbGljYXRlKCk7XG4gIGNvbnN0IG1lc3NhZ2VIYW5kbGVyczogQXJyYXk8KG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKSA9PiB2b2lkPiA9IFtdO1xuICBjb25zdCByZXN5bmNIYW5kbGVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdCByZXN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBoIG9mIHJlc3luY0hhbmRsZXJzKSB7XG4gICAgICB0cnkgeyBoKCk7IH0gY2F0Y2ggeyAvKiBpc29sYXRlZCAqLyB9XG4gICAgfVxuICB9O1xuICBjb25zdCBkb1N1YnNjcmliZSA9ICgpOiB2b2lkID0+IHtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZShzdWJzY3JpYmVyLnN1YnNjcmliZShDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCkpXG4gICAgICAudGhlbigoKSA9PiByZXN5bmMoKSlcbiAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdjYWNoZV9pbnZhbGlkYXRpb25fc3Vic2NyaWJlX2ZhaWxlZF90b3RhbCcsIHt9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0NhY2hlIGludmFsaWRhdGlvbiBzdWJzY3JpYmUgZmFpbGVkOyB3aWxsIHJldHJ5IG9uIG5leHQgcmVjb25uZWN0Jywge1xuICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBzdWJzY3JpYmVyLm9uKCdtZXNzYWdlJywgKGNoYW5uZWw6IHN0cmluZywgcmF3OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY2hhbm5lbCAhPT0gQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwpIHJldHVybjtcbiAgICBsZXQgbXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIG1zZyA9IEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaCBvZiBtZXNzYWdlSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7IGgobXNnKTsgfSBjYXRjaCB7IC8qIG9uZSBjYWNoZSBjYW4ndCBicmVhayB0aGUgb3RoZXJzICovIH1cbiAgICB9XG4gIH0pO1xuICBzdWJzY3JpYmVyLm9uKCdyZWFkeScsIGRvU3Vic2NyaWJlKTtcbiAgc3Vic2NyaWJlci5vbignZXJyb3InLCAoZTogdW5rbm93bikgPT5cbiAgICBsb2dnZXIud2FybignQ2FjaGUgaW52YWxpZGF0aW9uIHN1YnNjcmliZXIgZXJyb3InLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZSkgfSkpO1xuICBpZiAoc3Vic2NyaWJlci5zdGF0dXMgPT09ICdyZWFkeScpIGRvU3Vic2NyaWJlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoKG1zZykge1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbigoKSA9PiBwdWJsaXNoZXIucHVibGlzaChDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCwgSlNPTi5zdHJpbmdpZnkobXNnKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2NhY2hlX2ludmFsaWRhdGlvbl9wdWJsaXNoX2ZhaWxlZF90b3RhbCcsIHsgcHJlZml4OiBtc2cucHJlZml4IH0pO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gcHVibGlzaCBmYWlsZWQgKG90aGVyIHJlcGxpY2FzIGtlZXAgdGhlIGVudHJ5IHVudGlsIFRUTCknLCB7XG4gICAgICAgICAgICBwcmVmaXg6IG1zZy5wcmVmaXgsIG9wOiBtc2cub3AsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUob25NZXNzYWdlLCBvblJlc3luYykge1xuICAgICAgbWVzc2FnZUhhbmRsZXJzLnB1c2gob25NZXNzYWdlKTtcbiAgICAgIHJlc3luY0hhbmRsZXJzLnB1c2gob25SZXN5bmMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkLCBSZWRpcyBub3QgY29uZmlndXJlZC5cbmxldCBlbnZJbnZhbGlkYXRpb25CdXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqIFByb2Nlc3Mtd2lkZSBpbnZhbGlkYXRpb24gYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IChudWxsIHdpdGhvdXQgUmVkaXMpLiAqL1xuZnVuY3Rpb24gZ2V0RW52Q2FjaGVJbnZhbGlkYXRpb25CdXMoKTogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsIHtcbiAgaWYgKGVudkludmFsaWRhdGlvbkJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJbnZhbGlkYXRpb25DbGllbnQ+KCdjYWNoZS1pbnZhbGlkYXRpb24nKTtcbiAgICBlbnZJbnZhbGlkYXRpb25CdXMgPSBjbGllbnQgPyBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKGNsaWVudCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBlbnZJbnZhbGlkYXRpb25CdXM7XG59XG5cbi8qKlxuICogQ2FjaGUgc2VydmljZSB3aXRoIGdldC9zZXQvZGVsIG9wZXJhdGlvbnMgYW5kIGF1dG9tYXRpYyBUVEwgZXhwaXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXg6ICdwbHVnaW46JywgZGVmYXVsdFR0bFNlY29uZHM6IDMwMCB9KTtcbiAqXG4gKiAvLyBTZXQgd2l0aCBkZWZhdWx0IFRUTFxuICogYXdhaXQgY2FjaGUuc2V0KCdvcmcxMjM6bGlzdCcsIHBsdWdpbnMpO1xuICpcbiAqIC8vIEdldCAocmV0dXJucyBudWxsIG9uIG1pc3MpXG4gKiBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8UGx1Z2luW10+KCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGVcbiAqIGF3YWl0IGNhY2hlLmRlbCgnb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlIGJ5IHBhdHRlcm5cbiAqIGF3YWl0IGNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKCdvcmcxMjM6KicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZVNlcnZpY2Uge1xuICBwcml2YXRlIG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PHVua25vd24+PigpO1xuICAvKipcbiAgICogSW4tZmxpZ2h0IGBnZXRPclNldGAgZmFjdG9yeSBwcm9taXNlcywga2V5ZWQgYnkgZnVsbCBjYWNoZSBrZXkuIENvYWxlc2Nlc1xuICAgKiBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGBmYWN0b3J5KClgIGludm9jYXRpb24gKHNpbmdsZS1mbGlnaHRcbiAgICogLyBzdGFtcGVkZSBwcm90ZWN0aW9uKTsgZW50cmllcyBhcmUgY2xlYXJlZCBvbmNlIHRoZSBwcm9taXNlIHNldHRsZXMuXG4gICAqL1xuICBwcml2YXRlIGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RW50cmllczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1czogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQgPSByYW5kb21VVUlEKCk7XG4gIC8qKlxuICAgKiBCdW1wZWQgb24gRVZFUlkgaW52YWxpZGF0aW9uIChsb2NhbCBvciByZW1vdGUpLiBgZ2V0T3JTZXRgIG9ubHkgY2FjaGVzIGFcbiAgICogZmFjdG9yeSByZXN1bHQgaWYgbm8gaW52YWxpZGF0aW9uIGhhcHBlbmVkIHdoaWxlIHRoZSBmYWN0b3J5IHJhbiDigJQgb3RoZXJ3aXNlXG4gICAqIGl0IGNvdWxkIHJlLWNhY2hlIGEgdmFsdWUgcmVhZCBiZWZvcmUgdGhlIHdyaXRlIHRoYXQgaW52YWxpZGF0ZWQgaXQuXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRpb24gPSAwO1xuXG4gIC8qKiBDYWNoZSBtZXRyaWNzIOKAlCB0cmFja3MgaGl0cywgbWlzc2VzLCBhbmQgaW52YWxpZGF0aW9ucy4gKi9cbiAgcmVhZG9ubHkgbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBzZXRzOiAwLCBpbnZhbGlkYXRpb25zOiAwIH07XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBDYWNoZUNvbmZpZykge1xuICAgIHRoaXMucHJlZml4ID0gY29uZmlnLnByZWZpeDtcbiAgICB0aGlzLmRlZmF1bHRUdGxNcyA9IGNvbmZpZy5kZWZhdWx0VHRsU2Vjb25kcyAqIDEwMDA7XG4gICAgdGhpcy5tYXhFbnRyaWVzID0gY29uZmlnLm1heEVudHJpZXMgPz8gMTAwMDtcbiAgICB0aGlzLmJ1cyA9IGNvbmZpZy5pbnZhbGlkYXRpb25CdXMgPT09IHVuZGVmaW5lZCA/IGdldEVudkNhY2hlSW52YWxpZGF0aW9uQnVzKCkgOiBjb25maWcuaW52YWxpZGF0aW9uQnVzO1xuICAgIHRoaXMuYnVzPy5zdWJzY3JpYmUoXG4gICAgICAobXNnKSA9PiB7XG4gICAgICAgIGlmIChtc2cub3JpZ2luID09PSB0aGlzLmluc3RhbmNlSWQgfHwgbXNnLnByZWZpeCAhPT0gdGhpcy5wcmVmaXgpIHJldHVybjtcbiAgICAgICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKG1zZy5vcCwgbXNnLmtleSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdjbGVhcicpLFxuICAgICk7XG4gIH1cblxuICAvKiogQnJvYWRjYXN0IGFuIGludmFsaWRhdGlvbiB0byB0aGUgb3RoZXIgcmVwbGljYXMuICovXG4gIHByaXZhdGUgYnJvYWRjYXN0KG9wOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2VbJ29wJ10sIGtleT86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuYnVzPy5wdWJsaXNoKHsgb3JpZ2luOiB0aGlzLmluc3RhbmNlSWQsIHByZWZpeDogdGhpcy5wcmVmaXgsIG9wLCAuLi4oa2V5ICE9PSB1bmRlZmluZWQgJiYgeyBrZXkgfSkgfSk7XG4gIH1cblxuICAvKiogQXBwbHkgYW4gaW52YWxpZGF0aW9uIHRvIFRISVMgcHJvY2VzcydzIGluLW1lbW9yeSBlbnRyaWVzLiBSZXR1cm5zIHRoZSBjb3VudCByZW1vdmVkLiAqL1xuICBwcml2YXRlIGFwcGx5TG9jYWxJbnZhbGlkYXRpb24ob3A6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZVsnb3AnXSwga2V5Pzogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcbiAgICBpZiAob3AgPT09ICdjbGVhcicpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLm1lbW9yeS5zaXplO1xuICAgICAgdGhpcy5tZW1vcnkuY2xlYXIoKTtcbiAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAob3AgPT09ICdkZWwnKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vcnkuZGVsZXRlKHRoaXMuZnVsbEtleShrZXkgPz8gJycpKSA/IDEgOiAwO1xuICAgIH1cbiAgICAvLyBHbG9iIHBhdHRlcm4uIEVzY2FwZSByZWdleCBtZXRhY2hhcmFjdGVycyBmaXJzdCBzbyBhIGxpdGVyYWwgYC5gL2AoYC9gW2BcbiAgICAvLyBpbiBhIGtleSBwcmVmaXggKGUuZy4gYG9yZzp2MS4yOipgKSBjYW4ndCBvdmVyLW1hdGNoIG9yIHRocm93IChhIHRocm93XG4gICAgLy8gaGVyZSB3b3VsZCBsZWF2ZSBlbnRyaWVzIHN0YWxlKTsgb25seSBgKmAgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkLlxuICAgIGNvbnN0IGZwID0gdGhpcy5mdWxsS2V5KGtleSA/PyAnJyk7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGZwLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvXFxcXFxcKi9nLCAnLionKSArICckJyk7XG4gICAgbGV0IGRlbGV0ZWQgPSAwO1xuICAgIGZvciAoY29uc3QgayBvZiB0aGlzLm1lbW9yeS5rZXlzKCkpIHtcbiAgICAgIGlmIChyZWdleC50ZXN0KGspKSB7XG4gICAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShrKTtcbiAgICAgICAgZGVsZXRlZCsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIHByaXZhdGUgZnVsbEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fSR7a2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY2FjaGVkIHZhbHVlLiBSZXR1cm5zIG51bGwgb24gbWlzcyBvciBlcnJvci5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGFuIElOREVQRU5ERU5UIGRlZXAgY29weSDigJQgbXV0YXRpbmcgaXQgbmV2ZXIgYWZmZWN0c1xuICAgKiB0aGUgY2FjaGVkIGVudHJ5LlxuICAgKi9cbiAgYXN5bmMgZ2V0PFQ+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cnkgPSB0aGlzLm1lbW9yeS5nZXQoZmspO1xuICAgICAgaWYgKCFlbnRyeSkgeyB0aGlzLm1ldHJpY3MubWlzc2VzKys7IHJldHVybiBudWxsOyB9XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGVudHJ5LmV4cGlyZXNBdCkge1xuICAgICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgICB0aGlzLm1ldHJpY3MubWlzc2VzKys7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgLy8gTFJVIHRvdWNoOiBkZWxldGUgKyByZS1pbnNlcnQgbW92ZXMgdGhpcyBrZXkgdG8gdGhlIG5ld2VzdCBwb3NpdGlvblxuICAgICAgLy8gKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKSwgc28gYHNldGAncyBvbGRlc3QtZmlyc3QgZXZpY3Rpb24gaXMgYVxuICAgICAgLy8gdHJ1ZSBsZWFzdC1yZWNlbnRseS1VU0VEIGV2aWN0aW9uIHJhdGhlciB0aGFuIGZpcnN0LWluc2VydGVkIChGSUZPKS5cbiAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIGVudHJ5KTtcbiAgICAgIHRoaXMubWV0cmljcy5oaXRzKys7XG4gICAgICAvLyBDbG9uZSBzbyBhIGNhbGxlciBtdXRhdGluZyB0aGUgcmVzdWx0IGNhbid0IGNvcnJ1cHQgdGhlIHNoYXJlZCBlbnRyeS5cbiAgICAgIHJldHVybiBjbG9uZVZhbHVlKGVudHJ5LnZhbHVlKSBhcyBUO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGNhY2hlZCB2YWx1ZSB3aXRoIG9wdGlvbmFsIFRUTCBvdmVycmlkZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleSAocHJlZml4IGlzIGFkZGVkIGF1dG9tYXRpY2FsbHkpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNhY2hlXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIC8vIEEgd3JpdGUgY291bnRzIGFzIGEgdXNlLCBzbyBkcm9wIGFueSBleGlzdGluZyBlbnRyeSBmaXJzdFxuICAgICAgLy8gYW5kIHJlLWluc2VydCBiZWxvdyBhcyB0aGUgbmV3ZXN0IChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlcikuIFRoaXNcbiAgICAgIC8vIGtlZXBzIHRoZSBNYXAgb3JkZXJlZCBvbGRlc3QtVVNFRCDihpIgbmV3ZXN0LVVTRUQgc28gdGhlIGV2aWN0aW9uIGJlbG93IGlzXG4gICAgICAvLyB0cnVlIExSVSwgYW5kIGF2b2lkcyBldmljdGluZyBhIHZpY3RpbSB3aGVuIG1lcmVseSB1cGRhdGluZyBhIGtleS5cbiAgICAgIHRoaXMubWVtb3J5LmRlbGV0ZShmayk7XG4gICAgICBpZiAodGhpcy5tZW1vcnkuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLm1lbW9yeS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAoZmlyc3RLZXkpIHRoaXMubWVtb3J5LmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWVtb3J5LnNldChmaywge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsICogMTAwMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ2FjaGUgc2V0IGZhaWx1cmUgaXMgbm9uLWZhdGFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGNhY2hlZCB2YWx1ZS5cbiAgICovXG4gIGFzeW5jIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmFwcGx5TG9jYWxJbnZhbGlkYXRpb24oJ2RlbCcsIGtleSk7XG4gICAgICB0aGlzLmJyb2FkY2FzdCgnZGVsJywga2V5KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIGRlbGV0ZSBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGFsbCBrZXlzIG1hdGNoaW5nIGEgcGF0dGVybiAoZS5nLiwgJ29yZzEyMzoqJykuXG4gICAqIE9ubHkgYCpgIGlzIGEgd2lsZGNhcmQuXG4gICAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBBcHBseSBsb2NhbGx5LCB0aGVuIGZhbiBvdXQgdG8gdGhlIG90aGVyIHJlcGxpY2FzLlxuICAgICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbigncGF0dGVybicsIHBhdHRlcm4pO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ3BhdHRlcm4nLCBwYXR0ZXJuKTtcbiAgICAgIHRoaXMubWV0cmljcy5pbnZhbGlkYXRpb25zICs9IGRlbGV0ZWQ7XG4gICAgICByZXR1cm4gZGVsZXRlZDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmluZmxpZ2h0LmdldChmaykgYXMgUHJvbWlzZTxUPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBjbG9uZVZhbHVlKGF3YWl0IGV4aXN0aW5nKTtcblxuICAgIGNvbnN0IGdlbmVyYXRpb25BdFN0YXJ0ID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgIGNvbnN0IGZsaWdodCA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IGZhY3RvcnkoKTtcbiAgICAgIC8vIEFuIGludmFsaWRhdGlvbiAoaGVyZSBvciBvbiBhbm90aGVyIHJlcGxpY2EpIGxhbmRlZCB3aGlsZSB0aGUgZmFjdG9yeVxuICAgICAgLy8gcmFuOiBpdHMgcmVhZCBtYXkgcHJlZGF0ZSB0aGF0IHdyaXRlLCBzbyBkb24ndCBjYWNoZSBpdC5cbiAgICAgIGlmICh0aGlzLmdlbmVyYXRpb24gPT09IGdlbmVyYXRpb25BdFN0YXJ0KSBhd2FpdCB0aGlzLnNldChrZXksIHZhbHVlLCB0dGxTZWNvbmRzKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KSgpO1xuICAgIHRoaXMuaW5mbGlnaHQuc2V0KGZrLCBmbGlnaHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBmbGlnaHQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluZmxpZ2h0LmRlbGV0ZShmayk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlbnRyaWVzICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgYXN5bmMgY2xlYXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdjbGVhcicpO1xuICAgIHRoaXMuYnJvYWRjYXN0KCdjbGVhcicpO1xuICB9XG5cbiAgLyoqIEN1cnJlbnQgaW4tbWVtb3J5IGNhY2hlIHNpemUgKGZvciBkaWFnbm9zdGljcykuICovXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubWVtb3J5LnNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBjYWNoZSBzZXJ2aWNlIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBwcmVmaXggLSBOYW1lc3BhY2UgcHJlZml4IChlLmcuLCAnY29tcGxpYW5jZTonLCAncGx1Z2luOicpXG4gKiBAcGFyYW0gZGVmYXVsdFR0bFNlY29uZHMgLSBEZWZhdWx0IFRUTCBpbiBzZWNvbmRzIChkZWZhdWx0IDMwMCA9IDUgbWluKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2FjaGVTZXJ2aWNlKHByZWZpeDogc3RyaW5nLCBkZWZhdWx0VHRsU2Vjb25kcyA9IDMwMCk6IENhY2hlU2VydmljZSB7XG4gIHJldHVybiBuZXcgQ2FjaGVTZXJ2aWNlKHsgcHJlZml4LCBkZWZhdWx0VHRsU2Vjb25kcyB9KTtcbn1cbiJdfQ==
@@ -20,6 +20,8 @@ export declare class CircuitBreaker {
20
20
  private consecutiveFailures;
21
21
  private openedAt;
22
22
  private probeInFlight;
23
+ /** When the current half-open probe was admitted (for expiring a stuck probe). */
24
+ private probeStartedAt;
23
25
  constructor(key: string, config?: CircuitBreakerConfig);
24
26
  getState(): CircuitState;
25
27
  /**
@@ -28,13 +30,24 @@ export declare class CircuitBreaker {
28
30
  * probe is already in flight) — the caller must fast-fail without any network.
29
31
  */
30
32
  allowRequest(): boolean;
33
+ private admitProbe;
31
34
  /** A logical request succeeded (2xx/3xx/4xx that isn't a downstream fault). */
32
35
  recordSuccess(): void;
33
36
  /** A logical request failed (connection error, timeout, or 5xx response). */
34
37
  recordFailure(): void;
35
38
  private open;
36
39
  }
37
- /** Get (or lazily create) the shared breaker for a `host:port` target. */
40
+ /**
41
+ * The breaker key for a target and a ROUTE CLASS. Breakers are per
42
+ * `host:port` + class, so one failing surface of a service (say platform's
43
+ * audit ingest returning 5xx) can't open the breaker for an unrelated one
44
+ * (platform's JWKS / key exchange). The class is a small, caller-chosen label —
45
+ * never derived from the path, which carries ids and would explode the registry.
46
+ */
47
+ export declare function circuitBreakerKey(target: string, routeClass?: string): string;
48
+ /** The route class of a request that names none. */
49
+ export declare const DEFAULT_ROUTE_CLASS = "default";
50
+ /** Get (or lazily create) the shared breaker for a {@link circuitBreakerKey}. */
38
51
  export declare function getCircuitBreaker(key: string): CircuitBreaker;
39
52
  /** Test helper: clear all breaker state so suites don't leak across each other. */
40
53
  export declare function resetCircuitBreakers(): void;