@pipeline-builder/api-core 5.2.6 → 5.2.7

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 (181) hide show
  1. package/lib/constants/ai-providers.js +1 -1
  2. package/lib/constants/http-status.js +1 -1
  3. package/lib/constants/index.js +1 -1
  4. package/lib/constants/time.js +1 -1
  5. package/lib/errors/app-errors.js +1 -1
  6. package/lib/errors/index.js +1 -1
  7. package/lib/helpers/access-helpers.d.ts +19 -0
  8. package/lib/helpers/access-helpers.js +24 -4
  9. package/lib/helpers/content-disposition.js +1 -1
  10. package/lib/helpers/crud-helpers.js +1 -1
  11. package/lib/helpers/index.d.ts +1 -1
  12. package/lib/helpers/index.js +2 -2
  13. package/lib/helpers/org-hierarchy-http.js +1 -1
  14. package/lib/helpers/org-hierarchy.js +1 -1
  15. package/lib/helpers/restore-helpers.js +1 -1
  16. package/lib/helpers/sse-helpers.js +13 -2
  17. package/lib/helpers/support-calendar.js +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/middleware/ask-provenance.js +1 -1
  20. package/lib/middleware/assurance.js +1 -1
  21. package/lib/middleware/auth.js +1 -1
  22. package/lib/middleware/deferred-quota-check.js +1 -1
  23. package/lib/middleware/ecosystem-guard.js +1 -1
  24. package/lib/middleware/index.js +1 -1
  25. package/lib/middleware/jwt-verify.js +1 -1
  26. package/lib/middleware/mongo-sanitize.js +1 -1
  27. package/lib/middleware/on-behalf.js +1 -1
  28. package/lib/middleware/permission-gates.js +1 -1
  29. package/lib/middleware/quota-exempt-routes.js +1 -1
  30. package/lib/middleware/revocation.js +1 -1
  31. package/lib/middleware/route-table.js +16 -1
  32. package/lib/middleware/service-tokens.js +1 -1
  33. package/lib/middleware/step-up.js +1 -1
  34. package/lib/middleware/system-org.d.ts +18 -5
  35. package/lib/middleware/system-org.js +19 -6
  36. package/lib/openapi/extend-zod.js +1 -1
  37. package/lib/openapi/index.js +1 -1
  38. package/lib/openapi/registry.js +1 -1
  39. package/lib/openapi/routes/ask-routes.js +1 -1
  40. package/lib/openapi/routes/billing-routes.js +1 -1
  41. package/lib/openapi/routes/image-registry-routes.js +1 -1
  42. package/lib/openapi/routes/index.js +1 -1
  43. package/lib/openapi/routes/message-routes.js +1 -1
  44. package/lib/openapi/routes/pipeline-routes.js +1 -1
  45. package/lib/openapi/routes/pipeline-template-routes.js +1 -1
  46. package/lib/openapi/routes/plugin-routes.js +1 -1
  47. package/lib/openapi/routes/quota-routes.js +1 -1
  48. package/lib/openapi/schema-registry.js +1 -1
  49. package/lib/routes/health.js +1 -1
  50. package/lib/routes/index.js +1 -1
  51. package/lib/services/ai-call-weight.js +1 -1
  52. package/lib/services/alert-delivery.js +1 -1
  53. package/lib/services/api-key-exchange.js +1 -1
  54. package/lib/services/audit-context.js +1 -1
  55. package/lib/services/audit-spool.js +1 -1
  56. package/lib/services/cache-service.js +1 -1
  57. package/lib/services/circuit-breaker.js +1 -1
  58. package/lib/services/compliance-client.js +1 -1
  59. package/lib/services/compliance-event-subscriber.js +1 -1
  60. package/lib/services/durable-event-bus.js +1 -1
  61. package/lib/services/ecosystem-notify-client.d.ts +7 -1
  62. package/lib/services/ecosystem-notify-client.js +9 -3
  63. package/lib/services/entity-events.js +1 -1
  64. package/lib/services/env-redis.js +1 -1
  65. package/lib/services/http-client.js +19 -3
  66. package/lib/services/index.d.ts +1 -1
  67. package/lib/services/index.js +2 -2
  68. package/lib/services/jwks-cache.js +1 -1
  69. package/lib/services/leader-lock.js +1 -1
  70. package/lib/services/notification-channels.js +1 -1
  71. package/lib/services/org-ai-client.js +1 -1
  72. package/lib/services/pagerduty-inbound.js +1 -1
  73. package/lib/services/pagerduty.js +1 -1
  74. package/lib/services/quota-increment-batcher.js +1 -1
  75. package/lib/services/quota.js +1 -1
  76. package/lib/services/remote-audit-client.js +1 -1
  77. package/lib/services/retry-forever.js +1 -1
  78. package/lib/services/retry-strategy.js +1 -1
  79. package/lib/services/s3-client.js +1 -1
  80. package/lib/services/scheduler.js +1 -1
  81. package/lib/services/service-boot.js +1 -1
  82. package/lib/services/service-keys.js +2 -2
  83. package/lib/services/sse-ticket-store.js +1 -1
  84. package/lib/services/system-notification.js +1 -1
  85. package/lib/services/token-revocation.js +1 -1
  86. package/lib/services/version-vuln-policy.d.ts +11 -0
  87. package/lib/services/version-vuln-policy.js +33 -7
  88. package/lib/types/ai-catalog.js +1 -1
  89. package/lib/types/ask-proposals.d.ts +23 -0
  90. package/lib/types/ask-proposals.js +29 -1
  91. package/lib/types/audit-events.js +1 -1
  92. package/lib/types/build-catalog.d.ts +65 -0
  93. package/lib/types/build-catalog.js +95 -1
  94. package/lib/types/catalog-metadata.js +1 -1
  95. package/lib/types/common.js +1 -1
  96. package/lib/types/compliance-exemption.js +1 -1
  97. package/lib/types/ecosystem-notifications.d.ts +9 -0
  98. package/lib/types/ecosystem-notifications.js +15 -6
  99. package/lib/types/ecosystem.d.ts +1 -6
  100. package/lib/types/ecosystem.js +18 -5
  101. package/lib/types/error-codes.js +1 -1
  102. package/lib/types/feature-flags.d.ts +17 -1
  103. package/lib/types/feature-flags.js +1 -1
  104. package/lib/types/http.js +1 -1
  105. package/lib/types/index.d.ts +3 -3
  106. package/lib/types/index.js +4 -4
  107. package/lib/types/metadata-keys.js +1 -1
  108. package/lib/types/permissions.d.ts +60 -13
  109. package/lib/types/permissions.js +63 -14
  110. package/lib/types/pipeline-template.js +1 -1
  111. package/lib/types/pipeline.js +1 -1
  112. package/lib/types/plugin-catalog.js +1 -1
  113. package/lib/types/plugin-health.js +1 -1
  114. package/lib/types/plugin-scan.d.ts +69 -0
  115. package/lib/types/plugin-scan.js +77 -1
  116. package/lib/types/quota-catalog.js +15 -2
  117. package/lib/types/quota-tiers.d.ts +27 -160
  118. package/lib/types/quota-tiers.js +47 -255
  119. package/lib/types/remote-audit-actions.d.ts +1 -1
  120. package/lib/types/remote-audit-actions.js +9 -1
  121. package/lib/types/reserved-tags.js +1 -1
  122. package/lib/types/tier-limits.d.ts +210 -0
  123. package/lib/types/tier-limits.js +254 -0
  124. package/lib/types/usage-projection.js +1 -1
  125. package/lib/types/visibility.js +1 -1
  126. package/lib/types/wire-vocabulary.d.ts +7 -0
  127. package/lib/types/wire-vocabulary.js +7 -1
  128. package/lib/utils/alias-resolver.js +1 -1
  129. package/lib/utils/api-key.js +1 -1
  130. package/lib/utils/audit.js +1 -1
  131. package/lib/utils/aws-scrub.js +1 -1
  132. package/lib/utils/compliance-attributes.js +1 -1
  133. package/lib/utils/concurrency-gate.d.ts +98 -0
  134. package/lib/utils/concurrency-gate.js +110 -0
  135. package/lib/utils/concurrency.js +1 -1
  136. package/lib/utils/crash-handlers.js +1 -1
  137. package/lib/utils/date.js +1 -1
  138. package/lib/utils/dsse.js +1 -1
  139. package/lib/utils/env.d.ts +11 -0
  140. package/lib/utils/env.js +14 -1
  141. package/lib/utils/headers.js +1 -1
  142. package/lib/utils/identity.js +1 -1
  143. package/lib/utils/index.d.ts +1 -0
  144. package/lib/utils/index.js +2 -1
  145. package/lib/utils/jwk.js +2 -2
  146. package/lib/utils/logger.js +1 -1
  147. package/lib/utils/metric-emitter.js +1 -1
  148. package/lib/utils/object.js +1 -1
  149. package/lib/utils/params.js +1 -1
  150. package/lib/utils/plugin-compliance.d.ts +9 -1
  151. package/lib/utils/plugin-compliance.js +1 -1
  152. package/lib/utils/proof-of-work.js +1 -1
  153. package/lib/utils/response.js +1 -1
  154. package/lib/utils/retention.js +1 -1
  155. package/lib/utils/safe-require.js +1 -1
  156. package/lib/utils/secret-encryption.js +1 -1
  157. package/lib/utils/secret-rotation.js +1 -1
  158. package/lib/utils/secure-compare.js +1 -1
  159. package/lib/utils/sensitive-patterns.js +1 -1
  160. package/lib/utils/service-registry.js +1 -1
  161. package/lib/utils/ssrf.js +1 -1
  162. package/lib/validation/ai-schemas.js +1 -1
  163. package/lib/validation/common-schemas.js +1 -1
  164. package/lib/validation/dockerfile-static.js +1 -1
  165. package/lib/validation/index.d.ts +1 -1
  166. package/lib/validation/index.js +2 -2
  167. package/lib/validation/message-schemas.d.ts +73 -0
  168. package/lib/validation/message-schemas.js +63 -2
  169. package/lib/validation/middleware.js +1 -1
  170. package/lib/validation/pipeline-schemas.js +1 -1
  171. package/lib/validation/pipeline-template-schemas.js +1 -1
  172. package/lib/validation/plugin-base-images.js +1 -1
  173. package/lib/validation/plugin-catalog-detect.js +1 -1
  174. package/lib/validation/plugin-catalog-metadata.js +1 -1
  175. package/lib/validation/plugin-heuristics.js +1 -1
  176. package/lib/validation/plugin-lint.js +1 -1
  177. package/lib/validation/plugin-name-confusable.js +1 -1
  178. package/lib/validation/plugin-schemas.js +1 -1
  179. package/lib/validation/plugin-spec-schema.js +1 -1
  180. package/lib/validation/plugin-template-contract.js +1 -1
  181. package/package.json +11 -4
@@ -1,84 +1,16 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { envBool, envInt, envStr } from '../utils/env.js';
3
+ import { envBool, envInt, envNameFragment, envStr } from '../utils/env.js';
4
+ import { DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
4
5
  /**
5
- * Preset limits for each tier. -1 means unlimited.
6
- *
7
- * AI calls are sized much smaller than `apiCalls` because each call has
8
- * external provider cost (~$0.01$0.10/call). Developer tier allows light
9
- * exploration (50/period); Pro lifts to 2,500; Enterprise is capped high
10
- * (25,000) — fair-use, not literally unlimited.
11
- *
12
- * `storageBytes` is the aggregate registry cap per org. Sized
13
- * around plugin-image realities: a typical plugin image is 200500 MB;
14
- * Developer's 2 GB holds ~4 versions × ~500 MB, Pro's 25 GB covers a
15
- * mature catalog. Operators can override per-org via the quota CRUD API.
6
+ * The limits shape, the code-default table and the sizing arithmetic live in
7
+ * `./tier-limits.js` — dependency-free, so the BROWSER imports them
8
+ * (`@pipeline-builder/api-core/tier-limits`) instead of keeping a hand-synced
9
+ * copy. Re-exported here because this is the module every server consumer and
10
+ * the package barrel already name; what stays here is everything the env
11
+ * touches.
16
12
  */
17
- const GB = 1024 * 1024 * 1024;
18
- /**
19
- * How the `automationCalls` defaults are sized — written down so the next
20
- * person to touch them argues with the arithmetic, not with the numbers.
21
- *
22
- * Every call an org's automation keys make in one pipeline RUN, itemized (the
23
- * earlier sizing counted only the plugin lookups and hand-waved the rest as
24
- * "×2"):
25
- *
26
- * plugin lookups 12 one per plugin step (self-mutating pipeline)
27
- * synth 1 the synth step fetching the pipeline config
28
- * runtime check 1 the pre-deploy runtime-check call
29
- * security-report upload 1 the scan step posting its report
30
- * registry register 1 pipeline-register stamping the deployed version
31
- * reporting ingest batches 12 the event forwarder posts ~one batch per action
32
- * --
33
- * 28 calls per run
34
- *
35
- * Per default period (`QUOTA_RESET_DAYS`, 3 days) one active pipeline running
36
- * hourly makes 28 × 24 × 3 = 2,016 calls. An org keeps far more pipelines alive
37
- * than it CREATES in a period (`pipelines` is a creation rate), so active
38
- * pipelines are taken as 4× the tier's `pipelines`. On top sits a per-ORG
39
- * constant that does not scale with pipelines: the ingest-health heartbeat
40
- * (≤ 1/minute → 1,440/day → 4,320/period). The sum gets 25% headroom (retries,
41
- * registry pushes, ad-hoc CI scripts on keys) and rounds UP to the next 10,000:
42
- *
43
- * developer 2×4×2016 + 4320 = 20,448 × 1.25 = 25,560 → 30,000
44
- * pro 5×4×2016 + 4320 = 44,640 × 1.25 = 55,800 → 60,000
45
- * team 10×4×2016 + 4320 = 84,960 × 1.25 = 106,200 → 110,000
46
- * business 20×4×2016 + 4320 = 165,600 × 1.25 = 207,000 → 210,000
47
- * enterprise 30×4×2016 + 4320 = 246,240 × 1.25 = 307,800 → 310,000
48
- *
49
- * {@link automationCallsFor} computes exactly this, and the tier tests hold the
50
- * table to it. Over the cap the 429 is SOFT for a band ({@link quotaGracePct}):
51
- * a self-mutating pipeline that hard-stopped at 100% stayed stopped until the
52
- * period reset, up to 3 days. The limits are PER PERIOD: an operator who
53
- * lengthens `QUOTA_RESET_DAYS` should scale `QUOTA_TIER_<TIER>_AUTOMATION_CALLS`
54
- * by the same factor.
55
- */
56
- export const AUTOMATION_CALLS_SIZING = {
57
- callsPerRun: {
58
- pluginLookups: 12,
59
- synth: 1,
60
- runtimeCheck: 1,
61
- securityReportUpload: 1,
62
- registryRegister: 1,
63
- ingestBatches: 12,
64
- },
65
- runsPerDay: 24,
66
- activePipelinesPerCreation: 4,
67
- /** Ingest-health heartbeats per org per day (≤ one a minute). */
68
- heartbeatsPerDay: 1440,
69
- /** Multiplier on the itemized total. */
70
- headroom: 1.25,
71
- /** Defaults round UP to a multiple of this. */
72
- roundTo: 10_000,
73
- };
74
- /** The {@link AUTOMATION_CALLS_SIZING} formula for a tier creating `pipelines` per period. */
75
- export function automationCallsFor(pipelines, periodDays = 3) {
76
- const s = AUTOMATION_CALLS_SIZING;
77
- const perRun = Object.values(s.callsPerRun).reduce((a, b) => a + b, 0);
78
- const perPipeline = perRun * s.runsPerDay * periodDays;
79
- const total = (pipelines * s.activePipelinesPerCreation * perPipeline + s.heartbeatsPerDay * periodDays) * s.headroom;
80
- return Math.ceil(total / s.roundTo) * s.roundTo;
81
- }
13
+ export { AUTOMATION_CALLS_SIZING, automationCallsFor, DEFAULT_TIER_LIMITS, tierLabel } from './tier-limits.js';
82
14
  /**
83
15
  * The SOFT band above a quota's cap, per type, in percent of the limit. A type
84
16
  * absent from this map has NO band and stops hard at 100%.
@@ -107,6 +39,11 @@ export function automationCallsFor(pipelines, periodDays = 3) {
107
39
  const QUOTA_GRACE_PCT = {
108
40
  automationCalls: envInt('QUOTA_AUTOMATION_GRACE_PCT', 10, { min: 0, max: 100 }),
109
41
  storageBytes: envInt('QUOTA_STORAGE_GRACE_PCT', 10, { min: 0, max: 100 }),
42
+ // `satisfies Partial<…>` keeps BOTH properties this map needs: the keys are
43
+ // checked against `QuotaType` (a typo'd `storagebytes` would otherwise leave a
44
+ // banded quota stopping hard at 100%, silently), while the annotation keeps the
45
+ // string index the accessor below needs for an untrusted `quotaType`. Partial
46
+ // because absence is meaningful here — see above.
110
47
  };
111
48
  /** The soft band for `quotaType` in percent, or 0 for a type that stops hard. */
112
49
  export function quotaGracePct(quotaType) {
@@ -128,152 +65,6 @@ export function enforcedQuotaLimit(quotaType, limit, gracePct = quotaGracePct(qu
128
65
  return limit;
129
66
  return Math.floor((limit * (100 + gracePct)) / 100);
130
67
  }
131
- /**
132
- * Code-default limits per tier — the fallback when no env override is set.
133
- * -1 means unlimited. (Counts sized to "comfortably enough for one team, not
134
- * script spam": 20 dashboards, 50 alert rules, 10 destinations, 1 IdP config
135
- * for Developer; scaled up for Pro; -1 (uncapped) for the cheap count-quotas
136
- * on Team/Enterprise while cost-driving quotas — incl. apiCalls — stay finite.)
137
- */
138
- const DEFAULT_TIER_LIMITS = {
139
- // Free tier: single seat, 2 pipelines, apiCalls CAPPED (was unlimited — a
140
- // DoS/abuse hole on a shared resource); aiCalls small (each has ~$0.01-0.10
141
- // external cost). Lean base — growth happens by upgrading, not stacking here.
142
- developer: {
143
- plugins: 10,
144
- pipelines: 2,
145
- apiCalls: 25_000,
146
- automationCalls: 30_000,
147
- aiCalls: 20,
148
- cpuCredits: 4_500,
149
- storageBytes: 2 * GB,
150
- dashboards: 20,
151
- alertRules: 50,
152
- alertDestinations: 10,
153
- idpConfigs: 1,
154
- listings: 3,
155
- seats: 1,
156
- supportContacts: 0,
157
- supportPremiumContacts: 0,
158
- eventRetentionDays: 30,
159
- doraRetentionDays: 180,
160
- },
161
- // Pro = individual power user, single seat, individual pricing. A 2nd seat (or
162
- // team collaboration) requires the Team tier — the `seat` add-on is Team+ only,
163
- // keeping Team the collaboration tier. Pro's value over Developer is its richer
164
- // call/storage/plugin ceilings + feature add-ons (SSO/audit/DORA), not seats.
165
- pro: {
166
- plugins: 25,
167
- pipelines: 5,
168
- apiCalls: 100_000,
169
- automationCalls: 60_000,
170
- aiCalls: 200,
171
- cpuCredits: 11_250,
172
- storageBytes: 25 * GB,
173
- dashboards: 200,
174
- alertRules: 500,
175
- alertDestinations: 50,
176
- idpConfigs: 5,
177
- listings: 10,
178
- seats: 1,
179
- supportContacts: 0,
180
- supportPremiumContacts: 0,
181
- eventRetentionDays: 30,
182
- doraRetentionDays: 180,
183
- },
184
- // Team = collaboration tier; the seat limit (3) is the real differentiator over
185
- // Pro (single-seat) — it's the multi-seat collaboration floor. Lean base ($79):
186
- // growth rides the seat/pipeline/etc add-ons (land-and-expand). Limits sit
187
- // between Pro and Enterprise.
188
- team: {
189
- plugins: 50,
190
- pipelines: 10,
191
- apiCalls: 300_000,
192
- automationCalls: 110_000,
193
- aiCalls: 600,
194
- cpuCredits: 22_500,
195
- storageBytes: 60 * GB,
196
- dashboards: -1,
197
- alertRules: -1,
198
- alertDestinations: -1,
199
- idpConfigs: 5,
200
- listings: 25,
201
- seats: 3,
202
- supportContacts: 0,
203
- supportPremiumContacts: 0,
204
- eventRetentionDays: 30,
205
- doraRetentionDays: 180,
206
- },
207
- // Business ($249): the step the $79 -> $599 cliff was missing. 8 seats, 20
208
- // pipelines, and DORA (advanced_reporting) included rather than an add-on.
209
- // Every cost driver is 100,000 apiCalls and 200 aiCalls PER SEAT, the same
210
- // per-seat rate as Pro/Team/Enterprise, so the ladder reads consistently to a
211
- // buyer who divides by headcount. Count-quotas that Team already uncaps stay
212
- // -1; `idpConfigs` sits between Team's 5 and Enterprise's unlimited.
213
- business: {
214
- plugins: 100,
215
- pipelines: 20,
216
- apiCalls: 800_000,
217
- automationCalls: 210_000,
218
- aiCalls: 1_600,
219
- cpuCredits: 45_000,
220
- storageBytes: 120 * GB,
221
- dashboards: -1,
222
- alertRules: -1,
223
- alertDestinations: -1,
224
- idpConfigs: 10,
225
- listings: 50,
226
- seats: 8,
227
- supportContacts: 0,
228
- supportPremiumContacts: 0,
229
- eventRetentionDays: 30,
230
- doraRetentionDays: 180,
231
- },
232
- // Enterprise ($599, held): the all-inclusive tier — 15 seats, 30 pipelines, ALL
233
- // premium features included (see TIER_FEATURES). FAIR-USE — cost drivers (apiCalls,
234
- // aiCalls, storageBytes) capped so one account can't run up unbounded
235
- // compute/provider/storage cost on a flat price; cheap count-quotas stay -1.
236
- enterprise: {
237
- plugins: 150,
238
- pipelines: 30,
239
- apiCalls: 1_500_000,
240
- automationCalls: 310_000,
241
- aiCalls: 3_000,
242
- cpuCredits: 67_500,
243
- storageBytes: 250 * GB,
244
- dashboards: -1,
245
- alertRules: -1,
246
- alertDestinations: -1,
247
- idpConfigs: -1,
248
- listings: 100,
249
- seats: 15,
250
- supportContacts: 0,
251
- supportPremiumContacts: 0,
252
- eventRetentionDays: 30,
253
- doraRetentionDays: 180,
254
- },
255
- // Unlimited: EVERY quota uncapped (-1). The default when billing is disabled
256
- // (no enforcement surface) — never shown/selectable when billing is enabled.
257
- unlimited: {
258
- plugins: -1,
259
- pipelines: -1,
260
- apiCalls: -1,
261
- automationCalls: -1,
262
- aiCalls: -1,
263
- cpuCredits: -1,
264
- storageBytes: -1,
265
- dashboards: -1,
266
- alertRules: -1,
267
- alertDestinations: -1,
268
- idpConfigs: -1,
269
- listings: -1,
270
- seats: -1,
271
- supportContacts: -1,
272
- supportPremiumContacts: -1,
273
- eventRetentionDays: -1,
274
- doraRetentionDays: -1,
275
- },
276
- };
277
68
  /**
278
69
  * Read a tier LIMIT env var. `-1` = unlimited; anything below that is nonsense
279
70
  * (a `-5` limit would ship a broken finite cap), so it falls back to the code
@@ -304,38 +95,39 @@ function tierLimits(tier) {
304
95
  }
305
96
  const d = DEFAULT_TIER_LIMITS[tier];
306
97
  const T = tier.toUpperCase();
307
- return {
308
- plugins: tierLimitEnv(`QUOTA_TIER_${T}_PLUGINS`, d.plugins),
309
- pipelines: tierLimitEnv(`QUOTA_TIER_${T}_PIPELINES`, d.pipelines),
310
- apiCalls: tierLimitEnv(`QUOTA_TIER_${T}_API_CALLS`, d.apiCalls),
311
- automationCalls: tierLimitEnv(`QUOTA_TIER_${T}_AUTOMATION_CALLS`, d.automationCalls),
312
- aiCalls: tierLimitEnv(`QUOTA_TIER_${T}_AI_CALLS`, d.aiCalls),
313
- storageBytes: tierLimitEnv(`QUOTA_TIER_${T}_STORAGE_BYTES`, d.storageBytes),
314
- cpuCredits: tierLimitEnv(`QUOTA_TIER_${T}_CPU_CREDITS`, d.cpuCredits),
315
- dashboards: tierLimitEnv(`QUOTA_TIER_${T}_DASHBOARDS`, d.dashboards),
316
- alertRules: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_RULES`, d.alertRules),
317
- alertDestinations: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_DESTINATIONS`, d.alertDestinations),
318
- idpConfigs: tierLimitEnv(`QUOTA_TIER_${T}_IDP_CONFIGS`, d.idpConfigs),
319
- listings: tierLimitEnv(`QUOTA_TIER_${T}_LISTINGS`, d.listings),
320
- seats: tierLimitEnv(`QUOTA_TIER_${T}_SEATS`, d.seats),
321
- supportContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_CONTACTS`, d.supportContacts),
322
- supportPremiumContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_PREMIUM_CONTACTS`, d.supportPremiumContacts),
323
- eventRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_EVENT_RETENTION_DAYS`, d.eventRetentionDays),
324
- doraRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_DORA_RETENTION_DAYS`, d.doraRetentionDays),
325
- };
98
+ // Keyed off the limits table rather than seventeen hand-written lines, so a
99
+ // newly-added limit is env-overridable the moment it has a default — the hand
100
+ // list made that a second edit, in a file where forgetting it yields a knob
101
+ // the docs describe and the code ignores.
102
+ const out = { ...d };
103
+ for (const field of Object.keys(out)) {
104
+ // The knob names are DERIVED from the field names (`envNameFragment`), which
105
+ // is why `test/quota-tiers.test.ts` pins the full set of seventeen: a field
106
+ // rename would otherwise move somebody's configured knob without a word.
107
+ out[field] = tierLimitEnv(`QUOTA_TIER_${T}_${envNameFragment(field)}`, d[field]);
108
+ }
109
+ return out;
326
110
  }
327
- // Labels are overridable via `QUOTA_TIER_<TIER>_LABEL` (display name only).
328
- export const QUOTA_TIERS = {
329
- developer: { label: envStr('QUOTA_TIER_DEVELOPER_LABEL', 'Developer'), limits: tierLimits('developer') },
330
- pro: { label: envStr('QUOTA_TIER_PRO_LABEL', 'Pro'), limits: tierLimits('pro') },
331
- team: { label: envStr('QUOTA_TIER_TEAM_LABEL', 'Team'), limits: tierLimits('team') },
332
- business: { label: envStr('QUOTA_TIER_BUSINESS_LABEL', 'Business'), limits: tierLimits('business') },
333
- enterprise: { label: envStr('QUOTA_TIER_ENTERPRISE_LABEL', 'Enterprise'), limits: tierLimits('enterprise') },
334
- unlimited: { label: envStr('QUOTA_TIER_UNLIMITED_LABEL', 'Unlimited'), limits: tierLimits('unlimited') },
335
- };
336
- /** All valid tier names (incl. `unlimited`). Used for validation of a *stored*
337
- * tier — `unlimited` is a valid value even though it's never offered for sale. */
338
- export const VALID_TIERS = Object.keys(QUOTA_TIERS);
111
+ /** All valid tier names (incl. `unlimited`), in ladder order. Used for validation
112
+ * of a *stored* tier — `unlimited` is a valid value even though it's never
113
+ * offered for sale. Derived from the code-default limits table, which is the one
114
+ * place a tier cannot be added without being given numbers. */
115
+ export const VALID_TIERS = Object.keys(DEFAULT_TIER_LIMITS);
116
+ /**
117
+ * Every tier's preset, keyed off {@link VALID_TIERS} rather than written out
118
+ * tier by tier — a tier added to the limits table gets its preset here with no
119
+ * second edit.
120
+ *
121
+ * The label defaults to {@link tierLabel} of the key ("business" → "Business",
122
+ * "pro_plus" → "Pro Plus"), which is what all six were spelled as by hand, and
123
+ * stays overridable via `QUOTA_TIER_<TIER>_LABEL` for a deployment that wants its
124
+ * own wording — or for a key the derivation cannot get right, such as an acronym.
125
+ * Display name only: it never affects a limit.
126
+ */
127
+ export const QUOTA_TIERS = Object.fromEntries(VALID_TIERS.map((tier) => [tier, {
128
+ label: envStr(`QUOTA_TIER_${tier.toUpperCase()}_LABEL`, tierLabel(tier)),
129
+ limits: tierLimits(tier),
130
+ }]));
339
131
  /** The standard, billing-selectable tiers — the ones offered as purchasable plans
340
132
  * and shown in tier pickers. Derived as "every valid tier except `unlimited`",
341
133
  * which is the billing-DISABLED default and is never displayed/selectable when
@@ -430,4 +222,4 @@ export function nextQuotaResetDate(days = QUOTA_RESET_DAYS, now = new Date()) {
430
222
  date.setHours(0, 0, 0, 0);
431
223
  return date;
432
224
  }
433
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFIMUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNyQyxXQUFXLEVBQUU7UUFDWCxhQUFhLEVBQUUsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLFlBQVksRUFBRSxDQUFDO1FBQ2Ysb0JBQW9CLEVBQUUsQ0FBQztRQUN2QixnQkFBZ0IsRUFBRSxDQUFDO1FBQ25CLGFBQWEsRUFBRSxFQUFFO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFLEVBQUU7SUFDZCwwQkFBMEIsRUFBRSxDQUFDO0lBQzdCLGlFQUFpRTtJQUNqRSxnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLHdDQUF3QztJQUN4QyxRQUFRLEVBQUUsSUFBSTtJQUNkLCtDQUErQztJQUMvQyxPQUFPLEVBQUUsTUFBTTtDQUNQLENBQUM7QUFFWCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsVUFBVSxHQUFXLENBQUM7SUFDMUUsTUFBTSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFD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RTtJQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEF2YWlsYWJsZSBxdW90YSB0aWVyIGlkZW50aWZpZXJzLlxuICpcbiAqIGB1bmxpbWl0ZWRgIGlzIGEgc3BlY2lhbCB0aWVyOiBldmVyeSBxdW90YSBpcyBgLTFgICh1bmNhcHBlZCkgYW5kIGl0IGluY2x1ZGVzXG4gKiBldmVyeSBmZWF0dXJlL2FkZC1vbiBidW5kbGUuIEl0IGlzIHRoZSBERUZBVUxUIHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZCAobm9cbiAqIG1ldGVyaW5nL2VuZm9yY2VtZW50IHN1cmZhY2UgZXhpc3RzLCBzbyBub3RoaW5nIGlzIGNhcHBlZCksIGFuZCBpdCBpcyBORVZFUlxuICogc2hvd24gb3Igc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCDigJQgc2VlIGBTVEFOREFSRF9USUVSU2AuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3RlYW0nIHwgJ2J1c2luZXNzJyB8ICdlbnRlcnByaXNlJyB8ICd1bmxpbWl0ZWQnO1xuXG4vKiogTGltaXQgdmFsdWVzIGZvciBlYWNoIHF1b3RhIHR5cGUgd2l0aGluIGEgdGllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyTGltaXRzIHtcbiAgcGx1Z2luczogbnVtYmVyO1xuICBwaXBlbGluZXM6IG51bWJlcjtcbiAgYXBpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE1ldGVyZWQgQVBJIGNhbGxzIG1hZGUgYnkgT1JHIFNFUlZJQ0UgQUNDT1VOVFMgKGF1dG9tYXRpb24pLCBjb3VudGVkXG4gICAqIGluc3RlYWQgb2YgYGFwaUNhbGxzYCBzbyBwaXBlbGluZXMgY2FuJ3Qgc3RhcnZlIHRoZSBvcmcncyBwZW9wbGUuIFNlZVxuICAgKiB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvciBob3cgdGhlIGRlZmF1bHRzIGFyZSBkZXJpdmVkLlxuICAgKi9cbiAgYXV0b21hdGlvbkNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiB2Q1BVLU1JTlVURVMgb2YgcGx1Z2luLWJ1aWxkIGNvbXB1dGUgcGVyIE1PTlRIIOKAlCB0aGUgb25lIHF1b3RhIG9uIGEgcGVyaW9kXG4gICAqIG9mIGl0cyBvd24gKGV2ZXJ5IG90aGVyIGZsb3cgcXVvdGEgcm9sbHMgb24gYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpLlxuICAgKlxuICAgKiBEZXJpdmVkIGZyb20gdGhlIGBwbHVnaW5zYCBjYXAgcmF0aGVyIHRoYW4gZ3Vlc3NlZDogYHBsdWdpbnMgeCAxMGAgYnVpbGRzIGFcbiAgICogbW9udGgsIGF0IGEgZmxhdCAzMCB3YWxsLW1pbnV0ZXMgYSBidWlsZCBhbmQgMS41IHZDUFUgb2YgYnVpbGRraXRkLCBzb1xuICAgKiBgY3JlZGl0cyA9IGJ1aWxkcyB4IDQ1YC4gVGhlIGZsYXQgcGVyLWJ1aWxkIGZpZ3VyZSBpcyBkZWxpYmVyYXRlIOKAlCBzY2FsaW5nXG4gICAqIEJPVEggdGhlIGJ1aWxkIGNvdW50IGFuZCB0aGUgcGVyLWJ1aWxkIGNvc3QgYnkgdGllciBtYWRlIGNyZWRpdHNcbiAgICogc3VwZXJsaW5lYXIgaW4gdGllciBvbiB0aGUgc3RyZW5ndGggb2YgYW4gdW5tZWFzdXJlZCBjbGFpbSwgYW5kIGl0IG1hZGUgYVxuICAgKiBwYWNrJ3MgY3JlZGl0IGdyYW50IHRpZXItZGVwZW5kZW50LCB3aGljaCB0aGUgY2F0YWxvZ3VlJ3MgZ3JhbnQgc2hhcGUgY2Fubm90XG4gICAqIGV4cHJlc3MuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIGdlbnVpbmUgcGVyLXVuaXQgbWFyZ2luYWwgY29zdDogZXZlcnkgb3RoZXJcbiAgICogcXVvdGEgaXMgYSByYXRlIGxpbWl0IHByb3RlY3Rpbmcgc2hhcmVkIGluZnJhc3RydWN0dXJlLCB0aGlzIG9uZSBpcyBjb21wdXRlXG4gICAqIHRoZSBwbGF0Zm9ybSBwYXlzIGZvci4gU2VlIGBkb2NzL3BsYW5zL2NwdS1jcmVkaXRzLm1kYC5cbiAgICovXG4gIGNwdUNyZWRpdHM6IG51bWJlcjtcbiAgLyoqIENvdW50LXF1b3RhcyBvbiB0aGUgdXNlci1lZGl0YWJsZSBmZWF0dXJlIHRhYmxlcyBhZGRlZCB0byBjbG9zZSBwZXItb3JnXG4gICAqICBEb1MgdmlhIHNwYW0uIC0xIG1lYW5zIHVubGltaXRlZC4gKi9cbiAgZGFzaGJvYXJkczogbnVtYmVyO1xuICBhbGVydFJ1bGVzOiBudW1iZXI7XG4gIGFsZXJ0RGVzdGluYXRpb25zOiBudW1iZXI7XG4gIGlkcENvbmZpZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFjdGl2ZSwgbm9uLXN1c3BlbmRlZCBwbHVnaW4tZWNvc3lzdGVtIGxpc3RpbmdzIHRoZSBvcmcgcHVibGlzaGVzXG4gICAqIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS4gQSBDT1VOVCBxdW90YSDigJQgaW5zdGFsbHMgbmV2ZXJcbiAgICogY291bnQuIC0xID0gdW5saW1pdGVkLiBFeHRlbmRhYmxlIHZpYSB0aGUgYGxpc3RpbmdfcGFja2AgYWRkLW9uIGJ1bmRsZS5cbiAgICovXG4gIGxpc3RpbmdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXggb3JnIG1lbWJlcnMgKGFjdGl2ZSB1c2VycyAvIHNlYXRzKS4gLTEgPSB1bmxpbWl0ZWQuIFRoaXMgaXMgdGhlIFwiVGVhbVwiXG4gICAqIHRpZXIgZGlmZmVyZW50aWF0b3Ig4oCUIGVuZm9yY2VkIGF0IG1lbWJlci1pbnZpdGUgdGltZSAoYW4gaW52aXRlIGlzIGJsb2NrZWRcbiAgICogd2hlbiBhY3RpdmUgbWVtYmVycyArIHBlbmRpbmcgaW52aXRlcyB3b3VsZCBleGNlZWQgdGhpcykuXG4gICAqL1xuICBzZWF0czogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IGRlc2lnbmF0ZWQgU1VQUE9SVCBDT05UQUNUUyDigJQgdGhlIG1lbWJlcnMgYXV0aG9yaXNlZCB0byBvcGVuIHN1cHBvcnRcbiAgICogY2FzZXMuIC0xID0gdW5saW1pdGVkLiBCYXNlIGlzICoqMCBvbiBldmVyeSB0aWVyKio6IHN1cHBvcnQgaXMgYW4gYWRkLW9uIGF0XG4gICAqIGV2ZXJ5IHRpZXIgYW5kIGluY2x1ZGVkIGluIG5vbmUsIHNvIGFuIG9yZyB3aXRoIG5vIHN1cHBvcnQgYnVuZGxlIGhhcyBub1xuICAgKiBjb250YWN0cyBhbmQgY2Fubm90IG9wZW4gYSBjYXNlLiBUaGF0IG1ha2VzIHRoZSBzdXBwb3J0IHBheXdhbGwgYSBxdW90YVxuICAgKiBjaGVjayByYXRoZXIgdGhhbiBhIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogTGlrZSBgc2VhdHNgIHRoaXMgaXMgYSB0aWVyIExJTUlULCBub3QgYSB0cmFja2VkIGNvdW50ZXIg4oCUIGVuZm9yY2VkIGxpdmUgYXRcbiAgICogZGVzaWduYXRpb24gdGltZSBhZ2FpbnN0IGN1cnJlbnQgZGVzaWduYXRpb25zIGFjcm9zcyB0aGUgb3JnIHN1YnRyZWUuXG4gICAqIEV4dGVuZGVkIHBlciB1bml0IGJ5IHRoZSBgc3VwcG9ydF9zdGFuZGFyZGAgLyBgc3VwcG9ydF9wcmlvcml0eWAgQkFTRUxJTkVcbiAgICogYnVuZGxlcywgd2hpY2ggYXJlIHByaWNlZCBwZXIgY29udGFjdC5cbiAgICovXG4gIHN1cHBvcnRDb250YWN0czogbnVtYmVyO1xuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhvc2UgY29udGFjdHMgbWF5IGJlIFVQR1JBREVEIHRvIHByZW1pdW0gKDI0w5c3LCA4LWhvdXJcbiAgICogcmVzcG9uc2UsIGFuZCB0aGUgb25seSBvbmVzIHdobyBtYXkgZGVjbGFyZSBgdXJnZW50YCkuXG4gICAqXG4gICAqIEEgc2Vjb25kIGRpbWVuc2lvbiByYXRoZXIgdGhhbiBhIHRoaXJkIGJhc2VsaW5lIGxldmVsLCBiZWNhdXNlIHByZW1pdW0gaXMgYW5cbiAgICogVVBHUkFERSBhbmQgbm90IGFuIGFsdGVybmF0aXZlLiBUaGUgc2hhcGUgaXQgZW5jb2RlczogYW4gb3JnIGJ1eXMgTiBiYXNlbGluZVxuICAgKiBjb250YWN0cyBhbmQgdXBncmFkZXMgTSBvZiB0aGVtLCBNIOKJpCBOLiBUaGF0IGlzIHdoYXQgbGV0cyBhIDEwMC1zZWF0XG4gICAqIGN1c3RvbWVyIGdpdmUgYnVzaW5lc3MtaG91cnMgc3VwcG9ydCB0byBpdHMgdGhyZWUgbmFtZWQgY29udGFjdHMgYW5kIDI0w5c3XG4gICAqIHRvIHRoZSBvbmUgd2hvIGNhcnJpZXMgdGhlIHBhZ2VyIOKAlCB0aGUgY2FzZSB0aGUgbXV0dWFsbHktZXhjbHVzaXZlIGxhZGRlclxuICAgKiBjb3VsZCBub3QgZXhwcmVzcyBhdCBhbGwsIHdoZXJlIGJ1eWluZyBcIjk5IHN0YW5kYXJkICsgMSBwcmVtaXVtXCIgY2hhcmdlZCBmb3JcbiAgICogMTAwIHVuaXRzIGFuZCBncmFudGVkIG9uZSBjb250YWN0LlxuICAgKlxuICAgKiBBRERJVElWRSwgZGVsaWJlcmF0ZWx5LiBBIHByZW1pdW0gY29udGFjdCBjb3N0cyB0aGUgYmFzZWxpbmUgdW5pdCBQTFVTIHRoZVxuICAgKiB1cGdyYWRlICgkMTkuOTkgKyAkOTkuOTkpLCBiZWNhdXNlIGl0IGlzIHNlcnZlZCBkdXJpbmcgYnVzaW5lc3MgaG91cnNcbiAgICogdGhyb3VnaCB0aGUgYmFzZWxpbmUgYW5kIG92ZXJuaWdodCB0aHJvdWdoIHRoZSB1cGdyYWRlOyBwcmljaW5nIHRoZSB1cGdyYWRlXG4gICAqIGFzIGEgZGVsdGEgd291bGQgcHJldGVuZCB0aGUgYmFzZWxpbmUgd2VyZSBmcmVlLiBCYXNlIDAgb24gZXZlcnkgdGllciwgbGlrZVxuICAgKiBgc3VwcG9ydENvbnRhY3RzYCwgc28gdGhlIHBheXdhbGwgc3RheXMgYSBxdW90YSBjaGVjay5cbiAgICovXG4gIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDI1IEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyB0aGUgYGF1dG9tYXRpb25DYWxsc2AgZGVmYXVsdHMgYXJlIHNpemVkIOKAlCB3cml0dGVuIGRvd24gc28gdGhlIG5leHRcbiAqIHBlcnNvbiB0byB0b3VjaCB0aGVtIGFyZ3VlcyB3aXRoIHRoZSBhcml0aG1ldGljLCBub3Qgd2l0aCB0aGUgbnVtYmVycy5cbiAqXG4gKiBFdmVyeSBjYWxsIGFuIG9yZydzIGF1dG9tYXRpb24ga2V5cyBtYWtlIGluIG9uZSBwaXBlbGluZSBSVU4sIGl0ZW1pemVkICh0aGVcbiAqIGVhcmxpZXIgc2l6aW5nIGNvdW50ZWQgb25seSB0aGUgcGx1Z2luIGxvb2t1cHMgYW5kIGhhbmQtd2F2ZWQgdGhlIHJlc3QgYXNcbiAqIFwiw5cyXCIpOlxuICpcbiAqICAgcGx1Z2luIGxvb2t1cHMgICAgICAgICAgICAxMiAgIG9uZSBwZXIgcGx1Z2luIHN0ZXAgKHNlbGYtbXV0YXRpbmcgcGlwZWxpbmUpXG4gKiAgIHN5bnRoICAgICAgICAgICAgICAgICAgICAgIDEgICB0aGUgc3ludGggc3RlcCBmZXRjaGluZyB0aGUgcGlwZWxpbmUgY29uZmlnXG4gKiAgIHJ1bnRpbWUgY2hlY2sgICAgICAgICAgICAgIDEgICB0aGUgcHJlLWRlcGxveSBydW50aW1lLWNoZWNrIGNhbGxcbiAqICAgc2VjdXJpdHktcmVwb3J0IHVwbG9hZCAgICAgMSAgIHRoZSBzY2FuIHN0ZXAgcG9zdGluZyBpdHMgcmVwb3J0XG4gKiAgIHJlZ2lzdHJ5IHJlZ2lzdGVyICAgICAgICAgIDEgICBwaXBlbGluZS1yZWdpc3RlciBzdGFtcGluZyB0aGUgZGVwbG95ZWQgdmVyc2lvblxuICogICByZXBvcnRpbmcgaW5nZXN0IGJhdGNoZXMgIDEyICAgdGhlIGV2ZW50IGZvcndhcmRlciBwb3N0cyB+b25lIGJhdGNoIHBlciBhY3Rpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ICAgY2FsbHMgcGVyIHJ1blxuICpcbiAqIFBlciBkZWZhdWx0IHBlcmlvZCAoYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpIG9uZSBhY3RpdmUgcGlwZWxpbmUgcnVubmluZ1xuICogaG91cmx5IG1ha2VzIDI4IMOXIDI0IMOXIDMgPSAyLDAxNiBjYWxscy4gQW4gb3JnIGtlZXBzIGZhciBtb3JlIHBpcGVsaW5lcyBhbGl2ZVxuICogdGhhbiBpdCBDUkVBVEVTIGluIGEgcGVyaW9kIChgcGlwZWxpbmVzYCBpcyBhIGNyZWF0aW9uIHJhdGUpLCBzbyBhY3RpdmVcbiAqIHBpcGVsaW5lcyBhcmUgdGFrZW4gYXMgNMOXIHRoZSB0aWVyJ3MgYHBpcGVsaW5lc2AuIE9uIHRvcCBzaXRzIGEgcGVyLU9SR1xuICogY29uc3RhbnQgdGhhdCBkb2VzIG5vdCBzY2FsZSB3aXRoIHBpcGVsaW5lczogdGhlIGluZ2VzdC1oZWFsdGggaGVhcnRiZWF0XG4gKiAo4omkIDEvbWludXRlIOKGkiAxLDQ0MC9kYXkg4oaSIDQsMzIwL3BlcmlvZCkuIFRoZSBzdW0gZ2V0cyAyNSUgaGVhZHJvb20gKHJldHJpZXMsXG4gKiByZWdpc3RyeSBwdXNoZXMsIGFkLWhvYyBDSSBzY3JpcHRzIG9uIGtleXMpIGFuZCByb3VuZHMgVVAgdG8gdGhlIG5leHQgMTAsMDAwOlxuICpcbiAqICAgZGV2ZWxvcGVyICAgMsOXNMOXMjAxNiArIDQzMjAgPSAgMjAsNDQ4IMOXIDEuMjUgPSAgMjUsNTYwIOKGkiAgMzAsMDAwXG4gKiAgIHBybyAgICAgICAgIDXDlzTDlzIwMTYgKyA0MzIwID0gIDQ0LDY0MCDDlyAxLjI1ID0gIDU1LDgwMCDihpIgIDYwLDAwMFxuICogICB0ZWFtICAgICAgIDEww5c0w5cyMDE2ICsgNDMyMCA9ICA4NCw5NjAgw5cgMS4yNSA9IDEwNiwyMDAg4oaSIDExMCwwMDBcbiAqICAgYnVzaW5lc3MgICAyMMOXNMOXMjAxNiArIDQzMjAgPSAxNjUsNjAwIMOXIDEuMjUgPSAyMDcsMDAwIOKGkiAyMTAsMDAwXG4gKiAgIGVudGVycHJpc2UgMzDDlzTDlzIwMTYgKyA0MzIwID0gMjQ2LDI0MCDDlyAxLjI1ID0gMzA3LDgwMCDihpIgMzEwLDAwMFxuICpcbiAqIHtAbGluayBhdXRvbWF0aW9uQ2FsbHNGb3J9IGNvbXB1dGVzIGV4YWN0bHkgdGhpcywgYW5kIHRoZSB0aWVyIHRlc3RzIGhvbGQgdGhlXG4gKiB0YWJsZSB0byBpdC4gT3ZlciB0aGUgY2FwIHRoZSA0MjkgaXMgU09GVCBmb3IgYSBiYW5kICh7QGxpbmsgcXVvdGFHcmFjZVBjdH0pOlxuICogYSBzZWxmLW11dGF0aW5nIHBpcGVsaW5lIHRoYXQgaGFyZC1zdG9wcGVkIGF0IDEwMCUgc3RheWVkIHN0b3BwZWQgdW50aWwgdGhlXG4gKiBwZXJpb2QgcmVzZXQsIHVwIHRvIDMgZGF5cy4gVGhlIGxpbWl0cyBhcmUgUEVSIFBFUklPRDogYW4gb3BlcmF0b3Igd2hvXG4gKiBsZW5ndGhlbnMgYFFVT1RBX1JFU0VUX0RBWVNgIHNob3VsZCBzY2FsZSBgUVVPVEFfVElFUl88VElFUj5fQVVUT01BVElPTl9DQUxMU2BcbiAqIGJ5IHRoZSBzYW1lIGZhY3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQ0FMTFNfU0laSU5HID0ge1xuICBjYWxsc1BlclJ1bjoge1xuICAgIHBsdWdpbkxvb2t1cHM6IDEyLFxuICAgIHN5bnRoOiAxLFxuICAgIHJ1bnRpbWVDaGVjazogMSxcbiAgICBzZWN1cml0eVJlcG9ydFVwbG9hZDogMSxcbiAgICByZWdpc3RyeVJlZ2lzdGVyOiAxLFxuICAgIGluZ2VzdEJhdGNoZXM6IDEyLFxuICB9LFxuICBydW5zUGVyRGF5OiAyNCxcbiAgYWN0aXZlUGlwZWxpbmVzUGVyQ3JlYXRpb246IDQsXG4gIC8qKiBJbmdlc3QtaGVhbHRoIGhlYXJ0YmVhdHMgcGVyIG9yZyBwZXIgZGF5ICjiiaQgb25lIGEgbWludXRlKS4gKi9cbiAgaGVhcnRiZWF0c1BlckRheTogMTQ0MCxcbiAgLyoqIE11bHRpcGxpZXIgb24gdGhlIGl0ZW1pemVkIHRvdGFsLiAqL1xuICBoZWFkcm9vbTogMS4yNSxcbiAgLyoqIERlZmF1bHRzIHJvdW5kIFVQIHRvIGEgbXVsdGlwbGUgb2YgdGhpcy4gKi9cbiAgcm91bmRUbzogMTBfMDAwLFxufSBhcyBjb25zdDtcblxuLyoqIFRoZSB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvcm11bGEgZm9yIGEgdGllciBjcmVhdGluZyBgcGlwZWxpbmVzYCBwZXIgcGVyaW9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9tYXRpb25DYWxsc0ZvcihwaXBlbGluZXM6IG51bWJlciwgcGVyaW9kRGF5czogbnVtYmVyID0gMyk6IG51bWJlciB7XG4gIGNvbnN0IHMgPSBBVVRPTUFUSU9OX0NBTExTX1NJWklORztcbiAgY29uc3QgcGVyUnVuID0gT2JqZWN0LnZhbHVlcyhzLmNhbGxzUGVyUnVuKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgY29uc3QgcGVyUGlwZWxpbmUgPSBwZXJSdW4gKiBzLnJ1bnNQZXJEYXkgKiBwZXJpb2REYXlzO1xuICBjb25zdCB0b3RhbCA9IChwaXBlbGluZXMgKiBzLmFjdGl2ZVBpcGVsaW5lc1BlckNyZWF0aW9uICogcGVyUGlwZWxpbmUgKyBzLmhlYXJ0YmVhdHNQZXJEYXkgKiBwZXJpb2REYXlzKSAqIHMuaGVhZHJvb207XG4gIHJldHVybiBNYXRoLmNlaWwodG90YWwgLyBzLnJvdW5kVG8pICogcy5yb3VuZFRvO1xufVxuXG4vKipcbiAqIFRoZSBTT0ZUIGJhbmQgYWJvdmUgYSBxdW90YSdzIGNhcCwgcGVyIHR5cGUsIGluIHBlcmNlbnQgb2YgdGhlIGxpbWl0LiBBIHR5cGVcbiAqIGFic2VudCBmcm9tIHRoaXMgbWFwIGhhcyBOTyBiYW5kIGFuZCBzdG9wcyBoYXJkIGF0IDEwMCUuXG4gKlxuICogQXQgMTAwJSB0aGUgYWNjb3VudCBnZXRzIHRoZSBcInJlYWNoZWRcIiBub3RpY2UgYW5kIGtlZXBzIHJ1bm5pbmc7IHRoZSByZWZ1c2FsXG4gKiBzdGFydHMgb25seSBwYXN0IGBsaW1pdCDDlyAoMTAwICsgcGN0KSAvIDEwMGAuIFJlYWRzIHN0aWxsIFJFUE9SVCB0aGUgbm9taW5hbFxuICogbGltaXQsIHNvIHVzYWdlIHNob3dzIGFib3ZlIDEwMCUgd2hpbGUgaW5zaWRlIHRoZSBiYW5kLlxuICpcbiAqIFR3byB0eXBlcyBxdWFsaWZ5LCBmb3IgdGhlIHNhbWUgcmVhc29uIHN0YXRlZCB0d28gd2F5cyDigJQgYSBoYXJkIHN0b3AgZXhhY3RseVxuICogYXQgMTAwJSBpcyB3b3JzZSB0aGFuIGEgc2hvcnQgb3ZlcnJ1biB3aGVuIHRoZSBjYWxsZXIgY2Fubm90IHNpbXBseSB3YWl0OlxuICpcbiAqIC0gYGF1dG9tYXRpb25DYWxsc2AgKGBRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVGApOiB0aGUgY2FsbGVyIGlzIGEgcGlwZWxpbmVcbiAqICAgbWlkLWRlcGxveSwgbm90IGEgcGVyc29uLCBhbmQgdGhlIGNvdW50ZXIgd291bGQgc3RheSBmdWxsIGZvciB0aGUgcmVzdCBvZlxuICogICB0aGUgcGVyaW9kLlxuICogLSBgc3RvcmFnZUJ5dGVzYCAoYFFVT1RBX1NUT1JBR0VfR1JBQ0VfUENUYCk6IHN0b3JhZ2UgaXMgYSBTVE9DSyDigJQgaXQgZG9lc1xuICogICBub3QgcmVzZXQsIHNvIHdpdGhvdXQgYSBiYW5kIGEgZG93bmdyYWRlIG9yIGEgY2FuY2VsbGVkIHBhY2sgZmxpcHMgYW5cbiAqICAgYWNjb3VudCBmcm9tIHdvcmtpbmcgdG8gcmVmdXNlZCB3aXRoIG5vIGJ1ZmZlciBhdCBhbGwsIGFuZCB0aGUgcmVtZWR5XG4gKiAgIChwcnVuZSwgb3IgYnV5IGNhcGFjaXR5KSB0YWtlcyB0aW1lIHRoZSBiYW5kIGlzIHRoZXJlIHRvIHByb3ZpZGUuIE5vdGUgdGhlXG4gKiAgIGJhbmQgb24gYSBzdG9jayBpcyBhIE9ORS1USU1FIGJ1ZmZlciByYXRoZXIgdGhhbiBhIHBlci1wZXJpb2Qgb25lOyB0aGF0IGlzXG4gKiAgIGl0cyBwdXJwb3NlIGhlcmUsIG5vdCBhIGxpbWl0YXRpb24gb2YgaXQuXG4gKlxuICogRXZlcnkgb3RoZXIgdHlwZSBzdGF5cyBoYXJkLiBUaGlzIHdhcyBhIGhhcmRjb2RlZCBgcXVvdGFUeXBlICE9PVxuICogJ2F1dG9tYXRpb25DYWxscydgIGNvbXBhcmlzb24sIHdoaWNoIGlzIHdoeSBzdG9yYWdlIGhhZCBub3RoaW5nOiB0aGVcbiAqIG1lY2hhbmlzbSBleGlzdGVkIGFuZCBvbmx5IHRoZSBwcmVkaWNhdGUgZXhjbHVkZWQgaXQuXG4gKi9cbmNvbnN0IFFVT1RBX0dSQUNFX1BDVDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7XG4gIGF1dG9tYXRpb25DYWxsczogZW52SW50KCdRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG4gIHN0b3JhZ2VCeXRlczogZW52SW50KCdRVU9UQV9TVE9SQUdFX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG59O1xuXG4vKiogVGhlIHNvZnQgYmFuZCBmb3IgYHF1b3RhVHlwZWAgaW4gcGVyY2VudCwgb3IgMCBmb3IgYSB0eXBlIHRoYXQgc3RvcHMgaGFyZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YUdyYWNlUGN0KHF1b3RhVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIFFVT1RBX0dSQUNFX1BDVFtxdW90YVR5cGVdID8/IDA7XG59XG5cbi8qKlxuICogVGhlIGxpbWl0IGVuZm9yY2VtZW50IGFjdHVhbGx5IGJpbmRzIG9uIGZvciBgcXVvdGFUeXBlYDogdGhlIG5vbWluYWwgbGltaXQsXG4gKiBwbHVzIHRoZSB0eXBlJ3Mge0BsaW5rIHF1b3RhR3JhY2VQY3R9IGJhbmQgd2hlcmUgaXQgaGFzIG9uZS4gVW5saW1pdGVkICgtMSlcbiAqIGFuZCB6ZXJvIChcIm5vbmVcIikgbGltaXRzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQg4oCUIGEgMCBjYXAgaXMgYSBkZWxpYmVyYXRlXG4gKiByZWZ1c2FsLCBub3QgYSBidWRnZXQgdG8gb3ZlcnJ1bi5cbiAqXG4gKiB7QGxpbmsgUVVPVEFfR1JBQ0VfUENUfSBkZWNpZGVzIFdIRVRIRVIgYSB0eXBlIGhhcyBhIGJhbmQ7IGBncmFjZVBjdGAgb25seVxuICogc2l6ZXMgaXQuIFNvIGFuIGV4cGxpY2l0IHBlcmNlbnRhZ2UgcGFzc2VkIGZvciBhbiB1bmJhbmRlZCB0eXBlIHN0aWxsIHlpZWxkc1xuICogdGhlIG5vbWluYWwgbGltaXQsIHJhdGhlciB0aGFuIHF1aWV0bHkgZ3JhbnRpbmcgYSBiYW5kIHRoZSB0eXBlIGlzIG5vdCBtZWFudFxuICogdG8gaGF2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZm9yY2VkUXVvdGFMaW1pdChxdW90YVR5cGU6IHN0cmluZywgbGltaXQ6IG51bWJlciwgZ3JhY2VQY3Q6IG51bWJlciA9IHF1b3RhR3JhY2VQY3QocXVvdGFUeXBlKSk6IG51bWJlciB7XG4gIGlmIChsaW1pdCA8PSAwIHx8IGdyYWNlUGN0IDw9IDAgfHwgcXVvdGFHcmFjZVBjdChxdW90YVR5cGUpIDw9IDApIHJldHVybiBsaW1pdDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKGxpbWl0ICogKDEwMCArIGdyYWNlUGN0KSkgLyAxMDApO1xufVxuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMTAsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYXV0b21hdGlvbkNhbGxzOiAzMF8wMDAsXG4gICAgYWlDYWxsczogMjAsXG4gICAgY3B1Q3JlZGl0czogNF81MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgbGlzdGluZ3M6IDMsXG4gICAgc2VhdHM6IDEsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDI1LFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMTAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDYwXzAwMCxcbiAgICBhaUNhbGxzOiAyMDAsXG4gICAgY3B1Q3JlZGl0czogMTFfMjUwLFxuICAgIHN0b3JhZ2VCeXRlczogMjUgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAyMDAsXG4gICAgYWxlcnRSdWxlczogNTAwLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiA1MCxcbiAgICBpZHBDb25maWdzOiA1LFxuICAgIGxpc3RpbmdzOiAxMCxcbiAgICBzZWF0czogMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IDAsXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogMCxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFRlYW0gPSBjb2xsYWJvcmF0aW9uIHRpZXI7IHRoZSBzZWF0IGxpbWl0ICgzKSBpcyB0aGUgcmVhbCBkaWZmZXJlbnRpYXRvciBvdmVyXG4gIC8vIFBybyAoc2luZ2xlLXNlYXQpIOKAlCBpdCdzIHRoZSBtdWx0aS1zZWF0IGNvbGxhYm9yYXRpb24gZmxvb3IuIExlYW4gYmFzZSAoJDc5KTpcbiAgLy8gZ3Jvd3RoIHJpZGVzIHRoZSBzZWF0L3BpcGVsaW5lL2V0YyBhZGQtb25zIChsYW5kLWFuZC1leHBhbmQpLiBMaW1pdHMgc2l0XG4gIC8vIGJldHdlZW4gUHJvIGFuZCBFbnRlcnByaXNlLlxuICB0ZWFtOiB7XG4gICAgcGx1Z2luczogNTAsXG4gICAgcGlwZWxpbmVzOiAxMCxcbiAgICBhcGlDYWxsczogMzAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDExMF8wMDAsXG4gICAgYWlDYWxsczogNjAwLFxuICAgIGNwdUNyZWRpdHM6IDIyXzUwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDYwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDI1LFxuICAgIHNlYXRzOiAzLFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gQnVzaW5lc3MgKCQyNDkpOiB0aGUgc3RlcCB0aGUgJDc5IC0+ICQ1OTkgY2xpZmYgd2FzIG1pc3NpbmcuIDggc2VhdHMsIDIwXG4gIC8vIHBpcGVsaW5lcywgYW5kIERPUkEgKGFkdmFuY2VkX3JlcG9ydGluZykgaW5jbHVkZWQgcmF0aGVyIHRoYW4gYW4gYWRkLW9uLlxuICAvLyBFdmVyeSBjb3N0IGRyaXZlciBpcyAxMDAsMDAwIGFwaUNhbGxzIGFuZCAyMDAgYWlDYWxscyBQRVIgU0VBVCwgdGhlIHNhbWVcbiAgLy8gcGVyLXNlYXQgcmF0ZSBhcyBQcm8vVGVhbS9FbnRlcnByaXNlLCBzbyB0aGUgbGFkZGVyIHJlYWRzIGNvbnNpc3RlbnRseSB0byBhXG4gIC8vIGJ1eWVyIHdobyBkaXZpZGVzIGJ5IGhlYWRjb3VudC4gQ291bnQtcXVvdGFzIHRoYXQgVGVhbSBhbHJlYWR5IHVuY2FwcyBzdGF5XG4gIC8vIC0xOyBgaWRwQ29uZmlnc2Agc2l0cyBiZXR3ZWVuIFRlYW0ncyA1IGFuZCBFbnRlcnByaXNlJ3MgdW5saW1pdGVkLlxuICBidXNpbmVzczoge1xuICAgIHBsdWdpbnM6IDEwMCxcbiAgICBwaXBlbGluZXM6IDIwLFxuICAgIGFwaUNhbGxzOiA4MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMjEwXzAwMCxcbiAgICBhaUNhbGxzOiAxXzYwMCxcbiAgICBjcHVDcmVkaXRzOiA0NV8wMDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAxMjAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogMTAsXG4gICAgbGlzdGluZ3M6IDUwLFxuICAgIHNlYXRzOiA4LFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gRW50ZXJwcmlzZSAoJDU5OSwgaGVsZCk6IHRoZSBhbGwtaW5jbHVzaXZlIHRpZXIg4oCUIDE1IHNlYXRzLCAzMCBwaXBlbGluZXMsIEFMTFxuICAvLyBwcmVtaXVtIGZlYXR1cmVzIGluY2x1ZGVkIChzZWUgVElFUl9GRUFUVVJFUykuIEZBSVItVVNFIOKAlCBjb3N0IGRyaXZlcnMgKGFwaUNhbGxzLFxuICAvLyBhaUNhbGxzLCBzdG9yYWdlQnl0ZXMpIGNhcHBlZCBzbyBvbmUgYWNjb3VudCBjYW4ndCBydW4gdXAgdW5ib3VuZGVkXG4gIC8vIGNvbXB1dGUvcHJvdmlkZXIvc3RvcmFnZSBjb3N0IG9uIGEgZmxhdCBwcmljZTsgY2hlYXAgY291bnQtcXVvdGFzIHN0YXkgLTEuXG4gIGVudGVycHJpc2U6IHtcbiAgICBwbHVnaW5zOiAxNTAsXG4gICAgcGlwZWxpbmVzOiAzMCxcbiAgICBhcGlDYWxsczogMV81MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMzEwXzAwMCxcbiAgICBhaUNhbGxzOiAzXzAwMCxcbiAgICBjcHVDcmVkaXRzOiA2N181MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyNTAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IDEwMCxcbiAgICBzZWF0czogMTUsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBVbmxpbWl0ZWQ6IEVWRVJZIHF1b3RhIHVuY2FwcGVkICgtMSkuIFRoZSBkZWZhdWx0IHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZFxuICAvLyAobm8gZW5mb3JjZW1lbnQgc3VyZmFjZSkg4oCUIG5ldmVyIHNob3duL3NlbGVjdGFibGUgd2hlbiBiaWxsaW5nIGlzIGVuYWJsZWQuXG4gIHVubGltaXRlZDoge1xuICAgIHBsdWdpbnM6IC0xLFxuICAgIHBpcGVsaW5lczogLTEsXG4gICAgYXBpQ2FsbHM6IC0xLFxuICAgIGF1dG9tYXRpb25DYWxsczogLTEsXG4gICAgYWlDYWxsczogLTEsXG4gICAgY3B1Q3JlZGl0czogLTEsXG4gICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IC0xLFxuICAgIHNlYXRzOiAtMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IC0xLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IC0xLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogLTEsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IC0xLFxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIGEgdGllciBMSU1JVCBlbnYgdmFyLiBgLTFgID0gdW5saW1pdGVkOyBhbnl0aGluZyBiZWxvdyB0aGF0IGlzIG5vbnNlbnNlXG4gKiAoYSBgLTVgIGxpbWl0IHdvdWxkIHNoaXAgYSBicm9rZW4gZmluaXRlIGNhcCksIHNvIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNvZGVcbiAqIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgdXAgdG8gYC0xYC4gVGhlIHBhcnNpbmcgaXRzZWxmIGlzIGFwaS1jb3JlJ3NcbiAqIHNoYXJlZCBgZW52SW50YCDigJQgc3RyaWN0IGFib3V0IGRlY2ltYWxzL2dhcmJhZ2Ug4oCUIG5vdCBhIGxvY2FsIHJlLWRlcml2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdEVudihuYW1lOiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gZW52SW50KG5hbWUsIGZhbGxiYWNrKTtcbiAgcmV0dXJuIG4gPCAtMSA/IGZhbGxiYWNrIDogbjtcbn1cblxuLyoqXG4gKiBQZXItdGllciBsaW1pdHMsIGVhY2ggb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl88TElNSVQ+YCBlbnYgdmFyc1xuICogKGUuZy4gYFFVT1RBX1RJRVJfUFJPX1BJUEVMSU5FUz0yNTBgLCBgUVVPVEFfVElFUl9ERVZFTE9QRVJfU1RPUkFHRV9CWVRFUz0uLi5gKS5cbiAqIFVuc2V0L2VtcHR5IOKGkiB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiBSZWFkIG9uY2UgYXQgbW9kdWxlIGxvYWQg4oCUXG4gKiBvbiBrOHMgdGhlc2UgZmxvdyBpbiB2aWEgdGhlIGBhcHAtZW52YCBDb25maWdNYXAgKGJ1aWx0IGZyb20gYC5lbnZgKS5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0cyh0aWVyOiBRdW90YVRpZXIpOiBRdW90YVRpZXJMaW1pdHMge1xuICAvLyBgdW5saW1pdGVkYCBpcyB1bmNhcHBlZCBCWSBERUZJTklUSU9OOiBFVkVSWSBxdW90YSBpcyAtMSBhbmQgaXQgaXMgTk9UXG4gIC8vIGVudi1vdmVycmlkYWJsZS4gUmVhZGluZyBRVU9UQV9USUVSX1VOTElNSVRFRF8qIGhlcmUgd291bGQgbGV0IGEgc3RyYXkgZW52XG4gIC8vIHZhciBzaWxlbnRseSBjYXAgdGhlIGJpbGxpbmctRElTQUJMRUQgZGVmYXVsdCB0aWVyIOKAlCBzdXJmYWNpbmcgYXMgYSBzcHVyaW91c1xuICAvLyBcInF1b3RhIGV4Y2VlZGVkXCIgb24gYSBkZXBsb3kgdGhhdCBtZXRlcnMgbm90aGluZy4gRGVyaXZlIC0xIGZvciBldmVyeSBmaWVsZFxuICAvLyBmcm9tIHRoZSBsaW1pdHMgc2hhcGUgc28gYSBuZXdseS1hZGRlZCBxdW90YSBpcyB1bmNhcHBlZCBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gIGlmICh0aWVyID09PSAndW5saW1pdGVkJykge1xuICAgIGNvbnN0IHVuY2FwcGVkID0geyAuLi5ERUZBVUxUX1RJRVJfTElNSVRTLnVubGltaXRlZCB9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh1bmNhcHBlZCkgYXMgKGtleW9mIFF1b3RhVGllckxpbWl0cylbXSkgdW5jYXBwZWRba10gPSAtMTtcbiAgICByZXR1cm4gdW5jYXBwZWQ7XG4gIH1cbiAgY29uc3QgZCA9IERFRkFVTFRfVElFUl9MSU1JVFNbdGllcl07XG4gIGNvbnN0IFQgPSB0aWVyLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB7XG4gICAgcGx1Z2luczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fUExVR0lOU2AsIGQucGx1Z2lucyksXG4gICAgcGlwZWxpbmVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9QSVBFTElORVNgLCBkLnBpcGVsaW5lcyksXG4gICAgYXBpQ2FsbHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FQSV9DQUxMU2AsIGQuYXBpQ2FsbHMpLFxuICAgIGF1dG9tYXRpb25DYWxsczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQVVUT01BVElPTl9DQUxMU2AsIGQuYXV0b21hdGlvbkNhbGxzKSxcbiAgICBhaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGNwdUNyZWRpdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0NQVV9DUkVESVRTYCwgZC5jcHVDcmVkaXRzKSxcbiAgICBkYXNoYm9hcmRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9EQVNIQk9BUkRTYCwgZC5kYXNoYm9hcmRzKSxcbiAgICBhbGVydFJ1bGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BTEVSVF9SVUxFU2AsIGQuYWxlcnRSdWxlcyksXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX0RFU1RJTkFUSU9OU2AsIGQuYWxlcnREZXN0aW5hdGlvbnMpLFxuICAgIGlkcENvbmZpZ3M6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0lEUF9DT05GSUdTYCwgZC5pZHBDb25maWdzKSxcbiAgICBsaXN0aW5nczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fTElTVElOR1NgLCBkLmxpc3RpbmdzKSxcbiAgICBzZWF0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU0VBVFNgLCBkLnNlYXRzKSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1NVUFBPUlRfQ09OVEFDVFNgLCBkLnN1cHBvcnRDb250YWN0cyksXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU1VQUE9SVF9QUkVNSVVNX0NPTlRBQ1RTYCwgZC5zdXBwb3J0UHJlbWl1bUNvbnRhY3RzKSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0VWRU5UX1JFVEVOVElPTl9EQVlTYCwgZC5ldmVudFJldGVudGlvbkRheXMpLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9ET1JBX1JFVEVOVElPTl9EQVlTYCwgZC5kb3JhUmV0ZW50aW9uRGF5cyksXG4gIH07XG59XG5cbi8vIExhYmVscyBhcmUgb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl9MQUJFTGAgKGRpc3BsYXkgbmFtZSBvbmx5KS5cbmV4cG9ydCBjb25zdCBRVU9UQV9USUVSUzogUmVjb3JkPFF1b3RhVGllciwgUXVvdGFUaWVyUHJlc2V0PiA9IHtcbiAgZGV2ZWxvcGVyOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfREVWRUxPUEVSX0xBQkVMJywgJ0RldmVsb3BlcicpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2RldmVsb3BlcicpIH0sXG4gIHBybzogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX1BST19MQUJFTCcsICdQcm8nKSwgbGltaXRzOiB0aWVyTGltaXRzKCdwcm8nKSB9LFxuICB0ZWFtOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVEVBTV9MQUJFTCcsICdUZWFtJyksIGxpbWl0czogdGllckxpbWl0cygndGVhbScpIH0sXG4gIGJ1c2luZXNzOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfQlVTSU5FU1NfTEFCRUwnLCAnQnVzaW5lc3MnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdidXNpbmVzcycpIH0sXG4gIGVudGVycHJpc2U6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9FTlRFUlBSSVNFX0xBQkVMJywgJ0VudGVycHJpc2UnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdlbnRlcnByaXNlJykgfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVU5MSU1JVEVEX0xBQkVMJywgJ1VubGltaXRlZCcpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3VubGltaXRlZCcpIH0sXG59O1xuXG4vKiogQWxsIHZhbGlkIHRpZXIgbmFtZXMgKGluY2wuIGB1bmxpbWl0ZWRgKS4gVXNlZCBmb3IgdmFsaWRhdGlvbiBvZiBhICpzdG9yZWQqXG4gKiAgdGllciDigJQgYHVubGltaXRlZGAgaXMgYSB2YWxpZCB2YWx1ZSBldmVuIHRob3VnaCBpdCdzIG5ldmVyIG9mZmVyZWQgZm9yIHNhbGUuICovXG5leHBvcnQgY29uc3QgVkFMSURfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gT2JqZWN0LmtleXMoUVVPVEFfVElFUlMpIGFzIFF1b3RhVGllcltdO1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnYnVzaW5lc3MnLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogVGllcnMgdGhhdCBtYXkgYnV5IGV4dHJhIHNlYXRzIOKAlCBiaWxsaW5nJ3MgcGVyLXNlYXQgYHNlYXRgIGFkZC1vbi4gU2VhdHMgYXJlXG4gKiAgdGhlIFRlYW0gZGlmZmVyZW50aWF0b3IsIHNvIHRoZSBzaW5nbGUtc2VhdCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBjYW5ub3RcbiAqICBzdGFjayB0aGVtIGFuZCBtdXN0IHVwZ3JhZGUgaW5zdGVhZDsgYHVubGltaXRlZGAgaGFzIG5vIHNlYXQgY2FwIGF0IGFsbC5cbiAqICBTaW5nbGUgc291cmNlIGZvciB0aGUgYmlsbGluZyBjYXRhbG9nIGFuZCBldmVyeSBcIm91dCBvZiBzZWF0c1wiIG1lc3NhZ2UuICovXG5leHBvcnQgY29uc3QgU0VBVF9QQUNLX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJ107XG5cbi8qKiBIb3cgYW4gYWNjb3VudCB0aGF0IGhhcyB1c2VkIGV2ZXJ5IHNlYXQgY2FuIGdldCBhbm90aGVyLiAqL1xuZXhwb3J0IHR5cGUgU2VhdFJlbWVkeSA9ICd1cGdyYWRlJyB8ICdzZWF0X3BhY2snO1xuXG4vKipcbiAqIFRoZSByZW1lZHkgdG8gb2ZmZXIgYW4gYWNjb3VudCBhdCBpdHMgc2VhdCBjYXAsIGZyb20gdGhlIEFDQ09VTlQncyAocm9vdCkgdGllcjpcbiAqIGBzZWF0X3BhY2tgIHdoZXJlIHNlYXRzIGNhbiBiZSBib3VnaHQsIGB1cGdyYWRlYCBvbiB0aGUgc2luZ2xlLXNlYXQgdGllcnMuXG4gKiBgbnVsbGAgd2hlbiB0aGUgdGllciBpcyB1bmtub3duIG9yIGhhcyBubyBjYXAg4oCUIHNheSBub3RoaW5nIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhdFJlbWVkeSh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogU2VhdFJlbWVkeSB8IG51bGwge1xuICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpIHx8IHRpZXIgPT09ICd1bmxpbWl0ZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChTRUFUX1BBQ0tfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpID8gJ3NlYXRfcGFjaycgOiAndXBncmFkZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG4vKipcbiAqIFRoZSBgY3B1Q3JlZGl0c2AgcGVyaW9kLCBpbiBkYXlzLiBBIE1PTlRIIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwgdGhyZWUtZGF5XG4gKiB3aW5kb3csIGJlY2F1c2UgYnVpbGQgZGVtYW5kIGlzIGJ1cnN0eSBpbiBhIHdheSBBUEkgdHJhZmZpYyBpcyBub3Q6IGEgZnVsbFxuICogY2F0YWxvZ3VlIHJlYnVpbGQgaXMgYSBkYXkncyB3b3JrIHRoYXQgYXJyaXZlcyBvbiBvbmUgZGF5LCBhbmQgYSB0aHJlZS1kYXlcbiAqIHdpbmRvdyByZWZ1c2VzIGl0IHdoaWxlIHRoZSBhY2NvdW50IGhvbGRzIG1vc3Qgb2YgYSBtb250aCdzIGJ1ZGdldCB1bnNwZW50LlxuICovXG5leHBvcnQgY29uc3QgQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX0NQVV9DUkVESVRTX1BFUklPRF9EQVlTJywgMzAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBwZXJpb2QgZm9yIE9ORSBxdW90YSB0eXBlLCBpbiBkYXlzLlxuICpcbiAqIEV2ZXJ5IGZsb3cgcXVvdGEgYnV0IGBjcHVDcmVkaXRzYCByb2xscyBvbiB0aGUgZ2xvYmFsIHtAbGluayBRVU9UQV9SRVNFVF9EQVlTfS5cbiAqIENyZWRpdHMgYXJlIG1vbnRobHksIHdoaWNoIG1ha2VzIHRoZSBwZXJpb2QgYSBQRVItVFlQRSBmYWN0IOKAlCBzbyBhbnl0aGluZyB0aGF0XG4gKiBjb21wdXRlcyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBvciBhIGJ1cm4tcmF0ZSBmb3JlY2FzdCBoYXNcbiAqIHRvIGFzayBmb3IgdGhlIHR5cGUncyBvd24gcGVyaW9kIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGdsb2JhbCBjb25zdGFudC4gQVxuICogZm9yZWNhc3QgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbi5cbiAqXG4gKiBTdG9ja3MgKGBzdG9yYWdlQnl0ZXNgIGFuZCB0aGUgcmVzb3VyY2UgY291bnRzKSBoYXZlIG5vIHBlcmlvZCBhdCBhbGw7IHRoaXNcbiAqIHJldHVybnMgdGhlIGdsb2JhbCB3aW5kb3cgZm9yIHRoZW0gYmVjYXVzZSBjYWxsZXJzIGdhdGUgb25cbiAqIGBxdW90YUFjY3J1YWwodHlwZSkgPT09ICdzdG9jaydgIGJlZm9yZSB1c2luZyBpdCwgYW5kIHJldHVybmluZyBhIGZpZ3VyZSBpc1xuICogbGVzcyBkaXNydXB0aXZlIHRoYW4gbWFraW5nIGV2ZXJ5IGNhbGxlciBoYW5kbGUgYSBudWxsLiBDaGVjayB0aGUgYWNjcnVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGVyaW9kRGF5cyh0eXBlOiBRdW90YVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gdHlwZSA9PT0gJ2NwdUNyZWRpdHMnID8gQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgOiBRVU9UQV9SRVNFVF9EQVlTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9xdW90YS10aWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUF3QixNQUFNLGtCQUFrQixDQUFDO0FBRXhGOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFpQi9HOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLGVBQWUsR0FBcUM7SUFDeEQsZUFBZSxFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMvRSxZQUFZLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3pFLDRFQUE0RTtJQUM1RSwrRUFBK0U7SUFDL0UsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxrREFBa0Q7Q0FDTixDQUFDO0FBRS9DLGlGQUFpRjtBQUNqRixNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWlCO0lBQzdDLE9BQU8sZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLEtBQWEsRUFBRSxRQUFRLEdBQVcsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUM5RyxJQUFJLEtBQUssSUFB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Q29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudk5hbWVGcmFnbWVudCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuaW1wb3J0IHsgREVGQVVMVF9USUVSX0xJTUlUUywgdGllckxhYmVsLCB0eXBlIFF1b3RhVGllckxpbWl0cyB9IGZyb20gJy4vdGllci1saW1pdHMuanMnO1xuXG4vKipcbiAqIFRoZSBsaW1pdHMgc2hhcGUsIHRoZSBjb2RlLWRlZmF1bHQgdGFibGUgYW5kIHRoZSBzaXppbmcgYXJpdGhtZXRpYyBsaXZlIGluXG4gKiBgLi90aWVyLWxpbWl0cy5qc2Ag4oCUIGRlcGVuZGVuY3ktZnJlZSwgc28gdGhlIEJST1dTRVIgaW1wb3J0cyB0aGVtXG4gKiAoYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3RpZXItbGltaXRzYCkgaW5zdGVhZCBvZiBrZWVwaW5nIGEgaGFuZC1zeW5jZWRcbiAqIGNvcHkuIFJlLWV4cG9ydGVkIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb2R1bGUgZXZlcnkgc2VydmVyIGNvbnN1bWVyIGFuZFxuICogdGhlIHBhY2thZ2UgYmFycmVsIGFscmVhZHkgbmFtZTsgd2hhdCBzdGF5cyBoZXJlIGlzIGV2ZXJ5dGhpbmcgdGhlIGVudlxuICogdG91Y2hlcy5cbiAqL1xuZXhwb3J0IHsgQVVUT01BVElPTl9DQUxMU19TSVpJTkcsIGF1dG9tYXRpb25DYWxsc0ZvciwgREVGQVVMVF9USUVSX0xJTUlUUywgdGllckxhYmVsIH0gZnJvbSAnLi90aWVyLWxpbWl0cy5qcyc7XG5leHBvcnQgdHlwZSB7IFF1b3RhVGllckxpbWl0cyB9IGZyb20gJy4vdGllci1saW1pdHMuanMnO1xuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuXG4gKlxuICogYHVubGltaXRlZGAgaXMgYSBzcGVjaWFsIHRpZXI6IGV2ZXJ5IHF1b3RhIGlzIGAtMWAgKHVuY2FwcGVkKSBhbmQgaXQgaW5jbHVkZXNcbiAqIGV2ZXJ5IGZlYXR1cmUvYWRkLW9uIGJ1bmRsZS4gSXQgaXMgdGhlIERFRkFVTFQgd2hlbiBiaWxsaW5nIGlzIGRpc2FibGVkIChub1xuICogbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSBleGlzdHMsIHNvIG5vdGhpbmcgaXMgY2FwcGVkKSwgYW5kIGl0IGlzIE5FVkVSXG4gKiBzaG93biBvciBzZWxlY3RhYmxlIHdoZW4gYmlsbGluZyBpcyBlbmFibGVkIOKAlCBzZWUgYFNUQU5EQVJEX1RJRVJTYC4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhVGllciA9ICdkZXZlbG9wZXInIHwgJ3BybycgfCAndGVhbScgfCAnYnVzaW5lc3MnIHwgJ2VudGVycHJpc2UnIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBGdWxsIHByZXNldCBmb3IgYSBzaW5nbGUgdGllciAobGFiZWwgKyBsaW1pdHMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJQcmVzZXQge1xuICBsYWJlbDogc3RyaW5nO1xuICBsaW1pdHM6IFF1b3RhVGllckxpbWl0cztcbn1cblxuLyoqXG4gKiBUaGUgU09GVCBiYW5kIGFib3ZlIGEgcXVvdGEncyBjYXAsIHBlciB0eXBlLCBpbiBwZXJjZW50IG9mIHRoZSBsaW1pdC4gQSB0eXBlXG4gKiBhYnNlbnQgZnJvbSB0aGlzIG1hcCBoYXMgTk8gYmFuZCBhbmQgc3RvcHMgaGFyZCBhdCAxMDAlLlxuICpcbiAqIEF0IDEwMCUgdGhlIGFjY291bnQgZ2V0cyB0aGUgXCJyZWFjaGVkXCIgbm90aWNlIGFuZCBrZWVwcyBydW5uaW5nOyB0aGUgcmVmdXNhbFxuICogc3RhcnRzIG9ubHkgcGFzdCBgbGltaXQgw5cgKDEwMCArIHBjdCkgLyAxMDBgLiBSZWFkcyBzdGlsbCBSRVBPUlQgdGhlIG5vbWluYWxcbiAqIGxpbWl0LCBzbyB1c2FnZSBzaG93cyBhYm92ZSAxMDAlIHdoaWxlIGluc2lkZSB0aGUgYmFuZC5cbiAqXG4gKiBUd28gdHlwZXMgcXVhbGlmeSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBzdGF0ZWQgdHdvIHdheXMg4oCUIGEgaGFyZCBzdG9wIGV4YWN0bHlcbiAqIGF0IDEwMCUgaXMgd29yc2UgdGhhbiBhIHNob3J0IG92ZXJydW4gd2hlbiB0aGUgY2FsbGVyIGNhbm5vdCBzaW1wbHkgd2FpdDpcbiAqXG4gKiAtIGBhdXRvbWF0aW9uQ2FsbHNgIChgUVVPVEFfQVVUT01BVElPTl9HUkFDRV9QQ1RgKTogdGhlIGNhbGxlciBpcyBhIHBpcGVsaW5lXG4gKiAgIG1pZC1kZXBsb3ksIG5vdCBhIHBlcnNvbiwgYW5kIHRoZSBjb3VudGVyIHdvdWxkIHN0YXkgZnVsbCBmb3IgdGhlIHJlc3Qgb2ZcbiAqICAgdGhlIHBlcmlvZC5cbiAqIC0gYHN0b3JhZ2VCeXRlc2AgKGBRVU9UQV9TVE9SQUdFX0dSQUNFX1BDVGApOiBzdG9yYWdlIGlzIGEgU1RPQ0sg4oCUIGl0IGRvZXNcbiAqICAgbm90IHJlc2V0LCBzbyB3aXRob3V0IGEgYmFuZCBhIGRvd25ncmFkZSBvciBhIGNhbmNlbGxlZCBwYWNrIGZsaXBzIGFuXG4gKiAgIGFjY291bnQgZnJvbSB3b3JraW5nIHRvIHJlZnVzZWQgd2l0aCBubyBidWZmZXIgYXQgYWxsLCBhbmQgdGhlIHJlbWVkeVxuICogICAocHJ1bmUsIG9yIGJ1eSBjYXBhY2l0eSkgdGFrZXMgdGltZSB0aGUgYmFuZCBpcyB0aGVyZSB0byBwcm92aWRlLiBOb3RlIHRoZVxuICogICBiYW5kIG9uIGEgc3RvY2sgaXMgYSBPTkUtVElNRSBidWZmZXIgcmF0aGVyIHRoYW4gYSBwZXItcGVyaW9kIG9uZTsgdGhhdCBpc1xuICogICBpdHMgcHVycG9zZSBoZXJlLCBub3QgYSBsaW1pdGF0aW9uIG9mIGl0LlxuICpcbiAqIEV2ZXJ5IG90aGVyIHR5cGUgc3RheXMgaGFyZC4gVGhpcyB3YXMgYSBoYXJkY29kZWQgYHF1b3RhVHlwZSAhPT1cbiAqICdhdXRvbWF0aW9uQ2FsbHMnYCBjb21wYXJpc29uLCB3aGljaCBpcyB3aHkgc3RvcmFnZSBoYWQgbm90aGluZzogdGhlXG4gKiBtZWNoYW5pc20gZXhpc3RlZCBhbmQgb25seSB0aGUgcHJlZGljYXRlIGV4Y2x1ZGVkIGl0LlxuICovXG5jb25zdCBRVU9UQV9HUkFDRV9QQ1Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIG51bWJlcj4+ID0ge1xuICBhdXRvbWF0aW9uQ2FsbHM6IGVudkludCgnUVVPVEFfQVVUT01BVElPTl9HUkFDRV9QQ1QnLCAxMCwgeyBtaW46IDAsIG1heDogMTAwIH0pLFxuICBzdG9yYWdlQnl0ZXM6IGVudkludCgnUVVPVEFfU1RPUkFHRV9HUkFDRV9QQ1QnLCAxMCwgeyBtaW46IDAsIG1heDogMTAwIH0pLFxuICAvLyBgc2F0aXNmaWVzIFBhcnRpYWw84oCmPmAga2VlcHMgQk9USCBwcm9wZXJ0aWVzIHRoaXMgbWFwIG5lZWRzOiB0aGUga2V5cyBhcmVcbiAgLy8gY2hlY2tlZCBhZ2FpbnN0IGBRdW90YVR5cGVgIChhIHR5cG8nZCBgc3RvcmFnZWJ5dGVzYCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgYVxuICAvLyBiYW5kZWQgcXVvdGEgc3RvcHBpbmcgaGFyZCBhdCAxMDAlLCBzaWxlbnRseSksIHdoaWxlIHRoZSBhbm5vdGF0aW9uIGtlZXBzIHRoZVxuICAvLyBzdHJpbmcgaW5kZXggdGhlIGFjY2Vzc29yIGJlbG93IG5lZWRzIGZvciBhbiB1bnRydXN0ZWQgYHF1b3RhVHlwZWAuIFBhcnRpYWxcbiAgLy8gYmVjYXVzZSBhYnNlbmNlIGlzIG1lYW5pbmdmdWwgaGVyZSDigJQgc2VlIGFib3ZlLlxufSBzYXRpc2ZpZXMgUGFydGlhbDxSZWNvcmQ8UXVvdGFUeXBlLCBudW1iZXI+PjtcblxuLyoqIFRoZSBzb2Z0IGJhbmQgZm9yIGBxdW90YVR5cGVgIGluIHBlcmNlbnQsIG9yIDAgZm9yIGEgdHlwZSB0aGF0IHN0b3BzIGhhcmQuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGFHcmFjZVBjdChxdW90YVR5cGU6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBRVU9UQV9HUkFDRV9QQ1RbcXVvdGFUeXBlXSA/PyAwO1xufVxuXG4vKipcbiAqIFRoZSBsaW1pdCBlbmZvcmNlbWVudCBhY3R1YWxseSBiaW5kcyBvbiBmb3IgYHF1b3RhVHlwZWA6IHRoZSBub21pbmFsIGxpbWl0LFxuICogcGx1cyB0aGUgdHlwZSdzIHtAbGluayBxdW90YUdyYWNlUGN0fSBiYW5kIHdoZXJlIGl0IGhhcyBvbmUuIFVubGltaXRlZCAoLTEpXG4gKiBhbmQgemVybyAoXCJub25lXCIpIGxpbWl0cyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkIOKAlCBhIDAgY2FwIGlzIGEgZGVsaWJlcmF0ZVxuICogcmVmdXNhbCwgbm90IGEgYnVkZ2V0IHRvIG92ZXJydW4uXG4gKlxuICoge0BsaW5rIFFVT1RBX0dSQUNFX1BDVH0gZGVjaWRlcyBXSEVUSEVSIGEgdHlwZSBoYXMgYSBiYW5kOyBgZ3JhY2VQY3RgIG9ubHlcbiAqIHNpemVzIGl0LiBTbyBhbiBleHBsaWNpdCBwZXJjZW50YWdlIHBhc3NlZCBmb3IgYW4gdW5iYW5kZWQgdHlwZSBzdGlsbCB5aWVsZHNcbiAqIHRoZSBub21pbmFsIGxpbWl0LCByYXRoZXIgdGhhbiBxdWlldGx5IGdyYW50aW5nIGEgYmFuZCB0aGUgdHlwZSBpcyBub3QgbWVhbnRcbiAqIHRvIGhhdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmZvcmNlZFF1b3RhTGltaXQocXVvdGFUeXBlOiBzdHJpbmcsIGxpbWl0OiBudW1iZXIsIGdyYWNlUGN0OiBudW1iZXIgPSBxdW90YUdyYWNlUGN0KHF1b3RhVHlwZSkpOiBudW1iZXIge1xuICBpZiAobGltaXQgPD0gMCB8fCBncmFjZVBjdCA8PSAwIHx8IHF1b3RhR3JhY2VQY3QocXVvdGFUeXBlKSA8PSAwKSByZXR1cm4gbGltaXQ7XG4gIHJldHVybiBNYXRoLmZsb29yKChsaW1pdCAqICgxMDAgKyBncmFjZVBjdCkpIC8gMTAwKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgdGllciBMSU1JVCBlbnYgdmFyLiBgLTFgID0gdW5saW1pdGVkOyBhbnl0aGluZyBiZWxvdyB0aGF0IGlzIG5vbnNlbnNlXG4gKiAoYSBgLTVgIGxpbWl0IHdvdWxkIHNoaXAgYSBicm9rZW4gZmluaXRlIGNhcCksIHNvIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNvZGVcbiAqIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgdXAgdG8gYC0xYC4gVGhlIHBhcnNpbmcgaXRzZWxmIGlzIGFwaS1jb3JlJ3NcbiAqIHNoYXJlZCBgZW52SW50YCDigJQgc3RyaWN0IGFib3V0IGRlY2ltYWxzL2dhcmJhZ2Ug4oCUIG5vdCBhIGxvY2FsIHJlLWRlcml2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdEVudihuYW1lOiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gZW52SW50KG5hbWUsIGZhbGxiYWNrKTtcbiAgcmV0dXJuIG4gPCAtMSA/IGZhbGxiYWNrIDogbjtcbn1cblxuLyoqXG4gKiBQZXItdGllciBsaW1pdHMsIGVhY2ggb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl88TElNSVQ+YCBlbnYgdmFyc1xuICogKGUuZy4gYFFVT1RBX1RJRVJfUFJPX1BJUEVMSU5FUz0yNTBgLCBgUVVPVEFfVElFUl9ERVZFTE9QRVJfU1RPUkFHRV9CWVRFUz0uLi5gKS5cbiAqIFVuc2V0L2VtcHR5IOKGkiB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiBSZWFkIG9uY2UgYXQgbW9kdWxlIGxvYWQg4oCUXG4gKiBvbiBrOHMgdGhlc2UgZmxvdyBpbiB2aWEgdGhlIGBhcHAtZW52YCBDb25maWdNYXAgKGJ1aWx0IGZyb20gYC5lbnZgKS5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0cyh0aWVyOiBRdW90YVRpZXIpOiBRdW90YVRpZXJMaW1pdHMge1xuICAvLyBgdW5saW1pdGVkYCBpcyB1bmNhcHBlZCBCWSBERUZJTklUSU9OOiBFVkVSWSBxdW90YSBpcyAtMSBhbmQgaXQgaXMgTk9UXG4gIC8vIGVudi1vdmVycmlkYWJsZS4gUmVhZGluZyBRVU9UQV9USUVSX1VOTElNSVRFRF8qIGhlcmUgd291bGQgbGV0IGEgc3RyYXkgZW52XG4gIC8vIHZhciBzaWxlbnRseSBjYXAgdGhlIGJpbGxpbmctRElTQUJMRUQgZGVmYXVsdCB0aWVyIOKAlCBzdXJmYWNpbmcgYXMgYSBzcHVyaW91c1xuICAvLyBcInF1b3RhIGV4Y2VlZGVkXCIgb24gYSBkZXBsb3kgdGhhdCBtZXRlcnMgbm90aGluZy4gRGVyaXZlIC0xIGZvciBldmVyeSBmaWVsZFxuICAvLyBmcm9tIHRoZSBsaW1pdHMgc2hhcGUgc28gYSBuZXdseS1hZGRlZCBxdW90YSBpcyB1bmNhcHBlZCBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gIGlmICh0aWVyID09PSAndW5saW1pdGVkJykge1xuICAgIGNvbnN0IHVuY2FwcGVkID0geyAuLi5ERUZBVUxUX1RJRVJfTElNSVRTLnVubGltaXRlZCB9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh1bmNhcHBlZCkgYXMgKGtleW9mIFF1b3RhVGllckxpbWl0cylbXSkgdW5jYXBwZWRba10gPSAtMTtcbiAgICByZXR1cm4gdW5jYXBwZWQ7XG4gIH1cbiAgY29uc3QgZCA9IERFRkFVTFRfVElFUl9MSU1JVFNbdGllcl07XG4gIGNvbnN0IFQgPSB0aWVyLnRvVXBwZXJDYXNlKCk7XG4gIC8vIEtleWVkIG9mZiB0aGUgbGltaXRzIHRhYmxlIHJhdGhlciB0aGFuIHNldmVudGVlbiBoYW5kLXdyaXR0ZW4gbGluZXMsIHNvIGFcbiAgLy8gbmV3bHktYWRkZWQgbGltaXQgaXMgZW52LW92ZXJyaWRhYmxlIHRoZSBtb21lbnQgaXQgaGFzIGEgZGVmYXVsdCDigJQgdGhlIGhhbmRcbiAgLy8gbGlzdCBtYWRlIHRoYXQgYSBzZWNvbmQgZWRpdCwgaW4gYSBmaWxlIHdoZXJlIGZvcmdldHRpbmcgaXQgeWllbGRzIGEga25vYlxuICAvLyB0aGUgZG9jcyBkZXNjcmliZSBhbmQgdGhlIGNvZGUgaWdub3Jlcy5cbiAgY29uc3Qgb3V0ID0geyAuLi5kIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgT2JqZWN0LmtleXMob3V0KSBhcyAoa2V5b2YgUXVvdGFUaWVyTGltaXRzKVtdKSB7XG4gICAgLy8gVGhlIGtub2IgbmFtZXMgYXJlIERFUklWRUQgZnJvbSB0aGUgZmllbGQgbmFtZXMgKGBlbnZOYW1lRnJhZ21lbnRgKSwgd2hpY2hcbiAgICAvLyBpcyB3aHkgYHRlc3QvcXVvdGEtdGllcnMudGVzdC50c2AgcGlucyB0aGUgZnVsbCBzZXQgb2Ygc2V2ZW50ZWVuOiBhIGZpZWxkXG4gICAgLy8gcmVuYW1lIHdvdWxkIG90aGVyd2lzZSBtb3ZlIHNvbWVib2R5J3MgY29uZmlndXJlZCBrbm9iIHdpdGhvdXQgYSB3b3JkLlxuICAgIG91dFtmaWVsZF0gPSB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV8ke2Vudk5hbWVGcmFnbWVudChmaWVsZCl9YCwgZFtmaWVsZF0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBbGwgdmFsaWQgdGllciBuYW1lcyAoaW5jbC4gYHVubGltaXRlZGApLCBpbiBsYWRkZXIgb3JkZXIuIFVzZWQgZm9yIHZhbGlkYXRpb25cbiAqICBvZiBhICpzdG9yZWQqIHRpZXIg4oCUIGB1bmxpbWl0ZWRgIGlzIGEgdmFsaWQgdmFsdWUgZXZlbiB0aG91Z2ggaXQncyBuZXZlclxuICogIG9mZmVyZWQgZm9yIHNhbGUuIERlcml2ZWQgZnJvbSB0aGUgY29kZS1kZWZhdWx0IGxpbWl0cyB0YWJsZSwgd2hpY2ggaXMgdGhlIG9uZVxuICogIHBsYWNlIGEgdGllciBjYW5ub3QgYmUgYWRkZWQgd2l0aG91dCBiZWluZyBnaXZlbiBudW1iZXJzLiAqL1xuZXhwb3J0IGNvbnN0IFZBTElEX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IE9iamVjdC5rZXlzKERFRkFVTFRfVElFUl9MSU1JVFMpIGFzIFF1b3RhVGllcltdO1xuXG4vKipcbiAqIEV2ZXJ5IHRpZXIncyBwcmVzZXQsIGtleWVkIG9mZiB7QGxpbmsgVkFMSURfVElFUlN9IHJhdGhlciB0aGFuIHdyaXR0ZW4gb3V0XG4gKiB0aWVyIGJ5IHRpZXIg4oCUIGEgdGllciBhZGRlZCB0byB0aGUgbGltaXRzIHRhYmxlIGdldHMgaXRzIHByZXNldCBoZXJlIHdpdGggbm9cbiAqIHNlY29uZCBlZGl0LlxuICpcbiAqIFRoZSBsYWJlbCBkZWZhdWx0cyB0byB7QGxpbmsgdGllckxhYmVsfSBvZiB0aGUga2V5IChcImJ1c2luZXNzXCIg4oaSIFwiQnVzaW5lc3NcIixcbiAqIFwicHJvX3BsdXNcIiDihpIgXCJQcm8gUGx1c1wiKSwgd2hpY2ggaXMgd2hhdCBhbGwgc2l4IHdlcmUgc3BlbGxlZCBhcyBieSBoYW5kLCBhbmRcbiAqIHN0YXlzIG92ZXJyaWRhYmxlIHZpYSBgUVVPVEFfVElFUl88VElFUj5fTEFCRUxgIGZvciBhIGRlcGxveW1lbnQgdGhhdCB3YW50cyBpdHNcbiAqIG93biB3b3JkaW5nIOKAlCBvciBmb3IgYSBrZXkgdGhlIGRlcml2YXRpb24gY2Fubm90IGdldCByaWdodCwgc3VjaCBhcyBhbiBhY3JvbnltLlxuICogRGlzcGxheSBuYW1lIG9ubHk6IGl0IG5ldmVyIGFmZmVjdHMgYSBsaW1pdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX1RJRVJTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBWQUxJRF9USUVSUy5tYXAoKHRpZXIpID0+IFt0aWVyLCB7XG4gICAgbGFiZWw6IGVudlN0cihgUVVPVEFfVElFUl8ke3RpZXIudG9VcHBlckNhc2UoKX1fTEFCRUxgLCB0aWVyTGFiZWwodGllcikpLFxuICAgIGxpbWl0czogdGllckxpbWl0cyh0aWVyKSxcbiAgfV0pLFxuKSBhcyBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+O1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnYnVzaW5lc3MnLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogVGllcnMgdGhhdCBtYXkgYnV5IGV4dHJhIHNlYXRzIOKAlCBiaWxsaW5nJ3MgcGVyLXNlYXQgYHNlYXRgIGFkZC1vbi4gU2VhdHMgYXJlXG4gKiAgdGhlIFRlYW0gZGlmZmVyZW50aWF0b3IsIHNvIHRoZSBzaW5nbGUtc2VhdCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBjYW5ub3RcbiAqICBzdGFjayB0aGVtIGFuZCBtdXN0IHVwZ3JhZGUgaW5zdGVhZDsgYHVubGltaXRlZGAgaGFzIG5vIHNlYXQgY2FwIGF0IGFsbC5cbiAqICBTaW5nbGUgc291cmNlIGZvciB0aGUgYmlsbGluZyBjYXRhbG9nIGFuZCBldmVyeSBcIm91dCBvZiBzZWF0c1wiIG1lc3NhZ2UuICovXG5leHBvcnQgY29uc3QgU0VBVF9QQUNLX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJ107XG5cbi8qKiBIb3cgYW4gYWNjb3VudCB0aGF0IGhhcyB1c2VkIGV2ZXJ5IHNlYXQgY2FuIGdldCBhbm90aGVyLiAqL1xuZXhwb3J0IHR5cGUgU2VhdFJlbWVkeSA9ICd1cGdyYWRlJyB8ICdzZWF0X3BhY2snO1xuXG4vKipcbiAqIFRoZSByZW1lZHkgdG8gb2ZmZXIgYW4gYWNjb3VudCBhdCBpdHMgc2VhdCBjYXAsIGZyb20gdGhlIEFDQ09VTlQncyAocm9vdCkgdGllcjpcbiAqIGBzZWF0X3BhY2tgIHdoZXJlIHNlYXRzIGNhbiBiZSBib3VnaHQsIGB1cGdyYWRlYCBvbiB0aGUgc2luZ2xlLXNlYXQgdGllcnMuXG4gKiBgbnVsbGAgd2hlbiB0aGUgdGllciBpcyB1bmtub3duIG9yIGhhcyBubyBjYXAg4oCUIHNheSBub3RoaW5nIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhdFJlbWVkeSh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogU2VhdFJlbWVkeSB8IG51bGwge1xuICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpIHx8IHRpZXIgPT09ICd1bmxpbWl0ZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChTRUFUX1BBQ0tfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpID8gJ3NlYXRfcGFjaycgOiAndXBncmFkZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG4vKipcbiAqIFRoZSBgY3B1Q3JlZGl0c2AgcGVyaW9kLCBpbiBkYXlzLiBBIE1PTlRIIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwgdGhyZWUtZGF5XG4gKiB3aW5kb3csIGJlY2F1c2UgYnVpbGQgZGVtYW5kIGlzIGJ1cnN0eSBpbiBhIHdheSBBUEkgdHJhZmZpYyBpcyBub3Q6IGEgZnVsbFxuICogY2F0YWxvZ3VlIHJlYnVpbGQgaXMgYSBkYXkncyB3b3JrIHRoYXQgYXJyaXZlcyBvbiBvbmUgZGF5LCBhbmQgYSB0aHJlZS1kYXlcbiAqIHdpbmRvdyByZWZ1c2VzIGl0IHdoaWxlIHRoZSBhY2NvdW50IGhvbGRzIG1vc3Qgb2YgYSBtb250aCdzIGJ1ZGdldCB1bnNwZW50LlxuICovXG5leHBvcnQgY29uc3QgQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX0NQVV9DUkVESVRTX1BFUklPRF9EQVlTJywgMzAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBwZXJpb2QgZm9yIE9ORSBxdW90YSB0eXBlLCBpbiBkYXlzLlxuICpcbiAqIEV2ZXJ5IGZsb3cgcXVvdGEgYnV0IGBjcHVDcmVkaXRzYCByb2xscyBvbiB0aGUgZ2xvYmFsIHtAbGluayBRVU9UQV9SRVNFVF9EQVlTfS5cbiAqIENyZWRpdHMgYXJlIG1vbnRobHksIHdoaWNoIG1ha2VzIHRoZSBwZXJpb2QgYSBQRVItVFlQRSBmYWN0IOKAlCBzbyBhbnl0aGluZyB0aGF0XG4gKiBjb21wdXRlcyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBvciBhIGJ1cm4tcmF0ZSBmb3JlY2FzdCBoYXNcbiAqIHRvIGFzayBmb3IgdGhlIHR5cGUncyBvd24gcGVyaW9kIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGdsb2JhbCBjb25zdGFudC4gQVxuICogZm9yZWNhc3QgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbi5cbiAqXG4gKiBTdG9ja3MgKGBzdG9yYWdlQnl0ZXNgIGFuZCB0aGUgcmVzb3VyY2UgY291bnRzKSBoYXZlIG5vIHBlcmlvZCBhdCBhbGw7IHRoaXNcbiAqIHJldHVybnMgdGhlIGdsb2JhbCB3aW5kb3cgZm9yIHRoZW0gYmVjYXVzZSBjYWxsZXJzIGdhdGUgb25cbiAqIGBxdW90YUFjY3J1YWwodHlwZSkgPT09ICdzdG9jaydgIGJlZm9yZSB1c2luZyBpdCwgYW5kIHJldHVybmluZyBhIGZpZ3VyZSBpc1xuICogbGVzcyBkaXNydXB0aXZlIHRoYW4gbWFraW5nIGV2ZXJ5IGNhbGxlciBoYW5kbGUgYSBudWxsLiBDaGVjayB0aGUgYWNjcnVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGVyaW9kRGF5cyh0eXBlOiBRdW90YVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gdHlwZSA9PT0gJ2NwdUNyZWRpdHMnID8gQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgOiBRVU9UQV9SRVNFVF9EQVlTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
@@ -17,7 +17,7 @@
17
17
  * (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
18
18
  * this list free of any platform-only action.
19
19
  */
20
- export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.vuln.flagged', 'plugin.vuln.cleared', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'quota.notice_settings.update', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.exemption.request', 'compliance.exemption.reject', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.scan.complete', 'compliance.subscription.auto-subscribe', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'registry.token.issue', 'registry.quarantine.credential.mint', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'message.update', 'message.attachment.upload', 'message.notify.internal', 'message.org.purge', 'support.case.open', 'support.case.reply', 'support.case.status', 'support.case.severity', 'support.case.assign', 'support.case.transfer', 'support.oncall.acknowledged', 'support.oncall.escalated', 'support.oncall.test', 'support.oncall.paged', 'support.contact.designate', 'support.contact.revoke', 'support.contact.upgrade', 'support.contact.downgrade', 'support.case.note', 'support.canned.write', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.support-floor.override', 'billing.support-incident.grant', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.campaign.create', 'billing.campaign.update', 'billing.campaign.end', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.offer.sent', 'billing.offer.withdrawn', 'billing.offer.declined', 'billing.offer.dismissed', 'billing.offer.exclusion.set', 'billing.offer.exclusion.cleared', 'billing.offer.trigger', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'reporting.report.run.compose', 'reporting.report.run.notes', 'reporting.report.run.summary', 'reporting.report.recipient.resend', 'reporting.report.recipient.verified', 'reporting.report.recipient.unsubscribed', 'reporting.ingest.batch', 'reporting.ingest.rejected', 'reporting.incident.record', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'pipeline.ai.generate', 'plugin.ai.generate', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.version.prune', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.bootstrap.open', 'ecosystem.bootstrap.close', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test', 'plugin.setup_image.promoted', 'plugin.setup_image.promote_refused', 'plugin.setup_image.kept', 'plugin.setup_image.discarded', 'pipeline.vuln.accepted', 'pipeline.vuln.false_positive', 'pipeline.vuln.reopened', 'pipeline.runtime_check.flagged', 'pipeline.plugin.upgraded', 'pipeline.security_report.upload'];
20
+ export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.vuln.flagged', 'plugin.vuln.cleared', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'quota.notice_settings.update', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.exemption.request', 'compliance.exemption.reject', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.scan.complete', 'compliance.subscription.auto-subscribe', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'registry.token.issue', 'registry.quarantine.credential.mint', 'message.announcement.create', 'message.delete', 'message.hide', 'message.unhide', 'message.restore', 'message.purge', 'message.update', 'message.attachment.upload', 'message.notify.internal', 'message.org.purge', 'support.case.open', 'support.case.reply', 'support.case.status', 'support.case.severity', 'support.case.assign', 'support.case.transfer', 'support.oncall.acknowledged', 'support.oncall.escalated', 'support.oncall.test', 'support.oncall.paged', 'support.contact.designate', 'support.contact.revoke', 'support.contact.upgrade', 'support.contact.downgrade', 'support.case.note', 'support.canned.write', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.support-floor.override', 'billing.support-incident.grant', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.campaign.create', 'billing.campaign.update', 'billing.campaign.end', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.offer.sent', 'billing.offer.withdrawn', 'billing.offer.declined', 'billing.offer.dismissed', 'billing.offer.exclusion.set', 'billing.offer.exclusion.cleared', 'billing.offer.trigger', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'reporting.report.run.compose', 'reporting.report.run.notes', 'reporting.report.run.summary', 'reporting.report.recipient.resend', 'reporting.report.recipient.verified', 'reporting.report.recipient.unsubscribed', 'reporting.ingest.batch', 'reporting.ingest.rejected', 'reporting.incident.record', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'pipeline.ai.generate', 'plugin.ai.generate', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.version.prune', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.bootstrap.open', 'ecosystem.bootstrap.close', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test', 'plugin.setup_image.promoted', 'plugin.setup_image.promote_refused', 'plugin.setup_image.kept', 'plugin.setup_image.discarded', 'pipeline.vuln.accepted', 'pipeline.vuln.false_positive', 'pipeline.vuln.reopened', 'pipeline.runtime_check.flagged', 'pipeline.plugin.upgraded', 'pipeline.security_report.upload'];
21
21
  export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
22
22
  /** Whether `value` is an action a remote service may emit (the ingest allow-list). */
23
23
  export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;