@pipeline-builder/api-core 5.2.2 → 5.2.4

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 (91) hide show
  1. package/lib/constants/ai-providers.d.ts +3 -22
  2. package/lib/constants/ai-providers.js +6 -56
  3. package/lib/errors/app-errors.d.ts +14 -0
  4. package/lib/errors/app-errors.js +21 -1
  5. package/lib/helpers/index.d.ts +1 -0
  6. package/lib/helpers/index.js +2 -1
  7. package/lib/helpers/sse-helpers.d.ts +33 -3
  8. package/lib/helpers/sse-helpers.js +91 -19
  9. package/lib/helpers/support-calendar.d.ts +69 -0
  10. package/lib/helpers/support-calendar.js +179 -0
  11. package/lib/middleware/auth.js +6 -3
  12. package/lib/middleware/deferred-quota-check.d.ts +5 -0
  13. package/lib/middleware/deferred-quota-check.js +33 -0
  14. package/lib/middleware/ecosystem-guard.d.ts +3 -3
  15. package/lib/middleware/ecosystem-guard.js +5 -5
  16. package/lib/middleware/index.d.ts +5 -2
  17. package/lib/middleware/index.js +6 -3
  18. package/lib/middleware/on-behalf.d.ts +37 -0
  19. package/lib/middleware/on-behalf.js +143 -0
  20. package/lib/middleware/permission-gates.d.ts +11 -0
  21. package/lib/middleware/permission-gates.js +7 -1
  22. package/lib/middleware/quota-exempt-routes.d.ts +36 -0
  23. package/lib/middleware/quota-exempt-routes.js +47 -0
  24. package/lib/middleware/route-table.d.ts +104 -0
  25. package/lib/middleware/route-table.js +72 -2
  26. package/lib/middleware/service-tokens.d.ts +8 -0
  27. package/lib/middleware/service-tokens.js +5 -3
  28. package/lib/middleware/step-up.js +11 -1
  29. package/lib/services/ai-call-weight.d.ts +24 -0
  30. package/lib/services/ai-call-weight.js +77 -0
  31. package/lib/services/alert-delivery.d.ts +99 -0
  32. package/lib/services/alert-delivery.js +132 -0
  33. package/lib/services/audit-context.d.ts +105 -0
  34. package/lib/services/audit-context.js +134 -0
  35. package/lib/services/index.d.ts +10 -2
  36. package/lib/services/index.js +10 -2
  37. package/lib/services/org-ai-client.d.ts +61 -0
  38. package/lib/services/org-ai-client.js +112 -0
  39. package/lib/services/pagerduty-inbound.d.ts +101 -0
  40. package/lib/services/pagerduty-inbound.js +195 -0
  41. package/lib/services/pagerduty.d.ts +109 -0
  42. package/lib/services/pagerduty.js +186 -0
  43. package/lib/services/quota-increment-batcher.d.ts +81 -0
  44. package/lib/services/quota-increment-batcher.js +166 -0
  45. package/lib/services/quota.d.ts +158 -14
  46. package/lib/services/quota.js +252 -22
  47. package/lib/services/remote-audit-client.d.ts +44 -1
  48. package/lib/services/remote-audit-client.js +106 -20
  49. package/lib/services/version-vuln-policy.d.ts +174 -0
  50. package/lib/services/version-vuln-policy.js +242 -0
  51. package/lib/types/ai-catalog.d.ts +63 -0
  52. package/lib/types/ai-catalog.js +82 -0
  53. package/lib/types/ask-proposals.js +6 -6
  54. package/lib/types/build-catalog.d.ts +154 -0
  55. package/lib/types/build-catalog.js +158 -0
  56. package/lib/types/common.d.ts +37 -3
  57. package/lib/types/common.js +20 -2
  58. package/lib/types/ecosystem-notifications.d.ts +5 -5
  59. package/lib/types/ecosystem-notifications.js +9 -3
  60. package/lib/types/error-codes.d.ts +13 -6
  61. package/lib/types/error-codes.js +18 -8
  62. package/lib/types/feature-flags.d.ts +71 -1
  63. package/lib/types/feature-flags.js +131 -11
  64. package/lib/types/index.d.ts +6 -4
  65. package/lib/types/index.js +12 -5
  66. package/lib/types/metadata-keys.d.ts +6 -0
  67. package/lib/types/metadata-keys.js +4 -1
  68. package/lib/types/permissions.d.ts +351 -3
  69. package/lib/types/permissions.js +610 -21
  70. package/lib/types/pipeline.d.ts +39 -0
  71. package/lib/types/pipeline.js +57 -1
  72. package/lib/types/plugin-health.d.ts +0 -2
  73. package/lib/types/plugin-health.js +1 -11
  74. package/lib/types/plugin-scan.d.ts +192 -42
  75. package/lib/types/plugin-scan.js +159 -43
  76. package/lib/types/quota-catalog.d.ts +247 -0
  77. package/lib/types/quota-catalog.js +122 -0
  78. package/lib/types/quota-tiers.d.ts +150 -0
  79. package/lib/types/quota-tiers.js +167 -2
  80. package/lib/types/remote-audit-actions.d.ts +1 -1
  81. package/lib/types/remote-audit-actions.js +217 -4
  82. package/lib/types/wire-vocabulary.js +8 -1
  83. package/lib/utils/index.d.ts +1 -1
  84. package/lib/utils/index.js +2 -2
  85. package/lib/utils/response.d.ts +35 -2
  86. package/lib/utils/response.js +42 -3
  87. package/lib/validation/ai-schemas.d.ts +27 -0
  88. package/lib/validation/ai-schemas.js +31 -5
  89. package/lib/validation/plugin-schemas.d.ts +15 -0
  90. package/lib/validation/plugin-schemas.js +28 -1
  91. package/package.json +31 -2
@@ -18,6 +18,30 @@
18
18
  * only adds a symbol property; routing behaviour is unchanged.
19
19
  */
20
20
  import express from 'express';
21
+ import { isQuotaExemptRoute } from './quota-exempt-routes.js';
22
+ /**
23
+ * The CLOSED set of principal kinds a `dynamicAuthz` rule may admit.
24
+ *
25
+ * A route whose authority is resolved in the handler still has to say WHO can
26
+ * get through it. These are the kinds, deliberately coarse — the precise
27
+ * predicate lives in the prose rule and in the code:
28
+ *
29
+ * - `superadmin` — the `User.isSuperAdmin` flag (`isSystemAdmin(req)`).
30
+ * - `system-org` — a member of the system org holding a named permission;
31
+ * list the ids in `permissions` so the coverage scan and
32
+ * the contract can see them.
33
+ * - `tenant-admin` — an admin or owner of the target's own org, or of an
34
+ * ancestor of it. NOT a superadmin by virtue of the flag:
35
+ * several of these rules refuse the flag on purpose.
36
+ * - `tenant-member` — any member of the target's org, admin or not.
37
+ * - `subject` — the very user the request is about (self-service).
38
+ * - `service` — a service principal / internal caller.
39
+ * - `gateway` — the ingress itself supplies the fact (the console
40
+ * `auth_request` passes the console class in a header).
41
+ */
42
+ export const DYNAMIC_PRINCIPALS = [
43
+ 'superadmin', 'system-org', 'tenant-admin', 'tenant-member', 'subject', 'service', 'gateway',
44
+ ];
21
45
  // Symbol.for, not Symbol(): a test that loads api-core twice (ESM + a
22
46
  // requireActual copy) must still see tags set by the other copy.
23
47
  const GATES = Symbol.for('pipeline-builder.route-gates');
@@ -47,6 +71,25 @@ export function getRouteGates(fn) {
47
71
  * `router.post('/', audited('pipeline.create'), handler)`. The handler still
48
72
  * emits the event itself.
49
73
  */
74
+ /**
75
+ * Declare authorization that the handler resolves (see the `dynamicAuthz` gate).
76
+ * A no-op middleware, exactly like {@link audited}: it records the rule on the
77
+ * route table so the contract can print it.
78
+ *
79
+ * `rule` is read by a human, so it should name the real predicate — e.g.
80
+ * `'sysadmin, or an admin of an ancestor org of the target user'`.
81
+ */
82
+ export function dynamicAuthz(rule, opts) {
83
+ if (opts.reachableBy.length === 0) {
84
+ throw new Error(`dynamicAuthz("${rule}") must name at least one principal kind in reachableBy`);
85
+ }
86
+ for (const p of opts.reachableBy) {
87
+ if (!DYNAMIC_PRINCIPALS.includes(p)) {
88
+ throw new Error(`dynamicAuthz("${rule}"): unknown principal "${p}" — one of ${DYNAMIC_PRINCIPALS.join(', ')}`);
89
+ }
90
+ }
91
+ return tagRouteGate(function dynamicAuthzRoute(_req, _res, next) { next(); }, { kind: 'dynamicAuthz', rule, reachableBy: [...opts.reachableBy], ...(opts.permissions && { permissions: [...opts.permissions] }) });
92
+ }
50
93
  export function audited(...actions) {
51
94
  return tagRouteGate(function auditedRoute(_req, _res, next) { next(); }, { kind: 'audit', actions });
52
95
  }
@@ -106,6 +149,7 @@ function toEntry(method, path, gates) {
106
149
  permissions: [],
107
150
  systemAdmin: false,
108
151
  servicePrincipal: false,
152
+ dynamicAuthz: [],
109
153
  internalCallers: [],
110
154
  stepUp: false,
111
155
  stepUpMethods: [],
@@ -128,6 +172,14 @@ function toEntry(method, path, gates) {
128
172
  case 'servicePrincipal':
129
173
  entry.servicePrincipal = true;
130
174
  break;
175
+ case 'dynamicAuthz':
176
+ if (!entry.dynamicAuthz.includes(g.rule))
177
+ entry.dynamicAuthz.push(g.rule);
178
+ entry.dynamicReachableBy = [...new Set([...(entry.dynamicReachableBy ?? []), ...g.reachableBy])].sort();
179
+ if (g.permissions?.length) {
180
+ entry.dynamicPermissions = [...new Set([...(entry.dynamicPermissions ?? []), ...g.permissions])].sort();
181
+ }
182
+ break;
131
183
  case 'internalService':
132
184
  for (const c of g.callers)
133
185
  if (!entry.internalCallers.includes(c))
@@ -171,8 +223,26 @@ function toEntry(method, path, gates) {
171
223
  if (!entry.audit.includes(a))
172
224
  entry.audit.push(a);
173
225
  break;
226
+ case 'quota': {
227
+ const quota = entry.quota ?? (entry.quota = { metered: [], checked: [] });
228
+ if (g.mode === 'meter')
229
+ quota.metered.push(g.quotaType);
230
+ else if (!quota.checked.includes(g.quotaType))
231
+ quota.checked.push(g.quotaType);
232
+ break;
233
+ }
174
234
  }
175
235
  }
236
+ // An exempt route's apiCalls meter + check skip it at runtime, so the table
237
+ // says what actually happens rather than what is mounted.
238
+ if (isQuotaExemptRoute(method, path)) {
239
+ const quota = entry.quota ?? { metered: [], checked: [] };
240
+ entry.quota = {
241
+ metered: quota.metered.filter((t) => t !== 'apiCalls'),
242
+ checked: quota.checked.filter((t) => t !== 'apiCalls'),
243
+ exempt: true,
244
+ };
245
+ }
176
246
  entry.internalCallers.sort();
177
247
  entry.stepUpMethods.sort();
178
248
  return entry;
@@ -229,7 +299,7 @@ export function isWriteMethod(method) {
229
299
  }
230
300
  /** Summary counts for a startup log line. */
231
301
  export function summarizeRouteTable(table) {
232
- const gated = (e) => e.permissions.length > 0 || e.systemAdmin || e.servicePrincipal;
302
+ const gated = (e) => e.permissions.length > 0 || e.systemAdmin || e.servicePrincipal || e.dynamicAuthz.length > 0;
233
303
  const writes = table.filter((e) => isWriteMethod(e.method));
234
304
  return {
235
305
  routes: table.length,
@@ -239,4 +309,4 @@ export function summarizeRouteTable(table) {
239
309
  internal: table.filter((e) => e.internalCallers.length > 0).length,
240
310
  };
241
311
  }
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9yb3V0ZS10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBdUM5QixzRUFBc0U7QUFDdEUsaUVBQWlFO0FBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFJekU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFtQixFQUFLLEVBQUUsR0FBRyxLQUFrQjtJQUN6RSxNQUFNLENBQUMsR0FBRyxFQUFnQixDQUFDO0lBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkksT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBVztJQUN2QyxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxPQUFRLEVBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7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RSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07S0FDbkUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBJbnRyb3NwZWN0YWJsZSByb3V0ZSB0YWJsZS5cbiAqXG4gKiBBdXRob3JpemF0aW9uIGlzIHNwbGl0IGJldHdlZW4gcm91dGVyIG1vdW50cyAoYGFwcC51c2UoJy94JywgZ2F0ZSwgcm91dGVyKWApXG4gKiBhbmQgaW5kaXZpZHVhbCByb3V0ZXMsIHNvIGdyZXBwaW5nIHNvdXJjZSBjYW4ndCBwcm92ZSB0aGF0IGV2ZXJ5IHJvdXRlIGlzXG4gKiBnYXRlZC4gSW5zdGVhZCwgZXZlcnkgZ2F0ZSBtaWRkbGV3YXJlIGluIHRoaXMgcGFja2FnZSBjYXJyaWVzIE1FVEFEQVRBICh3aGF0IGl0XG4gKiByZXF1aXJlcyksIGFuZCB7QGxpbmsgYnVpbGRSb3V0ZVRhYmxlfSB3YWxrcyBhbiBhc3NlbWJsZWQgRXhwcmVzcyBhcHAgYW5kXG4gKiByZXNvbHZlcywgcGVyIG1ldGhvZCArIHBhdGgsIHRoZSBmdWxsIGNoYWluIG9mIGdhdGVzIEV4cHJlc3Mgd291bGQgcnVuIGJlZm9yZVxuICogdGhlIGhhbmRsZXI6IHBlcm1pc3Npb25zLCBzeXN0ZW0tYWRtaW4sIHNlcnZpY2UgcHJpbmNpcGFsLCBzdGVwLXVwLCBmZWF0dXJlLFxuICogdG9rZW4gc2NvcGUsIGFuZCB0aGUgYXVkaXQgYWN0aW9ucyB0aGUgcm91dGUgZGVjbGFyZXMgdmlhIHtAbGluayBhdWRpdGVkfS5cbiAqXG4gKiBFeHByZXNzIDUgKHJvdXRlckAyKSBkb2VzIG5vdCBrZWVwIGEgbW91bnQncyBwYXRoIHN0cmluZyBvbiBpdHMgbGF5ZXIsIHNvIHRoaXNcbiAqIG1vZHVsZSByZWNvcmRzIGl0OiBvbiBpbXBvcnQgaXQgd3JhcHMgYFJvdXRlci5wcm90b3R5cGUudXNlYCB0byBzdGFtcCBlYWNoIG5ld1xuICogbGF5ZXIgd2l0aCB0aGUgcGF0aCBpdCB3YXMgbW91bnRlZCBhdC4gYXBpLWNvcmUgaXMgaW1wb3J0ZWQgYmVmb3JlIGFueSByb3V0ZVxuICogbW9kdWxlIHJlZ2lzdGVycyBhIHJvdXRlLCBzbyBldmVyeSBsYXllciBhbiBhcHAgYnVpbGRzIGlzIHN0YW1wZWQuIFRoZSB3cmFwXG4gKiBvbmx5IGFkZHMgYSBzeW1ib2wgcHJvcGVydHk7IHJvdXRpbmcgYmVoYXZpb3VyIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcblxuLyoqXG4gKiBXaGF0IGEgTUFDSElORSBjcmVkZW50aWFsIChQQVQsIHNlcnZpY2UgYWNjb3VudCkgbWVldHMgb24gYSByb3V0ZSBnYXRlZCBieVxuICogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgd2hpbGUgdGhlIG9yZydzIGFkbWluLU1GQSBwb2xpY3kgaXMgb246XG4gKiAgIC0gYGFsbG93YCAg4oCUIHRoZSByb3V0ZSBpcyBsZWdpdGltYXRlbHkgbWFjaGluZS1jYWxsYWJsZSAoYXV0b21hdGlvbiB0aGF0XG4gKiAgICAgICAgICAgICAgICBtYW5hZ2VzIG1lbWJlcnMsIHJvbGVzLCBiaWxsaW5n4oCmKTsgdGhlIHBvbGljeSBpcyBhYm91dCBob3dcbiAqICAgICAgICAgICAgICAgIHN0cm9uZ2x5IGEgUEVSU09OJ3Mgc2Vzc2lvbiB3YXMgb3BlbmVkLCBzbyBpdCBkb2VzIG5vdCBhcHBseTtcbiAqICAgLSBgcmVmdXNlYCDigJQgb25seSBhIHBlcnNvbiBtYXkgZG8gdGhpcyB3aGlsZSB0aGUgcG9saWN5IGlzIG9uICg0MDNcbiAqICAgICAgICAgICAgICAgIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCksIGUuZy4gbWludGluZyBhbm90aGVyIGNyZWRlbnRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgPSAnYWxsb3cnIHwgJ3JlZnVzZSc7XG5cbi8qKiBPbmUgcmVxdWlyZW1lbnQgYSBnYXRlIG1pZGRsZXdhcmUgZW5mb3JjZXMuICovXG5leHBvcnQgdHlwZSBSb3V0ZUdhdGUgPVxuICB8IHsga2luZDogJ2F1dGgnIH1cbiAgfCB7IGtpbmQ6ICdwZXJtaXNzaW9uJzsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlPzogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiAnc3lzdGVtQWRtaW4nIH1cbiAgfCB7IGtpbmQ6ICdzZXJ2aWNlUHJpbmNpcGFsJyB9XG4gIC8qKiBBbiBJTlRFUk5BTCByb3V0ZTogdXNlciB0b2tlbnMgcmVmdXNlZCBvdXRyaWdodCwgb25seSB0aGVzZSBzZXJ2aWNlcyBhZG1pdHRlZC4gKi9cbiAgfCB7IGtpbmQ6ICdpbnRlcm5hbFNlcnZpY2UnOyBjYWxsZXJzOiByZWFkb25seSBzdHJpbmdbXSB9XG4gIHwgeyBraW5kOiAnc3RlcFVwJzsgbWV0aG9kcz86IHJlYWRvbmx5IHN0cmluZ1tdIH1cbiAgLyoqIFRoZSB3aG9sZSBTRVNTSU9OIG11c3QgYmUgTUZBLWdyYWRlIChgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UgfSlgKSwgYW5kXG4gICAqICBvcHRpb25hbGx5IG5vIG9sZGVyIHRoYW4gYG1heEFnZWAgc2Vjb25kcy4gYGV4ZW1wdGAgbmFtZXMgYSBjYXJ2ZS1vdXQgdGhlXG4gICAqICBnYXRlIGFwcGxpZXMgdG8gYSBuYXJyb3cgY2xhc3Mgb2YgcmVxdWVzdCAoc2VlIGBBc3N1cmFuY2VPcHRpb25zLmV4ZW1wdGApLFxuICAgKiAgc28gYSByb3V0ZSB3aG9zZSBsZXZlbCBpcyBjb25kaXRpb25hbCBzYXlzIHNvIG9uIHRoZSB0YWJsZS4gKi9cbiAgfCB7IGtpbmQ6ICdhc3N1cmFuY2UnOyBtaW5Bc3N1cmFuY2U6IDEgfCAyOyBtYXhBZ2U/OiBudW1iZXI7IGV4ZW1wdD86IHN0cmluZyB9XG4gIC8qKiBUaGUgc2Vzc2lvbiBtdXN0IGJlIE1GQS1ncmFkZSBXSEVOIHRoZSBvcmcncyBgYWRtaW5BY3Rpb25zUmVxdWlyZU1mYWBcbiAgICogIHBvbGljeSBpcyBvbiAoYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWApLiBgbWFjaGluZXNgIHNheXMgd2hhdCBhIG1hY2hpbmVcbiAgICogIGNyZWRlbnRpYWwgbWVldHMgb24gdGhlIHJvdXRlIHdoaWxlIHRoZSBwb2xpY3kgaXMgb24uICovXG4gIHwgeyBraW5kOiAnb3JnQWRtaW5Bc3N1cmFuY2UnOyBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcyB9XG4gIC8qKiBUaGUgY2FsbGVyJ3MgQUNUSVZFIG9yZyBtdXN0IGJlIHRoZSBzeXN0ZW0gb3JnIChgcmVxdWlyZVN5c3RlbU9yZ2ApIOKAlCB0aGVcbiAgICogIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSBib3VuZGFyeSAoZG9jcy9ydW5ib29rcy9lY29zeXN0ZW0tbW9kZXJhdGlvbi5tZCkuICovXG4gIHwgeyBraW5kOiAnc3lzdGVtT3JnJyB9XG4gIHwgeyBraW5kOiAnZmVhdHVyZSc7IGZlYXR1cmU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnc2NvcGUnOyBzY29wZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdhdWRpdCc7IGFjdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbi8vIFN5bWJvbC5mb3IsIG5vdCBTeW1ib2woKTogYSB0ZXN0IHRoYXQgbG9hZHMgYXBpLWNvcmUgdHdpY2UgKEVTTSArIGFcbi8vIHJlcXVpcmVBY3R1YWwgY29weSkgbXVzdCBzdGlsbCBzZWUgdGFncyBzZXQgYnkgdGhlIG90aGVyIGNvcHkuXG5jb25zdCBHQVRFUyA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtZ2F0ZXMnKTtcbmNvbnN0IExBWUVSX1BBVEggPSBTeW1ib2wuZm9yKCdwaXBlbGluZS1idWlsZGVyLmxheWVyLXBhdGgnKTtcbmNvbnN0IFJFQ09SREVSX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtcmVjb3JkZXInKTtcblxudHlwZSBUYWdnZWQgPSB7IFtHQVRFU10/OiBSb3V0ZUdhdGVbXSB9O1xuXG4vKipcbiAqIEF0dGFjaCBnYXRlIG1ldGFkYXRhIHRvIGEgbWlkZGxld2FyZSBmdW5jdGlvbiAoYXBwZW5kcyB0byBhbnkgZXhpc3RpbmcgdGFncylcbiAqIGFuZCByZXR1cm4gdGhlIHNhbWUgZnVuY3Rpb24uIFVzZSBpdCBmb3IgYSBzZXJ2aWNlLWxvY2FsIGdhdGUgc28gdGhlIHJvdXRlXG4gKiB0YWJsZSBrbm93cyB3aGF0IGl0IGVuZm9yY2VzIOKAlCBlLmcuIGEgaGFuZGxlci1sZXZlbCBgcmVxdWlyZUNvbXBsaWFuY2VXcml0ZWBcbiAqIHRhZ2dlZCBgeyBraW5kOiAncGVybWlzc2lvbicsIG1vZGU6ICdhbnknLCBwZXJtaXNzaW9uczogWydjb21wbGlhbmNlOndyaXRlJ10gfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdSb3V0ZUdhdGU8VCBleHRlbmRzIG9iamVjdD4oZm46IFQsIC4uLmdhdGVzOiBSb3V0ZUdhdGVbXSk6IFQge1xuICBjb25zdCB0ID0gZm4gYXMgVCAmIFRhZ2dlZDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIEdBVEVTLCB7IHZhbHVlOiBbLi4uKHRbR0FURVNdID8/IFtdKSwgLi4uZ2F0ZXNdLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIGZuO1xufVxuXG4vKiogVGhlIGdhdGUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIChlbXB0eSB3aGVuIHVudGFnZ2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZUdhdGVzKGZuOiB1bmtub3duKTogcmVhZG9ubHkgUm91dGVHYXRlW10ge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gW107XG4gIHJldHVybiAoZm4gYXMgVGFnZ2VkKVtHQVRFU10gPz8gW107XG59XG5cbi8qKlxuICogRGVjbGFyZSB0aGUgYXVkaXQgYWN0aW9uKHMpIGEgcm91dGUgZW1pdHMuIEEgbm8tb3AgbWlkZGxld2FyZSB3aG9zZSBvbmx5IGpvYlxuICogaXMgdG8gcHV0IHRoZSBhY3Rpb24gb24gdGhlIHJvdXRlIHRhYmxlLCBzbyB0aGUgY292ZXJhZ2UgdGVzdCBjYW4gcmVxdWlyZSBhblxuICogYXVkaXQgZGVjbGFyYXRpb24gb24gZXZlcnkgd3JpdGUgcm91dGUuIFBsYWNlIGl0IGluIHRoZSByb3V0ZSdzIGNoYWluOlxuICogYHJvdXRlci5wb3N0KCcvJywgYXVkaXRlZCgncGlwZWxpbmUuY3JlYXRlJyksIGhhbmRsZXIpYC4gVGhlIGhhbmRsZXIgc3RpbGxcbiAqIGVtaXRzIHRoZSBldmVudCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdGVkKC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogKHJlcTogdW5rbm93biwgcmVzOiB1bmtub3duLCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB2b2lkIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZShmdW5jdGlvbiBhdWRpdGVkUm91dGUoX3JlcTogdW5rbm93biwgX3JlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgeyBuZXh0KCk7IH0sIHsga2luZDogJ2F1ZGl0JywgYWN0aW9ucyB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb3VudC1wYXRoIHJlY29yZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBMYXllciB7XG4gIGhhbmRsZTogdW5rbm93bjtcbiAgcm91dGU/OiB7IHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdOyBtZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjsgc3RhY2s6IEFycmF5PHsgbWV0aG9kPzogc3RyaW5nOyBoYW5kbGU6IHVua25vd24gfT4gfTtcbiAgbWF0Y2hlcnM6IEFycmF5PChwYXRoOiBzdHJpbmcpID0+IHVua25vd24+O1xuICAvKiogcm91dGVyQDIncyBcIm1vdW50ZWQgYXQgJy8nIHdpdGggZW5kOmZhbHNlXCIgZmFzdCBwYXRoIOKAlCBtYXRjaGVzIEFOWSBwYXRoLiAqL1xuICBzbGFzaD86IGJvb2xlYW47XG4gIFtMQVlFUl9QQVRIXT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJvdXRlckxpa2UgeyBzdGFjazogTGF5ZXJbXSB9XG5cbmZ1bmN0aW9uIGluc3RhbGxSb3V0ZVJlY29yZGVyKCk6IHZvaWQge1xuICBjb25zdCBwcm90byA9IChleHByZXNzLlJvdXRlciBhcyB1bmtub3duIGFzIHsgcHJvdG90eXBlOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiB9KS5wcm90b3R5cGU7XG4gIGlmIChwcm90b1tSRUNPUkRFUl9JTlNUQUxMRURdKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVXNlID0gcHJvdG8udXNlIGFzICh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIHByb3RvLnVzZSA9IGZ1bmN0aW9uIHJlY29yZGluZ1VzZSh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbFVzZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAvLyBTYW1lIHBhdGggZGlzYW1iaWd1YXRpb24gYXMgcm91dGVyQDIncyBgdXNlYDogYSBsZWFkaW5nIG5vbi1mdW5jdGlvblxuICAgIC8vIChwb3NzaWJseSBuZXN0ZWQgaW4gYXJyYXlzKSBpcyB0aGUgcGF0aDsgb3RoZXJ3aXNlIHRoZSBtb3VudCBpcyAnLycuXG4gICAgbGV0IGZpcnN0OiB1bmtub3duID0gYXJnc1swXTtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheShmaXJzdCkgJiYgZmlyc3QubGVuZ3RoID4gMCkgZmlyc3QgPSBmaXJzdFswXTtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIGZpcnN0ID09PSAnZnVuY3Rpb24nID8gJy8nIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGZvciAobGV0IGkgPSBiZWZvcmU7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zdGFja1tpXSwgTEFZRVJfUEFUSCwgeyB2YWx1ZTogcGF0aCwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBSRUNPUkRFUl9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xufVxuXG5pbnN0YWxsUm91dGVSZWNvcmRlcigpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRhYmxlIGNvbnN0cnVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBSZXNvbHZlZCByZXF1aXJlbWVudHMgZm9yIG9uZSBtZXRob2QgKyBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhYmxlRW50cnkge1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICAvKiogQXV0aGVudGljYXRpb24gcnVucyBiZWZvcmUgdGhlIGhhbmRsZXIgKHJlcXVpcmVBdXRoKS4gKi9cbiAgYXV0aDogYm9vbGVhbjtcbiAgLyoqIEVhY2ggcGVybWlzc2lvbiBnYXRlIGluIHRoZSBjaGFpbiAoYWxsIG11c3QgcGFzczsgZWFjaCBpcyBhbnktb2Ygb3IgYWxsLW9mKS4gKi9cbiAgcGVybWlzc2lvbnM6IEFycmF5PHsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlOiBib29sZWFuIH0+O1xuICBzeXN0ZW1BZG1pbjogYm9vbGVhbjtcbiAgc2VydmljZVByaW5jaXBhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlcyBhbGxvd2VkIHRvIGNhbGwgdGhpcyByb3V0ZSB3aGVuIGl0IGlzIElOVEVSTkFMIChgcmVxdWlyZUludGVybmFsU2VydmljZWApLlxuICAgKiBBbiBlbXB0eSBhcnJheSBtZWFucyB0aGUgcm91dGUgaXMgbm90IGludGVybmFsIOKAlCBhIHVzZXIgdG9rZW4gbWF5IHJlYWNoIGl0LFxuICAgKiBzdWJqZWN0IHRvIHRoZSBvdGhlciBnYXRlcy4gU29ydGVkLCBzbyB0aGUgZ2VuZXJhdGVkIHRhYmxlIGlzIHN0YWJsZS5cbiAgICovXG4gIGludGVybmFsQ2FsbGVyczogc3RyaW5nW107XG4gIHN0ZXBVcDogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdGhlIHN0ZXAtdXAgZ2F0ZSBuYW1lcyB0aGUgZmFjdG9ycyB0aGF0IG1heSBlYXJuIGl0IChgWyd3ZWJhdXRobicsXG4gICAqICAndG90cCddYCBvbiB0aGUgbW9zdCBkYW5nZXJvdXMgcm91dGVzKSwgdGhlIGFsbG93ZWQgbWV0aG9kcy4gRW1wdHkgbWVhbnNcbiAgICogIGFueSBmYWN0b3Igc2F0aXNmaWVzIGl0LiBTb3J0ZWQsIHNvIHRoZSBnZW5lcmF0ZWQgdGFibGUgaXMgc3RhYmxlLiAqL1xuICBzdGVwVXBNZXRob2RzOiBzdHJpbmdbXTtcbiAgLyoqIEhpZ2hlc3QgYG1pbkFzc3VyYW5jZWAgYW55IGdhdGUgaW4gdGhlIGNoYWluIGRlbWFuZHM7IDAgd2hlbiBub25lIGRvZXMuICovXG4gIG1pbkFzc3VyYW5jZTogMCB8IDEgfCAyO1xuICAvKiogVGlnaHRlc3QgYG1heEFnZWAgKHNlY29uZHMpIGFueSBhc3N1cmFuY2UgZ2F0ZSBpbiB0aGUgY2hhaW4gZGVtYW5kcy4gKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5hbWVkIGNhcnZlLW91dHMgdGhlIGNoYWluJ3MgYXNzdXJhbmNlIGdhdGVzIGFsbG93IChzb3J0ZWQpLiBBYnNlbnQgd2hlblxuICAgKiB0aGVyZSBhcmUgbm9uZSwgc28gYSB0YWJsZSBvZiByb3V0ZXMgd2l0aG91dCBvbmUgaXMgdW5jaGFuZ2VkLiBBIHJldmlld2VyXG4gICAqIHJlYWRpbmcgYG1pbkFzc3VyYW5jZTogMmAgbmV4dCB0byBgYXNzdXJhbmNlRXhlbXB0OiBbXCJib290c3RyYXAtc2V0dXBcIl1gXG4gICAqIGtub3dzIHRoZSBsZXZlbCBpcyByZXF1aXJlZCBvZiBldmVyeW9uZSBFWENFUFQgdGhhdCBuYW1lZCBjYXNlLlxuICAgKi9cbiAgYXNzdXJhbmNlRXhlbXB0Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIHJvdXRlIHJlcXVpcmVzIGFuIE1GQS1ncmFkZSBzZXNzaW9uIFdIRU4gdGhlIG9yZydzXG4gICAqIGBhZG1pbkFjdGlvbnNSZXF1aXJlTWZhYCBwb2xpY3kgaXMgb24gKGByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2VgKSwgd2l0aFxuICAgKiB3aGF0IGEgbWFjaGluZSBjcmVkZW50aWFsIG1lZXRzIHRoZXJlLiBBYnNlbnQgKG5vdCBgZmFsc2VgKSBvdGhlcndpc2UsIHNvXG4gICAqIHRoZSB0YWJsZSBvZiBhIHNlcnZpY2UgdGhhdCB1c2VzIG5vIHN1Y2ggZ2F0ZSBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBvcmdBZG1pbkFzc3VyYW5jZT86IHsgbWFjaGluZXM6IE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgfTtcbiAgLyoqXG4gICAqIFByZXNlbnQgKGFsd2F5cyBgdHJ1ZWApIHdoZW4gdGhlIGNoYWluIHJ1bnMgYHJlcXVpcmVTeXN0ZW1PcmdgOiBvbmx5IGFcbiAgICogY2FsbGVyIHdob3NlIGFjdGl2ZSBvcmcgaXMgdGhlIHN5c3RlbSBvcmcgZ2V0cyB0aHJvdWdoLiBBYnNlbnQgb3RoZXJ3aXNlLFxuICAgKiBzbyB0aGUgdGFibGUgb2YgYSBzZXJ2aWNlIHdpdGggbm8gZWNvc3lzdGVtLWdvdmVybmFuY2Ugcm91dGUgaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgc3lzdGVtT3JnPzogdHJ1ZTtcbiAgZmVhdHVyZXM6IHN0cmluZ1tdO1xuICBzY29wZXM6IHN0cmluZ1tdO1xuICBhdWRpdDogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBDYW5kaWRhdGUgeyBsYXllcjogTGF5ZXI7IHByZWZpeDogc3RyaW5nIH1cblxuZnVuY3Rpb24gam9pblBhdGgocHJlZml4OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGpvaW5lZCA9IGAke3ByZWZpeC5yZXBsYWNlKC9cXC8rJC8sICcnKX0vJHtwYXRoLnJlcGxhY2UoL15cXC8rLywgJycpfWA7XG4gIHJldHVybiBqb2luZWQubGVuZ3RoID4gMSA/IGpvaW5lZC5yZXBsYWNlKC9cXC8rJC8sICcnKSA6ICcvJztcbn1cblxuZnVuY3Rpb24gaXNSb3V0ZXIoaGFuZGxlOiB1bmtub3duKTogaGFuZGxlIGlzIFJvdXRlckxpa2Uge1xuICByZXR1cm4gdHlwZW9mIGhhbmRsZSA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KChoYW5kbGUgYXMgUGFydGlhbDxSb3V0ZXJMaWtlPikuc3RhY2spO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBtaWRkbGV3YXJlIGxheWVyIChtb3VudGVkIHVuZGVyIGBwcmVmaXhgKSBydW5zIGZvciBgZnVsbFBhdGhgLlxuICogTWlycm9ycyBgTGF5ZXIucHJvdG90eXBlLm1hdGNoYCwgaW5jbHVkaW5nIGl0cyBmYXN0IHBhdGg6IGEgbGF5ZXIgYWRkZWQgd2l0aFxuICogbm8gcGF0aCAoYHJvdXRlci51c2UoZ2F0ZSlgKSBtYXRjaGVzIEVWRVJZIHBhdGggdW5kZXIgaXRzIHJvdXRlciDigJQgd2hpY2ggaXNcbiAqIGV4YWN0bHkgaG93IHRoZSBzaGFyZWQgYHJlcXVpcmVQZXJtaXNzaW9uYCBnYXRlcyBiZXR3ZWVuIHR3byBgcm91dGVyLnVzZSguLi4pYFxuICogbW91bnRzIHJlYWNoIHRoZSByb3V0ZXJzIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlbS5cbiAqL1xuZnVuY3Rpb24gYXBwbGllcyhjOiBDYW5kaWRhdGUsIGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGMucHJlZml4ID09PSAnLycgPyAnJyA6IGMucHJlZml4O1xuICBpZiAoYmFzZSAmJiBmdWxsUGF0aCAhPT0gYmFzZSAmJiAhZnVsbFBhdGguc3RhcnRzV2l0aChgJHtiYXNlfS9gKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYy5sYXllci5zbGFzaCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHJlbCA9IGZ1bGxQYXRoLnNsaWNlKGJhc2UubGVuZ3RoKSB8fCAnLyc7XG4gIHJldHVybiBjLmxheWVyLm1hdGNoZXJzLnNvbWUoKG0pID0+IG0ocmVsKSAhPT0gZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0R2F0ZXMoZm5zOiB1bmtub3duW10pOiBSb3V0ZUdhdGVbXSB7XG4gIHJldHVybiBmbnMuZmxhdE1hcCgoZm4pID0+IGdldFJvdXRlR2F0ZXMoZm4pKTtcbn1cblxuZnVuY3Rpb24gdG9FbnRyeShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBnYXRlczogUm91dGVHYXRlW10pOiBSb3V0ZVRhYmxlRW50cnkge1xuICBjb25zdCBlbnRyeTogUm91dGVUYWJsZUVudHJ5ID0ge1xuICAgIG1ldGhvZCxcbiAgICBwYXRoLFxuICAgIGF1dGg6IGZhbHNlLFxuICAgIHBlcm1pc3Npb25zOiBbXSxcbiAgICBzeXN0ZW1BZG1pbjogZmFsc2UsXG4gICAgc2VydmljZVByaW5jaXBhbDogZmFsc2UsXG4gICAgaW50ZXJuYWxDYWxsZXJzOiBbXSxcbiAgICBzdGVwVXA6IGZhbHNlLFxuICAgIHN0ZXBVcE1ldGhvZHM6IFtdLFxuICAgIG1pbkFzc3VyYW5jZTogMCxcbiAgICBmZWF0dXJlczogW10sXG4gICAgc2NvcGVzOiBbXSxcbiAgICBhdWRpdDogW10sXG4gIH07XG4gIGZvciAoY29uc3QgZyBvZiBnYXRlcykge1xuICAgIHN3aXRjaCAoZy5raW5kKSB7XG4gICAgICBjYXNlICdhdXRoJzogZW50cnkuYXV0aCA9IHRydWU7IGJyZWFrO1xuICAgICAgY2FzZSAncGVybWlzc2lvbic6IGVudHJ5LnBlcm1pc3Npb25zLnB1c2goeyBtb2RlOiBnLm1vZGUsIHBlcm1pc3Npb25zOiBbLi4uZy5wZXJtaXNzaW9uc10sIGFsbG93U2VydmljZTogZy5hbGxvd1NlcnZpY2UgPT09IHRydWUgfSk7IGJyZWFrO1xuICAgICAgY2FzZSAnc3lzdGVtQWRtaW4nOiBlbnRyeS5zeXN0ZW1BZG1pbiA9IHRydWU7IGJyZWFrO1xuICAgICAgY2FzZSAnc2VydmljZVByaW5jaXBhbCc6IGVudHJ5LnNlcnZpY2VQcmluY2lwYWwgPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ2ludGVybmFsU2VydmljZSc6IGZvciAoY29uc3QgYyBvZiBnLmNhbGxlcnMpIGlmICghZW50cnkuaW50ZXJuYWxDYWxsZXJzLmluY2x1ZGVzKGMpKSBlbnRyeS5pbnRlcm5hbENhbGxlcnMucHVzaChjKTsgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwVXAnOlxuICAgICAgICBlbnRyeS5zdGVwVXAgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgZy5tZXRob2RzID8/IFtdKSBpZiAoIWVudHJ5LnN0ZXBVcE1ldGhvZHMuaW5jbHVkZXMobSkpIGVudHJ5LnN0ZXBVcE1ldGhvZHMucHVzaChtKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhc3N1cmFuY2UnOlxuICAgICAgICAvLyBTZXZlcmFsIGdhdGVzIG1heSBhcHBseTsgdGhlIFNUUklDVEVTVCB3aW5zLCBzaW5jZSBldmVyeSBvbmUgb2YgdGhlbSBydW5zLlxuICAgICAgICBpZiAoZy5taW5Bc3N1cmFuY2UgPiBlbnRyeS5taW5Bc3N1cmFuY2UpIGVudHJ5Lm1pbkFzc3VyYW5jZSA9IGcubWluQXNzdXJhbmNlO1xuICAgICAgICBpZiAoZy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkgZW50cnkubWF4QWdlID0gZW50cnkubWF4QWdlID09PSB1bmRlZmluZWQgPyBnLm1heEFnZSA6IE1hdGgubWluKGVudHJ5Lm1heEFnZSwgZy5tYXhBZ2UpO1xuICAgICAgICBpZiAoZy5leGVtcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVudHJ5LmFzc3VyYW5jZUV4ZW1wdCA9IFsuLi5uZXcgU2V0KFsuLi4oZW50cnkuYXNzdXJhbmNlRXhlbXB0ID8/IFtdKSwgZy5leGVtcHRdKV0uc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3JnQWRtaW5Bc3N1cmFuY2UnOlxuICAgICAgICAvLyBTdHJpY3Rlc3Qgd2luczogb25lIGByZWZ1c2VgIGluIHRoZSBjaGFpbiByZWZ1c2VzIG1hY2hpbmVzLlxuICAgICAgICBlbnRyeS5vcmdBZG1pbkFzc3VyYW5jZSA9IHtcbiAgICAgICAgICBtYWNoaW5lczogZW50cnkub3JnQWRtaW5Bc3N1cmFuY2U/Lm1hY2hpbmVzID09PSAncmVmdXNlJyB8fCBnLm1hY2hpbmVzID09PSAncmVmdXNlJyA/ICdyZWZ1c2UnIDogJ2FsbG93JyxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzeXN0ZW1PcmcnOiBlbnRyeS5zeXN0ZW1PcmcgPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ2ZlYXR1cmUnOiBpZiAoIWVudHJ5LmZlYXR1cmVzLmluY2x1ZGVzKGcuZmVhdHVyZSkpIGVudHJ5LmZlYXR1cmVzLnB1c2goZy5mZWF0dXJlKTsgYnJlYWs7XG4gICAgICBjYXNlICdzY29wZSc6IGlmICghZW50cnkuc2NvcGVzLmluY2x1ZGVzKGcuc2NvcGUpKSBlbnRyeS5zY29wZXMucHVzaChnLnNjb3BlKTsgYnJlYWs7XG4gICAgICBjYXNlICdhdWRpdCc6IGZvciAoY29uc3QgYSBvZiBnLmFjdGlvbnMpIGlmICghZW50cnkuYXVkaXQuaW5jbHVkZXMoYSkpIGVudHJ5LmF1ZGl0LnB1c2goYSk7IGJyZWFrO1xuICAgIH1cbiAgfVxuICBlbnRyeS5pbnRlcm5hbENhbGxlcnMuc29ydCgpO1xuICBlbnRyeS5zdGVwVXBNZXRob2RzLnNvcnQoKTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG5mdW5jdGlvbiB3YWxrKHN0YWNrOiBMYXllcltdLCBwcmVmaXg6IHN0cmluZywgaW5oZXJpdGVkOiBDYW5kaWRhdGVbXSwgb3V0OiBSb3V0ZVRhYmxlRW50cnlbXSwgc2VlbjogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgY29uc3QgbG9jYWw6IENhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbGF5ZXIgb2Ygc3RhY2spIHtcbiAgICBpZiAobGF5ZXIucm91dGUpIHtcbiAgICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShsYXllci5yb3V0ZS5wYXRoKSA/IGxheWVyLnJvdXRlLnBhdGggOiBbbGF5ZXIucm91dGUucGF0aF07XG4gICAgICBjb25zdCBtZXRob2RzID0gT2JqZWN0LmtleXMobGF5ZXIucm91dGUubWV0aG9kcykubWFwKChtKSA9PiAobSA9PT0gJ19hbGwnID8gJyonIDogbS50b1VwcGVyQ2FzZSgpKSk7XG4gICAgICBmb3IgKGNvbnN0IHJvdXRlUGF0aCBvZiBwYXRocykge1xuICAgICAgICBjb25zdCBmdWxsID0gam9pblBhdGgocHJlZml4LCBTdHJpbmcocm91dGVQYXRoKSk7XG4gICAgICAgIGNvbnN0IGNoYWluID0gWy4uLmluaGVyaXRlZCwgLi4ubG9jYWxdLmZpbHRlcigoYykgPT4gYXBwbGllcyhjLCBmdWxsKSkubWFwKChjKSA9PiBjLmxheWVyLmhhbmRsZSk7XG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHttZXRob2R9ICR7ZnVsbH1gO1xuICAgICAgICAgIC8vIEZpcnN0IHJlZ2lzdHJhdGlvbiB3aW5zLCBhcyBpbiBFeHByZXNzOiBhIGxhdGVyIGR1cGxpY2F0ZSBpcyB1bnJlYWNoYWJsZS5cbiAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgICBjb25zdCByb3V0ZUZucyA9IGxheWVyLnJvdXRlLnN0YWNrXG4gICAgICAgICAgICAuZmlsdGVyKChsKSA9PiBsLm1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8IGwubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09IG1ldGhvZCB8fCBtZXRob2QgPT09ICcqJylcbiAgICAgICAgICAgIC5tYXAoKGwpID0+IGwuaGFuZGxlKTtcbiAgICAgICAgICBvdXQucHVzaCh0b0VudHJ5KG1ldGhvZCwgZnVsbCwgY29sbGVjdEdhdGVzKFsuLi5jaGFpbiwgLi4ucm91dGVGbnNdKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JvdXRlcihsYXllci5oYW5kbGUpKSB7XG4gICAgICBjb25zdCBtb3VudFBhdGggPSBqb2luUGF0aChwcmVmaXgsIGxheWVyW0xBWUVSX1BBVEhdID8/ICcvJyk7XG4gICAgICAvLyBNaWRkbGV3YXJlIHRoYXQgcnVucyBiZWZvcmUgdGhpcyByb3V0ZXIgKGFuY2VzdG9ycyArIGVhcmxpZXIgc2libGluZ3MpXG4gICAgICAvLyBpcyBpbmhlcml0ZWQ7IGFwcGxpY2FiaWxpdHkgaXMgcmUtY2hlY2tlZCBhZ2FpbnN0IGVhY2ggZnVsbCByb3V0ZSBwYXRoLlxuICAgICAgd2FsayhsYXllci5oYW5kbGUuc3RhY2ssIG1vdW50UGF0aCwgWy4uLmluaGVyaXRlZCwgLi4ubG9jYWxdLCBvdXQsIHNlZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbC5wdXNoKHsgbGF5ZXIsIHByZWZpeCB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcm91dGUgdGFibGUgb2YgYW4gYXNzZW1ibGVkIEV4cHJlc3MgYXBwIChvciByb3V0ZXIpOiBvbmUgZW50cnkgcGVyXG4gKiByZWFjaGFibGUgbWV0aG9kICsgcGF0aCB3aXRoIGV2ZXJ5IGdhdGUgdGhhdCBydW5zIGJlZm9yZSBpdHMgaGFuZGxlci5cbiAqIEhFQUQgaXMgZm9sZGVkIGludG8gR0VULCBhcyBFeHByZXNzIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJvdXRlVGFibGUoYXBwOiB1bmtub3duKTogUm91dGVUYWJsZUVudHJ5W10ge1xuICBjb25zdCByb290ID0gKGFwcCBhcyB7IHJvdXRlcj86IFJvdXRlckxpa2UgfSkucm91dGVyID8/IChhcHAgYXMgUm91dGVyTGlrZSk7XG4gIGNvbnN0IG91dDogUm91dGVUYWJsZUVudHJ5W10gPSBbXTtcbiAgaWYgKCFyb290IHx8ICFBcnJheS5pc0FycmF5KHJvb3Quc3RhY2spKSByZXR1cm4gb3V0O1xuICB3YWxrKHJvb3Quc3RhY2ssICcvJywgW10sIG91dCwgbmV3IFNldCgpKTtcbiAgcmV0dXJuIG91dC5zb3J0KChhLCBiKSA9PiAoYS5wYXRoID09PSBiLnBhdGggPyBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKSA6IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtZXRob2QgbXV0YXRlcyBzdGF0ZSAoZXZlcnl0aGluZyBleGNlcHQgR0VUL0hFQUQvT1BUSU9OUykuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0ZU1ldGhvZChtZXRob2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIVsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUyddLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLyoqIFN1bW1hcnkgY291bnRzIGZvciBhIHN0YXJ0dXAgbG9nIGxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUm91dGVUYWJsZSh0YWJsZTogcmVhZG9ubHkgUm91dGVUYWJsZUVudHJ5W10pOiB7IHJvdXRlczogbnVtYmVyOyB3cml0ZXM6IG51bWJlcjsgdW5nYXRlZDogbnVtYmVyOyB1bmF1ZGl0ZWQ6IG51bWJlcjsgaW50ZXJuYWw6IG51bWJlciB9IHtcbiAgY29uc3QgZ2F0ZWQgPSAoZTogUm91dGVUYWJsZUVudHJ5KTogYm9vbGVhbiA9PiBlLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgfHwgZS5zeXN0ZW1BZG1pbiB8fCBlLnNlcnZpY2VQcmluY2lwYWw7XG4gIGNvbnN0IHdyaXRlcyA9IHRhYmxlLmZpbHRlcigoZSkgPT4gaXNXcml0ZU1ldGhvZChlLm1ldGhvZCkpO1xuICByZXR1cm4ge1xuICAgIHJvdXRlczogdGFibGUubGVuZ3RoLFxuICAgIHdyaXRlczogd3JpdGVzLmxlbmd0aCxcbiAgICB1bmdhdGVkOiB0YWJsZS5maWx0ZXIoKGUpID0+ICFnYXRlZChlKSkubGVuZ3RoLFxuICAgIHVuYXVkaXRlZDogd3JpdGVzLmZpbHRlcigoZSkgPT4gZS5hdWRpdC5sZW5ndGggPT09IDApLmxlbmd0aCxcbiAgICBpbnRlcm5hbDogdGFibGUuZmlsdGVyKChlKSA9PiBlLmludGVybmFsQ2FsbGVycy5sZW5ndGggPiAwKS5sZW5ndGgsXG4gIH07XG59XG4iXX0=
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9yb3V0ZS10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYzlEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUztDQUNwRixDQUFDO0FBOERYLHNFQUFzRTtBQUN0RSxpRUFBaUU7QUFDakUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0FBQ3pELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUM3RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUl6RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQW1CLEVBQUssRUFBRSxHQUFHLEtBQWtCO0lBQ3pFLE1BQU0sQ0FBQyxHQUFHLEVBQWdCLENBQUM7SUFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJ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LGdCQUFnQixJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM1SSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTztRQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtRQUNwQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtRQUM5QyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTTtRQUM1RCxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTTtLQUNuRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEludHJvc3BlY3RhYmxlIHJvdXRlIHRhYmxlLlxuICpcbiAqIEF1dGhvcml6YXRpb24gaXMgc3BsaXQgYmV0d2VlbiByb3V0ZXIgbW91bnRzIChgYXBwLnVzZSgnL3gnLCBnYXRlLCByb3V0ZXIpYClcbiAqIGFuZCBpbmRpdmlkdWFsIHJvdXRlcywgc28gZ3JlcHBpbmcgc291cmNlIGNhbid0IHByb3ZlIHRoYXQgZXZlcnkgcm91dGUgaXNcbiAqIGdhdGVkLiBJbnN0ZWFkLCBldmVyeSBnYXRlIG1pZGRsZXdhcmUgaW4gdGhpcyBwYWNrYWdlIGNhcnJpZXMgTUVUQURBVEEgKHdoYXQgaXRcbiAqIHJlcXVpcmVzKSwgYW5kIHtAbGluayBidWlsZFJvdXRlVGFibGV9IHdhbGtzIGFuIGFzc2VtYmxlZCBFeHByZXNzIGFwcCBhbmRcbiAqIHJlc29sdmVzLCBwZXIgbWV0aG9kICsgcGF0aCwgdGhlIGZ1bGwgY2hhaW4gb2YgZ2F0ZXMgRXhwcmVzcyB3b3VsZCBydW4gYmVmb3JlXG4gKiB0aGUgaGFuZGxlcjogcGVybWlzc2lvbnMsIHN5c3RlbS1hZG1pbiwgc2VydmljZSBwcmluY2lwYWwsIHN0ZXAtdXAsIGZlYXR1cmUsXG4gKiB0b2tlbiBzY29wZSwgYW5kIHRoZSBhdWRpdCBhY3Rpb25zIHRoZSByb3V0ZSBkZWNsYXJlcyB2aWEge0BsaW5rIGF1ZGl0ZWR9LlxuICpcbiAqIEV4cHJlc3MgNSAocm91dGVyQDIpIGRvZXMgbm90IGtlZXAgYSBtb3VudCdzIHBhdGggc3RyaW5nIG9uIGl0cyBsYXllciwgc28gdGhpc1xuICogbW9kdWxlIHJlY29yZHMgaXQ6IG9uIGltcG9ydCBpdCB3cmFwcyBgUm91dGVyLnByb3RvdHlwZS51c2VgIHRvIHN0YW1wIGVhY2ggbmV3XG4gKiBsYXllciB3aXRoIHRoZSBwYXRoIGl0IHdhcyBtb3VudGVkIGF0LiBhcGktY29yZSBpcyBpbXBvcnRlZCBiZWZvcmUgYW55IHJvdXRlXG4gKiBtb2R1bGUgcmVnaXN0ZXJzIGEgcm91dGUsIHNvIGV2ZXJ5IGxheWVyIGFuIGFwcCBidWlsZHMgaXMgc3RhbXBlZC4gVGhlIHdyYXBcbiAqIG9ubHkgYWRkcyBhIHN5bWJvbCBwcm9wZXJ0eTsgcm91dGluZyBiZWhhdmlvdXIgaXMgdW5jaGFuZ2VkLlxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgaXNRdW90YUV4ZW1wdFJvdXRlIH0gZnJvbSAnLi9xdW90YS1leGVtcHQtcm91dGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcblxuLyoqXG4gKiBXaGF0IGEgTUFDSElORSBjcmVkZW50aWFsIChQQVQsIHNlcnZpY2UgYWNjb3VudCkgbWVldHMgb24gYSByb3V0ZSBnYXRlZCBieVxuICogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgd2hpbGUgdGhlIG9yZydzIGFkbWluLU1GQSBwb2xpY3kgaXMgb246XG4gKiAgIC0gYGFsbG93YCAg4oCUIHRoZSByb3V0ZSBpcyBsZWdpdGltYXRlbHkgbWFjaGluZS1jYWxsYWJsZSAoYXV0b21hdGlvbiB0aGF0XG4gKiAgICAgICAgICAgICAgICBtYW5hZ2VzIG1lbWJlcnMsIHJvbGVzLCBiaWxsaW5n4oCmKTsgdGhlIHBvbGljeSBpcyBhYm91dCBob3dcbiAqICAgICAgICAgICAgICAgIHN0cm9uZ2x5IGEgUEVSU09OJ3Mgc2Vzc2lvbiB3YXMgb3BlbmVkLCBzbyBpdCBkb2VzIG5vdCBhcHBseTtcbiAqICAgLSBgcmVmdXNlYCDigJQgb25seSBhIHBlcnNvbiBtYXkgZG8gdGhpcyB3aGlsZSB0aGUgcG9saWN5IGlzIG9uICg0MDNcbiAqICAgICAgICAgICAgICAgIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCksIGUuZy4gbWludGluZyBhbm90aGVyIGNyZWRlbnRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgPSAnYWxsb3cnIHwgJ3JlZnVzZSc7XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgcHJpbmNpcGFsIGtpbmRzIGEgYGR5bmFtaWNBdXRoemAgcnVsZSBtYXkgYWRtaXQuXG4gKlxuICogQSByb3V0ZSB3aG9zZSBhdXRob3JpdHkgaXMgcmVzb2x2ZWQgaW4gdGhlIGhhbmRsZXIgc3RpbGwgaGFzIHRvIHNheSBXSE8gY2FuXG4gKiBnZXQgdGhyb3VnaCBpdC4gVGhlc2UgYXJlIHRoZSBraW5kcywgZGVsaWJlcmF0ZWx5IGNvYXJzZSDigJQgdGhlIHByZWNpc2VcbiAqIHByZWRpY2F0ZSBsaXZlcyBpbiB0aGUgcHJvc2UgcnVsZSBhbmQgaW4gdGhlIGNvZGU6XG4gKlxuICogIC0gYHN1cGVyYWRtaW5gICAgIOKAlCB0aGUgYFVzZXIuaXNTdXBlckFkbWluYCBmbGFnIChgaXNTeXN0ZW1BZG1pbihyZXEpYCkuXG4gKiAgLSBgc3lzdGVtLW9yZ2AgICAg4oCUIGEgbWVtYmVyIG9mIHRoZSBzeXN0ZW0gb3JnIGhvbGRpbmcgYSBuYW1lZCBwZXJtaXNzaW9uO1xuICogICAgICAgICAgICAgICAgICAgICAgbGlzdCB0aGUgaWRzIGluIGBwZXJtaXNzaW9uc2Agc28gdGhlIGNvdmVyYWdlIHNjYW4gYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udHJhY3QgY2FuIHNlZSB0aGVtLlxuICogIC0gYHRlbmFudC1hZG1pbmAgIOKAlCBhbiBhZG1pbiBvciBvd25lciBvZiB0aGUgdGFyZ2V0J3Mgb3duIG9yZywgb3Igb2YgYW5cbiAqICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yIG9mIGl0LiBOT1QgYSBzdXBlcmFkbWluIGJ5IHZpcnR1ZSBvZiB0aGUgZmxhZzpcbiAqICAgICAgICAgICAgICAgICAgICAgIHNldmVyYWwgb2YgdGhlc2UgcnVsZXMgcmVmdXNlIHRoZSBmbGFnIG9uIHB1cnBvc2UuXG4gKiAgLSBgdGVuYW50LW1lbWJlcmAg4oCUIGFueSBtZW1iZXIgb2YgdGhlIHRhcmdldCdzIG9yZywgYWRtaW4gb3Igbm90LlxuICogIC0gYHN1YmplY3RgICAgICAgIOKAlCB0aGUgdmVyeSB1c2VyIHRoZSByZXF1ZXN0IGlzIGFib3V0IChzZWxmLXNlcnZpY2UpLlxuICogIC0gYHNlcnZpY2VgICAgICAgIOKAlCBhIHNlcnZpY2UgcHJpbmNpcGFsIC8gaW50ZXJuYWwgY2FsbGVyLlxuICogIC0gYGdhdGV3YXlgICAgICAgIOKAlCB0aGUgaW5ncmVzcyBpdHNlbGYgc3VwcGxpZXMgdGhlIGZhY3QgKHRoZSBjb25zb2xlXG4gKiAgICAgICAgICAgICAgICAgICAgICBgYXV0aF9yZXF1ZXN0YCBwYXNzZXMgdGhlIGNvbnNvbGUgY2xhc3MgaW4gYSBoZWFkZXIpLlxuICovXG5leHBvcnQgY29uc3QgRFlOQU1JQ19QUklOQ0lQQUxTID0gW1xuICAnc3VwZXJhZG1pbicsICdzeXN0ZW0tb3JnJywgJ3RlbmFudC1hZG1pbicsICd0ZW5hbnQtbWVtYmVyJywgJ3N1YmplY3QnLCAnc2VydmljZScsICdnYXRld2F5Jyxcbl0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBEeW5hbWljUHJpbmNpcGFsID0gdHlwZW9mIERZTkFNSUNfUFJJTkNJUEFMU1tudW1iZXJdO1xuXG4vKiogT25lIHJlcXVpcmVtZW50IGEgZ2F0ZSBtaWRkbGV3YXJlIGVuZm9yY2VzLiAqL1xuZXhwb3J0IHR5cGUgUm91dGVHYXRlID1cbiAgfCB7IGtpbmQ6ICdhdXRoJyB9XG4gIHwgeyBraW5kOiAncGVybWlzc2lvbic7IG1vZGU6ICdhbnknIHwgJ2FsbCc7IHBlcm1pc3Npb25zOiByZWFkb25seSBQZXJtaXNzaW9uW107IGFsbG93U2VydmljZT86IGJvb2xlYW4gfVxuICB8IHsga2luZDogJ3N5c3RlbUFkbWluJyB9XG4gIC8qKlxuICAgKiBBdXRob3JpemF0aW9uIHRoZSByb3V0ZSBDQU5OT1QgZXhwcmVzcyBzdGF0aWNhbGx5LCByZXNvbHZlZCBpbiB0aGUgaGFuZGxlci5cbiAgICpcbiAgICogU29tZSBhdXRob3JpdHkgZGVwZW5kcyBvbiB0aGUgcmVxdWVzdDogaW1wZXJzb25hdGlvbiBhc2tzIHdoZXRoZXIgdGhlIGNhbGxlclxuICAgKiBpcyBhIHN5c2FkbWluIE9SIGFuIGFkbWluIG9mIGFuIGFuY2VzdG9yIG9mIHRoZSBUQVJHRVQgdXNlcidzIG9yZywgd2hpY2ggaXNcbiAgICogb25seSBhbnN3ZXJhYmxlIG9uY2UgdGhlIHRhcmdldCBpcyBrbm93bi4gVGhvc2UgZ2F0ZXMgd2VyZSBjb3JyZWN0IGJ1dFxuICAgKiBpbnZpc2libGUg4oCUIHRoZSByb3V0ZSB0YWJsZSBzaG93ZWQgbm8gcmVxdWlyZW1lbnQsIGFuZFxuICAgKiBgZG9jcy9wZXJtaXNzaW9uLWNvbnRyYWN0Lm1kYCBpcyBkZXJpdmVkIGZyb20gdGhlIHRhYmxlLCBzbyB0aGUgYXJ0aWZhY3QgdGhlXG4gICAqIHJlcG8gY2FsbHMgaXRzIHJldmlldyBzdXJmYWNlIHJlYWQgYmxhbmsgZm9yIHRoZSBzdHJvbmdlc3QgcHJpdmlsZWdlIGluIHRoZVxuICAgKiBzeXN0ZW0uXG4gICAqXG4gICAqIFRoaXMgcmVjb3JkcyB0aGUgcmVxdWlyZW1lbnQgaW4gcHJvc2UgQU5EIGFzIGEgY2xvc2VkIHNldCBvZiBwcmluY2lwYWxcbiAgICoga2luZHMuIEl0IGF1dGhvcml6ZXMgTk9USElORzsgdGhlIGhhbmRsZXIgc3RpbGwgZG9lcyB0aGUgd29yay4gSXRzIHZhbHVlIGlzXG4gICAqIHRoYXQgYSByZXZpZXdlciByZWFkaW5nIHRoZSBjb250cmFjdCBzZWVzIGEgc3RhdGVkIHJ1bGUgaW5zdGVhZCBvZiBhbiBlbXB0eVxuICAgKiBjZWxsLCBhbmQgdGhhdCByZW1vdmluZyB0aGUgcmVhbCBjaGVjayBsZWF2ZXMgYSBkZWNsYXJhdGlvbiBiZWhpbmQgdGhhdCBub1xuICAgKiBsb25nZXIgbWF0Y2hlcy5cbiAgICpcbiAgICogV0hZIGByZWFjaGFibGVCeWAgRVhJU1RTIEJFU0lERSBUSEUgUFJPU0UuIFByb3NlIGlzIHVucmV2aWV3YWJsZSBieSBhIHRlc3QsXG4gICAqIGFuZCBvbmUgb2YgdGhlc2UgcnVsZXMgd2FzIHdyb25nOiB0aGUgaW1wZXJzb25hdGlvbiBgZGVjaWRlYCByb3V0ZSBkZWNsYXJlZFxuICAgKiBcImEgRElGRkVSRU5UIHN5c2FkbWluIHRoYW4gdGhlIHJlcXVlc3RlciAodHdvLXBlcnNvbiBydWxlKVwiLCB3aGljaCBpcyBvbmx5XG4gICAqIGl0cyBicmVhay1nbGFzcyBicmFuY2gg4oCUIHRoZSBvcmRpbmFyeSBicmFuY2ggaXMgdGhlIHRlbmFudCdzIG5hbWVkIGFwcHJvdmVyXG4gICAqIG9yIGEgZ2VudWluZSB0ZW5hbnQgYWRtaW4sIGFuZCBhIHN5c2FkbWluIGFsb25lIGlzIGV4cGxpY2l0bHkgUkVGVVNFRCB0aGVyZS5cbiAgICogTm90aGluZyBjb3VsZCBub3RpY2UsIGJlY2F1c2UgdGhlIG9ubHkgbWFjaGluZS1yZWFkYWJsZSBmaWVsZHMgc2FpZFxuICAgKiBgc3lzdGVtQWRtaW46IGZhbHNlLCBwZXJtaXNzaW9uczogW11gLiBBIGNsb3NlZCBzZXQgbWFrZXMgdGhlIGF1dGhvclxuICAgKiBlbnVtZXJhdGUgcHJpbmNpcGFscywgbGV0cyB0aGUgY292ZXJhZ2Ugc2NhbiBhc3NlcnQgdGhlIGRlY2xhcmF0aW9uIGV4aXN0cyxcbiAgICogYW5kIGxldHMgXCJ3aGljaCByb3V0ZXMgY2FuIHRoZSBzdXBlcmFkbWluIGZsYWcgcmVhY2g/XCIgYmUgYW5zd2VyZWQgYnkgYVxuICAgKiBxdWVyeSBpbnN0ZWFkIG9mIGJ5IHJlYWRpbmcgc2l4IHBhcmFncmFwaHMuXG4gICAqL1xuICB8IHsga2luZDogJ2R5bmFtaWNBdXRoeic7IHJ1bGU6IHN0cmluZzsgcmVhY2hhYmxlQnk6IHJlYWRvbmx5IER5bmFtaWNQcmluY2lwYWxbXTsgcGVybWlzc2lvbnM/OiByZWFkb25seSBQZXJtaXNzaW9uW10gfVxuICB8IHsga2luZDogJ3NlcnZpY2VQcmluY2lwYWwnIH1cbiAgLyoqIEFuIElOVEVSTkFMIHJvdXRlOiB1c2VyIHRva2VucyByZWZ1c2VkIG91dHJpZ2h0LCBvbmx5IHRoZXNlIHNlcnZpY2VzIGFkbWl0dGVkLiAqL1xuICB8IHsga2luZDogJ2ludGVybmFsU2VydmljZSc7IGNhbGxlcnM6IHJlYWRvbmx5IHN0cmluZ1tdIH1cbiAgfCB7IGtpbmQ6ICdzdGVwVXAnOyBtZXRob2RzPzogcmVhZG9ubHkgc3RyaW5nW10gfVxuICAvKiogVGhlIHdob2xlIFNFU1NJT04gbXVzdCBiZSBNRkEtZ3JhZGUgKGByZXF1aXJlQXV0aCh7IG1pbkFzc3VyYW5jZSB9KWApLCBhbmRcbiAgICogIG9wdGlvbmFsbHkgbm8gb2xkZXIgdGhhbiBgbWF4QWdlYCBzZWNvbmRzLiBgZXhlbXB0YCBuYW1lcyBhIGNhcnZlLW91dCB0aGVcbiAgICogIGdhdGUgYXBwbGllcyB0byBhIG5hcnJvdyBjbGFzcyBvZiByZXF1ZXN0IChzZWUgYEFzc3VyYW5jZU9wdGlvbnMuZXhlbXB0YCksXG4gICAqICBzbyBhIHJvdXRlIHdob3NlIGxldmVsIGlzIGNvbmRpdGlvbmFsIHNheXMgc28gb24gdGhlIHRhYmxlLiAqL1xuICB8IHsga2luZDogJ2Fzc3VyYW5jZSc7IG1pbkFzc3VyYW5jZTogMSB8IDI7IG1heEFnZT86IG51bWJlcjsgZXhlbXB0Pzogc3RyaW5nIH1cbiAgLyoqIFRoZSBzZXNzaW9uIG11c3QgYmUgTUZBLWdyYWRlIFdIRU4gdGhlIG9yZydzIGBhZG1pbkFjdGlvbnNSZXF1aXJlTWZhYFxuICAgKiAgcG9saWN5IGlzIG9uIChgcmVxdWlyZU9yZ0FkbWluQXNzdXJhbmNlYCkuIGBtYWNoaW5lc2Agc2F5cyB3aGF0IGEgbWFjaGluZVxuICAgKiAgY3JlZGVudGlhbCBtZWV0cyBvbiB0aGUgcm91dGUgd2hpbGUgdGhlIHBvbGljeSBpcyBvbi4gKi9cbiAgfCB7IGtpbmQ6ICdvcmdBZG1pbkFzc3VyYW5jZSc7IG1hY2hpbmVzOiBPcmdBZG1pbkFzc3VyYW5jZU1hY2hpbmVzIH1cbiAgLyoqIFRoZSBjYWxsZXIncyBBQ1RJVkUgb3JnIG11c3QgYmUgdGhlIHN5c3RlbSBvcmcgKGByZXF1aXJlU3lzdGVtT3JnYCkg4oCUIHRoZVxuICAgKiAgcGx1Z2luLWVjb3N5c3RlbSBnb3Zlcm5hbmNlIGJvdW5kYXJ5IChkb2NzL3J1bmJvb2tzL2Vjb3N5c3RlbS1tb2RlcmF0aW9uLm1kKS4gKi9cbiAgfCB7IGtpbmQ6ICdzeXN0ZW1PcmcnIH1cbiAgfCB7IGtpbmQ6ICdmZWF0dXJlJzsgZmVhdHVyZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdzY29wZSc7IHNjb3BlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2F1ZGl0JzsgYWN0aW9uczogcmVhZG9ubHkgc3RyaW5nW10gfVxuICAvKiogQSBxdW90YSBtaWRkbGV3YXJlOiBgbWV0ZXJgIGluY3JlbWVudHMgdGhlIHR5cGUgb25jZSBwZXIgMnh4XG4gICAqICAoYG1ldGVyUXVvdGFPblN1Y2Nlc3NgKSwgYGNoZWNrYCA0MjlzIHdoZW4gdGhlIHR5cGUgaXMgc3BlbnQgKGBjaGVja1F1b3RhYCkuXG4gICAqICBSZWNvcmRlZCBzbyB0aGUgcXVvdGEgY292ZXJhZ2UgY2hlY2sgY2FuIHNlZSBhbiB1bm1ldGVyZWQgdXNlciByb3V0ZSDigJQgYW5kIGFcbiAgICogIHJvdXRlIG1ldGVyZWQgVFdJQ0UsIHdoaWNoIGRvdWJsZS1iaWxscyBldmVyeSBjYWxsLiAqL1xuICB8IHsga2luZDogJ3F1b3RhJzsgbW9kZTogJ21ldGVyJyB8ICdjaGVjayc7IHF1b3RhVHlwZTogc3RyaW5nIH07XG5cbi8vIFN5bWJvbC5mb3IsIG5vdCBTeW1ib2woKTogYSB0ZXN0IHRoYXQgbG9hZHMgYXBpLWNvcmUgdHdpY2UgKEVTTSArIGFcbi8vIHJlcXVpcmVBY3R1YWwgY29weSkgbXVzdCBzdGlsbCBzZWUgdGFncyBzZXQgYnkgdGhlIG90aGVyIGNvcHkuXG5jb25zdCBHQVRFUyA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtZ2F0ZXMnKTtcbmNvbnN0IExBWUVSX1BBVEggPSBTeW1ib2wuZm9yKCdwaXBlbGluZS1idWlsZGVyLmxheWVyLXBhdGgnKTtcbmNvbnN0IFJFQ09SREVSX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtcmVjb3JkZXInKTtcblxudHlwZSBUYWdnZWQgPSB7IFtHQVRFU10/OiBSb3V0ZUdhdGVbXSB9O1xuXG4vKipcbiAqIEF0dGFjaCBnYXRlIG1ldGFkYXRhIHRvIGEgbWlkZGxld2FyZSBmdW5jdGlvbiAoYXBwZW5kcyB0byBhbnkgZXhpc3RpbmcgdGFncylcbiAqIGFuZCByZXR1cm4gdGhlIHNhbWUgZnVuY3Rpb24uIFVzZSBpdCBmb3IgYSBzZXJ2aWNlLWxvY2FsIGdhdGUgc28gdGhlIHJvdXRlXG4gKiB0YWJsZSBrbm93cyB3aGF0IGl0IGVuZm9yY2VzIOKAlCBlLmcuIGEgaGFuZGxlci1sZXZlbCBgcmVxdWlyZUNvbXBsaWFuY2VXcml0ZWBcbiAqIHRhZ2dlZCBgeyBraW5kOiAncGVybWlzc2lvbicsIG1vZGU6ICdhbnknLCBwZXJtaXNzaW9uczogWydjb21wbGlhbmNlOndyaXRlJ10gfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdSb3V0ZUdhdGU8VCBleHRlbmRzIG9iamVjdD4oZm46IFQsIC4uLmdhdGVzOiBSb3V0ZUdhdGVbXSk6IFQge1xuICBjb25zdCB0ID0gZm4gYXMgVCAmIFRhZ2dlZDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIEdBVEVTLCB7IHZhbHVlOiBbLi4uKHRbR0FURVNdID8/IFtdKSwgLi4uZ2F0ZXNdLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIGZuO1xufVxuXG4vKiogVGhlIGdhdGUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIChlbXB0eSB3aGVuIHVudGFnZ2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZUdhdGVzKGZuOiB1bmtub3duKTogcmVhZG9ubHkgUm91dGVHYXRlW10ge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gW107XG4gIHJldHVybiAoZm4gYXMgVGFnZ2VkKVtHQVRFU10gPz8gW107XG59XG5cbi8qKlxuICogRGVjbGFyZSB0aGUgYXVkaXQgYWN0aW9uKHMpIGEgcm91dGUgZW1pdHMuIEEgbm8tb3AgbWlkZGxld2FyZSB3aG9zZSBvbmx5IGpvYlxuICogaXMgdG8gcHV0IHRoZSBhY3Rpb24gb24gdGhlIHJvdXRlIHRhYmxlLCBzbyB0aGUgY292ZXJhZ2UgdGVzdCBjYW4gcmVxdWlyZSBhblxuICogYXVkaXQgZGVjbGFyYXRpb24gb24gZXZlcnkgd3JpdGUgcm91dGUuIFBsYWNlIGl0IGluIHRoZSByb3V0ZSdzIGNoYWluOlxuICogYHJvdXRlci5wb3N0KCcvJywgYXVkaXRlZCgncGlwZWxpbmUuY3JlYXRlJyksIGhhbmRsZXIpYC4gVGhlIGhhbmRsZXIgc3RpbGxcbiAqIGVtaXRzIHRoZSBldmVudCBpdHNlbGYuXG4gKi9cbi8qKlxuICogRGVjbGFyZSBhdXRob3JpemF0aW9uIHRoYXQgdGhlIGhhbmRsZXIgcmVzb2x2ZXMgKHNlZSB0aGUgYGR5bmFtaWNBdXRoemAgZ2F0ZSkuXG4gKiBBIG5vLW9wIG1pZGRsZXdhcmUsIGV4YWN0bHkgbGlrZSB7QGxpbmsgYXVkaXRlZH06IGl0IHJlY29yZHMgdGhlIHJ1bGUgb24gdGhlXG4gKiByb3V0ZSB0YWJsZSBzbyB0aGUgY29udHJhY3QgY2FuIHByaW50IGl0LlxuICpcbiAqIGBydWxlYCBpcyByZWFkIGJ5IGEgaHVtYW4sIHNvIGl0IHNob3VsZCBuYW1lIHRoZSByZWFsIHByZWRpY2F0ZSDigJQgZS5nLlxuICogYCdzeXNhZG1pbiwgb3IgYW4gYWRtaW4gb2YgYW4gYW5jZXN0b3Igb3JnIG9mIHRoZSB0YXJnZXQgdXNlcidgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHluYW1pY0F1dGh6KFxuICBydWxlOiBzdHJpbmcsXG4gIG9wdHM6IHsgcmVhY2hhYmxlQnk6IHJlYWRvbmx5IER5bmFtaWNQcmluY2lwYWxbXTsgcGVybWlzc2lvbnM/OiByZWFkb25seSBQZXJtaXNzaW9uW10gfSxcbik6IChyZXE6IHVua25vd24sIHJlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgPT4gdm9pZCB7XG4gIGlmIChvcHRzLnJlYWNoYWJsZUJ5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZHluYW1pY0F1dGh6KFwiJHtydWxlfVwiKSBtdXN0IG5hbWUgYXQgbGVhc3Qgb25lIHByaW5jaXBhbCBraW5kIGluIHJlYWNoYWJsZUJ5YCk7XG4gIH1cbiAgZm9yIChjb25zdCBwIG9mIG9wdHMucmVhY2hhYmxlQnkpIHtcbiAgICBpZiAoIURZTkFNSUNfUFJJTkNJUEFMUy5pbmNsdWRlcyhwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkeW5hbWljQXV0aHooXCIke3J1bGV9XCIpOiB1bmtub3duIHByaW5jaXBhbCBcIiR7cH1cIiDigJQgb25lIG9mICR7RFlOQU1JQ19QUklOQ0lQQUxTLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWdSb3V0ZUdhdGUoXG4gICAgZnVuY3Rpb24gZHluYW1pY0F1dGh6Um91dGUoX3JlcTogdW5rbm93biwgX3JlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgeyBuZXh0KCk7IH0sXG4gICAgeyBraW5kOiAnZHluYW1pY0F1dGh6JywgcnVsZSwgcmVhY2hhYmxlQnk6IFsuLi5vcHRzLnJlYWNoYWJsZUJ5XSwgLi4uKG9wdHMucGVybWlzc2lvbnMgJiYgeyBwZXJtaXNzaW9uczogWy4uLm9wdHMucGVybWlzc2lvbnNdIH0pIH0sXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdGVkKC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogKHJlcTogdW5rbm93biwgcmVzOiB1bmtub3duLCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB2b2lkIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZShmdW5jdGlvbiBhdWRpdGVkUm91dGUoX3JlcTogdW5rbm93biwgX3JlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgeyBuZXh0KCk7IH0sIHsga2luZDogJ2F1ZGl0JywgYWN0aW9ucyB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb3VudC1wYXRoIHJlY29yZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBMYXllciB7XG4gIGhhbmRsZTogdW5rbm93bjtcbiAgcm91dGU/OiB7IHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdOyBtZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjsgc3RhY2s6IEFycmF5PHsgbWV0aG9kPzogc3RyaW5nOyBoYW5kbGU6IHVua25vd24gfT4gfTtcbiAgbWF0Y2hlcnM6IEFycmF5PChwYXRoOiBzdHJpbmcpID0+IHVua25vd24+O1xuICAvKiogcm91dGVyQDIncyBcIm1vdW50ZWQgYXQgJy8nIHdpdGggZW5kOmZhbHNlXCIgZmFzdCBwYXRoIOKAlCBtYXRjaGVzIEFOWSBwYXRoLiAqL1xuICBzbGFzaD86IGJvb2xlYW47XG4gIFtMQVlFUl9QQVRIXT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJvdXRlckxpa2UgeyBzdGFjazogTGF5ZXJbXSB9XG5cbmZ1bmN0aW9uIGluc3RhbGxSb3V0ZVJlY29yZGVyKCk6IHZvaWQge1xuICBjb25zdCBwcm90byA9IChleHByZXNzLlJvdXRlciBhcyB1bmtub3duIGFzIHsgcHJvdG90eXBlOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiB9KS5wcm90b3R5cGU7XG4gIGlmIChwcm90b1tSRUNPUkRFUl9JTlNUQUxMRURdKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVXNlID0gcHJvdG8udXNlIGFzICh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIHByb3RvLnVzZSA9IGZ1bmN0aW9uIHJlY29yZGluZ1VzZSh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbFVzZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAvLyBTYW1lIHBhdGggZGlzYW1iaWd1YXRpb24gYXMgcm91dGVyQDIncyBgdXNlYDogYSBsZWFkaW5nIG5vbi1mdW5jdGlvblxuICAgIC8vIChwb3NzaWJseSBuZXN0ZWQgaW4gYXJyYXlzKSBpcyB0aGUgcGF0aDsgb3RoZXJ3aXNlIHRoZSBtb3VudCBpcyAnLycuXG4gICAgbGV0IGZpcnN0OiB1bmtub3duID0gYXJnc1swXTtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheShmaXJzdCkgJiYgZmlyc3QubGVuZ3RoID4gMCkgZmlyc3QgPSBmaXJzdFswXTtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIGZpcnN0ID09PSAnZnVuY3Rpb24nID8gJy8nIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGZvciAobGV0IGkgPSBiZWZvcmU7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zdGFja1tpXSwgTEFZRVJfUEFUSCwgeyB2YWx1ZTogcGF0aCwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBSRUNPUkRFUl9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xufVxuXG5pbnN0YWxsUm91dGVSZWNvcmRlcigpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRhYmxlIGNvbnN0cnVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBSZXNvbHZlZCByZXF1aXJlbWVudHMgZm9yIG9uZSBtZXRob2QgKyBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhYmxlRW50cnkge1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICAvKiogQXV0aGVudGljYXRpb24gcnVucyBiZWZvcmUgdGhlIGhhbmRsZXIgKHJlcXVpcmVBdXRoKS4gKi9cbiAgYXV0aDogYm9vbGVhbjtcbiAgLyoqIEVhY2ggcGVybWlzc2lvbiBnYXRlIGluIHRoZSBjaGFpbiAoYWxsIG11c3QgcGFzczsgZWFjaCBpcyBhbnktb2Ygb3IgYWxsLW9mKS4gKi9cbiAgcGVybWlzc2lvbnM6IEFycmF5PHsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlOiBib29sZWFuIH0+O1xuICBzeXN0ZW1BZG1pbjogYm9vbGVhbjtcbiAgc2VydmljZVByaW5jaXBhbDogYm9vbGVhbjtcbiAgLyoqIEF1dGhvcml6YXRpb24gdGhlIEhBTkRMRVIgcmVzb2x2ZXMsIGluIHByb3NlIOKAlCBzZWUgdGhlIGBkeW5hbWljQXV0aHpgIGdhdGUuXG4gICAqICBFbXB0eSB3aGVuIHRoZSByb3V0ZSdzIGF1dGhvcml0eSBpcyBmdWxseSBleHByZXNzZWQgYnkgdGhlIGdhdGVzIGFib3ZlLiAqL1xuICBkeW5hbWljQXV0aHo6IHN0cmluZ1tdO1xuICAvKiogVGhlIHByaW5jaXBhbCBraW5kcyB0aG9zZSBkeW5hbWljIHJ1bGVzIGFkbWl0LCBkZWR1cGVkIGFuZCBzb3J0ZWQuIEFic2VudFxuICAgKiAgd2hlbiB0aGUgcm91dGUgZGVjbGFyZXMgbm8gZHluYW1pYyBydWxlLCBzbyB0YWJsZXMgd2l0aG91dCBvbmUgYXJlXG4gICAqICB1bmNoYW5nZWQuIFRoaXMgaXMgdGhlIG1hY2hpbmUtcmVhZGFibGUgaGFsZiBvZiBgZHluYW1pY0F1dGh6YDogaXQgaXMgaG93XG4gICAqICBcIndoaWNoIHJvdXRlcyBjYW4gdGhlIHN1cGVyYWRtaW4gZmxhZyByZWFjaD9cIiBpcyBhbnN3ZXJhYmxlIHdpdGhvdXRcbiAgICogIHJlYWRpbmcgcHJvc2UuICovXG4gIGR5bmFtaWNSZWFjaGFibGVCeT86IER5bmFtaWNQcmluY2lwYWxbXTtcbiAgLyoqIFBlcm1pc3Npb24gaWRzIGEgZHluYW1pYyBydWxlIGNvbnN1bHRzIGluc2lkZSB0aGUgaGFuZGxlciwgZGVkdXBlZCBhbmRcbiAgICogIHNvcnRlZC4gQWJzZW50IHdoZW4gbm9uZSBkb2VzLiBUaGVzZSBhcmUgUkVBTCBlbmZvcmNlbWVudCDigJQgdGhlIGNvdmVyYWdlXG4gICAqICBzY2FuIGNvdW50cyBhIGB1c2VySGFzUGVybWlzc2lvbihyZXEsICd4JylgIGluIGEgY29udHJvbGxlciDigJQgc28gdGhlXG4gICAqICBjb250cmFjdCBzaG91bGQgbm90IHJlYWQgYXMgdGhvdWdoIHRoZSByb3V0ZSBhc2tlZCBmb3Igbm90aGluZy4gKi9cbiAgZHluYW1pY1Blcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xuICAvKipcbiAgICogVGhlIHNlcnZpY2VzIGFsbG93ZWQgdG8gY2FsbCB0aGlzIHJvdXRlIHdoZW4gaXQgaXMgSU5URVJOQUwgKGByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlYCkuXG4gICAqIEFuIGVtcHR5IGFycmF5IG1lYW5zIHRoZSByb3V0ZSBpcyBub3QgaW50ZXJuYWwg4oCUIGEgdXNlciB0b2tlbiBtYXkgcmVhY2ggaXQsXG4gICAqIHN1YmplY3QgdG8gdGhlIG90aGVyIGdhdGVzLiBTb3J0ZWQsIHNvIHRoZSBnZW5lcmF0ZWQgdGFibGUgaXMgc3RhYmxlLlxuICAgKi9cbiAgaW50ZXJuYWxDYWxsZXJzOiBzdHJpbmdbXTtcbiAgc3RlcFVwOiBib29sZWFuO1xuICAvKiogV2hlbiB0aGUgc3RlcC11cCBnYXRlIG5hbWVzIHRoZSBmYWN0b3JzIHRoYXQgbWF5IGVhcm4gaXQgKGBbJ3dlYmF1dGhuJyxcbiAgICogICd0b3RwJ11gIG9uIHRoZSBtb3N0IGRhbmdlcm91cyByb3V0ZXMpLCB0aGUgYWxsb3dlZCBtZXRob2RzLiBFbXB0eSBtZWFuc1xuICAgKiAgYW55IGZhY3RvciBzYXRpc2ZpZXMgaXQuIFNvcnRlZCwgc28gdGhlIGdlbmVyYXRlZCB0YWJsZSBpcyBzdGFibGUuICovXG4gIHN0ZXBVcE1ldGhvZHM6IHN0cmluZ1tdO1xuICAvKiogSGlnaGVzdCBgbWluQXNzdXJhbmNlYCBhbnkgZ2F0ZSBpbiB0aGUgY2hhaW4gZGVtYW5kczsgMCB3aGVuIG5vbmUgZG9lcy4gKi9cbiAgbWluQXNzdXJhbmNlOiAwIHwgMSB8IDI7XG4gIC8qKiBUaWdodGVzdCBgbWF4QWdlYCAoc2Vjb25kcykgYW55IGFzc3VyYW5jZSBnYXRlIGluIHRoZSBjaGFpbiBkZW1hbmRzLiAqL1xuICBtYXhBZ2U/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbmFtZWQgY2FydmUtb3V0cyB0aGUgY2hhaW4ncyBhc3N1cmFuY2UgZ2F0ZXMgYWxsb3cgKHNvcnRlZCkuIEFic2VudCB3aGVuXG4gICAqIHRoZXJlIGFyZSBub25lLCBzbyBhIHRhYmxlIG9mIHJvdXRlcyB3aXRob3V0IG9uZSBpcyB1bmNoYW5nZWQuIEEgcmV2aWV3ZXJcbiAgICogcmVhZGluZyBgbWluQXNzdXJhbmNlOiAyYCBuZXh0IHRvIGBhc3N1cmFuY2VFeGVtcHQ6IFtcImJvb3RzdHJhcC1zZXR1cFwiXWBcbiAgICoga25vd3MgdGhlIGxldmVsIGlzIHJlcXVpcmVkIG9mIGV2ZXJ5b25lIEVYQ0VQVCB0aGF0IG5hbWVkIGNhc2UuXG4gICAqL1xuICBhc3N1cmFuY2VFeGVtcHQ/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgcm91dGUgcmVxdWlyZXMgYW4gTUZBLWdyYWRlIHNlc3Npb24gV0hFTiB0aGUgb3JnJ3NcbiAgICogYGFkbWluQWN0aW9uc1JlcXVpcmVNZmFgIHBvbGljeSBpcyBvbiAoYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWApLCB3aXRoXG4gICAqIHdoYXQgYSBtYWNoaW5lIGNyZWRlbnRpYWwgbWVldHMgdGhlcmUuIEFic2VudCAobm90IGBmYWxzZWApIG90aGVyd2lzZSwgc29cbiAgICogdGhlIHRhYmxlIG9mIGEgc2VydmljZSB0aGF0IHVzZXMgbm8gc3VjaCBnYXRlIGlzIHVuY2hhbmdlZC5cbiAgICovXG4gIG9yZ0FkbWluQXNzdXJhbmNlPzogeyBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcyB9O1xuICAvKipcbiAgICogUHJlc2VudCAoYWx3YXlzIGB0cnVlYCkgd2hlbiB0aGUgY2hhaW4gcnVucyBgcmVxdWlyZVN5c3RlbU9yZ2A6IG9ubHkgYVxuICAgKiBjYWxsZXIgd2hvc2UgYWN0aXZlIG9yZyBpcyB0aGUgc3lzdGVtIG9yZyBnZXRzIHRocm91Z2guIEFic2VudCBvdGhlcndpc2UsXG4gICAqIHNvIHRoZSB0YWJsZSBvZiBhIHNlcnZpY2Ugd2l0aCBubyBlY29zeXN0ZW0tZ292ZXJuYW5jZSByb3V0ZSBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBzeXN0ZW1Pcmc/OiB0cnVlO1xuICBmZWF0dXJlczogc3RyaW5nW107XG4gIHNjb3Blczogc3RyaW5nW107XG4gIGF1ZGl0OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBxdW90YSBtaWRkbGV3YXJlIGluIHRoZSBjaGFpbjogdGhlIHR5cGVzIG1ldGVyZWQgKG9uY2UgcGVyIDJ4eCkgYW5kXG4gICAqIGNoZWNrZWQgKDQyOSB3aGVuIHNwZW50KS4gYG1ldGVyZWRgIGlzIE5PVCBkZWR1cGVkIOKAlCBhIHR5cGUgbGlzdGVkIHR3aWNlIGlzXG4gICAqIG1ldGVyZWQgdHdpY2UsIHdoaWNoIHRoZSBjb3ZlcmFnZSBjaGVjayBmbGFncy4gYGV4ZW1wdGAgbWFya3MgYSByb3V0ZSBvbiB0aGVcbiAgICogZmxlZXQtd2lkZSBgUVVPVEFfRVhFTVBUX1JPVVRFU2AgbGlzdCwgd2hlcmUgdGhlIGBhcGlDYWxsc2AgbWV0ZXIgYW5kIGNoZWNrXG4gICAqIGFyZSBuby1vcHMgYXQgcnVudGltZSAoc28gYGFwaUNhbGxzYCBpcyBsZWZ0IG91dCBvZiBib3RoIGxpc3RzKS4gQWJzZW50IHdoZW5cbiAgICogdGhlIGNoYWluIGhhcyBubyBxdW90YSBtaWRkbGV3YXJlIGFuZCB0aGUgcm91dGUgaXMgbm90IGV4ZW1wdC5cbiAgICovXG4gIHF1b3RhPzogeyBtZXRlcmVkOiBzdHJpbmdbXTsgY2hlY2tlZDogc3RyaW5nW107IGV4ZW1wdD86IHRydWUgfTtcbn1cblxuaW50ZXJmYWNlIENhbmRpZGF0ZSB7IGxheWVyOiBMYXllcjsgcHJlZml4OiBzdHJpbmcgfVxuXG5mdW5jdGlvbiBqb2luUGF0aChwcmVmaXg6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gYCR7cHJlZml4LnJlcGxhY2UoL1xcLyskLywgJycpfS8ke3BhdGgucmVwbGFjZSgvXlxcLysvLCAnJyl9YDtcbiAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAxID8gam9pbmVkLnJlcGxhY2UoL1xcLyskLywgJycpIDogJy8nO1xufVxuXG5mdW5jdGlvbiBpc1JvdXRlcihoYW5kbGU6IHVua25vd24pOiBoYW5kbGUgaXMgUm91dGVyTGlrZSB7XG4gIHJldHVybiB0eXBlb2YgaGFuZGxlID09PSAnZnVuY3Rpb24nICYmIEFycmF5LmlzQXJyYXkoKGhhbmRsZSBhcyBQYXJ0aWFsPFJvdXRlckxpa2U+KS5zdGFjayk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIG1pZGRsZXdhcmUgbGF5ZXIgKG1vdW50ZWQgdW5kZXIgYHByZWZpeGApIHJ1bnMgZm9yIGBmdWxsUGF0aGAuXG4gKiBNaXJyb3JzIGBMYXllci5wcm90b3R5cGUubWF0Y2hgLCBpbmNsdWRpbmcgaXRzIGZhc3QgcGF0aDogYSBsYXllciBhZGRlZCB3aXRoXG4gKiBubyBwYXRoIChgcm91dGVyLnVzZShnYXRlKWApIG1hdGNoZXMgRVZFUlkgcGF0aCB1bmRlciBpdHMgcm91dGVyIOKAlCB3aGljaCBpc1xuICogZXhhY3RseSBob3cgdGhlIHNoYXJlZCBgcmVxdWlyZVBlcm1pc3Npb25gIGdhdGVzIGJldHdlZW4gdHdvIGByb3V0ZXIudXNlKC4uLilgXG4gKiBtb3VudHMgcmVhY2ggdGhlIHJvdXRlcnMgcmVnaXN0ZXJlZCBhZnRlciB0aGVtLlxuICovXG5mdW5jdGlvbiBhcHBsaWVzKGM6IENhbmRpZGF0ZSwgZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlID0gYy5wcmVmaXggPT09ICcvJyA/ICcnIDogYy5wcmVmaXg7XG4gIGlmIChiYXNlICYmIGZ1bGxQYXRoICE9PSBiYXNlICYmICFmdWxsUGF0aC5zdGFydHNXaXRoKGAke2Jhc2V9L2ApKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjLmxheWVyLnNsYXNoKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcmVsID0gZnVsbFBhdGguc2xpY2UoYmFzZS5sZW5ndGgpIHx8ICcvJztcbiAgcmV0dXJuIGMubGF5ZXIubWF0Y2hlcnMuc29tZSgobSkgPT4gbShyZWwpICE9PSBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RHYXRlcyhmbnM6IHVua25vd25bXSk6IFJvdXRlR2F0ZVtdIHtcbiAgcmV0dXJuIGZucy5mbGF0TWFwKChmbikgPT4gZ2V0Um91dGVHYXRlcyhmbikpO1xufVxuXG5mdW5jdGlvbiB0b0VudHJ5KG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGdhdGVzOiBSb3V0ZUdhdGVbXSk6IFJvdXRlVGFibGVFbnRyeSB7XG4gIGNvbnN0IGVudHJ5OiBSb3V0ZVRhYmxlRW50cnkgPSB7XG4gICAgbWV0aG9kLFxuICAgIHBhdGgsXG4gICAgYXV0aDogZmFsc2UsXG4gICAgcGVybWlzc2lvbnM6IFtdLFxuICAgIHN5c3RlbUFkbWluOiBmYWxzZSxcbiAgICBzZXJ2aWNlUHJpbmNpcGFsOiBmYWxzZSxcbiAgICBkeW5hbWljQXV0aHo6IFtdLFxuICAgIGludGVybmFsQ2FsbGVyczogW10sXG4gICAgc3RlcFVwOiBmYWxzZSxcbiAgICBzdGVwVXBNZXRob2RzOiBbXSxcbiAgICBtaW5Bc3N1cmFuY2U6IDAsXG4gICAgZmVhdHVyZXM6IFtdLFxuICAgIHNjb3BlczogW10sXG4gICAgYXVkaXQ6IFtdLFxuICB9O1xuICBmb3IgKGNvbnN0IGcgb2YgZ2F0ZXMpIHtcbiAgICBzd2l0Y2ggKGcua2luZCkge1xuICAgICAgY2FzZSAnYXV0aCc6IGVudHJ5LmF1dGggPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ3Blcm1pc3Npb24nOiBlbnRyeS5wZXJtaXNzaW9ucy5wdXNoKHsgbW9kZTogZy5tb2RlLCBwZXJtaXNzaW9uczogWy4uLmcucGVybWlzc2lvbnNdLCBhbGxvd1NlcnZpY2U6IGcuYWxsb3dTZXJ2aWNlID09PSB0cnVlIH0pOyBicmVhaztcbiAgICAgIGNhc2UgJ3N5c3RlbUFkbWluJzogZW50cnkuc3lzdGVtQWRtaW4gPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ3NlcnZpY2VQcmluY2lwYWwnOiBlbnRyeS5zZXJ2aWNlUHJpbmNpcGFsID0gdHJ1ZTsgYnJlYWs7XG4gICAgICBjYXNlICdkeW5hbWljQXV0aHonOlxuICAgICAgICBpZiAoIWVudHJ5LmR5bmFtaWNBdXRoei5pbmNsdWRlcyhnLnJ1bGUpKSBlbnRyeS5keW5hbWljQXV0aHoucHVzaChnLnJ1bGUpO1xuICAgICAgICBlbnRyeS5keW5hbWljUmVhY2hhYmxlQnkgPSBbLi4ubmV3IFNldChbLi4uKGVudHJ5LmR5bmFtaWNSZWFjaGFibGVCeSA/PyBbXSksIC4uLmcucmVhY2hhYmxlQnldKV0uc29ydCgpO1xuICAgICAgICBpZiAoZy5wZXJtaXNzaW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgZW50cnkuZHluYW1pY1Blcm1pc3Npb25zID0gWy4uLm5ldyBTZXQoWy4uLihlbnRyeS5keW5hbWljUGVybWlzc2lvbnMgPz8gW10pLCAuLi5nLnBlcm1pc3Npb25zXSldLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2ludGVybmFsU2VydmljZSc6IGZvciAoY29uc3QgYyBvZiBnLmNhbGxlcnMpIGlmICghZW50cnkuaW50ZXJuYWxDYWxsZXJzLmluY2x1ZGVzKGMpKSBlbnRyeS5pbnRlcm5hbENhbGxlcnMucHVzaChjKTsgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwVXAnOlxuICAgICAgICBlbnRyeS5zdGVwVXAgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgZy5tZXRob2RzID8/IFtdKSBpZiAoIWVudHJ5LnN0ZXBVcE1ldGhvZHMuaW5jbHVkZXMobSkpIGVudHJ5LnN0ZXBVcE1ldGhvZHMucHVzaChtKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhc3N1cmFuY2UnOlxuICAgICAgICAvLyBTZXZlcmFsIGdhdGVzIG1heSBhcHBseTsgdGhlIFNUUklDVEVTVCB3aW5zLCBzaW5jZSBldmVyeSBvbmUgb2YgdGhlbSBydW5zLlxuICAgICAgICBpZiAoZy5taW5Bc3N1cmFuY2UgPiBlbnRyeS5taW5Bc3N1cmFuY2UpIGVudHJ5Lm1pbkFzc3VyYW5jZSA9IGcubWluQXNzdXJhbmNlO1xuICAgICAgICBpZiAoZy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkgZW50cnkubWF4QWdlID0gZW50cnkubWF4QWdlID09PSB1bmRlZmluZWQgPyBnLm1heEFnZSA6IE1hdGgubWluKGVudHJ5Lm1heEFnZSwgZy5tYXhBZ2UpO1xuICAgICAgICBpZiAoZy5leGVtcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVudHJ5LmFzc3VyYW5jZUV4ZW1wdCA9IFsuLi5uZXcgU2V0KFsuLi4oZW50cnkuYXNzdXJhbmNlRXhlbXB0ID8/IFtdKSwgZy5leGVtcHRdKV0uc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3JnQWRtaW5Bc3N1cmFuY2UnOlxuICAgICAgICAvLyBTdHJpY3Rlc3Qgd2luczogb25lIGByZWZ1c2VgIGluIHRoZSBjaGFpbiByZWZ1c2VzIG1hY2hpbmVzLlxuICAgICAgICBlbnRyeS5vcmdBZG1pbkFzc3VyYW5jZSA9IHtcbiAgICAgICAgICBtYWNoaW5lczogZW50cnkub3JnQWRtaW5Bc3N1cmFuY2U/Lm1hY2hpbmVzID09PSAncmVmdXNlJyB8fCBnLm1hY2hpbmVzID09PSAncmVmdXNlJyA/ICdyZWZ1c2UnIDogJ2FsbG93JyxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzeXN0ZW1PcmcnOiBlbnRyeS5zeXN0ZW1PcmcgPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ2ZlYXR1cmUnOiBpZiAoIWVudHJ5LmZlYXR1cmVzLmluY2x1ZGVzKGcuZmVhdHVyZSkpIGVudHJ5LmZlYXR1cmVzLnB1c2goZy5mZWF0dXJlKTsgYnJlYWs7XG4gICAgICBjYXNlICdzY29wZSc6IGlmICghZW50cnkuc2NvcGVzLmluY2x1ZGVzKGcuc2NvcGUpKSBlbnRyeS5zY29wZXMucHVzaChnLnNjb3BlKTsgYnJlYWs7XG4gICAgICBjYXNlICdhdWRpdCc6IGZvciAoY29uc3QgYSBvZiBnLmFjdGlvbnMpIGlmICghZW50cnkuYXVkaXQuaW5jbHVkZXMoYSkpIGVudHJ5LmF1ZGl0LnB1c2goYSk7IGJyZWFrO1xuICAgICAgY2FzZSAncXVvdGEnOiB7XG4gICAgICAgIGNvbnN0IHF1b3RhID0gZW50cnkucXVvdGEgPz8gKGVudHJ5LnF1b3RhID0geyBtZXRlcmVkOiBbXSwgY2hlY2tlZDogW10gfSk7XG4gICAgICAgIGlmIChnLm1vZGUgPT09ICdtZXRlcicpIHF1b3RhLm1ldGVyZWQucHVzaChnLnF1b3RhVHlwZSk7XG4gICAgICAgIGVsc2UgaWYgKCFxdW90YS5jaGVja2VkLmluY2x1ZGVzKGcucXVvdGFUeXBlKSkgcXVvdGEuY2hlY2tlZC5wdXNoKGcucXVvdGFUeXBlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIEFuIGV4ZW1wdCByb3V0ZSdzIGFwaUNhbGxzIG1ldGVyICsgY2hlY2sgc2tpcCBpdCBhdCBydW50aW1lLCBzbyB0aGUgdGFibGVcbiAgLy8gc2F5cyB3aGF0IGFjdHVhbGx5IGhhcHBlbnMgcmF0aGVyIHRoYW4gd2hhdCBpcyBtb3VudGVkLlxuICBpZiAoaXNRdW90YUV4ZW1wdFJvdXRlKG1ldGhvZCwgcGF0aCkpIHtcbiAgICBjb25zdCBxdW90YSA9IGVudHJ5LnF1b3RhID8/IHsgbWV0ZXJlZDogW10sIGNoZWNrZWQ6IFtdIH07XG4gICAgZW50cnkucXVvdGEgPSB7XG4gICAgICBtZXRlcmVkOiBxdW90YS5tZXRlcmVkLmZpbHRlcigodCkgPT4gdCAhPT0gJ2FwaUNhbGxzJyksXG4gICAgICBjaGVja2VkOiBxdW90YS5jaGVja2VkLmZpbHRlcigodCkgPT4gdCAhPT0gJ2FwaUNhbGxzJyksXG4gICAgICBleGVtcHQ6IHRydWUsXG4gICAgfTtcbiAgfVxuICBlbnRyeS5pbnRlcm5hbENhbGxlcnMuc29ydCgpO1xuICBlbnRyeS5zdGVwVXBNZXRob2RzLnNvcnQoKTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG5mdW5jdGlvbiB3YWxrKHN0YWNrOiBMYXllcltdLCBwcmVmaXg6IHN0cmluZywgaW5oZXJpdGVkOiBDYW5kaWRhdGVbXSwgb3V0OiBSb3V0ZVRhYmxlRW50cnlbXSwgc2VlbjogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgY29uc3QgbG9jYWw6IENhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbGF5ZXIgb2Ygc3RhY2spIHtcbiAgICBpZiAobGF5ZXIucm91dGUpIHtcbiAgICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShsYXllci5yb3V0ZS5wYXRoKSA/IGxheWVyLnJvdXRlLnBhdGggOiBbbGF5ZXIucm91dGUucGF0aF07XG4gICAgICBjb25zdCBtZXRob2RzID0gT2JqZWN0LmtleXMobGF5ZXIucm91dGUubWV0aG9kcykubWFwKChtKSA9PiAobSA9PT0gJ19hbGwnID8gJyonIDogbS50b1VwcGVyQ2FzZSgpKSk7XG4gICAgICBmb3IgKGNvbnN0IHJvdXRlUGF0aCBvZiBwYXRocykge1xuICAgICAgICBjb25zdCBmdWxsID0gam9pblBhdGgocHJlZml4LCBTdHJpbmcocm91dGVQYXRoKSk7XG4gICAgICAgIGNvbnN0IGNoYWluID0gWy4uLmluaGVyaXRlZCwgLi4ubG9jYWxdLmZpbHRlcigoYykgPT4gYXBwbGllcyhjLCBmdWxsKSkubWFwKChjKSA9PiBjLmxheWVyLmhhbmRsZSk7XG4gICAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHttZXRob2R9ICR7ZnVsbH1gO1xuICAgICAgICAgIC8vIEZpcnN0IHJlZ2lzdHJhdGlvbiB3aW5zLCBhcyBpbiBFeHByZXNzOiBhIGxhdGVyIGR1cGxpY2F0ZSBpcyB1bnJlYWNoYWJsZS5cbiAgICAgICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgICBjb25zdCByb3V0ZUZucyA9IGxheWVyLnJvdXRlLnN0YWNrXG4gICAgICAgICAgICAuZmlsdGVyKChsKSA9PiBsLm1ldGhvZCA9PT0gdW5kZWZpbmVkIHx8IGwubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09IG1ldGhvZCB8fCBtZXRob2QgPT09ICcqJylcbiAgICAgICAgICAgIC5tYXAoKGwpID0+IGwuaGFuZGxlKTtcbiAgICAgICAgICBvdXQucHVzaCh0b0VudHJ5KG1ldGhvZCwgZnVsbCwgY29sbGVjdEdhdGVzKFsuLi5jaGFpbiwgLi4ucm91dGVGbnNdKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JvdXRlcihsYXllci5oYW5kbGUpKSB7XG4gICAgICBjb25zdCBtb3VudFBhdGggPSBqb2luUGF0aChwcmVmaXgsIGxheWVyW0xBWUVSX1BBVEhdID8/ICcvJyk7XG4gICAgICAvLyBNaWRkbGV3YXJlIHRoYXQgcnVucyBiZWZvcmUgdGhpcyByb3V0ZXIgKGFuY2VzdG9ycyArIGVhcmxpZXIgc2libGluZ3MpXG4gICAgICAvLyBpcyBpbmhlcml0ZWQ7IGFwcGxpY2FiaWxpdHkgaXMgcmUtY2hlY2tlZCBhZ2FpbnN0IGVhY2ggZnVsbCByb3V0ZSBwYXRoLlxuICAgICAgd2FsayhsYXllci5oYW5kbGUuc3RhY2ssIG1vdW50UGF0aCwgWy4uLmluaGVyaXRlZCwgLi4ubG9jYWxdLCBvdXQsIHNlZW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbC5wdXNoKHsgbGF5ZXIsIHByZWZpeCB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgcm91dGUgdGFibGUgb2YgYW4gYXNzZW1ibGVkIEV4cHJlc3MgYXBwIChvciByb3V0ZXIpOiBvbmUgZW50cnkgcGVyXG4gKiByZWFjaGFibGUgbWV0aG9kICsgcGF0aCB3aXRoIGV2ZXJ5IGdhdGUgdGhhdCBydW5zIGJlZm9yZSBpdHMgaGFuZGxlci5cbiAqIEhFQUQgaXMgZm9sZGVkIGludG8gR0VULCBhcyBFeHByZXNzIGRvZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJvdXRlVGFibGUoYXBwOiB1bmtub3duKTogUm91dGVUYWJsZUVudHJ5W10ge1xuICBjb25zdCByb290ID0gKGFwcCBhcyB7IHJvdXRlcj86IFJvdXRlckxpa2UgfSkucm91dGVyID8/IChhcHAgYXMgUm91dGVyTGlrZSk7XG4gIGNvbnN0IG91dDogUm91dGVUYWJsZUVudHJ5W10gPSBbXTtcbiAgaWYgKCFyb290IHx8ICFBcnJheS5pc0FycmF5KHJvb3Quc3RhY2spKSByZXR1cm4gb3V0O1xuICB3YWxrKHJvb3Quc3RhY2ssICcvJywgW10sIG91dCwgbmV3IFNldCgpKTtcbiAgcmV0dXJuIG91dC5zb3J0KChhLCBiKSA9PiAoYS5wYXRoID09PSBiLnBhdGggPyBhLm1ldGhvZC5sb2NhbGVDb21wYXJlKGIubWV0aG9kKSA6IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtZXRob2QgbXV0YXRlcyBzdGF0ZSAoZXZlcnl0aGluZyBleGNlcHQgR0VUL0hFQUQvT1BUSU9OUykuICovXG5leHBvcnQgZnVuY3Rpb24gaXNXcml0ZU1ldGhvZChtZXRob2Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gIVsnR0VUJywgJ0hFQUQnLCAnT1BUSU9OUyddLmluY2x1ZGVzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLyoqIFN1bW1hcnkgY291bnRzIGZvciBhIHN0YXJ0dXAgbG9nIGxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtbWFyaXplUm91dGVUYWJsZSh0YWJsZTogcmVhZG9ubHkgUm91dGVUYWJsZUVudHJ5W10pOiB7IHJvdXRlczogbnVtYmVyOyB3cml0ZXM6IG51bWJlcjsgdW5nYXRlZDogbnVtYmVyOyB1bmF1ZGl0ZWQ6IG51bWJlcjsgaW50ZXJuYWw6IG51bWJlciB9IHtcbiAgY29uc3QgZ2F0ZWQgPSAoZTogUm91dGVUYWJsZUVudHJ5KTogYm9vbGVhbiA9PiBlLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgfHwgZS5zeXN0ZW1BZG1pbiB8fCBlLnNlcnZpY2VQcmluY2lwYWwgfHwgZS5keW5hbWljQXV0aHoubGVuZ3RoID4gMDtcbiAgY29uc3Qgd3JpdGVzID0gdGFibGUuZmlsdGVyKChlKSA9PiBpc1dyaXRlTWV0aG9kKGUubWV0aG9kKSk7XG4gIHJldHVybiB7XG4gICAgcm91dGVzOiB0YWJsZS5sZW5ndGgsXG4gICAgd3JpdGVzOiB3cml0ZXMubGVuZ3RoLFxuICAgIHVuZ2F0ZWQ6IHRhYmxlLmZpbHRlcigoZSkgPT4gIWdhdGVkKGUpKS5sZW5ndGgsXG4gICAgdW5hdWRpdGVkOiB3cml0ZXMuZmlsdGVyKChlKSA9PiBlLmF1ZGl0Lmxlbmd0aCA9PT0gMCkubGVuZ3RoLFxuICAgIGludGVybmFsOiB0YWJsZS5maWx0ZXIoKGUpID0+IGUuaW50ZXJuYWxDYWxsZXJzLmxlbmd0aCA+IDApLmxlbmd0aCxcbiAgfTtcbn1cbiJdfQ==
@@ -38,6 +38,14 @@ export interface ServiceTokenOptions {
38
38
  * WITHOUT carrying `isAdmin`, so a leaked token can't perform admin actions.
39
39
  */
40
40
  permissions?: Permission[];
41
+ /**
42
+ * Signed claim (`auditCrossOrg: true`) letting an `/audit/events` delivery name
43
+ * an `affectedOrgId` outside the token's org. Set ONLY by the remote-audit
44
+ * client, and only when the event's verified inbound principal was a
45
+ * superadmin or a system-org member — never from call-site input. Means
46
+ * nothing to any other route.
47
+ */
48
+ auditCrossOrg?: boolean;
41
49
  }
42
50
  /**
43
51
  * Mint a JWT identifying the calling service. Used for inter-service HTTP calls.
@@ -20,8 +20,9 @@ import { decodeJwtHeader } from '../utils/jwk.js';
20
20
  // the claim; the subject names — and since #14 the name is cryptographically
21
21
  // bound to the signing key, so it can also be trusted.
22
22
  // `requireAuth` accepts these tokens transparently — they pass `decoded.sub`
23
- // and `decoded.role` checks, and downstream `requireOrganization` /
24
- // `requireSystemAdmin` rely on the org/role embedded in the token.
23
+ // and `decoded.role` checks, and the downstream org/role gates
24
+ // (`requireOrgMembership` in platform's controller helpers, `requireSystemAdmin`)
25
+ // rely on the org/role embedded in the token.
25
26
  //
26
27
  // Tokens default to 5-minute TTL — long enough to survive a backend hop,
27
28
  // short enough that a leaked token is low-value.
@@ -87,6 +88,7 @@ export function signServiceToken(opts) {
87
88
  // Least-privilege capability claim (optional) — lets a member-role token
88
89
  // satisfy a specific permission gate without carrying isAdmin.
89
90
  ...(opts.permissions && opts.permissions.length > 0 ? { permissions: opts.permissions } : {}),
91
+ ...(opts.auditCrossOrg ? { auditCrossOrg: true } : {}),
90
92
  };
91
93
  // `sub`, `iat`/`exp` and the optional issuer/audience that requireAuth
92
94
  // verifies are stamped by the signer, so there is exactly one place that
@@ -155,4 +157,4 @@ export function verifyServicePrincipal(req) {
155
157
  return false;
156
158
  }
157
159
  }
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOztHQUVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JILE9BQU8sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQW1CLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELDhFQUE4RTtBQUM5RSw0QkFBNEI7QUFDNUIsRUFBRTtBQUNGLDRFQUE0RTtBQUM1RSxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCw2RUFBNkU7QUFDN0Usb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGlEQUFpRDtBQUNqRCw4RUFBOEU7QUFFOUUsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUM7QUFFOUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FDbEMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixJQUFJLEVBQUUsQ0FBQztLQUN2QyxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDcEIs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b3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zIGFuZCBzZXJ2aWNlLXByaW5jaXBhbCBjaGVja3MuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMsIGlzc3VlckF1ZGllbmNlT3B0aW9ucyB9IGZyb20gJy4vand0LXZlcmlmeS5qcyc7XG5pbXBvcnQgeyBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLCBpc1NlcnZpY2VLaWQsIHNpZ25TZXJ2aWNlSnd0LCB2ZXJpZnlTZXJ2aWNlSnd0IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IHR5cGUgSnd0UGF5bG9hZCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyB0eXBlIFBlcm1pc3Npb24gfSBmcm9tICcuLi90eXBlcy9wZXJtaXNzaW9ucy5qcyc7XG5pbXBvcnQgeyBkZWNvZGVKd3RIZWFkZXIgfSBmcm9tICcuLi91dGlscy9qd2suanMnO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJ2aWNlLXRvLXNlcnZpY2UgdG9rZW5zXG4vL1xuLy8gSW50ZXItc2VydmljZSBIVFRQIGNhbGxzIChiaWxsaW5nIOKGkiBtZXNzYWdlLCBwbGF0Zm9ybSDihpIgY29tcGxpYW5jZSwgZXRjLilcbi8vIG5lZWQgdG8gc2F0aXNmeSB0aGUgc2FtZSBgcmVxdWlyZUF1dGhgIG1pZGRsZXdhcmUgYXMgdXNlciByZXF1ZXN0cy5cbi8vIGBzaWduU2VydmljZVRva2VuYCBtaW50cyBhIHNob3J0LWxpdmVkIEVTMjU2IEpXVCBzaWduZWQgd2l0aCBUSElTIHNlcnZpY2Unc1xuLy8gT1dOIGtleSAoc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgKSwgY2FycnlpbmcgYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2Bcbi8vIGFuZCBuYW1pbmcgdGhlIGNhbGxpbmcgc2VydmljZSB2aWEgYHN1YjogJ3NlcnZpY2U6PG5hbWU+J2AuIEdhdGVzIGJyYW5jaCBvblxuLy8gdGhlIGNsYWltOyB0aGUgc3ViamVjdCBuYW1lcyDigJQgYW5kIHNpbmNlICMxNCB0aGUgbmFtZSBpcyBjcnlwdG9ncmFwaGljYWxseVxuLy8gYm91bmQgdG8gdGhlIHNpZ25pbmcga2V5LCBzbyBpdCBjYW4gYWxzbyBiZSB0cnVzdGVkLlxuLy8gYHJlcXVpcmVBdXRoYCBhY2NlcHRzIHRoZXNlIHRva2VucyB0cmFuc3BhcmVudGx5IOKAlCB0aGV5IHBhc3MgYGRlY29kZWQuc3ViYFxuLy8gYW5kIGBkZWNvZGVkLnJvbGVgIGNoZWNrcywgYW5kIGRvd25zdHJlYW0gYHJlcXVpcmVPcmdhbml6YXRpb25gIC9cbi8vIGByZXF1aXJlU3lzdGVtQWRtaW5gIHJlbHkgb24gdGhlIG9yZy9yb2xlIGVtYmVkZGVkIGluIHRoZSB0b2tlbi5cbi8vXG4vLyBUb2tlbnMgZGVmYXVsdCB0byA1LW1pbnV0ZSBUVEwg4oCUIGxvbmcgZW5vdWdoIHRvIHN1cnZpdmUgYSBiYWNrZW5kIGhvcCxcbi8vIHNob3J0IGVub3VnaCB0aGF0IGEgbGVha2VkIHRva2VuIGlzIGxvdy12YWx1ZS5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMgPSAzMDA7XG5cbi8qKlxuICogRGVueWxpc3Qgb2Ygc2VydmljZSBOQU1FUyAodGhlIGA8bmFtZT5gIGluIGBzdWI6IHNlcnZpY2U6PG5hbWU+YCkgd2hvc2UgdG9rZW5zXG4gKiBgcmVxdWlyZUF1dGhgIG11c3QgcmVqZWN0LiBSZWFkIGZyb20gYFNFUlZJQ0VfVE9LRU5fREVOWUxJU1RgIChjb21tYS1zZXBhcmF0ZWQpXG4gKiBhdCBwcm9jZXNzIHN0YXJ0LCBzbyBhcm1pbmcgaXQgaXMgYSBjb25maWcgY2hhbmdlICsgcm9sbG91dCDigJQgaXQgY3V0cyBvZmYgYVxuICogY29tcHJvbWlzZWQgc2VydmljZSBXSVRIT1VUIHJvdGF0aW5nIGFueSBrZXksIGFuZCB3aXRob3V0IGludmFsaWRhdGluZyBldmVyeVxuICogb3RoZXIgc2VydmljZSdzIHRva2VucyBhcyBjb2xsYXRlcmFsLlxuICovXG5jb25zdCBzZXJ2aWNlVG9rZW5EZW55bGlzdCA9IG5ldyBTZXQoXG4gIChwcm9jZXNzLmVudi5TRVJWSUNFX1RPS0VOX0RFTllMSVNUIHx8ICcnKVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbik7XG5cbi8qKlxuICogVGhlIGNhbGxpbmcgc2VydmljZSdzIG5hbWUgZm9yIGEgU0VSVklDRSBwcmluY2lwYWwgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgKSxcbiAqIGVsc2UgYHVuZGVmaW5lZGAuIEEgdXNlciB0b2tlbiBuZXZlciB5aWVsZHMgYSBuYW1lLCB3aGF0ZXZlciBpdHMgYHN1YmAgc2F5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VOYW1lT2YoY2xhaW1zOiB7IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7IHN1Yj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNsYWltcz8ucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8IHR5cGVvZiBjbGFpbXMuc3ViICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjbGFpbXMuc3ViLnN0YXJ0c1dpdGgoU0VSVklDRV9TVUJKRUNUX1BSRUZJWCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjbGFpbXMuc3ViLnNsaWNlKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgubGVuZ3RoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIGNsYWltcyBhcmUgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGlzIG9uIHRoZSBkZW55bGlzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VUb2tlbkRlbmllZChjbGFpbXM6IHsgcHJpbmNpcGFsVHlwZT86IHN0cmluZzsgc3ViPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgaWYgKHNlcnZpY2VUb2tlbkRlbnlsaXN0LnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmFtZSA9IHNlcnZpY2VOYW1lT2YoY2xhaW1zKTtcbiAgcmV0dXJuIG5hbWUgIT09IHVuZGVmaW5lZCAmJiBzZXJ2aWNlVG9rZW5EZW55bGlzdC5oYXMobmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVRva2VuT3B0aW9ucyB7XG4gIC8qKiBDYWxsaW5nIHNlcnZpY2UgaWRlbnRpZmllciAoZS5nLiAnYmlsbGluZycsICdwbGF0Zm9ybScpLiBFbWJlZGRlZCBhcyBgc3ViOiBzZXJ2aWNlOjxuYW1lPmAuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIGNvbnRleHQgZm9yIHRoZSBjYWxsLiBVc2UgdGhlIHRhcmdldCB0ZW5hbnQncyBvcmcgaWQsIG9yIHRoZVxuICAgKiAgd2VsbC1rbm93biBgU1lTVEVNX09SR19JRGAgKGFuIE9iamVjdElkKSBmb3Igc3lzdGVtLXdpZGUgb3BzIOKAlCBOT1QgdGhlIHN0cmluZ1xuICAgKiAgJ3N5c3RlbScsIHdoaWNoIGlkLWJhc2VkIHN5c3RlbS1vcmcgY2hlY2tzIHdvbid0IHJlY29nbml6ZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gKipQYXNzIHRoZSBMT1dFU1RcbiAgICogcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZSBjYWxscykgc28gYVxuICAgKiBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldCBvcmcuXG4gICAqIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGNsYWltLiBQcmVmZXIgdGhpcyArIGByb2xlOiAnbWVtYmVyJ2Agb3ZlciBhXG4gICAqIGhpZ2ggcm9sZSB3aGVuIGEgY2FsbCBuZWVkcyBPTkUgc3BlY2lmaWMgY2FwYWJpbGl0eSAoZS5nLiBgWydwbHVnaW5zOndyaXRlJ11gXG4gICAqIHRvIHB1c2ggYSBwbHVnaW4gaW1hZ2UpIOKAlCB0aGUgdG9rZW4gdGhlbiBzYXRpc2ZpZXMgdGhhdCBwZXJtaXNzaW9uIGdhdGVcbiAgICogV0lUSE9VVCBjYXJyeWluZyBgaXNBZG1pbmAsIHNvIGEgbGVha2VkIHRva2VuIGNhbid0IHBlcmZvcm0gYWRtaW4gYWN0aW9ucy5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xufVxuXG4vKipcbiAqIE1pbnQgYSBKV1QgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZS4gVXNlZCBmb3IgaW50ZXItc2VydmljZSBIVFRQIGNhbGxzLlxuICogVGhlIHRva2VuIHNhdGlzZmllcyBgcmVxdWlyZUF1dGhgIGFuZCAod2hlbiBvcmdJZCBpcyBwcmVzZW50KSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAuXG4gKiBTY29wZSBpdCB3aXRoIGBvcHRzLnJvbGVgIOKAlCBsZWFzdCBwcml2aWxlZ2Uga2VlcHMgYSBsZWFrZWQgdG9rZW4gbG93LXZhbHVlLlxuICpcbiAqIGBvcHRzLnNlcnZpY2VOYW1lYCBtdXN0IGJlIFRISVMgcHJvY2VzcydzIG93biBpZGVudGl0eSAoYFNFUlZJQ0VfTkFNRWApOiBhXG4gKiBzZXJ2aWNlIGhvbGRzIG9ubHkgaXRzIG93biBzaWduaW5nIGtleSwgc28gbWludGluZyBhIHRva2VuIHRoYXQgbmFtZXMgYW5vdGhlclxuICogc2VydmljZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIG9uZSBldmVyeSBwZWVyIHdvdWxkIHJlamVjdC4gVGhhdCBpcyB0aGVcbiAqIG9uZSBiZWhhdmlvdXIgY2hhbmdlICMxNCBmb3JjZXMgb24gY2FsbGVycyDigJQgc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9sZSA9IG9wdHMucm9sZTtcbiAgY29uc3QgcGF5bG9hZDogT21pdDxKd3RQYXlsb2FkLCAnc3ViJz4gPSB7XG4gICAgdXNlcm5hbWU6IGAke29wdHMuc2VydmljZU5hbWV9LXNlcnZpY2VgLFxuICAgIGVtYWlsOiBgJHtvcHRzLnNlcnZpY2VOYW1lfUBpbnRlcm5hbGAsXG4gICAgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnLFxuICAgIHRva2VuX3VzZTogJ2FjY2VzcycsXG4gICAgcm9sZSxcbiAgICBpc0FkbWluOiByb2xlID09PSAnb3duZXInIHx8IHJvbGUgPT09ICdhZG1pbicsXG4gICAgdHlwZTogJ2FjY2VzcycsXG4gICAgb3JnYW5pemF0aW9uSWQ6IG9wdHMub3JnSWQsXG4gICAgb3JnYW5pemF0aW9uTmFtZTogb3B0cy5vcmdOYW1lID8/IG9wdHMub3JnSWQsXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBjb3JyZWxhdGlvbiBoYW5kbGVcbiAgICAvLyBmb3IgdHJhY2luZyB3aGljaCBtaW50IHBlcmZvcm1lZCBhIGNyb3NzLXNlcnZpY2UgYWN0aW9uLCBhbmQgdGhlIGJ1aWxkaW5nXG4gICAgLy8gYmxvY2sgZm9yIHJlcGxheSBkZXRlY3Rpb24gKGEgdmVyaWZpZXIgY2FuIHRyYWNrIHNlZW4ganRpcykuIEl0IGRvZXMgTk9UXG4gICAgLy8gYnkgaXRzZWxmIHByZXZlbnQgcmVwbGF5IHdpdGhpbiB0aGUgVFRMIHdpbmRvdy5cbiAgICBqdGk6IHJhbmRvbVVVSUQoKSxcbiAgICAvLyBMZWFzdC1wcml2aWxlZ2UgY2FwYWJpbGl0eSBjbGFpbSAob3B0aW9uYWwpIOKAlCBsZXRzIGEgbWVtYmVyLXJvbGUgdG9rZW5cbiAgICAvLyBzYXRpc2Z5IGEgc3BlY2lmaWMgcGVybWlzc2lvbiBnYXRlIHdpdGhvdXQgY2FycnlpbmcgaXNBZG1pbi5cbiAgICAuLi4ob3B0cy5wZXJtaXNzaW9ucyAmJiBvcHRzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgPyB7IHBlcm1pc3Npb25zOiBvcHRzLnBlcm1pc3Npb25zIH0gOiB7fSksXG4gIH07XG4gIC8vIGBzdWJgLCBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoXG4gIC8vIHZlcmlmaWVzIGFyZSBzdGFtcGVkIGJ5IHRoZSBzaWduZXIsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHBsYWNlIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGF0IGEgc2VydmljZSB0b2tlbiBzYXlzLlxuICByZXR1cm4gc2lnblNlcnZpY2VKd3QocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgIGV4cGlyZXNJblNlY29uZHM6IG9wdHMudHRsU2Vjb25kcyA/PyBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMsXG4gICAgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCksXG4gIH0pO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYSBzZXJ2aWNlIHByaW5jaXBhbCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AsIG1pbnRlZCBieSBgc2lnblNlcnZpY2VUb2tlbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZSc7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCAoYHByaW5jaXBhbFR5cGU6XG4gKiAnc2VydmljZV9hY2NvdW50J2ApIOKAlCBhIG5vbi1odW1hbiBwcmluY2lwYWwgb3duZWQgYnkgb25lIG9yZywgYXV0aGVudGljYXRpbmdcbiAqIHdpdGggYSBgcGJfc2Ff4oCmYCBrZXkgZXhjaGFuZ2VkIGF0IHBsYXRmb3JtLlxuICpcbiAqIEEgc2VydmljZSBhY2NvdW50IGlzIE5PVCBhbiBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgaG9sZHMgb3JnIFJvbGVzIGFuZFxuICogaXMgc3ViamVjdCB0byBldmVyeSBwZXJtaXNzaW9uIGdhdGUgYSBtZW1iZXIgaXMuIFdoYXQgaXQgY2FuIG5ldmVyIGRvIGlzXG4gKiBzYXRpc2Z5IGEgSFVNQU4tcHJlc2VuY2UgcmVxdWlyZW1lbnQg4oCUIHN0ZXAtdXAgKGFuZCBhbnkgbGF0ZXIgYXNzdXJhbmNlIGdhdGUpXG4gKiByZWZ1c2VzIGl0IG91dHJpZ2h0LCBiZWNhdXNlIHRoZXJlIGlzIG5vIHBlcnNvbiBiZWhpbmQgaXQgdG8gcmUtdmVyaWZ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZV9hY2NvdW50Jztcbn1cblxuLyoqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIHRoZSBuYW1lZCBpbnRlcm5hbCBzZXJ2aWNlIChlLmcuIGAnYmlsbGluZydgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZChyZXE6IFJlcXVlc3QsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID09PSBzZXJ2aWNlTmFtZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIFVubGlrZSB7QGxpbmsgaXNTZXJ2aWNlUHJpbmNpcGFsfVxuICogKHdoaWNoIHJlYWRzIHRoZSBhbHJlYWR5LXBvcHVsYXRlZCBgcmVxLnVzZXJgKSwgdGhpcyB2ZXJpZmllcyB0aGUgYmVhcmVyIHRva2VuXG4gKiBpdHNlbGYsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBCRUZPUkUgYHJlcXVpcmVBdXRoYCBydW5zIOKAlCBlLmcuIHRoZSBnbG9iYWwgcmF0ZVxuICogbGltaXRlcidzIGBza2lwYCwgd2hpY2ggbXVzdCBub3QgdHJ1c3QgdGhlIHNwb29mYWJsZSBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICogaGVhZGVyLiBNaXJyb3JzIGByZXF1aXJlQXV0aGAncyBTRVJWSUNFIGNoYWluIGV4YWN0bHkgKHRoZSBzaWduZXIncyBvd24ga2V5LFxuICogcmVzb2x2ZWQgYnkgYGtpZGAsIHdpdGggdGhlIGBzdWJgL3NpZ25lciBhZ3JlZW1lbnQgY2hlY2sgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW5cbiAqIOKAlCBpbmNsdWRpbmcgYW55IHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB3aG9zZSBga2lkYCBpcyBub3QgaW4gdGhlIHNlcnZpY2VcbiAqIGJ1bmRsZSBhdCBhbGwuIFN0YXlzIFNZTkNIUk9OT1VTLCB3aGljaCBpcyB3aHkgdGhlIHBlci1zZXJ2aWNlIHB1YmxpYyBrZXlzIGFyZVxuICogZGlzdHJpYnV0ZWQgYXMgYSBtb3VudGVkIGJ1bmRsZSByYXRoZXIgdGhhbiBmZXRjaGVkIG92ZXIgSFRUUC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKTtcbiAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVyID0gZGVjb2RlSnd0SGVhZGVyKHBhcnRzWzFdKTtcbiAgICBpZiAoIWhlYWRlcj8ua2lkIHx8ICFpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWNvZGVkID0gdmVyaWZ5U2VydmljZUp3dDxKd3RQYXlsb2FkPihwYXJ0c1sxXSwgeyBraWQ6IGhlYWRlci5raWQsIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pO1xuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnIHx8IGRlY29kZWQucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQSBkZW55bGlzdGVkIChraWxsZWQpIHNlcnZpY2UgbXVzdCBOT1QgYmUgdHJlYXRlZCBhcyBhIHRydXN0ZWQgcHJpbmNpcGFsIOKAlFxuICAgIC8vIG90aGVyd2lzZSBpdCBrZWVwcyB0aGUgcmF0ZS1saW1pdGVyIGV4ZW1wdGlvbiBldmVuIHRob3VnaCByZXF1aXJlQXV0aCByZWplY3RzXG4gICAgLy8gaXQgb24gcmVhbCByb3V0ZXMuIEZvbGQgdGhlIGtpbGwtc3dpdGNoIGludG8gdGhlIHByZS1hdXRoIGNoZWNrIHRvby5cbiAgICByZXR1cm4gIWlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS10b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOztHQUVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JILE9BQU8sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQW1CLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELDhFQUE4RTtBQUM5RSw0QkFBNEI7QUFDNUIsRUFBRTtBQUNGLDRFQUE0RTtBQUM1RSxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCw2RUFBNkU7QUFDN0UsK0RBQStEO0FBQy9ELGtGQUFrRjtBQUNsRiw4Q0FBOEM7QUFDOUMsRUFBRTtBQUNGLHlFQUF5RTtBQUN6RSxpREFBaUQ7QUFDakQsOEVBQThFO0FBRTlFLE1BQU0saUNBQWlDLEdBQUcsR0FBRyxDQUFDO0FBRTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQ2xDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxFQUFFLENBQUM7S0FDdkMsS0FBSyxDQUFDLEdBQUcsQ0FBQztLQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFB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QUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU2VydmljZS10by1zZXJ2aWNlIHRva2VucyBhbmQgc2VydmljZS1wcmluY2lwYWwgY2hlY2tzLlxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLCBpc3N1ZXJBdWRpZW5jZU9wdGlvbnMgfSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuaW1wb3J0IHsgU0VSVklDRV9TVUJKRUNUX1BSRUZJWCwgaXNTZXJ2aWNlS2lkLCBzaWduU2VydmljZUp3dCwgdmVyaWZ5U2VydmljZUp3dCB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgeyB0eXBlIEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgdHlwZSBQZXJtaXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMvcGVybWlzc2lvbnMuanMnO1xuaW1wb3J0IHsgZGVjb2RlSnd0SGVhZGVyIH0gZnJvbSAnLi4vdXRpbHMvandrLmpzJztcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBFUzI1NiBKV1Qgc2lnbmVkIHdpdGggVEhJUyBzZXJ2aWNlJ3Ncbi8vIE9XTiBrZXkgKHNlZSBgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIGNhcnJ5aW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgXG4vLyBhbmQgbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UgdmlhIGBzdWI6ICdzZXJ2aWNlOjxuYW1lPidgLiBHYXRlcyBicmFuY2ggb25cbi8vIHRoZSBjbGFpbTsgdGhlIHN1YmplY3QgbmFtZXMg4oCUIGFuZCBzaW5jZSAjMTQgdGhlIG5hbWUgaXMgY3J5cHRvZ3JhcGhpY2FsbHlcbi8vIGJvdW5kIHRvIHRoZSBzaWduaW5nIGtleSwgc28gaXQgY2FuIGFsc28gYmUgdHJ1c3RlZC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCB0aGUgZG93bnN0cmVhbSBvcmcvcm9sZSBnYXRlc1xuLy8gKGByZXF1aXJlT3JnTWVtYmVyc2hpcGAgaW4gcGxhdGZvcm0ncyBjb250cm9sbGVyIGhlbHBlcnMsIGByZXF1aXJlU3lzdGVtQWRtaW5gKVxuLy8gcmVseSBvbiB0aGUgb3JnL3JvbGUgZW1iZWRkZWQgaW4gdGhlIHRva2VuLlxuLy9cbi8vIFRva2VucyBkZWZhdWx0IHRvIDUtbWludXRlIFRUTCDigJQgbG9uZyBlbm91Z2ggdG8gc3Vydml2ZSBhIGJhY2tlbmQgaG9wLFxuLy8gc2hvcnQgZW5vdWdoIHRoYXQgYSBsZWFrZWQgdG9rZW4gaXMgbG93LXZhbHVlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERFRkFVTFRfU0VSVklDRV9UT0tFTl9UVExfU0VDT05EUyA9IDMwMDtcblxuLyoqXG4gKiBEZW55bGlzdCBvZiBzZXJ2aWNlIE5BTUVTICh0aGUgYDxuYW1lPmAgaW4gYHN1Yjogc2VydmljZTo8bmFtZT5gKSB3aG9zZSB0b2tlbnNcbiAqIGByZXF1aXJlQXV0aGAgbXVzdCByZWplY3QuIFJlYWQgZnJvbSBgU0VSVklDRV9UT0tFTl9ERU5ZTElTVGAgKGNvbW1hLXNlcGFyYXRlZClcbiAqIGF0IHByb2Nlc3Mgc3RhcnQsIHNvIGFybWluZyBpdCBpcyBhIGNvbmZpZyBjaGFuZ2UgKyByb2xsb3V0IOKAlCBpdCBjdXRzIG9mZiBhXG4gKiBjb21wcm9taXNlZCBzZXJ2aWNlIFdJVEhPVVQgcm90YXRpbmcgYW55IGtleSwgYW5kIHdpdGhvdXQgaW52YWxpZGF0aW5nIGV2ZXJ5XG4gKiBvdGhlciBzZXJ2aWNlJ3MgdG9rZW5zIGFzIGNvbGxhdGVyYWwuXG4gKi9cbmNvbnN0IHNlcnZpY2VUb2tlbkRlbnlsaXN0ID0gbmV3IFNldChcbiAgKHByb2Nlc3MuZW52LlNFUlZJQ0VfVE9LRU5fREVOWUxJU1QgfHwgJycpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChzKSA9PiBzLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pLFxuKTtcblxuLyoqXG4gKiBUaGUgY2FsbGluZyBzZXJ2aWNlJ3MgbmFtZSBmb3IgYSBTRVJWSUNFIHByaW5jaXBhbCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2ApLFxuICogZWxzZSBgdW5kZWZpbmVkYC4gQSB1c2VyIHRva2VuIG5ldmVyIHlpZWxkcyBhIG5hbWUsIHdoYXRldmVyIGl0cyBgc3ViYCBzYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZU5hbWVPZihjbGFpbXM6IHsgcHJpbmNpcGFsVHlwZT86IHN0cmluZzsgc3ViPzogc3RyaW5nIH0gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoY2xhaW1zPy5wcmluY2lwYWxUeXBlICE9PSAnc2VydmljZScgfHwgdHlwZW9mIGNsYWltcy5zdWIgIT09ICdzdHJpbmcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoIWNsYWltcy5zdWIuc3RhcnRzV2l0aChTRVJWSUNFX1NVQkpFQ1RfUFJFRklYKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNsYWltcy5zdWIuc2xpY2UoU0VSVklDRV9TVUJKRUNUX1BSRUZJWC5sZW5ndGgpIHx8IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRydWUgd2hlbiB0aGUgY2xhaW1zIGFyZSBhIHNlcnZpY2UgcHJpbmNpcGFsIHdob3NlIHNlcnZpY2UgaXMgb24gdGhlIGRlbnlsaXN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVRva2VuRGVuaWVkKGNsYWltczogeyBwcmluY2lwYWxUeXBlPzogc3RyaW5nOyBzdWI/OiBzdHJpbmcgfSk6IGJvb2xlYW4ge1xuICBpZiAoc2VydmljZVRva2VuRGVueWxpc3Quc2l6ZSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBuYW1lID0gc2VydmljZU5hbWVPZihjbGFpbXMpO1xuICByZXR1cm4gbmFtZSAhPT0gdW5kZWZpbmVkICYmIHNlcnZpY2VUb2tlbkRlbnlsaXN0LmhhcyhuYW1lKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlVG9rZW5PcHRpb25zIHtcbiAgLyoqIENhbGxpbmcgc2VydmljZSBpZGVudGlmaWVyIChlLmcuICdiaWxsaW5nJywgJ3BsYXRmb3JtJykuIEVtYmVkZGVkIGFzIGBzdWI6IHNlcnZpY2U6PG5hbWU+YC4gKi9cbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgY29udGV4dCBmb3IgdGhlIGNhbGwuIFVzZSB0aGUgdGFyZ2V0IHRlbmFudCdzIG9yZyBpZCwgb3IgdGhlXG4gICAqICB3ZWxsLWtub3duIGBTWVNURU1fT1JHX0lEYCAoYW4gT2JqZWN0SWQpIGZvciBzeXN0ZW0td2lkZSBvcHMg4oCUIE5PVCB0aGUgc3RyaW5nXG4gICAqICAnc3lzdGVtJywgd2hpY2ggaWQtYmFzZWQgc3lzdGVtLW9yZyBjaGVja3Mgd29uJ3QgcmVjb2duaXplLiAqL1xuICBvcmdJZD86IHN0cmluZztcbiAgLyoqIEFjdGl2ZSBvcmcgbmFtZS4gRGVmYXVsdHMgdG8gb3JnSWQuICovXG4gIG9yZ05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUVEwgaW4gc2Vjb25kcyAoZGVmYXVsdCAzMDApLiAqL1xuICB0dGxTZWNvbmRzPzogbnVtYmVyO1xuICAvKipcbiAgICogUm9sZSB0aGUgdG9rZW4gY2FycmllcyAocmVxdWlyZWQg4oCUIG5vIGltcGxpY2l0IGRlZmF1bHQpLiAqKlBhc3MgdGhlIExPV0VTVFxuICAgKiByb2xlIHRoZSBjYWxsIGFjdHVhbGx5IG5lZWRzKiogKGAnbWVtYmVyJ2AgZm9yIHJlYWQgLyBkYXRhLXBsYW5lIGNhbGxzKSBzbyBhXG4gICAqIGxlYWtlZCBzZXJ2aWNlIHRva2VuIGNhbid0IHBlcmZvcm0gYWRtaW4gYWN0aW9ucyBpbiB0aGUgdGFyZ2V0IG9yZy5cbiAgICogYGlzQWRtaW5gIGlzIGRlcml2ZWQgZnJvbSB0aGlzIChhZG1pbnxvd25lciDihpIgdHJ1ZSkuXG4gICAqL1xuICByb2xlOiAnb3duZXInIHwgJ2FkbWluJyB8ICdtZW1iZXInO1xuICAvKipcbiAgICogT3B0aW9uYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gY2xhaW0uIFByZWZlciB0aGlzICsgYHJvbGU6ICdtZW1iZXInYCBvdmVyIGFcbiAgICogaGlnaCByb2xlIHdoZW4gYSBjYWxsIG5lZWRzIE9ORSBzcGVjaWZpYyBjYXBhYmlsaXR5IChlLmcuIGBbJ3BsdWdpbnM6d3JpdGUnXWBcbiAgICogdG8gcHVzaCBhIHBsdWdpbiBpbWFnZSkg4oCUIHRoZSB0b2tlbiB0aGVuIHNhdGlzZmllcyB0aGF0IHBlcm1pc3Npb24gZ2F0ZVxuICAgKiBXSVRIT1VUIGNhcnJ5aW5nIGBpc0FkbWluYCwgc28gYSBsZWFrZWQgdG9rZW4gY2FuJ3QgcGVyZm9ybSBhZG1pbiBhY3Rpb25zLlxuICAgKi9cbiAgcGVybWlzc2lvbnM/OiBQZXJtaXNzaW9uW107XG4gIC8qKlxuICAgKiBTaWduZWQgY2xhaW0gKGBhdWRpdENyb3NzT3JnOiB0cnVlYCkgbGV0dGluZyBhbiBgL2F1ZGl0L2V2ZW50c2AgZGVsaXZlcnkgbmFtZVxuICAgKiBhbiBgYWZmZWN0ZWRPcmdJZGAgb3V0c2lkZSB0aGUgdG9rZW4ncyBvcmcuIFNldCBPTkxZIGJ5IHRoZSByZW1vdGUtYXVkaXRcbiAgICogY2xpZW50LCBhbmQgb25seSB3aGVuIHRoZSBldmVudCdzIHZlcmlmaWVkIGluYm91bmQgcHJpbmNpcGFsIHdhcyBhXG4gICAqIHN1cGVyYWRtaW4gb3IgYSBzeXN0ZW0tb3JnIG1lbWJlciDigJQgbmV2ZXIgZnJvbSBjYWxsLXNpdGUgaW5wdXQuIE1lYW5zXG4gICAqIG5vdGhpbmcgdG8gYW55IG90aGVyIHJvdXRlLlxuICAgKi9cbiAgYXVkaXRDcm9zc09yZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogTWludCBhIEpXVCBpZGVudGlmeWluZyB0aGUgY2FsbGluZyBzZXJ2aWNlLiBVc2VkIGZvciBpbnRlci1zZXJ2aWNlIEhUVFAgY2FsbHMuXG4gKiBUaGUgdG9rZW4gc2F0aXNmaWVzIGByZXF1aXJlQXV0aGAgYW5kICh3aGVuIG9yZ0lkIGlzIHByZXNlbnQpIGByZXF1aXJlT3JnYW5pemF0aW9uYC5cbiAqIFNjb3BlIGl0IHdpdGggYG9wdHMucm9sZWAg4oCUIGxlYXN0IHByaXZpbGVnZSBrZWVwcyBhIGxlYWtlZCB0b2tlbiBsb3ctdmFsdWUuXG4gKlxuICogYG9wdHMuc2VydmljZU5hbWVgIG11c3QgYmUgVEhJUyBwcm9jZXNzJ3Mgb3duIGlkZW50aXR5IChgU0VSVklDRV9OQU1FYCk6IGFcbiAqIHNlcnZpY2UgaG9sZHMgb25seSBpdHMgb3duIHNpZ25pbmcga2V5LCBzbyBtaW50aW5nIGEgdG9rZW4gdGhhdCBuYW1lcyBhbm90aGVyXG4gKiBzZXJ2aWNlIHRocm93cyByYXRoZXIgdGhhbiBwcm9kdWNpbmcgb25lIGV2ZXJ5IHBlZXIgd291bGQgcmVqZWN0LiBUaGF0IGlzIHRoZVxuICogb25lIGJlaGF2aW91ciBjaGFuZ2UgIzE0IGZvcmNlcyBvbiBjYWxsZXJzIOKAlCBzZWUgYHNlcnZpY2VzL3NlcnZpY2Uta2V5cy50c2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWduU2VydmljZVRva2VuKG9wdHM6IFNlcnZpY2VUb2tlbk9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCByb2xlID0gb3B0cy5yb2xlO1xuICBjb25zdCBwYXlsb2FkOiBPbWl0PEp3dFBheWxvYWQsICdzdWInPiA9IHtcbiAgICB1c2VybmFtZTogYCR7b3B0cy5zZXJ2aWNlTmFtZX0tc2VydmljZWAsXG4gICAgZW1haWw6IGAke29wdHMuc2VydmljZU5hbWV9QGludGVybmFsYCxcbiAgICBwcmluY2lwYWxUeXBlOiAnc2VydmljZScsXG4gICAgdG9rZW5fdXNlOiAnYWNjZXNzJyxcbiAgICByb2xlLFxuICAgIGlzQWRtaW46IHJvbGUgPT09ICdvd25lcicgfHwgcm9sZSA9PT0gJ2FkbWluJyxcbiAgICB0eXBlOiAnYWNjZXNzJyxcbiAgICBvcmdhbml6YXRpb25JZDogb3B0cy5vcmdJZCxcbiAgICBvcmdhbml6YXRpb25OYW1lOiBvcHRzLm9yZ05hbWUgPz8gb3B0cy5vcmdJZCxcbiAgICAvLyBVbmlxdWUgdG9rZW4gaWQgb24gZXZlcnkgbWludC4gQ29tYmluZWQgd2l0aCB0aGUgc2hvcnQgKDMwMHMgZGVmYXVsdCkgVFRMXG4gICAgLy8gdGhpcyBnaXZlcyBlYWNoIHNlcnZpY2UgdG9rZW4gYSBkaXN0aW5jdCBpZGVudGl0eSDigJQgdGhlIGNvcnJlbGF0aW9uIGhhbmRsZVxuICAgIC8vIGZvciB0cmFjaW5nIHdoaWNoIG1pbnQgcGVyZm9ybWVkIGEgY3Jvc3Mtc2VydmljZSBhY3Rpb24sIGFuZCB0aGUgYnVpbGRpbmdcbiAgICAvLyBibG9jayBmb3IgcmVwbGF5IGRldGVjdGlvbiAoYSB2ZXJpZmllciBjYW4gdHJhY2sgc2VlbiBqdGlzKS4gSXQgZG9lcyBOT1RcbiAgICAvLyBieSBpdHNlbGYgcHJldmVudCByZXBsYXkgd2l0aGluIHRoZSBUVEwgd2luZG93LlxuICAgIGp0aTogcmFuZG9tVVVJRCgpLFxuICAgIC8vIExlYXN0LXByaXZpbGVnZSBjYXBhYmlsaXR5IGNsYWltIChvcHRpb25hbCkg4oCUIGxldHMgYSBtZW1iZXItcm9sZSB0b2tlblxuICAgIC8vIHNhdGlzZnkgYSBzcGVjaWZpYyBwZXJtaXNzaW9uIGdhdGUgd2l0aG91dCBjYXJyeWluZyBpc0FkbWluLlxuICAgIC4uLihvcHRzLnBlcm1pc3Npb25zICYmIG9wdHMucGVybWlzc2lvbnMubGVuZ3RoID4gMCA/IHsgcGVybWlzc2lvbnM6IG9wdHMucGVybWlzc2lvbnMgfSA6IHt9KSxcbiAgICAuLi4ob3B0cy5hdWRpdENyb3NzT3JnID8geyBhdWRpdENyb3NzT3JnOiB0cnVlIGFzIGNvbnN0IH0gOiB7fSksXG4gIH07XG4gIC8vIGBzdWJgLCBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoXG4gIC8vIHZlcmlmaWVzIGFyZSBzdGFtcGVkIGJ5IHRoZSBzaWduZXIsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHBsYWNlIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGF0IGEgc2VydmljZSB0b2tlbiBzYXlzLlxuICByZXR1cm4gc2lnblNlcnZpY2VKd3QocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgIGV4cGlyZXNJblNlY29uZHM6IG9wdHMudHRsU2Vjb25kcyA/PyBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMsXG4gICAgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCksXG4gIH0pO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYSBzZXJ2aWNlIHByaW5jaXBhbCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AsIG1pbnRlZCBieSBgc2lnblNlcnZpY2VUb2tlbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZSc7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCAoYHByaW5jaXBhbFR5cGU6XG4gKiAnc2VydmljZV9hY2NvdW50J2ApIOKAlCBhIG5vbi1odW1hbiBwcmluY2lwYWwgb3duZWQgYnkgb25lIG9yZywgYXV0aGVudGljYXRpbmdcbiAqIHdpdGggYSBgcGJfc2Ff4oCmYCBrZXkgZXhjaGFuZ2VkIGF0IHBsYXRmb3JtLlxuICpcbiAqIEEgc2VydmljZSBhY2NvdW50IGlzIE5PVCBhbiBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgaG9sZHMgb3JnIFJvbGVzIGFuZFxuICogaXMgc3ViamVjdCB0byBldmVyeSBwZXJtaXNzaW9uIGdhdGUgYSBtZW1iZXIgaXMuIFdoYXQgaXQgY2FuIG5ldmVyIGRvIGlzXG4gKiBzYXRpc2Z5IGEgSFVNQU4tcHJlc2VuY2UgcmVxdWlyZW1lbnQg4oCUIHN0ZXAtdXAgKGFuZCBhbnkgbGF0ZXIgYXNzdXJhbmNlIGdhdGUpXG4gKiByZWZ1c2VzIGl0IG91dHJpZ2h0LCBiZWNhdXNlIHRoZXJlIGlzIG5vIHBlcnNvbiBiZWhpbmQgaXQgdG8gcmUtdmVyaWZ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZV9hY2NvdW50Jztcbn1cblxuLyoqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIHRoZSBuYW1lZCBpbnRlcm5hbCBzZXJ2aWNlIChlLmcuIGAnYmlsbGluZydgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZChyZXE6IFJlcXVlc3QsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID09PSBzZXJ2aWNlTmFtZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIFVubGlrZSB7QGxpbmsgaXNTZXJ2aWNlUHJpbmNpcGFsfVxuICogKHdoaWNoIHJlYWRzIHRoZSBhbHJlYWR5LXBvcHVsYXRlZCBgcmVxLnVzZXJgKSwgdGhpcyB2ZXJpZmllcyB0aGUgYmVhcmVyIHRva2VuXG4gKiBpdHNlbGYsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBCRUZPUkUgYHJlcXVpcmVBdXRoYCBydW5zIOKAlCBlLmcuIHRoZSBnbG9iYWwgcmF0ZVxuICogbGltaXRlcidzIGBza2lwYCwgd2hpY2ggbXVzdCBub3QgdHJ1c3QgdGhlIHNwb29mYWJsZSBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICogaGVhZGVyLiBNaXJyb3JzIGByZXF1aXJlQXV0aGAncyBTRVJWSUNFIGNoYWluIGV4YWN0bHkgKHRoZSBzaWduZXIncyBvd24ga2V5LFxuICogcmVzb2x2ZWQgYnkgYGtpZGAsIHdpdGggdGhlIGBzdWJgL3NpZ25lciBhZ3JlZW1lbnQgY2hlY2sgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW5cbiAqIOKAlCBpbmNsdWRpbmcgYW55IHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB3aG9zZSBga2lkYCBpcyBub3QgaW4gdGhlIHNlcnZpY2VcbiAqIGJ1bmRsZSBhdCBhbGwuIFN0YXlzIFNZTkNIUk9OT1VTLCB3aGljaCBpcyB3aHkgdGhlIHBlci1zZXJ2aWNlIHB1YmxpYyBrZXlzIGFyZVxuICogZGlzdHJpYnV0ZWQgYXMgYSBtb3VudGVkIGJ1bmRsZSByYXRoZXIgdGhhbiBmZXRjaGVkIG92ZXIgSFRUUC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKTtcbiAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVyID0gZGVjb2RlSnd0SGVhZGVyKHBhcnRzWzFdKTtcbiAgICBpZiAoIWhlYWRlcj8ua2lkIHx8ICFpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWNvZGVkID0gdmVyaWZ5U2VydmljZUp3dDxKd3RQYXlsb2FkPihwYXJ0c1sxXSwgeyBraWQ6IGhlYWRlci5raWQsIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pO1xuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnIHx8IGRlY29kZWQucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQSBkZW55bGlzdGVkIChraWxsZWQpIHNlcnZpY2UgbXVzdCBOT1QgYmUgdHJlYXRlZCBhcyBhIHRydXN0ZWQgcHJpbmNpcGFsIOKAlFxuICAgIC8vIG90aGVyd2lzZSBpdCBrZWVwcyB0aGUgcmF0ZS1saW1pdGVyIGV4ZW1wdGlvbiBldmVuIHRob3VnaCByZXF1aXJlQXV0aCByZWplY3RzXG4gICAgLy8gaXQgb24gcmVhbCByb3V0ZXMuIEZvbGQgdGhlIGtpbGwtc3dpdGNoIGludG8gdGhlIHByZS1hdXRoIGNoZWNrIHRvby5cbiAgICByZXR1cm4gIWlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { verifyUserJwt } from './jwt-verify.js';
4
+ import { recordAuthzDenial } from './permission-gates.js';
4
5
  import { tagRouteGate } from './route-table.js';
5
6
  import { isServiceAccountPrincipal, isServicePrincipal } from './service-tokens.js';
6
7
  import { createEnvRedisClient, createRedisReadyGate } from '../services/env-redis.js';
@@ -142,6 +143,7 @@ async function _requireStepUp(options, req, res, next) {
142
143
  // so "a machine credential never satisfies an assurance requirement" is a
143
144
  // property of this gate, not a side effect of how step-up tokens are minted.
144
145
  if (isServiceAccountPrincipal(req)) {
146
+ recordAuthzDenial(req, 'step-up (STEP_UP_NOT_AVAILABLE: service account)');
145
147
  sendError(res, 403, 'A service account cannot perform this action — it requires a person to re-verify', 'STEP_UP_NOT_AVAILABLE');
146
148
  return;
147
149
  }
@@ -160,10 +162,16 @@ async function _requireStepUp(options, req, res, next) {
160
162
  payload = await verifyStepUpToken(token);
161
163
  }
162
164
  catch {
165
+ // A presented-but-unverifiable token (forged, expired, wrong key) is on the
166
+ // trail; a MISSING one (STEP_UP_REQUIRED above) is the UI's normal first
167
+ // attempt and is not.
168
+ recordAuthzDenial(req, 'step-up (STEP_UP_INVALID)');
163
169
  sendError(res, 401, 'Step-up token invalid or expired', 'STEP_UP_INVALID');
164
170
  return;
165
171
  }
166
172
  if (payload.sub !== callerSub) {
173
+ // Someone else's step-up token replayed on this session — never a UI bug.
174
+ recordAuthzDenial(req, 'step-up (STEP_UP_MISMATCH)');
167
175
  sendError(res, 401, 'Step-up token does not match session', 'STEP_UP_MISMATCH');
168
176
  return;
169
177
  }
@@ -171,11 +179,13 @@ async function _requireStepUp(options, req, res, next) {
171
179
  // earned by the wrong factor can still be spent on a route that accepts it —
172
180
  // burning it here would make the refusal destructive as well as confusing.
173
181
  if (options.methods && !(payload.method && options.methods.includes(payload.method))) {
182
+ recordAuthzDenial(req, `step-up (STEP_UP_METHOD_REQUIRED: ${options.methods.join(' or ')}, got ${payload.method ?? 'none'})`);
174
183
  sendError(res, 401, 'This action must be confirmed with a passkey or an authenticator code', 'STEP_UP_METHOD_REQUIRED', { methods: [...options.methods] });
175
184
  return;
176
185
  }
177
186
  try {
178
187
  if (!(await consumeStepUpJti(payload.jti, payload.exp))) {
188
+ recordAuthzDenial(req, 'step-up (STEP_UP_REPLAY)');
179
189
  sendError(res, 401, 'Step-up token already used or expired', 'STEP_UP_REPLAY');
180
190
  return;
181
191
  }
@@ -187,4 +197,4 @@ async function _requireStepUp(options, req, res, next) {
187
197
  }
188
198
  next();
189
199
  }
190
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC11cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3N0ZXAtdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXFCdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sMEJBQTBCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDO0FBU2pDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBcUJwRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFxQixLQUFLLENBQUMsQ0FBQztJQUUvRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDM0MsQ0FB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QUFDO1FBQ2hGLE9BQU87SUFDVCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLDZFQUE2RTtJQUM3RSwyRUFBMkU7SUFDM0UsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckYsU0FBUyxDQUNQLEdBQUcsRUFBRSxHQUFHLEVBQ1IsdUVBQXVFLEVBQ3ZFLHlCQUF5QixFQUN6QixFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQ2xDLENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLHVDQUF1QyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDL0UsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRSxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSw2QkFBNkIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RFLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogYHJlcXVpcmVTdGVwVXBgIOKAlCBhIHNoYXJlZCBzdGVwLXVwIChyZWNlbnQtcGFzc3dvcmQtcmV2ZXJpZnkpIGdhdGUgZm9yIHRoZVxuICogc3RhdGVsZXNzIGFwaSBzZXJ2aWNlcywgbWlycm9yaW5nIHRoZSBwbGF0Zm9ybSBtaWRkbGV3YXJlIG9mIHRoZSBzYW1lIG5hbWUuXG4gKlxuICogRmxvdzogdGhlIFVJIGhpdHMgYFBPU1QgL2FwaS9hdXRoL3N0ZXAtdXBgIChwbGF0Zm9ybSkgdG8gcmUtdmVyaWZ5IHRoZSB1c2VyO1xuICogcGxhdGZvcm0gbWludHMgYSBzaG9ydC1saXZlZCAoNjBzKSBgc3RlcC11cGAgSldUIHdpdGggdGhlIFNBTUUgRVMyNTYgc2lnbmluZ1xuICoga2V5IGl0IG1pbnRzIGFjY2VzcyB0b2tlbnMgd2l0aCwgc28gdGhlc2Ugc2VydmljZXMgdmVyaWZ5IGl0IHRocm91Z2ggdGhlIHNhbWVcbiAqIEpXS1MuIFRoZSBVSVxuICogcmVwbGF5cyBpdCBhcyB0aGUgYFgtU3RlcC1VcC1Ub2tlbmAgaGVhZGVyIG9uIHRoZSBkZXN0cnVjdGl2ZS9zZW5zaXRpdmUgY2FsbDtcbiAqIHRoaXMgbWlkZGxld2FyZSB2ZXJpZmllcyBpdCwgYmluZHMgaXQgdG8gdGhlIGNhbGxlciAoYHN1YmAgbWF0Y2gpLCBhbmRcbiAqIGNvbnN1bWVzIGl0cyBganRpYCBvbmNlIChSZWRpcy1iYWNrZWQgY3Jvc3MtaW5zdGFuY2Ugd2hlbiBjb25maWd1cmVkLCBlbHNlIGFcbiAqIGJvdW5kZWQgcHJvY2Vzcy1sb2NhbCBzZXQpIHNvIGEgcmVwbGF5IGluc2lkZSB0aGUgVFRMIGlzIHJlamVjdGVkLlxuICpcbiAqIFdIWSBoZXJlOiByZXN0b3JlIGVuZHBvaW50cyBvbiB0aGUgYXBpIHNlcnZpY2VzIChwaXBlbGluZS9wbHVnaW4vLi4uKSBhcmVcbiAqIHN0ZXAtdXAtZ2F0ZWQsIHNvIHRoZSB2ZXJpZnkgKyBzaW5nbGUtdXNlIGp0aSBsaXZlIGluIGFwaS1jb3JlIHdoZXJlIGFueVxuICogc2VydmljZSBjYW4gcmVxdWlyZSB0aGVtLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgdmVyaWZ5VXNlckp3dCB9IGZyb20gJy4vand0LXZlcmlmeS5qcyc7XG5pbXBvcnQgeyB0YWdSb3V0ZUdhdGUgfSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbmltcG9ydCB7IGlzU2VydmljZUFjY291bnRQcmluY2lwYWwsIGlzU2VydmljZVByaW5jaXBhbCB9IGZyb20gJy4vc2VydmljZS10b2tlbnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlRW52UmVkaXNDbGllbnQsIGNyZWF0ZVJlZGlzUmVhZHlHYXRlLCB0eXBlIFJlYWR5QXdhcmVSZWRpcyB9IGZyb20gJy4uL3NlcnZpY2VzL2Vudi1yZWRpcy5qcyc7XG5pbXBvcnQgeyBnZXRIZWFkZXJTdHJpbmcgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignc3RlcC11cCcpO1xuY29uc3QgSEVBREVSID0gJ3gtc3RlcC11cC10b2tlbic7XG5cbi8qKlxuICogSG93IGEgc3RlcC11cCB0b2tlbiB3YXMgZWFybmVkLiBNaXJyb3JzIHBsYXRmb3JtJ3MgYFN0ZXBVcE1ldGhvZGA7IGtlcHQgaGVyZVxuICogYXMgaXRzIG93biB1bmlvbiBzbyBhIHZlcmlmaWVyIGNhbiBuYW1lIHRoZSBmYWN0b3JzIGl0IGFjY2VwdHMgd2l0aG91dFxuICogaW1wb3J0aW5nIHBsYXRmb3JtLlxuICovXG5leHBvcnQgdHlwZSBTdGVwVXBNZXRob2QgPSAncGFzc3dvcmQnIHwgJ3dlYmF1dGhuJyB8ICd0b3RwJyB8ICdyZWF1dGgnO1xuXG4vKipcbiAqIFRoZSBmYWN0b3JzIHRoYXQgY291bnQgYXMgYSBTRUNPTkQgRkFDVE9SLCBmb3Igcm91dGVzIHRoYXQgbWF5IG9ubHkgYmVcbiAqIHVubG9ja2VkIGJ5IG9uZSAoIzg6IGltcGVyc29uYXRpb24sIEtNUywgSWRQIHNldHRpbmdzLCBwbGF0Zm9ybSBhZG1pbikuXG4gKlxuICogQSBwYXNzd29yZCBvciBhIHByb3ZpZGVyIHJlLWF1dGggcHJvdmVzIHRoZSBzYW1lIHNpbmdsZSBmYWN0b3IgdGhlIHNlc3Npb24gd2FzXG4gKiBhbHJlYWR5IG9wZW5lZCB3aXRoLCBzbyBvbiB0aG9zZSByb3V0ZXMgdGhleSBhcmUgbm90IGVub3VnaDogdGhlIHBvaW50IGlzIHRoYXRcbiAqIHNvbWVvbmUgaG9sZGluZyBvbmx5IGEgc3RvbGVuIHNlc3Npb24g4oCUIG9yIG9ubHkgYSBzdG9sZW4gcGFzc3dvcmQg4oCUIGNhbm5vdFxuICogcHJvY2VlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUk9OR19TVEVQX1VQX01FVEhPRFM6IHJlYWRvbmx5IFN0ZXBVcE1ldGhvZFtdID0gWyd3ZWJhdXRobicsICd0b3RwJ107XG5cbi8qKiBQYXlsb2FkIG9mIGEgcGxhdGZvcm0taXNzdWVkIHN0ZXAtdXAgdG9rZW4gKHNlZSBwbGF0Zm9ybSBpc3N1ZVN0ZXBVcFRva2VuKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcFVwVG9rZW5QYXlsb2FkIHtcbiAgdHlwZTogJ3N0ZXAtdXAnO1xuICBzdWI6IHN0cmluZztcbiAganRpOiBzdHJpbmc7XG4gIC8qKiBXaGljaCBmYWN0b3IgZWFybmVkIGl0LiBBYnNlbnQgb25seSBvbiBhIHRva2VuIG1pbnRlZCBiZWZvcmUgdGhlIGNsYWltXG4gICAqICBleGlzdGVkLCB3aGljaCBhIG1ldGhvZC1yZXN0cmljdGVkIGdhdGUgdHJlYXRzIGFzIFwibm90IHByb3ZlblwiLiAqL1xuICBtZXRob2Q/OiBTdGVwVXBNZXRob2Q7XG4gIGlhdDogbnVtYmVyO1xuICBleHA6IG51bWJlcjtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayByZXF1aXJlU3RlcFVwfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZVN0ZXBVcE9wdGlvbnMge1xuICAvKiogUmVzdHJpY3Qgd2hpY2ggZmFjdG9ycyBtYXkgZWFybiB0aGUgc3RlcC11cCAoZS5nLiB7QGxpbmsgU1RST05HX1NURVBfVVBfTUVUSE9EU30pLlxuICAgKiAgT21pdHRlZCBtZWFucyBhbnkgZmFjdG9yIHRoZSBwbGF0Zm9ybSB3aWxsIGlzc3VlIGEgdG9rZW4gZm9yLiAqL1xuICBtZXRob2RzPzogcmVhZG9ubHkgU3RlcFVwTWV0aG9kW107XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgc3RlcC11cCB0b2tlbjogYSB2YWxpZCBFUzI1NiBzaWduYXR1cmUgZnJvbSBvbmUgb2YgcGxhdGZvcm0nc1xuICogcHVibGlzaGVkIHNpZ25pbmcga2V5cywgaXNzdWVyIGFuZCBhdWRpZW5jZSB3aGVuIGNvbmZpZ3VyZWQsIEFORCB0aGVcbiAqIGB0eXBlOiAnc3RlcC11cCdgICsgYGp0aWAgY2xhaW1zIOKAlCBhIHBsYWluIGFjY2VzcyB0b2tlbiBpcyBzaWduZWQgYnkgdGhlIHNhbWVcbiAqIGtleSBhbmQgY2FycmllcyB0aGUgc2FtZSBgc3ViYCwgc28gd2l0aG91dCBhc3NlcnRpbmcgdGhlIHN0ZXAtdXAgc2hhcGUgaXRcbiAqIHdvdWxkIGJ5cGFzcyB0aGUgZ2F0ZS4gVGhyb3dzIG9uIGFueSBmYWlsdXJlIChhbiB1bmZldGNoYWJsZSBrZXkgc2V0IGluY2x1ZGVkOlxuICogYW4gdW52ZXJpZmlhYmxlIHRva2VuIGlzIG5vdCBhIHN0ZXAtdXApLiBEb2VzIE5PVCBiaW5kIHRvIGEgY2FsbGVyIOKAlFxuICogYHJlcXVpcmVTdGVwVXBgIGRvZXMgdGhlIGBzdWJgIG1hdGNoIGFuZCBzaW5nbGUtdXNlIGNvbnN1bWUuXG4gKlxuICogRGVsZWdhdGVzIHRvIGByZXF1aXJlQXV0aGAncyBvd24gcHJpbWl0aXZlIChgdmVyaWZ5VXNlckp3dGApIHJhdGhlciB0aGFuXG4gKiByZS1pbXBsZW1lbnRpbmcgaXQuIFRoZSBoYW5kLXJvbGxlZCBjb3B5IHRoaXMgcmVwbGFjZWQgZHJvcHBlZCBUV08gb2YgaXRzXG4gKiBndWFyZHM6IGl0IG5ldmVyIHBpbm5lZCBpc3N1ZXIvYXVkaWVuY2UsIGFuZCBpdHMgcHJldmlvdXMtc2VjcmV0IHJldHJ5IGhhZCBub1xuICogZXhwaXJ5L25vdC1iZWZvcmUgY2FydmUtb3V0LCBzbyBhbiBFWFBJUkVEIHRva2VuIHN1cmZhY2VkIGFzIGEgc2lnbmF0dXJlIGVycm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RlcFVwVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8U3RlcFVwVG9rZW5QYXlsb2FkPiB7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCB2ZXJpZnlVc2VySnd0PFN0ZXBVcFRva2VuUGF5bG9hZD4odG9rZW4pO1xuXG4gIGlmIChwYXlsb2FkLnR5cGUgIT09ICdzdGVwLXVwJyB8fCAhcGF5bG9hZC5qdGkgfHwgIXBheWxvYWQuc3ViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJTlZBTElEX1NURVBfVVBfVE9LRU4nKTtcbiAgfVxuICByZXR1cm4gcGF5bG9hZDtcbn1cblxuLy8gLS0gU2luZ2xlLXVzZSBqdGkgc3RvcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZGlzIFNFVCBOWCBFWCB3aGVuIFJlZGlzIGlzIGNvbmZpZ3VyZWQgKGNyb3NzLWluc3RhbmNlIHNpbmdsZS11c2UpOyBlbHNlIGFcbi8vIGJvdW5kZWQgcHJvY2Vzcy1sb2NhbCBtYXAgd2l0aCBUVEwgc3dlZXAgKHBlci1wcm9jZXNzKS4gQSBzdGVwLXVwIHRva2VuIGlzXG4vLyA2MHMtbGl2ZWQuIFdoZW4gUmVkaXMgSVMgY29uZmlndXJlZCBpdCdzIHRoZSBhdXRob3JpdGF0aXZlIHN0b3JlOiBhIFJlZGlzXG4vLyBlcnJvciBGQUlMUyBDTE9TRUQgKHRocm93cyDihpIgU1RFUF9VUF9JTlZBTElELCB1c2VyIHJlLXZlcmlmaWVzKSByYXRoZXIgdGhhblxuLy8gZGVncmFkaW5nIHRvIHRoZSBwZXItaW5zdGFuY2UgbWVtIGd1YXJkLCB3aGljaCB3b3VsZCBhY2NlcHQgYSBjcm9zcy1pbnN0YW5jZVxuLy8gcmVwbGF5IGR1cmluZyB0aGUgb3V0YWdlLiBUaGUgbWVtIGd1YXJkIGlzIHVzZWQgT05MWSB3aGVuIFJlZGlzIGlzIGFic2VudC5cblxudHlwZSBKdGlSZWRpcyA9IFJlYWR5QXdhcmVSZWRpcyAmIHsgc2V0OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+IH07XG5sZXQgX3JlZGlzOiBKdGlSZWRpcyB8IG51bGwgfCB1bmRlZmluZWQ7XG5sZXQgX3JlZGlzUmVhZHk6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcbi8qKlxuICogVGhlIGp0aSBjbGllbnQsIGJ1aWx0IGxhemlseS4gVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWUsIHNvIGEgU0VUIG9uXG4gKiBhIGNvbm5lY3Rpb24gdGhhdCBpc24ndCB1cCB5ZXQgaXMgcmVqZWN0ZWQg4oCUIHRoZSBGSVJTVCBzdGVwLXVwIG9uIGV2ZXJ5IHBvZFxuICogd291bGQgZmFpbC4gV2FpdCAoYm91bmRlZCwgbmV2ZXIgcmVqZWN0aW5nKSBmb3IgcmVhZGluZXNzIGJlZm9yZVxuICogaGFuZGluZyBpdCBvdXQ7IGEgZ2VudWluZWx5IGRvd24gUmVkaXMgc3RpbGwgZmFpbHMgY2xvc2VkIG9uIHRoZSBTRVQgYmVsb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlZGlzKCk6IFByb21pc2U8SnRpUmVkaXMgfCBudWxsPiB7XG4gIGlmIChfcmVkaXMgPT09IHVuZGVmaW5lZCkge1xuICAgIF9yZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PEp0aVJlZGlzPignc3RlcC11cC1qdGknKTtcbiAgICBfcmVkaXNSZWFkeSA9IF9yZWRpcyA/IGNyZWF0ZVJlZGlzUmVhZHlHYXRlKF9yZWRpcykgOiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKF9yZWRpc1JlYWR5KSBhd2FpdCBfcmVkaXNSZWFkeSgpO1xuICByZXR1cm4gX3JlZGlzO1xufVxuXG5jb25zdCBtZW1KdGkgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpOyAvLyBqdGkgLT4gZXhwaXJ5IGVwb2NoIG1zXG5jb25zdCBtZW1Td2VlcCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChjb25zdCBbanRpLCBleHBdIG9mIG1lbUp0aSkgaWYgKGV4cCA8PSBub3cpIG1lbUp0aS5kZWxldGUoanRpKTtcbn0sIDMwXzAwMCk7XG5tZW1Td2VlcC51bnJlZj8uKCk7XG5cbi8qKlxuICogSGFyZCBjZWlsaW5nIG9uIHRoZSBwcm9jZXNzLWxvY2FsIGp0aSBzZXQuXG4gKlxuICogVGhlIDMwcyBzd2VlcCBhbG9uZSBkb2VzIE5PVCBib3VuZCBpdDogZW50cmllcyBvbmx5IGxlYXZlIG9uY2UgdGhlaXIgdG9rZW4nc1xuICogVFRMIGhhcyBwYXNzZWQsIHNvIGEgYnVyc3Qgb2Ygc3RlcC11cCB0cmFmZmljIChvciBhIGZsb29kIG9mIGRpc3RpbmN0IGZvcmdlZFxuICoganRpcyBvbiBhIFJlZGlzLWxlc3MgZGVwbG95bWVudCkgZ3Jvd3MgdGhlIG1hcCBmYXN0ZXIgdGhhbiB0aGUgc3dlZXAgZHJhaW5zXG4gKiBpdC4gVGhpcyBpcyBhIHJlcGxheSBndWFyZCwgc28gc2hlZGRpbmcgdGhlIE9MREVTVCBlbnRyaWVzIGlzIHRoZSBzYWZlXG4gKiBkaXJlY3Rpb246IHRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgYSBsb25nLWV4cGlyZWQganRpIGNvdWxkIGJlIHJlcGxheWVkLCBhbmRcbiAqIGV4cGlyeSBpcyBlbmZvcmNlZCBpbmRlcGVuZGVudGx5IGJ5IHRoZSB0b2tlbidzIG93biBgZXhwYC5cbiAqL1xuY29uc3QgTUVNX0pUSV9NQVggPSAxMF8wMDA7XG5cbi8qKiBEcm9wIHRoZSBzb29uZXN0LXRvLWV4cGlyZSBlbnRyaWVzIHVudGlsIHRoZSBtYXAgaXMgdW5kZXIgdGhlIGNlaWxpbmcuICovXG5mdW5jdGlvbiBldmljdE9sZGVzdEp0aSgpOiB2b2lkIHtcbiAgaWYgKG1lbUp0aS5zaXplIDwgTUVNX0pUSV9NQVgpIHJldHVybjtcbiAgY29uc3QgYnlFeHBpcnkgPSBbLi4ubWVtSnRpLmVudHJpZXMoKV0uc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pO1xuICBjb25zdCBleGNlc3MgPSBtZW1KdGkuc2l6ZSAtIE1FTV9KVElfTUFYICsgMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGNlc3M7IGkgKz0gMSkgbWVtSnRpLmRlbGV0ZShieUV4cGlyeVtpXVswXSk7XG59XG5cbi8qKlxuICogQ29uc3VtZSBhIHN0ZXAtdXAgYGp0aWAgZXhhY3RseSBvbmNlLiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjYWxsIGNsYWltZWQgaXRcbiAqIChmaXJzdCB1c2UpLCBmYWxzZSBpZiBpdCB3YXMgYWxyZWFkeSBjb25zdW1lZCAocmVwbGF5KS4gYGV4cEVwb2NoU2Vjb25kc2AgaXNcbiAqIHRoZSB0b2tlbidzIGBleHBgLCBzbyB0aGUgbWFya2VyIGF1dG8tZXhwaXJlcyB3aXRoIHRoZSB0b2tlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnN1bWVTdGVwVXBKdGkoanRpOiBzdHJpbmcsIGV4cEVwb2NoU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHR0bFNlY29uZHMgPSBNYXRoLm1heCgxLCBleHBFcG9jaFNlY29uZHMgLSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHJlZGlzKCk7XG4gIGlmIChjbGllbnQpIHtcbiAgICAvLyBSZWRpcyBjb25maWd1cmVkIOKHkiBhdXRob3JpdGF0aXZlIGNyb3NzLWluc3RhbmNlIHN0b3JlLiBTRVQgTlggRVgg4oaSICdPSydcbiAgICAvLyB3aGVuIG5ld2x5IHNldCwgbnVsbCB3aGVuIGFscmVhZHkgY29uc3VtZWQuIEEgdGhyb3duIFJlZGlzIGVycm9yIGlzIE5PVFxuICAgIC8vIGNhdWdodCBoZXJlOiBpdCBwcm9wYWdhdGVzIHNvIGByZXF1aXJlU3RlcFVwYCBmYWlscyBjbG9zZWQgKFNURVBfVVBfSU5WQUxJRClcbiAgICAvLyBpbnN0ZWFkIG9mIHNpbGVudGx5IGRlZ3JhZGluZyB0byB0aGUgcGVyLWluc3RhbmNlIG1lbSBndWFyZC5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuc2V0KGBzdGVwdXA6anRpOiR7anRpfWAsICcxJywgJ0VYJywgdHRsU2Vjb25kcywgJ05YJyk7XG4gICAgcmV0dXJuIHJlcyA9PT0gJ09LJztcbiAgfVxuICAvLyBObyBSZWRpcyDih5Igc2luZ2xlLWluc3RhbmNlIGRlcGxveW1lbnQ7IHRoZSBwcm9jZXNzLWxvY2FsIG1hcCBJUyB0aGUgc3RvcmUuXG4gIGlmIChtZW1KdGkuaGFzKGp0aSkpIHJldHVybiBmYWxzZTtcbiAgZXZpY3RPbGRlc3RKdGkoKTtcbiAgbWVtSnRpLnNldChqdGksIERhdGUubm93KCkgKyB0dGxTZWNvbmRzICogMTAwMCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEV4cHJlc3MgbWlkZGxld2FyZTogcmVxdWlyZSBhIHZhbGlkLCBjYWxsZXItYm91bmQsIHNpbmdsZS11c2Ugc3RlcC11cCB0b2tlbiBpblxuICogdGhlIGBYLVN0ZXAtVXAtVG9rZW5gIGhlYWRlci4gTXVzdCBydW4gQUZURVIgYHJlcXVpcmVBdXRoYCAobmVlZHMgYHJlcS51c2VyYCkuXG4gKlxuICogVXNlIGRpcmVjdGx5IChgcm91dGVyLnBvc3QoJy94JywgcmVxdWlyZUF1dGgsIHJlcXVpcmVTdGVwVXAsIGgpYCkgZm9yIHRoZVxuICogb3JkaW5hcnkgYW55LWZhY3RvciBnYXRlLCBvciBjYWxsIGl0IHdpdGggYHsgbWV0aG9kcyB9YCB0byBkZW1hbmQgdGhhdCB0aGVcbiAqIGNvbmZpcm1hdGlvbiB3YXMgZWFybmVkIGJ5IGEgc3BlY2lmaWMgZmFjdG9yIOKAlCBgcmVxdWlyZVN0ZXBVcCh7IG1ldGhvZHM6XG4gKiBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTIH0pYCBvbiB0aGUgcm91dGVzIHdoZXJlIGEgcGFzc3dvcmQgcmUtcHJvbXB0IGlzIG5vdCBhXG4gKiBtZWFuaW5nZnVsIHNlY29uZCBwcm9vZi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTdGVwVXAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+O1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTdGVwVXAob3B0aW9uczogUmVxdWlyZVN0ZXBVcE9wdGlvbnMpOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVN0ZXBVcChcbiAgcmVxT3JPcHRpb25zOiBSZXF1ZXN0IHwgUmVxdWlyZVN0ZXBVcE9wdGlvbnMsXG4gIHJlcz86IFJlc3BvbnNlLFxuICBuZXh0PzogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB8ICgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQpIHtcbiAgLy8gVGhlIGRpcmVjdCBmb3JtIFJFVFVSTlMgdGhlIHByb21pc2UgKEV4cHJlc3MgaWdub3JlcyBpdDsgYSB0ZXN0IGF3YWl0cyBpdCksXG4gIC8vIHNvIGNvbXBvc2luZyB0aGUgZ2F0ZSBhcyBgcm91dGVyLnBvc3QoJy94JywgcmVxdWlyZVN0ZXBVcCwgaClgIGJlaGF2ZXNcbiAgLy8gZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIHRoZSBvcHRpb25zIGZvcm0gZXhpc3RlZC5cbiAgaWYgKHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVTdGVwVXAoe30sIHJlcU9yT3B0aW9ucyBhcyBSZXF1ZXN0LCByZXMsIG5leHQpO1xuICB9XG4gIGNvbnN0IG9wdGlvbnMgPSByZXFPck9wdGlvbnMgYXMgUmVxdWlyZVN0ZXBVcE9wdGlvbnM7XG4gIHJldHVybiB0YWdSb3V0ZUdhdGUoXG4gICAgKHJlcUlubmVyOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgICB2b2lkIF9yZXF1aXJlU3RlcFVwKG9wdGlvbnMsIHJlcUlubmVyLCByZXNJbm5lciwgbmV4dElubmVyKTtcbiAgICB9LFxuICAgIHsga2luZDogJ3N0ZXBVcCcsIC4uLihvcHRpb25zLm1ldGhvZHMgPyB7IG1ldGhvZHM6IFsuLi5vcHRpb25zLm1ldGhvZHNdIH0gOiB7fSkgfSxcbiAgKTtcbn1cbnRhZ1JvdXRlR2F0ZShyZXF1aXJlU3RlcFVwLCB7IGtpbmQ6ICdzdGVwVXAnIH0pO1xuXG5hc3luYyBmdW5jdGlvbiBfcmVxdWlyZVN0ZXBVcChvcHRpb25zOiBSZXF1aXJlU3RlcFVwT3B0aW9ucywgcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gVmVyaWZpZWQgaW50ZXJuYWwgc2VydmljZSBwcmluY2lwYWxzIGFyZSBFWEVNUFQ6IHN0ZXAtdXAgaXMgYSByZS12ZXJpZnktdGhlLVxuICAvLyBIVU1BTiBnYXRlICh0aGV5IHJlcGxheSBhIHBhc3N3b3JkLXJldmVyaWZ5IHRva2VuKSwgd2hpY2ggYSBzZXJ2aWNlIHRva2VuXG4gIC8vIHN0cnVjdHVyYWxseSBjYW5ub3QgcHJvZHVjZS4gU2VydmljZXMgYWxyZWFkeSBieXBhc3MgYHJlcXVpcmVQZXJtaXNzaW9uYCBvblxuICAvLyB0aGUgc2FtZSB0cnVzdCBiYXNpcyAoYSBzaWduZWQgc2VydmljZSBKV1QpLCBhbmQgaW50ZXJuYWwgY2FsbGVycyBvZiBhXG4gIC8vIHN0ZXAtdXAtZ2F0ZWQgcm91dGUg4oCUIGUuZy4gdGhlIHBsYXRmb3JtIG9yZy1jYXNjYWRlJ3MgYERFTEVURSAvcXVvdGFzLzpvcmdJZGBcbiAgLy8gb3IgdGhlIGJpbGxpbmfihpJxdW90YSBlbnRpdGxlbWVudCBzeW5jIOKAlCB3b3VsZCBvdGhlcndpc2UgYmUgaGFyZC1ibG9ja2VkLlxuICAvLyBTYWZlOiBhIHNlcnZpY2UgdG9rZW4gY2FuIG9ubHkgYmUgbWludGVkIHdpdGggYSBTRVJWSUNFJ3Mgb3duIEVTMjU2IGtleSxcbiAgLy8gd2hpY2ggbm8gZXh0ZXJuYWwgY2xpZW50IGhvbGRzLCBzbyB0aGlzIGNhbid0IGJlIHNwb29mZWQgdG8gc2tpcFxuICAvLyBzdGVwLXVwLlxuICBpZiAoaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCBpcyB0aGUgb3Bwb3NpdGUgY2FzZTogaXQgaXMgc3ViamVjdCB0byBldmVyeSBnYXRlIGFcbiAgLy8gbWVtYmVyIGlzLCBhbmQgdGhlcmUgaXMgbm8gcGVyc29uIGJlaGluZCBpdCB0byByZS12ZXJpZnkg4oCUIHNvIGl0IGNhbiBORVZFUlxuICAvLyBwYXNzIHN0ZXAtdXAuIFJlZnVzZSBleHBsaWNpdGx5IChyYXRoZXIgdGhhbiBsZXR0aW5nIGl0IGZhbGwgdGhyb3VnaCB0byB0aGVcbiAgLy8gYHN1YmAtYm91bmQgdG9rZW4gY2hlY2ssIHdoaWNoIHdvdWxkIGZhaWwgd2l0aCBhIGNvbmZ1c2luZyBTVEVQX1VQX01JU01BVENIKVxuICAvLyBzbyBcImEgbWFjaGluZSBjcmVkZW50aWFsIG5ldmVyIHNhdGlzZmllcyBhbiBhc3N1cmFuY2UgcmVxdWlyZW1lbnRcIiBpcyBhXG4gIC8vIHByb3BlcnR5IG9mIHRoaXMgZ2F0ZSwgbm90IGEgc2lkZSBlZmZlY3Qgb2YgaG93IHN0ZXAtdXAgdG9rZW5zIGFyZSBtaW50ZWQuXG4gIGlmIChpc1NlcnZpY2VBY2NvdW50UHJpbmNpcGFsKHJlcSkpIHtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDMsICdBIHNlcnZpY2UgYWNjb3VudCBjYW5ub3QgcGVyZm9ybSB0aGlzIGFjdGlvbiDigJQgaXQgcmVxdWlyZXMgYSBwZXJzb24gdG8gcmUtdmVyaWZ5JywgJ1NURVBfVVBfTk9UX0FWQUlMQUJMRScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbGxlclN1YiA9IChyZXEgYXMgUmVxdWVzdCAmIHsgdXNlcj86IHsgc3ViPzogc3RyaW5nIH0gfSkudXNlcj8uc3ViO1xuICBpZiAoIWNhbGxlclN1Yikge1xuICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgJ1VOQVVUSE9SSVpFRCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRva2VuID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzW0hFQURFUl0pO1xuICBpZiAoIXRva2VuKSB7XG4gICAgc2VuZEVycm9yKHJlcywgNDAxLCAnU3RlcC11cCB2ZXJpZmljYXRpb24gcmVxdWlyZWQnLCAnU1RFUF9VUF9SRVFVSVJFRCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwYXlsb2FkOiBTdGVwVXBUb2tlblBheWxvYWQ7XG4gIHRyeSB7XG4gICAgcGF5bG9hZCA9IGF3YWl0IHZlcmlmeVN0ZXBVcFRva2VuKHRva2VuKTtcbiAgfSBjYXRjaCB7XG4gICAgc2VuZEVycm9yKHJlcywgNDAxLCAnU3RlcC11cCB0b2tlbiBpbnZhbGlkIG9yIGV4cGlyZWQnLCAnU1RFUF9VUF9JTlZBTElEJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHBheWxvYWQuc3ViICE9PSBjYWxsZXJTdWIpIHtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHRva2VuIGRvZXMgbm90IG1hdGNoIHNlc3Npb24nLCAnU1RFUF9VUF9NSVNNQVRDSCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZhY3RvciByZXN0cmljdGlvbi4gQ2hlY2tlZCBCRUZPUkUgdGhlIGp0aSBpcyBjb25zdW1lZCwgc28gYSB0b2tlblxuICAvLyBlYXJuZWQgYnkgdGhlIHdyb25nIGZhY3RvciBjYW4gc3RpbGwgYmUgc3BlbnQgb24gYSByb3V0ZSB0aGF0IGFjY2VwdHMgaXQg4oCUXG4gIC8vIGJ1cm5pbmcgaXQgaGVyZSB3b3VsZCBtYWtlIHRoZSByZWZ1c2FsIGRlc3RydWN0aXZlIGFzIHdlbGwgYXMgY29uZnVzaW5nLlxuICBpZiAob3B0aW9ucy5tZXRob2RzICYmICEocGF5bG9hZC5tZXRob2QgJiYgb3B0aW9ucy5tZXRob2RzLmluY2x1ZGVzKHBheWxvYWQubWV0aG9kKSkpIHtcbiAgICBzZW5kRXJyb3IoXG4gICAgICByZXMsIDQwMSxcbiAgICAgICdUaGlzIGFjdGlvbiBtdXN0IGJlIGNvbmZpcm1lZCB3aXRoIGEgcGFzc2tleSBvciBhbiBhdXRoZW50aWNhdG9yIGNvZGUnLFxuICAgICAgJ1NURVBfVVBfTUVUSE9EX1JFUVVJUkVEJyxcbiAgICAgIHsgbWV0aG9kczogWy4uLm9wdGlvbnMubWV0aG9kc10gfSxcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKCEoYXdhaXQgY29uc3VtZVN0ZXBVcEp0aShwYXlsb2FkLmp0aSwgcGF5bG9hZC5leHApKSkge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDAxLCAnU3RlcC11cCB0b2tlbiBhbHJlYWR5IHVzZWQgb3IgZXhwaXJlZCcsICdTVEVQX1VQX1JFUExBWScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmVycm9yKCdTdGVwLXVwIGp0aSBjb25zdW1lIGVycm9yZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHZlcmlmaWNhdGlvbiBmYWlsZWQnLCAnU1RFUF9VUF9JTlZBTElEJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbmV4dCgpO1xufVxuIl19
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC11cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3N0ZXAtdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXFCdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQXdCLE1BQU0sMEJBQTBCLENBQUM7QUFDNUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFakQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDO0FBU2pDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTRCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBcUJwRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQ25ELE1BQU0sT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFxQixLQUFLLENBQUMsQ0FBQztJQUUvRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMvRCxN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O1lBQy9FLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsNkJBQTZCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN0RSxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksRUFBRSxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIGByZXF1aXJlU3RlcFVwYCDigJQgYSBzaGFyZWQgc3RlcC11cCAocmVjZW50LXBhc3N3b3JkLXJldmVyaWZ5KSBnYXRlIGZvciB0aGVcbiAqIHN0YXRlbGVzcyBhcGkgc2VydmljZXMsIG1pcnJvcmluZyB0aGUgcGxhdGZvcm0gbWlkZGxld2FyZSBvZiB0aGUgc2FtZSBuYW1lLlxuICpcbiAqIEZsb3c6IHRoZSBVSSBoaXRzIGBQT1NUIC9hcGkvYXV0aC9zdGVwLXVwYCAocGxhdGZvcm0pIHRvIHJlLXZlcmlmeSB0aGUgdXNlcjtcbiAqIHBsYXRmb3JtIG1pbnRzIGEgc2hvcnQtbGl2ZWQgKDYwcykgYHN0ZXAtdXBgIEpXVCB3aXRoIHRoZSBTQU1FIEVTMjU2IHNpZ25pbmdcbiAqIGtleSBpdCBtaW50cyBhY2Nlc3MgdG9rZW5zIHdpdGgsIHNvIHRoZXNlIHNlcnZpY2VzIHZlcmlmeSBpdCB0aHJvdWdoIHRoZSBzYW1lXG4gKiBKV0tTLiBUaGUgVUlcbiAqIHJlcGxheXMgaXQgYXMgdGhlIGBYLVN0ZXAtVXAtVG9rZW5gIGhlYWRlciBvbiB0aGUgZGVzdHJ1Y3RpdmUvc2Vuc2l0aXZlIGNhbGw7XG4gKiB0aGlzIG1pZGRsZXdhcmUgdmVyaWZpZXMgaXQsIGJpbmRzIGl0IHRvIHRoZSBjYWxsZXIgKGBzdWJgIG1hdGNoKSwgYW5kXG4gKiBjb25zdW1lcyBpdHMgYGp0aWAgb25jZSAoUmVkaXMtYmFja2VkIGNyb3NzLWluc3RhbmNlIHdoZW4gY29uZmlndXJlZCwgZWxzZSBhXG4gKiBib3VuZGVkIHByb2Nlc3MtbG9jYWwgc2V0KSBzbyBhIHJlcGxheSBpbnNpZGUgdGhlIFRUTCBpcyByZWplY3RlZC5cbiAqXG4gKiBXSFkgaGVyZTogcmVzdG9yZSBlbmRwb2ludHMgb24gdGhlIGFwaSBzZXJ2aWNlcyAocGlwZWxpbmUvcGx1Z2luLy4uLikgYXJlXG4gKiBzdGVwLXVwLWdhdGVkLCBzbyB0aGUgdmVyaWZ5ICsgc2luZ2xlLXVzZSBqdGkgbGl2ZSBpbiBhcGktY29yZSB3aGVyZSBhbnlcbiAqIHNlcnZpY2UgY2FuIHJlcXVpcmUgdGhlbS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IHZlcmlmeVVzZXJKd3QgfSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuaW1wb3J0IHsgcmVjb3JkQXV0aHpEZW5pYWwgfSBmcm9tICcuL3Blcm1pc3Npb24tZ2F0ZXMuanMnO1xuaW1wb3J0IHsgdGFnUm91dGVHYXRlIH0gZnJvbSAnLi9yb3V0ZS10YWJsZS5qcyc7XG5pbXBvcnQgeyBpc1NlcnZpY2VBY2NvdW50UHJpbmNpcGFsLCBpc1NlcnZpY2VQcmluY2lwYWwgfSBmcm9tICcuL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50LCBjcmVhdGVSZWRpc1JlYWR5R2F0ZSwgdHlwZSBSZWFkeUF3YXJlUmVkaXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3N0ZXAtdXAnKTtcbmNvbnN0IEhFQURFUiA9ICd4LXN0ZXAtdXAtdG9rZW4nO1xuXG4vKipcbiAqIEhvdyBhIHN0ZXAtdXAgdG9rZW4gd2FzIGVhcm5lZC4gTWlycm9ycyBwbGF0Zm9ybSdzIGBTdGVwVXBNZXRob2RgOyBrZXB0IGhlcmVcbiAqIGFzIGl0cyBvd24gdW5pb24gc28gYSB2ZXJpZmllciBjYW4gbmFtZSB0aGUgZmFjdG9ycyBpdCBhY2NlcHRzIHdpdGhvdXRcbiAqIGltcG9ydGluZyBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IHR5cGUgU3RlcFVwTWV0aG9kID0gJ3Bhc3N3b3JkJyB8ICd3ZWJhdXRobicgfCAndG90cCcgfCAncmVhdXRoJztcblxuLyoqXG4gKiBUaGUgZmFjdG9ycyB0aGF0IGNvdW50IGFzIGEgU0VDT05EIEZBQ1RPUiwgZm9yIHJvdXRlcyB0aGF0IG1heSBvbmx5IGJlXG4gKiB1bmxvY2tlZCBieSBvbmUgKCM4OiBpbXBlcnNvbmF0aW9uLCBLTVMsIElkUCBzZXR0aW5ncywgcGxhdGZvcm0gYWRtaW4pLlxuICpcbiAqIEEgcGFzc3dvcmQgb3IgYSBwcm92aWRlciByZS1hdXRoIHByb3ZlcyB0aGUgc2FtZSBzaW5nbGUgZmFjdG9yIHRoZSBzZXNzaW9uIHdhc1xuICogYWxyZWFkeSBvcGVuZWQgd2l0aCwgc28gb24gdGhvc2Ugcm91dGVzIHRoZXkgYXJlIG5vdCBlbm91Z2g6IHRoZSBwb2ludCBpcyB0aGF0XG4gKiBzb21lb25lIGhvbGRpbmcgb25seSBhIHN0b2xlbiBzZXNzaW9uIOKAlCBvciBvbmx5IGEgc3RvbGVuIHBhc3N3b3JkIOKAlCBjYW5ub3RcbiAqIHByb2NlZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTOiByZWFkb25seSBTdGVwVXBNZXRob2RbXSA9IFsnd2ViYXV0aG4nLCAndG90cCddO1xuXG4vKiogUGF5bG9hZCBvZiBhIHBsYXRmb3JtLWlzc3VlZCBzdGVwLXVwIHRva2VuIChzZWUgcGxhdGZvcm0gaXNzdWVTdGVwVXBUb2tlbikuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBVcFRva2VuUGF5bG9hZCB7XG4gIHR5cGU6ICdzdGVwLXVwJztcbiAgc3ViOiBzdHJpbmc7XG4gIGp0aTogc3RyaW5nO1xuICAvKiogV2hpY2ggZmFjdG9yIGVhcm5lZCBpdC4gQWJzZW50IG9ubHkgb24gYSB0b2tlbiBtaW50ZWQgYmVmb3JlIHRoZSBjbGFpbVxuICAgKiAgZXhpc3RlZCwgd2hpY2ggYSBtZXRob2QtcmVzdHJpY3RlZCBnYXRlIHRyZWF0cyBhcyBcIm5vdCBwcm92ZW5cIi4gKi9cbiAgbWV0aG9kPzogU3RlcFVwTWV0aG9kO1xuICBpYXQ6IG51bWJlcjtcbiAgZXhwOiBudW1iZXI7XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgcmVxdWlyZVN0ZXBVcH0uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVTdGVwVXBPcHRpb25zIHtcbiAgLyoqIFJlc3RyaWN0IHdoaWNoIGZhY3RvcnMgbWF5IGVhcm4gdGhlIHN0ZXAtdXAgKGUuZy4ge0BsaW5rIFNUUk9OR19TVEVQX1VQX01FVEhPRFN9KS5cbiAgICogIE9taXR0ZWQgbWVhbnMgYW55IGZhY3RvciB0aGUgcGxhdGZvcm0gd2lsbCBpc3N1ZSBhIHRva2VuIGZvci4gKi9cbiAgbWV0aG9kcz86IHJlYWRvbmx5IFN0ZXBVcE1ldGhvZFtdO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhIHN0ZXAtdXAgdG9rZW46IGEgdmFsaWQgRVMyNTYgc2lnbmF0dXJlIGZyb20gb25lIG9mIHBsYXRmb3JtJ3NcbiAqIHB1Ymxpc2hlZCBzaWduaW5nIGtleXMsIGlzc3VlciBhbmQgYXVkaWVuY2Ugd2hlbiBjb25maWd1cmVkLCBBTkQgdGhlXG4gKiBgdHlwZTogJ3N0ZXAtdXAnYCArIGBqdGlgIGNsYWltcyDigJQgYSBwbGFpbiBhY2Nlc3MgdG9rZW4gaXMgc2lnbmVkIGJ5IHRoZSBzYW1lXG4gKiBrZXkgYW5kIGNhcnJpZXMgdGhlIHNhbWUgYHN1YmAsIHNvIHdpdGhvdXQgYXNzZXJ0aW5nIHRoZSBzdGVwLXVwIHNoYXBlIGl0XG4gKiB3b3VsZCBieXBhc3MgdGhlIGdhdGUuIFRocm93cyBvbiBhbnkgZmFpbHVyZSAoYW4gdW5mZXRjaGFibGUga2V5IHNldCBpbmNsdWRlZDpcbiAqIGFuIHVudmVyaWZpYWJsZSB0b2tlbiBpcyBub3QgYSBzdGVwLXVwKS4gRG9lcyBOT1QgYmluZCB0byBhIGNhbGxlciDigJRcbiAqIGByZXF1aXJlU3RlcFVwYCBkb2VzIHRoZSBgc3ViYCBtYXRjaCBhbmQgc2luZ2xlLXVzZSBjb25zdW1lLlxuICpcbiAqIERlbGVnYXRlcyB0byBgcmVxdWlyZUF1dGhgJ3Mgb3duIHByaW1pdGl2ZSAoYHZlcmlmeVVzZXJKd3RgKSByYXRoZXIgdGhhblxuICogcmUtaW1wbGVtZW50aW5nIGl0LiBUaGUgaGFuZC1yb2xsZWQgY29weSB0aGlzIHJlcGxhY2VkIGRyb3BwZWQgVFdPIG9mIGl0c1xuICogZ3VhcmRzOiBpdCBuZXZlciBwaW5uZWQgaXNzdWVyL2F1ZGllbmNlLCBhbmQgaXRzIHByZXZpb3VzLXNlY3JldCByZXRyeSBoYWQgbm9cbiAqIGV4cGlyeS9ub3QtYmVmb3JlIGNhcnZlLW91dCwgc28gYW4gRVhQSVJFRCB0b2tlbiBzdXJmYWNlZCBhcyBhIHNpZ25hdHVyZSBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVN0ZXBVcFRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPFN0ZXBVcFRva2VuUGF5bG9hZD4ge1xuICBjb25zdCBwYXlsb2FkID0gYXdhaXQgdmVyaWZ5VXNlckp3dDxTdGVwVXBUb2tlblBheWxvYWQ+KHRva2VuKTtcblxuICBpZiAocGF5bG9hZC50eXBlICE9PSAnc3RlcC11cCcgfHwgIXBheWxvYWQuanRpIHx8ICFwYXlsb2FkLnN1Yikge1xuICAgIHRocm93IG5ldyBFcnJvcignSU5WQUxJRF9TVEVQX1VQX1RPS0VOJyk7XG4gIH1cbiAgcmV0dXJuIHBheWxvYWQ7XG59XG5cbi8vIC0tIFNpbmdsZS11c2UganRpIHN0b3JlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZWRpcyBTRVQgTlggRVggd2hlbiBSZWRpcyBpcyBjb25maWd1cmVkIChjcm9zcy1pbnN0YW5jZSBzaW5nbGUtdXNlKTsgZWxzZSBhXG4vLyBib3VuZGVkIHByb2Nlc3MtbG9jYWwgbWFwIHdpdGggVFRMIHN3ZWVwIChwZXItcHJvY2VzcykuIEEgc3RlcC11cCB0b2tlbiBpc1xuLy8gNjBzLWxpdmVkLiBXaGVuIFJlZGlzIElTIGNvbmZpZ3VyZWQgaXQncyB0aGUgYXV0aG9yaXRhdGl2ZSBzdG9yZTogYSBSZWRpc1xuLy8gZXJyb3IgRkFJTFMgQ0xPU0VEICh0aHJvd3Mg4oaSIFNURVBfVVBfSU5WQUxJRCwgdXNlciByZS12ZXJpZmllcykgcmF0aGVyIHRoYW5cbi8vIGRlZ3JhZGluZyB0byB0aGUgcGVyLWluc3RhbmNlIG1lbSBndWFyZCwgd2hpY2ggd291bGQgYWNjZXB0IGEgY3Jvc3MtaW5zdGFuY2Vcbi8vIHJlcGxheSBkdXJpbmcgdGhlIG91dGFnZS4gVGhlIG1lbSBndWFyZCBpcyB1c2VkIE9OTFkgd2hlbiBSZWRpcyBpcyBhYnNlbnQuXG5cbnR5cGUgSnRpUmVkaXMgPSBSZWFkeUF3YXJlUmVkaXMgJiB7IHNldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUHJvbWlzZTx1bmtub3duPiB9O1xubGV0IF9yZWRpczogSnRpUmVkaXMgfCBudWxsIHwgdW5kZWZpbmVkO1xubGV0IF9yZWRpc1JlYWR5OiAoKCkgPT4gUHJvbWlzZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4vKipcbiAqIFRoZSBqdGkgY2xpZW50LCBidWlsdCBsYXppbHkuIFRoZSBlbnYgY2xpZW50IGhhcyBubyBvZmZsaW5lIHF1ZXVlLCBzbyBhIFNFVCBvblxuICogYSBjb25uZWN0aW9uIHRoYXQgaXNuJ3QgdXAgeWV0IGlzIHJlamVjdGVkIOKAlCB0aGUgRklSU1Qgc3RlcC11cCBvbiBldmVyeSBwb2RcbiAqIHdvdWxkIGZhaWwuIFdhaXQgKGJvdW5kZWQsIG5ldmVyIHJlamVjdGluZykgZm9yIHJlYWRpbmVzcyBiZWZvcmVcbiAqIGhhbmRpbmcgaXQgb3V0OyBhIGdlbnVpbmVseSBkb3duIFJlZGlzIHN0aWxsIGZhaWxzIGNsb3NlZCBvbiB0aGUgU0VUIGJlbG93LlxuICovXG5hc3luYyBmdW5jdGlvbiByZWRpcygpOiBQcm9taXNlPEp0aVJlZGlzIHwgbnVsbD4ge1xuICBpZiAoX3JlZGlzID09PSB1bmRlZmluZWQpIHtcbiAgICBfcmVkaXMgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxKdGlSZWRpcz4oJ3N0ZXAtdXAtanRpJyk7XG4gICAgX3JlZGlzUmVhZHkgPSBfcmVkaXMgPyBjcmVhdGVSZWRpc1JlYWR5R2F0ZShfcmVkaXMpIDogdW5kZWZpbmVkO1xuICB9XG4gIGlmIChfcmVkaXNSZWFkeSkgYXdhaXQgX3JlZGlzUmVhZHkoKTtcbiAgcmV0dXJuIF9yZWRpcztcbn1cblxuY29uc3QgbWVtSnRpID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTsgLy8ganRpIC0+IGV4cGlyeSBlcG9jaCBtc1xuY29uc3QgbWVtU3dlZXAgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGZvciAoY29uc3QgW2p0aSwgZXhwXSBvZiBtZW1KdGkpIGlmIChleHAgPD0gbm93KSBtZW1KdGkuZGVsZXRlKGp0aSk7XG59LCAzMF8wMDApO1xubWVtU3dlZXAudW5yZWY/LigpO1xuXG4vKipcbiAqIEhhcmQgY2VpbGluZyBvbiB0aGUgcHJvY2Vzcy1sb2NhbCBqdGkgc2V0LlxuICpcbiAqIFRoZSAzMHMgc3dlZXAgYWxvbmUgZG9lcyBOT1QgYm91bmQgaXQ6IGVudHJpZXMgb25seSBsZWF2ZSBvbmNlIHRoZWlyIHRva2VuJ3NcbiAqIFRUTCBoYXMgcGFzc2VkLCBzbyBhIGJ1cnN0IG9mIHN0ZXAtdXAgdHJhZmZpYyAob3IgYSBmbG9vZCBvZiBkaXN0aW5jdCBmb3JnZWRcbiAqIGp0aXMgb24gYSBSZWRpcy1sZXNzIGRlcGxveW1lbnQpIGdyb3dzIHRoZSBtYXAgZmFzdGVyIHRoYW4gdGhlIHN3ZWVwIGRyYWluc1xuICogaXQuIFRoaXMgaXMgYSByZXBsYXkgZ3VhcmQsIHNvIHNoZWRkaW5nIHRoZSBPTERFU1QgZW50cmllcyBpcyB0aGUgc2FmZVxuICogZGlyZWN0aW9uOiB0aGUgd29yc3QgY2FzZSBpcyB0aGF0IGEgbG9uZy1leHBpcmVkIGp0aSBjb3VsZCBiZSByZXBsYXllZCwgYW5kXG4gKiBleHBpcnkgaXMgZW5mb3JjZWQgaW5kZXBlbmRlbnRseSBieSB0aGUgdG9rZW4ncyBvd24gYGV4cGAuXG4gKi9cbmNvbnN0IE1FTV9KVElfTUFYID0gMTBfMDAwO1xuXG4vKiogRHJvcCB0aGUgc29vbmVzdC10by1leHBpcmUgZW50cmllcyB1bnRpbCB0aGUgbWFwIGlzIHVuZGVyIHRoZSBjZWlsaW5nLiAqL1xuZnVuY3Rpb24gZXZpY3RPbGRlc3RKdGkoKTogdm9pZCB7XG4gIGlmIChtZW1KdGkuc2l6ZSA8IE1FTV9KVElfTUFYKSByZXR1cm47XG4gIGNvbnN0IGJ5RXhwaXJ5ID0gWy4uLm1lbUp0aS5lbnRyaWVzKCldLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKTtcbiAgY29uc3QgZXhjZXNzID0gbWVtSnRpLnNpemUgLSBNRU1fSlRJX01BWCArIDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZXhjZXNzOyBpICs9IDEpIG1lbUp0aS5kZWxldGUoYnlFeHBpcnlbaV1bMF0pO1xufVxuXG4vKipcbiAqIENvbnN1bWUgYSBzdGVwLXVwIGBqdGlgIGV4YWN0bHkgb25jZS4gUmV0dXJucyB0cnVlIGlmIHRoaXMgY2FsbCBjbGFpbWVkIGl0XG4gKiAoZmlyc3QgdXNlKSwgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgY29uc3VtZWQgKHJlcGxheSkuIGBleHBFcG9jaFNlY29uZHNgIGlzXG4gKiB0aGUgdG9rZW4ncyBgZXhwYCwgc28gdGhlIG1hcmtlciBhdXRvLWV4cGlyZXMgd2l0aCB0aGUgdG9rZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25zdW1lU3RlcFVwSnRpKGp0aTogc3RyaW5nLCBleHBFcG9jaFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB0dGxTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXhwRXBvY2hTZWNvbmRzIC0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCByZWRpcygpO1xuICBpZiAoY2xpZW50KSB7XG4gICAgLy8gUmVkaXMgY29uZmlndXJlZCDih5IgYXV0aG9yaXRhdGl2ZSBjcm9zcy1pbnN0YW5jZSBzdG9yZS4gU0VUIE5YIEVYIOKGkiAnT0snXG4gICAgLy8gd2hlbiBuZXdseSBzZXQsIG51bGwgd2hlbiBhbHJlYWR5IGNvbnN1bWVkLiBBIHRocm93biBSZWRpcyBlcnJvciBpcyBOT1RcbiAgICAvLyBjYXVnaHQgaGVyZTogaXQgcHJvcGFnYXRlcyBzbyBgcmVxdWlyZVN0ZXBVcGAgZmFpbHMgY2xvc2VkIChTVEVQX1VQX0lOVkFMSUQpXG4gICAgLy8gaW5zdGVhZCBvZiBzaWxlbnRseSBkZWdyYWRpbmcgdG8gdGhlIHBlci1pbnN0YW5jZSBtZW0gZ3VhcmQuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnNldChgc3RlcHVwOmp0aToke2p0aX1gLCAnMScsICdFWCcsIHR0bFNlY29uZHMsICdOWCcpO1xuICAgIHJldHVybiByZXMgPT09ICdPSyc7XG4gIH1cbiAgLy8gTm8gUmVkaXMg4oeSIHNpbmdsZS1pbnN0YW5jZSBkZXBsb3ltZW50OyB0aGUgcHJvY2Vzcy1sb2NhbCBtYXAgSVMgdGhlIHN0b3JlLlxuICBpZiAobWVtSnRpLmhhcyhqdGkpKSByZXR1cm4gZmFsc2U7XG4gIGV2aWN0T2xkZXN0SnRpKCk7XG4gIG1lbUp0aS5zZXQoanRpLCBEYXRlLm5vdygpICsgdHRsU2Vjb25kcyAqIDEwMDApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmU6IHJlcXVpcmUgYSB2YWxpZCwgY2FsbGVyLWJvdW5kLCBzaW5nbGUtdXNlIHN0ZXAtdXAgdG9rZW4gaW5cbiAqIHRoZSBgWC1TdGVwLVVwLVRva2VuYCBoZWFkZXIuIE11c3QgcnVuIEFGVEVSIGByZXF1aXJlQXV0aGAgKG5lZWRzIGByZXEudXNlcmApLlxuICpcbiAqIFVzZSBkaXJlY3RseSAoYHJvdXRlci5wb3N0KCcveCcsIHJlcXVpcmVBdXRoLCByZXF1aXJlU3RlcFVwLCBoKWApIGZvciB0aGVcbiAqIG9yZGluYXJ5IGFueS1mYWN0b3IgZ2F0ZSwgb3IgY2FsbCBpdCB3aXRoIGB7IG1ldGhvZHMgfWAgdG8gZGVtYW5kIHRoYXQgdGhlXG4gKiBjb25maXJtYXRpb24gd2FzIGVhcm5lZCBieSBhIHNwZWNpZmljIGZhY3RvciDigJQgYHJlcXVpcmVTdGVwVXAoeyBtZXRob2RzOlxuICogU1RST05HX1NURVBfVVBfTUVUSE9EUyB9KWAgb24gdGhlIHJvdXRlcyB3aGVyZSBhIHBhc3N3b3JkIHJlLXByb21wdCBpcyBub3QgYVxuICogbWVhbmluZ2Z1bCBzZWNvbmQgcHJvb2YuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3RlcFVwKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPjtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3RlcFVwKG9wdGlvbnM6IFJlcXVpcmVTdGVwVXBPcHRpb25zKTogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVTdGVwVXAoXG4gIHJlcU9yT3B0aW9uczogUmVxdWVzdCB8IFJlcXVpcmVTdGVwVXBPcHRpb25zLFxuICByZXM/OiBSZXNwb25zZSxcbiAgbmV4dD86IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4gfCAoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKSB7XG4gIC8vIFRoZSBkaXJlY3QgZm9ybSBSRVRVUk5TIHRoZSBwcm9taXNlIChFeHByZXNzIGlnbm9yZXMgaXQ7IGEgdGVzdCBhd2FpdHMgaXQpLFxuICAvLyBzbyBjb21wb3NpbmcgdGhlIGdhdGUgYXMgYHJvdXRlci5wb3N0KCcveCcsIHJlcXVpcmVTdGVwVXAsIGgpYCBiZWhhdmVzXG4gIC8vIGV4YWN0bHkgYXMgaXQgZGlkIGJlZm9yZSB0aGUgb3B0aW9ucyBmb3JtIGV4aXN0ZWQuXG4gIGlmIChyZXMgJiYgbmV4dCAmJiAnaGVhZGVycycgaW4gcmVxT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9yZXF1aXJlU3RlcFVwKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuICBjb25zdCBvcHRpb25zID0gcmVxT3JPcHRpb25zIGFzIFJlcXVpcmVTdGVwVXBPcHRpb25zO1xuICByZXR1cm4gdGFnUm91dGVHYXRlKFxuICAgIChyZXFJbm5lcjogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgICAgdm9pZCBfcmVxdWlyZVN0ZXBVcChvcHRpb25zLCByZXFJbm5lciwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gICAgfSxcbiAgICB7IGtpbmQ6ICdzdGVwVXAnLCAuLi4ob3B0aW9ucy5tZXRob2RzID8geyBtZXRob2RzOiBbLi4ub3B0aW9ucy5tZXRob2RzXSB9IDoge30pIH0sXG4gICk7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZVN0ZXBVcCwgeyBraW5kOiAnc3RlcFVwJyB9KTtcblxuYXN5bmMgZnVuY3Rpb24gX3JlcXVpcmVTdGVwVXAob3B0aW9uczogUmVxdWlyZVN0ZXBVcE9wdGlvbnMsIHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFZlcmlmaWVkIGludGVybmFsIHNlcnZpY2UgcHJpbmNpcGFscyBhcmUgRVhFTVBUOiBzdGVwLXVwIGlzIGEgcmUtdmVyaWZ5LXRoZS1cbiAgLy8gSFVNQU4gZ2F0ZSAodGhleSByZXBsYXkgYSBwYXNzd29yZC1yZXZlcmlmeSB0b2tlbiksIHdoaWNoIGEgc2VydmljZSB0b2tlblxuICAvLyBzdHJ1Y3R1cmFsbHkgY2Fubm90IHByb2R1Y2UuIFNlcnZpY2VzIGFscmVhZHkgYnlwYXNzIGByZXF1aXJlUGVybWlzc2lvbmAgb25cbiAgLy8gdGhlIHNhbWUgdHJ1c3QgYmFzaXMgKGEgc2lnbmVkIHNlcnZpY2UgSldUKSwgYW5kIGludGVybmFsIGNhbGxlcnMgb2YgYVxuICAvLyBzdGVwLXVwLWdhdGVkIHJvdXRlIOKAlCBlLmcuIHRoZSBwbGF0Zm9ybSBvcmctY2FzY2FkZSdzIGBERUxFVEUgL3F1b3Rhcy86b3JnSWRgXG4gIC8vIG9yIHRoZSBiaWxsaW5n4oaScXVvdGEgZW50aXRsZW1lbnQgc3luYyDigJQgd291bGQgb3RoZXJ3aXNlIGJlIGhhcmQtYmxvY2tlZC5cbiAgLy8gU2FmZTogYSBzZXJ2aWNlIHRva2VuIGNhbiBvbmx5IGJlIG1pbnRlZCB3aXRoIGEgU0VSVklDRSdzIG93biBFUzI1NiBrZXksXG4gIC8vIHdoaWNoIG5vIGV4dGVybmFsIGNsaWVudCBob2xkcywgc28gdGhpcyBjYW4ndCBiZSBzcG9vZmVkIHRvIHNraXBcbiAgLy8gc3RlcC11cC5cbiAgaWYgKGlzU2VydmljZVByaW5jaXBhbChyZXEpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEFuIE9SRyBTRVJWSUNFIEFDQ09VTlQgaXMgdGhlIG9wcG9zaXRlIGNhc2U6IGl0IGlzIHN1YmplY3QgdG8gZXZlcnkgZ2F0ZSBhXG4gIC8vIG1lbWJlciBpcywgYW5kIHRoZXJlIGlzIG5vIHBlcnNvbiBiZWhpbmQgaXQgdG8gcmUtdmVyaWZ5IOKAlCBzbyBpdCBjYW4gTkVWRVJcbiAgLy8gcGFzcyBzdGVwLXVwLiBSZWZ1c2UgZXhwbGljaXRseSAocmF0aGVyIHRoYW4gbGV0dGluZyBpdCBmYWxsIHRocm91Z2ggdG8gdGhlXG4gIC8vIGBzdWJgLWJvdW5kIHRva2VuIGNoZWNrLCB3aGljaCB3b3VsZCBmYWlsIHdpdGggYSBjb25mdXNpbmcgU1RFUF9VUF9NSVNNQVRDSClcbiAgLy8gc28gXCJhIG1hY2hpbmUgY3JlZGVudGlhbCBuZXZlciBzYXRpc2ZpZXMgYW4gYXNzdXJhbmNlIHJlcXVpcmVtZW50XCIgaXMgYVxuICAvLyBwcm9wZXJ0eSBvZiB0aGlzIGdhdGUsIG5vdCBhIHNpZGUgZWZmZWN0IG9mIGhvdyBzdGVwLXVwIHRva2VucyBhcmUgbWludGVkLlxuICBpZiAoaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbChyZXEpKSB7XG4gICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnc3RlcC11cCAoU1RFUF9VUF9OT1RfQVZBSUxBQkxFOiBzZXJ2aWNlIGFjY291bnQpJyk7XG4gICAgc2VuZEVycm9yKHJlcywgNDAzLCAnQSBzZXJ2aWNlIGFjY291bnQgY2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24g4oCUIGl0IHJlcXVpcmVzIGEgcGVyc29uIHRvIHJlLXZlcmlmeScsICdTVEVQX1VQX05PVF9BVkFJTEFCTEUnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYWxsZXJTdWIgPSAocmVxIGFzIFJlcXVlc3QgJiB7IHVzZXI/OiB7IHN1Yj86IHN0cmluZyB9IH0pLnVzZXI/LnN1YjtcbiAgaWYgKCFjYWxsZXJTdWIpIHtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsICdVTkFVVEhPUklaRUQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0b2tlbiA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1tIRUFERVJdKTtcbiAgaWYgKCF0b2tlbikge1xuICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ1N0ZXAtdXAgdmVyaWZpY2F0aW9uIHJlcXVpcmVkJywgJ1NURVBfVVBfUkVRVUlSRUQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgcGF5bG9hZDogU3RlcFVwVG9rZW5QYXlsb2FkO1xuICB0cnkge1xuICAgIHBheWxvYWQgPSBhd2FpdCB2ZXJpZnlTdGVwVXBUb2tlbih0b2tlbik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEEgcHJlc2VudGVkLWJ1dC11bnZlcmlmaWFibGUgdG9rZW4gKGZvcmdlZCwgZXhwaXJlZCwgd3Jvbmcga2V5KSBpcyBvbiB0aGVcbiAgICAvLyB0cmFpbDsgYSBNSVNTSU5HIG9uZSAoU1RFUF9VUF9SRVFVSVJFRCBhYm92ZSkgaXMgdGhlIFVJJ3Mgbm9ybWFsIGZpcnN0XG4gICAgLy8gYXR0ZW1wdCBhbmQgaXMgbm90LlxuICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ3N0ZXAtdXAgKFNURVBfVVBfSU5WQUxJRCknKTtcbiAgICBzZW5kRXJyb3IocmVzLCA0MDEsICdTdGVwLXVwIHRva2VuIGludmFsaWQgb3IgZXhwaXJlZCcsICdTVEVQX1VQX0lOVkFMSUQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocGF5bG9hZC5zdWIgIT09IGNhbGxlclN1Yikge1xuICAgIC8vIFNvbWVvbmUgZWxzZSdzIHN0ZXAtdXAgdG9rZW4gcmVwbGF5ZWQgb24gdGhpcyBzZXNzaW9uIOKAlCBuZXZlciBhIFVJIGJ1Zy5cbiAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsICdzdGVwLXVwIChTVEVQX1VQX01JU01BVENIKScpO1xuICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ1N0ZXAtdXAgdG9rZW4gZG9lcyBub3QgbWF0Y2ggc2Vzc2lvbicsICdTVEVQX1VQX01JU01BVENIJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRmFjdG9yIHJlc3RyaWN0aW9uLiBDaGVja2VkIEJFRk9SRSB0aGUganRpIGlzIGNvbnN1bWVkLCBzbyBhIHRva2VuXG4gIC8vIGVhcm5lZCBieSB0aGUgd3JvbmcgZmFjdG9yIGNhbiBzdGlsbCBiZSBzcGVudCBvbiBhIHJvdXRlIHRoYXQgYWNjZXB0cyBpdCDigJRcbiAgLy8gYnVybmluZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhlIHJlZnVzYWwgZGVzdHJ1Y3RpdmUgYXMgd2VsbCBhcyBjb25mdXNpbmcuXG4gIGlmIChvcHRpb25zLm1ldGhvZHMgJiYgIShwYXlsb2FkLm1ldGhvZCAmJiBvcHRpb25zLm1ldGhvZHMuaW5jbHVkZXMocGF5bG9hZC5tZXRob2QpKSkge1xuICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgYHN0ZXAtdXAgKFNURVBfVVBfTUVUSE9EX1JFUVVJUkVEOiAke29wdGlvbnMubWV0aG9kcy5qb2luKCcgb3IgJyl9LCBnb3QgJHtwYXlsb2FkLm1ldGhvZCA/PyAnbm9uZSd9KWApO1xuICAgIHNlbmRFcnJvcihcbiAgICAgIHJlcywgNDAxLFxuICAgICAgJ1RoaXMgYWN0aW9uIG11c3QgYmUgY29uZmlybWVkIHdpdGggYSBwYXNza2V5IG9yIGFuIGF1dGhlbnRpY2F0b3IgY29kZScsXG4gICAgICAnU1RFUF9VUF9NRVRIT0RfUkVRVUlSRUQnLFxuICAgICAgeyBtZXRob2RzOiBbLi4ub3B0aW9ucy5tZXRob2RzXSB9LFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoIShhd2FpdCBjb25zdW1lU3RlcFVwSnRpKHBheWxvYWQuanRpLCBwYXlsb2FkLmV4cCkpKSB7XG4gICAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsICdzdGVwLXVwIChTVEVQX1VQX1JFUExBWSknKTtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDQwMSwgJ1N0ZXAtdXAgdG9rZW4gYWxyZWFkeSB1c2VkIG9yIGV4cGlyZWQnLCAnU1RFUF9VUF9SRVBMQVknKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5lcnJvcignU3RlcC11cCBqdGkgY29uc3VtZSBlcnJvcmVkJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgc2VuZEVycm9yKHJlcywgNDAxLCAnU3RlcC11cCB2ZXJpZmljYXRpb24gZmFpbGVkJywgJ1NURVBfVVBfSU5WQUxJRCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG5leHQoKTtcbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ /** Largest weight one model may carry — one call can never reserve more than this many units. */
2
+ export declare const MAX_AI_CALL_WEIGHT = 100;
3
+ /**
4
+ * Parse `AI_MODEL_WEIGHTS` — a JSON object of `key → integer weight` — into
5
+ * lower-cased entries. A malformed value is IGNORED (logged), never fatal: the
6
+ * weights are an optional pricing lever and every call still meters at 1.
7
+ */
8
+ export declare function parseAiModelWeights(raw: string | undefined): Record<string, number>;
9
+ /**
10
+ * How many `aiCalls` units one call on `{ provider, modelId }` reserves.
11
+ *
12
+ * MODEL-CLASS WEIGHTING is OFF by default: with `AI_MODEL_WEIGHTS` unset every
13
+ * model weighs 1 — except the self-hosted provider, which weighs 0 (see
14
+ * {@link BUILT_IN_WEIGHTS}). Matching, first hit wins:
15
+ * 1. a key equal to the PROVIDER id (`"openai-compatible": 0`, `"bedrock": 2`);
16
+ * 2. the LONGEST key contained in the model id (`"opus": 3` matches
17
+ * `claude-opus-4-1`; `"sonnet": 1`, `"haiku": 1`).
18
+ * No match → 1. A weight of 0 means the call reserves nothing (it is still
19
+ * recorded in the usage ledger with its tokens).
20
+ */
21
+ export declare function aiCallWeight(selection: {
22
+ provider: string;
23
+ modelId: string;
24
+ }): number;