@pipeline-builder/api-core 4.1.13 → 4.1.15

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
@@ -1,17 +1,18 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import * as http from 'http';
4
- import { getCircuitBreaker, CircuitOpenError } from './circuit-breaker.js';
4
+ import { getCircuitBreaker, circuitBreakerKey, CircuitOpenError } from './circuit-breaker.js';
5
5
  import { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
6
6
  import { HttpStatus } from '../constants/http-status.js';
7
7
  import { createLogger } from '../utils/logger.js';
8
8
  import { emitCounter } from '../utils/metric-emitter.js';
9
9
  import { errorMessage } from '../utils/response.js';
10
+ import { envInt } from '../utils/env.js';
10
11
  const logger = createLogger('http-client');
11
12
  /**
12
13
  * Default request timeout in milliseconds (env: `HTTP_CLIENT_TIMEOUT`).
13
14
  */
14
- const DEFAULT_TIMEOUT = parseInt(process.env.HTTP_CLIENT_TIMEOUT || '5000', 10);
15
+ const DEFAULT_TIMEOUT = envInt('HTTP_CLIENT_TIMEOUT', 5000, { min: 1 });
15
16
  /**
16
17
  * Default cap on concurrent keep-alive sockets per client agent
17
18
  * (env: `HTTP_CLIENT_MAX_SOCKETS`). Node's default is `Infinity`, which lets a
@@ -19,7 +20,22 @@ const DEFAULT_TIMEOUT = parseInt(process.env.HTTP_CLIENT_TIMEOUT || '5000', 10);
19
20
  * (fd exhaustion + connection-storm on the callee). 64 is ample for
20
21
  * service-to-service fan-out while staying bounded.
21
22
  */
22
- const DEFAULT_MAX_SOCKETS = parseInt(process.env.HTTP_CLIENT_MAX_SOCKETS || '64', 10);
23
+ const DEFAULT_MAX_SOCKETS = envInt('HTTP_CLIENT_MAX_SOCKETS', 64, { min: 1 });
24
+ /**
25
+ * Default cap on a response body (bytes; env: `HTTP_CLIENT_MAX_RESPONSE_BYTES`,
26
+ * default 10 MiB). Every response is buffered and JSON-parsed in memory, so an
27
+ * unbounded body from a misbehaving (or compromised) peer is a memory DoS on the
28
+ * caller. Exceeding it aborts the request with {@link ResponseTooLargeError}.
29
+ */
30
+ const DEFAULT_MAX_RESPONSE_BYTES = envInt('HTTP_CLIENT_MAX_RESPONSE_BYTES', 10 * 1024 * 1024, { min: 1 });
31
+ /** A response body exceeded the client's `maxResponseBytes`. Not retried. */
32
+ export class ResponseTooLargeError extends Error {
33
+ code = 'RESPONSE_TOO_LARGE';
34
+ constructor(limit) {
35
+ super(`Response body exceeded ${limit} bytes`);
36
+ this.name = 'ResponseTooLargeError';
37
+ }
38
+ }
23
39
  // HTTP methods that are idempotent by definition — safe to auto-retry on a
24
40
  // 5xx/connection/timeout without risking a duplicate side effect.
25
41
  const IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
@@ -54,6 +70,8 @@ export function destroySharedHttpAgents() {
54
70
  export class InternalHttpClient {
55
71
  config;
56
72
  agent;
73
+ breakerClass;
74
+ maxResponseBytes;
57
75
  /**
58
76
  * Create a new HTTP client instance.
59
77
  *
@@ -68,6 +86,8 @@ export class InternalHttpClient {
68
86
  };
69
87
  this.agent = options?.agent
70
88
  ?? getSharedAgent(this.config.host, this.config.port, options?.maxSockets ?? DEFAULT_MAX_SOCKETS);
89
+ this.breakerClass = options?.breakerClass;
90
+ this.maxResponseBytes = options?.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;
71
91
  }
72
92
  /**
73
93
  * Make a GET request.
@@ -129,7 +149,7 @@ export class InternalHttpClient {
129
149
  // breaker/metric key so one bad downstream trips once (not once-per-client)
130
150
  // and dashboards can see S2S health per callee.
131
151
  const target = `${this.config.host}:${this.config.port}`;
132
- const breaker = getCircuitBreaker(target);
152
+ const breaker = getCircuitBreaker(circuitBreakerKey(target, options?.breakerClass ?? this.breakerClass));
133
153
  if (!breaker.allowRequest()) {
134
154
  // Fast-fail without touching the network — this is the load-shedding that
135
155
  // prevents a downstream brownout from cascading via retry storms.
@@ -165,6 +185,13 @@ export class InternalHttpClient {
165
185
  }
166
186
  catch (error) {
167
187
  lastError = error instanceof Error ? error : new Error(String(error));
188
+ // An oversized body is the peer's content, not a transient fault: never
189
+ // re-download it, and never count it against the breaker.
190
+ if (lastError instanceof ResponseTooLargeError) {
191
+ breaker.recordSuccess();
192
+ emitCounter('s2s_requests_total', { target, method, outcome: 'too_large' });
193
+ throw lastError;
194
+ }
168
195
  const decision = getErrorRetryDecision(attempt, retryConfig);
169
196
  if (decision.shouldRetry && retrySafe) {
170
197
  logger.debug('Retrying after error', { method, path, error: lastError.message, attempt: attempt + 1 });
@@ -209,24 +236,68 @@ export class InternalHttpClient {
209
236
  if (path.includes('://') || path.startsWith('//') || /[\r\n\0]/.test(path)) {
210
237
  throw new Error(`Invalid request path: ${path}`);
211
238
  }
239
+ const timeoutMs = options?.timeout ?? this.config.timeout;
240
+ const maxBytes = options?.maxResponseBytes ?? this.maxResponseBytes;
212
241
  const requestOptions = {
213
242
  hostname: this.config.host,
214
243
  port: this.config.port,
215
244
  path: path.startsWith('/') ? path : `/${path}`,
216
245
  method,
217
246
  headers,
218
- timeout: options?.timeout ?? this.config.timeout,
247
+ // Socket IDLE timeout. The total deadline below bounds the whole
248
+ // exchange — a peer trickling one byte per interval never goes idle.
249
+ timeout: timeoutMs,
219
250
  agent: this.agent,
220
251
  };
252
+ // Settle exactly once, whichever of the many terminal events fires first
253
+ // (response end, request/response error, abort, premature close, deadline,
254
+ // size cap). Every exit path clears the deadline timer.
255
+ let settled = false;
256
+ let deadline;
257
+ const fail = (error) => {
258
+ if (settled)
259
+ return;
260
+ settled = true;
261
+ if (deadline)
262
+ clearTimeout(deadline);
263
+ reject(error);
264
+ };
265
+ const succeed = (value) => {
266
+ if (settled)
267
+ return;
268
+ settled = true;
269
+ if (deadline)
270
+ clearTimeout(deadline);
271
+ resolve(value);
272
+ };
221
273
  const req = http.request(requestOptions, (res) => {
222
- let data = '';
223
- res.on('data', (chunk) => {
224
- data += chunk;
274
+ const chunks = [];
275
+ let received = 0;
276
+ res.on('data', (raw) => {
277
+ const chunk = typeof raw === 'string' ? Buffer.from(raw) : raw;
278
+ received += chunk.length;
279
+ if (received > maxBytes) {
280
+ logger.warn('HTTP response exceeded size cap', { host: this.config.host, path, maxBytes });
281
+ fail(new ResponseTooLargeError(maxBytes));
282
+ req.destroy();
283
+ return;
284
+ }
285
+ chunks.push(chunk);
286
+ });
287
+ // The response stream failing or being cut mid-body must reject — before,
288
+ // these left the promise pending forever (a hung caller, and a breaker
289
+ // probe that never reported back).
290
+ res.on('error', (error) => fail(error));
291
+ res.on('aborted', () => fail(new Error('Response aborted by peer before completion')));
292
+ res.on('close', () => {
293
+ if (!res.complete)
294
+ fail(new Error('Response closed before completion'));
225
295
  });
226
296
  res.on('end', () => {
297
+ const data = Buffer.concat(chunks).toString('utf8');
227
298
  try {
228
299
  const parsedBody = data ? JSON.parse(data) : {};
229
- resolve({
300
+ succeed({
230
301
  statusCode: res.statusCode || HttpStatus.INTERNAL_SERVER_ERROR,
231
302
  body: parsedBody,
232
303
  headers: res.headers,
@@ -238,7 +309,7 @@ export class InternalHttpClient {
238
309
  path,
239
310
  error: errorMessage(parseError),
240
311
  });
241
- resolve({
312
+ succeed({
242
313
  statusCode: res.statusCode || HttpStatus.INTERNAL_SERVER_ERROR,
243
314
  body: {},
244
315
  headers: res.headers,
@@ -247,6 +318,8 @@ export class InternalHttpClient {
247
318
  });
248
319
  });
249
320
  req.on('error', (error) => {
321
+ if (settled)
322
+ return; // our own destroy() after a deadline/size-cap failure
250
323
  // Node dual-stack connect failures are an AggregateError with an empty
251
324
  // `.message`; the cause is in `.code` (ECONNREFUSED/ETIMEDOUT). Fall
252
325
  // back so the log isn't a blank `error:""`.
@@ -258,18 +331,24 @@ export class InternalHttpClient {
258
331
  method,
259
332
  error: detail,
260
333
  });
261
- reject(error);
334
+ fail(error);
262
335
  });
336
+ const timeoutError = () => new Error(`Request timeout after ${timeoutMs}ms`);
263
337
  req.on('timeout', () => {
338
+ logger.warn('HTTP request timeout (socket idle)', { host: this.config.host, path, timeout: timeoutMs });
339
+ fail(timeoutError());
264
340
  req.destroy();
265
- const error = new Error(`Request timeout after ${this.config.timeout}ms`);
266
- logger.warn('HTTP request timeout', {
267
- host: this.config.host,
268
- path,
269
- timeout: this.config.timeout,
270
- });
271
- reject(error);
272
341
  });
342
+ // The request closing before we settled (no response, or a response we
343
+ // never finished) is a failure, not silence.
344
+ req.on('close', () => fail(new Error('Request closed before a response completed')));
345
+ // TOTAL deadline for the exchange (connect + send + full body).
346
+ deadline = setTimeout(() => {
347
+ logger.warn('HTTP request timeout (total deadline)', { host: this.config.host, path, timeout: timeoutMs });
348
+ fail(timeoutError());
349
+ req.destroy();
350
+ }, timeoutMs);
351
+ deadline.unref?.();
273
352
  if (bodyStr) {
274
353
  req.write(bodyStr);
275
354
  }
@@ -338,4 +417,4 @@ export function createSafeClient(config, options) {
338
417
  },
339
418
  };
340
419
  }
341
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFaEY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFdEYsMkVBQTJFO0FBQzNFLGtFQUFrRTtBQUNsRSxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBbUUvRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxZ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QUFNLENBQUMsTUFBTSxDQUFJLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IGdldENpcmN1aXRCcmVha2VyLCBDaXJjdWl0T3BlbkVycm9yIH0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG4gIHR5cGUgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2h0dHAtY2xpZW50Jyk7XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChlbnY6IGBIVFRQX0NMSUVOVF9USU1FT1VUYCkuXG4gKi9cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IHBhcnNlSW50KHByb2Nlc3MuZW52LkhUVFBfQ0xJRU5UX1RJTUVPVVQgfHwgJzUwMDAnLCAxMCk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgcGVyIGNsaWVudCBhZ2VudFxuICogKGVudjogYEhUVFBfQ0xJRU5UX01BWF9TT0NLRVRTYCkuIE5vZGUncyBkZWZhdWx0IGlzIGBJbmZpbml0eWAsIHdoaWNoIGxldHMgYVxuICogYnVyc3Qgb2YgY29uY3VycmVudCBjYWxscyBvcGVuIHVuYm91bmRlZCBzb2NrZXRzIGFnYWluc3QgYSBkb3duc3RyZWFtIHNlcnZpY2VcbiAqIChmZCBleGhhdXN0aW9uICsgY29ubmVjdGlvbi1zdG9ybSBvbiB0aGUgY2FsbGVlKS4gNjQgaXMgYW1wbGUgZm9yXG4gKiBzZXJ2aWNlLXRvLXNlcnZpY2UgZmFuLW91dCB3aGlsZSBzdGF5aW5nIGJvdW5kZWQuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1NPQ0tFVFMgPSBwYXJzZUludChwcm9jZXNzLmVudi5IVFRQX0NMSUVOVF9NQVhfU09DS0VUUyB8fCAnNjQnLCAxMCk7XG5cbi8vIEhUVFAgbWV0aG9kcyB0aGF0IGFyZSBpZGVtcG90ZW50IGJ5IGRlZmluaXRpb24g4oCUIHNhZmUgdG8gYXV0by1yZXRyeSBvbiBhXG4vLyA1eHgvY29ubmVjdGlvbi90aW1lb3V0IHdpdGhvdXQgcmlza2luZyBhIGR1cGxpY2F0ZSBzaWRlIGVmZmVjdC5cbmNvbnN0IElERU1QT1RFTlRfTUVUSE9EUyA9IG5ldyBTZXQoWydHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pO1xuXG4vKipcbiAqIEhUVFAgcmVxdWVzdCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFJlcXVlc3QgaGVhZGVycyAqL1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKi9cbiAgdGltZW91dD86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMikgKi9cbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIEJhc2UgZGVsYXkgYmV0d2VlbiByZXRyaWVzIGluIG1zIOKAlCBkb3VibGVzIGVhY2ggYXR0ZW1wdCAoZGVmYXVsdDogMjAwKSAqL1xuICByZXRyeURlbGF5TXM/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIHNwZWNpZmljYWxseSBmb3IgNDI5IHJhdGUgbGltaXRpbmcgKGRlZmF1bHQ6IDQpICovXG4gIG1heFJhdGVMaW1pdFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCByZXF1ZXN0IElEIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIChhZGRlZCBhcyBYLVJlcXVlc3QtSWQgaGVhZGVyKSAqL1xuICByZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUcmVhdCB0aGlzIHJlcXVlc3QgYXMgc2FmZSB0byBhdXRvLXJldHJ5IG9uIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgZXZlblxuICAgKiB0aG91Z2ggdGhlIG1ldGhvZCBpcyBub24taWRlbXBvdGVudCAoZS5nLiB0aGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudCBieSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXksIG9yIHRoZSBvcGVyYXRpb24gaXMgbmF0dXJhbGx5IGlkZW1wb3RlbnQpLiBEZWZhdWx0IGZhbHNlOlxuICAgKiBub24taWRlbXBvdGVudCBtZXRob2RzIGFyZSBOT1QgcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcywgb25seSBvbiA0MjkuXG4gICAqL1xuICBpZGVtcG90ZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBIVFRQIGNsaWVudCByZXNwb25zZSB3cmFwcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIC8qKiBSZXNwb25zZSBib2R5IChwYXJzZWQgSlNPTikgKi9cbiAgYm9keTogVDtcbiAgLyoqIFJlc3BvbnNlIGhlYWRlcnMgKi9cbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzO1xufVxuXG4vKipcbiAqIEludGVybmFsIEhUVFAgY2xpZW50IGZvciBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gKiAgIGhvc3Q6ICdxdW90YScsXG4gKiAgIHBvcnQ6IDMwMDAsXG4gKiAgIHRpbWVvdXQ6IDUwMDAsXG4gKiB9KTtcbiAqXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9vcmcxMjMvYXBpQ2FsbHMnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KCcvb3JnMTIzL2luY3JlbWVudCcsIHsgcXVvdGFUeXBlOiAnYXBpQ2FsbHMnIH0pO1xuICogYGBgXG4gKi9cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBwb29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY2FsbGVyLW93bmVkIGBodHRwLkFnZW50YCB0byB1c2UgaW5zdGVhZCBvZiB0aGUgcHJvY2Vzcy13aWRlIHNoYXJlZCBvbmUuXG4gICAqIFRoZSBjbGllbnQgbmV2ZXIgZGVzdHJveXMgaXQuXG4gICAqL1xuICBhZ2VudD86IGh0dHAuQWdlbnQ7XG4gIC8qKiBDYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgZm9yIHRoZSBzaGFyZWQgYWdlbnQgKGRlZmF1bHQgNjQpLiAqL1xuICBtYXhTb2NrZXRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByb2Nlc3Mtd2lkZSBrZWVwLWFsaXZlIGFnZW50cywgb25lIHBlciBgaG9zdDpwb3J0YCAoYW5kIHNvY2tldCBjYXApIOKAlFxuICogbWlycm9yaW5nIHRoZSBwZXItdGFyZ2V0IGNpcmN1aXQtYnJlYWtlciByZWdpc3RyeS4gQ2xpZW50cyBhcmUgY2hlYXAgYW5kIG9mdGVuXG4gKiBidWlsdCBwZXIgY2FsbCAoYW4gb3JnLWhpZXJhcmNoeSB3YWxrIGJ1aWxkcyBvbmUgcGVyIGhvcCksIHNvIGEgcGVyLWNsaWVudFxuICogYWdlbnQgdGhyZXcgYXdheSBpdHMgcG9vbGVkIHNvY2tldHMgZXZlcnkgdGltZSBhbmQgdGhlIHNvY2tldCBjYXAgYm91bmRlZFxuICogbm90aGluZy4gU2hhcmluZyB0aGUgYWdlbnQgcG9vbHMgY29ubmVjdGlvbnMgdG8gYSBkb3duc3RyZWFtIGFjcm9zcyBldmVyeVxuICogY2xpZW50IHRoYXQgdGFyZ2V0cyBpdC5cbiAqL1xuY29uc3Qgc2hhcmVkQWdlbnRzID0gbmV3IE1hcDxzdHJpbmcsIGh0dHAuQWdlbnQ+KCk7XG5cbmZ1bmN0aW9uIGdldFNoYXJlZEFnZW50KGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyLCBtYXhTb2NrZXRzOiBudW1iZXIpOiBodHRwLkFnZW50IHtcbiAgY29uc3Qga2V5ID0gYCR7aG9zdH06JHtwb3J0fToke21heFNvY2tldHN9YDtcbiAgbGV0IGFnZW50ID0gc2hhcmVkQWdlbnRzLmdldChrZXkpO1xuICBpZiAoIWFnZW50KSB7XG4gICAgYWdlbnQgPSBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogdHJ1ZSwgbWF4U29ja2V0cyB9KTtcbiAgICBzaGFyZWRBZ2VudHMuc2V0KGtleSwgYWdlbnQpO1xuICB9XG4gIHJldHVybiBhZ2VudDtcbn1cblxuLyoqXG4gKiBDbG9zZSBldmVyeSBzaGFyZWQga2VlcC1hbGl2ZSBhZ2VudCAoaWRsZSBzb2NrZXRzIGFyZSByZWxlYXNlZDsgaW4tZmxpZ2h0XG4gKiByZXF1ZXN0cyBmaW5pc2gpLiBGb3IgcHJvY2VzcyBzaHV0ZG93biBhbmQgdGVzdHMg4oCUIGEgbGF0ZXIgcmVxdWVzdCBzaW1wbHlcbiAqIGJ1aWxkcyBhIGZyZXNoIGFnZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzdHJveVNoYXJlZEh0dHBBZ2VudHMoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgYWdlbnQgb2Ygc2hhcmVkQWdlbnRzLnZhbHVlcygpKSBhZ2VudC5kZXN0cm95KCk7XG4gIHNoYXJlZEFnZW50cy5jbGVhcigpO1xufVxuXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxIdHRwQ2xpZW50IHtcbiAgcHJpdmF0ZSBjb25maWc6IFJlcXVpcmVkPFNlcnZpY2VDb25maWc+O1xuICBwcml2YXRlIGFnZW50OiBodHRwLkFnZW50O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBTZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25uZWN0aW9uLXBvb2wgY29udHJvbHMgKG93biBhZ2VudCAvIHNvY2tldCBjYXApXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnQgPSBvcHRpb25zPy5hZ2VudFxuICAgICAgPz8gZ2V0U2hhcmVkQWdlbnQodGhpcy5jb25maWcuaG9zdCwgdGhpcy5jb25maWcucG9ydCwgb3B0aW9ucz8ubWF4U29ja2V0cyA/PyBERUZBVUxUX01BWF9TT0NLRVRTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgR0VUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBnZXQ8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdHRVQnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQT1NUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBwb3N0PFQgPSB1bmtub3duPihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ1BPU1QnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgUFVUIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBwdXQ8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUFVUJywgcGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIERFTEVURSByZXF1ZXN0LlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlPFQgPSB1bmtub3duPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignREVMRVRFJywgcGF0aCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHdpdGggcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcy5cbiAgICpcbiAgICogLSA0MjkgKHJhdGUgbGltaXQpOiByZXNwZWN0cyBgUmV0cnktQWZ0ZXJgIGhlYWRlciwgdXNlcyBsb25nZXIgYmFzZSBkZWxheSAoNHgpLFxuICAgKiAgIHJldHJpZXMgdXAgdG8gYG1heFJhdGVMaW1pdFJldHJpZXNgIHRpbWVzIChkZWZhdWx0IDQpLlxuICAgKiAtIDUwMi81MDMvNTA0IChzZXJ2ZXIgZXJyb3JzKTogc3RhbmRhcmQgZXhwb25lbnRpYWwgYmFja29mZiwgdXAgdG8gYG1heFJldHJpZXNgIChkZWZhdWx0IDIpLlxuICAgKiAtIENvbm5lY3Rpb24gZXJyb3JzIC8gdGltZW91dHM6IHJldHJpZXMgdXAgdG8gYG1heFJldHJpZXNgLlxuICAgKiAtIEFsbCBkZWxheXMgaW5jbHVkZSDCsTI1JSBqaXR0ZXIgdG8gcHJldmVudCB0aHVuZGVyaW5nIGhlcmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlcXVlc3RXaXRoUmV0cnk8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICAvLyBBIG1hbGZvcm1lZCBwYXRoIGlzIGEgQ0xJRU5UIGJ1Zywgbm90IGEgZG93bnN0cmVhbSBmYXVsdCDigJQgcmVqZWN0IGl0IHVwXG4gICAgLy8gZnJvbnQgc28gaXQgbmV2ZXIgYnVybnMgcmV0cmllcyBvciBmZWVkcyB0aGUgY2lyY3VpdCBicmVha2VyICh3aGljaCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzaGVkIHRyYWZmaWMgdG8gYSBwZXJmZWN0bHkgaGVhbHRoeSBkb3duc3RyZWFtKS4gcmVxdWVzdCgpIGtlZXBzXG4gICAgLy8gdGhlIHNhbWUgZ3VhcmQgYXMgZGVmZW5jZS1pbi1kZXB0aC5cbiAgICBpZiAocGF0aC5pbmNsdWRlcygnOi8vJykgfHwgcGF0aC5zdGFydHNXaXRoKCcvLycpIHx8IC9bXFxyXFxuXFwwXS8udGVzdChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgcGF0aDogJHtwYXRofWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5Q29uZmlnOiBSZXRyeUNvbmZpZyA9IHtcbiAgICAgIG1heFJldHJpZXM6IG9wdGlvbnM/Lm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIG1heFJhdGVMaW1pdFJldHJpZXM6IG9wdGlvbnM/Lm1heFJhdGVMaW1pdFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICAgICAgcmV0cnlEZWxheU1zOiBvcHRpb25zPy5yZXRyeURlbGF5TXMgPz8gREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgICB9O1xuICAgIGNvbnN0IHRvdGFsTWF4QXR0ZW1wdHMgPSBNYXRoLm1heChyZXRyeUNvbmZpZy5tYXhSZXRyaWVzLCByZXRyeUNvbmZpZy5tYXhSYXRlTGltaXRSZXRyaWVzID8/IERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyk7XG5cbiAgICAvLyBXaGV0aGVyIGl0J3Mgc2FmZSB0byBhdXRvLXJldHJ5IHRoaXMgcmVxdWVzdCBvbiBhIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQuXG4gICAgLy8gQSB0aW1lZC1vdXQgUE9TVCBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIHNlcnZlci1zaWRlLCBzbyByZXRyeWluZ1xuICAgIC8vIGEgbm9uLWlkZW1wb3RlbnQgcmVxdWVzdCByaXNrcyBhIERVUExJQ0FURSBzaWRlIGVmZmVjdCAoZG91YmxlLWNoYXJnZSxcbiAgICAvLyBkb3VibGUtY3JlYXRlKS4gT25seSBHRVQvSEVBRC9PUFRJT05TLCBhbiBleHBsaWNpdCBgaWRlbXBvdGVudGAgb3B0LWluLCBvclxuICAgIC8vIGEgcmVxdWVzdCBjYXJyeWluZyBhbiBJZGVtcG90ZW5jeS1LZXkgYXJlIGF1dG8tcmV0cmllZCBvbiB0aG9zZSBmYWlsdXJlcy5cbiAgICAvLyAoNDI5IGlzIGFsd2F5cyByZXRyaWVkIOKAlCBzZWUgYmVsb3cg4oCUIHNpbmNlIGl0IHdhcyByZWplY3RlZCwgbm90IHByb2Nlc3NlZC4pXG4gICAgY29uc3QgcmV0cnlTYWZlID1cbiAgICAgIElERU1QT1RFTlRfTUVUSE9EUy5oYXMobWV0aG9kLnRvVXBwZXJDYXNlKCkpIHx8XG4gICAgICBvcHRpb25zPy5pZGVtcG90ZW50ID09PSB0cnVlIHx8XG4gICAgICAhIShvcHRpb25zPy5oZWFkZXJzICYmIChvcHRpb25zLmhlYWRlcnNbJ0lkZW1wb3RlbmN5LUtleSddIHx8IG9wdGlvbnMuaGVhZGVyc1snaWRlbXBvdGVuY3kta2V5J10pKTtcblxuICAgIC8vIFBlci10YXJnZXQgY2lyY3VpdCBicmVha2VyICsgUzJTIHJlcXVlc3QgbWV0cmljcy4gYHRhcmdldGAgaXMgdGhlIHNoYXJlZFxuICAgIC8vIGJyZWFrZXIvbWV0cmljIGtleSBzbyBvbmUgYmFkIGRvd25zdHJlYW0gdHJpcHMgb25jZSAobm90IG9uY2UtcGVyLWNsaWVudClcbiAgICAvLyBhbmQgZGFzaGJvYXJkcyBjYW4gc2VlIFMyUyBoZWFsdGggcGVyIGNhbGxlZS5cbiAgICBjb25zdCB0YXJnZXQgPSBgJHt0aGlzLmNvbmZpZy5ob3N0fToke3RoaXMuY29uZmlnLnBvcnR9YDtcbiAgICBjb25zdCBicmVha2VyID0gZ2V0Q2lyY3VpdEJyZWFrZXIodGFyZ2V0KTtcbiAgICBpZiAoIWJyZWFrZXIuYWxsb3dSZXF1ZXN0KCkpIHtcbiAgICAgIC8vIEZhc3QtZmFpbCB3aXRob3V0IHRvdWNoaW5nIHRoZSBuZXR3b3JrIOKAlCB0aGlzIGlzIHRoZSBsb2FkLXNoZWRkaW5nIHRoYXRcbiAgICAgIC8vIHByZXZlbnRzIGEgZG93bnN0cmVhbSBicm93bm91dCBmcm9tIGNhc2NhZGluZyB2aWEgcmV0cnkgc3Rvcm1zLlxuICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdjaXJjdWl0X29wZW4nIH0pO1xuICAgICAgdGhyb3cgbmV3IENpcmN1aXRPcGVuRXJyb3IodGFyZ2V0KTtcbiAgICB9XG5cbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IHRvdGFsTWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3Q8VD4obWV0aG9kLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGdldFJldHJ5RGVjaXNpb24ocmVzcG9uc2Uuc3RhdHVzQ29kZSwgcmVzcG9uc2UuaGVhZGVycywgYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICAvLyA0MjkgaXMgc2FmZSB0byByZXRyeSBmb3IgQU5ZIG1ldGhvZCAocmF0ZS1saW1pdGVkIOKGkiBub3QgcHJvY2Vzc2VkKTsgYVxuICAgICAgICAvLyA1eHgvZ2F0ZXdheSBlcnJvciBpcyBvbmx5IHJldHJpZWQgd2hlbiB0aGUgcmVxdWVzdCBpcyByZXRyeS1zYWZlLlxuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSB8fCByZXRyeVNhZmUpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGRlY2lzaW9uLnJlYXNvbiArICcsIHJldHJ5aW5nJywgeyBtZXRob2QsIHBhdGgsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxLCBkZWxheU1zOiBkZWNpc2lvbi5kZWxheU1zIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdF9yZXRyaWVzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGVybWluYWwgcmVzcG9uc2UuIEEgNXh4IGlzIGEgZG93bnN0cmVhbSBmYXVsdCAoZmVlZHMgdGhlIGJyZWFrZXIpOyBhXG4gICAgICAgIC8vIDQyOSBpcyBiYWNrcHJlc3N1cmUsIG5vdCBhIGZhdWx0IOKAlCB0aGUgc2VydmljZSBhbnN3ZXJlZCwgc28gaXQgY291bnRzXG4gICAgICAgIC8vIGFzIHN1Y2Nlc3MgZm9yIGJyZWFrZXIgcHVycG9zZXMgKG5ldmVyIHRyaXAgdGhlIGJyZWFrZXIgb24gcmF0ZSBsaW1pdHMpLlxuICAgICAgICBjb25zdCBpc1NlcnZlckZhdWx0ID0gcmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSA1MDAgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8PSA1OTk7XG4gICAgICAgIGlmIChpc1NlcnZlckZhdWx0KSB7XG4gICAgICAgICAgYnJlYWtlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdzZXJ2ZXJfZXJyb3InIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkU3VjY2VzcygpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnc3VjY2VzcycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0RXJyb3JSZXRyeURlY2lzaW9uKGF0dGVtcHQsIHJldHJ5Q29uZmlnKTtcbiAgICAgICAgaWYgKGRlY2lzaW9uLnNob3VsZFJldHJ5ICYmIHJldHJ5U2FmZSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0cnlpbmcgYWZ0ZXIgZXJyb3InLCB7IG1ldGhvZCwgcGF0aCwgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLCBhdHRlbXB0OiBhdHRlbXB0ICsgMSB9KTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RfcmV0cmllc190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QgfSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWNpc2lvbi5kZWxheU1zKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgcmV0cnlpbmcgKG5vbi1pZGVtcG90ZW50LCBvciBhdHRlbXB0cyBleGhhdXN0ZWQpIOKAlCBhIGNvbm5lY3Rpb25cbiAgICAgICAgLy8gZXJyb3IvdGltZW91dCBpcyBhIGRvd25zdHJlYW0gZmF1bHQ6IGZlZWQgdGhlIGJyZWFrZXIgYW5kIGZhaWwgbm93LlxuICAgICAgICBicmVha2VyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdlcnJvcicgfSk7XG4gICAgICAgIHRocm93IGxhc3RFcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMb29wIGV4aGF1c3RlZCB3aXRob3V0IHJldHVybmluZyAoYWxsIGF0dGVtcHRzIHJldHJpZWQgdGhlbiByYW4gb3V0KS5cbiAgICBicmVha2VyLnJlY29yZEZhaWx1cmUoKTtcbiAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICB0aHJvdyBsYXN0RXJyb3IhO1xuICB9XG5cbiAgcHJpdmF0ZSBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIHJlcXVlc3QgbWV0aG9kLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFNlcmlhbGl6ZSB3aGVuIGJvZHkgaXMgZGVmaW5lZCAoaW5jbHVkaW5nIDAvZmFsc2UvJycgd2hpY2ggYXJlIHZhbGlkIEpTT04gdmFsdWVzKS5cbiAgICAgIGNvbnN0IGJvZHlTdHIgPSBib2R5ICE9PSB1bmRlZmluZWQgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgaGVhZGVyczogaHR0cC5PdXRnb2luZ0h0dHBIZWFkZXJzID0ge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAuLi5vcHRpb25zPy5oZWFkZXJzLFxuICAgICAgfTtcblxuICAgICAgLy8gUHJvcGFnYXRlIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmdcbiAgICAgIGlmIChvcHRpb25zPy5yZXF1ZXN0SWQpIHtcbiAgICAgICAgaGVhZGVyc1snWC1SZXF1ZXN0LUlkJ10gPSBvcHRpb25zLnJlcXVlc3RJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvZHlTdHIpIHtcbiAgICAgICAgaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGJvZHlTdHIpO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBwYXRoIHRvIHByZXZlbnQgcHJvdG9jb2wgaW5qZWN0aW9uIC8gcmVxdWVzdCBzbXVnZ2xpbmdcbiAgICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZXF1ZXN0IHBhdGg6ICR7cGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgIGhvc3RuYW1lOiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICBwb3J0OiB0aGlzLmNvbmZpZy5wb3J0LFxuICAgICAgICBwYXRoOiBwYXRoLnN0YXJ0c1dpdGgoJy8nKSA/IHBhdGggOiBgLyR7cGF0aH1gLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IG9wdGlvbnM/LnRpbWVvdXQgPz8gdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgICAgYWdlbnQ6IHRoaXMuYWdlbnQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcblxuICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkQm9keSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgfHwgSHR0cFN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgICAgIGJvZHk6IHBhcnNlZEJvZHkgYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGJvZHknLCB7XG4gICAgICAgICAgICAgIGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UocGFyc2VFcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keToge30gYXMgVCxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVzLmhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gTm9kZSBkdWFsLXN0YWNrIGNvbm5lY3QgZmFpbHVyZXMgYXJlIGFuIEFnZ3JlZ2F0ZUVycm9yIHdpdGggYW4gZW1wdHlcbiAgICAgICAgLy8gYC5tZXNzYWdlYDsgdGhlIGNhdXNlIGlzIGluIGAuY29kZWAgKEVDT05OUkVGVVNFRC9FVElNRURPVVQpLiBGYWxsXG4gICAgICAgIC8vIGJhY2sgc28gdGhlIGxvZyBpc24ndCBhIGJsYW5rIGBlcnJvcjpcIlwiYC5cbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyb3IubWVzc2FnZSB8fCAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGxvZ2dlci5lcnJvcignSFRUUCByZXF1ZXN0IGZhaWxlZCcsIHtcbiAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGRldGFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGhpcy5jb25maWcudGltZW91dH1tc2ApO1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQnLCB7XG4gICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLnRpbWVvdXQsXG4gICAgICAgIH0pO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KGNvbmZpZywgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBTYWZlIEdFVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5nZXQ8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIEdFVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBERUxFVEUgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci4gVXNlZCBieSBkZXN0cnVjdGl2ZVxuICAgICAqIGNyb3NzLXNlcnZpY2Ugb3BlcmF0aW9ucyAoZS5nLiBvcmctY2FzY2FkZSBkZWxldGUgaW4gcGxhdGZvcm0pLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZTxUPihcbiAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZGVsZXRlPFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBERUxFVEUgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
420
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaHR0cC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0Qiw4QkFBOEIsRUFDOUIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUV0QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRTNDOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlFOzs7OztHQUtHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJ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TSxDQUNWLElBQVksRUFDWixPQUF3QjtZQUV4QixJQUFJLENBQUM7Z0JBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZGLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgZ2V0Q2lyY3VpdEJyZWFrZXIsIGNpcmN1aXRCcmVha2VyS2V5LCBDaXJjdWl0T3BlbkVycm9yIH0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyxcbiAgREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTLFxuICBnZXRSZXRyeURlY2lzaW9uLFxuICBnZXRFcnJvclJldHJ5RGVjaXNpb24sXG4gIHR5cGUgUmV0cnlDb25maWcsXG59IGZyb20gJy4vcmV0cnktc3RyYXRlZ3kuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZpY2VDb25maWcgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgZW52SW50IH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdodHRwLWNsaWVudCcpO1xuXG4vKipcbiAqIERlZmF1bHQgcmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZW52OiBgSFRUUF9DTElFTlRfVElNRU9VVGApLlxuICovXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSBlbnZJbnQoJ0hUVFBfQ0xJRU5UX1RJTUVPVVQnLCA1MDAwLCB7IG1pbjogMSB9KTtcblxuLyoqXG4gKiBEZWZhdWx0IGNhcCBvbiBjb25jdXJyZW50IGtlZXAtYWxpdmUgc29ja2V0cyBwZXIgY2xpZW50IGFnZW50XG4gKiAoZW52OiBgSFRUUF9DTElFTlRfTUFYX1NPQ0tFVFNgKS4gTm9kZSdzIGRlZmF1bHQgaXMgYEluZmluaXR5YCwgd2hpY2ggbGV0cyBhXG4gKiBidXJzdCBvZiBjb25jdXJyZW50IGNhbGxzIG9wZW4gdW5ib3VuZGVkIHNvY2tldHMgYWdhaW5zdCBhIGRvd25zdHJlYW0gc2VydmljZVxuICogKGZkIGV4aGF1c3Rpb24gKyBjb25uZWN0aW9uLXN0b3JtIG9uIHRoZSBjYWxsZWUpLiA2NCBpcyBhbXBsZSBmb3JcbiAqIHNlcnZpY2UtdG8tc2VydmljZSBmYW4tb3V0IHdoaWxlIHN0YXlpbmcgYm91bmRlZC5cbiAqL1xuY29uc3QgREVGQVVMVF9NQVhfU09DS0VUUyA9IGVudkludCgnSFRUUF9DTElFTlRfTUFYX1NPQ0tFVFMnLCA2NCwgeyBtaW46IDEgfSk7XG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gYSByZXNwb25zZSBib2R5IChieXRlczsgZW52OiBgSFRUUF9DTElFTlRfTUFYX1JFU1BPTlNFX0JZVEVTYCxcbiAqIGRlZmF1bHQgMTAgTWlCKS4gRXZlcnkgcmVzcG9uc2UgaXMgYnVmZmVyZWQgYW5kIEpTT04tcGFyc2VkIGluIG1lbW9yeSwgc28gYW5cbiAqIHVuYm91bmRlZCBib2R5IGZyb20gYSBtaXNiZWhhdmluZyAob3IgY29tcHJvbWlzZWQpIHBlZXIgaXMgYSBtZW1vcnkgRG9TIG9uIHRoZVxuICogY2FsbGVyLiBFeGNlZWRpbmcgaXQgYWJvcnRzIHRoZSByZXF1ZXN0IHdpdGgge0BsaW5rIFJlc3BvbnNlVG9vTGFyZ2VFcnJvcn0uXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX1JFU1BPTlNFX0JZVEVTID0gZW52SW50KCdIVFRQX0NMSUVOVF9NQVhfUkVTUE9OU0VfQllURVMnLCAxMCAqIDEwMjQgKiAxMDI0LCB7IG1pbjogMSB9KTtcblxuLyoqIEEgcmVzcG9uc2UgYm9keSBleGNlZWRlZCB0aGUgY2xpZW50J3MgYG1heFJlc3BvbnNlQnl0ZXNgLiBOb3QgcmV0cmllZC4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZVRvb0xhcmdlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnUkVTUE9OU0VfVE9PX0xBUkdFJztcbiAgY29uc3RydWN0b3IobGltaXQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBSZXNwb25zZSBib2R5IGV4Y2VlZGVkICR7bGltaXR9IGJ5dGVzYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Jlc3BvbnNlVG9vTGFyZ2VFcnJvcic7XG4gIH1cbn1cblxuLy8gSFRUUCBtZXRob2RzIHRoYXQgYXJlIGlkZW1wb3RlbnQgYnkgZGVmaW5pdGlvbiDigJQgc2FmZSB0byBhdXRvLXJldHJ5IG9uIGFcbi8vIDV4eC9jb25uZWN0aW9uL3RpbWVvdXQgd2l0aG91dCByaXNraW5nIGEgZHVwbGljYXRlIHNpZGUgZWZmZWN0LlxuY29uc3QgSURFTVBPVEVOVF9NRVRIT0RTID0gbmV3IFNldChbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXSk7XG5cbi8qKlxuICogSFRUUCByZXF1ZXN0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnMge1xuICAvKiogUmVxdWVzdCBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUmVxdWVzdCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAqL1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICAvKiogTWF4aW11bSByZXRyeSBhdHRlbXB0cyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKSAqL1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbXMg4oCUIGRvdWJsZXMgZWFjaCBhdHRlbXB0IChkZWZhdWx0OiAyMDApICovXG4gIHJldHJ5RGVsYXlNcz86IG51bWJlcjtcbiAgLyoqIE1heGltdW0gcmV0cnkgYXR0ZW1wdHMgc3BlY2lmaWNhbGx5IGZvciA0MjkgcmF0ZSBsaW1pdGluZyAoZGVmYXVsdDogNCkgKi9cbiAgbWF4UmF0ZUxpbWl0UmV0cmllcz86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIHJlcXVlc3QgSUQgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgKGFkZGVkIGFzIFgtUmVxdWVzdC1JZCBoZWFkZXIpICovXG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRyZWF0IHRoaXMgcmVxdWVzdCBhcyBzYWZlIHRvIGF1dG8tcmV0cnkgb24gNXh4L2Nvbm5lY3Rpb24vdGltZW91dCBldmVuXG4gICAqIHRob3VnaCB0aGUgbWV0aG9kIGlzIG5vbi1pZGVtcG90ZW50IChlLmcuIHRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50IGJ5IGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSwgb3IgdGhlIG9wZXJhdGlvbiBpcyBuYXR1cmFsbHkgaWRlbXBvdGVudCkuIERlZmF1bHQgZmFsc2U6XG4gICAqIG5vbi1pZGVtcG90ZW50IG1ldGhvZHMgYXJlIE5PVCByZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLCBvbmx5IG9uIDQyOS5cbiAgICovXG4gIGlkZW1wb3RlbnQ/OiBib29sZWFuO1xuICAvKiogQ2FwIG9uIHRoaXMgcmVzcG9uc2UncyBib2R5IGluIGJ5dGVzIChkZWZhdWx0OiB0aGUgY2xpZW50J3MsIGVsc2UgMTAgTWlCKS4gKi9cbiAgbWF4UmVzcG9uc2VCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvdXRlIGNsYXNzIGZvciB0aGUgY2lyY3VpdCBicmVha2VyIChkZWZhdWx0OiB0aGUgY2xpZW50J3MsIGVsc2VcbiAgICogYCdkZWZhdWx0J2ApLiBSZXF1ZXN0cyBpbiBkaWZmZXJlbnQgY2xhc3NlcyB0byB0aGUgc2FtZSBgaG9zdDpwb3J0YCB0cmlwXG4gICAqIGluZGVwZW5kZW50IGJyZWFrZXJzIOKAlCBzZWUgYGNpcmN1aXRCcmVha2VyS2V5YC5cbiAgICovXG4gIGJyZWFrZXJDbGFzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIVFRQIGNsaWVudCByZXNwb25zZSB3cmFwcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRSZXNwb25zZTxUID0gdW5rbm93bj4ge1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIC8qKiBSZXNwb25zZSBib2R5IChwYXJzZWQgSlNPTikgKi9cbiAgYm9keTogVDtcbiAgLyoqIFJlc3BvbnNlIGhlYWRlcnMgKi9cbiAgaGVhZGVyczogaHR0cC5JbmNvbWluZ0h0dHBIZWFkZXJzO1xufVxuXG4vKipcbiAqIEludGVybmFsIEhUVFAgY2xpZW50IGZvciBzZXJ2aWNlLXRvLXNlcnZpY2UgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2xpZW50ID0gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gKiAgIGhvc3Q6ICdxdW90YScsXG4gKiAgIHBvcnQ6IDMwMDAsXG4gKiAgIHRpbWVvdXQ6IDUwMDAsXG4gKiB9KTtcbiAqXG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQoJy9vcmcxMjMvYXBpQ2FsbHMnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5wb3N0KCcvb3JnMTIzL2luY3JlbWVudCcsIHsgcXVvdGFUeXBlOiAnYXBpQ2FsbHMnIH0pO1xuICogYGBgXG4gKi9cbi8qKlxuICogT3B0aW9ucyBjb250cm9sbGluZyB0aGUgY2xpZW50J3MgY29ubmVjdGlvbiBwb29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBDbGllbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY2FsbGVyLW93bmVkIGBodHRwLkFnZW50YCB0byB1c2UgaW5zdGVhZCBvZiB0aGUgcHJvY2Vzcy13aWRlIHNoYXJlZCBvbmUuXG4gICAqIFRoZSBjbGllbnQgbmV2ZXIgZGVzdHJveXMgaXQuXG4gICAqL1xuICBhZ2VudD86IGh0dHAuQWdlbnQ7XG4gIC8qKiBDYXAgb24gY29uY3VycmVudCBrZWVwLWFsaXZlIHNvY2tldHMgZm9yIHRoZSBzaGFyZWQgYWdlbnQgKGRlZmF1bHQgNjQpLiAqL1xuICBtYXhTb2NrZXRzPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCBjaXJjdWl0LWJyZWFrZXIgcm91dGUgY2xhc3MgZm9yIHRoaXMgY2xpZW50J3MgcmVxdWVzdHMuICovXG4gIGJyZWFrZXJDbGFzcz86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgcmVzcG9uc2UtYm9keSBjYXAgKGJ5dGVzKSBmb3IgdGhpcyBjbGllbnQncyByZXF1ZXN0cy4gKi9cbiAgbWF4UmVzcG9uc2VCeXRlcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUga2VlcC1hbGl2ZSBhZ2VudHMsIG9uZSBwZXIgYGhvc3Q6cG9ydGAgKGFuZCBzb2NrZXQgY2FwKSDigJRcbiAqIG1pcnJvcmluZyB0aGUgcGVyLXRhcmdldCBjaXJjdWl0LWJyZWFrZXIgcmVnaXN0cnkuIENsaWVudHMgYXJlIGNoZWFwIGFuZCBvZnRlblxuICogYnVpbHQgcGVyIGNhbGwgKGFuIG9yZy1oaWVyYXJjaHkgd2FsayBidWlsZHMgb25lIHBlciBob3ApLCBzbyBhIHBlci1jbGllbnRcbiAqIGFnZW50IHRocmV3IGF3YXkgaXRzIHBvb2xlZCBzb2NrZXRzIGV2ZXJ5IHRpbWUgYW5kIHRoZSBzb2NrZXQgY2FwIGJvdW5kZWRcbiAqIG5vdGhpbmcuIFNoYXJpbmcgdGhlIGFnZW50IHBvb2xzIGNvbm5lY3Rpb25zIHRvIGEgZG93bnN0cmVhbSBhY3Jvc3MgZXZlcnlcbiAqIGNsaWVudCB0aGF0IHRhcmdldHMgaXQuXG4gKi9cbmNvbnN0IHNoYXJlZEFnZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBodHRwLkFnZW50PigpO1xuXG5mdW5jdGlvbiBnZXRTaGFyZWRBZ2VudChob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlciwgbWF4U29ja2V0czogbnVtYmVyKTogaHR0cC5BZ2VudCB7XG4gIGNvbnN0IGtleSA9IGAke2hvc3R9OiR7cG9ydH06JHttYXhTb2NrZXRzfWA7XG4gIGxldCBhZ2VudCA9IHNoYXJlZEFnZW50cy5nZXQoa2V5KTtcbiAgaWYgKCFhZ2VudCkge1xuICAgIGFnZW50ID0gbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IHRydWUsIG1heFNvY2tldHMgfSk7XG4gICAgc2hhcmVkQWdlbnRzLnNldChrZXksIGFnZW50KTtcbiAgfVxuICByZXR1cm4gYWdlbnQ7XG59XG5cbi8qKlxuICogQ2xvc2UgZXZlcnkgc2hhcmVkIGtlZXAtYWxpdmUgYWdlbnQgKGlkbGUgc29ja2V0cyBhcmUgcmVsZWFzZWQ7IGluLWZsaWdodFxuICogcmVxdWVzdHMgZmluaXNoKS4gRm9yIHByb2Nlc3Mgc2h1dGRvd24gYW5kIHRlc3RzIOKAlCBhIGxhdGVyIHJlcXVlc3Qgc2ltcGx5XG4gKiBidWlsZHMgYSBmcmVzaCBhZ2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc3Ryb3lTaGFyZWRIdHRwQWdlbnRzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGFnZW50IG9mIHNoYXJlZEFnZW50cy52YWx1ZXMoKSkgYWdlbnQuZGVzdHJveSgpO1xuICBzaGFyZWRBZ2VudHMuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGNsYXNzIEludGVybmFsSHR0cENsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBSZXF1aXJlZDxTZXJ2aWNlQ29uZmlnPjtcbiAgcHJpdmF0ZSBhZ2VudDogaHR0cC5BZ2VudDtcbiAgcHJpdmF0ZSBicmVha2VyQ2xhc3M/OiBzdHJpbmc7XG4gIHByaXZhdGUgbWF4UmVzcG9uc2VCeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgSFRUUCBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBTZXJ2aWNlIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25uZWN0aW9uLXBvb2wgY29udHJvbHMgKG93biBhZ2VudCAvIHNvY2tldCBjYXApXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgaG9zdDogY29uZmlnLmhvc3QsXG4gICAgICBwb3J0OiBjb25maWcucG9ydCxcbiAgICAgIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnQgPSBvcHRpb25zPy5hZ2VudFxuICAgICAgPz8gZ2V0U2hhcmVkQWdlbnQodGhpcy5jb25maWcuaG9zdCwgdGhpcy5jb25maWcucG9ydCwgb3B0aW9ucz8ubWF4U29ja2V0cyA/PyBERUZBVUxUX01BWF9TT0NLRVRTKTtcbiAgICB0aGlzLmJyZWFrZXJDbGFzcyA9IG9wdGlvbnM/LmJyZWFrZXJDbGFzcztcbiAgICB0aGlzLm1heFJlc3BvbnNlQnl0ZXMgPSBvcHRpb25zPy5tYXhSZXNwb25zZUJ5dGVzID8/IERFRkFVTFRfTUFYX1JFU1BPTlNFX0JZVEVTO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBHRVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIGdldDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoUmV0cnk8VD4oJ0dFVCcsIHBhdGgsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhIFBPU1QgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdFdpdGhSZXRyeTxUPignUE9TVCcsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYSBQVVQgcmVxdWVzdC5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4oXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdQVVQnLCBwYXRoLCBib2R5LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aFJldHJ5PFQ+KCdERUxFVEUnLCBwYXRoLCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzLlxuICAgKlxuICAgKiAtIDQyOSAocmF0ZSBsaW1pdCk6IHJlc3BlY3RzIGBSZXRyeS1BZnRlcmAgaGVhZGVyLCB1c2VzIGxvbmdlciBiYXNlIGRlbGF5ICg0eCksXG4gICAqICAgcmV0cmllcyB1cCB0byBgbWF4UmF0ZUxpbWl0UmV0cmllc2AgdGltZXMgKGRlZmF1bHQgNCkuXG4gICAqIC0gNTAyLzUwMy81MDQgKHNlcnZlciBlcnJvcnMpOiBzdGFuZGFyZCBleHBvbmVudGlhbCBiYWNrb2ZmLCB1cCB0byBgbWF4UmV0cmllc2AgKGRlZmF1bHQgMikuXG4gICAqIC0gQ29ubmVjdGlvbiBlcnJvcnMgLyB0aW1lb3V0czogcmV0cmllcyB1cCB0byBgbWF4UmV0cmllc2AuXG4gICAqIC0gQWxsIGRlbGF5cyBpbmNsdWRlIMKxMjUlIGppdHRlciB0byBwcmV2ZW50IHRodW5kZXJpbmcgaGVyZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVxdWVzdFdpdGhSZXRyeTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgYm9keT86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPj4ge1xuICAgIC8vIEEgbWFsZm9ybWVkIHBhdGggaXMgYSBDTElFTlQgYnVnLCBub3QgYSBkb3duc3RyZWFtIGZhdWx0IOKAlCByZWplY3QgaXQgdXBcbiAgICAvLyBmcm9udCBzbyBpdCBuZXZlciBidXJucyByZXRyaWVzIG9yIGZlZWRzIHRoZSBjaXJjdWl0IGJyZWFrZXIgKHdoaWNoIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNoZWQgdHJhZmZpYyB0byBhIHBlcmZlY3RseSBoZWFsdGh5IGRvd25zdHJlYW0pLiByZXF1ZXN0KCkga2VlcHNcbiAgICAvLyB0aGUgc2FtZSBndWFyZCBhcyBkZWZlbmNlLWluLWRlcHRoLlxuICAgIGlmIChwYXRoLmluY2x1ZGVzKCc6Ly8nKSB8fCBwYXRoLnN0YXJ0c1dpdGgoJy8vJykgfHwgL1tcXHJcXG5cXDBdLy50ZXN0KHBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVxdWVzdCBwYXRoOiAke3BhdGh9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlDb25maWc6IFJldHJ5Q29uZmlnID0ge1xuICAgICAgbWF4UmV0cmllczogb3B0aW9ucz8ubWF4UmV0cmllcyA/PyBERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgbWF4UmF0ZUxpbWl0UmV0cmllczogb3B0aW9ucz8ubWF4UmF0ZUxpbWl0UmV0cmllcyA/PyBERUZBVUxUX01BWF9SQVRFX0xJTUlUX1JFVFJJRVMsXG4gICAgICByZXRyeURlbGF5TXM6IG9wdGlvbnM/LnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gICAgY29uc3QgdG90YWxNYXhBdHRlbXB0cyA9IE1hdGgubWF4KHJldHJ5Q29uZmlnLm1heFJldHJpZXMsIHJldHJ5Q29uZmlnLm1heFJhdGVMaW1pdFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkFURV9MSU1JVF9SRVRSSUVTKTtcblxuICAgIC8vIFdoZXRoZXIgaXQncyBzYWZlIHRvIGF1dG8tcmV0cnkgdGhpcyByZXF1ZXN0IG9uIGEgNXh4L2Nvbm5lY3Rpb24vdGltZW91dC5cbiAgICAvLyBBIHRpbWVkLW91dCBQT1NUIG1heSBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgc2VydmVyLXNpZGUsIHNvIHJldHJ5aW5nXG4gICAgLy8gYSBub24taWRlbXBvdGVudCByZXF1ZXN0IHJpc2tzIGEgRFVQTElDQVRFIHNpZGUgZWZmZWN0IChkb3VibGUtY2hhcmdlLFxuICAgIC8vIGRvdWJsZS1jcmVhdGUpLiBPbmx5IEdFVC9IRUFEL09QVElPTlMsIGFuIGV4cGxpY2l0IGBpZGVtcG90ZW50YCBvcHQtaW4sIG9yXG4gICAgLy8gYSByZXF1ZXN0IGNhcnJ5aW5nIGFuIElkZW1wb3RlbmN5LUtleSBhcmUgYXV0by1yZXRyaWVkIG9uIHRob3NlIGZhaWx1cmVzLlxuICAgIC8vICg0MjkgaXMgYWx3YXlzIHJldHJpZWQg4oCUIHNlZSBiZWxvdyDigJQgc2luY2UgaXQgd2FzIHJlamVjdGVkLCBub3QgcHJvY2Vzc2VkLilcbiAgICBjb25zdCByZXRyeVNhZmUgPVxuICAgICAgSURFTVBPVEVOVF9NRVRIT0RTLmhhcyhtZXRob2QudG9VcHBlckNhc2UoKSkgfHxcbiAgICAgIG9wdGlvbnM/LmlkZW1wb3RlbnQgPT09IHRydWUgfHxcbiAgICAgICEhKG9wdGlvbnM/LmhlYWRlcnMgJiYgKG9wdGlvbnMuaGVhZGVyc1snSWRlbXBvdGVuY3ktS2V5J10gfHwgb3B0aW9ucy5oZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSkpO1xuXG4gICAgLy8gUGVyLXRhcmdldCBjaXJjdWl0IGJyZWFrZXIgKyBTMlMgcmVxdWVzdCBtZXRyaWNzLiBgdGFyZ2V0YCBpcyB0aGUgc2hhcmVkXG4gICAgLy8gYnJlYWtlci9tZXRyaWMga2V5IHNvIG9uZSBiYWQgZG93bnN0cmVhbSB0cmlwcyBvbmNlIChub3Qgb25jZS1wZXItY2xpZW50KVxuICAgIC8vIGFuZCBkYXNoYm9hcmRzIGNhbiBzZWUgUzJTIGhlYWx0aCBwZXIgY2FsbGVlLlxuICAgIGNvbnN0IHRhcmdldCA9IGAke3RoaXMuY29uZmlnLmhvc3R9OiR7dGhpcy5jb25maWcucG9ydH1gO1xuICAgIGNvbnN0IGJyZWFrZXIgPSBnZXRDaXJjdWl0QnJlYWtlcihjaXJjdWl0QnJlYWtlcktleSh0YXJnZXQsIG9wdGlvbnM/LmJyZWFrZXJDbGFzcyA/PyB0aGlzLmJyZWFrZXJDbGFzcykpO1xuICAgIGlmICghYnJlYWtlci5hbGxvd1JlcXVlc3QoKSkge1xuICAgICAgLy8gRmFzdC1mYWlsIHdpdGhvdXQgdG91Y2hpbmcgdGhlIG5ldHdvcmsg4oCUIHRoaXMgaXMgdGhlIGxvYWQtc2hlZGRpbmcgdGhhdFxuICAgICAgLy8gcHJldmVudHMgYSBkb3duc3RyZWFtIGJyb3dub3V0IGZyb20gY2FzY2FkaW5nIHZpYSByZXRyeSBzdG9ybXMuXG4gICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2NpcmN1aXRfb3BlbicgfSk7XG4gICAgICB0aHJvdyBuZXcgQ2lyY3VpdE9wZW5FcnJvcih0YXJnZXQpO1xuICAgIH1cblxuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gdG90YWxNYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdDxUPihtZXRob2QsIHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZ2V0UmV0cnlEZWNpc2lvbihyZXNwb25zZS5zdGF0dXNDb2RlLCByZXNwb25zZS5oZWFkZXJzLCBhdHRlbXB0LCByZXRyeUNvbmZpZyk7XG4gICAgICAgIC8vIDQyOSBpcyBzYWZlIHRvIHJldHJ5IGZvciBBTlkgbWV0aG9kIChyYXRlLWxpbWl0ZWQg4oaSIG5vdCBwcm9jZXNzZWQpOyBhXG4gICAgICAgIC8vIDV4eC9nYXRld2F5IGVycm9yIGlzIG9ubHkgcmV0cmllZCB3aGVuIHRoZSByZXF1ZXN0IGlzIHJldHJ5LXNhZmUuXG4gICAgICAgIGlmIChkZWNpc2lvbi5zaG91bGRSZXRyeSAmJiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDI5IHx8IHJldHJ5U2FmZSkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoZGVjaXNpb24ucmVhc29uICsgJywgcmV0cnlpbmcnLCB7IG1ldGhvZCwgcGF0aCwgYXR0ZW1wdDogYXR0ZW1wdCArIDEsIGRlbGF5TXM6IGRlY2lzaW9uLmRlbGF5TXMgfSk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0X3JldHJpZXNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kIH0pO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoZGVjaXNpb24uZGVsYXlNcyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUZXJtaW5hbCByZXNwb25zZS4gQSA1eHggaXMgYSBkb3duc3RyZWFtIGZhdWx0IChmZWVkcyB0aGUgYnJlYWtlcik7IGFcbiAgICAgICAgLy8gNDI5IGlzIGJhY2twcmVzc3VyZSwgbm90IGEgZmF1bHQg4oCUIHRoZSBzZXJ2aWNlIGFuc3dlcmVkLCBzbyBpdCBjb3VudHNcbiAgICAgICAgLy8gYXMgc3VjY2VzcyBmb3IgYnJlYWtlciBwdXJwb3NlcyAobmV2ZXIgdHJpcCB0aGUgYnJlYWtlciBvbiByYXRlIGxpbWl0cykuXG4gICAgICAgIGNvbnN0IGlzU2VydmVyRmF1bHQgPSByZXNwb25zZS5zdGF0dXNDb2RlID49IDUwMCAmJiByZXNwb25zZS5zdGF0dXNDb2RlIDw9IDU5OTtcbiAgICAgICAgaWYgKGlzU2VydmVyRmF1bHQpIHtcbiAgICAgICAgICBicmVha2VyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ3NlcnZlcl9lcnJvcicgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtlci5yZWNvcmRTdWNjZXNzKCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ3Myc19yZXF1ZXN0c190b3RhbCcsIHsgdGFyZ2V0LCBtZXRob2QsIG91dGNvbWU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG5cbiAgICAgICAgLy8gQW4gb3ZlcnNpemVkIGJvZHkgaXMgdGhlIHBlZXIncyBjb250ZW50LCBub3QgYSB0cmFuc2llbnQgZmF1bHQ6IG5ldmVyXG4gICAgICAgIC8vIHJlLWRvd25sb2FkIGl0LCBhbmQgbmV2ZXIgY291bnQgaXQgYWdhaW5zdCB0aGUgYnJlYWtlci5cbiAgICAgICAgaWYgKGxhc3RFcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlVG9vTGFyZ2VFcnJvcikge1xuICAgICAgICAgIGJyZWFrZXIucmVjb3JkU3VjY2VzcygpO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAndG9vX2xhcmdlJyB9KTtcbiAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBnZXRFcnJvclJldHJ5RGVjaXNpb24oYXR0ZW1wdCwgcmV0cnlDb25maWcpO1xuICAgICAgICBpZiAoZGVjaXNpb24uc2hvdWxkUmV0cnkgJiYgcmV0cnlTYWZlKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXRyeWluZyBhZnRlciBlcnJvcicsIHsgbWV0aG9kLCBwYXRoLCBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIGF0dGVtcHQ6IGF0dGVtcHQgKyAxIH0pO1xuICAgICAgICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdF9yZXRyaWVzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCB9KTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlY2lzaW9uLmRlbGF5TXMpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdCByZXRyeWluZyAobm9uLWlkZW1wb3RlbnQsIG9yIGF0dGVtcHRzIGV4aGF1c3RlZCkg4oCUIGEgY29ubmVjdGlvblxuICAgICAgICAvLyBlcnJvci90aW1lb3V0IGlzIGEgZG93bnN0cmVhbSBmYXVsdDogZmVlZCB0aGUgYnJlYWtlciBhbmQgZmFpbCBub3cuXG4gICAgICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICBlbWl0Q291bnRlcignczJzX3JlcXVlc3RzX3RvdGFsJywgeyB0YXJnZXQsIG1ldGhvZCwgb3V0Y29tZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgdGhyb3cgbGFzdEVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvb3AgZXhoYXVzdGVkIHdpdGhvdXQgcmV0dXJuaW5nIChhbGwgYXR0ZW1wdHMgcmV0cmllZCB0aGVuIHJhbiBvdXQpLlxuICAgIGJyZWFrZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgIGVtaXRDb3VudGVyKCdzMnNfcmVxdWVzdHNfdG90YWwnLCB7IHRhcmdldCwgbWV0aG9kLCBvdXRjb21lOiAnZXJyb3InIH0pO1xuICAgIHRocm93IGxhc3RFcnJvciE7XG4gIH1cblxuICBwcml2YXRlIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgcmVxdWVzdCBtZXRob2QuXG4gICAqL1xuICBwcml2YXRlIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gU2VyaWFsaXplIHdoZW4gYm9keSBpcyBkZWZpbmVkIChpbmNsdWRpbmcgMC9mYWxzZS8nJyB3aGljaCBhcmUgdmFsaWQgSlNPTiB2YWx1ZXMpLlxuICAgICAgY29uc3QgYm9keVN0ciA9IGJvZHkgIT09IHVuZGVmaW5lZCA/IEpTT04uc3RyaW5naWZ5KGJvZHkpIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBoZWFkZXJzOiBodHRwLk91dGdvaW5nSHR0cEhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9O1xuXG4gICAgICAvLyBQcm9wYWdhdGUgcmVxdWVzdCBJRCBmb3IgZGlzdHJpYnV0ZWQgdHJhY2luZ1xuICAgICAgaWYgKG9wdGlvbnM/LnJlcXVlc3RJZCkge1xuICAgICAgICBoZWFkZXJzWydYLVJlcXVlc3QtSWQnXSA9IG9wdGlvbnMucmVxdWVzdElkO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm9keVN0cikge1xuICAgICAgICBoZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gQnVmZmVyLmJ5dGVMZW5ndGgoYm9keVN0cik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIHBhdGggdG8gcHJldmVudCBwcm90b2NvbCBpbmplY3Rpb24gLyByZXF1ZXN0IHNtdWdnbGluZ1xuICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJzovLycpIHx8IHBhdGguc3RhcnRzV2l0aCgnLy8nKSB8fCAvW1xcclxcblxcMF0vLnRlc3QocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3QgcGF0aDogJHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0ID8/IHRoaXMuY29uZmlnLnRpbWVvdXQ7XG4gICAgICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/Lm1heFJlc3BvbnNlQnl0ZXMgPz8gdGhpcy5tYXhSZXNwb25zZUJ5dGVzO1xuXG4gICAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogaHR0cC5SZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdG5hbWU6IHRoaXMuY29uZmlnLmhvc3QsXG4gICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgIHBhdGg6IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWAsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgLy8gU29ja2V0IElETEUgdGltZW91dC4gVGhlIHRvdGFsIGRlYWRsaW5lIGJlbG93IGJvdW5kcyB0aGUgd2hvbGVcbiAgICAgICAgLy8gZXhjaGFuZ2Ug4oCUIGEgcGVlciB0cmlja2xpbmcgb25lIGJ5dGUgcGVyIGludGVydmFsIG5ldmVyIGdvZXMgaWRsZS5cbiAgICAgICAgdGltZW91dDogdGltZW91dE1zLFxuICAgICAgICBhZ2VudDogdGhpcy5hZ2VudCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldHRsZSBleGFjdGx5IG9uY2UsIHdoaWNoZXZlciBvZiB0aGUgbWFueSB0ZXJtaW5hbCBldmVudHMgZmlyZXMgZmlyc3RcbiAgICAgIC8vIChyZXNwb25zZSBlbmQsIHJlcXVlc3QvcmVzcG9uc2UgZXJyb3IsIGFib3J0LCBwcmVtYXR1cmUgY2xvc2UsIGRlYWRsaW5lLFxuICAgICAgLy8gc2l6ZSBjYXApLiBFdmVyeSBleGl0IHBhdGggY2xlYXJzIHRoZSBkZWFkbGluZSB0aW1lci5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgZGVhZGxpbmU6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZmFpbCA9IChlcnJvcjogRXJyb3IpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdWNjZWVkID0gKHZhbHVlOiBIdHRwQ2xpZW50UmVzcG9uc2U8VD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChkZWFkbGluZSkgY2xlYXJUaW1lb3V0KGRlYWRsaW5lKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBodHRwLnJlcXVlc3QocmVxdWVzdE9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICAgIHJlcy5vbignZGF0YScsIChyYXc6IEJ1ZmZlciB8IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgPyBCdWZmZXIuZnJvbShyYXcpIDogcmF3O1xuICAgICAgICAgIHJlY2VpdmVkICs9IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAocmVjZWl2ZWQgPiBtYXhCeXRlcykge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVzcG9uc2UgZXhjZWVkZWQgc2l6ZSBjYXAnLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIG1heEJ5dGVzIH0pO1xuICAgICAgICAgICAgZmFpbChuZXcgUmVzcG9uc2VUb29MYXJnZUVycm9yKG1heEJ5dGVzKSk7XG4gICAgICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gZmFpbGluZyBvciBiZWluZyBjdXQgbWlkLWJvZHkgbXVzdCByZWplY3Qg4oCUIGJlZm9yZSxcbiAgICAgICAgLy8gdGhlc2UgbGVmdCB0aGUgcHJvbWlzZSBwZW5kaW5nIGZvcmV2ZXIgKGEgaHVuZyBjYWxsZXIsIGFuZCBhIGJyZWFrZXJcbiAgICAgICAgLy8gcHJvYmUgdGhhdCBuZXZlciByZXBvcnRlZCBiYWNrKS5cbiAgICAgICAgcmVzLm9uKCdlcnJvcicsIChlcnJvcikgPT4gZmFpbChlcnJvcikpO1xuICAgICAgICByZXMub24oJ2Fib3J0ZWQnLCAoKSA9PiBmYWlsKG5ldyBFcnJvcignUmVzcG9uc2UgYWJvcnRlZCBieSBwZWVyIGJlZm9yZSBjb21wbGV0aW9uJykpKTtcbiAgICAgICAgcmVzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoIXJlcy5jb21wbGV0ZSkgZmFpbChuZXcgRXJyb3IoJ1Jlc3BvbnNlIGNsb3NlZCBiZWZvcmUgY29tcGxldGlvbicpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygndXRmOCcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gZGF0YSA/IEpTT04ucGFyc2UoZGF0YSkgOiB7fTtcbiAgICAgICAgICAgIHN1Y2NlZWQoe1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSB8fCBIdHRwU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgICAgYm9keTogcGFyc2VkQm9keSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UgYm9keScsIHtcbiAgICAgICAgICAgICAgaG9zdDogdGhpcy5jb25maWcuaG9zdCxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShwYXJzZUVycm9yKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3VjY2VlZCh7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlcy5zdGF0dXNDb2RlIHx8IEh0dHBTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICAgICAgICBib2R5OiB7fSBhcyBULFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuOyAvLyBvdXIgb3duIGRlc3Ryb3koKSBhZnRlciBhIGRlYWRsaW5lL3NpemUtY2FwIGZhaWx1cmVcbiAgICAgICAgLy8gTm9kZSBkdWFsLXN0YWNrIGNvbm5lY3QgZmFpbHVyZXMgYXJlIGFuIEFnZ3JlZ2F0ZUVycm9yIHdpdGggYW4gZW1wdHlcbiAgICAgICAgLy8gYC5tZXNzYWdlYDsgdGhlIGNhdXNlIGlzIGluIGAuY29kZWAgKEVDT05OUkVGVVNFRC9FVElNRURPVVQpLiBGYWxsXG4gICAgICAgIC8vIGJhY2sgc28gdGhlIGxvZyBpc24ndCBhIGJsYW5rIGBlcnJvcjpcIlwiYC5cbiAgICAgICAgY29uc3QgZGV0YWlsID0gZXJyb3IubWVzc2FnZSB8fCAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlIHx8IGVycm9yLm5hbWU7XG4gICAgICAgIGxvZ2dlci5lcnJvcignSFRUUCByZXF1ZXN0IGZhaWxlZCcsIHtcbiAgICAgICAgICBob3N0OiB0aGlzLmNvbmZpZy5ob3N0LFxuICAgICAgICAgIHBvcnQ6IHRoaXMuY29uZmlnLnBvcnQsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgZXJyb3I6IGRldGFpbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZhaWwoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRpbWVvdXRFcnJvciA9ICgpID0+IG5ldyBFcnJvcihgUmVxdWVzdCB0aW1lb3V0IGFmdGVyICR7dGltZW91dE1zfW1zYCk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0hUVFAgcmVxdWVzdCB0aW1lb3V0IChzb2NrZXQgaWRsZSknLCB7IGhvc3Q6IHRoaXMuY29uZmlnLmhvc3QsIHBhdGgsIHRpbWVvdXQ6IHRpbWVvdXRNcyB9KTtcbiAgICAgICAgZmFpbCh0aW1lb3V0RXJyb3IoKSk7XG4gICAgICAgIHJlcS5kZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHJlcXVlc3QgY2xvc2luZyBiZWZvcmUgd2Ugc2V0dGxlZCAobm8gcmVzcG9uc2UsIG9yIGEgcmVzcG9uc2Ugd2VcbiAgICAgIC8vIG5ldmVyIGZpbmlzaGVkKSBpcyBhIGZhaWx1cmUsIG5vdCBzaWxlbmNlLlxuICAgICAgcmVxLm9uKCdjbG9zZScsICgpID0+IGZhaWwobmV3IEVycm9yKCdSZXF1ZXN0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSBjb21wbGV0ZWQnKSkpO1xuXG4gICAgICAvLyBUT1RBTCBkZWFkbGluZSBmb3IgdGhlIGV4Y2hhbmdlIChjb25uZWN0ICsgc2VuZCArIGZ1bGwgYm9keSkuXG4gICAgICBkZWFkbGluZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignSFRUUCByZXF1ZXN0IHRpbWVvdXQgKHRvdGFsIGRlYWRsaW5lKScsIHsgaG9zdDogdGhpcy5jb25maWcuaG9zdCwgcGF0aCwgdGltZW91dDogdGltZW91dE1zIH0pO1xuICAgICAgICBmYWlsKHRpbWVvdXRFcnJvcigpKTtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgICBkZWFkbGluZS51bnJlZj8uKCk7XG5cbiAgICAgIGlmIChib2R5U3RyKSB7XG4gICAgICAgIHJlcS53cml0ZShib2R5U3RyKTtcbiAgICAgIH1cblxuICAgICAgcmVxLmVuZCgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIEhUVFAgY2xpZW50IHdpdGggZXJyb3IgaGFuZGxpbmcgdGhhdCByZXR1cm5zIG51bGwgb24gZmFpbHVyZS5cbiAqIFVzZWZ1bCBmb3IgZmFpbC1vcGVuIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gU2VydmljZSBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDbGllbnQgd3JhcHBlciB3aXRoIHNhZmUgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2FmZUNsaWVudChjb25maWc6IFNlcnZpY2VDb25maWcsIG9wdGlvbnM/OiBIdHRwQ2xpZW50T3B0aW9ucykge1xuICBjb25zdCBjbGllbnQgPSBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KGNvbmZpZywgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBTYWZlIEdFVCByZXF1ZXN0IC0gcmV0dXJucyBudWxsIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUPihwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8SHR0cENsaWVudFJlc3BvbnNlPFQ+IHwgbnVsbD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5nZXQ8VD4ocGF0aCwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIEdFVCBmYWlsZWQsIHJldHVybmluZyBudWxsJywgeyBwYXRoLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTYWZlIFBPU1QgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwb3N0PFQ+KFxuICAgICAgcGF0aDogc3RyaW5nLFxuICAgICAgYm9keT86IHVua25vd24sXG4gICAgICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4gICAgKTogUHJvbWlzZTxIdHRwQ2xpZW50UmVzcG9uc2U8VD4gfCBudWxsPiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2xpZW50LnBvc3Q8VD4ocGF0aCwgYm9keSwgb3B0aW9ucyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdTYWZlIFBPU1QgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBQVVQgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBwdXQ8VD4oXG4gICAgICBwYXRoOiBzdHJpbmcsXG4gICAgICBib2R5PzogdW5rbm93bixcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQucHV0PFQ+KHBhdGgsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBQVVQgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2FmZSBERUxFVEUgcmVxdWVzdCAtIHJldHVybnMgbnVsbCBvbiBlcnJvci4gVXNlZCBieSBkZXN0cnVjdGl2ZVxuICAgICAqIGNyb3NzLXNlcnZpY2Ugb3BlcmF0aW9ucyAoZS5nLiBvcmctY2FzY2FkZSBkZWxldGUgaW4gcGxhdGZvcm0pLlxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZTxUPihcbiAgICAgIHBhdGg6IHN0cmluZyxcbiAgICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgICApOiBQcm9taXNlPEh0dHBDbGllbnRSZXNwb25zZTxUPiB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBjbGllbnQuZGVsZXRlPFQ+KHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnU2FmZSBERUxFVEUgZmFpbGVkLCByZXR1cm5pbmcgbnVsbCcsIHsgcGF0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
@@ -1,25 +1,26 @@
1
- export * from './api-key-exchange.js';
2
- export * from './cache-service.js';
3
- export * from './leader-lock.js';
4
- export * from './scheduler.js';
5
- export * from './compliance-client.js';
1
+ export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
2
+ export { createCacheService, type RedisCacheClient, type CacheInvalidationMessage, type CacheInvalidationBus, type RedisInvalidationClient, CacheService, } from './cache-service.js';
3
+ export { closeLeaderLock, withLeaderLock, createEnvRedisLock, type LockRedis, } from './leader-lock.js';
4
+ export { sendSystemNotification, SYSTEM_NOTIFY_PATH, type SystemNotification, } from './system-notification.js';
5
+ export { createScheduler, type SchedulerOptions, type Scheduler, } from './scheduler.js';
6
+ export { createComplianceClient, type ComplianceCheckResult, type ComplianceViolation, } from './compliance-client.js';
7
+ export { pluginRunsOwnImage, pluginComplianceTags, derivePluginImageCompliance, type PluginComplianceAttributes, PLUGIN_IMAGE_COMPLIANCE_FIELDS, type PluginImageRow, } from '../utils/plugin-compliance.js';
6
8
  export * from './compliance-event-subscriber.js';
7
- export * from './entity-events.js';
8
- export * from './http-client.js';
9
- export * from './jwks-cache.js';
10
- export { SERVICE_TOKEN_ALGORITHM, SERVICE_SUBJECT_PREFIX, ServiceKeyError, serviceIdentity, serviceKeyMode, isServiceKid, knownServiceNames, verifyServiceJwt, isRetiringServiceKeyPublished, } from './service-keys.js';
11
- export type { ServiceKeyEntry } from './service-keys.js';
12
- export { CircuitOpenError, resetCircuitBreakers } from './circuit-breaker.js';
13
- export type { CircuitState } from './circuit-breaker.js';
14
- export * from './durable-event-bus.js';
15
- export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
16
- export type { RetryConfig, RetryDecision } from './retry-strategy.js';
17
- export * from './retry-forever.js';
18
- export * from './quota.js';
19
- export * from './remote-audit-client.js';
20
- export * from './audit-spool.js';
21
- export * from './env-redis.js';
22
- export * from './token-revocation.js';
23
- export * from './sse-ticket-store.js';
24
- export * from './service-boot.js';
25
- export * from './notification-channels.js';
9
+ export { type EntityEvent, type EntityEventSubscriber, entityEvents, } from './entity-events.js';
10
+ export { destroySharedHttpAgents, createSafeClient, ResponseTooLargeError, InternalHttpClient, } from './http-client.js';
11
+ export { setPlatformJwksCache, JwksUnavailableError, UnknownKidError, JwksCache, } from './jwks-cache.js';
12
+ export { isServiceKid, serviceIdentity, verifyServiceJwt, } from './service-keys.js';
13
+ export { resetCircuitBreakers, } from './circuit-breaker.js';
14
+ export { createEnvRedisDurableEventBus, type EventSubscription, type DurableEventBus, } from './durable-event-bus.js';
15
+ export { getErrorRetryDecision, } from './retry-strategy.js';
16
+ export type { RetryConfig, } from './retry-strategy.js';
17
+ export { nextBackoffMs, retryForever, } from './retry-forever.js';
18
+ export { getQuotaServiceAuthHeader, createQuotaService, incrementQuota, reserveQuota, sendQuotaReserveDenied, decrementQuota, type QuotaReserveResult, type QuotaService, } from './quota.js';
19
+ export { isRemoteAuditAction, createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, REMOTE_AUDIT_ACTIONS, type RemoteAuditEvent, type RemoteAuditClient, } from './remote-audit-client.js';
20
+ export { auditSpoolKey, createEnvRedisAuditSpool, type AuditSpool, } from './audit-spool.js';
21
+ export { resolveRedisConnection, describeRedisConnection, createRedisClient, createEnvRedisClient, createRedisReadyGate, incrWindow, RedisConfigError, type RedisEvalClient, } from './env-redis.js';
22
+ export { createRedisTokenRevocationStore, createEnvRedisTokenRevocationStore, publishTokenRevocation, publishSessionRevocation, publishCredentialRevocation, } from './token-revocation.js';
23
+ export { createMemorySseTicketStore, createEnvSseTicketStore, envSseTicketCaps, type EnvSseTicketStoreConfig, type SseTicketStore, type SseTicketStoreConfig, } from './sse-ticket-store.js';
24
+ export { wireServiceSecurity, } from './service-boot.js';
25
+ export { createWebhookChannel, createEmailChannel, createChannelRegistry, type NotificationPriority, type NotificationMessage, type ChannelTarget, type DeliveryResult, type NotificationChannel, } from './notification-channels.js';
26
+ export { createEcosystemNotifyClient, ECOSYSTEM_NOTIFY_PATH, type EcosystemNotifyClient, } from './ecosystem-notify-client.js';
@@ -1,31 +1,34 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- export * from './api-key-exchange.js';
4
- export * from './cache-service.js';
5
- export * from './leader-lock.js';
6
- export * from './scheduler.js';
7
- export * from './compliance-client.js';
3
+ export { exchangeApiKey, resetApiKeyExchangeCache, ApiKeyRejectedError, ApiKeyExchangeUnavailableError, } from './api-key-exchange.js';
4
+ export { createCacheService, CacheService, } from './cache-service.js';
5
+ export { closeLeaderLock, withLeaderLock, createEnvRedisLock, } from './leader-lock.js';
6
+ export { sendSystemNotification, SYSTEM_NOTIFY_PATH, } from './system-notification.js';
7
+ export { createScheduler, } from './scheduler.js';
8
+ export { createComplianceClient, } from './compliance-client.js';
9
+ export { pluginRunsOwnImage, pluginComplianceTags, derivePluginImageCompliance, PLUGIN_IMAGE_COMPLIANCE_FIELDS, } from '../utils/plugin-compliance.js';
8
10
  export * from './compliance-event-subscriber.js';
9
- export * from './entity-events.js';
10
- export * from './http-client.js';
11
- export * from './jwks-cache.js';
11
+ export { entityEvents, } from './entity-events.js';
12
+ export { destroySharedHttpAgents, createSafeClient, ResponseTooLargeError, InternalHttpClient, } from './http-client.js';
13
+ export { setPlatformJwksCache, JwksUnavailableError, UnknownKidError, JwksCache, } from './jwks-cache.js';
12
14
  // Service-key internals stay internal. The package surface is the verify/inspect
13
15
  // side that platform's JWT options and the auth middleware need; key MATERIAL
14
16
  // handling (`signServiceJwt`, the bundle, the test reset hook) is reachable only
15
17
  // by deep import from inside api-core and its testing helpers.
16
- export { SERVICE_TOKEN_ALGORITHM, SERVICE_SUBJECT_PREFIX, ServiceKeyError, serviceIdentity, serviceKeyMode, isServiceKid, knownServiceNames, verifyServiceJwt, isRetiringServiceKeyPublished, } from './service-keys.js';
18
+ export { isServiceKid, serviceIdentity, verifyServiceJwt, } from './service-keys.js';
17
19
  // The breaker is wired by the shared HTTP client; services consume its EFFECT,
18
20
  // not the class. Only the operational surface is public.
19
- export { CircuitOpenError, resetCircuitBreakers } from './circuit-breaker.js';
20
- export * from './durable-event-bus.js';
21
- export { DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY_MS, DEFAULT_MAX_RATE_LIMIT_RETRIES, calculateBackoff, getRetryDecision, getErrorRetryDecision, } from './retry-strategy.js';
22
- export * from './retry-forever.js';
23
- export * from './quota.js';
24
- export * from './remote-audit-client.js';
25
- export * from './audit-spool.js';
26
- export * from './env-redis.js';
27
- export * from './token-revocation.js';
28
- export * from './sse-ticket-store.js';
29
- export * from './service-boot.js';
30
- export * from './notification-channels.js';
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxpRkFBaUY7QUFDakYsOEVBQThFO0FBQzlFLGlGQUFpRjtBQUNqRiwrREFBK0Q7QUFDL0QsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGVBQWUsRUFDZixjQUFjLEVBQ2QsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsNkJBQTZCLEdBQzlCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsK0VBQStFO0FBQy9FLHlEQUF5RDtBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5RSxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyw0QkFBNEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2FwaS1rZXktZXhjaGFuZ2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbXBsaWFuY2UtZXZlbnQtc3Vic2NyaWJlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2VudGl0eS1ldmVudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2p3a3MtY2FjaGUuanMnO1xuLy8gU2VydmljZS1rZXkgaW50ZXJuYWxzIHN0YXkgaW50ZXJuYWwuIFRoZSBwYWNrYWdlIHN1cmZhY2UgaXMgdGhlIHZlcmlmeS9pbnNwZWN0XG4vLyBzaWRlIHRoYXQgcGxhdGZvcm0ncyBKV1Qgb3B0aW9ucyBhbmQgdGhlIGF1dGggbWlkZGxld2FyZSBuZWVkOyBrZXkgTUFURVJJQUxcbi8vIGhhbmRsaW5nIChgc2lnblNlcnZpY2VKd3RgLCB0aGUgYnVuZGxlLCB0aGUgdGVzdCByZXNldCBob29rKSBpcyByZWFjaGFibGUgb25seVxuLy8gYnkgZGVlcCBpbXBvcnQgZnJvbSBpbnNpZGUgYXBpLWNvcmUgYW5kIGl0cyB0ZXN0aW5nIGhlbHBlcnMuXG5leHBvcnQge1xuICBTRVJWSUNFX1RPS0VOX0FMR09SSVRITSxcbiAgU0VSVklDRV9TVUJKRUNUX1BSRUZJWCxcbiAgU2VydmljZUtleUVycm9yLFxuICBzZXJ2aWNlSWRlbnRpdHksXG4gIHNlcnZpY2VLZXlNb2RlLFxuICBpc1NlcnZpY2VLaWQsXG4gIGtub3duU2VydmljZU5hbWVzLFxuICB2ZXJpZnlTZXJ2aWNlSnd0LFxuICBpc1JldGlyaW5nU2VydmljZUtleVB1Ymxpc2hlZCxcbn0gZnJvbSAnLi9zZXJ2aWNlLWtleXMuanMnO1xuZXhwb3J0IHR5cGUgeyBTZXJ2aWNlS2V5RW50cnkgfSBmcm9tICcuL3NlcnZpY2Uta2V5cy5qcyc7XG4vLyBUaGUgYnJlYWtlciBpcyB3aXJlZCBieSB0aGUgc2hhcmVkIEhUVFAgY2xpZW50OyBzZXJ2aWNlcyBjb25zdW1lIGl0cyBFRkZFQ1QsXG4vLyBub3QgdGhlIGNsYXNzLiBPbmx5IHRoZSBvcGVyYXRpb25hbCBzdXJmYWNlIGlzIHB1YmxpYy5cbmV4cG9ydCB7IENpcmN1aXRPcGVuRXJyb3IsIHJlc2V0Q2lyY3VpdEJyZWFrZXJzIH0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBDaXJjdWl0U3RhdGUgfSBmcm9tICcuL2NpcmN1aXQtYnJlYWtlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2R1cmFibGUtZXZlbnQtYnVzLmpzJztcbmV4cG9ydCB7XG4gIERFRkFVTFRfTUFYX1JFVFJJRVMsXG4gIERFRkFVTFRfUkVUUllfREVMQVlfTVMsXG4gIERFRkFVTFRfTUFYX1JBVEVfTElNSVRfUkVUUklFUyxcbiAgY2FsY3VsYXRlQmFja29mZixcbiAgZ2V0UmV0cnlEZWNpc2lvbixcbiAgZ2V0RXJyb3JSZXRyeURlY2lzaW9uLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB0eXBlIHsgUmV0cnlDb25maWcsIFJldHJ5RGVjaXNpb24gfSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmV0cnktZm9yZXZlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3F1b3RhLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F1ZGl0LXNwb29sLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdG9rZW4tcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZmljYXRpb24tY2hhbm5lbHMuanMnO1xuIl19
21
+ export { resetCircuitBreakers, } from './circuit-breaker.js';
22
+ export { createEnvRedisDurableEventBus, } from './durable-event-bus.js';
23
+ export { getErrorRetryDecision, } from './retry-strategy.js';
24
+ export { nextBackoffMs, retryForever, } from './retry-forever.js';
25
+ export { getQuotaServiceAuthHeader, createQuotaService, incrementQuota, reserveQuota, sendQuotaReserveDenied, decrementQuota, } from './quota.js';
26
+ export { isRemoteAuditAction, createRemoteAuditClient, wireAuthzDenialAuditor, recordAudit, REMOTE_AUDIT_ACTIONS, } from './remote-audit-client.js';
27
+ export { auditSpoolKey, createEnvRedisAuditSpool, } from './audit-spool.js';
28
+ export { resolveRedisConnection, describeRedisConnection, createRedisClient, createEnvRedisClient, createRedisReadyGate, incrWindow, RedisConfigError, } from './env-redis.js';
29
+ export { createRedisTokenRevocationStore, createEnvRedisTokenRevocationStore, publishTokenRevocation, publishSessionRevocation, publishCredentialRevocation, } from './token-revocation.js';
30
+ export { createMemorySseTicketStore, createEnvSseTicketStore, envSseTicketCaps, } from './sse-ticket-store.js';
31
+ export { wireServiceSecurity, } from './service-boot.js';
32
+ export { createWebhookChannel, createEmailChannel, createChannelRegistry, } from './notification-channels.js';
33
+ export { createEcosystemNotifyClient, ECOSYSTEM_NOTIFY_PATH, } from './ecosystem-notify-client.js';
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIsOEJBQThCLEdBQy9CLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGNBQWMsRUFDZCxrQkFBa0IsR0FFbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGtCQUFrQixHQUVuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxlQUFlLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLDJCQUEyQixFQUUzQiw4QkFBOEIsR0FFL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFHTCxZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFNBQVMsR0FDVixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLGlGQUFpRjtBQUNqRiw4RUFBOEU7QUFDOUUsaUZBQWlGO0FBQ2pGLCtEQUErRDtBQUMvRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGVBQWUsRUFDZixnQkFBZ0IsR0FDakIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQiwrRUFBK0U7QUFDL0UseURBQXlEO0FBQ3pELE9BQU8sRUFDTCxvQkFBb0IsR0FDckIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsNkJBQTZCLEdBRzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLHFCQUFxQixHQUN0QixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxHQUNiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsY0FBYyxHQUdmLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsb0JBQW9CLEdBR3JCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixVQUFVLEVBQ1YsZ0JBQWdCLEdBRWpCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLCtCQUErQixFQUMvQixrQ0FBa0MsRUFDbEMsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4QiwyQkFBMkIsR0FDNUIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixnQkFBZ0IsR0FJakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsbUJBQW1CLEdBQ3BCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIscUJBQXFCLEdBTXRCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDJCQUEyQixFQUMzQixxQkFBcUIsR0FFdEIsTUFBTSw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBleGNoYW5nZUFwaUtleSxcbiAgcmVzZXRBcGlLZXlFeGNoYW5nZUNhY2hlLFxuICBBcGlLZXlSZWplY3RlZEVycm9yLFxuICBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IsXG59IGZyb20gJy4vYXBpLWtleS1leGNoYW5nZS5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVDYWNoZVNlcnZpY2UsXG4gIHR5cGUgUmVkaXNDYWNoZUNsaWVudCxcbiAgdHlwZSBDYWNoZUludmFsaWRhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2FjaGVJbnZhbGlkYXRpb25CdXMsXG4gIHR5cGUgUmVkaXNJbnZhbGlkYXRpb25DbGllbnQsXG4gIENhY2hlU2VydmljZSxcbn0gZnJvbSAnLi9jYWNoZS1zZXJ2aWNlLmpzJztcbmV4cG9ydCB7XG4gIGNsb3NlTGVhZGVyTG9jayxcbiAgd2l0aExlYWRlckxvY2ssXG4gIGNyZWF0ZUVudlJlZGlzTG9jayxcbiAgdHlwZSBMb2NrUmVkaXMsXG59IGZyb20gJy4vbGVhZGVyLWxvY2suanMnO1xuZXhwb3J0IHtcbiAgc2VuZFN5c3RlbU5vdGlmaWNhdGlvbixcbiAgU1lTVEVNX05PVElGWV9QQVRILFxuICB0eXBlIFN5c3RlbU5vdGlmaWNhdGlvbixcbn0gZnJvbSAnLi9zeXN0ZW0tbm90aWZpY2F0aW9uLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVNjaGVkdWxlcixcbiAgdHlwZSBTY2hlZHVsZXJPcHRpb25zLFxuICB0eXBlIFNjaGVkdWxlcixcbn0gZnJvbSAnLi9zY2hlZHVsZXIuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlQ29tcGxpYW5jZUNsaWVudCxcbiAgdHlwZSBDb21wbGlhbmNlQ2hlY2tSZXN1bHQsXG4gIHR5cGUgQ29tcGxpYW5jZVZpb2xhdGlvbixcbn0gZnJvbSAnLi9jb21wbGlhbmNlLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBwbHVnaW5SdW5zT3duSW1hZ2UsXG4gIHBsdWdpbkNvbXBsaWFuY2VUYWdzLFxuICBkZXJpdmVQbHVnaW5JbWFnZUNvbXBsaWFuY2UsXG4gIHR5cGUgUGx1Z2luQ29tcGxpYW5jZUF0dHJpYnV0ZXMsXG4gIFBMVUdJTl9JTUFHRV9DT01QTElBTkNFX0ZJRUxEUyxcbiAgdHlwZSBQbHVnaW5JbWFnZVJvdyxcbn0gZnJvbSAnLi4vdXRpbHMvcGx1Z2luLWNvbXBsaWFuY2UuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWV2ZW50LXN1YnNjcmliZXIuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBFbnRpdHlFdmVudCxcbiAgdHlwZSBFbnRpdHlFdmVudFN1YnNjcmliZXIsXG4gIGVudGl0eUV2ZW50cyxcbn0gZnJvbSAnLi9lbnRpdHktZXZlbnRzLmpzJztcbmV4cG9ydCB7XG4gIGRlc3Ryb3lTaGFyZWRIdHRwQWdlbnRzLFxuICBjcmVhdGVTYWZlQ2xpZW50LFxuICBSZXNwb25zZVRvb0xhcmdlRXJyb3IsXG4gIEludGVybmFsSHR0cENsaWVudCxcbn0gZnJvbSAnLi9odHRwLWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBzZXRQbGF0Zm9ybUp3a3NDYWNoZSxcbiAgSndrc1VuYXZhaWxhYmxlRXJyb3IsXG4gIFVua25vd25LaWRFcnJvcixcbiAgSndrc0NhY2hlLFxufSBmcm9tICcuL2p3a3MtY2FjaGUuanMnO1xuLy8gU2VydmljZS1rZXkgaW50ZXJuYWxzIHN0YXkgaW50ZXJuYWwuIFRoZSBwYWNrYWdlIHN1cmZhY2UgaXMgdGhlIHZlcmlmeS9pbnNwZWN0XG4vLyBzaWRlIHRoYXQgcGxhdGZvcm0ncyBKV1Qgb3B0aW9ucyBhbmQgdGhlIGF1dGggbWlkZGxld2FyZSBuZWVkOyBrZXkgTUFURVJJQUxcbi8vIGhhbmRsaW5nIChgc2lnblNlcnZpY2VKd3RgLCB0aGUgYnVuZGxlLCB0aGUgdGVzdCByZXNldCBob29rKSBpcyByZWFjaGFibGUgb25seVxuLy8gYnkgZGVlcCBpbXBvcnQgZnJvbSBpbnNpZGUgYXBpLWNvcmUgYW5kIGl0cyB0ZXN0aW5nIGhlbHBlcnMuXG5leHBvcnQge1xuICBpc1NlcnZpY2VLaWQsXG4gIHNlcnZpY2VJZGVudGl0eSxcbiAgdmVyaWZ5U2VydmljZUp3dCxcbn0gZnJvbSAnLi9zZXJ2aWNlLWtleXMuanMnO1xuLy8gVGhlIGJyZWFrZXIgaXMgd2lyZWQgYnkgdGhlIHNoYXJlZCBIVFRQIGNsaWVudDsgc2VydmljZXMgY29uc3VtZSBpdHMgRUZGRUNULFxuLy8gbm90IHRoZSBjbGFzcy4gT25seSB0aGUgb3BlcmF0aW9uYWwgc3VyZmFjZSBpcyBwdWJsaWMuXG5leHBvcnQge1xuICByZXNldENpcmN1aXRCcmVha2Vycyxcbn0gZnJvbSAnLi9jaXJjdWl0LWJyZWFrZXIuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlRW52UmVkaXNEdXJhYmxlRXZlbnRCdXMsXG4gIHR5cGUgRXZlbnRTdWJzY3JpcHRpb24sXG4gIHR5cGUgRHVyYWJsZUV2ZW50QnVzLFxufSBmcm9tICcuL2R1cmFibGUtZXZlbnQtYnVzLmpzJztcbmV4cG9ydCB7XG4gIGdldEVycm9yUmV0cnlEZWNpc2lvbixcbn0gZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJldHJ5Q29uZmlnLFxufSBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCB7XG4gIG5leHRCYWNrb2ZmTXMsXG4gIHJldHJ5Rm9yZXZlcixcbn0gZnJvbSAnLi9yZXRyeS1mb3JldmVyLmpzJztcbmV4cG9ydCB7XG4gIGdldFF1b3RhU2VydmljZUF1dGhIZWFkZXIsXG4gIGNyZWF0ZVF1b3RhU2VydmljZSxcbiAgaW5jcmVtZW50UXVvdGEsXG4gIHJlc2VydmVRdW90YSxcbiAgc2VuZFF1b3RhUmVzZXJ2ZURlbmllZCxcbiAgZGVjcmVtZW50UXVvdGEsXG4gIHR5cGUgUXVvdGFSZXNlcnZlUmVzdWx0LFxuICB0eXBlIFF1b3RhU2VydmljZSxcbn0gZnJvbSAnLi9xdW90YS5qcyc7XG5leHBvcnQge1xuICBpc1JlbW90ZUF1ZGl0QWN0aW9uLFxuICBjcmVhdGVSZW1vdGVBdWRpdENsaWVudCxcbiAgd2lyZUF1dGh6RGVuaWFsQXVkaXRvcixcbiAgcmVjb3JkQXVkaXQsXG4gIFJFTU9URV9BVURJVF9BQ1RJT05TLFxuICB0eXBlIFJlbW90ZUF1ZGl0RXZlbnQsXG4gIHR5cGUgUmVtb3RlQXVkaXRDbGllbnQsXG59IGZyb20gJy4vcmVtb3RlLWF1ZGl0LWNsaWVudC5qcyc7XG5leHBvcnQge1xuICBhdWRpdFNwb29sS2V5LFxuICBjcmVhdGVFbnZSZWRpc0F1ZGl0U3Bvb2wsXG4gIHR5cGUgQXVkaXRTcG9vbCxcbn0gZnJvbSAnLi9hdWRpdC1zcG9vbC5qcyc7XG5leHBvcnQge1xuICByZXNvbHZlUmVkaXNDb25uZWN0aW9uLFxuICBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbixcbiAgY3JlYXRlUmVkaXNDbGllbnQsXG4gIGNyZWF0ZUVudlJlZGlzQ2xpZW50LFxuICBjcmVhdGVSZWRpc1JlYWR5R2F0ZSxcbiAgaW5jcldpbmRvdyxcbiAgUmVkaXNDb25maWdFcnJvcixcbiAgdHlwZSBSZWRpc0V2YWxDbGllbnQsXG59IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmV4cG9ydCB7XG4gIGNyZWF0ZVJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIGNyZWF0ZUVudlJlZGlzVG9rZW5SZXZvY2F0aW9uU3RvcmUsXG4gIHB1Ymxpc2hUb2tlblJldm9jYXRpb24sXG4gIHB1Ymxpc2hTZXNzaW9uUmV2b2NhdGlvbixcbiAgcHVibGlzaENyZWRlbnRpYWxSZXZvY2F0aW9uLFxufSBmcm9tICcuL3Rva2VuLXJldm9jYXRpb24uanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlTWVtb3J5U3NlVGlja2V0U3RvcmUsXG4gIGNyZWF0ZUVudlNzZVRpY2tldFN0b3JlLFxuICBlbnZTc2VUaWNrZXRDYXBzLFxuICB0eXBlIEVudlNzZVRpY2tldFN0b3JlQ29uZmlnLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlLFxuICB0eXBlIFNzZVRpY2tldFN0b3JlQ29uZmlnLFxufSBmcm9tICcuL3NzZS10aWNrZXQtc3RvcmUuanMnO1xuZXhwb3J0IHtcbiAgd2lyZVNlcnZpY2VTZWN1cml0eSxcbn0gZnJvbSAnLi9zZXJ2aWNlLWJvb3QuanMnO1xuZXhwb3J0IHtcbiAgY3JlYXRlV2ViaG9va0NoYW5uZWwsXG4gIGNyZWF0ZUVtYWlsQ2hhbm5lbCxcbiAgY3JlYXRlQ2hhbm5lbFJlZ2lzdHJ5LFxuICB0eXBlIE5vdGlmaWNhdGlvblByaW9yaXR5LFxuICB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIHR5cGUgQ2hhbm5lbFRhcmdldCxcbiAgdHlwZSBEZWxpdmVyeVJlc3VsdCxcbiAgdHlwZSBOb3RpZmljYXRpb25DaGFubmVsLFxufSBmcm9tICcuL25vdGlmaWNhdGlvbi1jaGFubmVscy5qcyc7XG5leHBvcnQge1xuICBjcmVhdGVFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG4gIEVDT1NZU1RFTV9OT1RJRllfUEFUSCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZnlDbGllbnQsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMnO1xuIl19