@pipeline-builder/api-core 4.1.12 → 4.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
@@ -32,14 +32,48 @@ export var ErrorCode;
32
32
  /** A bootstrap-admin enrolment session (`mfaEnrollmentPending`) reached a
33
33
  * route outside the enrolment / sign-out / setup allowlist. */
34
34
  ErrorCode["MFA_ENROLLMENT_REQUIRED"] = "MFA_ENROLLMENT_REQUIRED";
35
+ /** A read-only impersonation token (`impersonationReadOnly`) attempted a
36
+ * state-changing request (anything but GET/HEAD/OPTIONS). */
37
+ ErrorCode["IMPERSONATION_READ_ONLY"] = "IMPERSONATION_READ_ONLY";
38
+ /** A plugin-ecosystem governance route (docs/runbooks/ecosystem-moderation.md)
39
+ * was called from an active org other than the system org — a token minted in
40
+ * a tenant org is refused even for the same user. Switch to the system org. */
41
+ ErrorCode["SYSTEM_ORG_REQUIRED"] = "SYSTEM_ORG_REQUIRED";
42
+ /** The publisher hasn't accepted the CURRENT publisher terms version, so it
43
+ * can't submit new requests (existing listings are unaffected). */
44
+ ErrorCode["PUBLISHER_TERMS_REQUIRED"] = "PUBLISHER_TERMS_REQUIRED";
45
+ /** Publishing is done from the ROOT org; a team org can't own a publisher or
46
+ * submit requests. */
47
+ ErrorCode["PUBLISHER_ROOT_ORG_REQUIRED"] = "PUBLISHER_ROOT_ORG_REQUIRED";
48
+ /** The publisher is suspended by the system org. */
49
+ ErrorCode["PUBLISHER_SUSPENDED"] = "PUBLISHER_SUSPENDED";
50
+ /** Tenant publishing is switched off on this instance (`PLUGIN_PUBLISHING_ENABLED`). */
51
+ ErrorCode["PLUGIN_PUBLISHING_DISABLED"] = "PLUGIN_PUBLISHING_DISABLED";
52
+ /** Review writes are switched off on this instance (`PLUGIN_REVIEWS_ENABLED`):
53
+ * reviews stay readable, nothing new is written. */
54
+ ErrorCode["PLUGIN_REVIEWS_DISABLED"] = "PLUGIN_REVIEWS_DISABLED";
55
+ /** A member of the publisher's own organization tried to review (or vote on a
56
+ * review of) one of its listings (self-promotion). */
57
+ ErrorCode["REVIEW_SELF_PROMOTION"] = "REVIEW_SELF_PROMOTION";
58
+ /** Separation of duties: the caller may not decide this request —
59
+ * it came from an org they belong to, they uploaded the version, or they
60
+ * gave the first of two approvals. */
61
+ ErrorCode["SEPARATION_OF_DUTIES"] = "SEPARATION_OF_DUTIES";
35
62
  ErrorCode["ORG_MISMATCH"] = "ORG_MISMATCH";
36
63
  ErrorCode["COMPLIANCE_VIOLATION"] = "COMPLIANCE_VIOLATION";
37
64
  // Not found errors (404)
38
65
  ErrorCode["NOT_FOUND"] = "NOT_FOUND";
39
66
  ErrorCode["ORG_NOT_FOUND"] = "ORG_NOT_FOUND";
67
+ /** The anonymous plugin submission API is off on this instance
68
+ * (`ANONYMOUS_SUBMISSIONS_ENABLED`, or outbound email isn't configured) —
69
+ * answered as a plain 404 (docs/plugin-publishing.md). */
70
+ ErrorCode["SUBMISSIONS_DISABLED"] = "SUBMISSIONS_DISABLED";
40
71
  // Validation errors (400)
41
72
  ErrorCode["VALIDATION_ERROR"] = "VALIDATION_ERROR";
42
73
  ErrorCode["MISSING_REQUIRED_FIELD"] = "MISSING_REQUIRED_FIELD";
74
+ /** A proof-of-work answer is missing, malformed, expired, too easy, wrong,
75
+ * or was already used (anonymous submissions). */
76
+ ErrorCode["PROOF_OF_WORK_INVALID"] = "PROOF_OF_WORK_INVALID";
43
77
  ErrorCode["TEMPLATE_UNKNOWN_PATH"] = "TEMPLATE_UNKNOWN_PATH";
44
78
  ErrorCode["TEMPLATE_CYCLE"] = "TEMPLATE_CYCLE";
45
79
  ErrorCode["TEMPLATE_PARSE_ERROR"] = "TEMPLATE_PARSE_ERROR";
@@ -51,6 +85,9 @@ export var ErrorCode;
51
85
  // Quota/Rate limit errors (429)
52
86
  ErrorCode["QUOTA_EXCEEDED"] = "QUOTA_EXCEEDED";
53
87
  ErrorCode["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
88
+ /** An anonymous submitter (per verified email, or per client IP) is at the
89
+ * rolling 24-hour submission cap. */
90
+ ErrorCode["SUBMISSION_LIMIT"] = "SUBMISSION_LIMIT";
54
91
  // Payload errors (413)
55
92
  ErrorCode["PAYLOAD_TOO_LARGE"] = "PAYLOAD_TOO_LARGE";
56
93
  // Conflict errors (409)
@@ -61,6 +98,50 @@ export var ErrorCode;
61
98
  * not verify against the platform's plugin-signing key — the registry
62
99
  * content no longer matches what the platform built and signed. */
63
100
  ErrorCode["IMAGE_VERIFICATION_FAILED"] = "IMAGE_VERIFICATION_FAILED";
101
+ /** The plugin version is immutable — a publish request references it
102
+ * (`frozen_at` set) or it is published to a listing — so it can be neither
103
+ * re-uploaded, edited nor deleted (docs/plugin-publishing.md). */
104
+ ErrorCode["PLUGIN_VERSION_FROZEN"] = "PLUGIN_VERSION_FROZEN";
105
+ /** The plugin version is referenced by one of the org's pipelines, or published
106
+ * to an ecosystem listing; deleting it needs `?force=true` plus a step-up. */
107
+ ErrorCode["PLUGIN_VERSION_IN_USE"] = "PLUGIN_VERSION_IN_USE";
108
+ /** A freeze named an image digest that is not the version's stored digest
109
+ * (fail closed: what was requested is not what would be published). */
110
+ ErrorCode["PLUGIN_DIGEST_MISMATCH"] = "PLUGIN_DIGEST_MISMATCH";
111
+ /** A publish request needs the org's publisher profile, which doesn't exist
112
+ * yet (docs/plugin-publishing.md). Claim a handle first. */
113
+ ErrorCode["PUBLISHER_REQUIRED"] = "PUBLISHER_REQUIRED";
114
+ /** The requested publisher handle is reserved (Official/Verified
115
+ * reservations, confusables). Submit a `claim` request instead. */
116
+ ErrorCode["PUBLISHER_HANDLE_RESERVED"] = "PUBLISHER_HANDLE_RESERVED";
117
+ /** A publish request failed a submit gate (public visibility, SPDX license,
118
+ * README, signature, scan, vulnerability gate …); `details.gates` lists them. */
119
+ ErrorCode["PUBLISH_GATE_FAILED"] = "PUBLISH_GATE_FAILED";
120
+ /** A Verified-publisher application (or its decision) from an org whose plan
121
+ * lacks the `verified_publisher` feature (Team+, docs/plugin-publishing.md). */
122
+ ErrorCode["VERIFIED_PLAN_REQUIRED"] = "VERIFIED_PLAN_REQUIRED";
123
+ /** A Verified-publisher application from an org with no DNS-verified domain. */
124
+ ErrorCode["VERIFIED_DOMAIN_REQUIRED"] = "VERIFIED_DOMAIN_REQUIRED";
125
+ /** A Verified-publisher application from an org whose owner has no second
126
+ * factor (passkey or authenticator app). */
127
+ ErrorCode["VERIFIED_OWNER_MFA_REQUIRED"] = "VERIFIED_OWNER_MFA_REQUIRED";
128
+ /** A plugin reference names an ecosystem listing the org hasn't installed (or
129
+ * whose install is pending, denied, or doesn't cover the version asked for;
130
+ * `details.reason`) — docs/plugin-publishing.md */
131
+ ErrorCode["PLUGIN_NOT_INSTALLED"] = "PLUGIN_NOT_INSTALLED";
132
+ /** The org's consumption policy refuses the listing: its tier isn't allowed,
133
+ * the listing is blocked, or an advisory blocks the version (`details.reason`). */
134
+ ErrorCode["PLUGIN_BLOCKED_BY_POLICY"] = "PLUGIN_BLOCKED_BY_POLICY";
135
+ /** The listing or version can't be used: yanked, suspended, or paused for new
136
+ * installs (`details.reason`). */
137
+ ErrorCode["PLUGIN_UNAVAILABLE"] = "PLUGIN_UNAVAILABLE";
138
+ /** An auto-created placeholder plugin can't take the name of a listed plugin
139
+ * — install the listing instead. */
140
+ ErrorCode["PLUGIN_NAME_LISTED"] = "PLUGIN_NAME_LISTED";
141
+ /** An anonymous submission names a community listing another submitter owns,
142
+ * a reserved name, an Official/Verified listing's name, or one confusable
143
+ * with a top listing; `details.reason` says which. */
144
+ ErrorCode["NAME_TAKEN"] = "NAME_TAKEN";
64
145
  // Billing errors
65
146
  ErrorCode["PAYMENT_METHOD_REQUIRED"] = "PAYMENT_METHOD_REQUIRED";
66
147
  ErrorCode["DISCOUNT_CEILING_EXCEEDED"] = "DISCOUNT_CEILING_EXCEEDED";
@@ -89,14 +170,25 @@ export const ErrorCodeStatus = {
89
170
  [ErrorCode.MFA_REQUIRED]: 401,
90
171
  [ErrorCode.REAUTH_REQUIRED]: 401,
91
172
  [ErrorCode.INSUFFICIENT_PERMISSIONS]: 403,
173
+ [ErrorCode.SYSTEM_ORG_REQUIRED]: 403,
174
+ [ErrorCode.PUBLISHER_TERMS_REQUIRED]: 403,
175
+ [ErrorCode.PUBLISHER_ROOT_ORG_REQUIRED]: 403,
176
+ [ErrorCode.PUBLISHER_SUSPENDED]: 403,
177
+ [ErrorCode.PLUGIN_PUBLISHING_DISABLED]: 403,
178
+ [ErrorCode.PLUGIN_REVIEWS_DISABLED]: 403,
179
+ [ErrorCode.REVIEW_SELF_PROMOTION]: 403,
180
+ [ErrorCode.SEPARATION_OF_DUTIES]: 403,
92
181
  [ErrorCode.HUMAN_SESSION_REQUIRED]: 403,
93
182
  [ErrorCode.MFA_ENROLLMENT_REQUIRED]: 403,
183
+ [ErrorCode.IMPERSONATION_READ_ONLY]: 403,
94
184
  [ErrorCode.ORG_MISMATCH]: 403,
95
185
  [ErrorCode.COMPLIANCE_VIOLATION]: 403,
96
186
  [ErrorCode.NOT_FOUND]: 404,
97
187
  [ErrorCode.ORG_NOT_FOUND]: 404,
188
+ [ErrorCode.SUBMISSIONS_DISABLED]: 404,
98
189
  [ErrorCode.VALIDATION_ERROR]: 400,
99
190
  [ErrorCode.MISSING_REQUIRED_FIELD]: 400,
191
+ [ErrorCode.PROOF_OF_WORK_INVALID]: 400,
100
192
  [ErrorCode.TEMPLATE_UNKNOWN_PATH]: 400,
101
193
  [ErrorCode.TEMPLATE_CYCLE]: 400,
102
194
  [ErrorCode.TEMPLATE_PARSE_ERROR]: 400,
@@ -107,11 +199,26 @@ export const ErrorCodeStatus = {
107
199
  [ErrorCode.TEMPLATE_VALIDATION_FAILED]: 400,
108
200
  [ErrorCode.QUOTA_EXCEEDED]: 429,
109
201
  [ErrorCode.RATE_LIMIT_EXCEEDED]: 429,
202
+ [ErrorCode.SUBMISSION_LIMIT]: 429,
110
203
  [ErrorCode.PAYLOAD_TOO_LARGE]: 413,
111
204
  [ErrorCode.CONFLICT]: 409,
112
205
  [ErrorCode.DUPLICATE_ENTRY]: 409,
113
206
  [ErrorCode.SCAN_CONFLICT]: 409,
114
207
  [ErrorCode.IMAGE_VERIFICATION_FAILED]: 409,
208
+ [ErrorCode.PLUGIN_VERSION_FROZEN]: 409,
209
+ [ErrorCode.PLUGIN_VERSION_IN_USE]: 409,
210
+ [ErrorCode.PLUGIN_DIGEST_MISMATCH]: 409,
211
+ [ErrorCode.PUBLISHER_REQUIRED]: 409,
212
+ [ErrorCode.PUBLISHER_HANDLE_RESERVED]: 409,
213
+ [ErrorCode.PUBLISH_GATE_FAILED]: 409,
214
+ [ErrorCode.VERIFIED_PLAN_REQUIRED]: 403,
215
+ [ErrorCode.VERIFIED_DOMAIN_REQUIRED]: 409,
216
+ [ErrorCode.VERIFIED_OWNER_MFA_REQUIRED]: 409,
217
+ [ErrorCode.PLUGIN_NOT_INSTALLED]: 403,
218
+ [ErrorCode.PLUGIN_BLOCKED_BY_POLICY]: 403,
219
+ [ErrorCode.PLUGIN_UNAVAILABLE]: 409,
220
+ [ErrorCode.PLUGIN_NAME_LISTED]: 409,
221
+ [ErrorCode.NAME_TAKEN]: 409,
115
222
  [ErrorCode.PAYMENT_METHOD_REQUIRED]: 402,
116
223
  [ErrorCode.DISCOUNT_CEILING_EXCEEDED]: 400,
117
224
  [ErrorCode.DISCOUNT_NOT_FOUND]: 404,
@@ -130,4 +237,4 @@ export const ErrorCodeStatus = {
130
237
  export function getStatusForErrorCode(code) {
131
238
  return ErrorCodeStatus[code] ?? 500;
132
239
  }
133
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFOLElBQVksU0E2RVg7QUE3RUQsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQjs7O3VEQUdtRDtJQUNuRCwwQ0FBNkIsQ0FBQTtJQUM3Qjs4RUFDMEU7SUFDMUUsZ0RBQW1DLENBQUE7SUFFbkMsNkJBQTZCO0lBQzdCLGtFQUFxRCxDQUFBO0lBQ3JEO3dFQUNvRTtJQUNwRSw4REFBaUQsQ0FBQTtJQUNqRDtvRUFDZ0U7SUFDaEUsZ0VBQW1ELENBQUE7SUFDbkQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUNqRCw0REFBK0MsQ0FBQTtJQUMvQyw4Q0FBaUMsQ0FBQTtJQUNqQywwREFBNkMsQ0FBQTtJQUM3Qyw4REFBaUQsQ0FBQTtJQUNqRCxvRUFBdUQsQ0FBQTtJQUN2RCx3RUFBMkQsQ0FBQTtJQUMzRCw4REFBaUQsQ0FBQTtJQUNqRCxzRUFBeUQsQ0FBQTtJQUV6RCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0MsdUJBQXVCO0lBQ3ZCLG9EQUF1QyxDQUFBO0lBRXZDLHdCQUF3QjtJQUN4QixrQ0FBcUIsQ0FBQTtJQUNyQixnREFBbUMsQ0FBQTtJQUNuQyw0Q0FBK0IsQ0FBQTtJQUMvQjs7d0VB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LENBQUMsaUJBQWlCLENBQUMsRUFBRSxHQUFHO0lBQ2xDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUc7SUFDOUIsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO0lBQy9CLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUc7SUFDL0IsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRztJQUNoQyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUc7SUFDcEMsQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsRUFBRSxHQUFHO0NBQ2hELENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUFlO0lBQ25ELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGVycm9yIGNvZGVzIHVzZWQgYWNyb3NzIGFsbCBBUEkgbWljcm9zZXJ2aWNlcy5cbiAqIFVzZSB0aGVzZSBjb2RlcyBpbiBlcnJvciByZXNwb25zZXMgZm9yIGNvbnNpc3RlbnQgY2xpZW50IGhhbmRsaW5nLlxuICpcbiAqIEVhY2ggSFRUUCBzdGF0dXMgY2F0ZWdvcnkgaGFzIG9uZSBwcmltYXJ5IGNvZGUuIFVzZSB0aGUgYGRldGFpbHNgXG4gKiBmaWVsZCBpbiBlcnJvciByZXNwb25zZXMgZm9yIHN1Yi10eXBlIGluZm9ybWF0aW9uIChlLmcuIHdoaWNoIHF1b3RhXG4gKiB3YXMgZXhjZWVkZWQsIHdoaWNoIGZpZWxkIGZhaWxlZCB2YWxpZGF0aW9uKS5cbiAqL1xuZXhwb3J0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gQXV0aGVudGljYXRpb24gZXJyb3JzICg0MDEpXG4gIFVOQVVUSE9SSVpFRCA9ICdVTkFVVEhPUklaRUQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ1RPS0VOX0VYUElSRUQnLFxuICBUT0tFTl9JTlZBTElEID0gJ1RPS0VOX0lOVkFMSUQnLFxuICBUT0tFTl9NSVNTSU5HID0gJ1RPS0VOX01JU1NJTkcnLFxuICBUT0tFTl9SRVZPS0VEID0gJ1RPS0VOX1JFVk9LRUQnLFxuICAvKiogVGhlIHNlc3Npb24gaXMgbm90IE1GQS1ncmFkZSAoYGFhbGAgYmVsb3cgdGhlIHJvdXRlJ3MgYG1pbkFzc3VyYW5jZWApLlxuICAgKiAgVGhlIGNsaWVudCBzZW5kcyB0aGUgcGVyc29uIHRvIGVucm9sIC8gc2lnbiBpbiBhZ2FpbiB3aXRoIGEgc2Vjb25kXG4gICAqICBmYWN0b3Ig4oCUIGl0IG11c3QgTk9UIHNpZ24gdGhlbSBvdXQgb3IgcmV0cnkgYSB0b2tlbiByZWZyZXNoLCBzaW5jZSBhXG4gICAqICByZWZyZXNoIGNhbiBuZXZlciByYWlzZSB0aGUgYXNzdXJhbmNlIGxldmVsLiAqL1xuICBNRkFfUkVRVUlSRUQgPSAnTUZBX1JFUVVJUkVEJyxcbiAgLyoqIFRoZSBzZXNzaW9uIGlzIE1GQS1ncmFkZSBidXQgaXRzIGBhdXRoX3RpbWVgIGlzIG9sZGVyIHRoYW4gdGhlIHJvdXRlJ3NcbiAgICogIGBtYXhBZ2VgIOKAlCB0aGUgcGVyc29uIG11c3QgYXV0aGVudGljYXRlIGFnYWluIChub3QgbWVyZWx5IHJlZnJlc2gpLiAqL1xuICBSRUFVVEhfUkVRVUlSRUQgPSAnUkVBVVRIX1JFUVVJUkVEJyxcblxuICAvLyBBdXRob3JpemF0aW9uIGVycm9ycyAoNDAzKVxuICBJTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMgPSAnSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TJyxcbiAgLyoqIEEgbWFjaGluZSBjcmVkZW50aWFsIChzZXJ2aWNlIHByaW5jaXBhbCwgb3JnIHNlcnZpY2UgYWNjb3VudCwgb3IgYW5cbiAgICogIGV4Y2hhbmdlZCBhY2Nlc3Mga2V5KSByZWFjaGVkIGEgcm91dGUgdGhhdCByZXF1aXJlcyBhIHBlcnNvbi4gKi9cbiAgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRCA9ICdIVU1BTl9TRVNTSU9OX1JFUVVJUkVEJyxcbiAgLyoqIEEgYm9vdHN0cmFwLWFkbWluIGVucm9sbWVudCBzZXNzaW9uIChgbWZhRW5yb2xsbWVudFBlbmRpbmdgKSByZWFjaGVkIGFcbiAgICogIHJvdXRlIG91dHNpZGUgdGhlIGVucm9sbWVudCAvIHNpZ24tb3V0IC8gc2V0dXAgYWxsb3dsaXN0LiAqL1xuICBNRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCA9ICdNRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCcsXG4gIE9SR19NSVNNQVRDSCA9ICdPUkdfTUlTTUFUQ0gnLFxuICBDT01QTElBTkNFX1ZJT0xBVElPTiA9ICdDT01QTElBTkNFX1ZJT0xBVElPTicsXG5cbiAgLy8gTm90IGZvdW5kIGVycm9ycyAoNDA0KVxuICBOT1RfRk9VTkQgPSAnTk9UX0ZPVU5EJyxcbiAgT1JHX05PVF9GT1VORCA9ICdPUkdfTk9UX0ZPVU5EJyxcblxuICAvLyBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKVxuICBWQUxJREFUSU9OX0VSUk9SID0gJ1ZBTElEQVRJT05fRVJST1InLFxuICBNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEID0gJ01JU1NJTkdfUkVRVUlSRURfRklFTEQnLFxuICBURU1QTEFURV9VTktOT1dOX1BBVEggPSAnVEVNUExBVEVfVU5LTk9XTl9QQVRIJyxcbiAgVEVNUExBVEVfQ1lDTEUgPSAnVEVNUExBVEVfQ1lDTEUnLFxuICBURU1QTEFURV9QQVJTRV9FUlJPUiA9ICdURU1QTEFURV9QQVJTRV9FUlJPUicsXG4gIFRFTVBMQVRFX1RZUEVfTUlTTUFUQ0ggPSAnVEVNUExBVEVfVFlQRV9NSVNNQVRDSCcsXG4gIFRFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRUQgPSAnVEVNUExBVEVfU0VDUkVUU19SRVNFUlZFRCcsXG4gIFRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTiA9ICdURU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT04nLFxuICBURU1QTEFURV9TSVpFX0VYQ0VFREVEID0gJ1RFTVBMQVRFX1NJWkVfRVhDRUVERUQnLFxuICBURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCA9ICdURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCcsXG5cbiAgLy8gUXVvdGEvUmF0ZSBsaW1pdCBlcnJvcnMgKDQyOSlcbiAgUVVPVEFfRVhDRUVERUQgPSAnUVVPVEFfRVhDRUVERUQnLFxuICBSQVRFX0xJTUlUX0VYQ0VFREVEID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuXG4gIC8vIFBheWxvYWQgZXJyb3JzICg0MTMpXG4gIFBBWUxPQURfVE9PX0xBUkdFID0gJ1BBWUxPQURfVE9PX0xBUkdFJyxcblxuICAvLyBDb25mbGljdCBlcnJvcnMgKDQwOSlcbiAgQ09ORkxJQ1QgPSAnQ09ORkxJQ1QnLFxuICBEVVBMSUNBVEVfRU5UUlkgPSAnRFVQTElDQVRFX0VOVFJZJyxcbiAgU0NBTl9DT05GTElDVCA9ICdTQ0FOX0NPTkZMSUNUJyxcbiAgLyoqIEEgcGx1Z2luIGltYWdlJ3MgY29zaWduIHNpZ25hdHVyZSAob3IgaXRzIHNpZ25lZCBTQk9NIGF0dGVzdGF0aW9uKSBkaWRcbiAgICogIG5vdCB2ZXJpZnkgYWdhaW5zdCB0aGUgcGxhdGZvcm0ncyBwbHVnaW4tc2lnbmluZyBrZXkg4oCUIHRoZSByZWdpc3RyeVxuICAgKiAgY29udGVudCBubyBsb25nZXIgbWF0Y2hlcyB3aGF0IHRoZSBwbGF0Zm9ybSBidWlsdCBhbmQgc2lnbmVkLiAqL1xuICBJTUFHRV9WRVJJRklDQVRJT05fRkFJTEVEID0gJ0lNQUdFX1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuXG4gIC8vIEJpbGxpbmcgZXJyb3JzXG4gIFBBWU1FTlRfTUVUSE9EX1JFUVVJUkVEID0gJ1BBWU1FTlRfTUVUSE9EX1JFUVVJUkVEJywgLy8gNDAyXG4gIERJU0NPVU5UX0NFSUxJTkdfRVhDRUVERUQgPSAnRElTQ09VTlRfQ0VJTElOR19FWENFRURFRCcsIC8vIDQwMFxuICBESVNDT1VOVF9OT1RfRk9VTkQgPSAnRElTQ09VTlRfTk9UX0ZPVU5EJywgLy8gNDA0XG4gIERJU0NPVU5UX0lOQUNUSVZFID0gJ0RJU0NPVU5UX0lOQUNUSVZFJywgLy8gNDA5XG4gIFBMQU5fT1ZFUl9DQVAgPSAnUExBTl9PVkVSX0NBUCcsIC8vIDQwOVxuICBBRERPTl9PVkVSX0NBUCA9ICdBRERPTl9PVkVSX0NBUCcsIC8vIDQwOVxuXG4gIC8vIFNlcnZlciBlcnJvcnMgKDUwMClcbiAgSU5URVJOQUxfRVJST1IgPSAnSU5URVJOQUxfRVJST1InLFxuICBEQVRBQkFTRV9FUlJPUiA9ICdEQVRBQkFTRV9FUlJPUicsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkICg1MDEpIOKAlCB0aGUgY29uZmlndXJlZCBwcm92aWRlciBoYXMgbm8gc3VjaCBjYXBhYmlsaXR5XG4gIE5PVF9JTVBMRU1FTlRFRCA9ICdOT1RfSU1QTEVNRU5URUQnLFxuXG4gIC8vIFNlcnZpY2UgdW5hdmFpbGFibGUgKDUwMylcbiAgU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdTRVJWSUNFX1VOQVZBSUxBQkxFJyxcbiAgQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFID0gJ0NPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRScsXG59XG5cbi8qKlxuICogTWFwcyBlcnJvciBjb2RlcyB0byB0aGVpciBkZWZhdWx0IEhUVFAgc3RhdHVzIGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlU3RhdHVzOiBSZWNvcmQ8RXJyb3JDb2RlLCBudW1iZXI+ID0ge1xuICBbRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX0lOVkFMSURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fTUlTU0lOR106IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9SRVZPS0VEXTogNDAxLFxuICBbRXJyb3JDb2RlLk1GQV9SRVFVSVJFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5SRUFVVEhfUkVRVUlSRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TXTogNDAzLFxuICBbRXJyb3JDb2RlLkhVTUFOX1NFU1NJT05fUkVRVUlSRURdOiA0MDMsXG4gIFtFcnJvckNvZGUuTUZBX0VOUk9MTE1FTlRfUkVRVUlSRURdOiA0MDMsXG4gIFtFcnJvckNvZGUuT1JHX01JU01BVENIXTogNDAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfVklPTEFUSU9OXTogNDAzLFxuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5PUkdfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9VTktOT1dOX1BBVEhdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfQ1lDTEVdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfVFlQRV9NSVNNQVRDSF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TRUNSRVRTX1JFU0VSVkVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTl06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TSVpFX0VYQ0VFREVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1ZBTElEQVRJT05fRkFJTEVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERURdOiA0MjksXG4gIFtFcnJvckNvZGUuUEFZTE9BRF9UT09fTEFSR0VdOiA0MTMsXG4gIFtFcnJvckNvZGUuQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuRFVQTElDQVRFX0VOVFJZXTogNDA5LFxuICBbRXJyb3JDb2RlLlNDQU5fQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRF06IDQwOSxcbiAgW0Vycm9yQ29kZS5QQVlNRU5UX01FVEhPRF9SRVFVSVJFRF06IDQwMixcbiAgW0Vycm9yQ29kZS5ESVNDT1VOVF9DRUlMSU5HX0VYQ0VFREVEXTogNDAwLFxuICBbRXJyb3JDb2RlLkRJU0NPVU5UX05PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5ESVNDT1VOVF9JTkFDVElWRV06IDQwOSxcbiAgW0Vycm9yQ29kZS5QTEFOX09WRVJfQ0FQXTogNDA5LFxuICBbRXJyb3JDb2RlLkFERE9OX09WRVJfQ0FQXTogNDA5LFxuICBbRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLkRBVEFCQVNFX0VSUk9SXTogNTAwLFxuICBbRXJyb3JDb2RlLk5PVF9JTVBMRU1FTlRFRF06IDUwMSxcbiAgW0Vycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRV06IDUwMyxcbn07XG5cbi8qKlxuICogR2V0IHRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciBhbiBlcnJvciBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKGNvZGU6IEVycm9yQ29kZSk6IG51bWJlciB7XG4gIHJldHVybiBFcnJvckNvZGVTdGF0dXNbY29kZV0gPz8gNTAwO1xufVxuIl19
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFOLElBQVksU0E4Slg7QUE5SkQsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQjs7O3VEQUdtRDtJQUNuRCwwQ0FBNkIsQ0FBQTtJQUM3Qjs4RUFDMEU7SUFDMUUsZ0RBQW1DLENBQUE7SUFFbkMsNkJBQTZCO0lBQzdCLGtFQUFxRCxDQUFBO0lBQ3JEO3dFQUNvRTtJQUNwRSw4REFBaUQsQ0FBQTtJQUNqRDtvRUFDZ0U7SUFDaEUsZ0VBQW1ELENBQUE7SUFDbkQ7a0VBQzhEO0lBQzlELGdFQUFtRCxDQUFBO0lBQ25EOztvRkFFZ0Y7SUFDaEYsd0RBQTJDLENBQUE7SUFDM0M7d0VBQ29FO0lBQ3BFLGtFQUFxRCxDQUFBO0lBQ3JEOzJCQUN1QjtJQUN2Qix3RUFBMkQsQ0FBQTtJQUMzRCxvREFBb0Q7SUFDcEQsd0RBQTJDLENBQUE7SUFDM0Msd0ZBQXdGO0lBQ3hGLHNFQUF5RCxDQUFBO0lBQ3pEO3lEQUNxRDtJQUNyRCxnRUFBbUQsQ0FBQTtJQUNuRDsyREFDdUQ7SUFDdkQsNERBQStDLENBQUE7SUFDL0M7OzJDQUV1QztJQUN2QywwREFBNkMsQ0FBQTtJQUM3QywwQ0FBNkIsQ0FBQTtJQUM3QiwwREFBNkMsQ0FBQTtJQUU3Qyx5QkFBeUI7SUFDekIsb0NBQXVCLENBQUE7SUFDdkIsNENBQStCLENBQUE7SUFDL0I7OytEQUUyRDtJQUMzRCwwREFBNkMsQ0FBQTtJQUU3QywwQkFBMEI7SUFDMUIsa0RBQXFDLENBQUE7SUFDckMs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Q0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEdBQUc7SUFDeEMsQ0FBQyxTQUFTLENBQUMseUJBQXlCLENBQUMsRUFBRSxHQUFHO0lBQzFDLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsR0FBRztJQUNuQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUc7SUFDbEMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRztJQUM5QixDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxHQUFHO0lBQy9CLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUc7SUFDL0IsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsR0FBRztJQUMvQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxHQUFHO0lBQ2hDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRztJQUNwQyxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEdBQUc7Q0FDaEQsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBQWU7SUFDbkQsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTdGFuZGFyZGl6ZWQgZXJyb3IgY29kZXMgdXNlZCBhY3Jvc3MgYWxsIEFQSSBtaWNyb3NlcnZpY2VzLlxuICogVXNlIHRoZXNlIGNvZGVzIGluIGVycm9yIHJlc3BvbnNlcyBmb3IgY29uc2lzdGVudCBjbGllbnQgaGFuZGxpbmcuXG4gKlxuICogRWFjaCBIVFRQIHN0YXR1cyBjYXRlZ29yeSBoYXMgb25lIHByaW1hcnkgY29kZS4gVXNlIHRoZSBgZGV0YWlsc2BcbiAqIGZpZWxkIGluIGVycm9yIHJlc3BvbnNlcyBmb3Igc3ViLXR5cGUgaW5mb3JtYXRpb24gKGUuZy4gd2hpY2ggcXVvdGFcbiAqIHdhcyBleGNlZWRlZCwgd2hpY2ggZmllbGQgZmFpbGVkIHZhbGlkYXRpb24pLlxuICovXG5leHBvcnQgZW51bSBFcnJvckNvZGUge1xuICAvLyBBdXRoZW50aWNhdGlvbiBlcnJvcnMgKDQwMSlcbiAgVU5BVVRIT1JJWkVEID0gJ1VOQVVUSE9SSVpFRCcsXG4gIFRPS0VOX0VYUElSRUQgPSAnVE9LRU5fRVhQSVJFRCcsXG4gIFRPS0VOX0lOVkFMSUQgPSAnVE9LRU5fSU5WQUxJRCcsXG4gIFRPS0VOX01JU1NJTkcgPSAnVE9LRU5fTUlTU0lORycsXG4gIFRPS0VOX1JFVk9LRUQgPSAnVE9LRU5fUkVWT0tFRCcsXG4gIC8qKiBUaGUgc2Vzc2lvbiBpcyBub3QgTUZBLWdyYWRlIChgYWFsYCBiZWxvdyB0aGUgcm91dGUncyBgbWluQXNzdXJhbmNlYCkuXG4gICAqICBUaGUgY2xpZW50IHNlbmRzIHRoZSBwZXJzb24gdG8gZW5yb2wgLyBzaWduIGluIGFnYWluIHdpdGggYSBzZWNvbmRcbiAgICogIGZhY3RvciDigJQgaXQgbXVzdCBOT1Qgc2lnbiB0aGVtIG91dCBvciByZXRyeSBhIHRva2VuIHJlZnJlc2gsIHNpbmNlIGFcbiAgICogIHJlZnJlc2ggY2FuIG5ldmVyIHJhaXNlIHRoZSBhc3N1cmFuY2UgbGV2ZWwuICovXG4gIE1GQV9SRVFVSVJFRCA9ICdNRkFfUkVRVUlSRUQnLFxuICAvKiogVGhlIHNlc3Npb24gaXMgTUZBLWdyYWRlIGJ1dCBpdHMgYGF1dGhfdGltZWAgaXMgb2xkZXIgdGhhbiB0aGUgcm91dGUnc1xuICAgKiAgYG1heEFnZWAg4oCUIHRoZSBwZXJzb24gbXVzdCBhdXRoZW50aWNhdGUgYWdhaW4gKG5vdCBtZXJlbHkgcmVmcmVzaCkuICovXG4gIFJFQVVUSF9SRVFVSVJFRCA9ICdSRUFVVEhfUkVRVUlSRUQnLFxuXG4gIC8vIEF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMpXG4gIElOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyA9ICdJTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMnLFxuICAvKiogQSBtYWNoaW5lIGNyZWRlbnRpYWwgKHNlcnZpY2UgcHJpbmNpcGFsLCBvcmcgc2VydmljZSBhY2NvdW50LCBvciBhblxuICAgKiAgZXhjaGFuZ2VkIGFjY2VzcyBrZXkpIHJlYWNoZWQgYSByb3V0ZSB0aGF0IHJlcXVpcmVzIGEgcGVyc29uLiAqL1xuICBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEID0gJ0hVTUFOX1NFU1NJT05fUkVRVUlSRUQnLFxuICAvKiogQSBib290c3RyYXAtYWRtaW4gZW5yb2xtZW50IHNlc3Npb24gKGBtZmFFbnJvbGxtZW50UGVuZGluZ2ApIHJlYWNoZWQgYVxuICAgKiAgcm91dGUgb3V0c2lkZSB0aGUgZW5yb2xtZW50IC8gc2lnbi1vdXQgLyBzZXR1cCBhbGxvd2xpc3QuICovXG4gIE1GQV9FTlJPTExNRU5UX1JFUVVJUkVEID0gJ01GQV9FTlJPTExNRU5UX1JFUVVJUkVEJyxcbiAgLyoqIEEgcmVhZC1vbmx5IGltcGVyc29uYXRpb24gdG9rZW4gKGBpbXBlcnNvbmF0aW9uUmVhZE9ubHlgKSBhdHRlbXB0ZWQgYVxuICAgKiAgc3RhdGUtY2hhbmdpbmcgcmVxdWVzdCAoYW55dGhpbmcgYnV0IEdFVC9IRUFEL09QVElPTlMpLiAqL1xuICBJTVBFUlNPTkFUSU9OX1JFQURfT05MWSA9ICdJTVBFUlNPTkFUSU9OX1JFQURfT05MWScsXG4gIC8qKiBBIHBsdWdpbi1lY29zeXN0ZW0gZ292ZXJuYW5jZSByb3V0ZSAoZG9jcy9ydW5ib29rcy9lY29zeXN0ZW0tbW9kZXJhdGlvbi5tZClcbiAgICogIHdhcyBjYWxsZWQgZnJvbSBhbiBhY3RpdmUgb3JnIG90aGVyIHRoYW4gdGhlIHN5c3RlbSBvcmcg4oCUIGEgdG9rZW4gbWludGVkIGluXG4gICAqICBhIHRlbmFudCBvcmcgaXMgcmVmdXNlZCBldmVuIGZvciB0aGUgc2FtZSB1c2VyLiBTd2l0Y2ggdG8gdGhlIHN5c3RlbSBvcmcuICovXG4gIFNZU1RFTV9PUkdfUkVRVUlSRUQgPSAnU1lTVEVNX09SR19SRVFVSVJFRCcsXG4gIC8qKiBUaGUgcHVibGlzaGVyIGhhc24ndCBhY2NlcHRlZCB0aGUgQ1VSUkVOVCBwdWJsaXNoZXIgdGVybXMgdmVyc2lvbiwgc28gaXRcbiAgICogIGNhbid0IHN1Ym1pdCBuZXcgcmVxdWVzdHMgKGV4aXN0aW5nIGxpc3RpbmdzIGFyZSB1bmFmZmVjdGVkKS4gKi9cbiAgUFVCTElTSEVSX1RFUk1TX1JFUVVJUkVEID0gJ1BVQkxJU0hFUl9URVJNU19SRVFVSVJFRCcsXG4gIC8qKiBQdWJsaXNoaW5nIGlzIGRvbmUgZnJvbSB0aGUgUk9PVCBvcmc7IGEgdGVhbSBvcmcgY2FuJ3Qgb3duIGEgcHVibGlzaGVyIG9yXG4gICAqICBzdWJtaXQgcmVxdWVzdHMuICovXG4gIFBVQkxJU0hFUl9ST09UX09SR19SRVFVSVJFRCA9ICdQVUJMSVNIRVJfUk9PVF9PUkdfUkVRVUlSRUQnLFxuICAvKiogVGhlIHB1Ymxpc2hlciBpcyBzdXNwZW5kZWQgYnkgdGhlIHN5c3RlbSBvcmcuICovXG4gIFBVQkxJU0hFUl9TVVNQRU5ERUQgPSAnUFVCTElTSEVSX1NVU1BFTkRFRCcsXG4gIC8qKiBUZW5hbnQgcHVibGlzaGluZyBpcyBzd2l0Y2hlZCBvZmYgb24gdGhpcyBpbnN0YW5jZSAoYFBMVUdJTl9QVUJMSVNISU5HX0VOQUJMRURgKS4gKi9cbiAgUExVR0lOX1BVQkxJU0hJTkdfRElTQUJMRUQgPSAnUExVR0lOX1BVQkxJU0hJTkdfRElTQUJMRUQnLFxuICAvKiogUmV2aWV3IHdyaXRlcyBhcmUgc3dpdGNoZWQgb2ZmIG9uIHRoaXMgaW5zdGFuY2UgKGBQTFVHSU5fUkVWSUVXU19FTkFCTEVEYCk6XG4gICAqICByZXZpZXdzIHN0YXkgcmVhZGFibGUsIG5vdGhpbmcgbmV3IGlzIHdyaXR0ZW4uICovXG4gIFBMVUdJTl9SRVZJRVdTX0RJU0FCTEVEID0gJ1BMVUdJTl9SRVZJRVdTX0RJU0FCTEVEJyxcbiAgLyoqIEEgbWVtYmVyIG9mIHRoZSBwdWJsaXNoZXIncyBvd24gb3JnYW5pemF0aW9uIHRyaWVkIHRvIHJldmlldyAob3Igdm90ZSBvbiBhXG4gICAqICByZXZpZXcgb2YpIG9uZSBvZiBpdHMgbGlzdGluZ3MgKHNlbGYtcHJvbW90aW9uKS4gKi9cbiAgUkVWSUVXX1NFTEZfUFJPTU9USU9OID0gJ1JFVklFV19TRUxGX1BST01PVElPTicsXG4gIC8qKiBTZXBhcmF0aW9uIG9mIGR1dGllczogdGhlIGNhbGxlciBtYXkgbm90IGRlY2lkZSB0aGlzIHJlcXVlc3Qg4oCUXG4gICAqICBpdCBjYW1lIGZyb20gYW4gb3JnIHRoZXkgYmVsb25nIHRvLCB0aGV5IHVwbG9hZGVkIHRoZSB2ZXJzaW9uLCBvciB0aGV5XG4gICAqICBnYXZlIHRoZSBmaXJzdCBvZiB0d28gYXBwcm92YWxzLiAqL1xuICBTRVBBUkFUSU9OX09GX0RVVElFUyA9ICdTRVBBUkFUSU9OX09GX0RVVElFUycsXG4gIE9SR19NSVNNQVRDSCA9ICdPUkdfTUlTTUFUQ0gnLFxuICBDT01QTElBTkNFX1ZJT0xBVElPTiA9ICdDT01QTElBTkNFX1ZJT0xBVElPTicsXG5cbiAgLy8gTm90IGZvdW5kIGVycm9ycyAoNDA0KVxuICBOT1RfRk9VTkQgPSAnTk9UX0ZPVU5EJyxcbiAgT1JHX05PVF9GT1VORCA9ICdPUkdfTk9UX0ZPVU5EJyxcbiAgLyoqIFRoZSBhbm9ueW1vdXMgcGx1Z2luIHN1Ym1pc3Npb24gQVBJIGlzIG9mZiBvbiB0aGlzIGluc3RhbmNlXG4gICAqICAoYEFOT05ZTU9VU19TVUJNSVNTSU9OU19FTkFCTEVEYCwgb3Igb3V0Ym91bmQgZW1haWwgaXNuJ3QgY29uZmlndXJlZCkg4oCUXG4gICAqICBhbnN3ZXJlZCBhcyBhIHBsYWluIDQwNCAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCkuICovXG4gIFNVQk1JU1NJT05TX0RJU0FCTEVEID0gJ1NVQk1JU1NJT05TX0RJU0FCTEVEJyxcblxuICAvLyBWYWxpZGF0aW9uIGVycm9ycyAoNDAwKVxuICBWQUxJREFUSU9OX0VSUk9SID0gJ1ZBTElEQVRJT05fRVJST1InLFxuICBNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEID0gJ01JU1NJTkdfUkVRVUlSRURfRklFTEQnLFxuICAvKiogQSBwcm9vZi1vZi13b3JrIGFuc3dlciBpcyBtaXNzaW5nLCBtYWxmb3JtZWQsIGV4cGlyZWQsIHRvbyBlYXN5LCB3cm9uZyxcbiAgICogIG9yIHdhcyBhbHJlYWR5IHVzZWQgKGFub255bW91cyBzdWJtaXNzaW9ucykuICovXG4gIFBST09GX09GX1dPUktfSU5WQUxJRCA9ICdQUk9PRl9PRl9XT1JLX0lOVkFMSUQnLFxuICBURU1QTEFURV9VTktOT1dOX1BBVEggPSAnVEVNUExBVEVfVU5LTk9XTl9QQVRIJyxcbiAgVEVNUExBVEVfQ1lDTEUgPSAnVEVNUExBVEVfQ1lDTEUnLFxuICBURU1QTEFURV9QQVJTRV9FUlJPUiA9ICdURU1QTEFURV9QQVJTRV9FUlJPUicsXG4gIFRFTVBMQVRFX1RZUEVfTUlTTUFUQ0ggPSAnVEVNUExBVEVfVFlQRV9NSVNNQVRDSCcsXG4gIFRFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRUQgPSAnVEVNUExBVEVfU0VDUkVUU19SRVNFUlZFRCcsXG4gIFRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTiA9ICdURU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT04nLFxuICBURU1QTEFURV9TSVpFX0VYQ0VFREVEID0gJ1RFTVBMQVRFX1NJWkVfRVhDRUVERUQnLFxuICBURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCA9ICdURU1QTEFURV9WQUxJREFUSU9OX0ZBSUxFRCcsXG5cbiAgLy8gUXVvdGEvUmF0ZSBsaW1pdCBlcnJvcnMgKDQyOSlcbiAgUVVPVEFfRVhDRUVERUQgPSAnUVVPVEFfRVhDRUVERUQnLFxuICBSQVRFX0xJTUlUX0VYQ0VFREVEID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAvKiogQW4gYW5vbnltb3VzIHN1Ym1pdHRlciAocGVyIHZlcmlmaWVkIGVtYWlsLCBvciBwZXIgY2xpZW50IElQKSBpcyBhdCB0aGVcbiAgICogIHJvbGxpbmcgMjQtaG91ciBzdWJtaXNzaW9uIGNhcC4gKi9cbiAgU1VCTUlTU0lPTl9MSU1JVCA9ICdTVUJNSVNTSU9OX0xJTUlUJyxcblxuICAvLyBQYXlsb2FkIGVycm9ycyAoNDEzKVxuICBQQVlMT0FEX1RPT19MQVJHRSA9ICdQQVlMT0FEX1RPT19MQVJHRScsXG5cbiAgLy8gQ29uZmxpY3QgZXJyb3JzICg0MDkpXG4gIENPTkZMSUNUID0gJ0NPTkZMSUNUJyxcbiAgRFVQTElDQVRFX0VOVFJZID0gJ0RVUExJQ0FURV9FTlRSWScsXG4gIFNDQU5fQ09ORkxJQ1QgPSAnU0NBTl9DT05GTElDVCcsXG4gIC8qKiBBIHBsdWdpbiBpbWFnZSdzIGNvc2lnbiBzaWduYXR1cmUgKG9yIGl0cyBzaWduZWQgU0JPTSBhdHRlc3RhdGlvbikgZGlkXG4gICAqICBub3QgdmVyaWZ5IGFnYWluc3QgdGhlIHBsYXRmb3JtJ3MgcGx1Z2luLXNpZ25pbmcga2V5IOKAlCB0aGUgcmVnaXN0cnlcbiAgICogIGNvbnRlbnQgbm8gbG9uZ2VyIG1hdGNoZXMgd2hhdCB0aGUgcGxhdGZvcm0gYnVpbHQgYW5kIHNpZ25lZC4gKi9cbiAgSU1BR0VfVkVSSUZJQ0FUSU9OX0ZBSUxFRCA9ICdJTUFHRV9WRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgLyoqIFRoZSBwbHVnaW4gdmVyc2lvbiBpcyBpbW11dGFibGUg4oCUIGEgcHVibGlzaCByZXF1ZXN0IHJlZmVyZW5jZXMgaXRcbiAgICogIChgZnJvemVuX2F0YCBzZXQpIG9yIGl0IGlzIHB1Ymxpc2hlZCB0byBhIGxpc3Rpbmcg4oCUIHNvIGl0IGNhbiBiZSBuZWl0aGVyXG4gICAqICByZS11cGxvYWRlZCwgZWRpdGVkIG5vciBkZWxldGVkIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gKi9cbiAgUExVR0lOX1ZFUlNJT05fRlJPWkVOID0gJ1BMVUdJTl9WRVJTSU9OX0ZST1pFTicsXG4gIC8qKiBUaGUgcGx1Z2luIHZlcnNpb24gaXMgcmVmZXJlbmNlZCBieSBvbmUgb2YgdGhlIG9yZydzIHBpcGVsaW5lcywgb3IgcHVibGlzaGVkXG4gICAqICB0byBhbiBlY29zeXN0ZW0gbGlzdGluZzsgZGVsZXRpbmcgaXQgbmVlZHMgYD9mb3JjZT10cnVlYCBwbHVzIGEgc3RlcC11cC4gKi9cbiAgUExVR0lOX1ZFUlNJT05fSU5fVVNFID0gJ1BMVUdJTl9WRVJTSU9OX0lOX1VTRScsXG4gIC8qKiBBIGZyZWV6ZSBuYW1lZCBhbiBpbWFnZSBkaWdlc3QgdGhhdCBpcyBub3QgdGhlIHZlcnNpb24ncyBzdG9yZWQgZGlnZXN0XG4gICAqICAoZmFpbCBjbG9zZWQ6IHdoYXQgd2FzIHJlcXVlc3RlZCBpcyBub3Qgd2hhdCB3b3VsZCBiZSBwdWJsaXNoZWQpLiAqL1xuICBQTFVHSU5fRElHRVNUX01JU01BVENIID0gJ1BMVUdJTl9ESUdFU1RfTUlTTUFUQ0gnLFxuICAvKiogQSBwdWJsaXNoIHJlcXVlc3QgbmVlZHMgdGhlIG9yZydzIHB1Ymxpc2hlciBwcm9maWxlLCB3aGljaCBkb2Vzbid0IGV4aXN0XG4gICAqICB5ZXQgKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiBDbGFpbSBhIGhhbmRsZSBmaXJzdC4gKi9cbiAgUFVCTElTSEVSX1JFUVVJUkVEID0gJ1BVQkxJU0hFUl9SRVFVSVJFRCcsXG4gIC8qKiBUaGUgcmVxdWVzdGVkIHB1Ymxpc2hlciBoYW5kbGUgaXMgcmVzZXJ2ZWQgKE9mZmljaWFsL1ZlcmlmaWVkXG4gICAqICByZXNlcnZhdGlvbnMsIGNvbmZ1c2FibGVzKS4gU3VibWl0IGEgYGNsYWltYCByZXF1ZXN0IGluc3RlYWQuICovXG4gIFBVQkxJU0hFUl9IQU5ETEVfUkVTRVJWRUQgPSAnUFVCTElTSEVSX0hBTkRMRV9SRVNFUlZFRCcsXG4gIC8qKiBBIHB1Ymxpc2ggcmVxdWVzdCBmYWlsZWQgYSBzdWJtaXQgZ2F0ZSAocHVibGljIHZpc2liaWxpdHksIFNQRFggbGljZW5zZSxcbiAgICogIFJFQURNRSwgc2lnbmF0dXJlLCBzY2FuLCB2dWxuZXJhYmlsaXR5IGdhdGUg4oCmKTsgYGRldGFpbHMuZ2F0ZXNgIGxpc3RzIHRoZW0uICovXG4gIFBVQkxJU0hfR0FURV9GQUlMRUQgPSAnUFVCTElTSF9HQVRFX0ZBSUxFRCcsXG4gIC8qKiBBIFZlcmlmaWVkLXB1Ymxpc2hlciBhcHBsaWNhdGlvbiAob3IgaXRzIGRlY2lzaW9uKSBmcm9tIGFuIG9yZyB3aG9zZSBwbGFuXG4gICAqICBsYWNrcyB0aGUgYHZlcmlmaWVkX3B1Ymxpc2hlcmAgZmVhdHVyZSAoVGVhbSssIGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLiAqL1xuICBWRVJJRklFRF9QTEFOX1JFUVVJUkVEID0gJ1ZFUklGSUVEX1BMQU5fUkVRVUlSRUQnLFxuICAvKiogQSBWZXJpZmllZC1wdWJsaXNoZXIgYXBwbGljYXRpb24gZnJvbSBhbiBvcmcgd2l0aCBubyBETlMtdmVyaWZpZWQgZG9tYWluLiAqL1xuICBWRVJJRklFRF9ET01BSU5fUkVRVUlSRUQgPSAnVkVSSUZJRURfRE9NQUlOX1JFUVVJUkVEJyxcbiAgLyoqIEEgVmVyaWZpZWQtcHVibGlzaGVyIGFwcGxpY2F0aW9uIGZyb20gYW4gb3JnIHdob3NlIG93bmVyIGhhcyBubyBzZWNvbmRcbiAgICogIGZhY3RvciAocGFzc2tleSBvciBhdXRoZW50aWNhdG9yIGFwcCkuICovXG4gIFZFUklGSUVEX09XTkVSX01GQV9SRVFVSVJFRCA9ICdWRVJJRklFRF9PV05FUl9NRkFfUkVRVUlSRUQnLFxuICAvKiogQSBwbHVnaW4gcmVmZXJlbmNlIG5hbWVzIGFuIGVjb3N5c3RlbSBsaXN0aW5nIHRoZSBvcmcgaGFzbid0IGluc3RhbGxlZCAob3JcbiAgICogIHdob3NlIGluc3RhbGwgaXMgcGVuZGluZywgZGVuaWVkLCBvciBkb2Vzbid0IGNvdmVyIHRoZSB2ZXJzaW9uIGFza2VkIGZvcjtcbiAgICogIGBkZXRhaWxzLnJlYXNvbmApIOKAlCBkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kICovXG4gIFBMVUdJTl9OT1RfSU5TVEFMTEVEID0gJ1BMVUdJTl9OT1RfSU5TVEFMTEVEJyxcbiAgLyoqIFRoZSBvcmcncyBjb25zdW1wdGlvbiBwb2xpY3kgcmVmdXNlcyB0aGUgbGlzdGluZzogaXRzIHRpZXIgaXNuJ3QgYWxsb3dlZCxcbiAgICogIHRoZSBsaXN0aW5nIGlzIGJsb2NrZWQsIG9yIGFuIGFkdmlzb3J5IGJsb2NrcyB0aGUgdmVyc2lvbiAoYGRldGFpbHMucmVhc29uYCkuICovXG4gIFBMVUdJTl9CTE9DS0VEX0JZX1BPTElDWSA9ICdQTFVHSU5fQkxPQ0tFRF9CWV9QT0xJQ1knLFxuICAvKiogVGhlIGxpc3Rpbmcgb3IgdmVyc2lvbiBjYW4ndCBiZSB1c2VkOiB5YW5rZWQsIHN1c3BlbmRlZCwgb3IgcGF1c2VkIGZvciBuZXdcbiAgICogIGluc3RhbGxzIChgZGV0YWlscy5yZWFzb25gKS4gKi9cbiAgUExVR0lOX1VOQVZBSUxBQkxFID0gJ1BMVUdJTl9VTkFWQUlMQUJMRScsXG4gIC8qKiBBbiBhdXRvLWNyZWF0ZWQgcGxhY2Vob2xkZXIgcGx1Z2luIGNhbid0IHRha2UgdGhlIG5hbWUgb2YgYSBsaXN0ZWQgcGx1Z2luXG4gICAqIOKAlCBpbnN0YWxsIHRoZSBsaXN0aW5nIGluc3RlYWQuICovXG4gIFBMVUdJTl9OQU1FX0xJU1RFRCA9ICdQTFVHSU5fTkFNRV9MSVNURUQnLFxuICAvKiogQW4gYW5vbnltb3VzIHN1Ym1pc3Npb24gbmFtZXMgYSBjb21tdW5pdHkgbGlzdGluZyBhbm90aGVyIHN1Ym1pdHRlciBvd25zLFxuICAgKiAgYSByZXNlcnZlZCBuYW1lLCBhbiBPZmZpY2lhbC9WZXJpZmllZCBsaXN0aW5nJ3MgbmFtZSwgb3Igb25lIGNvbmZ1c2FibGVcbiAgICogIHdpdGggYSB0b3AgbGlzdGluZzsgYGRldGFpbHMucmVhc29uYCBzYXlzIHdoaWNoLiAqL1xuICBOQU1FX1RBS0VOID0gJ05BTUVfVEFLRU4nLFxuXG4gIC8vIEJpbGxpbmcgZXJyb3JzXG4gIFBBWU1FTlRfTUVUSE9EX1JFUVVJUkVEID0gJ1BBWU1FTlRfTUVUSE9EX1JFUVVJUkVEJywgLy8gNDAyXG4gIERJU0NPVU5UX0NFSUxJTkdfRVhDRUVERUQgPSAnRElTQ09VTlRfQ0VJTElOR19FWENFRURFRCcsIC8vIDQwMFxuICBESVNDT1VOVF9OT1RfRk9VTkQgPSAnRElTQ09VTlRfTk9UX0ZPVU5EJywgLy8gNDA0XG4gIERJU0NPVU5UX0lOQUNUSVZFID0gJ0RJU0NPVU5UX0lOQUNUSVZFJywgLy8gNDA5XG4gIFBMQU5fT1ZFUl9DQVAgPSAnUExBTl9PVkVSX0NBUCcsIC8vIDQwOVxuICBBRERPTl9PVkVSX0NBUCA9ICdBRERPTl9PVkVSX0NBUCcsIC8vIDQwOVxuXG4gIC8vIFNlcnZlciBlcnJvcnMgKDUwMClcbiAgSU5URVJOQUxfRVJST1IgPSAnSU5URVJOQUxfRVJST1InLFxuICBEQVRBQkFTRV9FUlJPUiA9ICdEQVRBQkFTRV9FUlJPUicsXG5cbiAgLy8gTm90IGltcGxlbWVudGVkICg1MDEpIOKAlCB0aGUgY29uZmlndXJlZCBwcm92aWRlciBoYXMgbm8gc3VjaCBjYXBhYmlsaXR5XG4gIE5PVF9JTVBMRU1FTlRFRCA9ICdOT1RfSU1QTEVNRU5URUQnLFxuXG4gIC8vIFNlcnZpY2UgdW5hdmFpbGFibGUgKDUwMylcbiAgU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdTRVJWSUNFX1VOQVZBSUxBQkxFJyxcbiAgQ09NUExJQU5DRV9TRVJWSUNFX1VOQVZBSUxBQkxFID0gJ0NPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRScsXG59XG5cbi8qKlxuICogTWFwcyBlcnJvciBjb2RlcyB0byB0aGVpciBkZWZhdWx0IEhUVFAgc3RhdHVzIGNvZGVzLlxuICovXG5leHBvcnQgY29uc3QgRXJyb3JDb2RlU3RhdHVzOiBSZWNvcmQ8RXJyb3JDb2RlLCBudW1iZXI+ID0ge1xuICBbRXJyb3JDb2RlLlVOQVVUSE9SSVpFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX0lOVkFMSURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fTUlTU0lOR106IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9SRVZPS0VEXTogNDAxLFxuICBbRXJyb3JDb2RlLk1GQV9SRVFVSVJFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5SRUFVVEhfUkVRVUlSRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TXTogNDAzLFxuICBbRXJyb3JDb2RlLlNZU1RFTV9PUkdfUkVRVUlSRURdOiA0MDMsXG4gIFtFcnJvckNvZGUuUFVCTElTSEVSX1RFUk1TX1JFUVVJUkVEXTogNDAzLFxuICBbRXJyb3JDb2RlLlBVQkxJU0hFUl9ST09UX09SR19SRVFVSVJFRF06IDQwMyxcbiAgW0Vycm9yQ29kZS5QVUJMSVNIRVJfU1VTUEVOREVEXTogNDAzLFxuICBbRXJyb3JDb2RlLlBMVUdJTl9QVUJMSVNISU5HX0RJU0FCTEVEXTogNDAzLFxuICBbRXJyb3JDb2RlLlBMVUdJTl9SRVZJRVdTX0RJU0FCTEVEXTogNDAzLFxuICBbRXJyb3JDb2RlLlJFVklFV19TRUxGX1BST01PVElPTl06IDQwMyxcbiAgW0Vycm9yQ29kZS5TRVBBUkFUSU9OX09GX0RVVElFU106IDQwMyxcbiAgW0Vycm9yQ29kZS5IVU1BTl9TRVNTSU9OX1JFUVVJUkVEXTogNDAzLFxuICBbRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVEXTogNDAzLFxuICBbRXJyb3JDb2RlLklNUEVSU09OQVRJT05fUkVBRF9PTkxZXTogNDAzLFxuICBbRXJyb3JDb2RlLk9SR19NSVNNQVRDSF06IDQwMyxcbiAgW0Vycm9yQ29kZS5DT01QTElBTkNFX1ZJT0xBVElPTl06IDQwMyxcbiAgW0Vycm9yQ29kZS5OT1RfRk9VTkRdOiA0MDQsXG4gIFtFcnJvckNvZGUuT1JHX05PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5TVUJNSVNTSU9OU19ESVNBQkxFRF06IDQwNCxcbiAgW0Vycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SXTogNDAwLFxuICBbRXJyb3JDb2RlLk1JU1NJTkdfUkVRVUlSRURfRklFTERdOiA0MDAsXG4gIFtFcnJvckNvZGUuUFJPT0ZfT0ZfV09SS19JTlZBTElEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1VOS05PV05fUEFUSF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9DWUNMRV06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9QQVJTRV9FUlJPUl06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9UWVBFX01JU01BVENIXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRURdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfQ09OVFJBQ1RfVklPTEFUSU9OXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1NJWkVfRVhDRUVERURdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfVkFMSURBVElPTl9GQUlMRURdOiA0MDAsXG4gIFtFcnJvckNvZGUuUVVPVEFfRVhDRUVERURdOiA0MjksXG4gIFtFcnJvckNvZGUuUkFURV9MSU1JVF9FWENFRURFRF06IDQyOSxcbiAgW0Vycm9yQ29kZS5TVUJNSVNTSU9OX0xJTUlUXTogNDI5LFxuICBbRXJyb3JDb2RlLlBBWUxPQURfVE9PX0xBUkdFXTogNDEzLFxuICBbRXJyb3JDb2RlLkNPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLkRVUExJQ0FURV9FTlRSWV06IDQwOSxcbiAgW0Vycm9yQ29kZS5TQ0FOX0NPTkZMSUNUXTogNDA5LFxuICBbRXJyb3JDb2RlLklNQUdFX1ZFUklGSUNBVElPTl9GQUlMRURdOiA0MDksXG4gIFtFcnJvckNvZGUuUExVR0lOX1ZFUlNJT05fRlJPWkVOXTogNDA5LFxuICBbRXJyb3JDb2RlLlBMVUdJTl9WRVJTSU9OX0lOX1VTRV06IDQwOSxcbiAgW0Vycm9yQ29kZS5QTFVHSU5fRElHRVNUX01JU01BVENIXTogNDA5LFxuICBbRXJyb3JDb2RlLlBVQkxJU0hFUl9SRVFVSVJFRF06IDQwOSxcbiAgW0Vycm9yQ29kZS5QVUJMSVNIRVJfSEFORExFX1JFU0VSVkVEXTogNDA5LFxuICBbRXJyb3JDb2RlLlBVQkxJU0hfR0FURV9GQUlMRURdOiA0MDksXG4gIFtFcnJvckNvZGUuVkVSSUZJRURfUExBTl9SRVFVSVJFRF06IDQwMyxcbiAgW0Vycm9yQ29kZS5WRVJJRklFRF9ET01BSU5fUkVRVUlSRURdOiA0MDksXG4gIFtFcnJvckNvZGUuVkVSSUZJRURfT1dORVJfTUZBX1JFUVVJUkVEXTogNDA5LFxuICBbRXJyb3JDb2RlLlBMVUdJTl9OT1RfSU5TVEFMTEVEXTogNDAzLFxuICBbRXJyb3JDb2RlLlBMVUdJTl9CTE9DS0VEX0JZX1BPTElDWV06IDQwMyxcbiAgW0Vycm9yQ29kZS5QTFVHSU5fVU5BVkFJTEFCTEVdOiA0MDksXG4gIFtFcnJvckNvZGUuUExVR0lOX05BTUVfTElTVEVEXTogNDA5LFxuICBbRXJyb3JDb2RlLk5BTUVfVEFLRU5dOiA0MDksXG4gIFtFcnJvckNvZGUuUEFZTUVOVF9NRVRIT0RfUkVRVUlSRURdOiA0MDIsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfQ0VJTElOR19FWENFRURFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5ESVNDT1VOVF9OT1RfRk9VTkRdOiA0MDQsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfSU5BQ1RJVkVdOiA0MDksXG4gIFtFcnJvckNvZGUuUExBTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5BRERPTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5EQVRBQkFTRV9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5OT1RfSU1QTEVNRU5URURdOiA1MDEsXG4gIFtFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRV06IDUwMyxcbiAgW0Vycm9yQ29kZS5DT01QTElBTkNFX1NFUlZJQ0VfVU5BVkFJTEFCTEVdOiA1MDMsXG59O1xuXG4vKipcbiAqIEdldCB0aGUgSFRUUCBzdGF0dXMgY29kZSBmb3IgYW4gZXJyb3IgY29kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXR1c0ZvckVycm9yQ29kZShjb2RlOiBFcnJvckNvZGUpOiBudW1iZXIge1xuICByZXR1cm4gRXJyb3JDb2RlU3RhdHVzW2NvZGVdID8/IDUwMDtcbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import type { QuotaTier } from './quota-tiers.js';
2
2
  /** Canonical feature flag identifiers. */
3
- export type FeatureFlag = 'priority_support' | 'custom_integrations' | 'ai_generation' | 'bulk_operations' | 'sso' | 'advanced_reporting' | 'team_usage_analytics' | 'compliance_standard' | 'compliance_advanced';
3
+ export type FeatureFlag = 'priority_support' | 'custom_integrations' | 'ai_generation' | 'bulk_operations' | 'sso' | 'advanced_reporting' | 'team_usage_analytics' | 'compliance_standard' | 'compliance_advanced' | 'verified_publisher';
4
4
  /** All valid feature flags (order determines display order). */
5
5
  export declare const ALL_FEATURE_FLAGS: readonly FeatureFlag[];
6
6
  /** Check whether a string is a valid FeatureFlag. */
@@ -34,3 +34,23 @@ export declare function resolveUserFeatures(tier: QuotaTier, opts?: {
34
34
  isSuperAdmin?: boolean;
35
35
  accountFeatures?: readonly string[] | null;
36
36
  }): FeatureFlag[];
37
+ /**
38
+ * Curated compliance content sets and the feature flag each one is sold under.
39
+ * A set `x` is the published rules tagged `set:<x>`; an org holding the flag is
40
+ * entitled to them. Ordered from the lowest entitlement to the highest.
41
+ */
42
+ export declare const COMPLIANCE_SET_FEATURES: {
43
+ readonly standard: 'compliance_standard';
44
+ readonly advanced: 'compliance_advanced';
45
+ };
46
+ export type ComplianceContentSet = keyof typeof COMPLIANCE_SET_FEATURES;
47
+ /** Every curated set name, lowest entitlement first. */
48
+ export declare const COMPLIANCE_CONTENT_SETS: ComplianceContentSet[];
49
+ /** The curated sets an effective feature set entitles (stable order). */
50
+ export declare function complianceSetsForFeatures(features: readonly string[]): ComplianceContentSet[];
51
+ /**
52
+ * The feature a published rule's `set:<x>` tags require, or `null` for an
53
+ * untagged (baseline) rule. The highest entitlement wins when a rule carries
54
+ * several. Accepts a raw jsonb `tags` value.
55
+ */
56
+ export declare function complianceFeatureForTags(tags: unknown): FeatureFlag | null;
@@ -11,6 +11,7 @@ export const ALL_FEATURE_FLAGS = [
11
11
  'team_usage_analytics',
12
12
  'compliance_standard',
13
13
  'compliance_advanced',
14
+ 'verified_publisher',
14
15
  ];
15
16
  /** Check whether a string is a valid FeatureFlag. */
16
17
  export function isValidFeatureFlag(value) {
@@ -25,7 +26,8 @@ export const TIER_FEATURES = {
25
26
  // (DORA) is NOT a Team tier feature — it's INCLUDED only in Enterprise and sold
26
27
  // as an add-on bundle to every other tier (see billing-config
27
28
  // `advanced_reporting`). Enterprise unlocks all.
28
- team: ['priority_support', 'ai_generation', 'bulk_operations', 'sso'],
29
+ // `verified_publisher` (eligibility to apply for Verified) starts at Team.
30
+ team: ['priority_support', 'ai_generation', 'bulk_operations', 'sso', 'verified_publisher'],
29
31
  enterprise: [...ALL_FEATURE_FLAGS],
30
32
  // Unlimited includes every feature / add-on bundle (billing-disabled default).
31
33
  unlimited: [...ALL_FEATURE_FLAGS],
@@ -69,6 +71,10 @@ export const FEATURE_METADATA = {
69
71
  label: 'Advanced Compliance',
70
72
  description: 'Curated framework compliance libraries (SOC2 / PCI-DSS / CIS)',
71
73
  },
74
+ verified_publisher: {
75
+ label: 'Verified Publisher Eligibility',
76
+ description: 'Apply for the Verified badge on your plugin-ecosystem publisher (awarded by system-org review)',
77
+ },
72
78
  };
73
79
  // Resolution logic
74
80
  /**
@@ -120,4 +126,32 @@ export function resolveUserFeatures(tier, opts) {
120
126
  // Return in canonical order
121
127
  return ALL_FEATURE_FLAGS.filter(f => features.has(f));
122
128
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1mbGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9mZWF0dXJlLWZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFrQ3RDLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBMkI7SUFDdkQsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLEtBQUs7SUFDTCxvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixxQkFBcUI7Q0FDdEIsQ0FBQztBQUVGLHFEQUFxRDtBQUNyRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBYTtJQUM5QyxPQUFRLGlCQUF1QyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsMEJBQTBCO0FBRTFCLGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQThDO0lBQ3RFLFNBQVMsRUFBRSxFQUFFO0lBQ2IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixDQUFDO0lBQzdELGlGQUFpRjtJQUNqRixnRkFBZ0Y7SUFDaEYsOERBQThEO0lBQzlELGlEQUFpRDtJQUNqRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO0lBQ3JFLFVBQVUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7SUFDbEMsK0VBQStFO0lBQy9FLFNBQVMsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7Q0FDbEMsQ0FBQztBQUVGLGlDQUFpQztBQUVqQyxxREFBcUQ7QUFDckQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWdFO0lBQzNGLGdCQUFnQixFQUFFO1FBQ2hCLEtBQUssRUFBRSxrQkFBa0I7UUFDekIsV0FBVyxFQUFFLHNEQUFzRDtLQUNwRTtJQUNELGFBQWEsRUFBRTtRQUNiLEtBQUssRUFBRSxlQUFlO1FBQ3RCLFdBQVcsRUFBRSwyQ0FBMkM7S0FDekQ7SUFDRCxlQUFlLEVBQUU7UUFDZixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFdBQVcsRUFBRSw0REFBNEQ7S0FDMUU7SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixLQUFLLEVBQUUscUJBQXFCO1FBQzVCLFdBQVcsRUFBRSwyREFBMkQ7S0FDekU7SUFDRCxHQUFHLEVBQUU7UUFDSCxLQUFLLEVBQUUsV0FBVztRQUNsQixXQUFXLEVBQUUsOERBQThEO0tBQzVFO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixXQUFXLEVBQUUsb0NBQW9DO0tBQ2xEO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsS0FBSyxFQUFFLHNCQUFzQjtRQUM3QixXQUFXLEVBQUUsd0RBQXdEO0tBQ3RFO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixXQUFXLEVBQUUscURBQXFEO0tBQ25FO0lBQ0QsbUJBQW1CLEVBQUU7UUFDbkIsS0FBSyxFQUFFLHFCQUFxQjtRQUM1QixXQUFXLEVBQUUsK0RBQStEO0tBQzdFO0NBQ0YsQ0FBQztBQUVGLG1CQUFtQjtBQUVuQjs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsSUFBZSxFQUNmLElBSUM7SUFFRCxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRWxGLCtDQUErQztJQUMvQyxJQUFJLFlBQVk7UUFBRSxPQUFPLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0lBRWhELDJCQUEyQjtJQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBYyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFFakUsK0VBQStFO0lBQy9FLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNwQixLQUFLLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ2xDLElBQUksa0JBQWtCLENBQUMsR0FBRyxDQUFDO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM5RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDdkMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixPQUFPLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUXVvdGFUaWVyIH0gZnJvbSAnLi9xdW90YS10aWVycy5qcyc7XG5cbi8vIEZlYXR1cmUgZmxhZyBpZGVudGlmaWVyc1xuXG4vKiogQ2Fub25pY2FsIGZlYXR1cmUgZmxhZyBpZGVudGlmaWVycy4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVGbGFnID1cbiAgLy8gYHByaW9yaXR5X3N1cHBvcnRgIGFuZCBgY3VzdG9tX2ludGVncmF0aW9uc2AgYXJlIEVOVEVSUFJJU0UtRVhDTFVTSVZFXG4gIC8vIG1hcmtldGluZy9lbnRpdGxlbWVudCBmbGFnczogZ3JhbnRlZCBvbmx5IGJ5IHRoZSBlbnRlcnByaXNlIHRpZXIgKG5vIGFkZC1vblxuICAvLyBidW5kbGUgc2VsbHMgdGhlbSB0byBhIGxvd2VyIHRpZXIg4oCUIGludGVudGlvbmFsLCB0aGV5IGFuY2hvciB0aGUgRW50ZXJwcmlzZVxuICAvLyBwbGFuKSBhbmQgbm90IGN1cnJlbnRseSBgcmVxdWlyZUZlYXR1cmVgLWdhdGVkIG9uIGFueSByb3V0ZSAodGhleSBzdXJmYWNlIGluXG4gIC8vIHBsYW4gbWFya2V0aW5nICsgdGhlIGVudGl0bGVtZW50IHNldDsgZW5mb3JjZW1lbnQgaXMgYSBmdXR1cmUgaG9vaykuIFRoaXMgaXNcbiAgLy8gYnkgZGVzaWduLCBub3QgZGVhZCBjb2RlIOKAlCBkbyBub3QgXCJmaXhcIiBieSB3aXJpbmcgYSBidW5kbGUgd2l0aG91dCBhIHByaWNpbmdcbiAgLy8gZGVjaXNpb24uIENvbnRyYXN0IGBzc29gL2BhZHZhbmNlZF9yZXBvcnRpbmdgLCB3aGljaCBBUkUgc29sZCBhc1xuICAvLyBhZGQtb24gYnVuZGxlcyBhbmQgZ2F0ZWQgKHNlZSBiaWxsaW5nLWNvbmZpZyBgbG9hZEJ1bmRsZXNgICsgYHJlcXVpcmVGZWF0dXJlYCkuXG4gIHwgJ3ByaW9yaXR5X3N1cHBvcnQnXG4gIHwgJ2N1c3RvbV9pbnRlZ3JhdGlvbnMnXG4gIHwgJ2FpX2dlbmVyYXRpb24nXG4gIHwgJ2J1bGtfb3BlcmF0aW9ucydcbiAgfCAnc3NvJ1xuICAvLyBET1JBIC8gYWR2YW5jZWQgZGVsaXZlcnkgYW5hbHl0aWNzIChwYWlkIHRpZXJzIG9ubHkpLlxuICB8ICdhZHZhbmNlZF9yZXBvcnRpbmcnXG4gIC8vIFBlci10ZWFtIHVzYWdlIGJyZWFrZG93biBhY3Jvc3MgdGhlIG9yZ+KGknRlYW0gc3VidHJlZS4gSU5DTFVERUQgaW4gRW50ZXJwcmlzZTtcbiAgLy8gc29sZCBhcyBhbiBhZGQtb24gYnVuZGxlIHRvIFByby9UZWFtIChzZWUgYmlsbGluZy1jb25maWcgYHRlYW1fdXNhZ2VfYW5hbHl0aWNzYCkuXG4gIHwgJ3RlYW1fdXNhZ2VfYW5hbHl0aWNzJ1xuICAvLyBDdXJhdGVkIGNvbXBsaWFuY2UgcnVsZSBsaWJyYXJpZXMgc29sZCBhcyBhZGQtb24gYnVuZGxlcy4gYGNvbXBsaWFuY2Vfc3RhbmRhcmRgXG4gIC8vID0gQ0kvQ0QgYmVzdC1wcmFjdGljZSBzZXQ7IGBjb21wbGlhbmNlX2FkdmFuY2VkYCA9IFNPQzIvUENJL0NJUyBmcmFtZXdvcmtcbiAgLy8gbGlicmFyaWVzIChyZXF1aXJlcyBTdGFuZGFyZCkuIFRoZXNlIGdhdGUgU1VCU0NSSUJJTkcgdG8gdGhlIHNldCdzIHN5c3RlbS1vcmdcbiAgLy8gcHVibGlzaGVkIHJ1bGVzOyBJTkNMVURFRCBpbiBFbnRlcnByaXNlL1VubGltaXRlZCAodmlhIEFMTF9GRUFUVVJFX0ZMQUdTKSxcbiAgLy8gc29sZCB0byBEZXZlbG9wZXIvUHJvL1RlYW0gKHNlZSBiaWxsaW5nLWNvbmZpZyBgY29tcGxpYW5jZV9zdGFuZGFyZC9hZHZhbmNlZGApLlxuICB8ICdjb21wbGlhbmNlX3N0YW5kYXJkJ1xuICB8ICdjb21wbGlhbmNlX2FkdmFuY2VkJztcblxuLyoqIEFsbCB2YWxpZCBmZWF0dXJlIGZsYWdzIChvcmRlciBkZXRlcm1pbmVzIGRpc3BsYXkgb3JkZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9GRUFUVVJFX0ZMQUdTOiByZWFkb25seSBGZWF0dXJlRmxhZ1tdID0gW1xuICAncHJpb3JpdHlfc3VwcG9ydCcsXG4gICdhaV9nZW5lcmF0aW9uJyxcbiAgJ2J1bGtfb3BlcmF0aW9ucycsXG4gICdjdXN0b21faW50ZWdyYXRpb25zJyxcbiAgJ3NzbycsXG4gICdhZHZhbmNlZF9yZXBvcnRpbmcnLFxuICAndGVhbV91c2FnZV9hbmFseXRpY3MnLFxuICAnY29tcGxpYW5jZV9zdGFuZGFyZCcsXG4gICdjb21wbGlhbmNlX2FkdmFuY2VkJyxcbl07XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgRmVhdHVyZUZsYWcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZlYXR1cmVGbGFnKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBGZWF0dXJlRmxhZyB7XG4gIHJldHVybiAoQUxMX0ZFQVRVUkVfRkxBR1MgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLy8gVGllci10by1mZWF0dXJlIG1hcHBpbmdcblxuLyoqIEZlYXR1cmVzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgZWFjaCB0aWVyLiAqL1xuZXhwb3J0IGNvbnN0IFRJRVJfRkVBVFVSRVM6IFJlY29yZDxRdW90YVRpZXIsIHJlYWRvbmx5IEZlYXR1cmVGbGFnW10+ID0ge1xuICBkZXZlbG9wZXI6IFtdLFxuICBwcm86IFsncHJpb3JpdHlfc3VwcG9ydCcsICdhaV9nZW5lcmF0aW9uJywgJ2J1bGtfb3BlcmF0aW9ucyddLFxuICAvLyBUZWFtIGFkZHMgc3NvIChTU08vSWRQIGlzIElOQ0xVREVEIGluIFRlYW0sIG5vdCBhbiBhZGQtb24pLiBhZHZhbmNlZF9yZXBvcnRpbmdcbiAgLy8gKERPUkEpIGlzIE5PVCBhIFRlYW0gdGllciBmZWF0dXJlIOKAlCBpdCdzIElOQ0xVREVEIG9ubHkgaW4gRW50ZXJwcmlzZSBhbmQgc29sZFxuICAvLyBhcyBhbiBhZGQtb24gYnVuZGxlIHRvIGV2ZXJ5IG90aGVyIHRpZXIgKHNlZSBiaWxsaW5nLWNvbmZpZ1xuICAvLyBgYWR2YW5jZWRfcmVwb3J0aW5nYCkuIEVudGVycHJpc2UgdW5sb2NrcyBhbGwuXG4gIHRlYW06IFsncHJpb3JpdHlfc3VwcG9ydCcsICdhaV9nZW5lcmF0aW9uJywgJ2J1bGtfb3BlcmF0aW9ucycsICdzc28nXSxcbiAgZW50ZXJwcmlzZTogWy4uLkFMTF9GRUFUVVJFX0ZMQUdTXSxcbiAgLy8gVW5saW1pdGVkIGluY2x1ZGVzIGV2ZXJ5IGZlYXR1cmUgLyBhZGQtb24gYnVuZGxlIChiaWxsaW5nLWRpc2FibGVkIGRlZmF1bHQpLlxuICB1bmxpbWl0ZWQ6IFsuLi5BTExfRkVBVFVSRV9GTEFHU10sXG59O1xuXG4vLyBGZWF0dXJlIG1ldGFkYXRhIChmb3IgZGlzcGxheSlcblxuLyoqIEh1bWFuLXJlYWRhYmxlIG1ldGFkYXRhIGZvciBlYWNoIGZlYXR1cmUgZmxhZy4gKi9cbmV4cG9ydCBjb25zdCBGRUFUVVJFX01FVEFEQVRBOiBSZWNvcmQ8RmVhdHVyZUZsYWcsIHsgbGFiZWw6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IHtcbiAgcHJpb3JpdHlfc3VwcG9ydDoge1xuICAgIGxhYmVsOiAnUHJpb3JpdHkgU3VwcG9ydCcsXG4gICAgZGVzY3JpcHRpb246ICdGYXN0ZXIgcmVzcG9uc2UgdGltZXMgYW5kIGRlZGljYXRlZCBzdXBwb3J0IGNoYW5uZWxzJyxcbiAgfSxcbiAgYWlfZ2VuZXJhdGlvbjoge1xuICAgIGxhYmVsOiAnQUkgR2VuZXJhdGlvbicsXG4gICAgZGVzY3JpcHRpb246ICdBSS1wb3dlcmVkIHBpcGVsaW5lIGFuZCBwbHVnaW4gZ2VuZXJhdGlvbicsXG4gIH0sXG4gIGJ1bGtfb3BlcmF0aW9uczoge1xuICAgIGxhYmVsOiAnQnVsayBPcGVyYXRpb25zJyxcbiAgICBkZXNjcmlwdGlvbjogJ0JhdGNoIGNyZWF0ZSwgdXBkYXRlLCBhbmQgZGVsZXRlIGZvciBwaXBlbGluZXMgYW5kIHBsdWdpbnMnLFxuICB9LFxuICBjdXN0b21faW50ZWdyYXRpb25zOiB7XG4gICAgbGFiZWw6ICdDdXN0b20gSW50ZWdyYXRpb25zJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Nvbm5lY3QgdG8gZXh0ZXJuYWwgc2VydmljZXMgYW5kIGN1c3RvbSB3ZWJob29rIGVuZHBvaW50cycsXG4gIH0sXG4gIHNzbzoge1xuICAgIGxhYmVsOiAnU1NPIC8gSWRQJyxcbiAgICBkZXNjcmlwdGlvbjogJ1NpbmdsZSBzaWduLW9uIGFuZCBleHRlcm5hbCBpZGVudGl0eS1wcm92aWRlciBjb25maWd1cmF0aW9ucycsXG4gIH0sXG4gIGFkdmFuY2VkX3JlcG9ydGluZzoge1xuICAgIGxhYmVsOiAnQWR2YW5jZWQgUmVwb3J0aW5nJyxcbiAgICBkZXNjcmlwdGlvbjogJ0RPUkEgLyBhZHZhbmNlZCBkZWxpdmVyeSBhbmFseXRpY3MnLFxuICB9LFxuICB0ZWFtX3VzYWdlX2FuYWx5dGljczoge1xuICAgIGxhYmVsOiAnVGVhbSBVc2FnZSBBbmFseXRpY3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVyLXRlYW0gdXNhZ2UgYnJlYWtkb3duIGFjcm9zcyB0aGUgb3JnIOKGkiB0ZWFtIHN1YnRyZWUnLFxuICB9LFxuICBjb21wbGlhbmNlX3N0YW5kYXJkOiB7XG4gICAgbGFiZWw6ICdTdGFuZGFyZCBDb21wbGlhbmNlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0N1cmF0ZWQgQ0kvQ0QgYmVzdC1wcmFjdGljZSBjb21wbGlhbmNlIHJ1bGUgbGlicmFyeScsXG4gIH0sXG4gIGNvbXBsaWFuY2VfYWR2YW5jZWQ6IHtcbiAgICBsYWJlbDogJ0FkdmFuY2VkIENvbXBsaWFuY2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3VyYXRlZCBmcmFtZXdvcmsgY29tcGxpYW5jZSBsaWJyYXJpZXMgKFNPQzIgLyBQQ0ktRFNTIC8gQ0lTKScsXG4gIH0sXG59O1xuXG4vLyBSZXNvbHV0aW9uIGxvZ2ljXG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgZmVhdHVyZSBzZXQuXG4gKlxuICogMS4gU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGFsd2F5cyBnZXQgQUxMIGZlYXR1cmVzLlxuICogMi4gU3RhcnQgd2l0aCB0aGUgdGllcidzIGRlZmF1bHQgZmVhdHVyZXMuXG4gKiAzLiBBcHBseSBwZXItdXNlciBvdmVycmlkZXM6IGB0cnVlYCBhZGRzIGEgZmVhdHVyZSwgYGZhbHNlYCByZW1vdmVzIGl0LlxuICogNC4gSW52YWxpZCBvdmVycmlkZSBrZXlzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB0aWVyIC0gVGhlIG9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXJcbiAqIEBwYXJhbSBvcHRzIC0gUmVzb2x1dGlvbiBvcHRpb25zOlxuICogICAtIGBvdmVycmlkZXNgOiBwZXItdXNlciBvdmVycmlkZXMgKGtleSA9IGZlYXR1cmUgZmxhZywgdmFsdWUgPSBlbmFibGVkKVxuICogICAtIGBpc1N1cGVyQWRtaW5gOiB3aGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqICAgLSBgYWNjb3VudEZlYXR1cmVzYDogYWNjb3VudC1sZXZlbCBlbnRpdGxlbWVudHMgKGUuZy4gcHVyY2hhc2VkIGFkZC1vblxuICogICAgIGJ1bmRsZXMpLiBBIE5BTUVEIGZpZWxkIHNvIGl0IGNhbiBuZXZlciBiZSBzaWxlbnRseSBkcm9wcGVkIGJ5IGEgY2FsbGVyXG4gKiAgICAgdGhhdCBvbWl0cyBhIHRyYWlsaW5nIHBvc2l0aW9uYWwgYXJnLlxuICogQHJldHVybnMgU29ydGVkIGFycmF5IG9mIGVuYWJsZWQgZmVhdHVyZSBmbGFnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJGZWF0dXJlcyhcbiAgdGllcjogUXVvdGFUaWVyLFxuICBvcHRzPzoge1xuICAgIG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgbnVsbDtcbiAgICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAgIGFjY291bnRGZWF0dXJlcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgfSxcbik6IEZlYXR1cmVGbGFnW10ge1xuICBjb25zdCB7IG92ZXJyaWRlczogZmVhdHVyZU92ZXJyaWRlcywgaXNTdXBlckFkbWluLCBhY2NvdW50RmVhdHVyZXMgfSA9IG9wdHMgPz8ge307XG5cbiAgLy8gU3lzYWRtaW5zIGdldCBldmVyeXRoaW5nIHJlZ2FyZGxlc3Mgb2YgdGllci5cbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfRkVBVFVSRV9GTEFHU107XG5cbiAgLy8gU3RhcnQgd2l0aCB0aWVyIGRlZmF1bHRzXG4gIGNvbnN0IGZlYXR1cmVzID0gbmV3IFNldDxGZWF0dXJlRmxhZz4oVElFUl9GRUFUVVJFU1t0aWVyXSA/PyBbXSk7XG5cbiAgLy8gQWNjb3VudC1sZXZlbCBlbnRpdGxlbWVudHMgKHB1cmNoYXNlZCBmZWF0dXJlIGJ1bmRsZXMg4oCUIGUuZy4gYXVkaXRfbG9nLCBzc28sXG4gIC8vIGFkdmFuY2VkX3JlcG9ydGluZywgdGVhbV91c2FnZV9hbmFseXRpY3MsIGNvbXBsaWFuY2Vfc3RhbmRhcmQvYWR2YW5jZWQpLlxuICAvLyBBcHBsaWVkIGJlZm9yZSBwZXItdXNlciBvdmVycmlkZXMgc28gYW4gZXhwbGljaXQgdXNlciBvdmVycmlkZSBzdGlsbCB3aW5zLlxuICBpZiAoYWNjb3VudEZlYXR1cmVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYWNjb3VudEZlYXR1cmVzKSB7XG4gICAgICBpZiAoaXNWYWxpZEZlYXR1cmVGbGFnKGtleSkpIGZlYXR1cmVzLmFkZChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGx5IHBlci11c2VyIG92ZXJyaWRlc1xuICBpZiAoZmVhdHVyZU92ZXJyaWRlcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgZW5hYmxlZF0gb2YgT2JqZWN0LmVudHJpZXMoZmVhdHVyZU92ZXJyaWRlcykpIHtcbiAgICAgIGlmICghaXNWYWxpZEZlYXR1cmVGbGFnKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgZmVhdHVyZXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZWF0dXJlcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gaW4gY2Fub25pY2FsIG9yZGVyXG4gIHJldHVybiBBTExfRkVBVFVSRV9GTEFHUy5maWx0ZXIoZiA9PiBmZWF0dXJlcy5oYXMoZikpO1xufVxuIl19
129
+ /**
130
+ * Curated compliance content sets and the feature flag each one is sold under.
131
+ * A set `x` is the published rules tagged `set:<x>`; an org holding the flag is
132
+ * entitled to them. Ordered from the lowest entitlement to the highest.
133
+ */
134
+ export const COMPLIANCE_SET_FEATURES = {
135
+ standard: 'compliance_standard',
136
+ advanced: 'compliance_advanced',
137
+ };
138
+ /** Every curated set name, lowest entitlement first. */
139
+ export const COMPLIANCE_CONTENT_SETS = Object.keys(COMPLIANCE_SET_FEATURES);
140
+ /** The curated sets an effective feature set entitles (stable order). */
141
+ export function complianceSetsForFeatures(features) {
142
+ return COMPLIANCE_CONTENT_SETS.filter((set) => features.includes(COMPLIANCE_SET_FEATURES[set]));
143
+ }
144
+ /**
145
+ * The feature a published rule's `set:<x>` tags require, or `null` for an
146
+ * untagged (baseline) rule. The highest entitlement wins when a rule carries
147
+ * several. Accepts a raw jsonb `tags` value.
148
+ */
149
+ export function complianceFeatureForTags(tags) {
150
+ const t = Array.isArray(tags) ? tags : [];
151
+ for (const set of [...COMPLIANCE_CONTENT_SETS].reverse()) {
152
+ if (t.includes(`set:${set}`))
153
+ return COMPLIANCE_SET_FEATURES[set];
154
+ }
155
+ return null;
156
+ }
157
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVhdHVyZS1mbGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9mZWF0dXJlLWZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUF1Q3RDLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBMkI7SUFDdkQsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIscUJBQXFCO0lBQ3JCLEtBQUs7SUFDTCxvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsb0JBQW9CO0NBQ3JCLENBQUM7QUFFRixxREFBcUQ7QUFDckQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWE7SUFDOUMsT0FBUSxpQkFBdUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELDBCQUEwQjtBQUUxQixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUE4QztJQUN0RSxTQUFTLEVBQUUsRUFBRTtJQUNiLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQztJQUM3RCxpRkFBaUY7SUFDakYsZ0ZBQWdGO0lBQ2hGLDhEQUE4RDtJQUM5RCxpREFBaUQ7SUFDakQsMkVBQTJFO0lBQzNFLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLENBQUM7SUFDM0YsVUFBVSxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztJQUNsQywrRUFBK0U7SUFDL0UsU0FBUyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztDQUNsQyxDQUFDO0FBRUYsaUNBQWlDO0FBRWpDLHFEQUFxRDtBQUNyRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZ0U7SUFDM0YsZ0JBQWdCLEVBQUU7UUFDaEIsS0FBSyxFQUFFLGtCQUFrQjtRQUN6QixXQUFXLEVBQUUsc0RBQXNEO0tBQ3BFO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsS0FBSyxFQUFFLGVBQWU7UUFDdEIsV0FBVyxFQUFFLDJDQUEyQztLQUN6RDtJQUNELGVBQWUsRUFBRTtRQUNmLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsV0FBVyxFQUFFLDREQUE0RDtLQUMxRTtJQUNELG1CQUFtQixFQUFFO1FBQ25CLEtBQUssRUFBRSxxQkFBcUI7UUFDNUIsV0FBVyxFQUFFLDJEQUEyRDtLQUN6RTtJQUNELEdBQUcsRUFBRTtRQUNILEtBQUssRUFBRSxXQUFXO1FBQ2xCLFdBQVcsRUFBRSw4REFBOEQ7S0FDNUU7SUFDRCxrQkFBa0IsRUFBRTtRQUNsQixLQUFLLEVBQUUsb0JBQW9CO1FBQzNCLFdBQVcsRUFBRSxvQ0FBb0M7S0FDbEQ7SUFDRCxvQkFBb0IsRUFBRTtRQUNwQixLQUFLLEVBQUUsc0JBQXNCO1FBQzdCLFdBQVcsRUFBRSx3REFBd0Q7S0FDdEU7SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixLQUFLLEVBQUUscUJBQXFCO1FBQzVCLFdBQVcsRUFBRSxxREFBcUQ7S0FDbkU7SUFDRCxtQkFBbUIsRUFBRTtRQUNuQixLQUFLLEVBQUUscUJBQXFCO1FBQzVCLFdBQVcsRUFBRSwrREFBK0Q7S0FDN0U7SUFDRCxrQkFBa0IsRUFBRTtRQUNsQixLQUFLLEVBQUUsZ0NBQWdDO1FBQ3ZDLFdBQVcsRUFBRSxnR0FBZ0c7S0FDOUc7Q0FDRixDQUFDO0FBRUYsbUJBQW1CO0FBRW5COzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxJQUFlLEVBQ2YsSUFJQztJQUVELE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFFbEYsK0NBQStDO0lBQy9DLElBQUksWUFBWTtRQUFFLE9BQU8sQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUM7SUFFaEQsMkJBQTJCO0lBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFjLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVqRSwrRUFBK0U7SUFDL0UsMkVBQTJFO0lBQzNFLDZFQUE2RTtJQUM3RSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLEtBQUssTUFBTSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7WUFDbEMsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELDJCQUEyQjtJQUMzQixJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDckIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUN2QyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO0lBQzVCLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7SUFDckMsUUFBUSxFQUFFLHFCQUFxQjtJQUMvQixRQUFRLEVBQUUscUJBQXFCO0NBQ2UsQ0FBQztBQUlqRCx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBMkIsQ0FBQztBQUV0Ryx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLFFBQTJCO0lBQ25FLE9BQU8sdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFhO0lBQ3BELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLHVCQUF1QixDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUFFLE9BQU8sdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IFF1b3RhVGllciB9IGZyb20gJy4vcXVvdGEtdGllcnMuanMnO1xuXG4vLyBGZWF0dXJlIGZsYWcgaWRlbnRpZmllcnNcblxuLyoqIENhbm9uaWNhbCBmZWF0dXJlIGZsYWcgaWRlbnRpZmllcnMuICovXG5leHBvcnQgdHlwZSBGZWF0dXJlRmxhZyA9XG4gIC8vIGBwcmlvcml0eV9zdXBwb3J0YCBhbmQgYGN1c3RvbV9pbnRlZ3JhdGlvbnNgIGFyZSBFTlRFUlBSSVNFLUVYQ0xVU0lWRVxuICAvLyBtYXJrZXRpbmcvZW50aXRsZW1lbnQgZmxhZ3M6IGdyYW50ZWQgb25seSBieSB0aGUgZW50ZXJwcmlzZSB0aWVyIChubyBhZGQtb25cbiAgLy8gYnVuZGxlIHNlbGxzIHRoZW0gdG8gYSBsb3dlciB0aWVyIOKAlCBpbnRlbnRpb25hbCwgdGhleSBhbmNob3IgdGhlIEVudGVycHJpc2VcbiAgLy8gcGxhbikgYW5kIG5vdCBjdXJyZW50bHkgYHJlcXVpcmVGZWF0dXJlYC1nYXRlZCBvbiBhbnkgcm91dGUgKHRoZXkgc3VyZmFjZSBpblxuICAvLyBwbGFuIG1hcmtldGluZyArIHRoZSBlbnRpdGxlbWVudCBzZXQ7IGVuZm9yY2VtZW50IGlzIGEgZnV0dXJlIGhvb2spLiBUaGlzIGlzXG4gIC8vIGJ5IGRlc2lnbiwgbm90IGRlYWQgY29kZSDigJQgZG8gbm90IFwiZml4XCIgYnkgd2lyaW5nIGEgYnVuZGxlIHdpdGhvdXQgYSBwcmljaW5nXG4gIC8vIGRlY2lzaW9uLiBDb250cmFzdCBgc3NvYC9gYWR2YW5jZWRfcmVwb3J0aW5nYCwgd2hpY2ggQVJFIHNvbGQgYXNcbiAgLy8gYWRkLW9uIGJ1bmRsZXMgYW5kIGdhdGVkIChzZWUgYmlsbGluZy1jb25maWcgYGxvYWRCdW5kbGVzYCArIGByZXF1aXJlRmVhdHVyZWApLlxuICB8ICdwcmlvcml0eV9zdXBwb3J0J1xuICB8ICdjdXN0b21faW50ZWdyYXRpb25zJ1xuICB8ICdhaV9nZW5lcmF0aW9uJ1xuICB8ICdidWxrX29wZXJhdGlvbnMnXG4gIHwgJ3NzbydcbiAgLy8gRE9SQSAvIGFkdmFuY2VkIGRlbGl2ZXJ5IGFuYWx5dGljcyAocGFpZCB0aWVycyBvbmx5KS5cbiAgfCAnYWR2YW5jZWRfcmVwb3J0aW5nJ1xuICAvLyBQZXItdGVhbSB1c2FnZSBicmVha2Rvd24gYWNyb3NzIHRoZSBvcmfihpJ0ZWFtIHN1YnRyZWUuIElOQ0xVREVEIGluIEVudGVycHJpc2U7XG4gIC8vIHNvbGQgYXMgYW4gYWRkLW9uIGJ1bmRsZSB0byBQcm8vVGVhbSAoc2VlIGJpbGxpbmctY29uZmlnIGB0ZWFtX3VzYWdlX2FuYWx5dGljc2ApLlxuICB8ICd0ZWFtX3VzYWdlX2FuYWx5dGljcydcbiAgLy8gQ3VyYXRlZCBjb21wbGlhbmNlIHJ1bGUgbGlicmFyaWVzIHNvbGQgYXMgYWRkLW9uIGJ1bmRsZXMuIGBjb21wbGlhbmNlX3N0YW5kYXJkYFxuICAvLyA9IENJL0NEIGJlc3QtcHJhY3RpY2Ugc2V0OyBgY29tcGxpYW5jZV9hZHZhbmNlZGAgPSBTT0MyL1BDSS9DSVMgZnJhbWV3b3JrXG4gIC8vIGxpYnJhcmllcyAocmVxdWlyZXMgU3RhbmRhcmQpLiBUaGVzZSBnYXRlIFNVQlNDUklCSU5HIHRvIHRoZSBzZXQncyBzeXN0ZW0tb3JnXG4gIC8vIHB1Ymxpc2hlZCBydWxlczsgSU5DTFVERUQgaW4gRW50ZXJwcmlzZS9VbmxpbWl0ZWQgKHZpYSBBTExfRkVBVFVSRV9GTEFHUyksXG4gIC8vIHNvbGQgdG8gRGV2ZWxvcGVyL1Byby9UZWFtIChzZWUgYmlsbGluZy1jb25maWcgYGNvbXBsaWFuY2Vfc3RhbmRhcmQvYWR2YW5jZWRgKS5cbiAgfCAnY29tcGxpYW5jZV9zdGFuZGFyZCdcbiAgfCAnY29tcGxpYW5jZV9hZHZhbmNlZCdcbiAgLy8gUGx1Z2luIGVjb3N5c3RlbTogdGhlIG9yZydzIHB1Ymxpc2hlciBpcyBFTElHSUJMRSB0byBhcHBseSBmb3IgVmVyaWZpZWRcbiAgLy8gc3RhdHVzIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKS4gRWxpZ2liaWxpdHkgb25seSDigJQgdGhlIGJhZGdlXG4gIC8vIGlzIGF3YXJkZWQgKGFuZCB3aXRoZHJhd24pIGJ5IHN5c3RlbS1vcmcgcmV2aWV3LCBuZXZlciBib3VnaHQuIFRlYW0gYW5kIHVwO1xuICAvLyBubyBhZGQtb24gYnVuZGxlIHNlbGxzIGl0LlxuICB8ICd2ZXJpZmllZF9wdWJsaXNoZXInO1xuXG4vKiogQWxsIHZhbGlkIGZlYXR1cmUgZmxhZ3MgKG9yZGVyIGRldGVybWluZXMgZGlzcGxheSBvcmRlcikuICovXG5leHBvcnQgY29uc3QgQUxMX0ZFQVRVUkVfRkxBR1M6IHJlYWRvbmx5IEZlYXR1cmVGbGFnW10gPSBbXG4gICdwcmlvcml0eV9zdXBwb3J0JyxcbiAgJ2FpX2dlbmVyYXRpb24nLFxuICAnYnVsa19vcGVyYXRpb25zJyxcbiAgJ2N1c3RvbV9pbnRlZ3JhdGlvbnMnLFxuICAnc3NvJyxcbiAgJ2FkdmFuY2VkX3JlcG9ydGluZycsXG4gICd0ZWFtX3VzYWdlX2FuYWx5dGljcycsXG4gICdjb21wbGlhbmNlX3N0YW5kYXJkJyxcbiAgJ2NvbXBsaWFuY2VfYWR2YW5jZWQnLFxuICAndmVyaWZpZWRfcHVibGlzaGVyJyxcbl07XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgRmVhdHVyZUZsYWcuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEZlYXR1cmVGbGFnKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBGZWF0dXJlRmxhZyB7XG4gIHJldHVybiAoQUxMX0ZFQVRVUkVfRkxBR1MgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLy8gVGllci10by1mZWF0dXJlIG1hcHBpbmdcblxuLyoqIEZlYXR1cmVzIGVuYWJsZWQgYnkgZGVmYXVsdCBmb3IgZWFjaCB0aWVyLiAqL1xuZXhwb3J0IGNvbnN0IFRJRVJfRkVBVFVSRVM6IFJlY29yZDxRdW90YVRpZXIsIHJlYWRvbmx5IEZlYXR1cmVGbGFnW10+ID0ge1xuICBkZXZlbG9wZXI6IFtdLFxuICBwcm86IFsncHJpb3JpdHlfc3VwcG9ydCcsICdhaV9nZW5lcmF0aW9uJywgJ2J1bGtfb3BlcmF0aW9ucyddLFxuICAvLyBUZWFtIGFkZHMgc3NvIChTU08vSWRQIGlzIElOQ0xVREVEIGluIFRlYW0sIG5vdCBhbiBhZGQtb24pLiBhZHZhbmNlZF9yZXBvcnRpbmdcbiAgLy8gKERPUkEpIGlzIE5PVCBhIFRlYW0gdGllciBmZWF0dXJlIOKAlCBpdCdzIElOQ0xVREVEIG9ubHkgaW4gRW50ZXJwcmlzZSBhbmQgc29sZFxuICAvLyBhcyBhbiBhZGQtb24gYnVuZGxlIHRvIGV2ZXJ5IG90aGVyIHRpZXIgKHNlZSBiaWxsaW5nLWNvbmZpZ1xuICAvLyBgYWR2YW5jZWRfcmVwb3J0aW5nYCkuIEVudGVycHJpc2UgdW5sb2NrcyBhbGwuXG4gIC8vIGB2ZXJpZmllZF9wdWJsaXNoZXJgIChlbGlnaWJpbGl0eSB0byBhcHBseSBmb3IgVmVyaWZpZWQpIHN0YXJ0cyBhdCBUZWFtLlxuICB0ZWFtOiBbJ3ByaW9yaXR5X3N1cHBvcnQnLCAnYWlfZ2VuZXJhdGlvbicsICdidWxrX29wZXJhdGlvbnMnLCAnc3NvJywgJ3ZlcmlmaWVkX3B1Ymxpc2hlciddLFxuICBlbnRlcnByaXNlOiBbLi4uQUxMX0ZFQVRVUkVfRkxBR1NdLFxuICAvLyBVbmxpbWl0ZWQgaW5jbHVkZXMgZXZlcnkgZmVhdHVyZSAvIGFkZC1vbiBidW5kbGUgKGJpbGxpbmctZGlzYWJsZWQgZGVmYXVsdCkuXG4gIHVubGltaXRlZDogWy4uLkFMTF9GRUFUVVJFX0ZMQUdTXSxcbn07XG5cbi8vIEZlYXR1cmUgbWV0YWRhdGEgKGZvciBkaXNwbGF5KVxuXG4vKiogSHVtYW4tcmVhZGFibGUgbWV0YWRhdGEgZm9yIGVhY2ggZmVhdHVyZSBmbGFnLiAqL1xuZXhwb3J0IGNvbnN0IEZFQVRVUkVfTUVUQURBVEE6IFJlY29yZDxGZWF0dXJlRmxhZywgeyBsYWJlbDogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH0+ID0ge1xuICBwcmlvcml0eV9zdXBwb3J0OiB7XG4gICAgbGFiZWw6ICdQcmlvcml0eSBTdXBwb3J0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0Zhc3RlciByZXNwb25zZSB0aW1lcyBhbmQgZGVkaWNhdGVkIHN1cHBvcnQgY2hhbm5lbHMnLFxuICB9LFxuICBhaV9nZW5lcmF0aW9uOiB7XG4gICAgbGFiZWw6ICdBSSBHZW5lcmF0aW9uJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FJLXBvd2VyZWQgcGlwZWxpbmUgYW5kIHBsdWdpbiBnZW5lcmF0aW9uJyxcbiAgfSxcbiAgYnVsa19vcGVyYXRpb25zOiB7XG4gICAgbGFiZWw6ICdCdWxrIE9wZXJhdGlvbnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQmF0Y2ggY3JlYXRlLCB1cGRhdGUsIGFuZCBkZWxldGUgZm9yIHBpcGVsaW5lcyBhbmQgcGx1Z2lucycsXG4gIH0sXG4gIGN1c3RvbV9pbnRlZ3JhdGlvbnM6IHtcbiAgICBsYWJlbDogJ0N1c3RvbSBJbnRlZ3JhdGlvbnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29ubmVjdCB0byBleHRlcm5hbCBzZXJ2aWNlcyBhbmQgY3VzdG9tIHdlYmhvb2sgZW5kcG9pbnRzJyxcbiAgfSxcbiAgc3NvOiB7XG4gICAgbGFiZWw6ICdTU08gLyBJZFAnLFxuICAgIGRlc2NyaXB0aW9uOiAnU2luZ2xlIHNpZ24tb24gYW5kIGV4dGVybmFsIGlkZW50aXR5LXByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zJyxcbiAgfSxcbiAgYWR2YW5jZWRfcmVwb3J0aW5nOiB7XG4gICAgbGFiZWw6ICdBZHZhbmNlZCBSZXBvcnRpbmcnLFxuICAgIGRlc2NyaXB0aW9uOiAnRE9SQSAvIGFkdmFuY2VkIGRlbGl2ZXJ5IGFuYWx5dGljcycsXG4gIH0sXG4gIHRlYW1fdXNhZ2VfYW5hbHl0aWNzOiB7XG4gICAgbGFiZWw6ICdUZWFtIFVzYWdlIEFuYWx5dGljcycsXG4gICAgZGVzY3JpcHRpb246ICdQZXItdGVhbSB1c2FnZSBicmVha2Rvd24gYWNyb3NzIHRoZSBvcmcg4oaSIHRlYW0gc3VidHJlZScsXG4gIH0sXG4gIGNvbXBsaWFuY2Vfc3RhbmRhcmQ6IHtcbiAgICBsYWJlbDogJ1N0YW5kYXJkIENvbXBsaWFuY2UnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ3VyYXRlZCBDSS9DRCBiZXN0LXByYWN0aWNlIGNvbXBsaWFuY2UgcnVsZSBsaWJyYXJ5JyxcbiAgfSxcbiAgY29tcGxpYW5jZV9hZHZhbmNlZDoge1xuICAgIGxhYmVsOiAnQWR2YW5jZWQgQ29tcGxpYW5jZScsXG4gICAgZGVzY3JpcHRpb246ICdDdXJhdGVkIGZyYW1ld29yayBjb21wbGlhbmNlIGxpYnJhcmllcyAoU09DMiAvIFBDSS1EU1MgLyBDSVMpJyxcbiAgfSxcbiAgdmVyaWZpZWRfcHVibGlzaGVyOiB7XG4gICAgbGFiZWw6ICdWZXJpZmllZCBQdWJsaXNoZXIgRWxpZ2liaWxpdHknLFxuICAgIGRlc2NyaXB0aW9uOiAnQXBwbHkgZm9yIHRoZSBWZXJpZmllZCBiYWRnZSBvbiB5b3VyIHBsdWdpbi1lY29zeXN0ZW0gcHVibGlzaGVyIChhd2FyZGVkIGJ5IHN5c3RlbS1vcmcgcmV2aWV3KScsXG4gIH0sXG59O1xuXG4vLyBSZXNvbHV0aW9uIGxvZ2ljXG5cbi8qKlxuICogUmVzb2x2ZSBhIHVzZXIncyBlZmZlY3RpdmUgZmVhdHVyZSBzZXQuXG4gKlxuICogMS4gU3lzYWRtaW5zIChpc1N1cGVyQWRtaW4pIGFsd2F5cyBnZXQgQUxMIGZlYXR1cmVzLlxuICogMi4gU3RhcnQgd2l0aCB0aGUgdGllcidzIGRlZmF1bHQgZmVhdHVyZXMuXG4gKiAzLiBBcHBseSBwZXItdXNlciBvdmVycmlkZXM6IGB0cnVlYCBhZGRzIGEgZmVhdHVyZSwgYGZhbHNlYCByZW1vdmVzIGl0LlxuICogNC4gSW52YWxpZCBvdmVycmlkZSBrZXlzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB0aWVyIC0gVGhlIG9yZ2FuaXphdGlvbidzIHF1b3RhIHRpZXJcbiAqIEBwYXJhbSBvcHRzIC0gUmVzb2x1dGlvbiBvcHRpb25zOlxuICogICAtIGBvdmVycmlkZXNgOiBwZXItdXNlciBvdmVycmlkZXMgKGtleSA9IGZlYXR1cmUgZmxhZywgdmFsdWUgPSBlbmFibGVkKVxuICogICAtIGBpc1N1cGVyQWRtaW5gOiB3aGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUgZ2xvYmFsIHN1cGVyLWFkbWluIGZsYWdcbiAqICAgLSBgYWNjb3VudEZlYXR1cmVzYDogYWNjb3VudC1sZXZlbCBlbnRpdGxlbWVudHMgKGUuZy4gcHVyY2hhc2VkIGFkZC1vblxuICogICAgIGJ1bmRsZXMpLiBBIE5BTUVEIGZpZWxkIHNvIGl0IGNhbiBuZXZlciBiZSBzaWxlbnRseSBkcm9wcGVkIGJ5IGEgY2FsbGVyXG4gKiAgICAgdGhhdCBvbWl0cyBhIHRyYWlsaW5nIHBvc2l0aW9uYWwgYXJnLlxuICogQHJldHVybnMgU29ydGVkIGFycmF5IG9mIGVuYWJsZWQgZmVhdHVyZSBmbGFnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJGZWF0dXJlcyhcbiAgdGllcjogUXVvdGFUaWVyLFxuICBvcHRzPzoge1xuICAgIG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgbnVsbDtcbiAgICBpc1N1cGVyQWRtaW4/OiBib29sZWFuO1xuICAgIGFjY291bnRGZWF0dXJlcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbDtcbiAgfSxcbik6IEZlYXR1cmVGbGFnW10ge1xuICBjb25zdCB7IG92ZXJyaWRlczogZmVhdHVyZU92ZXJyaWRlcywgaXNTdXBlckFkbWluLCBhY2NvdW50RmVhdHVyZXMgfSA9IG9wdHMgPz8ge307XG5cbiAgLy8gU3lzYWRtaW5zIGdldCBldmVyeXRoaW5nIHJlZ2FyZGxlc3Mgb2YgdGllci5cbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfRkVBVFVSRV9GTEFHU107XG5cbiAgLy8gU3RhcnQgd2l0aCB0aWVyIGRlZmF1bHRzXG4gIGNvbnN0IGZlYXR1cmVzID0gbmV3IFNldDxGZWF0dXJlRmxhZz4oVElFUl9GRUFUVVJFU1t0aWVyXSA/PyBbXSk7XG5cbiAgLy8gQWNjb3VudC1sZXZlbCBlbnRpdGxlbWVudHMgKHB1cmNoYXNlZCBmZWF0dXJlIGJ1bmRsZXMg4oCUIGUuZy4gYXVkaXRfbG9nLCBzc28sXG4gIC8vIGFkdmFuY2VkX3JlcG9ydGluZywgdGVhbV91c2FnZV9hbmFseXRpY3MsIGNvbXBsaWFuY2Vfc3RhbmRhcmQvYWR2YW5jZWQpLlxuICAvLyBBcHBsaWVkIGJlZm9yZSBwZXItdXNlciBvdmVycmlkZXMgc28gYW4gZXhwbGljaXQgdXNlciBvdmVycmlkZSBzdGlsbCB3aW5zLlxuICBpZiAoYWNjb3VudEZlYXR1cmVzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgYWNjb3VudEZlYXR1cmVzKSB7XG4gICAgICBpZiAoaXNWYWxpZEZlYXR1cmVGbGFnKGtleSkpIGZlYXR1cmVzLmFkZChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFwcGx5IHBlci11c2VyIG92ZXJyaWRlc1xuICBpZiAoZmVhdHVyZU92ZXJyaWRlcykge1xuICAgIGZvciAoY29uc3QgW2tleSwgZW5hYmxlZF0gb2YgT2JqZWN0LmVudHJpZXMoZmVhdHVyZU92ZXJyaWRlcykpIHtcbiAgICAgIGlmICghaXNWYWxpZEZlYXR1cmVGbGFnKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgZmVhdHVyZXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmZWF0dXJlcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gaW4gY2Fub25pY2FsIG9yZGVyXG4gIHJldHVybiBBTExfRkVBVFVSRV9GTEFHUy5maWx0ZXIoZiA9PiBmZWF0dXJlcy5oYXMoZikpO1xufVxuXG4vKipcbiAqIEN1cmF0ZWQgY29tcGxpYW5jZSBjb250ZW50IHNldHMgYW5kIHRoZSBmZWF0dXJlIGZsYWcgZWFjaCBvbmUgaXMgc29sZCB1bmRlci5cbiAqIEEgc2V0IGB4YCBpcyB0aGUgcHVibGlzaGVkIHJ1bGVzIHRhZ2dlZCBgc2V0Ojx4PmA7IGFuIG9yZyBob2xkaW5nIHRoZSBmbGFnIGlzXG4gKiBlbnRpdGxlZCB0byB0aGVtLiBPcmRlcmVkIGZyb20gdGhlIGxvd2VzdCBlbnRpdGxlbWVudCB0byB0aGUgaGlnaGVzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTVBMSUFOQ0VfU0VUX0ZFQVRVUkVTID0ge1xuICBzdGFuZGFyZDogJ2NvbXBsaWFuY2Vfc3RhbmRhcmQnLFxuICBhZHZhbmNlZDogJ2NvbXBsaWFuY2VfYWR2YW5jZWQnLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgRmVhdHVyZUZsYWc+O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlQ29udGVudFNldCA9IGtleW9mIHR5cGVvZiBDT01QTElBTkNFX1NFVF9GRUFUVVJFUztcblxuLyoqIEV2ZXJ5IGN1cmF0ZWQgc2V0IG5hbWUsIGxvd2VzdCBlbnRpdGxlbWVudCBmaXJzdC4gKi9cbmV4cG9ydCBjb25zdCBDT01QTElBTkNFX0NPTlRFTlRfU0VUUyA9IE9iamVjdC5rZXlzKENPTVBMSUFOQ0VfU0VUX0ZFQVRVUkVTKSBhcyBDb21wbGlhbmNlQ29udGVudFNldFtdO1xuXG4vKiogVGhlIGN1cmF0ZWQgc2V0cyBhbiBlZmZlY3RpdmUgZmVhdHVyZSBzZXQgZW50aXRsZXMgKHN0YWJsZSBvcmRlcikuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxpYW5jZVNldHNGb3JGZWF0dXJlcyhmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10pOiBDb21wbGlhbmNlQ29udGVudFNldFtdIHtcbiAgcmV0dXJuIENPTVBMSUFOQ0VfQ09OVEVOVF9TRVRTLmZpbHRlcigoc2V0KSA9PiBmZWF0dXJlcy5pbmNsdWRlcyhDT01QTElBTkNFX1NFVF9GRUFUVVJFU1tzZXRdKSk7XG59XG5cbi8qKlxuICogVGhlIGZlYXR1cmUgYSBwdWJsaXNoZWQgcnVsZSdzIGBzZXQ6PHg+YCB0YWdzIHJlcXVpcmUsIG9yIGBudWxsYCBmb3IgYW5cbiAqIHVudGFnZ2VkIChiYXNlbGluZSkgcnVsZS4gVGhlIGhpZ2hlc3QgZW50aXRsZW1lbnQgd2lucyB3aGVuIGEgcnVsZSBjYXJyaWVzXG4gKiBzZXZlcmFsLiBBY2NlcHRzIGEgcmF3IGpzb25iIGB0YWdzYCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBsaWFuY2VGZWF0dXJlRm9yVGFncyh0YWdzOiB1bmtub3duKTogRmVhdHVyZUZsYWcgfCBudWxsIHtcbiAgY29uc3QgdCA9IEFycmF5LmlzQXJyYXkodGFncykgPyB0YWdzIDogW107XG4gIGZvciAoY29uc3Qgc2V0IG9mIFsuLi5DT01QTElBTkNFX0NPTlRFTlRfU0VUU10ucmV2ZXJzZSgpKSB7XG4gICAgaWYgKHQuaW5jbHVkZXMoYHNldDoke3NldH1gKSkgcmV0dXJuIENPTVBMSUFOQ0VfU0VUX0ZFQVRVUkVTW3NldF07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
@@ -1,12 +1,17 @@
1
- export * from './error-codes.js';
2
- export * from './common.js';
1
+ export { ErrorCode, getStatusForErrorCode } from './error-codes.js';
2
+ export { isValidQuotaType, type TokenScope, TOKEN_SCOPES, type PrincipalType, type TokenUse, type AuthMethod, type AssuranceLevel, type QuotaType, VALID_QUOTA_TYPES, type QuotaCheckResult, type QuotaInfo, type ApiResponse, type JwtPayload, type HealthCheckResponse, } from './common.js';
3
3
  export * from './pipeline.js';
4
- export * from './catalog-metadata.js';
5
- export * from './pipeline-template.js';
4
+ export { type Lifecycle, type Criticality, type OwnerType, type EntityLink, type EntityLabels, } from './catalog-metadata.js';
5
+ export { type TemplateInput, } from './pipeline-template.js';
6
6
  export * from './visibility.js';
7
- export * from './http.js';
8
- export * from './quota-tiers.js';
7
+ export * from './wire-vocabulary.js';
8
+ export { PLUGIN_SUMMARY_MAX, PLUGIN_README_MAX_BYTES, PLUGIN_CHANGELOG_MAX_BYTES, PLUGIN_CATEGORIES, type PluginCatalogCategory, PLUGIN_CATALOG_FIELDS, type PluginCatalogField, PLUGIN_CATALOG_LINK_FIELDS, METADATA_SOURCES, type MetadataSource, type MetadataSources, } from './plugin-catalog.js';
9
+ export { type HttpRequest, } from './http.js';
10
+ export { tierAllowsTeams, isBillingEnabled, isValidTier, getTierLimits, type QuotaTier, type QuotaTierLimits, QUOTA_TIERS, VALID_TIERS, STANDARD_TIERS, TEAM_CAPABLE_TIERS, DEFAULT_TIER, QUOTA_RESET_DAYS, nextQuotaResetDate, } from './quota-tiers.js';
9
11
  export * from './feature-flags.js';
10
- export * from './permissions.js';
11
- export * from './metadata-keys.js';
12
- export * from './audit-events.js';
12
+ export { permissionLabel, isValidPermission, isSystemOrgOnlyPermission, isOrgAssignablePermission, normalizePermissionSubset, intersectPermissions, resolveUserPermissions, confinePermissionsToOrg, hasPermission, type Permission, ALL_PERMISSIONS, PERMISSION_GATES, PERMISSION_CATALOG, SUPERADMIN_ONLY_PERMISSIONS, SYSTEM_ORG_ONLY_PERMISSIONS, ORG_ASSIGNABLE_PERMISSIONS, ORG_ASSIGNABLE_CATEGORIES, READ_ONLY_PERMISSIONS, ROLE_PERMISSIONS, ECOSYSTEM_MANAGER_PERMISSIONS, } from './permissions.js';
13
+ export { METADATA_KEY_CATALOG, MetadataKeys, type MetadataKey, type MetadataKeyOption, METADATA_KEY_GROUPS, } from './metadata-keys.js';
14
+ export { type AuditEvent, } from './audit-events.js';
15
+ export { isEcosystemNotificationEvent, parseEcosystemNotifyRequest, nextEcosystemDigestTime, renderEcosystemManagerChange, renderEcosystemDigest, type EcosystemNotificationEventId, type EcosystemNotificationChannel, ECOSYSTEM_EMAIL_PREFERENCE_FIELDS, type EcosystemEmailPreferenceField, ECOSYSTEM_EMAIL_PREFERENCE_FIELD_NAMES, ECOSYSTEM_NOTIFICATION_EVENTS, type EcosystemRecipientSpec, type EcosystemNotifyRequest, } from './ecosystem-notifications.js';
16
+ export { publisherTermsVersion, publisherHandleProblem, isOfficialAutoApprovalEnabled, isPluginPublishingEnabled, isAnonymousSubmissionsEnabled, isPluginReviewsEnabled, OFFICIAL_CATALOG_LOADER_ACCOUNT, DEFAULT_PUBLISHER_TERMS_VERSION, BUILTIN_RESERVED_HANDLES, TENANT_REQUEST_KINDS, PUBLISH_PERMISSION_REQUEST_KINDS, VERIFY_REQUEST_KINDS, STEP_UP_REQUEST_KINDS, REQUEST_SLA_HOURS, } from './ecosystem.js';
17
+ export { ageScore, vulnScore, computeHealthScore, publisherHealthScore, publisherSuccessRate, healthBand, HEALTH_COMPONENTS, HEALTH_WEIGHTS, type HealthBreakdown, type HealthResult, type HealthInputs, type HealthBand, } from './plugin-health.js';
@@ -1,15 +1,20 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- export * from './error-codes.js';
4
- export * from './common.js';
3
+ export { ErrorCode, getStatusForErrorCode } from './error-codes.js';
4
+ export { isValidQuotaType, TOKEN_SCOPES, VALID_QUOTA_TYPES, } from './common.js';
5
5
  export * from './pipeline.js';
6
- export * from './catalog-metadata.js';
7
- export * from './pipeline-template.js';
6
+ export {} from './catalog-metadata.js';
7
+ export {} from './pipeline-template.js';
8
8
  export * from './visibility.js';
9
- export * from './http.js';
10
- export * from './quota-tiers.js';
9
+ export * from './wire-vocabulary.js';
10
+ export { PLUGIN_SUMMARY_MAX, PLUGIN_README_MAX_BYTES, PLUGIN_CHANGELOG_MAX_BYTES, PLUGIN_CATEGORIES, PLUGIN_CATALOG_FIELDS, PLUGIN_CATALOG_LINK_FIELDS, METADATA_SOURCES, } from './plugin-catalog.js';
11
+ export {} from './http.js';
12
+ export { tierAllowsTeams, isBillingEnabled, isValidTier, getTierLimits, QUOTA_TIERS, VALID_TIERS, STANDARD_TIERS, TEAM_CAPABLE_TIERS, DEFAULT_TIER, QUOTA_RESET_DAYS, nextQuotaResetDate, } from './quota-tiers.js';
11
13
  export * from './feature-flags.js';
12
- export * from './permissions.js';
13
- export * from './metadata-keys.js';
14
- export * from './audit-events.js';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgKiBmcm9tICcuL2Vycm9yLWNvZGVzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXRhbG9nLW1ldGFkYXRhLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUtdGVtcGxhdGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi92aXNpYmlsaXR5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaHR0cC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3F1b3RhLXRpZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmVhdHVyZS1mbGFncy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Blcm1pc3Npb25zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vbWV0YWRhdGEta2V5cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F1ZGl0LWV2ZW50cy5qcyc7XG4iXX0=
14
+ export { permissionLabel, isValidPermission, isSystemOrgOnlyPermission, isOrgAssignablePermission, normalizePermissionSubset, intersectPermissions, resolveUserPermissions, confinePermissionsToOrg, hasPermission, ALL_PERMISSIONS, PERMISSION_GATES, PERMISSION_CATALOG, SUPERADMIN_ONLY_PERMISSIONS, SYSTEM_ORG_ONLY_PERMISSIONS, ORG_ASSIGNABLE_PERMISSIONS, ORG_ASSIGNABLE_CATEGORIES, READ_ONLY_PERMISSIONS, ROLE_PERMISSIONS, ECOSYSTEM_MANAGER_PERMISSIONS, } from './permissions.js';
15
+ export { METADATA_KEY_CATALOG, MetadataKeys, METADATA_KEY_GROUPS, } from './metadata-keys.js';
16
+ export {} from './audit-events.js';
17
+ export { isEcosystemNotificationEvent, parseEcosystemNotifyRequest, nextEcosystemDigestTime, renderEcosystemManagerChange, renderEcosystemDigest, ECOSYSTEM_EMAIL_PREFERENCE_FIELDS, ECOSYSTEM_EMAIL_PREFERENCE_FIELD_NAMES, ECOSYSTEM_NOTIFICATION_EVENTS, } from './ecosystem-notifications.js';
18
+ export { publisherTermsVersion, publisherHandleProblem, isOfficialAutoApprovalEnabled, isPluginPublishingEnabled, isAnonymousSubmissionsEnabled, isPluginReviewsEnabled, OFFICIAL_CATALOG_LOADER_ACCOUNT, DEFAULT_PUBLISHER_TERMS_VERSION, BUILTIN_RESERVED_HANDLES, TENANT_REQUEST_KINDS, PUBLISH_PERMISSION_REQUEST_KINDS, VERIFY_REQUEST_KINDS, STEP_UP_REQUEST_KINDS, REQUEST_SLA_HOURS, } from './ecosystem.js';
19
+ export { ageScore, vulnScore, computeHealthScore, publisherHealthScore, publisherSuccessRate, healthBand, HEALTH_COMPONENTS, HEALTH_WEIGHTS, } from './plugin-health.js';
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEUsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixZQUFZLEVBTVosaUJBQWlCLEdBTWxCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLE9BQU8sRUFNTixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFFTixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2QiwwQkFBMEIsRUFDMUIsaUJBQWlCLEVBRWpCLHFCQUFxQixFQUVyQiwwQkFBMEIsRUFDMUIsZ0JBQWdCLEdBR2pCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUVOLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxhQUFhLEVBR2IsV0FBVyxFQUNYLFdBQVcsRUFDWCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLHVCQUF1QixFQUN2QixhQUFhLEVBRWIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsMkJBQTJCLEVBQzNCLDJCQUEyQixFQUMzQiwwQkFBMEIsRUFDMUIseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsNkJBQTZCLEdBQzlCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixZQUFZLEVBR1osbUJBQW1CLEdBQ3BCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUVOLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1QixxQkFBcUIsRUFHckIsaUNBQWlDLEVBRWpDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsR0FHOUIsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHNCQUFzQixFQUN0Qiw2QkFBNkIsRUFDN0IseUJBQXlCLEVBQ3pCLDZCQUE2QixFQUM3QixzQkFBc0IsRUFDdEIsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdDQUFnQyxFQUNoQyxvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULGtCQUFrQixFQUNsQixvQkFBb0IsRUFDcEIsb0JBQW9CLEVBQ3BCLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxHQUtmLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0IHsgRXJyb3JDb2RlLCBnZXRTdGF0dXNGb3JFcnJvckNvZGUgfSBmcm9tICcuL2Vycm9yLWNvZGVzLmpzJztcbmV4cG9ydCB7XG4gIGlzVmFsaWRRdW90YVR5cGUsXG4gIHR5cGUgVG9rZW5TY29wZSxcbiAgVE9LRU5fU0NPUEVTLFxuICB0eXBlIFByaW5jaXBhbFR5cGUsXG4gIHR5cGUgVG9rZW5Vc2UsXG4gIHR5cGUgQXV0aE1ldGhvZCxcbiAgdHlwZSBBc3N1cmFuY2VMZXZlbCxcbiAgdHlwZSBRdW90YVR5cGUsXG4gIFZBTElEX1FVT1RBX1RZUEVTLFxuICB0eXBlIFF1b3RhQ2hlY2tSZXN1bHQsXG4gIHR5cGUgUXVvdGFJbmZvLFxuICB0eXBlIEFwaVJlc3BvbnNlLFxuICB0eXBlIEp3dFBheWxvYWQsXG4gIHR5cGUgSGVhbHRoQ2hlY2tSZXNwb25zZSxcbn0gZnJvbSAnLi9jb21tb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9waXBlbGluZS5qcyc7XG5leHBvcnQge1xuICB0eXBlIExpZmVjeWNsZSxcbiAgdHlwZSBDcml0aWNhbGl0eSxcbiAgdHlwZSBPd25lclR5cGUsXG4gIHR5cGUgRW50aXR5TGluayxcbiAgdHlwZSBFbnRpdHlMYWJlbHMsXG59IGZyb20gJy4vY2F0YWxvZy1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICB0eXBlIFRlbXBsYXRlSW5wdXQsXG59IGZyb20gJy4vcGlwZWxpbmUtdGVtcGxhdGUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi92aXNpYmlsaXR5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vd2lyZS12b2NhYnVsYXJ5LmpzJztcbmV4cG9ydCB7XG4gIFBMVUdJTl9TVU1NQVJZX01BWCxcbiAgUExVR0lOX1JFQURNRV9NQVhfQllURVMsXG4gIFBMVUdJTl9DSEFOR0VMT0dfTUFYX0JZVEVTLFxuICBQTFVHSU5fQ0FURUdPUklFUyxcbiAgdHlwZSBQbHVnaW5DYXRhbG9nQ2F0ZWdvcnksXG4gIFBMVUdJTl9DQVRBTE9HX0ZJRUxEUyxcbiAgdHlwZSBQbHVnaW5DYXRhbG9nRmllbGQsXG4gIFBMVUdJTl9DQVRBTE9HX0xJTktfRklFTERTLFxuICBNRVRBREFUQV9TT1VSQ0VTLFxuICB0eXBlIE1ldGFkYXRhU291cmNlLFxuICB0eXBlIE1ldGFkYXRhU291cmNlcyxcbn0gZnJvbSAnLi9wbHVnaW4tY2F0YWxvZy5qcyc7XG5leHBvcnQge1xuICB0eXBlIEh0dHBSZXF1ZXN0LFxufSBmcm9tICcuL2h0dHAuanMnO1xuZXhwb3J0IHtcbiAgdGllckFsbG93c1RlYW1zLFxuICBpc0JpbGxpbmdFbmFibGVkLFxuICBpc1ZhbGlkVGllcixcbiAgZ2V0VGllckxpbWl0cyxcbiAgdHlwZSBRdW90YVRpZXIsXG4gIHR5cGUgUXVvdGFUaWVyTGltaXRzLFxuICBRVU9UQV9USUVSUyxcbiAgVkFMSURfVElFUlMsXG4gIFNUQU5EQVJEX1RJRVJTLFxuICBURUFNX0NBUEFCTEVfVElFUlMsXG4gIERFRkFVTFRfVElFUixcbiAgUVVPVEFfUkVTRVRfREFZUyxcbiAgbmV4dFF1b3RhUmVzZXREYXRlLFxufSBmcm9tICcuL3F1b3RhLXRpZXJzLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vZmVhdHVyZS1mbGFncy5qcyc7XG5leHBvcnQge1xuICBwZXJtaXNzaW9uTGFiZWwsXG4gIGlzVmFsaWRQZXJtaXNzaW9uLFxuICBpc1N5c3RlbU9yZ09ubHlQZXJtaXNzaW9uLFxuICBpc09yZ0Fzc2lnbmFibGVQZXJtaXNzaW9uLFxuICBub3JtYWxpemVQZXJtaXNzaW9uU3Vic2V0LFxuICBpbnRlcnNlY3RQZXJtaXNzaW9ucyxcbiAgcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyxcbiAgY29uZmluZVBlcm1pc3Npb25zVG9PcmcsXG4gIGhhc1Blcm1pc3Npb24sXG4gIHR5cGUgUGVybWlzc2lvbixcbiAgQUxMX1BFUk1JU1NJT05TLFxuICBQRVJNSVNTSU9OX0dBVEVTLFxuICBQRVJNSVNTSU9OX0NBVEFMT0csXG4gIFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUyxcbiAgU1lTVEVNX09SR19PTkxZX1BFUk1JU1NJT05TLFxuICBPUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OUyxcbiAgT1JHX0FTU0lHTkFCTEVfQ0FURUdPUklFUyxcbiAgUkVBRF9PTkxZX1BFUk1JU1NJT05TLFxuICBST0xFX1BFUk1JU1NJT05TLFxuICBFQ09TWVNURU1fTUFOQUdFUl9QRVJNSVNTSU9OUyxcbn0gZnJvbSAnLi9wZXJtaXNzaW9ucy5qcyc7XG5leHBvcnQge1xuICBNRVRBREFUQV9LRVlfQ0FUQUxPRyxcbiAgTWV0YWRhdGFLZXlzLFxuICB0eXBlIE1ldGFkYXRhS2V5LFxuICB0eXBlIE1ldGFkYXRhS2V5T3B0aW9uLFxuICBNRVRBREFUQV9LRVlfR1JPVVBTLFxufSBmcm9tICcuL21ldGFkYXRhLWtleXMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBBdWRpdEV2ZW50LFxufSBmcm9tICcuL2F1ZGl0LWV2ZW50cy5qcyc7XG5leHBvcnQge1xuICBpc0Vjb3N5c3RlbU5vdGlmaWNhdGlvbkV2ZW50LFxuICBwYXJzZUVjb3N5c3RlbU5vdGlmeVJlcXVlc3QsXG4gIG5leHRFY29zeXN0ZW1EaWdlc3RUaW1lLFxuICByZW5kZXJFY29zeXN0ZW1NYW5hZ2VyQ2hhbmdlLFxuICByZW5kZXJFY29zeXN0ZW1EaWdlc3QsXG4gIHR5cGUgRWNvc3lzdGVtTm90aWZpY2F0aW9uRXZlbnRJZCxcbiAgdHlwZSBFY29zeXN0ZW1Ob3RpZmljYXRpb25DaGFubmVsLFxuICBFQ09TWVNURU1fRU1BSUxfUFJFRkVSRU5DRV9GSUVMRFMsXG4gIHR5cGUgRWNvc3lzdGVtRW1haWxQcmVmZXJlbmNlRmllbGQsXG4gIEVDT1NZU1RFTV9FTUFJTF9QUkVGRVJFTkNFX0ZJRUxEX05BTUVTLFxuICBFQ09TWVNURU1fTk9USUZJQ0FUSU9OX0VWRU5UUyxcbiAgdHlwZSBFY29zeXN0ZW1SZWNpcGllbnRTcGVjLFxuICB0eXBlIEVjb3N5c3RlbU5vdGlmeVJlcXVlc3QsXG59IGZyb20gJy4vZWNvc3lzdGVtLW5vdGlmaWNhdGlvbnMuanMnO1xuZXhwb3J0IHtcbiAgcHVibGlzaGVyVGVybXNWZXJzaW9uLFxuICBwdWJsaXNoZXJIYW5kbGVQcm9ibGVtLFxuICBpc09mZmljaWFsQXV0b0FwcHJvdmFsRW5hYmxlZCxcbiAgaXNQbHVnaW5QdWJsaXNoaW5nRW5hYmxlZCxcbiAgaXNBbm9ueW1vdXNTdWJtaXNzaW9uc0VuYWJsZWQsXG4gIGlzUGx1Z2luUmV2aWV3c0VuYWJsZWQsXG4gIE9GRklDSUFMX0NBVEFMT0dfTE9BREVSX0FDQ09VTlQsXG4gIERFRkFVTFRfUFVCTElTSEVSX1RFUk1TX1ZFUlNJT04sXG4gIEJVSUxUSU5fUkVTRVJWRURfSEFORExFUyxcbiAgVEVOQU5UX1JFUVVFU1RfS0lORFMsXG4gIFBVQkxJU0hfUEVSTUlTU0lPTl9SRVFVRVNUX0tJTkRTLFxuICBWRVJJRllfUkVRVUVTVF9LSU5EUyxcbiAgU1RFUF9VUF9SRVFVRVNUX0tJTkRTLFxuICBSRVFVRVNUX1NMQV9IT1VSUyxcbn0gZnJvbSAnLi9lY29zeXN0ZW0uanMnO1xuZXhwb3J0IHtcbiAgYWdlU2NvcmUsXG4gIHZ1bG5TY29yZSxcbiAgY29tcHV0ZUhlYWx0aFNjb3JlLFxuICBwdWJsaXNoZXJIZWFsdGhTY29yZSxcbiAgcHVibGlzaGVyU3VjY2Vzc1JhdGUsXG4gIGhlYWx0aEJhbmQsXG4gIEhFQUxUSF9DT01QT05FTlRTLFxuICBIRUFMVEhfV0VJR0hUUyxcbiAgdHlwZSBIZWFsdGhCcmVha2Rvd24sXG4gIHR5cGUgSGVhbHRoUmVzdWx0LFxuICB0eXBlIEhlYWx0aElucHV0cyxcbiAgdHlwZSBIZWFsdGhCYW5kLFxufSBmcm9tICcuL3BsdWdpbi1oZWFsdGguanMnO1xuIl19
@@ -12,18 +12,18 @@ import type { OrgRole } from './common.js';
12
12
  * global `isSuperAdmin` flag, not a per-org permission; and `requireStepUp`
13
13
  * (MFA) / `requireFeature` (plan entitlements) remain orthogonal gates.
14
14
  */
15
- export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'templates:read' | 'templates:write' | 'templates:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'service_accounts:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'logs:export' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms' | 'org:impersonation';
15
+ export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'templates:read' | 'templates:write' | 'templates:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'plugins:install' | 'plugin_installs:manage' | 'publishers:manage' | 'plugins:moderate' | 'publishers:verify' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'service_accounts:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'logs:export' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms' | 'org:impersonation';
16
16
  /** All valid permissions (order determines display order in the picker). */
17
17
  export declare const ALL_PERMISSIONS: readonly Permission[];
18
18
  /**
19
19
  * The CLOSED set of functions that take a {@link Permission} and decide access.
20
20
  *
21
- * "Is permission X enforced anywhere?" has to be answerable statically, and it
22
- * used to not be: four different call shapes consumed a permission id
21
+ * "Is permission X enforced anywhere?" has to be answerable statically, which
22
+ * a grep can't do: four different call shapes consume a permission id
23
23
  * (`requirePermission('x')` at a route, `userHasPermission(req, 'x')` inside a
24
24
  * controller, and `resolveVisibility(req, v, 'x')` /
25
25
  * `requireVisibilityWriteAccess(…, 'x')` in the visibility helpers), so a naive
26
- * grep for a route-level gate reported `templates:publish` as UNENFORCED when it
26
+ * grep for a route-level gate reports `templates:publish` as UNENFORCED when it
27
27
  * is in fact enforced on every template publish.
28
28
  *
29
29
  * They all bottom out in `userHasPermission`, so the RUNTIME primitive was
@@ -74,17 +74,31 @@ export declare function isValidPermission(value: string): value is Permission;
74
74
  * them (see platform `sanitizePermissions`).
75
75
  */
76
76
  export declare const SUPERADMIN_ONLY_PERMISSIONS: readonly Permission[];
77
+ /**
78
+ * Permissions that govern the PLUGIN ECOSYSTEM and may be held only inside the
79
+ * system org (docs/plugin-publishing.md). Like
80
+ * {@link SUPERADMIN_ONLY_PERMISSIONS} they are in no member/admin/owner bundle
81
+ * and are never grantable through a custom Role in ANY org (platform
82
+ * `sanitizePermissions` refuses them). The only holders are superadmins
83
+ * (implicit-all) and members of the built-in "Ecosystem Manager" Role, which is
84
+ * seeded in the system org alone from {@link ECOSYSTEM_MANAGER_PERMISSIONS} and
85
+ * assignable only by a superadmin.
86
+ */
87
+ export declare const SYSTEM_ORG_ONLY_PERMISSIONS: readonly Permission[];
88
+ /** Whether `permission` may be held only inside the system org. */
89
+ export declare function isSystemOrgOnlyPermission(permission: string): boolean;
77
90
  /**
78
91
  * Permissions an org may assign via a CUSTOM Role — every permission except the
79
- * {@link SUPERADMIN_ONLY_PERMISSIONS}. Custom-Role create/update validates the
80
- * requested permission set against this (see platform roles-service).
92
+ * {@link SUPERADMIN_ONLY_PERMISSIONS} and {@link SYSTEM_ORG_ONLY_PERMISSIONS}.
93
+ * Custom-Role create/update validates the requested permission set against this
94
+ * (see platform roles-service).
81
95
  */
82
96
  export declare const ORG_ASSIGNABLE_PERMISSIONS: readonly Permission[];
83
97
  /** Whether `permission` may be granted through a user-authored custom Role. */
84
98
  export declare function isOrgAssignablePermission(permission: Permission): boolean;
85
99
  /**
86
100
  * Category → permissions for the custom-Role AUTHORING picker: the catalog minus
87
- * the {@link SUPERADMIN_ONLY_PERMISSIONS}, with any now-empty category dropped
101
+ * the non-assignable permissions, with any now-empty category dropped
88
102
  * (so "Registry" disappears). The grouped view of
89
103
  * {@link ORG_ASSIGNABLE_PERMISSIONS}.
90
104
  */
@@ -118,6 +132,15 @@ export declare function intersectPermissions(effective: readonly string[], subse
118
132
  * {@link resolveUserPermissions}.
119
133
  */
120
134
  export declare const ROLE_PERMISSIONS: Record<OrgRole, readonly Permission[]>;
135
+ /**
136
+ * Seed bundle for the built-in "Ecosystem Manager" Role — seeded ONLY in the
137
+ * system org (docs/plugin-publishing.md). It carries the
138
+ * {@link SYSTEM_ORG_ONLY_PERMISSIONS} plus the reads a moderator needs (the
139
+ * in-app catalog, in-app notices, the moderation-SLA dashboard) and nothing
140
+ * tenant-facing: no `registry:*`, no `members:manage`. The Role grants the
141
+ * coarse `member` label and never sets `isSuperAdmin`.
142
+ */
143
+ export declare const ECOSYSTEM_MANAGER_PERMISSIONS: readonly Permission[];
121
144
  /**
122
145
  * Resolve a user's effective org permissions from the Roles assigned to them.
123
146
  *
@@ -125,7 +148,7 @@ export declare const ROLE_PERMISSIONS: Record<OrgRole, readonly Permission[]>;
125
148
  * permissions carried by the Roles they hold (a Role = a named permission set;
126
149
  * built-in Roles carry their bundle explicitly, seeded from
127
150
  * {@link ROLE_PERMISSIONS}). There is no separate role-derived baseline — the
128
- * coarse `role` label no longer grants anything on its own.
151
+ * coarse `role` label grants nothing on its own.
129
152
  *
130
153
  * 1. Platform superadmins (`isSuperAdmin`) always get ALL permissions.
131
154
  * 2. Otherwise, union every permission granted by the user's assigned Roles.
@@ -136,5 +159,20 @@ export declare const ROLE_PERMISSIONS: Record<OrgRole, readonly Permission[]>;
136
159
  * @returns Effective permissions in canonical order
137
160
  */
138
161
  export declare function resolveUserPermissions(assignedPermissions?: readonly string[] | null, isSuperAdmin?: boolean): Permission[];
162
+ /**
163
+ * Confine a resolved permission list to what may be held in the token's ACTIVE
164
+ * org: outside the system org every {@link SYSTEM_ORG_ONLY_PERMISSIONS} entry is
165
+ * dropped (docs/plugin-publishing.md). Applied at token issue on
166
+ * top of {@link resolveUserPermissions} — including a superadmin's implicit-all —
167
+ * so a token minted in a tenant org never CLAIMS `plugins:moderate` /
168
+ * `publishers:verify`, even if a hand-written Role document somehow carried
169
+ * them there. (Superadmins still pass `hasPermission` via the flag; the
170
+ * ecosystem route gate additionally requires the system org, so that bypass
171
+ * never reaches a governance route from a tenant org either.)
172
+ *
173
+ * Takes a boolean rather than an org id so this module stays dependency-free
174
+ * (the frontend imports it); callers decide with api-core `isSystemOrgId`.
175
+ */
176
+ export declare function confinePermissionsToOrg<P extends string>(permissions: readonly P[], activeOrgIsSystemOrg: boolean): P[];
139
177
  /** Whether a resolved permission list grants `permission` (superadmin ⇒ always). */
140
178
  export declare function hasPermission(granted: readonly string[] | null | undefined, permission: Permission, isSuperAdmin?: boolean): boolean;