@pipeline-builder/api-core 4.1.3 → 4.1.5

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 (77) hide show
  1. package/README.md +3 -3
  2. package/lib/errors/app-errors.d.ts +0 -4
  3. package/lib/errors/app-errors.js +1 -8
  4. package/lib/helpers/restore-helpers.d.ts +3 -3
  5. package/lib/helpers/restore-helpers.js +4 -4
  6. package/lib/helpers/sse-helpers.d.ts +8 -1
  7. package/lib/helpers/sse-helpers.js +11 -3
  8. package/lib/middleware/auth.d.ts +174 -43
  9. package/lib/middleware/auth.js +384 -179
  10. package/lib/middleware/index.d.ts +1 -0
  11. package/lib/middleware/index.js +2 -1
  12. package/lib/middleware/route-table.d.ts +104 -0
  13. package/lib/middleware/route-table.js +230 -0
  14. package/lib/middleware/step-up.d.ts +48 -16
  15. package/lib/middleware/step-up.js +74 -36
  16. package/lib/services/api-key-exchange.d.ts +25 -0
  17. package/lib/services/api-key-exchange.js +219 -0
  18. package/lib/services/cache-service.d.ts +11 -26
  19. package/lib/services/cache-service.js +20 -74
  20. package/lib/services/compliance-event-subscriber.d.ts +5 -4
  21. package/lib/services/compliance-event-subscriber.js +8 -6
  22. package/lib/services/durable-event-bus.d.ts +22 -39
  23. package/lib/services/durable-event-bus.js +95 -43
  24. package/lib/services/env-redis.d.ts +27 -0
  25. package/lib/services/env-redis.js +63 -1
  26. package/lib/services/http-client.d.ts +10 -15
  27. package/lib/services/http-client.js +32 -27
  28. package/lib/services/index.d.ts +3 -0
  29. package/lib/services/index.js +4 -1
  30. package/lib/services/jwks-cache.d.ts +102 -0
  31. package/lib/services/jwks-cache.js +222 -0
  32. package/lib/services/quota.js +12 -4
  33. package/lib/services/remote-audit-client.d.ts +1 -1
  34. package/lib/services/remote-audit-client.js +32 -1
  35. package/lib/services/scheduler.d.ts +2 -3
  36. package/lib/services/scheduler.js +2 -2
  37. package/lib/services/service-boot.d.ts +4 -2
  38. package/lib/services/service-boot.js +7 -3
  39. package/lib/services/service-keys.d.ts +83 -0
  40. package/lib/services/service-keys.js +354 -0
  41. package/lib/services/sse-ticket-store.d.ts +55 -22
  42. package/lib/services/sse-ticket-store.js +122 -79
  43. package/lib/services/token-revocation.js +30 -18
  44. package/lib/testing/route-coverage.d.ts +64 -0
  45. package/lib/testing/route-coverage.js +183 -0
  46. package/lib/testing/service-tokens.d.ts +66 -0
  47. package/lib/testing/service-tokens.js +137 -0
  48. package/lib/testing/tier-mock.d.ts +2 -2
  49. package/lib/testing/tier-mock.js +3 -3
  50. package/lib/testing/user-tokens.d.ts +75 -0
  51. package/lib/testing/user-tokens.js +115 -0
  52. package/lib/types/catalog-metadata.d.ts +0 -2
  53. package/lib/types/catalog-metadata.js +1 -3
  54. package/lib/types/common.d.ts +103 -4
  55. package/lib/types/common.js +11 -1
  56. package/lib/types/error-codes.d.ts +15 -0
  57. package/lib/types/error-codes.js +22 -1
  58. package/lib/types/permissions.d.ts +35 -1
  59. package/lib/types/permissions.js +72 -2
  60. package/lib/utils/api-key.d.ts +34 -0
  61. package/lib/utils/api-key.js +75 -0
  62. package/lib/utils/env.d.ts +0 -2
  63. package/lib/utils/env.js +1 -6
  64. package/lib/utils/index.d.ts +4 -0
  65. package/lib/utils/index.js +5 -1
  66. package/lib/utils/jwk.d.ts +98 -0
  67. package/lib/utils/jwk.js +139 -0
  68. package/lib/utils/logger.d.ts +30 -1
  69. package/lib/utils/logger.js +74 -27
  70. package/lib/utils/secret-encryption.d.ts +7 -2
  71. package/lib/utils/secret-encryption.js +47 -4
  72. package/lib/utils/secret-rotation.d.ts +17 -0
  73. package/lib/utils/secret-rotation.js +54 -0
  74. package/lib/utils/sensitive-patterns.d.ts +49 -0
  75. package/lib/utils/sensitive-patterns.js +149 -0
  76. package/lib/validation/common-schemas.js +5 -4
  77. package/package.json +20 -1
@@ -1,32 +1,23 @@
1
1
  /**
2
- * Minimal Redis-like client interface (subset of ioredis).
3
- * Services pass their own Redis client instance.
2
+ * Minimal Redis key/value client surface (subset of ioredis) shared by the
3
+ * token-revocation publisher/reader and platform's Redis helpers.
4
4
  */
5
5
  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
- keys(pattern: string): Promise<string[]>;
10
- /** SCAN-based iteration (preferred over KEYS for production). */
11
- scanStream?(options: {
12
- match: string;
13
- count?: number;
14
- }): NodeJS.ReadableStream;
15
9
  }
16
10
  export interface CacheConfig {
17
11
  /** Key prefix for namespace isolation (e.g., 'plugin:', 'compliance:') */
18
12
  prefix: string;
19
13
  /** Default TTL in seconds */
20
14
  defaultTtlSeconds: number;
21
- /** Max entries for in-memory cache (default 1000) */
15
+ /** Max entries for the cache (default 1000) */
22
16
  maxEntries?: number;
23
- /** Optional Redis client — uses in-memory cache if not provided */
24
- redis?: RedisCacheClient;
25
17
  /**
26
- * Cross-replica invalidation bus for the in-memory backend. Omit to use the
27
- * shared env-Redis bus (null when Redis isn't configured → single-process
28
- * semantics); pass `null` to disable explicitly. Ignored with `redis` (the
29
- * store itself is shared, so there is nothing to fan out).
18
+ * Cross-replica invalidation bus. Omit to use the shared env-Redis bus (null
19
+ * when Redis isn't configured → single-process semantics); pass `null` to
20
+ * disable explicitly.
30
21
  */
31
22
  invalidationBus?: CacheInvalidationBus | null;
32
23
  }
@@ -101,7 +92,6 @@ export declare class CacheService {
101
92
  private readonly prefix;
102
93
  private readonly defaultTtlMs;
103
94
  private readonly maxEntries;
104
- private readonly redis?;
105
95
  private readonly bus;
106
96
  private readonly instanceId;
107
97
  /**
@@ -118,7 +108,7 @@ export declare class CacheService {
118
108
  invalidations: number;
119
109
  };
120
110
  constructor(config: CacheConfig);
121
- /** Broadcast an invalidation to the other replicas (in-memory backend only). */
111
+ /** Broadcast an invalidation to the other replicas. */
122
112
  private broadcast;
123
113
  /** Apply an invalidation to THIS process's in-memory entries. Returns the count removed. */
124
114
  private applyLocalInvalidation;
@@ -127,16 +117,14 @@ export declare class CacheService {
127
117
  * Get a cached value. Returns null on miss or error.
128
118
  *
129
119
  * The returned value is an INDEPENDENT deep copy — mutating it never affects
130
- * the cached entry (the in-memory backend clones on read for parity with
131
- * Redis, which returns a fresh JSON clone). Callers may still treat results as
132
- * immutable, but doing so is no longer load-bearing for cache integrity.
120
+ * the cached entry.
133
121
  */
134
122
  get<T>(key: string): Promise<T | null>;
135
123
  /**
136
124
  * Set a cached value with optional TTL override.
137
125
  *
138
126
  * @param key - Cache key (prefix is added automatically)
139
- * @param value - Value to cache (must be JSON-serializable for Redis)
127
+ * @param value - Value to cache
140
128
  * @param ttlSeconds - TTL override (uses default if not provided)
141
129
  */
142
130
  set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
@@ -146,11 +134,9 @@ export declare class CacheService {
146
134
  del(key: string): Promise<void>;
147
135
  /**
148
136
  * Invalidate all keys matching a pattern (e.g., 'org123:*').
149
- * Uses SCAN for Redis (non-blocking) with KEYS fallback, or regex for in-memory.
137
+ * Only `*` is a wildcard.
150
138
  */
151
139
  invalidatePattern(pattern: string): Promise<number>;
152
- /** Collect keys via Redis SCAN (non-blocking alternative to KEYS). */
153
- private scanKeys;
154
140
  /**
155
141
  * Get or compute: returns cached value if available, otherwise calls the
156
142
  * factory function, caches the result, and returns it.
@@ -178,6 +164,5 @@ export declare class CacheService {
178
164
  *
179
165
  * @param prefix - Namespace prefix (e.g., 'compliance:', 'plugin:')
180
166
  * @param defaultTtlSeconds - Default TTL in seconds (default 300 = 5 min)
181
- * @param redis - Optional Redis client for cross-process caching
182
167
  */
183
- export declare function createCacheService(prefix: string, defaultTtlSeconds?: number, redis?: RedisCacheClient): CacheService;
168
+ export declare function createCacheService(prefix: string, defaultTtlSeconds?: number): CacheService;
@@ -3,11 +3,9 @@
3
3
  /**
4
4
  * Lightweight caching service with TTL support.
5
5
  *
6
- * Two implementations:
7
- * - In-memory (default): true-LRU Map cache, no external dependencies
8
- * - Redis: When a Redis client is provided, uses Redis for cross-process caching
6
+ * Storage is a per-process true-LRU Map (no external dependencies).
9
7
  *
10
- * Cross-replica invalidation (in-memory backend): every service runs several
8
+ * Cross-replica invalidation: every service runs several
11
9
  * replicas (HPA), each with its OWN in-memory cache. An invalidation performed on
12
10
  * one pod (`del` / `invalidatePattern` / `clear`) is broadcast over Redis pub/sub
13
11
  * ({@link CacheInvalidationBus}, wired from the ambient Redis env by default) and
@@ -18,8 +16,8 @@
18
16
  *
19
17
  * Design:
20
18
  * - All operations are fail-safe: cache misses/errors return null, never throw
21
- * - JSON serialization for Redis; the in-memory backend deep-clones on read so
22
- * both backends return an independent copy (mutating a result is always safe)
19
+ * - Reads deep-clone, so every caller gets an independent copy (mutating a
20
+ * result is always safe)
23
21
  * - `getOrSet` is single-flight: concurrent misses share one factory() call
24
22
  * - Key namespace prefixing to avoid collisions between services
25
23
  */
@@ -29,11 +27,9 @@ import { createLogger } from '../utils/logger.js';
29
27
  import { emitCounter } from '../utils/metric-emitter.js';
30
28
  const logger = createLogger('cache-service');
31
29
  /**
32
- * Deep-clone a value so the in-memory backend hands back an INDEPENDENT copy on
33
- * every read — matching the Redis backend, which returns a fresh `JSON.parse`
34
- * clone each time. Without this the in-memory cache returns the same stored
35
- * object reference, so a consumer mutating a "cached" object silently corrupts
36
- * the shared cache (a footgun that only bites under the memory backend).
30
+ * Deep-clone a value so the cache hands back an INDEPENDENT copy on every read.
31
+ * Without this it returns the same stored object reference, so a consumer
32
+ * mutating a "cached" object silently corrupts the shared cache.
37
33
  *
38
34
  * Primitives are returned as-is. Prefers the structured-clone algorithm; falls
39
35
  * back to a JSON round-trip on older runtimes or exotic values.
@@ -160,7 +156,6 @@ export class CacheService {
160
156
  prefix;
161
157
  defaultTtlMs;
162
158
  maxEntries;
163
- redis;
164
159
  bus;
165
160
  instanceId = randomUUID();
166
161
  /**
@@ -175,15 +170,14 @@ export class CacheService {
175
170
  this.prefix = config.prefix;
176
171
  this.defaultTtlMs = config.defaultTtlSeconds * 1000;
177
172
  this.maxEntries = config.maxEntries ?? 1000;
178
- this.redis = config.redis;
179
- this.bus = this.redis ? null : (config.invalidationBus === undefined ? getEnvCacheInvalidationBus() : config.invalidationBus);
173
+ this.bus = config.invalidationBus === undefined ? getEnvCacheInvalidationBus() : config.invalidationBus;
180
174
  this.bus?.subscribe((msg) => {
181
175
  if (msg.origin === this.instanceId || msg.prefix !== this.prefix)
182
176
  return;
183
177
  this.applyLocalInvalidation(msg.op, msg.key);
184
178
  }, () => this.applyLocalInvalidation('clear'));
185
179
  }
186
- /** Broadcast an invalidation to the other replicas (in-memory backend only). */
180
+ /** Broadcast an invalidation to the other replicas. */
187
181
  broadcast(op, key) {
188
182
  this.bus?.publish({ origin: this.instanceId, prefix: this.prefix, op, ...(key !== undefined && { key }) });
189
183
  }
@@ -219,23 +213,11 @@ export class CacheService {
219
213
  * Get a cached value. Returns null on miss or error.
220
214
  *
221
215
  * The returned value is an INDEPENDENT deep copy — mutating it never affects
222
- * the cached entry (the in-memory backend clones on read for parity with
223
- * Redis, which returns a fresh JSON clone). Callers may still treat results as
224
- * immutable, but doing so is no longer load-bearing for cache integrity.
216
+ * the cached entry.
225
217
  */
226
218
  async get(key) {
227
219
  const fk = this.fullKey(key);
228
220
  try {
229
- if (this.redis) {
230
- const raw = await this.redis.get(fk);
231
- if (!raw) {
232
- this.metrics.misses++;
233
- return null;
234
- }
235
- this.metrics.hits++;
236
- return JSON.parse(raw);
237
- }
238
- // In-memory
239
221
  const entry = this.memory.get(fk);
240
222
  if (!entry) {
241
223
  this.metrics.misses++;
@@ -264,7 +246,7 @@ export class CacheService {
264
246
  * Set a cached value with optional TTL override.
265
247
  *
266
248
  * @param key - Cache key (prefix is added automatically)
267
- * @param value - Value to cache (must be JSON-serializable for Redis)
249
+ * @param value - Value to cache
268
250
  * @param ttlSeconds - TTL override (uses default if not provided)
269
251
  */
270
252
  async set(key, value, ttlSeconds) {
@@ -272,11 +254,7 @@ export class CacheService {
272
254
  const ttl = ttlSeconds ?? this.defaultTtlMs / 1000;
273
255
  try {
274
256
  this.metrics.sets++;
275
- if (this.redis) {
276
- await this.redis.set(fk, JSON.stringify(value), 'EX', ttl);
277
- return;
278
- }
279
- // In-memory — a write counts as a use, so drop any existing entry first
257
+ // A write counts as a use, so drop any existing entry first
280
258
  // and re-insert below as the newest (Map preserves insertion order). This
281
259
  // keeps the Map ordered oldest-USED → newest-USED so the eviction below is
282
260
  // true LRU, and avoids evicting a victim when merely updating a key.
@@ -299,12 +277,7 @@ export class CacheService {
299
277
  * Delete a cached value.
300
278
  */
301
279
  async del(key) {
302
- const fk = this.fullKey(key);
303
280
  try {
304
- if (this.redis) {
305
- await this.redis.del(fk);
306
- return;
307
- }
308
281
  this.applyLocalInvalidation('del', key);
309
282
  this.broadcast('del', key);
310
283
  }
@@ -314,22 +287,11 @@ export class CacheService {
314
287
  }
315
288
  /**
316
289
  * Invalidate all keys matching a pattern (e.g., 'org123:*').
317
- * Uses SCAN for Redis (non-blocking) with KEYS fallback, or regex for in-memory.
290
+ * Only `*` is a wildcard.
318
291
  */
319
292
  async invalidatePattern(pattern) {
320
- const fp = this.fullKey(pattern);
321
293
  try {
322
- if (this.redis) {
323
- const keys = this.redis.scanStream
324
- ? await this.scanKeys(fp)
325
- : await this.redis.keys(fp);
326
- if (keys.length > 0) {
327
- await this.redis.del(...keys);
328
- this.metrics.invalidations += keys.length;
329
- }
330
- return keys.length;
331
- }
332
- // In-memory — apply locally, then fan out to the other replicas.
294
+ // Apply locally, then fan out to the other replicas.
333
295
  const deleted = this.applyLocalInvalidation('pattern', pattern);
334
296
  this.broadcast('pattern', pattern);
335
297
  this.metrics.invalidations += deleted;
@@ -339,16 +301,6 @@ export class CacheService {
339
301
  return 0;
340
302
  }
341
303
  }
342
- /** Collect keys via Redis SCAN (non-blocking alternative to KEYS). */
343
- scanKeys(pattern) {
344
- return new Promise((resolve, reject) => {
345
- const stream = this.redis.scanStream({ match: pattern, count: 100 });
346
- const keys = [];
347
- stream.on('data', (batch) => keys.push(...batch));
348
- stream.once('end', () => resolve(keys));
349
- stream.once('error', reject);
350
- });
351
- }
352
304
  /**
353
305
  * Get or compute: returns cached value if available, otherwise calls the
354
306
  * factory function, caches the result, and returns it.
@@ -374,7 +326,7 @@ export class CacheService {
374
326
  // Cloning inside the flight instead would hand one shared clone to all N
375
327
  // coalesced callers, so one caller mutating its "independent" result would
376
328
  // corrupt what the others read — the exact footgun get()'s clone-on-read
377
- // prevents. (Redis backend is unaffected: set serializes, get JSON.parses.)
329
+ // prevents.
378
330
  const existing = this.inflight.get(fk);
379
331
  if (existing)
380
332
  return cloneValue(await existing);
@@ -399,13 +351,8 @@ export class CacheService {
399
351
  * Clear all entries (useful for testing).
400
352
  */
401
353
  async clear() {
402
- if (this.redis) {
403
- await this.invalidatePattern('*');
404
- }
405
- else {
406
- this.applyLocalInvalidation('clear');
407
- this.broadcast('clear');
408
- }
354
+ this.applyLocalInvalidation('clear');
355
+ this.broadcast('clear');
409
356
  }
410
357
  /** Current in-memory cache size (for diagnostics). */
411
358
  get size() {
@@ -417,9 +364,8 @@ export class CacheService {
417
364
  *
418
365
  * @param prefix - Namespace prefix (e.g., 'compliance:', 'plugin:')
419
366
  * @param defaultTtlSeconds - Default TTL in seconds (default 300 = 5 min)
420
- * @param redis - Optional Redis client for cross-process caching
421
367
  */
422
- export function createCacheService(prefix, defaultTtlSeconds = 300, redis) {
423
- return new CacheService({ prefix, defaultTtlSeconds, redis });
368
+ export function createCacheService(prefix, defaultTtlSeconds = 300) {
369
+ return new CacheService({ prefix, defaultTtlSeconds });
424
370
  }
425
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBVTdDOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQVE7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUM7UUFDSCxPQUFPLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQU0sQ0FBQztJQUNoRCxDQUFDO0FBQ0gsQ0FBQztBQWlFRCxNQUFNLDBCQUEwQixHQUFHLGtCQUFrQixDQUFDO0FBRXREOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxTQUFrQztJQUNoRixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQW1ELEVBQUUsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBc0IsRUFBRSxDQUFDO0lBRTdDLE1BQU0sTUFBTSxH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TSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILE9BQU8sVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsc0RBQXNEO0lBQ3RELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxNQUFjLEVBQ2QsaUJBQWlCLEdBQUcsR0FBRyxFQUN2QixLQUF3QjtJQUV4QixPQUFPLElBQUksWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGNhY2hpbmcgc2VydmljZSB3aXRoIFRUTCBzdXBwb3J0LlxuICpcbiAqIFR3byBpbXBsZW1lbnRhdGlvbnM6XG4gKiAtIEluLW1lbW9yeSAoZGVmYXVsdCk6IHRydWUtTFJVIE1hcCBjYWNoZSwgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzXG4gKiAtIFJlZGlzOiBXaGVuIGEgUmVkaXMgY2xpZW50IGlzIHByb3ZpZGVkLCB1c2VzIFJlZGlzIGZvciBjcm9zcy1wcm9jZXNzIGNhY2hpbmdcbiAqXG4gKiBDcm9zcy1yZXBsaWNhIGludmFsaWRhdGlvbiAoaW4tbWVtb3J5IGJhY2tlbmQpOiBldmVyeSBzZXJ2aWNlIHJ1bnMgc2V2ZXJhbFxuICogcmVwbGljYXMgKEhQQSksIGVhY2ggd2l0aCBpdHMgT1dOIGluLW1lbW9yeSBjYWNoZS4gQW4gaW52YWxpZGF0aW9uIHBlcmZvcm1lZCBvblxuICogb25lIHBvZCAoYGRlbGAgLyBgaW52YWxpZGF0ZVBhdHRlcm5gIC8gYGNsZWFyYCkgaXMgYnJvYWRjYXN0IG92ZXIgUmVkaXMgcHViL3N1YlxuICogKHtAbGluayBDYWNoZUludmFsaWRhdGlvbkJ1c30sIHdpcmVkIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IGJ5IGRlZmF1bHQpIGFuZFxuICogYXBwbGllZCBieSBldmVyeSBvdGhlciBwb2QsIHNvIGEgd3JpdGUgb24gcG9kIEEgY2FuJ3QgbGVhdmUgcG9kIEIgc2VydmluZyB0aGVcbiAqIHN0YWxlIGVudHJ5IHVudGlsIGl0cyBUVEwgbGFwc2VzLiBBIHBvZCB3aG9zZSBzdWJzY3JpYmVyIChyZSljb25uZWN0cyBmbHVzaGVzXG4gKiBpdHMgbG9jYWwgY2FjaGUg4oCUIGl0IG1heSBoYXZlIG1pc3NlZCBpbnZhbGlkYXRpb25zIHdoaWxlIGRpc2Nvbm5lY3RlZCDigJQgYW5kIGFcbiAqIGBnZXRPclNldGAgd2hvc2UgZmFjdG9yeSByYWNlZCBhbiBpbnZhbGlkYXRpb24gZG9lcyBub3QgY2FjaGUgaXRzIHJlc3VsdC5cbiAqXG4gKiBEZXNpZ246XG4gKiAtIEFsbCBvcGVyYXRpb25zIGFyZSBmYWlsLXNhZmU6IGNhY2hlIG1pc3Nlcy9lcnJvcnMgcmV0dXJuIG51bGwsIG5ldmVyIHRocm93XG4gKiAtIEpTT04gc2VyaWFsaXphdGlvbiBmb3IgUmVkaXM7IHRoZSBpbi1tZW1vcnkgYmFja2VuZCBkZWVwLWNsb25lcyBvbiByZWFkIHNvXG4gKiAgIGJvdGggYmFja2VuZHMgcmV0dXJuIGFuIGluZGVwZW5kZW50IGNvcHkgKG11dGF0aW5nIGEgcmVzdWx0IGlzIGFsd2F5cyBzYWZlKVxuICogLSBgZ2V0T3JTZXRgIGlzIHNpbmdsZS1mbGlnaHQ6IGNvbmN1cnJlbnQgbWlzc2VzIHNoYXJlIG9uZSBmYWN0b3J5KCkgY2FsbFxuICogLSBLZXkgbmFtZXNwYWNlIHByZWZpeGluZyB0byBhdm9pZCBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXNcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY2FjaGUtc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGVudHJ5IHdpdGggdmFsdWUgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAqL1xuaW50ZXJmYWNlIENhY2hlRW50cnk8VD4ge1xuICB2YWx1ZTogVDtcbiAgZXhwaXJlc0F0OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIGluIG1zXG59XG5cbi8qKlxuICogRGVlcC1jbG9uZSBhIHZhbHVlIHNvIHRoZSBpbi1tZW1vcnkgYmFja2VuZCBoYW5kcyBiYWNrIGFuIElOREVQRU5ERU5UIGNvcHkgb25cbiAqIGV2ZXJ5IHJlYWQg4oCUIG1hdGNoaW5nIHRoZSBSZWRpcyBiYWNrZW5kLCB3aGljaCByZXR1cm5zIGEgZnJlc2ggYEpTT04ucGFyc2VgXG4gKiBjbG9uZSBlYWNoIHRpbWUuIFdpdGhvdXQgdGhpcyB0aGUgaW4tbWVtb3J5IGNhY2hlIHJldHVybnMgdGhlIHNhbWUgc3RvcmVkXG4gKiBvYmplY3QgcmVmZXJlbmNlLCBzbyBhIGNvbnN1bWVyIG11dGF0aW5nIGEgXCJjYWNoZWRcIiBvYmplY3Qgc2lsZW50bHkgY29ycnVwdHNcbiAqIHRoZSBzaGFyZWQgY2FjaGUgKGEgZm9vdGd1biB0aGF0IG9ubHkgYml0ZXMgdW5kZXIgdGhlIG1lbW9yeSBiYWNrZW5kKS5cbiAqXG4gKiBQcmltaXRpdmVzIGFyZSByZXR1cm5lZCBhcy1pcy4gUHJlZmVycyB0aGUgc3RydWN0dXJlZC1jbG9uZSBhbGdvcml0aG07IGZhbGxzXG4gKiBiYWNrIHRvIGEgSlNPTiByb3VuZC10cmlwIG9uIG9sZGVyIHJ1bnRpbWVzIG9yIGV4b3RpYyB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNsb25lVmFsdWU8VD4odmFsdWU6IFQpOiBUIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSBhcyBUO1xuICB9XG59XG5cbi8qKlxuICogTWluaW1hbCBSZWRpcy1saWtlIGNsaWVudCBpbnRlcmZhY2UgKHN1YnNldCBvZiBpb3JlZGlzKS5cbiAqIFNlcnZpY2VzIHBhc3MgdGhlaXIgb3duIFJlZGlzIGNsaWVudCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0NhY2hlQ2xpZW50IHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHVua25vd24+O1xuICBkZWwoLi4ua2V5czogc3RyaW5nW10pOiBQcm9taXNlPG51bWJlcj47XG4gIGtleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT47XG4gIC8qKiBTQ0FOLWJhc2VkIGl0ZXJhdGlvbiAocHJlZmVycmVkIG92ZXIgS0VZUyBmb3IgcHJvZHVjdGlvbikuICovXG4gIHNjYW5TdHJlYW0/KG9wdGlvbnM6IHsgbWF0Y2g6IHN0cmluZzsgY291bnQ/OiBudW1iZXIgfSk6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZUNvbmZpZyB7XG4gIC8qKiBLZXkgcHJlZml4IGZvciBuYW1lc3BhY2UgaXNvbGF0aW9uIChlLmcuLCAncGx1Z2luOicsICdjb21wbGlhbmNlOicpICovXG4gIHByZWZpeDogc3RyaW5nO1xuICAvKiogRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAqL1xuICBkZWZhdWx0VHRsU2Vjb25kczogbnVtYmVyO1xuICAvKiogTWF4IGVudHJpZXMgZm9yIGluLW1lbW9yeSBjYWNoZSAoZGVmYXVsdCAxMDAwKSAqL1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICAvKiogT3B0aW9uYWwgUmVkaXMgY2xpZW50IOKAlCB1c2VzIGluLW1lbW9yeSBjYWNoZSBpZiBub3QgcHJvdmlkZWQgKi9cbiAgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50O1xuICAvKipcbiAgICogQ3Jvc3MtcmVwbGljYSBpbnZhbGlkYXRpb24gYnVzIGZvciB0aGUgaW4tbWVtb3J5IGJhY2tlbmQuIE9taXQgdG8gdXNlIHRoZVxuICAgKiBzaGFyZWQgZW52LVJlZGlzIGJ1cyAobnVsbCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQg4oaSIHNpbmdsZS1wcm9jZXNzXG4gICAqIHNlbWFudGljcyk7IHBhc3MgYG51bGxgIHRvIGRpc2FibGUgZXhwbGljaXRseS4gSWdub3JlZCB3aXRoIGByZWRpc2AgKHRoZVxuICAgKiBzdG9yZSBpdHNlbGYgaXMgc2hhcmVkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGZhbiBvdXQpLlxuICAgKi9cbiAgaW52YWxpZGF0aW9uQnVzPzogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsO1xufVxuXG4vKiogT25lIGludmFsaWRhdGlvbiBicm9hZGNhc3QgdG8gZXZlcnkgcmVwbGljYS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlIHtcbiAgLyoqIElkIG9mIHRoZSBDYWNoZVNlcnZpY2UgaW5zdGFuY2UgdGhhdCBpbnZhbGlkYXRlZCAoaXQgaWdub3JlcyBpdHMgb3duIGVjaG8pLiAqL1xuICBvcmlnaW46IHN0cmluZztcbiAgLyoqIFRoZSBjYWNoZSBuYW1lc3BhY2UgKGBDYWNoZUNvbmZpZy5wcmVmaXhgKSB0aGUgaW52YWxpZGF0aW9uIGFwcGxpZXMgdG8uICovXG4gIHByZWZpeDogc3RyaW5nO1xuICBvcDogJ2RlbCcgfCAncGF0dGVybicgfCAnY2xlYXInO1xuICAvKiogVW4tcHJlZml4ZWQga2V5IChgZGVsYCkgb3IgZ2xvYiBwYXR0ZXJuIChgcGF0dGVybmApLiAqL1xuICBrZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBUcmFuc3BvcnQgdGhhdCBmYW5zIGNhY2hlIGludmFsaWRhdGlvbnMgb3V0IHRvIGV2ZXJ5IHJlcGxpY2EuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlSW52YWxpZGF0aW9uQnVzIHtcbiAgLyoqIEZpcmUtYW5kLWZvcmdldCBicm9hZGNhc3QuIE5ldmVyIHRocm93cy4gKi9cbiAgcHVibGlzaChtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSk6IHZvaWQ7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBoYW5kbGVycy4gYG9uTWVzc2FnZWAgcmVjZWl2ZXMgZXZlcnkgYnJvYWRjYXN0IChpbmNsdWRpbmcgdGhpc1xuICAgKiBwcm9jZXNzJ3Mgb3duKTsgYG9uUmVzeW5jYCBmaXJlcyB3aGVuZXZlciB0aGUgc3Vic2NyaXB0aW9uIGlzIChyZSllc3RhYmxpc2hlZCxcbiAgICogaS5lLiB3aGVuZXZlciBpbnZhbGlkYXRpb25zIG1heSBoYXZlIGJlZW4gbWlzc2VkLlxuICAgKi9cbiAgc3Vic2NyaWJlKG9uTWVzc2FnZTogKG1zZzogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlKSA9PiB2b2lkLCBvblJlc3luYzogKCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbi8qKiBNaW5pbWFsIGlvcmVkaXMgcHViL3N1YiBzdXJmYWNlIHRoZSBlbnYgYnVzIG5lZWRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0ludmFsaWRhdGlvbkNsaWVudCB7XG4gIHB1Ymxpc2goY2hhbm5lbDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG4gIHN1YnNjcmliZSguLi5jaGFubmVsczogc3RyaW5nW10pOiBQcm9taXNlPHVua25vd24+O1xuICBvbihldmVudDogc3RyaW5nLCBjYjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdW5rbm93bjtcbiAgZHVwbGljYXRlKCk6IFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50O1xuICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENBQ0hFX0lOVkFMSURBVElPTl9DSEFOTkVMID0gJ2NhY2hlOmludmFsaWRhdGUnO1xuXG4vKipcbiAqIFJlZGlzIHB1Yi9zdWIgaW52YWxpZGF0aW9uIGJ1cy4gUFVCTElTSCBvbiB0aGUgZ2l2ZW4gY2xpZW50OyBTVUJTQ1JJQkUgb24gYVxuICogYGR1cGxpY2F0ZSgpYCAoYSBzdWJzY3JpYmVkIGlvcmVkaXMgY29ubmVjdGlvbiBjYW4ndCBydW4gb3RoZXIgY29tbWFuZHMpLlxuICpcbiAqIFRoZSBTVUJTQ1JJQkUgaXMgaXNzdWVkIG9uIGV2ZXJ5IGByZWFkeWAgKGluaXRpYWwgY29ubmVjdCBBTkQgZWFjaCByZWNvbm5lY3QpXG4gKiByYXRoZXIgdGhhbiBvbmNlIGF0IGNvbnN0cnVjdGlvbjogdGhlIGVudiBjbGllbnQgcnVucyB3aXRob3V0IGFuIG9mZmxpbmVcbiAqIHF1ZXVlLCBzbyBhIHN1YnNjcmliZSBpc3N1ZWQgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHVwIGlzIHJlamVjdGVkIGFuZCB3b3VsZFxuICogbmV2ZXIgYmUgcmV0cmllZC4gRWFjaCBgcmVhZHlgIGFsc28gdHJpZ2dlcnMgYG9uUmVzeW5jYCBzbyBldmVyeSBjYWNoZSBmbHVzaGVzXG4gKiB3aGF0ZXZlciBpdCBtYXkgaGF2ZSBtaXNzZWQgd2hpbGUgZGlzY29ubmVjdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNDYWNoZUludmFsaWRhdGlvbkJ1cyhwdWJsaXNoZXI6IFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50KTogQ2FjaGVJbnZhbGlkYXRpb25CdXMge1xuICBjb25zdCBzdWJzY3JpYmVyID0gcHVibGlzaGVyLmR1cGxpY2F0ZSgpO1xuICBjb25zdCBtZXNzYWdlSGFuZGxlcnM6IEFycmF5PChtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSkgPT4gdm9pZD4gPSBbXTtcbiAgY29uc3QgcmVzeW5jSGFuZGxlcnM6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3QgcmVzeW5jID0gKCk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgaCBvZiByZXN5bmNIYW5kbGVycykge1xuICAgICAgdHJ5IHsgaCgpOyB9IGNhdGNoIHsgLyogaXNvbGF0ZWQgKi8gfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZG9TdWJzY3JpYmUgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBQcm9taXNlLnJlc29sdmUoc3Vic2NyaWJlci5zdWJzY3JpYmUoQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwpKVxuICAgICAgLnRoZW4oKCkgPT4gcmVzeW5jKCkpXG4gICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICBlbWl0Q291bnRlcignY2FjaGVfaW52YWxpZGF0aW9uX3N1YnNjcmliZV9mYWlsZWRfdG90YWwnLCB7fSk7XG4gICAgICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gc3Vic2NyaWJlIGZhaWxlZDsgd2lsbCByZXRyeSBvbiBuZXh0IHJlY29ubmVjdCcsIHtcbiAgICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gIHN1YnNjcmliZXIub24oJ21lc3NhZ2UnLCAoY2hhbm5lbDogc3RyaW5nLCByYXc6IHN0cmluZykgPT4ge1xuICAgIGlmIChjaGFubmVsICE9PSBDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCkgcmV0dXJuO1xuICAgIGxldCBtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB0cnkge1xuICAgICAgbXNnID0gSlNPTi5wYXJzZShyYXcpIGFzIENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBoIG9mIG1lc3NhZ2VIYW5kbGVycykge1xuICAgICAgdHJ5IHsgaChtc2cpOyB9IGNhdGNoIHsgLyogb25lIGNhY2hlIGNhbid0IGJyZWFrIHRoZSBvdGhlcnMgKi8gfVxuICAgIH1cbiAgfSk7XG4gIHN1YnNjcmliZXIub24oJ3JlYWR5JywgZG9TdWJzY3JpYmUpO1xuICBzdWJzY3JpYmVyLm9uKCdlcnJvcicsIChlOiB1bmtub3duKSA9PlxuICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gc3Vic2NyaWJlciBlcnJvcicsIHsgZXJyb3I6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9KSk7XG4gIGlmIChzdWJzY3JpYmVyLnN0YXR1cyA9PT0gJ3JlYWR5JykgZG9TdWJzY3JpYmUoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2gobXNnKSB7XG4gICAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHB1Ymxpc2hlci5wdWJsaXNoKENBQ0hFX0lOVkFMSURBVElPTl9DSEFOTkVMLCBKU09OLnN0cmluZ2lmeShtc2cpKSlcbiAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICBlbWl0Q291bnRlcignY2FjaGVfaW52YWxpZGF0aW9uX3B1Ymxpc2hfZmFpbGVkX3RvdGFsJywgeyBwcmVmaXg6IG1zZy5wcmVmaXggfSk7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0NhY2hlIGludmFsaWRhdGlvbiBwdWJsaXNoIGZhaWxlZCAob3RoZXIgcmVwbGljYXMga2VlcCB0aGUgZW50cnkgdW50aWwgVFRMKScsIHtcbiAgICAgICAgICAgIHByZWZpeDogbXNnLnByZWZpeCwgb3A6IG1zZy5vcCwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBzdWJzY3JpYmUob25NZXNzYWdlLCBvblJlc3luYykge1xuICAgICAgbWVzc2FnZUhhbmRsZXJzLnB1c2gob25NZXNzYWdlKTtcbiAgICAgIHJlc3luY0hhbmRsZXJzLnB1c2gob25SZXN5bmMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIHVuZGVmaW5lZCA9IG5vdCB5ZXQgYXR0ZW1wdGVkOyBudWxsID0gYXR0ZW1wdGVkLCBSZWRpcyBub3QgY29uZmlndXJlZC5cbmxldCBlbnZJbnZhbGlkYXRpb25CdXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuLyoqIFByb2Nlc3Mtd2lkZSBpbnZhbGlkYXRpb24gYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IChudWxsIHdpdGhvdXQgUmVkaXMpLiAqL1xuZnVuY3Rpb24gZ2V0RW52Q2FjaGVJbnZhbGlkYXRpb25CdXMoKTogQ2FjaGVJbnZhbGlkYXRpb25CdXMgfCBudWxsIHtcbiAgaWYgKGVudkludmFsaWRhdGlvbkJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJbnZhbGlkYXRpb25DbGllbnQ+KCdjYWNoZS1pbnZhbGlkYXRpb24nKTtcbiAgICBlbnZJbnZhbGlkYXRpb25CdXMgPSBjbGllbnQgPyBjcmVhdGVSZWRpc0NhY2hlSW52YWxpZGF0aW9uQnVzKGNsaWVudCkgOiBudWxsO1xuICB9XG4gIHJldHVybiBlbnZJbnZhbGlkYXRpb25CdXM7XG59XG5cbi8qKlxuICogQ2FjaGUgc2VydmljZSB3aXRoIGdldC9zZXQvZGVsIG9wZXJhdGlvbnMgYW5kIGF1dG9tYXRpYyBUVEwgZXhwaXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjYWNoZSA9IG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXg6ICdwbHVnaW46JywgZGVmYXVsdFR0bFNlY29uZHM6IDMwMCB9KTtcbiAqXG4gKiAvLyBTZXQgd2l0aCBkZWZhdWx0IFRUTFxuICogYXdhaXQgY2FjaGUuc2V0KCdvcmcxMjM6bGlzdCcsIHBsdWdpbnMpO1xuICpcbiAqIC8vIEdldCAocmV0dXJucyBudWxsIG9uIG1pc3MpXG4gKiBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZS5nZXQ8UGx1Z2luW10+KCdvcmcxMjM6bGlzdCcpO1xuICpcbiAqIC8vIEludmFsaWRhdGVcbiAqIGF3YWl0IGNhY2hlLmRlbCgnb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlIGJ5IHBhdHRlcm5cbiAqIGF3YWl0IGNhY2hlLmludmFsaWRhdGVQYXR0ZXJuKCdvcmcxMjM6KicpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZVNlcnZpY2Uge1xuICBwcml2YXRlIG1lbW9yeSA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZUVudHJ5PHVua25vd24+PigpO1xuICAvKipcbiAgICogSW4tZmxpZ2h0IGBnZXRPclNldGAgZmFjdG9yeSBwcm9taXNlcywga2V5ZWQgYnkgZnVsbCBjYWNoZSBrZXkuIENvYWxlc2Nlc1xuICAgKiBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGBmYWN0b3J5KClgIGludm9jYXRpb24gKHNpbmdsZS1mbGlnaHRcbiAgICogLyBzdGFtcGVkZSBwcm90ZWN0aW9uKTsgZW50cmllcyBhcmUgY2xlYXJlZCBvbmNlIHRoZSBwcm9taXNlIHNldHRsZXMuXG4gICAqL1xuICBwcml2YXRlIGluZmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFR0bE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4RW50cmllczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZGlzPzogUmVkaXNDYWNoZUNsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkID0gcmFuZG9tVVVJRCgpO1xuICAvKipcbiAgICogQnVtcGVkIG9uIEVWRVJZIGludmFsaWRhdGlvbiAobG9jYWwgb3IgcmVtb3RlKS4gYGdldE9yU2V0YCBvbmx5IGNhY2hlcyBhXG4gICAqIGZhY3RvcnkgcmVzdWx0IGlmIG5vIGludmFsaWRhdGlvbiBoYXBwZW5lZCB3aGlsZSB0aGUgZmFjdG9yeSByYW4g4oCUIG90aGVyd2lzZVxuICAgKiBpdCBjb3VsZCByZS1jYWNoZSBhIHZhbHVlIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSB0aGF0IGludmFsaWRhdGVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0aW9uID0gMDtcblxuICAvKiogQ2FjaGUgbWV0cmljcyDigJQgdHJhY2tzIGhpdHMsIG1pc3NlcywgYW5kIGludmFsaWRhdGlvbnMuICovXG4gIHJlYWRvbmx5IG1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgc2V0czogMCwgaW52YWxpZGF0aW9uczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2FjaGVDb25maWcpIHtcbiAgICB0aGlzLnByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgdGhpcy5kZWZhdWx0VHRsTXMgPSBjb25maWcuZGVmYXVsdFR0bFNlY29uZHMgKiAxMDAwO1xuICAgIHRoaXMubWF4RW50cmllcyA9IGNvbmZpZy5tYXhFbnRyaWVzID8/IDEwMDA7XG4gICAgdGhpcy5yZWRpcyA9IGNvbmZpZy5yZWRpcztcbiAgICB0aGlzLmJ1cyA9IHRoaXMucmVkaXMgPyBudWxsIDogKGNvbmZpZy5pbnZhbGlkYXRpb25CdXMgPT09IHVuZGVmaW5lZCA/IGdldEVudkNhY2hlSW52YWxpZGF0aW9uQnVzKCkgOiBjb25maWcuaW52YWxpZGF0aW9uQnVzKTtcbiAgICB0aGlzLmJ1cz8uc3Vic2NyaWJlKFxuICAgICAgKG1zZykgPT4ge1xuICAgICAgICBpZiAobXNnLm9yaWdpbiA9PT0gdGhpcy5pbnN0YW5jZUlkIHx8IG1zZy5wcmVmaXggIT09IHRoaXMucHJlZml4KSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbihtc2cub3AsIG1zZy5rZXkpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJyb2FkY2FzdCBhbiBpbnZhbGlkYXRpb24gdG8gdGhlIG90aGVyIHJlcGxpY2FzIChpbi1tZW1vcnkgYmFja2VuZCBvbmx5KS4gKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3Qob3A6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZVsnb3AnXSwga2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5idXM/LnB1Ymxpc2goeyBvcmlnaW46IHRoaXMuaW5zdGFuY2VJZCwgcHJlZml4OiB0aGlzLnByZWZpeCwgb3AsIC4uLihrZXkgIT09IHVuZGVmaW5lZCAmJiB7IGtleSB9KSB9KTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhbiBpbnZhbGlkYXRpb24gdG8gVEhJUyBwcm9jZXNzJ3MgaW4tbWVtb3J5IGVudHJpZXMuIFJldHVybnMgdGhlIGNvdW50IHJlbW92ZWQuICovXG4gIHByaXZhdGUgYXBwbHlMb2NhbEludmFsaWRhdGlvbihvcDogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlWydvcCddLCBrZXk/OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuICAgIGlmIChvcCA9PT0gJ2NsZWFyJykge1xuICAgICAgY29uc3QgbiA9IHRoaXMubWVtb3J5LnNpemU7XG4gICAgICB0aGlzLm1lbW9yeS5jbGVhcigpO1xuICAgICAgcmV0dXJuIG47XG4gICAgfVxuICAgIGlmIChvcCA9PT0gJ2RlbCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW9yeS5kZWxldGUodGhpcy5mdWxsS2V5KGtleSA/PyAnJykpID8gMSA6IDA7XG4gICAgfVxuICAgIC8vIEdsb2IgcGF0dGVybi4gRXNjYXBlIHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIGZpcnN0IHNvIGEgbGl0ZXJhbCBgLmAvYChgL2BbYFxuICAgIC8vIGluIGEga2V5IHByZWZpeCAoZS5nLiBgb3JnOnYxLjI6KmApIGNhbid0IG92ZXItbWF0Y2ggb3IgdGhyb3cgKGEgdGhyb3dcbiAgICAvLyBoZXJlIHdvdWxkIGxlYXZlIGVudHJpZXMgc3RhbGUpOyBvbmx5IGAqYCBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQuXG4gICAgY29uc3QgZnAgPSB0aGlzLmZ1bGxLZXkoa2V5ID8/ICcnKTtcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgZnAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKS5yZXBsYWNlKC9cXFxcXFwqL2csICcuKicpICsgJyQnKTtcbiAgICBsZXQgZGVsZXRlZCA9IDA7XG4gICAgZm9yIChjb25zdCBrIG9mIHRoaXMubWVtb3J5LmtleXMoKSkge1xuICAgICAgaWYgKHJlZ2V4LnRlc3QoaykpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGspO1xuICAgICAgICBkZWxldGVkKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmdWxsS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjYWNoZWQgdmFsdWUuIFJldHVybnMgbnVsbCBvbiBtaXNzIG9yIGVycm9yLlxuICAgKlxuICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYW4gSU5ERVBFTkRFTlQgZGVlcCBjb3B5IOKAlCBtdXRhdGluZyBpdCBuZXZlciBhZmZlY3RzXG4gICAqIHRoZSBjYWNoZWQgZW50cnkgKHRoZSBpbi1tZW1vcnkgYmFja2VuZCBjbG9uZXMgb24gcmVhZCBmb3IgcGFyaXR5IHdpdGhcbiAgICogUmVkaXMsIHdoaWNoIHJldHVybnMgYSBmcmVzaCBKU09OIGNsb25lKS4gQ2FsbGVycyBtYXkgc3RpbGwgdHJlYXQgcmVzdWx0cyBhc1xuICAgKiBpbW11dGFibGUsIGJ1dCBkb2luZyBzbyBpcyBubyBsb25nZXIgbG9hZC1iZWFyaW5nIGZvciBjYWNoZSBpbnRlZ3JpdHkuXG4gICAqL1xuICBhc3luYyBnZXQ8VD4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5yZWRpcykge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLnJlZGlzLmdldChmayk7XG4gICAgICAgIGlmICghcmF3KSB7IHRoaXMubWV0cmljcy5taXNzZXMrKzsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgdGhpcy5tZXRyaWNzLmhpdHMrKztcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBUO1xuICAgICAgfVxuXG4gICAgICAvLyBJbi1tZW1vcnlcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tZW1vcnkuZ2V0KGZrKTtcbiAgICAgIGlmICghZW50cnkpIHsgdGhpcy5tZXRyaWNzLm1pc3NlcysrOyByZXR1cm4gbnVsbDsgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIExSVSB0b3VjaDogZGVsZXRlICsgcmUtaW5zZXJ0IG1vdmVzIHRoaXMga2V5IHRvIHRoZSBuZXdlc3QgcG9zaXRpb25cbiAgICAgIC8vIChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciksIHNvIGBzZXRgJ3Mgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIGlzIGFcbiAgICAgIC8vIHRydWUgbGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiByYXRoZXIgdGhhbiBmaXJzdC1pbnNlcnRlZCAoRklGTykuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCBlbnRyeSk7XG4gICAgICB0aGlzLm1ldHJpY3MuaGl0cysrO1xuICAgICAgLy8gQ2xvbmUgc28gYSBjYWxsZXIgbXV0YXRpbmcgdGhlIHJlc3VsdCBjYW4ndCBjb3JydXB0IHRoZSBzaGFyZWQgZW50cnkuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShlbnRyeS52YWx1ZSkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjYWNoZWQgdmFsdWUgd2l0aCBvcHRpb25hbCBUVEwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5KVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZSAobXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZSBmb3IgUmVkaXMpXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gVFRMIG92ZXJyaWRlICh1c2VzIGRlZmF1bHQgaWYgbm90IHByb3ZpZGVkKVxuICAgKi9cbiAgYXN5bmMgc2V0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgdHRsU2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZrID0gdGhpcy5mdWxsS2V5KGtleSk7XG4gICAgY29uc3QgdHRsID0gdHRsU2Vjb25kcyA/PyB0aGlzLmRlZmF1bHRUdGxNcyAvIDEwMDA7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5tZXRyaWNzLnNldHMrKztcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuc2V0KGZrLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSksICdFWCcsIHR0bCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW4tbWVtb3J5IOKAlCBhIHdyaXRlIGNvdW50cyBhcyBhIHVzZSwgc28gZHJvcCBhbnkgZXhpc3RpbmcgZW50cnkgZmlyc3RcbiAgICAgIC8vIGFuZCByZS1pbnNlcnQgYmVsb3cgYXMgdGhlIG5ld2VzdCAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLiBUaGlzXG4gICAgICAvLyBrZWVwcyB0aGUgTWFwIG9yZGVyZWQgb2xkZXN0LVVTRUQg4oaSIG5ld2VzdC1VU0VEIHNvIHRoZSBldmljdGlvbiBiZWxvdyBpc1xuICAgICAgLy8gdHJ1ZSBMUlUsIGFuZCBhdm9pZHMgZXZpY3RpbmcgYSB2aWN0aW0gd2hlbiBtZXJlbHkgdXBkYXRpbmcgYSBrZXkuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgaWYgKHRoaXMubWVtb3J5LnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tZW1vcnkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLm1lbW9yeS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bCAqIDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIHNldCBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWNoZWQgdmFsdWUuXG4gICAqL1xuICBhc3luYyBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXMuZGVsKGZrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdkZWwnLCBrZXkpO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ2RlbCcsIGtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYWNoZSBkZWxldGUgZmFpbHVyZSBpcyBub24tZmF0YWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBhbGwga2V5cyBtYXRjaGluZyBhIHBhdHRlcm4gKGUuZy4sICdvcmcxMjM6KicpLlxuICAgKiBVc2VzIFNDQU4gZm9yIFJlZGlzIChub24tYmxvY2tpbmcpIHdpdGggS0VZUyBmYWxsYmFjaywgb3IgcmVnZXggZm9yIGluLW1lbW9yeS5cbiAgICovXG4gIGFzeW5jIGludmFsaWRhdGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgZnAgPSB0aGlzLmZ1bGxLZXkocGF0dGVybik7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMucmVkaXMpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHRoaXMucmVkaXMuc2NhblN0cmVhbVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5zY2FuS2V5cyhmcClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMucmVkaXMua2V5cyhmcCk7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZGlzLmRlbCguLi5rZXlzKTtcbiAgICAgICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIC8vIEluLW1lbW9yeSDigJQgYXBwbHkgbG9jYWxseSwgdGhlbiBmYW4gb3V0IHRvIHRoZSBvdGhlciByZXBsaWNhcy5cbiAgICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmFwcGx5TG9jYWxJbnZhbGlkYXRpb24oJ3BhdHRlcm4nLCBwYXR0ZXJuKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdwYXR0ZXJuJywgcGF0dGVybik7XG4gICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBkZWxldGVkO1xuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKiogQ29sbGVjdCBrZXlzIHZpYSBSZWRpcyBTQ0FOIChub24tYmxvY2tpbmcgYWx0ZXJuYXRpdmUgdG8gS0VZUykuICovXG4gIHByaXZhdGUgc2NhbktleXMocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnJlZGlzIS5zY2FuU3RyZWFtISh7IG1hdGNoOiBwYXR0ZXJuLCBjb3VudDogMTAwIH0pO1xuICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIHN0cmVhbS5vbignZGF0YScsIChiYXRjaDogc3RyaW5nW10pID0+IGtleXMucHVzaCguLi5iYXRjaCkpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2VuZCcsICgpID0+IHJlc29sdmUoa2V5cykpO1xuICAgICAgc3RyZWFtLm9uY2UoJ2Vycm9yJywgcmVqZWN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY29tcHV0ZTogcmV0dXJucyBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgY2FsbHMgdGhlXG4gICAqIGZhY3RvcnkgZnVuY3Rpb24sIGNhY2hlcyB0aGUgcmVzdWx0LCBhbmQgcmV0dXJucyBpdC5cbiAgICpcbiAgICogU2luZ2xlLWZsaWdodCAvIHN0YW1wZWRlIHByb3RlY3Rpb246IHdoZW4gTiBjYWxsZXJzIG1pc3MgY29uY3VycmVudGx5IGZvclxuICAgKiB0aGUgc2FtZSBrZXksIG9ubHkgT05FIGBmYWN0b3J5KClgIHJ1bnMg4oCUIHRoZSByZXN0IGF3YWl0IGl0cyBzaGFyZWQgcHJvbWlzZS5cbiAgICogVGhlIGluLWZsaWdodCBlbnRyeSBpcyBjbGVhcmVkIG9uY2UgaXQgc2V0dGxlcyAoc3VjY2VzcyBvciBmYWlsdXJlKSwgc28gYVxuICAgKiBmYWlsZWQgZmFjdG9yeSBkb2Vzbid0IHBvaXNvbiBsYXRlciBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIENhY2hlIGtleVxuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEFzeW5jIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9uIGNhY2hlIG1pc3NcbiAgICogQHBhcmFtIHR0bFNlY29uZHMgLSBPcHRpb25hbCBUVEwgb3ZlcnJpZGVcbiAgICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBjb21wdXRlZCB2YWx1ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3JTZXQ8VD4oa2V5OiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IFByb21pc2U8VD4sIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCB0aGlzLmdldDxUPihrZXkpO1xuICAgIGlmIChjYWNoZWQgIT09IG51bGwpIHJldHVybiBjYWNoZWQ7XG5cbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIC8vIENvYWxlc2NlIGNvbmN1cnJlbnQgY29sZCBjYWxsZXJzIG9udG8gYSBzaW5nbGUgZmFjdG9yeSgpIGludm9jYXRpb24uIFRoZVxuICAgIC8vIGluLWZsaWdodCBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSBSQVcgdmFsdWU7IGVhY2ggYXdhaXRlciAodGhlIHByaW1hcnlcbiAgICAvLyBjYWxsZXIgYmVsb3cgQU5EIGV2ZXJ5IGNvYWxlc2NlZCBjYWxsZXIgaGVyZSkgY2xvbmVzIGl0IElOREVQRU5ERU5UTFkuXG4gICAgLy8gQ2xvbmluZyBpbnNpZGUgdGhlIGZsaWdodCBpbnN0ZWFkIHdvdWxkIGhhbmQgb25lIHNoYXJlZCBjbG9uZSB0byBhbGwgTlxuICAgIC8vIGNvYWxlc2NlZCBjYWxsZXJzLCBzbyBvbmUgY2FsbGVyIG11dGF0aW5nIGl0cyBcImluZGVwZW5kZW50XCIgcmVzdWx0IHdvdWxkXG4gICAgLy8gY29ycnVwdCB3aGF0IHRoZSBvdGhlcnMgcmVhZCDigJQgdGhlIGV4YWN0IGZvb3RndW4gZ2V0KCkncyBjbG9uZS1vbi1yZWFkXG4gICAgLy8gcHJldmVudHMuIChSZWRpcyBiYWNrZW5kIGlzIHVuYWZmZWN0ZWQ6IHNldCBzZXJpYWxpemVzLCBnZXQgSlNPTi5wYXJzZXMuKVxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspIGFzIFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBleGlzdGluZyk7XG5cbiAgICBjb25zdCBnZW5lcmF0aW9uQXRTdGFydCA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICAvLyBBbiBpbnZhbGlkYXRpb24gKGhlcmUgb3Igb24gYW5vdGhlciByZXBsaWNhKSBsYW5kZWQgd2hpbGUgdGhlIGZhY3RvcnlcbiAgICAgIC8vIHJhbjogaXRzIHJlYWQgbWF5IHByZWRhdGUgdGhhdCB3cml0ZSwgc28gZG9uJ3QgY2FjaGUgaXQuXG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uQXRTdGFydCkgYXdhaXQgdGhpcy5zZXQoa2V5LCB2YWx1ZSwgdHRsU2Vjb25kcyk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSkoKTtcbiAgICB0aGlzLmluZmxpZ2h0LnNldChmaywgZmxpZ2h0KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNsb25lVmFsdWUoYXdhaXQgZmxpZ2h0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodC5kZWxldGUoZmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyAodXNlZnVsIGZvciB0ZXN0aW5nKS5cbiAgICovXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnJlZGlzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludmFsaWRhdGVQYXR0ZXJuKCcqJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdjbGVhcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdXJyZW50IGluLW1lbW9yeSBjYWNoZSBzaXplIChmb3IgZGlhZ25vc3RpY3MpLiAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeS5zaXplO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGUgc2VydmljZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gTmFtZXNwYWNlIHByZWZpeCAoZS5nLiwgJ2NvbXBsaWFuY2U6JywgJ3BsdWdpbjonKVxuICogQHBhcmFtIGRlZmF1bHRUdGxTZWNvbmRzIC0gRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDAgPSA1IG1pbilcbiAqIEBwYXJhbSByZWRpcyAtIE9wdGlvbmFsIFJlZGlzIGNsaWVudCBmb3IgY3Jvc3MtcHJvY2VzcyBjYWNoaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYWNoZVNlcnZpY2UoXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZWZhdWx0VHRsU2Vjb25kcyA9IDMwMCxcbiAgcmVkaXM/OiBSZWRpc0NhY2hlQ2xpZW50LFxuKTogQ2FjaGVTZXJ2aWNlIHtcbiAgcmV0dXJuIG5ldyBDYWNoZVNlcnZpY2UoeyBwcmVmaXgsIGRlZmF1bHRUdGxTZWNvbmRzLCByZWRpcyB9KTtcbn1cbiJdfQ==
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUtc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9jYWNoZS1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQVU3Qzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxVQUFVLENBQUksS0FBUTtJQUM3QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUksQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBTSxDQUFDO0lBQ2hELENBQUM7QUFDSCxDQUFDO0FBMkRELE1BQU0sMEJBQTBCLEdBQUcsa0JBQWtCLENBQUM7QUFFdEQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLCtCQUErQixDQUFDLFNBQWtDO0lBQ2hGLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN6QyxNQUFNLGVBQWUsR0FBbUQsRUFBRSxDQUFDO0lBQzNFLE1BQU0sY0FBYyxHQUFzQixFQUFFLENBQUM7SUFFN0MsTUFBTSxNQUFNLEdBQUcs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QUksSUFBSSxDQUFDLFVBQVUsS0FBSyxpQkFBaUI7Z0JBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQztZQUNILE9BQU8sVUFBVSxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxpQkFBaUIsR0FBRyxHQUFHO0lBQ3hFLE9BQU8sSUFBSSxZQUFZLENBQUMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBMaWdodHdlaWdodCBjYWNoaW5nIHNlcnZpY2Ugd2l0aCBUVEwgc3VwcG9ydC5cbiAqXG4gKiBTdG9yYWdlIGlzIGEgcGVyLXByb2Nlc3MgdHJ1ZS1MUlUgTWFwIChubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMpLlxuICpcbiAqIENyb3NzLXJlcGxpY2EgaW52YWxpZGF0aW9uOiBldmVyeSBzZXJ2aWNlIHJ1bnMgc2V2ZXJhbFxuICogcmVwbGljYXMgKEhQQSksIGVhY2ggd2l0aCBpdHMgT1dOIGluLW1lbW9yeSBjYWNoZS4gQW4gaW52YWxpZGF0aW9uIHBlcmZvcm1lZCBvblxuICogb25lIHBvZCAoYGRlbGAgLyBgaW52YWxpZGF0ZVBhdHRlcm5gIC8gYGNsZWFyYCkgaXMgYnJvYWRjYXN0IG92ZXIgUmVkaXMgcHViL3N1YlxuICogKHtAbGluayBDYWNoZUludmFsaWRhdGlvbkJ1c30sIHdpcmVkIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IGJ5IGRlZmF1bHQpIGFuZFxuICogYXBwbGllZCBieSBldmVyeSBvdGhlciBwb2QsIHNvIGEgd3JpdGUgb24gcG9kIEEgY2FuJ3QgbGVhdmUgcG9kIEIgc2VydmluZyB0aGVcbiAqIHN0YWxlIGVudHJ5IHVudGlsIGl0cyBUVEwgbGFwc2VzLiBBIHBvZCB3aG9zZSBzdWJzY3JpYmVyIChyZSljb25uZWN0cyBmbHVzaGVzXG4gKiBpdHMgbG9jYWwgY2FjaGUg4oCUIGl0IG1heSBoYXZlIG1pc3NlZCBpbnZhbGlkYXRpb25zIHdoaWxlIGRpc2Nvbm5lY3RlZCDigJQgYW5kIGFcbiAqIGBnZXRPclNldGAgd2hvc2UgZmFjdG9yeSByYWNlZCBhbiBpbnZhbGlkYXRpb24gZG9lcyBub3QgY2FjaGUgaXRzIHJlc3VsdC5cbiAqXG4gKiBEZXNpZ246XG4gKiAtIEFsbCBvcGVyYXRpb25zIGFyZSBmYWlsLXNhZmU6IGNhY2hlIG1pc3Nlcy9lcnJvcnMgcmV0dXJuIG51bGwsIG5ldmVyIHRocm93XG4gKiAtIFJlYWRzIGRlZXAtY2xvbmUsIHNvIGV2ZXJ5IGNhbGxlciBnZXRzIGFuIGluZGVwZW5kZW50IGNvcHkgKG11dGF0aW5nIGFcbiAqICAgcmVzdWx0IGlzIGFsd2F5cyBzYWZlKVxuICogLSBgZ2V0T3JTZXRgIGlzIHNpbmdsZS1mbGlnaHQ6IGNvbmN1cnJlbnQgbWlzc2VzIHNoYXJlIG9uZSBmYWN0b3J5KCkgY2FsbFxuICogLSBLZXkgbmFtZXNwYWNlIHByZWZpeGluZyB0byBhdm9pZCBjb2xsaXNpb25zIGJldHdlZW4gc2VydmljZXNcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICcuL2Vudi1yZWRpcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY2FjaGUtc2VydmljZScpO1xuXG4vKipcbiAqIENhY2hlIGVudHJ5IHdpdGggdmFsdWUgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAqL1xuaW50ZXJmYWNlIENhY2hlRW50cnk8VD4ge1xuICB2YWx1ZTogVDtcbiAgZXhwaXJlc0F0OiBudW1iZXI7IC8vIFVuaXggdGltZXN0YW1wIGluIG1zXG59XG5cbi8qKlxuICogRGVlcC1jbG9uZSBhIHZhbHVlIHNvIHRoZSBjYWNoZSBoYW5kcyBiYWNrIGFuIElOREVQRU5ERU5UIGNvcHkgb24gZXZlcnkgcmVhZC5cbiAqIFdpdGhvdXQgdGhpcyBpdCByZXR1cm5zIHRoZSBzYW1lIHN0b3JlZCBvYmplY3QgcmVmZXJlbmNlLCBzbyBhIGNvbnN1bWVyXG4gKiBtdXRhdGluZyBhIFwiY2FjaGVkXCIgb2JqZWN0IHNpbGVudGx5IGNvcnJ1cHRzIHRoZSBzaGFyZWQgY2FjaGUuXG4gKlxuICogUHJpbWl0aXZlcyBhcmUgcmV0dXJuZWQgYXMtaXMuIFByZWZlcnMgdGhlIHN0cnVjdHVyZWQtY2xvbmUgYWxnb3JpdGhtOyBmYWxsc1xuICogYmFjayB0byBhIEpTT04gcm91bmQtdHJpcCBvbiBvbGRlciBydW50aW1lcyBvciBleG90aWMgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjbG9uZVZhbHVlPFQ+KHZhbHVlOiBUKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgYXMgVDtcbiAgfVxufVxuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMga2V5L3ZhbHVlIGNsaWVudCBzdXJmYWNlIChzdWJzZXQgb2YgaW9yZWRpcykgc2hhcmVkIGJ5IHRoZVxuICogdG9rZW4tcmV2b2NhdGlvbiBwdWJsaXNoZXIvcmVhZGVyIGFuZCBwbGF0Zm9ybSdzIFJlZGlzIGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNDYWNoZUNsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZGVsKC4uLmtleXM6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlQ29uZmlnIHtcbiAgLyoqIEtleSBwcmVmaXggZm9yIG5hbWVzcGFjZSBpc29sYXRpb24gKGUuZy4sICdwbHVnaW46JywgJ2NvbXBsaWFuY2U6JykgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0IFRUTCBpbiBzZWNvbmRzICovXG4gIGRlZmF1bHRUdGxTZWNvbmRzOiBudW1iZXI7XG4gIC8qKiBNYXggZW50cmllcyBmb3IgdGhlIGNhY2hlIChkZWZhdWx0IDEwMDApICovXG4gIG1heEVudHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBDcm9zcy1yZXBsaWNhIGludmFsaWRhdGlvbiBidXMuIE9taXQgdG8gdXNlIHRoZSBzaGFyZWQgZW52LVJlZGlzIGJ1cyAobnVsbFxuICAgKiB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQg4oaSIHNpbmdsZS1wcm9jZXNzIHNlbWFudGljcyk7IHBhc3MgYG51bGxgIHRvXG4gICAqIGRpc2FibGUgZXhwbGljaXRseS5cbiAgICovXG4gIGludmFsaWRhdGlvbkJ1cz86IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbDtcbn1cblxuLyoqIE9uZSBpbnZhbGlkYXRpb24gYnJvYWRjYXN0IHRvIGV2ZXJ5IHJlcGxpY2EuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSB7XG4gIC8qKiBJZCBvZiB0aGUgQ2FjaGVTZXJ2aWNlIGluc3RhbmNlIHRoYXQgaW52YWxpZGF0ZWQgKGl0IGlnbm9yZXMgaXRzIG93biBlY2hvKS4gKi9cbiAgb3JpZ2luOiBzdHJpbmc7XG4gIC8qKiBUaGUgY2FjaGUgbmFtZXNwYWNlIChgQ2FjaGVDb25maWcucHJlZml4YCkgdGhlIGludmFsaWRhdGlvbiBhcHBsaWVzIHRvLiAqL1xuICBwcmVmaXg6IHN0cmluZztcbiAgb3A6ICdkZWwnIHwgJ3BhdHRlcm4nIHwgJ2NsZWFyJztcbiAgLyoqIFVuLXByZWZpeGVkIGtleSAoYGRlbGApIG9yIGdsb2IgcGF0dGVybiAoYHBhdHRlcm5gKS4gKi9cbiAga2V5Pzogc3RyaW5nO1xufVxuXG4vKiogVHJhbnNwb3J0IHRoYXQgZmFucyBjYWNoZSBpbnZhbGlkYXRpb25zIG91dCB0byBldmVyeSByZXBsaWNhLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWNoZUludmFsaWRhdGlvbkJ1cyB7XG4gIC8qKiBGaXJlLWFuZC1mb3JnZXQgYnJvYWRjYXN0LiBOZXZlciB0aHJvd3MuICovXG4gIHB1Ymxpc2gobXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UpOiB2b2lkO1xuICAvKipcbiAgICogUmVnaXN0ZXIgaGFuZGxlcnMuIGBvbk1lc3NhZ2VgIHJlY2VpdmVzIGV2ZXJ5IGJyb2FkY2FzdCAoaW5jbHVkaW5nIHRoaXNcbiAgICogcHJvY2VzcydzIG93bik7IGBvblJlc3luY2AgZmlyZXMgd2hlbmV2ZXIgdGhlIHN1YnNjcmlwdGlvbiBpcyAocmUpZXN0YWJsaXNoZWQsXG4gICAqIGkuZS4gd2hlbmV2ZXIgaW52YWxpZGF0aW9ucyBtYXkgaGF2ZSBiZWVuIG1pc3NlZC5cbiAgICovXG4gIHN1YnNjcmliZShvbk1lc3NhZ2U6IChtc2c6IENhY2hlSW52YWxpZGF0aW9uTWVzc2FnZSkgPT4gdm9pZCwgb25SZXN5bmM6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKiogTWluaW1hbCBpb3JlZGlzIHB1Yi9zdWIgc3VyZmFjZSB0aGUgZW52IGJ1cyBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQge1xuICBwdWJsaXNoKGNoYW5uZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICBzdWJzY3JpYmUoLi4uY2hhbm5lbHM6IHN0cmluZ1tdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgb24oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHVua25vd247XG4gIGR1cGxpY2F0ZSgpOiBSZWRpc0ludmFsaWRhdGlvbkNsaWVudDtcbiAgc3RhdHVzPzogc3RyaW5nO1xufVxuXG5jb25zdCBDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCA9ICdjYWNoZTppbnZhbGlkYXRlJztcblxuLyoqXG4gKiBSZWRpcyBwdWIvc3ViIGludmFsaWRhdGlvbiBidXMuIFBVQkxJU0ggb24gdGhlIGdpdmVuIGNsaWVudDsgU1VCU0NSSUJFIG9uIGFcbiAqIGBkdXBsaWNhdGUoKWAgKGEgc3Vic2NyaWJlZCBpb3JlZGlzIGNvbm5lY3Rpb24gY2FuJ3QgcnVuIG90aGVyIGNvbW1hbmRzKS5cbiAqXG4gKiBUaGUgU1VCU0NSSUJFIGlzIGlzc3VlZCBvbiBldmVyeSBgcmVhZHlgIChpbml0aWFsIGNvbm5lY3QgQU5EIGVhY2ggcmVjb25uZWN0KVxuICogcmF0aGVyIHRoYW4gb25jZSBhdCBjb25zdHJ1Y3Rpb246IHRoZSBlbnYgY2xpZW50IHJ1bnMgd2l0aG91dCBhbiBvZmZsaW5lXG4gKiBxdWV1ZSwgc28gYSBzdWJzY3JpYmUgaXNzdWVkIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcyB1cCBpcyByZWplY3RlZCBhbmQgd291bGRcbiAqIG5ldmVyIGJlIHJldHJpZWQuIEVhY2ggYHJlYWR5YCBhbHNvIHRyaWdnZXJzIGBvblJlc3luY2Agc28gZXZlcnkgY2FjaGUgZmx1c2hlc1xuICogd2hhdGV2ZXIgaXQgbWF5IGhhdmUgbWlzc2VkIHdoaWxlIGRpc2Nvbm5lY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzQ2FjaGVJbnZhbGlkYXRpb25CdXMocHVibGlzaGVyOiBSZWRpc0ludmFsaWRhdGlvbkNsaWVudCk6IENhY2hlSW52YWxpZGF0aW9uQnVzIHtcbiAgY29uc3Qgc3Vic2NyaWJlciA9IHB1Ymxpc2hlci5kdXBsaWNhdGUoKTtcbiAgY29uc3QgbWVzc2FnZUhhbmRsZXJzOiBBcnJheTwobXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UpID0+IHZvaWQ+ID0gW107XG4gIGNvbnN0IHJlc3luY0hhbmRsZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIGNvbnN0IHJlc3luYyA9ICgpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGggb2YgcmVzeW5jSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7IGgoKTsgfSBjYXRjaCB7IC8qIGlzb2xhdGVkICovIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGRvU3Vic2NyaWJlID0gKCk6IHZvaWQgPT4ge1xuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKHN1YnNjcmliZXIuc3Vic2NyaWJlKENBQ0hFX0lOVkFMSURBVElPTl9DSEFOTkVMKSlcbiAgICAgIC50aGVuKCgpID0+IHJlc3luYygpKVxuICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgZW1pdENvdW50ZXIoJ2NhY2hlX2ludmFsaWRhdGlvbl9zdWJzY3JpYmVfZmFpbGVkX3RvdGFsJywge30pO1xuICAgICAgICBsb2dnZXIud2FybignQ2FjaGUgaW52YWxpZGF0aW9uIHN1YnNjcmliZSBmYWlsZWQ7IHdpbGwgcmV0cnkgb24gbmV4dCByZWNvbm5lY3QnLCB7XG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfTtcblxuICBzdWJzY3JpYmVyLm9uKCdtZXNzYWdlJywgKGNoYW5uZWw6IHN0cmluZywgcmF3OiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY2hhbm5lbCAhPT0gQ0FDSEVfSU5WQUxJREFUSU9OX0NIQU5ORUwpIHJldHVybjtcbiAgICBsZXQgbXNnOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdHJ5IHtcbiAgICAgIG1zZyA9IEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaCBvZiBtZXNzYWdlSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7IGgobXNnKTsgfSBjYXRjaCB7IC8qIG9uZSBjYWNoZSBjYW4ndCBicmVhayB0aGUgb3RoZXJzICovIH1cbiAgICB9XG4gIH0pO1xuICBzdWJzY3JpYmVyLm9uKCdyZWFkeScsIGRvU3Vic2NyaWJlKTtcbiAgc3Vic2NyaWJlci5vbignZXJyb3InLCAoZTogdW5rbm93bikgPT5cbiAgICBsb2dnZXIud2FybignQ2FjaGUgaW52YWxpZGF0aW9uIHN1YnNjcmliZXIgZXJyb3InLCB7IGVycm9yOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkgfSkpO1xuICBpZiAoc3Vic2NyaWJlci5zdGF0dXMgPT09ICdyZWFkeScpIGRvU3Vic2NyaWJlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoKG1zZykge1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAudGhlbigoKSA9PiBwdWJsaXNoZXIucHVibGlzaChDQUNIRV9JTlZBTElEQVRJT05fQ0hBTk5FTCwgSlNPTi5zdHJpbmdpZnkobXNnKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2NhY2hlX2ludmFsaWRhdGlvbl9wdWJsaXNoX2ZhaWxlZF90b3RhbCcsIHsgcHJlZml4OiBtc2cucHJlZml4IH0pO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdDYWNoZSBpbnZhbGlkYXRpb24gcHVibGlzaCBmYWlsZWQgKG90aGVyIHJlcGxpY2FzIGtlZXAgdGhlIGVudHJ5IHVudGlsIFRUTCknLCB7XG4gICAgICAgICAgICBwcmVmaXg6IG1zZy5wcmVmaXgsIG9wOiBtc2cub3AsIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKG9uTWVzc2FnZSwgb25SZXN5bmMpIHtcbiAgICAgIG1lc3NhZ2VIYW5kbGVycy5wdXNoKG9uTWVzc2FnZSk7XG4gICAgICByZXN5bmNIYW5kbGVycy5wdXNoKG9uUmVzeW5jKTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyB1bmRlZmluZWQgPSBub3QgeWV0IGF0dGVtcHRlZDsgbnVsbCA9IGF0dGVtcHRlZCwgUmVkaXMgbm90IGNvbmZpZ3VyZWQuXG5sZXQgZW52SW52YWxpZGF0aW9uQnVzOiBDYWNoZUludmFsaWRhdGlvbkJ1cyB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbi8qKiBQcm9jZXNzLXdpZGUgaW52YWxpZGF0aW9uIGJ1cyBmcm9tIHRoZSBhbWJpZW50IFJlZGlzIGVudiAobnVsbCB3aXRob3V0IFJlZGlzKS4gKi9cbmZ1bmN0aW9uIGdldEVudkNhY2hlSW52YWxpZGF0aW9uQnVzKCk6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbCB7XG4gIGlmIChlbnZJbnZhbGlkYXRpb25CdXMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzSW52YWxpZGF0aW9uQ2xpZW50PignY2FjaGUtaW52YWxpZGF0aW9uJyk7XG4gICAgZW52SW52YWxpZGF0aW9uQnVzID0gY2xpZW50ID8gY3JlYXRlUmVkaXNDYWNoZUludmFsaWRhdGlvbkJ1cyhjbGllbnQpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gZW52SW52YWxpZGF0aW9uQnVzO1xufVxuXG4vKipcbiAqIENhY2hlIHNlcnZpY2Ugd2l0aCBnZXQvc2V0L2RlbCBvcGVyYXRpb25zIGFuZCBhdXRvbWF0aWMgVFRMIGV4cGlyeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2FjaGUgPSBuZXcgQ2FjaGVTZXJ2aWNlKHsgcHJlZml4OiAncGx1Z2luOicsIGRlZmF1bHRUdGxTZWNvbmRzOiAzMDAgfSk7XG4gKlxuICogLy8gU2V0IHdpdGggZGVmYXVsdCBUVExcbiAqIGF3YWl0IGNhY2hlLnNldCgnb3JnMTIzOmxpc3QnLCBwbHVnaW5zKTtcbiAqXG4gKiAvLyBHZXQgKHJldHVybnMgbnVsbCBvbiBtaXNzKVxuICogY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGUuZ2V0PFBsdWdpbltdPignb3JnMTIzOmxpc3QnKTtcbiAqXG4gKiAvLyBJbnZhbGlkYXRlXG4gKiBhd2FpdCBjYWNoZS5kZWwoJ29yZzEyMzpsaXN0Jyk7XG4gKlxuICogLy8gSW52YWxpZGF0ZSBieSBwYXR0ZXJuXG4gKiBhd2FpdCBjYWNoZS5pbnZhbGlkYXRlUGF0dGVybignb3JnMTIzOionKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQ2FjaGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBtZW1vcnkgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeTx1bmtub3duPj4oKTtcbiAgLyoqXG4gICAqIEluLWZsaWdodCBgZ2V0T3JTZXRgIGZhY3RvcnkgcHJvbWlzZXMsIGtleWVkIGJ5IGZ1bGwgY2FjaGUga2V5LiBDb2FsZXNjZXNcbiAgICogY29uY3VycmVudCBjb2xkIGNhbGxlcnMgb250byBhIHNpbmdsZSBgZmFjdG9yeSgpYCBpbnZvY2F0aW9uIChzaW5nbGUtZmxpZ2h0XG4gICAqIC8gc3RhbXBlZGUgcHJvdGVjdGlvbik7IGVudHJpZXMgYXJlIGNsZWFyZWQgb25jZSB0aGUgcHJvbWlzZSBzZXR0bGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmZsaWdodCA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHVua25vd24+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRUdGxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEVudHJpZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBidXM6IENhY2hlSW52YWxpZGF0aW9uQnVzIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZUlkID0gcmFuZG9tVVVJRCgpO1xuICAvKipcbiAgICogQnVtcGVkIG9uIEVWRVJZIGludmFsaWRhdGlvbiAobG9jYWwgb3IgcmVtb3RlKS4gYGdldE9yU2V0YCBvbmx5IGNhY2hlcyBhXG4gICAqIGZhY3RvcnkgcmVzdWx0IGlmIG5vIGludmFsaWRhdGlvbiBoYXBwZW5lZCB3aGlsZSB0aGUgZmFjdG9yeSByYW4g4oCUIG90aGVyd2lzZVxuICAgKiBpdCBjb3VsZCByZS1jYWNoZSBhIHZhbHVlIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSB0aGF0IGludmFsaWRhdGVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0aW9uID0gMDtcblxuICAvKiogQ2FjaGUgbWV0cmljcyDigJQgdHJhY2tzIGhpdHMsIG1pc3NlcywgYW5kIGludmFsaWRhdGlvbnMuICovXG4gIHJlYWRvbmx5IG1ldHJpY3MgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgc2V0czogMCwgaW52YWxpZGF0aW9uczogMCB9O1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ2FjaGVDb25maWcpIHtcbiAgICB0aGlzLnByZWZpeCA9IGNvbmZpZy5wcmVmaXg7XG4gICAgdGhpcy5kZWZhdWx0VHRsTXMgPSBjb25maWcuZGVmYXVsdFR0bFNlY29uZHMgKiAxMDAwO1xuICAgIHRoaXMubWF4RW50cmllcyA9IGNvbmZpZy5tYXhFbnRyaWVzID8/IDEwMDA7XG4gICAgdGhpcy5idXMgPSBjb25maWcuaW52YWxpZGF0aW9uQnVzID09PSB1bmRlZmluZWQgPyBnZXRFbnZDYWNoZUludmFsaWRhdGlvbkJ1cygpIDogY29uZmlnLmludmFsaWRhdGlvbkJ1cztcbiAgICB0aGlzLmJ1cz8uc3Vic2NyaWJlKFxuICAgICAgKG1zZykgPT4ge1xuICAgICAgICBpZiAobXNnLm9yaWdpbiA9PT0gdGhpcy5pbnN0YW5jZUlkIHx8IG1zZy5wcmVmaXggIT09IHRoaXMucHJlZml4KSByZXR1cm47XG4gICAgICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbihtc2cub3AsIG1zZy5rZXkpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEJyb2FkY2FzdCBhbiBpbnZhbGlkYXRpb24gdG8gdGhlIG90aGVyIHJlcGxpY2FzLiAqL1xuICBwcml2YXRlIGJyb2FkY2FzdChvcDogQ2FjaGVJbnZhbGlkYXRpb25NZXNzYWdlWydvcCddLCBrZXk/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJ1cz8ucHVibGlzaCh7IG9yaWdpbjogdGhpcy5pbnN0YW5jZUlkLCBwcmVmaXg6IHRoaXMucHJlZml4LCBvcCwgLi4uKGtleSAhPT0gdW5kZWZpbmVkICYmIHsga2V5IH0pIH0pO1xuICB9XG5cbiAgLyoqIEFwcGx5IGFuIGludmFsaWRhdGlvbiB0byBUSElTIHByb2Nlc3MncyBpbi1tZW1vcnkgZW50cmllcy4gUmV0dXJucyB0aGUgY291bnQgcmVtb3ZlZC4gKi9cbiAgcHJpdmF0ZSBhcHBseUxvY2FsSW52YWxpZGF0aW9uKG9wOiBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2VbJ29wJ10sIGtleT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgdGhpcy5nZW5lcmF0aW9uKys7XG4gICAgaWYgKG9wID09PSAnY2xlYXInKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5tZW1vcnkuc2l6ZTtcbiAgICAgIHRoaXMubWVtb3J5LmNsZWFyKCk7XG4gICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgaWYgKG9wID09PSAnZGVsJykge1xuICAgICAgcmV0dXJuIHRoaXMubWVtb3J5LmRlbGV0ZSh0aGlzLmZ1bGxLZXkoa2V5ID8/ICcnKSkgPyAxIDogMDtcbiAgICB9XG4gICAgLy8gR2xvYiBwYXR0ZXJuLiBFc2NhcGUgcmVnZXggbWV0YWNoYXJhY3RlcnMgZmlyc3Qgc28gYSBsaXRlcmFsIGAuYC9gKGAvYFtgXG4gICAgLy8gaW4gYSBrZXkgcHJlZml4IChlLmcuIGBvcmc6djEuMjoqYCkgY2FuJ3Qgb3Zlci1tYXRjaCBvciB0aHJvdyAoYSB0aHJvd1xuICAgIC8vIGhlcmUgd291bGQgbGVhdmUgZW50cmllcyBzdGFsZSk7IG9ubHkgYCpgIGlzIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZC5cbiAgICBjb25zdCBmcCA9IHRoaXMuZnVsbEtleShrZXkgPz8gJycpO1xuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXicgKyBmcC5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpLnJlcGxhY2UoL1xcXFxcXCovZywgJy4qJykgKyAnJCcpO1xuICAgIGxldCBkZWxldGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IGsgb2YgdGhpcy5tZW1vcnkua2V5cygpKSB7XG4gICAgICBpZiAocmVnZXgudGVzdChrKSkge1xuICAgICAgICB0aGlzLm1lbW9yeS5kZWxldGUoayk7XG4gICAgICAgIGRlbGV0ZWQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlbGV0ZWQ7XG4gIH1cblxuICBwcml2YXRlIGZ1bGxLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH0ke2tleX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNhY2hlZCB2YWx1ZS4gUmV0dXJucyBudWxsIG9uIG1pc3Mgb3IgZXJyb3IuXG4gICAqXG4gICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbiBJTkRFUEVOREVOVCBkZWVwIGNvcHkg4oCUIG11dGF0aW5nIGl0IG5ldmVyIGFmZmVjdHNcbiAgICogdGhlIGNhY2hlZCBlbnRyeS5cbiAgICovXG4gIGFzeW5jIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5tZW1vcnkuZ2V0KGZrKTtcbiAgICAgIGlmICghZW50cnkpIHsgdGhpcy5tZXRyaWNzLm1pc3NlcysrOyByZXR1cm4gbnVsbDsgfVxuICAgICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgdGhpcy5tZW1vcnkuZGVsZXRlKGZrKTtcbiAgICAgICAgdGhpcy5tZXRyaWNzLm1pc3NlcysrO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIExSVSB0b3VjaDogZGVsZXRlICsgcmUtaW5zZXJ0IG1vdmVzIHRoaXMga2V5IHRvIHRoZSBuZXdlc3QgcG9zaXRpb25cbiAgICAgIC8vIChNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciksIHNvIGBzZXRgJ3Mgb2xkZXN0LWZpcnN0IGV2aWN0aW9uIGlzIGFcbiAgICAgIC8vIHRydWUgbGVhc3QtcmVjZW50bHktVVNFRCBldmljdGlvbiByYXRoZXIgdGhhbiBmaXJzdC1pbnNlcnRlZCAoRklGTykuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgdGhpcy5tZW1vcnkuc2V0KGZrLCBlbnRyeSk7XG4gICAgICB0aGlzLm1ldHJpY3MuaGl0cysrO1xuICAgICAgLy8gQ2xvbmUgc28gYSBjYWxsZXIgbXV0YXRpbmcgdGhlIHJlc3VsdCBjYW4ndCBjb3JydXB0IHRoZSBzaGFyZWQgZW50cnkuXG4gICAgICByZXR1cm4gY2xvbmVWYWx1ZShlbnRyeS52YWx1ZSkgYXMgVDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubWV0cmljcy5taXNzZXMrKztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjYWNoZWQgdmFsdWUgd2l0aCBvcHRpb25hbCBUVEwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXkgKHByZWZpeCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5KVxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjYWNoZVxuICAgKiBAcGFyYW0gdHRsU2Vjb25kcyAtIFRUTCBvdmVycmlkZSAodXNlcyBkZWZhdWx0IGlmIG5vdCBwcm92aWRlZClcbiAgICovXG4gIGFzeW5jIHNldDxUPihrZXk6IHN0cmluZywgdmFsdWU6IFQsIHR0bFNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmayA9IHRoaXMuZnVsbEtleShrZXkpO1xuICAgIGNvbnN0IHR0bCA9IHR0bFNlY29uZHMgPz8gdGhpcy5kZWZhdWx0VHRsTXMgLyAxMDAwO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubWV0cmljcy5zZXRzKys7XG4gICAgICAvLyBBIHdyaXRlIGNvdW50cyBhcyBhIHVzZSwgc28gZHJvcCBhbnkgZXhpc3RpbmcgZW50cnkgZmlyc3RcbiAgICAgIC8vIGFuZCByZS1pbnNlcnQgYmVsb3cgYXMgdGhlIG5ld2VzdCAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpLiBUaGlzXG4gICAgICAvLyBrZWVwcyB0aGUgTWFwIG9yZGVyZWQgb2xkZXN0LVVTRUQg4oaSIG5ld2VzdC1VU0VEIHNvIHRoZSBldmljdGlvbiBiZWxvdyBpc1xuICAgICAgLy8gdHJ1ZSBMUlUsIGFuZCBhdm9pZHMgZXZpY3RpbmcgYSB2aWN0aW0gd2hlbiBtZXJlbHkgdXBkYXRpbmcgYSBrZXkuXG4gICAgICB0aGlzLm1lbW9yeS5kZWxldGUoZmspO1xuICAgICAgaWYgKHRoaXMubWVtb3J5LnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5tZW1vcnkua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLm1lbW9yeS5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1lbW9yeS5zZXQoZmssIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bCAqIDEwMDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIENhY2hlIHNldCBmYWlsdXJlIGlzIG5vbi1mYXRhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjYWNoZWQgdmFsdWUuXG4gICAqL1xuICBhc3luYyBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5hcHBseUxvY2FsSW52YWxpZGF0aW9uKCdkZWwnLCBrZXkpO1xuICAgICAgdGhpcy5icm9hZGNhc3QoJ2RlbCcsIGtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYWNoZSBkZWxldGUgZmFpbHVyZSBpcyBub24tZmF0YWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBhbGwga2V5cyBtYXRjaGluZyBhIHBhdHRlcm4gKGUuZy4sICdvcmcxMjM6KicpLlxuICAgKiBPbmx5IGAqYCBpcyBhIHdpbGRjYXJkLlxuICAgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBhdHRlcm4ocGF0dGVybjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQXBwbHkgbG9jYWxseSwgdGhlbiBmYW4gb3V0IHRvIHRoZSBvdGhlciByZXBsaWNhcy5cbiAgICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLmFwcGx5TG9jYWxJbnZhbGlkYXRpb24oJ3BhdHRlcm4nLCBwYXR0ZXJuKTtcbiAgICAgIHRoaXMuYnJvYWRjYXN0KCdwYXR0ZXJuJywgcGF0dGVybik7XG4gICAgICB0aGlzLm1ldHJpY3MuaW52YWxpZGF0aW9ucyArPSBkZWxldGVkO1xuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIGNvbXB1dGU6IHJldHVybnMgY2FjaGVkIHZhbHVlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNhbGxzIHRoZVxuICAgKiBmYWN0b3J5IGZ1bmN0aW9uLCBjYWNoZXMgdGhlIHJlc3VsdCwgYW5kIHJldHVybnMgaXQuXG4gICAqXG4gICAqIFNpbmdsZS1mbGlnaHQgLyBzdGFtcGVkZSBwcm90ZWN0aW9uOiB3aGVuIE4gY2FsbGVycyBtaXNzIGNvbmN1cnJlbnRseSBmb3JcbiAgICogdGhlIHNhbWUga2V5LCBvbmx5IE9ORSBgZmFjdG9yeSgpYCBydW5zIOKAlCB0aGUgcmVzdCBhd2FpdCBpdHMgc2hhcmVkIHByb21pc2UuXG4gICAqIFRoZSBpbi1mbGlnaHQgZW50cnkgaXMgY2xlYXJlZCBvbmNlIGl0IHNldHRsZXMgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSksIHNvIGFcbiAgICogZmFpbGVkIGZhY3RvcnkgZG9lc24ndCBwb2lzb24gbGF0ZXIgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBDYWNoZSBrZXlcbiAgICogQHBhcmFtIGZhY3RvcnkgLSBBc3luYyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB2YWx1ZSBvbiBjYWNoZSBtaXNzXG4gICAqIEBwYXJhbSB0dGxTZWNvbmRzIC0gT3B0aW9uYWwgVFRMIG92ZXJyaWRlXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgb3IgY29tcHV0ZWQgdmFsdWVcbiAgICovXG4gIGFzeW5jIGdldE9yU2V0PFQ+KGtleTogc3RyaW5nLCBmYWN0b3J5OiAoKSA9PiBQcm9taXNlPFQ+LCB0dGxTZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5nZXQ8VD4oa2V5KTtcbiAgICBpZiAoY2FjaGVkICE9PSBudWxsKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgZmsgPSB0aGlzLmZ1bGxLZXkoa2V5KTtcbiAgICAvLyBDb2FsZXNjZSBjb25jdXJyZW50IGNvbGQgY2FsbGVycyBvbnRvIGEgc2luZ2xlIGZhY3RvcnkoKSBpbnZvY2F0aW9uLiBUaGVcbiAgICAvLyBpbi1mbGlnaHQgcHJvbWlzZSByZXNvbHZlcyB0byB0aGUgUkFXIHZhbHVlOyBlYWNoIGF3YWl0ZXIgKHRoZSBwcmltYXJ5XG4gICAgLy8gY2FsbGVyIGJlbG93IEFORCBldmVyeSBjb2FsZXNjZWQgY2FsbGVyIGhlcmUpIGNsb25lcyBpdCBJTkRFUEVOREVOVExZLlxuICAgIC8vIENsb25pbmcgaW5zaWRlIHRoZSBmbGlnaHQgaW5zdGVhZCB3b3VsZCBoYW5kIG9uZSBzaGFyZWQgY2xvbmUgdG8gYWxsIE5cbiAgICAvLyBjb2FsZXNjZWQgY2FsbGVycywgc28gb25lIGNhbGxlciBtdXRhdGluZyBpdHMgXCJpbmRlcGVuZGVudFwiIHJlc3VsdCB3b3VsZFxuICAgIC8vIGNvcnJ1cHQgd2hhdCB0aGUgb3RoZXJzIHJlYWQg4oCUIHRoZSBleGFjdCBmb290Z3VuIGdldCgpJ3MgY2xvbmUtb24tcmVhZFxuICAgIC8vIHByZXZlbnRzLlxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbmZsaWdodC5nZXQoZmspIGFzIFByb21pc2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gY2xvbmVWYWx1ZShhd2FpdCBleGlzdGluZyk7XG5cbiAgICBjb25zdCBnZW5lcmF0aW9uQXRTdGFydCA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBmbGlnaHQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBmYWN0b3J5KCk7XG4gICAgICAvLyBBbiBpbnZhbGlkYXRpb24gKGhlcmUgb3Igb24gYW5vdGhlciByZXBsaWNhKSBsYW5kZWQgd2hpbGUgdGhlIGZhY3RvcnlcbiAgICAgIC8vIHJhbjogaXRzIHJlYWQgbWF5IHByZWRhdGUgdGhhdCB3cml0ZSwgc28gZG9uJ3QgY2FjaGUgaXQuXG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uQXRTdGFydCkgYXdhaXQgdGhpcy5zZXQoa2V5LCB2YWx1ZSwgdHRsU2Vjb25kcyk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSkoKTtcbiAgICB0aGlzLmluZmxpZ2h0LnNldChmaywgZmxpZ2h0KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNsb25lVmFsdWUoYXdhaXQgZmxpZ2h0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbmZsaWdodC5kZWxldGUoZmspO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZW50cmllcyAodXNlZnVsIGZvciB0ZXN0aW5nKS5cbiAgICovXG4gIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYXBwbHlMb2NhbEludmFsaWRhdGlvbignY2xlYXInKTtcbiAgICB0aGlzLmJyb2FkY2FzdCgnY2xlYXInKTtcbiAgfVxuXG4gIC8qKiBDdXJyZW50IGluLW1lbW9yeSBjYWNoZSBzaXplIChmb3IgZGlhZ25vc3RpY3MpLiAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1lbW9yeS5zaXplO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGUgc2VydmljZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gcHJlZml4IC0gTmFtZXNwYWNlIHByZWZpeCAoZS5nLiwgJ2NvbXBsaWFuY2U6JywgJ3BsdWdpbjonKVxuICogQHBhcmFtIGRlZmF1bHRUdGxTZWNvbmRzIC0gRGVmYXVsdCBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDAgPSA1IG1pbilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhY2hlU2VydmljZShwcmVmaXg6IHN0cmluZywgZGVmYXVsdFR0bFNlY29uZHMgPSAzMDApOiBDYWNoZVNlcnZpY2Uge1xuICByZXR1cm4gbmV3IENhY2hlU2VydmljZSh7IHByZWZpeCwgZGVmYXVsdFR0bFNlY29uZHMgfSk7XG59XG4iXX0=
@@ -8,9 +8,10 @@ import { type ServiceConfig } from '../types/common.js';
8
8
  *
9
9
  * @param config - Optional service config override (defaults to COMPLIANCE_SERVICE_HOST/PORT env vars)
10
10
  * @param serviceName - Service identifier baked into the signed JWT's `sub`
11
- * (e.g. 'pipeline', 'plugin'). The compliance route requires a service
12
- * principal — a spoofable `x-internal-service: true` header is no longer
13
- * accepted. Defaults to a generic 'entity-events' when unspecified, but
14
- * callers should pass their service name for accurate audit trails.
11
+ * (e.g. 'pipeline', 'plugin'). The compliance route is an INTERNAL route: it
12
+ * admits only those two services' own signed tokens, and no user token.
13
+ * Defaults to THIS process's identity (`SERVICE_NAME`) — since #14 a service
14
+ * holds only its own signing key, so a placeholder name would mint a token no
15
+ * peer could verify.
15
16
  */
16
17
  export declare function registerComplianceEventSubscriber(config?: Partial<ServiceConfig>, serviceName?: string): void;
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { entityEvents } from './entity-events.js';
4
4
  import { InternalHttpClient } from './http-client.js';
5
+ import { serviceIdentity } from './service-keys.js';
5
6
  import { getServiceAuthHeader } from '../middleware/auth.js';
6
7
  import {} from '../types/common.js';
7
8
  import { createLogger } from '../utils/logger.js';
@@ -16,12 +17,13 @@ const logger = createLogger('compliance-events');
16
17
  *
17
18
  * @param config - Optional service config override (defaults to COMPLIANCE_SERVICE_HOST/PORT env vars)
18
19
  * @param serviceName - Service identifier baked into the signed JWT's `sub`
19
- * (e.g. 'pipeline', 'plugin'). The compliance route requires a service
20
- * principal — a spoofable `x-internal-service: true` header is no longer
21
- * accepted. Defaults to a generic 'entity-events' when unspecified, but
22
- * callers should pass their service name for accurate audit trails.
20
+ * (e.g. 'pipeline', 'plugin'). The compliance route is an INTERNAL route: it
21
+ * admits only those two services' own signed tokens, and no user token.
22
+ * Defaults to THIS process's identity (`SERVICE_NAME`) — since #14 a service
23
+ * holds only its own signing key, so a placeholder name would mint a token no
24
+ * peer could verify.
23
25
  */
24
- export function registerComplianceEventSubscriber(config, serviceName = 'entity-events') {
26
+ export function registerComplianceEventSubscriber(config, serviceName = serviceIdentity()) {
25
27
  const serviceConfig = {
26
28
  host: config?.host ?? process.env.COMPLIANCE_SERVICE_HOST ?? 'compliance',
27
29
  port: config?.port ?? parseInt(process.env.COMPLIANCE_SERVICE_PORT ?? '3000', 10),
@@ -69,4 +71,4 @@ export function registerComplianceEventSubscriber(config, serviceName = 'entity-
69
71
  port: serviceConfig.port,
70
72
  });
71
73
  }
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFakQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxpQ0FBaUMsQ0FDL0MsTUFBK0IsRUFDL0IsV0FBVyxHQUFXLGVBQWU7SUFFckMsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksWUFBWTtRQUN6RSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDO0tBQ2xGLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXJELE1BQU0sVUFBVSxHQUEwQjtRQUN4QyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQWtCO1lBQ3BDLElBQUksQ0FBQztnQkFDSCxnRUFBZ0U7Z0JBQ2hFLGtFQUFrRTtnQkFDbEUsb0RBQW9EO2dCQUNwRCxnRUFBZ0U7Z0JBQ2hFLHNEQUFzRDtnQkFDdEQsRUFBRTtnQkFDRixvRUFBb0U7Z0JBQ3BFLDZEQUE2RDtnQkFDN0Qsc0VBQXNFO2dCQUN0RSx1RUFBdUU7Z0JBQ3ZFLHdFQUF3RTtnQkFDeEUsNkRBQTZEO2dCQUM3RCxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxFQUFFO29CQUNwRCxPQUFPLEVBQUU7d0JBQ1AsZUFBZSxFQUFFLG9CQUFvQixDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzt3QkFDMUYsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFO3FCQUMzRztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixzRUFBc0U7Z0JBQ3RFLHdFQUF3RTtnQkFDeEUseURBQXlEO2dCQUN6RCxXQUFXLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDM0YsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRTtvQkFDakUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7b0JBQzFCLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtvQkFDeEIsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ3hELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUVGLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRTtRQUNwRCxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUk7UUFDeEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO0tBQ3pCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZW50aXR5RXZlbnRzLCB0eXBlIEVudGl0eUV2ZW50LCB0eXBlIEVudGl0eUV2ZW50U3Vic2NyaWJlciB9IGZyb20gJy4vZW50aXR5LWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICcuL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcbmltcG9ydCB7IHR5cGUgU2VydmljZUNvbmZpZyB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignY29tcGxpYW5jZS1ldmVudHMnKTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gZW50aXR5IGV2ZW50IHN1YnNjcmliZXIgdGhhdCBmb3J3YXJkcyBldmVudHMgdG8gdGhlIGNvbXBsaWFuY2Ugc2VydmljZS5cbiAqXG4gKiBDYWxsIHRoaXMgYXQgc2VydmljZSBzdGFydHVwIChpbiBpbmRleC50cykgdG8gZW5hYmxlIGF1dG9tYXRpYyBjb21wbGlhbmNlXG4gKiBub3RpZmljYXRpb24gb24gZW50aXR5IG11dGF0aW9ucy4gRXZlbnRzIGFyZSBmaXJlLWFuZC1mb3JnZXQg4oCUIGZhaWx1cmVzXG4gKiBhcmUgbG9nZ2VkIGJ1dCBuZXZlciBibG9jayB0aGUgb3JpZ2luYWwgcmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgc2VydmljZSBjb25maWcgb3ZlcnJpZGUgKGRlZmF1bHRzIHRvIENPTVBMSUFOQ0VfU0VSVklDRV9IT1NUL1BPUlQgZW52IHZhcnMpXG4gKiBAcGFyYW0gc2VydmljZU5hbWUgLSBTZXJ2aWNlIGlkZW50aWZpZXIgYmFrZWQgaW50byB0aGUgc2lnbmVkIEpXVCdzIGBzdWJgXG4gKiAgIChlLmcuICdwaXBlbGluZScsICdwbHVnaW4nKS4gVGhlIGNvbXBsaWFuY2Ugcm91dGUgcmVxdWlyZXMgYSBzZXJ2aWNlXG4gKiAgIHByaW5jaXBhbCDigJQgYSBzcG9vZmFibGUgYHgtaW50ZXJuYWwtc2VydmljZTogdHJ1ZWAgaGVhZGVyIGlzIG5vIGxvbmdlclxuICogICBhY2NlcHRlZC4gRGVmYXVsdHMgdG8gYSBnZW5lcmljICdlbnRpdHktZXZlbnRzJyB3aGVuIHVuc3BlY2lmaWVkLCBidXRcbiAqICAgY2FsbGVycyBzaG91bGQgcGFzcyB0aGVpciBzZXJ2aWNlIG5hbWUgZm9yIGFjY3VyYXRlIGF1ZGl0IHRyYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29tcGxpYW5jZUV2ZW50U3Vic2NyaWJlcihcbiAgY29uZmlnPzogUGFydGlhbDxTZXJ2aWNlQ29uZmlnPixcbiAgc2VydmljZU5hbWU6IHN0cmluZyA9ICdlbnRpdHktZXZlbnRzJyxcbik6IHZvaWQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBwcm9jZXNzLmVudi5DT01QTElBTkNFX1NFUlZJQ0VfSE9TVCA/PyAnY29tcGxpYW5jZScsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgY29uc3Qgc3Vic2NyaWJlcjogRW50aXR5RXZlbnRTdWJzY3JpYmVyID0ge1xuICAgIGFzeW5jIG9uRW50aXR5RXZlbnQoZXZlbnQ6IEVudGl0eUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNaW50IGEgcGVyLWV2ZW50IHNlcnZpY2UgSldUIHNjb3BlZCB0byB0aGUgZXZlbnQncyBvcmcgc28gdGhlXG4gICAgICAgIC8vIGNvbXBsaWFuY2Ugcm91dGUncyBgcnVuV2l0aFRlbmFudENvbnRleHRgIHNlZXMgdGhlIHJpZ2h0IHRlbmFudFxuICAgICAgICAvLyBHVUMuIFRoZSBjb21wbGlhbmNlIHNpZGUgZW5mb3JjZXMgYHJlcXVpcmVBdXRoYCArXG4gICAgICAgIC8vIGByZXF1aXJlU2VydmljZVByaW5jaXBhbGAg4oCUIHRoZSBwcmV2aW91cyBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICAgICAgICAvLyBoZWFkZXIgaXMgbm8gbG9uZ2VyIHN1ZmZpY2llbnQgKGFuZCB3YXMgc3Bvb2ZhYmxlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBIVFRQIG5vdGlmeSBpcyB0aGUgU0lOR0xFIGRlbGl2ZXJ5IGNoYW5uZWwgZm9yIHBvc3QtbXV0YXRpb25cbiAgICAgICAgLy8gcmUtdmFsaWRhdGlvbiAocHJpbWFyeSBlbmZvcmNlbWVudCBpcyB0aGUgZmFpbC1DTE9TRUQgbGl2ZVxuICAgICAgICAvLyB2YWxpZGF0ZSBwYXRoKS4gQSBzdGFibGUgcGVyLWV2ZW50IGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoZSBQT1NUXG4gICAgICAgIC8vIHJldHJ5LXNhZmUgaW4gdGhlIGh0dHAtY2xpZW50LCBzbyBhIHRyYW5zaWVudCA1eHgvdGltZW91dCBpcyByZXRyaWVkXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwZWQgb24gdGhlIGZpcnN0IGF0dGVtcHQ7IGNvbXBsaWFuY2UgcmUtZXZhbHVhdGlvbiBpc1xuICAgICAgICAvLyBuYXR1cmFsbHkgaWRlbXBvdGVudCwgc28gYSBkdXBsaWNhdGUgZGVsaXZlcnkgaXMgaGFybWxlc3MuXG4gICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KCcvY29tcGxpYW5jZS9ldmVudHMvZW50aXR5JywgZXZlbnQsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSksXG4gICAgICAgICAgICAnSWRlbXBvdGVuY3ktS2V5JzogYCR7ZXZlbnQudGFyZ2V0fToke2V2ZW50LmVudGl0eUlkfToke2V2ZW50LmV2ZW50VHlwZX06JHtldmVudC50aW1lc3RhbXAudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogbG9nICsgYSBkcm9wIG1ldHJpYyBzbyBzdXN0YWluZWQgbG9zcyBpcyBhbGVydGFibGVcbiAgICAgICAgLy8gKG9wZXJhdG9ycyBjYW4ndCBhY3Qgb24gYSB3YXJuIGxpbmUgYWxvbmUpLCB0aGVuIHN3YWxsb3cg4oCUIGNvbXBsaWFuY2VcbiAgICAgICAgLy8gbm90aWZpY2F0aW9uIGlzIG5vbi1mYXRhbCB0byB0aGUgb3JpZ2luYXRpbmcgbXV0YXRpb24uXG4gICAgICAgIGVtaXRDb3VudGVyKCdjb21wbGlhbmNlX2V2ZW50X2Ryb3BfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBub3RpZnkgY29tcGxpYW5jZSBzZXJ2aWNlIG9mIGVudGl0eSBldmVudCcsIHtcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogZXZlbnQuZW50aXR5SWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBlbnRpdHlFdmVudHMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICBsb2dnZXIuaW5mbygnQ29tcGxpYW5jZSBldmVudCBzdWJzY3JpYmVyIHJlZ2lzdGVyZWQnLCB7XG4gICAgaG9zdDogc2VydmljZUNvbmZpZy5ob3N0LFxuICAgIHBvcnQ6IHNlcnZpY2VDb25maWcucG9ydCxcbiAgfSk7XG59XG4iXX0=
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1ldmVudC1zdWJzY3JpYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQWdELE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBc0IsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLGlDQUFpQyxDQUMvQyxNQUErQixFQUMvQixXQUFXLEdBQVcsZUFBZSxFQUFFO0lBRXZDLE1BQU0sYUFBYSxHQUFrQjtRQUNuQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLFlBQVk7UUFDekUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQztLQUNsRixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVyRCxNQUFNLFVBQVUsR0FBMEI7UUFDeEMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFrQjtZQUNwQyxJQUFJLENBQUM7Z0JBQ0gsZ0VBQWdFO2dCQUNoRSxrRUFBa0U7Z0JBQ2xFLG9EQUFvRDtnQkFDcEQsZ0VBQWdFO2dCQUNoRSxzREFBc0Q7Z0JBQ3RELEVBQUU7Z0JBQ0Ysb0VBQW9FO2dCQUNwRSw2REFBNkQ7Z0JBQzdELHNFQUFzRTtnQkFDdEUsdUVBQXVFO2dCQUN2RSx3RUFBd0U7Z0JBQ3hFLDZEQUE2RDtnQkFDN0QsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEtBQUssRUFBRTtvQkFDcEQsT0FBTyxFQUFFO3dCQUNQLGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7d0JBQzFGLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtxQkFDM0c7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2Isc0VBQXNFO2dCQUN0RSx3RUFBd0U7Z0JBQ3hFLHlEQUF5RDtnQkFDekQsV0FBVyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzNGLE1BQU0sQ0FBQyxJQUFJLENBQUMscURBQXFELEVBQUU7b0JBQ2pFLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDcEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO29CQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7SUFFRixZQUFZLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUU7UUFDcEQsSUFBSSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1FBQ3hCLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSTtLQUN6QixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGVudGl0eUV2ZW50cywgdHlwZSBFbnRpdHlFdmVudCwgdHlwZSBFbnRpdHlFdmVudFN1YnNjcmliZXIgfSBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxIdHRwQ2xpZW50IH0gZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBzZXJ2aWNlSWRlbnRpdHkgfSBmcm9tICcuL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlQXV0aEhlYWRlciB9IGZyb20gJy4uL21pZGRsZXdhcmUvYXV0aC5qcyc7XG5pbXBvcnQgeyB0eXBlIFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2NvbXBsaWFuY2UtZXZlbnRzJyk7XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGVudGl0eSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZXZlbnRzIHRvIHRoZSBjb21wbGlhbmNlIHNlcnZpY2UuXG4gKlxuICogQ2FsbCB0aGlzIGF0IHNlcnZpY2Ugc3RhcnR1cCAoaW4gaW5kZXgudHMpIHRvIGVuYWJsZSBhdXRvbWF0aWMgY29tcGxpYW5jZVxuICogbm90aWZpY2F0aW9uIG9uIGVudGl0eSBtdXRhdGlvbnMuIEV2ZW50cyBhcmUgZmlyZS1hbmQtZm9yZ2V0IOKAlCBmYWlsdXJlc1xuICogYXJlIGxvZ2dlZCBidXQgbmV2ZXIgYmxvY2sgdGhlIG9yaWdpbmFsIHJlcXVlc3QuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHNlcnZpY2UgY29uZmlnIG92ZXJyaWRlIChkZWZhdWx0cyB0byBDT01QTElBTkNFX1NFUlZJQ0VfSE9TVC9QT1JUIGVudiB2YXJzKVxuICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gU2VydmljZSBpZGVudGlmaWVyIGJha2VkIGludG8gdGhlIHNpZ25lZCBKV1QncyBgc3ViYFxuICogICAoZS5nLiAncGlwZWxpbmUnLCAncGx1Z2luJykuIFRoZSBjb21wbGlhbmNlIHJvdXRlIGlzIGFuIElOVEVSTkFMIHJvdXRlOiBpdFxuICogICBhZG1pdHMgb25seSB0aG9zZSB0d28gc2VydmljZXMnIG93biBzaWduZWQgdG9rZW5zLCBhbmQgbm8gdXNlciB0b2tlbi5cbiAqICAgRGVmYXVsdHMgdG8gVEhJUyBwcm9jZXNzJ3MgaWRlbnRpdHkgKGBTRVJWSUNFX05BTUVgKSDigJQgc2luY2UgIzE0IGEgc2VydmljZVxuICogICBob2xkcyBvbmx5IGl0cyBvd24gc2lnbmluZyBrZXksIHNvIGEgcGxhY2Vob2xkZXIgbmFtZSB3b3VsZCBtaW50IGEgdG9rZW4gbm9cbiAqICAgcGVlciBjb3VsZCB2ZXJpZnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbXBsaWFuY2VFdmVudFN1YnNjcmliZXIoXG4gIGNvbmZpZz86IFBhcnRpYWw8U2VydmljZUNvbmZpZz4sXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcgPSBzZXJ2aWNlSWRlbnRpdHkoKSxcbik6IHZvaWQge1xuICBjb25zdCBzZXJ2aWNlQ29uZmlnOiBTZXJ2aWNlQ29uZmlnID0ge1xuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBwcm9jZXNzLmVudi5DT01QTElBTkNFX1NFUlZJQ0VfSE9TVCA/PyAnY29tcGxpYW5jZScsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBhcnNlSW50KHByb2Nlc3MuZW52LkNPTVBMSUFOQ0VfU0VSVklDRV9QT1JUID8/ICczMDAwJywgMTApLFxuICB9O1xuXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBJbnRlcm5hbEh0dHBDbGllbnQoc2VydmljZUNvbmZpZyk7XG5cbiAgY29uc3Qgc3Vic2NyaWJlcjogRW50aXR5RXZlbnRTdWJzY3JpYmVyID0ge1xuICAgIGFzeW5jIG9uRW50aXR5RXZlbnQoZXZlbnQ6IEVudGl0eUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBNaW50IGEgcGVyLWV2ZW50IHNlcnZpY2UgSldUIHNjb3BlZCB0byB0aGUgZXZlbnQncyBvcmcgc28gdGhlXG4gICAgICAgIC8vIGNvbXBsaWFuY2Ugcm91dGUncyBgcnVuV2l0aFRlbmFudENvbnRleHRgIHNlZXMgdGhlIHJpZ2h0IHRlbmFudFxuICAgICAgICAvLyBHVUMuIFRoZSBjb21wbGlhbmNlIHNpZGUgZW5mb3JjZXMgYHJlcXVpcmVBdXRoYCArXG4gICAgICAgIC8vIGByZXF1aXJlU2VydmljZVByaW5jaXBhbGAg4oCUIHRoZSBwcmV2aW91cyBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICAgICAgICAvLyBoZWFkZXIgaXMgbm8gbG9uZ2VyIHN1ZmZpY2llbnQgKGFuZCB3YXMgc3Bvb2ZhYmxlKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBIVFRQIG5vdGlmeSBpcyB0aGUgU0lOR0xFIGRlbGl2ZXJ5IGNoYW5uZWwgZm9yIHBvc3QtbXV0YXRpb25cbiAgICAgICAgLy8gcmUtdmFsaWRhdGlvbiAocHJpbWFyeSBlbmZvcmNlbWVudCBpcyB0aGUgZmFpbC1DTE9TRUQgbGl2ZVxuICAgICAgICAvLyB2YWxpZGF0ZSBwYXRoKS4gQSBzdGFibGUgcGVyLWV2ZW50IGBJZGVtcG90ZW5jeS1LZXlgIG1ha2VzIHRoZSBQT1NUXG4gICAgICAgIC8vIHJldHJ5LXNhZmUgaW4gdGhlIGh0dHAtY2xpZW50LCBzbyBhIHRyYW5zaWVudCA1eHgvdGltZW91dCBpcyByZXRyaWVkXG4gICAgICAgIC8vIHJhdGhlciB0aGFuIGRyb3BwZWQgb24gdGhlIGZpcnN0IGF0dGVtcHQ7IGNvbXBsaWFuY2UgcmUtZXZhbHVhdGlvbiBpc1xuICAgICAgICAvLyBuYXR1cmFsbHkgaWRlbXBvdGVudCwgc28gYSBkdXBsaWNhdGUgZGVsaXZlcnkgaXMgaGFybWxlc3MuXG4gICAgICAgIGF3YWl0IGNsaWVudC5wb3N0KCcvY29tcGxpYW5jZS9ldmVudHMvZW50aXR5JywgZXZlbnQsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWUsIG9yZ0lkOiBldmVudC5vcmdJZCwgcm9sZTogJ21lbWJlcicgfSksXG4gICAgICAgICAgICAnSWRlbXBvdGVuY3ktS2V5JzogYCR7ZXZlbnQudGFyZ2V0fToke2V2ZW50LmVudGl0eUlkfToke2V2ZW50LmV2ZW50VHlwZX06JHtldmVudC50aW1lc3RhbXAudG9JU09TdHJpbmcoKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIEZpcmUtYW5kLWZvcmdldDogbG9nICsgYSBkcm9wIG1ldHJpYyBzbyBzdXN0YWluZWQgbG9zcyBpcyBhbGVydGFibGVcbiAgICAgICAgLy8gKG9wZXJhdG9ycyBjYW4ndCBhY3Qgb24gYSB3YXJuIGxpbmUgYWxvbmUpLCB0aGVuIHN3YWxsb3cg4oCUIGNvbXBsaWFuY2VcbiAgICAgICAgLy8gbm90aWZpY2F0aW9uIGlzIG5vbi1mYXRhbCB0byB0aGUgb3JpZ2luYXRpbmcgbXV0YXRpb24uXG4gICAgICAgIGVtaXRDb3VudGVyKCdjb21wbGlhbmNlX2V2ZW50X2Ryb3BfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCB0YXJnZXQ6IGV2ZW50LnRhcmdldCB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBub3RpZnkgY29tcGxpYW5jZSBzZXJ2aWNlIG9mIGVudGl0eSBldmVudCcsIHtcbiAgICAgICAgICB0YXJnZXQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgICBlbnRpdHlJZDogZXZlbnQuZW50aXR5SWQsXG4gICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBlbnRpdHlFdmVudHMuc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICBsb2dnZXIuaW5mbygnQ29tcGxpYW5jZSBldmVudCBzdWJzY3JpYmVyIHJlZ2lzdGVyZWQnLCB7XG4gICAgaG9zdDogc2VydmljZUNvbmZpZy5ob3N0LFxuICAgIHBvcnQ6IHNlcnZpY2VDb25maWcucG9ydCxcbiAgfSk7XG59XG4iXX0=