@pipeline-builder/api-core 4.1.13 → 4.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +3 -2
  2. package/lib/constants/index.d.ts +0 -1
  3. package/lib/constants/index.js +1 -2
  4. package/lib/errors/app-errors.d.ts +8 -3
  5. package/lib/errors/app-errors.js +10 -5
  6. package/lib/helpers/access-helpers.d.ts +4 -6
  7. package/lib/helpers/access-helpers.js +6 -8
  8. package/lib/helpers/index.d.ts +3 -3
  9. package/lib/helpers/index.js +4 -4
  10. package/lib/helpers/org-hierarchy-http.d.ts +11 -10
  11. package/lib/helpers/org-hierarchy-http.js +24 -35
  12. package/lib/helpers/org-hierarchy.d.ts +37 -3
  13. package/lib/helpers/org-hierarchy.js +45 -4
  14. package/lib/helpers/restore-helpers.d.ts +44 -24
  15. package/lib/helpers/restore-helpers.js +41 -52
  16. package/lib/helpers/sse-helpers.d.ts +29 -7
  17. package/lib/helpers/sse-helpers.js +36 -9
  18. package/lib/index.d.ts +16 -14
  19. package/lib/index.js +17 -15
  20. package/lib/middleware/assurance.d.ts +116 -0
  21. package/lib/middleware/assurance.js +176 -0
  22. package/lib/middleware/auth.d.ts +5 -427
  23. package/lib/middleware/auth.js +36 -789
  24. package/lib/middleware/ecosystem-guard.d.ts +47 -0
  25. package/lib/middleware/ecosystem-guard.js +60 -0
  26. package/lib/middleware/index.d.ts +11 -4
  27. package/lib/middleware/index.js +12 -5
  28. package/lib/middleware/jwt-verify.d.ts +52 -0
  29. package/lib/middleware/jwt-verify.js +105 -0
  30. package/lib/middleware/permission-gates.d.ts +133 -0
  31. package/lib/middleware/permission-gates.js +260 -0
  32. package/lib/middleware/revocation.d.ts +96 -0
  33. package/lib/middleware/revocation.js +162 -0
  34. package/lib/middleware/route-table.d.ts +11 -0
  35. package/lib/middleware/route-table.js +4 -1
  36. package/lib/middleware/service-tokens.d.ts +83 -0
  37. package/lib/middleware/service-tokens.js +158 -0
  38. package/lib/middleware/step-up.d.ts +2 -2
  39. package/lib/middleware/step-up.js +8 -7
  40. package/lib/middleware/system-org.d.ts +20 -0
  41. package/lib/middleware/system-org.js +25 -0
  42. package/lib/openapi/routes/plugin-routes.js +133 -10
  43. package/lib/openapi/schema-registry.js +2 -5
  44. package/lib/routes/index.d.ts +1 -1
  45. package/lib/routes/index.js +2 -2
  46. package/lib/services/api-key-exchange.js +7 -5
  47. package/lib/services/audit-spool.d.ts +34 -10
  48. package/lib/services/audit-spool.js +75 -34
  49. package/lib/services/cache-service.d.ts +7 -0
  50. package/lib/services/cache-service.js +1 -1
  51. package/lib/services/circuit-breaker.d.ts +14 -1
  52. package/lib/services/circuit-breaker.js +36 -10
  53. package/lib/services/compliance-client.d.ts +10 -2
  54. package/lib/services/compliance-client.js +17 -10
  55. package/lib/services/compliance-event-subscriber.js +6 -6
  56. package/lib/services/durable-event-bus.js +8 -11
  57. package/lib/services/ecosystem-notify-client.d.ts +32 -0
  58. package/lib/services/ecosystem-notify-client.js +71 -0
  59. package/lib/services/env-redis.d.ts +4 -1
  60. package/lib/services/env-redis.js +32 -3
  61. package/lib/services/http-client.d.ts +19 -0
  62. package/lib/services/http-client.js +98 -19
  63. package/lib/services/index.d.ts +25 -24
  64. package/lib/services/index.js +25 -22
  65. package/lib/services/jwks-cache.js +5 -4
  66. package/lib/services/leader-lock.d.ts +22 -5
  67. package/lib/services/leader-lock.js +61 -6
  68. package/lib/services/quota.d.ts +9 -4
  69. package/lib/services/quota.js +34 -40
  70. package/lib/services/remote-audit-client.d.ts +28 -32
  71. package/lib/services/remote-audit-client.js +166 -49
  72. package/lib/services/retry-forever.js +5 -11
  73. package/lib/services/retry-strategy.d.ts +1 -1
  74. package/lib/services/retry-strategy.js +5 -4
  75. package/lib/services/scheduler.d.ts +8 -3
  76. package/lib/services/scheduler.js +17 -5
  77. package/lib/services/service-boot.d.ts +14 -13
  78. package/lib/services/service-boot.js +18 -15
  79. package/lib/services/service-keys.d.ts +1 -1
  80. package/lib/services/service-keys.js +12 -18
  81. package/lib/services/sse-ticket-store.d.ts +9 -1
  82. package/lib/services/sse-ticket-store.js +24 -9
  83. package/lib/services/system-notification.d.ts +27 -0
  84. package/lib/services/system-notification.js +50 -0
  85. package/lib/services/token-revocation.d.ts +50 -1
  86. package/lib/services/token-revocation.js +103 -3
  87. package/lib/types/audit-events.d.ts +6 -6
  88. package/lib/types/audit-events.js +1 -1
  89. package/lib/types/common.d.ts +32 -13
  90. package/lib/types/common.js +2 -1
  91. package/lib/types/ecosystem-notifications.d.ts +142 -0
  92. package/lib/types/ecosystem-notifications.js +210 -0
  93. package/lib/types/ecosystem.d.ts +77 -0
  94. package/lib/types/ecosystem.js +119 -0
  95. package/lib/types/error-codes.d.ts +81 -0
  96. package/lib/types/error-codes.js +108 -1
  97. package/lib/types/feature-flags.d.ts +21 -1
  98. package/lib/types/feature-flags.js +36 -2
  99. package/lib/types/index.d.ts +14 -9
  100. package/lib/types/index.js +15 -10
  101. package/lib/types/permissions.d.ts +46 -8
  102. package/lib/types/permissions.js +75 -12
  103. package/lib/types/plugin-catalog.d.ts +35 -0
  104. package/lib/types/plugin-catalog.js +39 -0
  105. package/lib/types/plugin-health.d.ts +102 -0
  106. package/lib/types/plugin-health.js +184 -0
  107. package/lib/types/quota-tiers.d.ts +15 -0
  108. package/lib/types/quota-tiers.js +23 -3
  109. package/lib/types/wire-vocabulary.d.ts +102 -0
  110. package/lib/types/wire-vocabulary.js +94 -0
  111. package/lib/utils/alias-resolver.js +2 -2
  112. package/lib/utils/audit.d.ts +5 -2
  113. package/lib/utils/audit.js +6 -3
  114. package/lib/utils/compliance-attributes.js +3 -4
  115. package/lib/utils/concurrency.d.ts +7 -0
  116. package/lib/utils/concurrency.js +13 -1
  117. package/lib/utils/env.d.ts +3 -4
  118. package/lib/utils/env.js +4 -5
  119. package/lib/utils/identity.d.ts +13 -4
  120. package/lib/utils/identity.js +18 -10
  121. package/lib/utils/index.d.ts +13 -10
  122. package/lib/utils/index.js +13 -10
  123. package/lib/utils/jwk.d.ts +4 -0
  124. package/lib/utils/jwk.js +13 -1
  125. package/lib/utils/logger.d.ts +1 -1
  126. package/lib/utils/logger.js +1 -1
  127. package/lib/utils/object.d.ts +11 -0
  128. package/lib/utils/object.js +24 -1
  129. package/lib/utils/params.d.ts +8 -22
  130. package/lib/utils/params.js +15 -43
  131. package/lib/utils/plugin-compliance.d.ts +98 -0
  132. package/lib/utils/plugin-compliance.js +78 -0
  133. package/lib/utils/proof-of-work.d.ts +69 -0
  134. package/lib/utils/proof-of-work.js +139 -0
  135. package/lib/utils/response.d.ts +16 -6
  136. package/lib/utils/response.js +18 -15
  137. package/lib/utils/retention.d.ts +17 -0
  138. package/lib/utils/retention.js +30 -0
  139. package/lib/utils/secret-encryption.d.ts +7 -7
  140. package/lib/utils/secret-encryption.js +9 -10
  141. package/lib/utils/secret-rotation.js +2 -2
  142. package/lib/utils/sensitive-patterns.js +4 -5
  143. package/lib/utils/service-registry.d.ts +15 -0
  144. package/lib/utils/service-registry.js +24 -0
  145. package/lib/utils/ssrf.d.ts +11 -2
  146. package/lib/utils/ssrf.js +112 -33
  147. package/lib/validation/ai-schemas.js +3 -2
  148. package/lib/validation/common-schemas.d.ts +0 -9
  149. package/lib/validation/common-schemas.js +1 -7
  150. package/lib/validation/dockerfile-static.d.ts +26 -0
  151. package/lib/validation/dockerfile-static.js +210 -0
  152. package/lib/validation/index.d.ts +13 -4
  153. package/lib/validation/index.js +14 -5
  154. package/lib/validation/message-schemas.js +6 -4
  155. package/lib/validation/pipeline-schemas.d.ts +8 -2
  156. package/lib/validation/pipeline-schemas.js +30 -4
  157. package/lib/validation/plugin-base-images.d.ts +20 -0
  158. package/lib/validation/plugin-base-images.js +17 -0
  159. package/lib/validation/plugin-catalog-detect.d.ts +86 -0
  160. package/lib/validation/plugin-catalog-detect.js +237 -0
  161. package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
  162. package/lib/validation/plugin-catalog-metadata.js +162 -0
  163. package/lib/validation/plugin-heuristics.d.ts +41 -0
  164. package/lib/validation/plugin-heuristics.js +211 -0
  165. package/lib/validation/plugin-lint.d.ts +18 -0
  166. package/lib/validation/plugin-lint.js +136 -0
  167. package/lib/validation/plugin-name-confusable.d.ts +15 -0
  168. package/lib/validation/plugin-name-confusable.js +81 -0
  169. package/lib/validation/plugin-schemas.d.ts +40 -26
  170. package/lib/validation/plugin-schemas.js +26 -23
  171. package/lib/validation/plugin-spec-schema.d.ts +112 -0
  172. package/lib/validation/plugin-spec-schema.js +163 -0
  173. package/lib/validation/plugin-template-contract.d.ts +64 -0
  174. package/lib/validation/plugin-template-contract.js +113 -0
  175. package/package.json +69 -4
  176. package/lib/testing/mock-api-core.d.ts +0 -150
  177. package/lib/testing/mock-api-core.js +0 -246
  178. package/lib/testing/mock-drizzle.d.ts +0 -6
  179. package/lib/testing/mock-drizzle.js +0 -57
  180. package/lib/testing/route-coverage.d.ts +0 -64
  181. package/lib/testing/route-coverage.js +0 -183
  182. package/lib/testing/service-tokens.d.ts +0 -66
  183. package/lib/testing/service-tokens.js +0 -137
  184. package/lib/testing/tier-mock.d.ts +0 -44
  185. package/lib/testing/tier-mock.js +0 -65
  186. package/lib/testing/user-tokens.d.ts +0 -75
  187. package/lib/testing/user-tokens.js +0 -115
@@ -0,0 +1,184 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * The plugin HEALTH SCORE (docs/plugin-publishing.md): one 0–100
5
+ * number per listing, from seven components. Pure and dependency-free so the
6
+ * plugin service (the stats sweep), the frontend (the breakdown panel's
7
+ * labels) and the tests share one definition.
8
+ *
9
+ * Each component scores 0..1 and carries a fixed weight. A component whose
10
+ * inputs are missing is DROPPED and the remaining weights are renormalized; with
11
+ * fewer than {@link HEALTH_MIN_COMPONENTS} components the score is null ("not
12
+ * enough data"), never a guess.
13
+ *
14
+ * | component | weight | score |
15
+ * |------------|--------|-----------------------------------------------------------------------|
16
+ * | runtime | 25 | 30-day success rate; only with ≥ 20 runs |
17
+ * | vulns | 20 | 1 − 0.5·critical − 0.1·high (floor 0), latest listed version; scanned only |
18
+ * | freshness | 15 | release age (≤90d 1 → 0 at 540d) averaged with base-image age (≤60d 1 → 0 at 365d) when recorded |
19
+ * | signed | 10 | image digest present and signed ⇒ 1 |
20
+ * | smokeTest | 10 | smoke test declared ⇒ 1 |
21
+ * | docs | 10 | README 0.5 + license 0.5 |
22
+ * | rating | 10 | Bayesian rating / 5; only with ≥ 3 ratings |
23
+ */
24
+ export const HEALTH_COMPONENTS = ['runtime', 'vulns', 'freshness', 'signed', 'smokeTest', 'docs', 'rating'];
25
+ /** Nominal weight of each component (they sum to 100). */
26
+ export const HEALTH_WEIGHTS = {
27
+ runtime: 25,
28
+ vulns: 20,
29
+ freshness: 15,
30
+ signed: 10,
31
+ smokeTest: 10,
32
+ docs: 10,
33
+ rating: 10,
34
+ };
35
+ /** Human labels for the breakdown panel. */
36
+ export const HEALTH_COMPONENT_LABELS = {
37
+ runtime: 'Runtime success (30 days)',
38
+ vulns: 'Known vulnerabilities',
39
+ freshness: 'Freshness',
40
+ signed: 'Signed image',
41
+ smokeTest: 'Smoke test declared',
42
+ docs: 'README and license',
43
+ rating: 'Rating',
44
+ };
45
+ /** Fewer available components than this ⇒ no score. */
46
+ export const HEALTH_MIN_COMPONENTS = 3;
47
+ /** Runs needed in the window before the success rate counts. */
48
+ export const HEALTH_MIN_RUNS = 20;
49
+ /** Ratings needed before the rating counts. */
50
+ export const HEALTH_MIN_RATINGS = 3;
51
+ /** Release age: full marks up to this many days, zero at {@link HEALTH_RELEASE_ZERO_DAYS}. */
52
+ export const HEALTH_RELEASE_FULL_DAYS = 90;
53
+ export const HEALTH_RELEASE_ZERO_DAYS = 540;
54
+ /** Base-image age: full marks up to this many days, zero at {@link HEALTH_BASE_IMAGE_ZERO_DAYS}. */
55
+ export const HEALTH_BASE_IMAGE_FULL_DAYS = 60;
56
+ export const HEALTH_BASE_IMAGE_ZERO_DAYS = 365;
57
+ const DAY_MS = 86_400_000;
58
+ const round3 = (n) => Math.round(n * 1000) / 1000;
59
+ const clamp01 = (n) => Math.min(1, Math.max(0, n));
60
+ function toTime(d) {
61
+ if (d === null || d === undefined)
62
+ return null;
63
+ const t = new Date(d).getTime();
64
+ return Number.isFinite(t) ? t : null;
65
+ }
66
+ /** 1 up to `fullDays`, falling linearly to 0 at `zeroDays` (a future date counts as fresh). */
67
+ export function ageScore(ageDays, fullDays, zeroDays) {
68
+ if (ageDays <= fullDays)
69
+ return 1;
70
+ if (ageDays >= zeroDays)
71
+ return 0;
72
+ return clamp01(1 - (ageDays - fullDays) / (zeroDays - fullDays));
73
+ }
74
+ /** The vulnerability component: 1 − 0.5·critical − 0.1·high, floored at 0. */
75
+ export function vulnScore(critical, high) {
76
+ return clamp01(1 - 0.5 * Math.max(0, critical) - 0.1 * Math.max(0, high));
77
+ }
78
+ function runtimeComponent(i) {
79
+ if (i.runs30d === null || i.runs30d === undefined || i.runs30d < HEALTH_MIN_RUNS)
80
+ return null;
81
+ if (i.successRate30d === null || i.successRate30d === undefined || !Number.isFinite(i.successRate30d))
82
+ return null;
83
+ return clamp01(i.successRate30d);
84
+ }
85
+ function vulnsComponent(i) {
86
+ if (toTime(i.scannedAt) === null)
87
+ return null;
88
+ return vulnScore(i.vulnCritical ?? 0, i.vulnHigh ?? 0);
89
+ }
90
+ function freshnessComponent(i, now) {
91
+ const parts = [];
92
+ const release = toTime(i.lastReleaseAt);
93
+ if (release !== null)
94
+ parts.push(ageScore((now - release) / DAY_MS, HEALTH_RELEASE_FULL_DAYS, HEALTH_RELEASE_ZERO_DAYS));
95
+ const base = toTime(i.baseImageCreatedAt);
96
+ if (base !== null)
97
+ parts.push(ageScore((now - base) / DAY_MS, HEALTH_BASE_IMAGE_FULL_DAYS, HEALTH_BASE_IMAGE_ZERO_DAYS));
98
+ if (parts.length === 0)
99
+ return null;
100
+ return parts.reduce((a, b) => a + b, 0) / parts.length;
101
+ }
102
+ const flag = (b) => (b === null || b === undefined ? null : b ? 1 : 0);
103
+ function docsComponent(i) {
104
+ if ((i.hasReadme === null || i.hasReadme === undefined) && (i.hasLicense === null || i.hasLicense === undefined))
105
+ return null;
106
+ return (i.hasReadme ? 0.5 : 0) + (i.hasLicense ? 0.5 : 0);
107
+ }
108
+ function ratingComponent(i) {
109
+ if (i.ratingCount === null || i.ratingCount === undefined || i.ratingCount < HEALTH_MIN_RATINGS)
110
+ return null;
111
+ if (i.ratingBayes === null || i.ratingBayes === undefined || !Number.isFinite(i.ratingBayes))
112
+ return null;
113
+ return clamp01(i.ratingBayes / 5);
114
+ }
115
+ /** The health score and its per-component breakdown. Pure; `now` is injectable for tests. */
116
+ export function computeHealthScore(inputs, now = new Date()) {
117
+ const t = now.getTime();
118
+ const raw = {
119
+ runtime: runtimeComponent(inputs),
120
+ vulns: vulnsComponent(inputs),
121
+ freshness: freshnessComponent(inputs, t),
122
+ signed: flag(inputs.signed),
123
+ smokeTest: flag(inputs.smokeTestDeclared),
124
+ docs: docsComponent(inputs),
125
+ rating: ratingComponent(inputs),
126
+ };
127
+ const breakdown = {};
128
+ let weighted = 0;
129
+ let totalWeight = 0;
130
+ let available = 0;
131
+ for (const c of HEALTH_COMPONENTS) {
132
+ const score = raw[c];
133
+ breakdown[c] = { score: score === null ? null : round3(score), weight: HEALTH_WEIGHTS[c] };
134
+ if (score === null)
135
+ continue;
136
+ available++;
137
+ weighted += score * HEALTH_WEIGHTS[c];
138
+ totalWeight += HEALTH_WEIGHTS[c];
139
+ }
140
+ const score = available < HEALTH_MIN_COMPONENTS || totalWeight === 0 ? null : Math.round((100 * weighted) / totalWeight);
141
+ return { score, breakdown };
142
+ }
143
+ /**
144
+ * A publisher's health: the install-weighted mean of its listings' scores
145
+ * (listings with no score are skipped; when no listing has installs, the plain
146
+ * mean). Null when no listing has a score.
147
+ */
148
+ export function publisherHealthScore(listings) {
149
+ const scored = listings.filter((l) => l.healthScore !== null && Number.isFinite(l.healthScore));
150
+ if (scored.length === 0)
151
+ return null;
152
+ const weightOf = (n) => Math.max(0, n);
153
+ const totalInstalls = scored.reduce((a, l) => a + weightOf(l.installCount), 0);
154
+ if (totalInstalls === 0)
155
+ return Math.round(scored.reduce((a, l) => a + l.healthScore, 0) / scored.length);
156
+ return Math.round(scored.reduce((a, l) => a + l.healthScore * weightOf(l.installCount), 0) / totalInstalls);
157
+ }
158
+ /**
159
+ * A publisher's 30-day success rate across its listings, weighted by runs.
160
+ * Null when none of its listings ran in the window.
161
+ */
162
+ export function publisherSuccessRate(listings) {
163
+ let runs = 0;
164
+ let succeeded = 0;
165
+ for (const l of listings) {
166
+ if (l.successRate30d === null || !Number.isFinite(l.successRate30d) || l.runs30d <= 0)
167
+ continue;
168
+ runs += l.runs30d;
169
+ succeeded += l.successRate30d * l.runs30d;
170
+ }
171
+ return runs === 0 ? null : round3(succeeded / runs);
172
+ }
173
+ export const HEALTH_BAND_GOOD = 80;
174
+ export const HEALTH_BAND_FAIR = 50;
175
+ export function healthBand(score) {
176
+ if (score === null || score === undefined || !Number.isFinite(score))
177
+ return 'unknown';
178
+ if (score >= HEALTH_BAND_GOOD)
179
+ return 'good';
180
+ if (score >= HEALTH_BAND_FAIR)
181
+ return 'fair';
182
+ return 'poor';
183
+ }
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRiw0Q0FBNEM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQThDO0lBQ2hGLE9BQU8sRUFBRSwyQkFBMkI7SUFDcEMsS0FBSyxFQUFFLHVCQUF1QjtJQUM5QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsY0FBYztJQUN0QixTQUFTLEVBQUUscUJBQXFCO0lBQ2hDLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDdkMsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDbEMsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNwQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0s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QUMsY0FBYyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDaEcsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEIsU0FBUyxJQUFJLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUlELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFnQztJQUN6RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdkYsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBwbHVnaW4gSEVBTFRIIFNDT1JFIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKTogb25lIDDigJMxMDBcbiAqIG51bWJlciBwZXIgbGlzdGluZywgZnJvbSBzZXZlbiBjb21wb25lbnRzLiBQdXJlIGFuZCBkZXBlbmRlbmN5LWZyZWUgc28gdGhlXG4gKiBwbHVnaW4gc2VydmljZSAodGhlIHN0YXRzIHN3ZWVwKSwgdGhlIGZyb250ZW5kICh0aGUgYnJlYWtkb3duIHBhbmVsJ3NcbiAqIGxhYmVscykgYW5kIHRoZSB0ZXN0cyBzaGFyZSBvbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBFYWNoIGNvbXBvbmVudCBzY29yZXMgMC4uMSBhbmQgY2FycmllcyBhIGZpeGVkIHdlaWdodC4gQSBjb21wb25lbnQgd2hvc2VcbiAqIGlucHV0cyBhcmUgbWlzc2luZyBpcyBEUk9QUEVEIGFuZCB0aGUgcmVtYWluaW5nIHdlaWdodHMgYXJlIHJlbm9ybWFsaXplZDsgd2l0aFxuICogZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzIHRoZSBzY29yZSBpcyBudWxsIChcIm5vdFxuICogZW5vdWdoIGRhdGFcIiksIG5ldmVyIGEgZ3Vlc3MuXG4gKlxuICogfCBjb21wb25lbnQgIHwgd2VpZ2h0IHwgc2NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHJ1bnRpbWUgICAgfCAyNSAgICAgfCAzMC1kYXkgc3VjY2VzcyByYXRlOyBvbmx5IHdpdGgg4omlIDIwIHJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHZ1bG5zICAgICAgfCAyMCAgICAgfCAxIOKIkiAwLjXCt2NyaXRpY2FsIOKIkiAwLjHCt2hpZ2ggKGZsb29yIDApLCBsYXRlc3QgbGlzdGVkIHZlcnNpb247IHNjYW5uZWQgb25seSB8XG4gKiB8IGZyZXNobmVzcyAgfCAxNSAgICAgfCByZWxlYXNlIGFnZSAo4omkOTBkIDEg4oaSIDAgYXQgNTQwZCkgYXZlcmFnZWQgd2l0aCBiYXNlLWltYWdlIGFnZSAo4omkNjBkIDEg4oaSIDAgYXQgMzY1ZCkgd2hlbiByZWNvcmRlZCB8XG4gKiB8IHNpZ25lZCAgICAgfCAxMCAgICAgfCBpbWFnZSBkaWdlc3QgcHJlc2VudCBhbmQgc2lnbmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHNtb2tlVGVzdCAgfCAxMCAgICAgfCBzbW9rZSB0ZXN0IGRlY2xhcmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGRvY3MgICAgICAgfCAxMCAgICAgfCBSRUFETUUgMC41ICsgbGljZW5zZSAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXRpbmcgICAgIHwgMTAgICAgIHwgQmF5ZXNpYW4gcmF0aW5nIC8gNTsgb25seSB3aXRoIOKJpSAzIHJhdGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICovXG5cbmV4cG9ydCBjb25zdCBIRUFMVEhfQ09NUE9ORU5UUyA9IFsncnVudGltZScsICd2dWxucycsICdmcmVzaG5lc3MnLCAnc2lnbmVkJywgJ3Ntb2tlVGVzdCcsICdkb2NzJywgJ3JhdGluZyddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGVhbHRoQ29tcG9uZW50ID0gKHR5cGVvZiBIRUFMVEhfQ09NUE9ORU5UUylbbnVtYmVyXTtcblxuLyoqIE5vbWluYWwgd2VpZ2h0IG9mIGVhY2ggY29tcG9uZW50ICh0aGV5IHN1bSB0byAxMDApLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9XRUlHSFRTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXI+PiA9IHtcbiAgcnVudGltZTogMjUsXG4gIHZ1bG5zOiAyMCxcbiAgZnJlc2huZXNzOiAxNSxcbiAgc2lnbmVkOiAxMCxcbiAgc21va2VUZXN0OiAxMCxcbiAgZG9jczogMTAsXG4gIHJhdGluZzogMTAsXG59O1xuXG4vKiogSHVtYW4gbGFiZWxzIGZvciB0aGUgYnJlYWtkb3duIHBhbmVsLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9DT01QT05FTlRfTEFCRUxTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBzdHJpbmc+PiA9IHtcbiAgcnVudGltZTogJ1J1bnRpbWUgc3VjY2VzcyAoMzAgZGF5cyknLFxuICB2dWxuczogJ0tub3duIHZ1bG5lcmFiaWxpdGllcycsXG4gIGZyZXNobmVzczogJ0ZyZXNobmVzcycsXG4gIHNpZ25lZDogJ1NpZ25lZCBpbWFnZScsXG4gIHNtb2tlVGVzdDogJ1Ntb2tlIHRlc3QgZGVjbGFyZWQnLFxuICBkb2NzOiAnUkVBRE1FIGFuZCBsaWNlbnNlJyxcbiAgcmF0aW5nOiAnUmF0aW5nJyxcbn07XG5cbi8qKiBGZXdlciBhdmFpbGFibGUgY29tcG9uZW50cyB0aGFuIHRoaXMg4oeSIG5vIHNjb3JlLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyA9IDM7XG4vKiogUnVucyBuZWVkZWQgaW4gdGhlIHdpbmRvdyBiZWZvcmUgdGhlIHN1Y2Nlc3MgcmF0ZSBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SVU5TID0gMjA7XG4vKiogUmF0aW5ncyBuZWVkZWQgYmVmb3JlIHRoZSByYXRpbmcgY291bnRzLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fUkFUSU5HUyA9IDM7XG4vKiogUmVsZWFzZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfRlVMTF9EQVlTID0gOTA7XG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTID0gNTQwO1xuLyoqIEJhc2UtaW1hZ2UgYWdlOiBmdWxsIG1hcmtzIHVwIHRvIHRoaXMgbWFueSBkYXlzLCB6ZXJvIGF0IHtAbGluayBIRUFMVEhfQkFTRV9JTUFHRV9aRVJPX0RBWVN9LiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUyA9IDYwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUyA9IDM2NTtcblxuLyoqIE9uZSBjb21wb25lbnQncyBjb250cmlidXRpb246IGl0cyAwLi4xIHNjb3JlIChudWxsID0gbWlzc2luZywgZHJvcHBlZCkgYW5kIGl0cyBub21pbmFsIHdlaWdodC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ29tcG9uZW50U2NvcmUge1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBIZWFsdGhCcmVha2Rvd24gPSBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBIZWFsdGhDb21wb25lbnRTY29yZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoUmVzdWx0IHtcbiAgLyoqIDDigJMxMDAgaW50ZWdlciwgb3IgbnVsbCB3aXRoIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cy4gKi9cbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gIGJyZWFrZG93bjogSGVhbHRoQnJlYWtkb3duO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHNjb3JlIGlzIGNvbXB1dGVkIGZyb20uIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsOiBgdW5kZWZpbmVkYCAvIG51bGxcbiAqIG1lYW5zIFwibm90IGtub3duXCIsIHdoaWNoIGRyb3BzIHRoZSBjb21wb25lbnQgKG9yLCBmb3IgZnJlc2huZXNzLCB0aGF0IGhhbGYpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aElucHV0cyB7XG4gIC8qKiBUZXJtaW5hbCBydW5zIGluIHRoZSAzMC1kYXkgd2luZG93LCBhbmQgdGhlIHNoYXJlIHRoYXQgc3VjY2VlZGVkICgwLi4xKS4gKi9cbiAgcnVuczMwZD86IG51bWJlciB8IG51bGw7XG4gIHN1Y2Nlc3NSYXRlMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBzY2FuOyBgc2Nhbm5lZEF0YCBudWxsIOKHkiBuZXZlciBzY2FubmVkLiAqL1xuICB2dWxuQ3JpdGljYWw/OiBudW1iZXIgfCBudWxsO1xuICB2dWxuSGlnaD86IG51bWJlciB8IG51bGw7XG4gIHNjYW5uZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogV2hlbiB0aGUgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIHdhcyBwdWJsaXNoZWQuICovXG4gIGxhc3RSZWxlYXNlQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBiYXNlIGltYWdlIGBjcmVhdGVkYCB0aW1lLCB3aGVuIHJlY29yZGVkLiAqL1xuICBiYXNlSW1hZ2VDcmVhdGVkQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExhdGVzdCBsaXN0ZWQgdmVyc2lvbiBoYXMgYW4gaW1hZ2UgZGlnZXN0IEFORCBhIHNpZ25hdHVyZSAoaXRzIGBwdWJsaWMvKmAgY29weSkuICovXG4gIHNpZ25lZD86IGJvb2xlYW4gfCBudWxsO1xuICBzbW9rZVRlc3REZWNsYXJlZD86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNSZWFkbWU/OiBib29sZWFuIHwgbnVsbDtcbiAgaGFzTGljZW5zZT86IGJvb2xlYW4gfCBudWxsO1xuICByYXRpbmdCYXllcz86IG51bWJlciB8IG51bGw7XG4gIHJhdGluZ0NvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuY29uc3QgREFZX01TID0gODZfNDAwXzAwMDtcblxuY29uc3Qgcm91bmQzID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLnJvdW5kKG4gKiAxMDAwKSAvIDEwMDA7XG5jb25zdCBjbGFtcDAxID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBuKSk7XG5cbmZ1bmN0aW9uIHRvVGltZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICBpZiAoZCA9PT0gbnVsbCB8fCBkID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCB0ID0gbmV3IERhdGUoZCkuZ2V0VGltZSgpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpID8gdCA6IG51bGw7XG59XG5cbi8qKiAxIHVwIHRvIGBmdWxsRGF5c2AsIGZhbGxpbmcgbGluZWFybHkgdG8gMCBhdCBgemVyb0RheXNgIChhIGZ1dHVyZSBkYXRlIGNvdW50cyBhcyBmcmVzaCkuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlU2NvcmUoYWdlRGF5czogbnVtYmVyLCBmdWxsRGF5czogbnVtYmVyLCB6ZXJvRGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGFnZURheXMgPD0gZnVsbERheXMpIHJldHVybiAxO1xuICBpZiAoYWdlRGF5cyA+PSB6ZXJvRGF5cykgcmV0dXJuIDA7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAoYWdlRGF5cyAtIGZ1bGxEYXlzKSAvICh6ZXJvRGF5cyAtIGZ1bGxEYXlzKSk7XG59XG5cbi8qKiBUaGUgdnVsbmVyYWJpbGl0eSBjb21wb25lbnQ6IDEg4oiSIDAuNcK3Y3JpdGljYWwg4oiSIDAuMcK3aGlnaCwgZmxvb3JlZCBhdCAwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5TY29yZShjcml0aWNhbDogbnVtYmVyLCBoaWdoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gY2xhbXAwMSgxIC0gMC41ICogTWF0aC5tYXgoMCwgY3JpdGljYWwpIC0gMC4xICogTWF0aC5tYXgoMCwgaGlnaCkpO1xufVxuXG5mdW5jdGlvbiBydW50aW1lQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5ydW5zMzBkID09PSBudWxsIHx8IGkucnVuczMwZCA9PT0gdW5kZWZpbmVkIHx8IGkucnVuczMwZCA8IEhFQUxUSF9NSU5fUlVOUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8IGkuc3VjY2Vzc1JhdGUzMGQgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkuc3VjY2Vzc1JhdGUzMGQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5zdWNjZXNzUmF0ZTMwZCk7XG59XG5cbmZ1bmN0aW9uIHZ1bG5zQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAodG9UaW1lKGkuc2Nhbm5lZEF0KSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB2dWxuU2NvcmUoaS52dWxuQ3JpdGljYWwgPz8gMCwgaS52dWxuSGlnaCA/PyAwKTtcbn1cblxuZnVuY3Rpb24gZnJlc2huZXNzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cywgbm93OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcGFydHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHJlbGVhc2UgPSB0b1RpbWUoaS5sYXN0UmVsZWFzZUF0KTtcbiAgaWYgKHJlbGVhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIHJlbGVhc2UpIC8gREFZX01TLCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMsIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZUykpO1xuICBjb25zdCBiYXNlID0gdG9UaW1lKGkuYmFzZUltYWdlQ3JlYXRlZEF0KTtcbiAgaWYgKGJhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIGJhc2UpIC8gREFZX01TLCBIRUFMVEhfQkFTRV9JTUFHRV9GVUxMX0RBWVMsIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUykpO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBhcnRzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gcGFydHMubGVuZ3RoO1xufVxuXG5jb25zdCBmbGFnID0gKGI6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCA9PiAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyBudWxsIDogYiA/IDEgOiAwKTtcblxuZnVuY3Rpb24gZG9jc0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKChpLmhhc1JlYWRtZSA9PT0gbnVsbCB8fCBpLmhhc1JlYWRtZSA9PT0gdW5kZWZpbmVkKSAmJiAoaS5oYXNMaWNlbnNlID09PSBudWxsIHx8IGkuaGFzTGljZW5zZSA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoaS5oYXNSZWFkbWUgPyAwLjUgOiAwKSArIChpLmhhc0xpY2Vuc2UgPyAwLjUgOiAwKTtcbn1cblxuZnVuY3Rpb24gcmF0aW5nQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5yYXRpbmdDb3VudCA9PT0gbnVsbCB8fCBpLnJhdGluZ0NvdW50ID09PSB1bmRlZmluZWQgfHwgaS5yYXRpbmdDb3VudCA8IEhFQUxUSF9NSU5fUkFUSU5HUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnJhdGluZ0JheWVzID09PSBudWxsIHx8IGkucmF0aW5nQmF5ZXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkucmF0aW5nQmF5ZXMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5yYXRpbmdCYXllcyAvIDUpO1xufVxuXG4vKiogVGhlIGhlYWx0aCBzY29yZSBhbmQgaXRzIHBlci1jb21wb25lbnQgYnJlYWtkb3duLiBQdXJlOyBgbm93YCBpcyBpbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVhbHRoU2NvcmUoaW5wdXRzOiBIZWFsdGhJbnB1dHMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBIZWFsdGhSZXN1bHQge1xuICBjb25zdCB0ID0gbm93LmdldFRpbWUoKTtcbiAgY29uc3QgcmF3OiBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXIgfCBudWxsPiA9IHtcbiAgICBydW50aW1lOiBydW50aW1lQ29tcG9uZW50KGlucHV0cyksXG4gICAgdnVsbnM6IHZ1bG5zQ29tcG9uZW50KGlucHV0cyksXG4gICAgZnJlc2huZXNzOiBmcmVzaG5lc3NDb21wb25lbnQoaW5wdXRzLCB0KSxcbiAgICBzaWduZWQ6IGZsYWcoaW5wdXRzLnNpZ25lZCksXG4gICAgc21va2VUZXN0OiBmbGFnKGlucHV0cy5zbW9rZVRlc3REZWNsYXJlZCksXG4gICAgZG9jczogZG9jc0NvbXBvbmVudChpbnB1dHMpLFxuICAgIHJhdGluZzogcmF0aW5nQ29tcG9uZW50KGlucHV0cyksXG4gIH07XG4gIGNvbnN0IGJyZWFrZG93biA9IHt9IGFzIEhlYWx0aEJyZWFrZG93bjtcbiAgbGV0IHdlaWdodGVkID0gMDtcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcbiAgbGV0IGF2YWlsYWJsZSA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBIRUFMVEhfQ09NUE9ORU5UUykge1xuICAgIGNvbnN0IHNjb3JlID0gcmF3W2NdO1xuICAgIGJyZWFrZG93bltjXSA9IHsgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IHJvdW5kMyhzY29yZSksIHdlaWdodDogSEVBTFRIX1dFSUdIVFNbY10gfTtcbiAgICBpZiAoc2NvcmUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGF2YWlsYWJsZSsrO1xuICAgIHdlaWdodGVkICs9IHNjb3JlICogSEVBTFRIX1dFSUdIVFNbY107XG4gICAgdG90YWxXZWlnaHQgKz0gSEVBTFRIX1dFSUdIVFNbY107XG4gIH1cbiAgY29uc3Qgc2NvcmUgPSBhdmFpbGFibGUgPCBIRUFMVEhfTUlOX0NPTVBPTkVOVFMgfHwgdG90YWxXZWlnaHQgPT09IDAgPyBudWxsIDogTWF0aC5yb3VuZCgoMTAwICogd2VpZ2h0ZWQpIC8gdG90YWxXZWlnaHQpO1xuICByZXR1cm4geyBzY29yZSwgYnJlYWtkb3duIH07XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIncyBoZWFsdGg6IHRoZSBpbnN0YWxsLXdlaWdodGVkIG1lYW4gb2YgaXRzIGxpc3RpbmdzJyBzY29yZXNcbiAqIChsaXN0aW5ncyB3aXRoIG5vIHNjb3JlIGFyZSBza2lwcGVkOyB3aGVuIG5vIGxpc3RpbmcgaGFzIGluc3RhbGxzLCB0aGUgcGxhaW5cbiAqIG1lYW4pLiBOdWxsIHdoZW4gbm8gbGlzdGluZyBoYXMgYSBzY29yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlckhlYWx0aFNjb3JlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgaGVhbHRoU2NvcmU6IG51bWJlciB8IG51bGw7IGluc3RhbGxDb3VudDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHNjb3JlZCA9IGxpc3RpbmdzLmZpbHRlcigobCk6IGwgaXMgeyBoZWFsdGhTY29yZTogbnVtYmVyOyBpbnN0YWxsQ291bnQ6IG51bWJlciB9ID0+XG4gICAgbC5oZWFsdGhTY29yZSAhPT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUobC5oZWFsdGhTY29yZSkpO1xuICBpZiAoc2NvcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHdlaWdodE9mID0gKG46IG51bWJlcikgPT4gTWF0aC5tYXgoMCwgbik7XG4gIGNvbnN0IHRvdGFsSW5zdGFsbHMgPSBzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKTtcbiAgaWYgKHRvdGFsSW5zdGFsbHMgPT09IDApIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlLCAwKSAvIHNjb3JlZC5sZW5ndGgpO1xuICByZXR1cm4gTWF0aC5yb3VuZChzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgbC5oZWFsdGhTY29yZSAqIHdlaWdodE9mKGwuaW5zdGFsbENvdW50KSwgMCkgLyB0b3RhbEluc3RhbGxzKTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIDMwLWRheSBzdWNjZXNzIHJhdGUgYWNyb3NzIGl0cyBsaXN0aW5ncywgd2VpZ2h0ZWQgYnkgcnVucy5cbiAqIE51bGwgd2hlbiBub25lIG9mIGl0cyBsaXN0aW5ncyByYW4gaW4gdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlclN1Y2Nlc3NSYXRlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgc3VjY2Vzc1JhdGUzMGQ6IG51bWJlciB8IG51bGw7IHJ1bnMzMGQ6IG51bWJlciB9Pik6IG51bWJlciB8IG51bGwge1xuICBsZXQgcnVucyA9IDA7XG4gIGxldCBzdWNjZWVkZWQgPSAwO1xuICBmb3IgKGNvbnN0IGwgb2YgbGlzdGluZ3MpIHtcbiAgICBpZiAobC5zdWNjZXNzUmF0ZTMwZCA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKGwuc3VjY2Vzc1JhdGUzMGQpIHx8IGwucnVuczMwZCA8PSAwKSBjb250aW51ZTtcbiAgICBydW5zICs9IGwucnVuczMwZDtcbiAgICBzdWNjZWVkZWQgKz0gbC5zdWNjZXNzUmF0ZTMwZCAqIGwucnVuczMwZDtcbiAgfVxuICByZXR1cm4gcnVucyA9PT0gMCA/IG51bGwgOiByb3VuZDMoc3VjY2VlZGVkIC8gcnVucyk7XG59XG5cbi8qKiBEaXNwbGF5IGJhbmQgZm9yIGEgc2NvcmU6IGdvb2Qg4omlIDgwLCBmYWlyIOKJpSA1MCwgcG9vciBiZWxvdywgdW5rbm93biB3aGVuIG51bGwuICovXG5leHBvcnQgdHlwZSBIZWFsdGhCYW5kID0gJ2dvb2QnIHwgJ2ZhaXInIHwgJ3Bvb3InIHwgJ3Vua25vd24nO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0dPT0QgPSA4MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFORF9GQUlSID0gNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiBoZWFsdGhCYW5kKHNjb3JlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogSGVhbHRoQmFuZCB7XG4gIGlmIChzY29yZSA9PT0gbnVsbCB8fCBzY29yZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoc2NvcmUpKSByZXR1cm4gJ3Vua25vd24nO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfR09PRCkgcmV0dXJuICdnb29kJztcbiAgaWYgKHNjb3JlID49IEhFQUxUSF9CQU5EX0ZBSVIpIHJldHVybiAnZmFpcic7XG4gIHJldHVybiAncG9vcic7XG59XG4iXX0=
@@ -24,6 +24,12 @@ export interface QuotaTierLimits {
24
24
  alertRules: number;
25
25
  alertDestinations: number;
26
26
  idpConfigs: number;
27
+ /**
28
+ * Active, non-suspended plugin-ecosystem listings the org publishes
29
+ * (docs/plugin-installing.md). A COUNT quota — installs never
30
+ * count. -1 = unlimited. Extendable via the `listing_pack` add-on bundle.
31
+ */
32
+ listings: number;
27
33
  /**
28
34
  * Max org members (active users / seats). -1 = unlimited. This is the "Team"
29
35
  * tier differentiator — enforced at member-invite time (an invite is blocked
@@ -77,3 +83,12 @@ export declare const DEFAULT_TIER: QuotaTier;
77
83
  export declare function isValidTier(value: string): value is QuotaTier;
78
84
  /** Get the default limits for a given tier (falls back to developer). */
79
85
  export declare function getTierLimits(tier: string): QuotaTierLimits;
86
+ /**
87
+ * The period (days) every usage counter rolls over on. All quotas are per-period
88
+ * FLOW counters on one shared period: the quota service resets a counter this
89
+ * many days after it expires, and platform seeds a new org's counters with the
90
+ * same window (`QUOTA_RESET_DAYS`, default 3).
91
+ */
92
+ export declare const QUOTA_RESET_DAYS: number;
93
+ /** The next quota reset: local midnight `days` from `now`. */
94
+ export declare function nextQuotaResetDate(days?: number, now?: Date): Date;
@@ -1,6 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
- import { envInt, envStr } from '../utils/env.js';
3
+ import { envBool, envInt, envStr } from '../utils/env.js';
4
4
  /**
5
5
  * Preset limits for each tier. -1 means unlimited.
6
6
  *
@@ -36,6 +36,7 @@ const DEFAULT_TIER_LIMITS = {
36
36
  alertRules: 50,
37
37
  alertDestinations: 10,
38
38
  idpConfigs: 1,
39
+ listings: 3,
39
40
  seats: 1,
40
41
  eventRetentionDays: 30,
41
42
  doraRetentionDays: 180,
@@ -54,6 +55,7 @@ const DEFAULT_TIER_LIMITS = {
54
55
  alertRules: 500,
55
56
  alertDestinations: 50,
56
57
  idpConfigs: 5,
58
+ listings: 10,
57
59
  seats: 1,
58
60
  eventRetentionDays: 30,
59
61
  doraRetentionDays: 180,
@@ -72,6 +74,7 @@ const DEFAULT_TIER_LIMITS = {
72
74
  alertRules: -1,
73
75
  alertDestinations: -1,
74
76
  idpConfigs: 5,
77
+ listings: 25,
75
78
  seats: 3,
76
79
  eventRetentionDays: 30,
77
80
  doraRetentionDays: 180,
@@ -90,6 +93,7 @@ const DEFAULT_TIER_LIMITS = {
90
93
  alertRules: -1,
91
94
  alertDestinations: -1,
92
95
  idpConfigs: -1,
96
+ listings: 100,
93
97
  seats: 15,
94
98
  eventRetentionDays: 30,
95
99
  doraRetentionDays: 180,
@@ -106,6 +110,7 @@ const DEFAULT_TIER_LIMITS = {
106
110
  alertRules: -1,
107
111
  alertDestinations: -1,
108
112
  idpConfigs: -1,
113
+ listings: -1,
109
114
  seats: -1,
110
115
  eventRetentionDays: -1,
111
116
  doraRetentionDays: -1,
@@ -151,6 +156,7 @@ function tierLimits(tier) {
151
156
  alertRules: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_RULES`, d.alertRules),
152
157
  alertDestinations: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_DESTINATIONS`, d.alertDestinations),
153
158
  idpConfigs: tierLimitEnv(`QUOTA_TIER_${T}_IDP_CONFIGS`, d.idpConfigs),
159
+ listings: tierLimitEnv(`QUOTA_TIER_${T}_LISTINGS`, d.listings),
154
160
  seats: tierLimitEnv(`QUOTA_TIER_${T}_SEATS`, d.seats),
155
161
  eventRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_EVENT_RETENTION_DAYS`, d.eventRetentionDays),
156
162
  doraRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_DORA_RETENTION_DAYS`, d.doraRetentionDays),
@@ -184,7 +190,7 @@ export function tierAllowsTeams(tier) {
184
190
  * opt-out default-on — mirrors the billing/platform configs). With billing OFF
185
191
  * there's no metering/enforcement surface, so the default tier is `unlimited`. */
186
192
  export function isBillingEnabled() {
187
- return (process.env.BILLING_ENABLED || 'true').toLowerCase() !== 'false';
193
+ return envBool('BILLING_ENABLED', true);
188
194
  }
189
195
  /**
190
196
  * Default tier assigned to new organizations.
@@ -208,4 +214,18 @@ export function isValidTier(value) {
208
214
  export function getTierLimits(tier) {
209
215
  return isValidTier(tier) ? QUOTA_TIERS[tier].limits : QUOTA_TIERS.developer.limits;
210
216
  }
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdURqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUU5Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUF1QztJQUM5RCwwRUFBMEU7SUFDMUUsNEVBQTRFO0lBQzVFLDhFQUE4RTtJQUM5RSxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLE1BQU07UUFDaEIsT0FBTyxFQUFFLEVBQUU7UUFDWCxZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDcEIsVUFBVSxFQUFFLEVBQUU7UUFDZCxVQUFVLEVBQUUsRUFBRTtRQUNkLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsVUFBVSxFQUFFLENBQUM7UUFDYixLQUFLLEVBQUUsQ0FBQztRQUNSLGtCQUFrQixFQUFFLEVBQUU7UUFDdEIsaUJBQWlCLEVBQUUsR0FBRztLQUN2QjtJQUNELCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDckIsVUFBVSxFQUFFLEdBQUc7UUFDZixVQUFVLEVBQUUsR0FBRztRQUNmLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsVUFBVSxFQUFFLENBQUM7UUFDYixL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QixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFjLENBQUMsZ0JBQWdCLEVBQUU7SUFDeEQsQ0FBQyxDQUFDLFdBQVc7SUFDYixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLFdBQVc7UUFDcEcsQ0FBQyxDQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdDO1FBQy9DLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUVuQixtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLCtFQUErRTtJQUMvRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLGtGQUFrRjtJQUNsRixPQUFRLFdBQWlDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFBLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGVudkludCwgZW52U3RyIH0gZnJvbSAnLi4vdXRpbHMvZW52LmpzJztcblxuLyoqIEF2YWlsYWJsZSBxdW90YSB0aWVyIGlkZW50aWZpZXJzLlxuICpcbiAqIGB1bmxpbWl0ZWRgIGlzIGEgc3BlY2lhbCB0aWVyOiBldmVyeSBxdW90YSBpcyBgLTFgICh1bmNhcHBlZCkgYW5kIGl0IGluY2x1ZGVzXG4gKiBldmVyeSBmZWF0dXJlL2FkZC1vbiBidW5kbGUuIEl0IGlzIHRoZSBERUZBVUxUIHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZCAobm9cbiAqIG1ldGVyaW5nL2VuZm9yY2VtZW50IHN1cmZhY2UgZXhpc3RzLCBzbyBub3RoaW5nIGlzIGNhcHBlZCksIGFuZCBpdCBpcyBORVZFUlxuICogc2hvd24gb3Igc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCDigJQgc2VlIGBTVEFOREFSRF9USUVSU2AuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3RlYW0nIHwgJ2VudGVycHJpc2UnIHwgJ3VubGltaXRlZCc7XG5cbi8qKiBMaW1pdCB2YWx1ZXMgZm9yIGVhY2ggcXVvdGEgdHlwZSB3aXRoaW4gYSB0aWVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdW90YVRpZXJMaW1pdHMge1xuICBwbHVnaW5zOiBudW1iZXI7XG4gIHBpcGVsaW5lczogbnVtYmVyO1xuICBhcGlDYWxsczogbnVtYmVyO1xuICBhaUNhbGxzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgcmVnaXN0cnkgc3RvcmFnZSBjYXAgaW4gQllURVMuIENvdW50ZWQgYWNyb3NzIGV2ZXJ5IHJlcG9cbiAgICogdW5kZXIgdGhlIG9yZydzIGBvcmcte29yZ0lkfS9gIG5hbWVzcGFjZS4gLTEgbWVhbnMgdW5saW1pdGVkLlxuICAgKiBwdXNoLWdhdGUgcmVhZHMgdGhpczsgdGhlIGltYWdlLXJlZ2lzdHJ5IHJlamVjdHMgdG9rZW4gaXNzdWFuY2UgZm9yXG4gICAqIGBwdXNoYCBzY29wZSB3aGVuIHRoZSBvcmcncyBtZWFzdXJlZCB1c2FnZSBleGNlZWRzIHRoZSBsaW1pdC5cbiAgICovXG4gIHN0b3JhZ2VCeXRlczogbnVtYmVyO1xuICAvKiogQ291bnQtcXVvdGFzIG9uIHRoZSB1c2VyLWVkaXRhYmxlIGZlYXR1cmUgdGFibGVzIGFkZGVkIHRvIGNsb3NlIHBlci1vcmdcbiAgICogIERvUyB2aWEgc3BhbS4gLTEgbWVhbnMgdW5saW1pdGVkLiAqL1xuICBkYXNoYm9hcmRzOiBudW1iZXI7XG4gIGFsZXJ0UnVsZXM6IG51bWJlcjtcbiAgYWxlcnREZXN0aW5hdGlvbnM6IG51bWJlcjtcbiAgaWRwQ29uZmlnczogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IG9yZyBtZW1iZXJzIChhY3RpdmUgdXNlcnMgLyBzZWF0cykuIC0xID0gdW5saW1pdGVkLiBUaGlzIGlzIHRoZSBcIlRlYW1cIlxuICAgKiB0aWVyIGRpZmZlcmVudGlhdG9yIOKAlCBlbmZvcmNlZCBhdCBtZW1iZXItaW52aXRlIHRpbWUgKGFuIGludml0ZSBpcyBibG9ja2VkXG4gICAqIHdoZW4gYWN0aXZlIG1lbWJlcnMgKyBwZW5kaW5nIGludml0ZXMgd291bGQgZXhjZWVkIHRoaXMpLlxuICAgKi9cbiAgc2VhdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDUwIEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMjUsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYWlDYWxsczogMjUsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgc2VhdHM6IDEsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDUwLFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMjUwXzAwMCxcbiAgICBhaUNhbGxzOiAxXzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDI1ICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAwLFxuICAgIGFsZXJ0UnVsZXM6IDUwMCxcbiAgICBhbGVydERlc3RpbmF0aW9uczogNTAsXG4gICAgaWRwQ29uZmlnczogNSxcbiAgICBzZWF0czogMSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFRlYW0gPSBjb2xsYWJvcmF0aW9uIHRpZXI7IHRoZSBzZWF0IGxpbWl0ICgzKSBpcyB0aGUgcmVhbCBkaWZmZXJlbnRpYXRvciBvdmVyXG4gIC8vIFBybyAoc2luZ2xlLXNlYXQpIOKAlCBpdCdzIHRoZSBtdWx0aS1zZWF0IGNvbGxhYm9yYXRpb24gZmxvb3IuIExlYW4gYmFzZSAoJDc5KTpcbiAgLy8gZ3Jvd3RoIHJpZGVzIHRoZSBzZWF0L3BpcGVsaW5lL2V0YyBhZGQtb25zIChsYW5kLWFuZC1leHBhbmQpLiBMaW1pdHMgc2l0XG4gIC8vIGJldHdlZW4gUHJvIGFuZCBFbnRlcnByaXNlLlxuICB0ZWFtOiB7XG4gICAgcGx1Z2luczogNzUsXG4gICAgcGlwZWxpbmVzOiA2LFxuICAgIGFwaUNhbGxzOiA1MDBfMDAwLFxuICAgIGFpQ2FsbHM6IDJfNTAwLFxuICAgIHN0b3JhZ2VCeXRlczogNjAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogNSxcbiAgICBzZWF0czogMyxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIEVudGVycHJpc2UgKCQ1OTksIGhlbGQpOiB0aGUgYWxsLWluY2x1c2l2ZSB0aWVyIOKAlCAxNSBzZWF0cywgMzAgcGlwZWxpbmVzLCBBTExcbiAgLy8gcHJlbWl1bSBmZWF0dXJlcyBpbmNsdWRlZCAoc2VlIFRJRVJfRkVBVFVSRVMpLiBGQUlSLVVTRSDigJQgY29zdCBkcml2ZXJzIChhcGlDYWxscyxcbiAgLy8gYWlDYWxscywgc3RvcmFnZUJ5dGVzKSBjYXBwZWQgc28gb25lIGFjY291bnQgY2FuJ3QgcnVuIHVwIHVuYm91bmRlZFxuICAvLyBjb21wdXRlL3Byb3ZpZGVyL3N0b3JhZ2UgY29zdCBvbiBhIGZsYXQgcHJpY2U7IGNoZWFwIGNvdW50LXF1b3RhcyBzdGF5IC0xLlxuICBlbnRlcnByaXNlOiB7XG4gICAgcGx1Z2luczogMTUwLFxuICAgIHBpcGVsaW5lczogMzAsXG4gICAgYXBpQ2FsbHM6IDkwMF8wMDAsXG4gICAgYWlDYWxsczogOV8wMDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyNTAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgc2VhdHM6IDE1LFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gVW5saW1pdGVkOiBFVkVSWSBxdW90YSB1bmNhcHBlZCAoLTEpLiBUaGUgZGVmYXVsdCB3aGVuIGJpbGxpbmcgaXMgZGlzYWJsZWRcbiAgLy8gKG5vIGVuZm9yY2VtZW50IHN1cmZhY2UpIOKAlCBuZXZlciBzaG93bi9zZWxlY3RhYmxlIHdoZW4gYmlsbGluZyBpcyBlbmFibGVkLlxuICB1bmxpbWl0ZWQ6IHtcbiAgICBwbHVnaW5zOiAtMSxcbiAgICBwaXBlbGluZXM6IC0xLFxuICAgIGFwaUNhbGxzOiAtMSxcbiAgICBhaUNhbGxzOiAtMSxcbiAgICBzdG9yYWdlQnl0ZXM6IC0xLFxuICAgIGRhc2hib2FyZHM6IC0xLFxuICAgIGFsZXJ0UnVsZXM6IC0xLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiAtMSxcbiAgICBpZHBDb25maWdzOiAtMSxcbiAgICBzZWF0czogLTEsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAtMSxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogLTEsXG4gIH0sXG59O1xuXG4vKipcbiAqIFJlYWQgYSB0aWVyIExJTUlUIGVudiB2YXIuIGAtMWAgPSB1bmxpbWl0ZWQ7IGFueXRoaW5nIGJlbG93IHRoYXQgaXMgbm9uc2Vuc2VcbiAqIChhIGAtNWAgbGltaXQgd291bGQgc2hpcCBhIGJyb2tlbiBmaW5pdGUgY2FwKSwgc28gaXQgZmFsbHMgYmFjayB0byB0aGUgY29kZVxuICogZGVmYXVsdCByYXRoZXIgdGhhbiBjbGFtcGluZyB1cCB0byBgLTFgLiBUaGUgcGFyc2luZyBpdHNlbGYgaXMgYXBpLWNvcmUnc1xuICogc2hhcmVkIGBlbnZJbnRgIOKAlCBzdHJpY3QgYWJvdXQgZGVjaW1hbHMvZ2FyYmFnZSDigJQgbm90IGEgbG9jYWwgcmUtZGVyaXZhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0RW52KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IG4gPSBlbnZJbnQobmFtZSwgZmFsbGJhY2spO1xuICByZXR1cm4gbiA8IC0xID8gZmFsbGJhY2sgOiBuO1xufVxuXG4vKipcbiAqIFBlci10aWVyIGxpbWl0cywgZWFjaCBvdmVycmlkYWJsZSB2aWEgYFFVT1RBX1RJRVJfPFRJRVI+XzxMSU1JVD5gIGVudiB2YXJzXG4gKiAoZS5nLiBgUVVPVEFfVElFUl9QUk9fUElQRUxJTkVTPTI1MGAsIGBRVU9UQV9USUVSX0RFVkVMT1BFUl9TVE9SQUdFX0JZVEVTPS4uLmApLlxuICogVW5zZXQvZW1wdHkg4oaSIHRoZSBjb2RlIGRlZmF1bHQuIGAtMWAgPSB1bmxpbWl0ZWQuIFJlYWQgb25jZSBhdCBtb2R1bGUgbG9hZCDigJRcbiAqIG9uIGs4cyB0aGVzZSBmbG93IGluIHZpYSB0aGUgYGFwcC1lbnZgIENvbmZpZ01hcCAoYnVpbHQgZnJvbSBgLmVudmApLlxuICovXG5mdW5jdGlvbiB0aWVyTGltaXRzKHRpZXI6IFF1b3RhVGllcik6IFF1b3RhVGllckxpbWl0cyB7XG4gIC8vIGB1bmxpbWl0ZWRgIGlzIHVuY2FwcGVkIEJZIERFRklOSVRJT046IEVWRVJZIHF1b3RhIGlzIC0xIGFuZCBpdCBpcyBOT1RcbiAgLy8gZW52LW92ZXJyaWRhYmxlLiBSZWFkaW5nIFFVT1RBX1RJRVJfVU5MSU1JVEVEXyogaGVyZSB3b3VsZCBsZXQgYSBzdHJheSBlbnZcbiAgLy8gdmFyIHNpbGVudGx5IGNhcCB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IHRpZXIg4oCUIHN1cmZhY2luZyBhcyBhIHNwdXJpb3VzXG4gIC8vIFwicXVvdGEgZXhjZWVkZWRcIiBvbiBhIGRlcGxveSB0aGF0IG1ldGVycyBub3RoaW5nLiBEZXJpdmUgLTEgZm9yIGV2ZXJ5IGZpZWxkXG4gIC8vIGZyb20gdGhlIGxpbWl0cyBzaGFwZSBzbyBhIG5ld2x5LWFkZGVkIHF1b3RhIGlzIHVuY2FwcGVkIGhlcmUgYXV0b21hdGljYWxseS5cbiAgaWYgKHRpZXIgPT09ICd1bmxpbWl0ZWQnKSB7XG4gICAgY29uc3QgdW5jYXBwZWQgPSB7IC4uLkRFRkFVTFRfVElFUl9MSU1JVFMudW5saW1pdGVkIH07XG4gICAgZm9yIChjb25zdCBrIG9mIE9iamVjdC5rZXlzKHVuY2FwcGVkKSBhcyAoa2V5b2YgUXVvdGFUaWVyTGltaXRzKVtdKSB1bmNhcHBlZFtrXSA9IC0xO1xuICAgIHJldHVybiB1bmNhcHBlZDtcbiAgfVxuICBjb25zdCBkID0gREVGQVVMVF9USUVSX0xJTUlUU1t0aWVyXTtcbiAgY29uc3QgVCA9IHRpZXIudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIHtcbiAgICBwbHVnaW5zOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9QTFVHSU5TYCwgZC5wbHVnaW5zKSxcbiAgICBwaXBlbGluZXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1BJUEVMSU5FU2AsIGQucGlwZWxpbmVzKSxcbiAgICBhcGlDYWxsczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQVBJX0NBTExTYCwgZC5hcGlDYWxscyksXG4gICAgYWlDYWxsczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQUlfQ0FMTFNgLCBkLmFpQ2FsbHMpLFxuICAgIHN0b3JhZ2VCeXRlczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU1RPUkFHRV9CWVRFU2AsIGQuc3RvcmFnZUJ5dGVzKSxcbiAgICBkYXNoYm9hcmRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9EQVNIQk9BUkRTYCwgZC5kYXNoYm9hcmRzKSxcbiAgICBhbGVydFJ1bGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BTEVSVF9SVUxFU2AsIGQuYWxlcnRSdWxlcyksXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX0RFU1RJTkFUSU9OU2AsIGQuYWxlcnREZXN0aW5hdGlvbnMpLFxuICAgIGlkcENvbmZpZ3M6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0lEUF9DT05GSUdTYCwgZC5pZHBDb25maWdzKSxcbiAgICBzZWF0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU0VBVFNgLCBkLnNlYXRzKSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0VWRU5UX1JFVEVOVElPTl9EQVlTYCwgZC5ldmVudFJldGVudGlvbkRheXMpLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9ET1JBX1JFVEVOVElPTl9EQVlTYCwgZC5kb3JhUmV0ZW50aW9uRGF5cyksXG4gIH07XG59XG5cbi8vIExhYmVscyBhcmUgb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl9MQUJFTGAgKGRpc3BsYXkgbmFtZSBvbmx5KS5cbmV4cG9ydCBjb25zdCBRVU9UQV9USUVSUzogUmVjb3JkPFF1b3RhVGllciwgUXVvdGFUaWVyUHJlc2V0PiA9IHtcbiAgZGV2ZWxvcGVyOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfREVWRUxPUEVSX0xBQkVMJywgJ0RldmVsb3BlcicpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2RldmVsb3BlcicpIH0sXG4gIHBybzogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX1BST19MQUJFTCcsICdQcm8nKSwgbGltaXRzOiB0aWVyTGltaXRzKCdwcm8nKSB9LFxuICB0ZWFtOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVEVBTV9MQUJFTCcsICdUZWFtJyksIGxpbWl0czogdGllckxpbWl0cygndGVhbScpIH0sXG4gIGVudGVycHJpc2U6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9FTlRFUlBSSVNFX0xBQkVMJywgJ0VudGVycHJpc2UnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdlbnRlcnByaXNlJykgfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVU5MSU1JVEVEX0xBQkVMJywgJ1VubGltaXRlZCcpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3VubGltaXRlZCcpIH0sXG59O1xuXG4vKiogQWxsIHZhbGlkIHRpZXIgbmFtZXMgKGluY2wuIGB1bmxpbWl0ZWRgKS4gVXNlZCBmb3IgdmFsaWRhdGlvbiBvZiBhICpzdG9yZWQqXG4gKiAgdGllciDigJQgYHVubGltaXRlZGAgaXMgYSB2YWxpZCB2YWx1ZSBldmVuIHRob3VnaCBpdCdzIG5ldmVyIG9mZmVyZWQgZm9yIHNhbGUuICovXG5leHBvcnQgY29uc3QgVkFMSURfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gT2JqZWN0LmtleXMoUVVPVEFfVElFUlMpIGFzIFF1b3RhVGllcltdO1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogV2hldGhlciB0aGUgYmlsbGluZyBzZXJ2aWNlIGlzIGVuYWJsZWQgaW4gdGhpcyBkZXBsb3ltZW50IChgQklMTElOR19FTkFCTEVEYCxcbiAqICBvcHQtb3V0IGRlZmF1bHQtb24g4oCUIG1pcnJvcnMgdGhlIGJpbGxpbmcvcGxhdGZvcm0gY29uZmlncykuIFdpdGggYmlsbGluZyBPRkZcbiAqICB0aGVyZSdzIG5vIG1ldGVyaW5nL2VuZm9yY2VtZW50IHN1cmZhY2UsIHNvIHRoZSBkZWZhdWx0IHRpZXIgaXMgYHVubGltaXRlZGAuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCaWxsaW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChwcm9jZXNzLmVudi5CSUxMSU5HX0VOQUJMRUQgfHwgJ3RydWUnKS50b0xvd2VyQ2FzZSgpICE9PSAnZmFsc2UnO1xufVxuXG4vKipcbiAqIERlZmF1bHQgdGllciBhc3NpZ25lZCB0byBuZXcgb3JnYW5pemF0aW9ucy5cbiAqIC0gQmlsbGluZyBESVNBQkxFRCDihpIgYHVubGltaXRlZGAgKG5vdGhpbmcgaXMgbWV0ZXJlZCwgc28gZXZlcnl0aGluZyBpcyB1bmNhcHBlZCkuXG4gKiAtIEJpbGxpbmcgRU5BQkxFRCAg4oaSIGBERUZBVUxUX1FVT1RBX1RJRVJgIGlmIGl0J3MgYSB2YWxpZCBzdGFuZGFyZCB0aWVyLCBlbHNlIGBkZXZlbG9wZXJgLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9USUVSOiBRdW90YVRpZXIgPSAhaXNCaWxsaW5nRW5hYmxlZCgpXG4gID8gJ3VubGltaXRlZCdcbiAgOiAoaXNWYWxpZFRpZXIocHJvY2Vzcy5lbnYuREVGQVVMVF9RVU9UQV9USUVSID8/ICcnKSAmJiBwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgIT09ICd1bmxpbWl0ZWQnXG4gICAgPyAocHJvY2Vzcy5lbnYuREVGQVVMVF9RVU9UQV9USUVSIGFzIFF1b3RhVGllcilcbiAgICA6ICdkZXZlbG9wZXInKTtcblxuLyoqIENoZWNrIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCBRdW90YVRpZXIuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRpZXIodmFsdWU6IHN0cmluZyk6IHZhbHVlIGlzIFF1b3RhVGllciB7XG4gIC8vIFVzZSB0aGUgZXhwbGljaXQgdHVwbGUsIG5vdCBgdmFsdWUgaW4gUVVPVEFfVElFUlNgOiBgaW5gIHdhbGtzIHRoZSBwcm90b3R5cGVcbiAgLy8gY2hhaW4sIHNvIGluaGVyaXRlZCBPYmplY3Qga2V5cyAoJ3RvU3RyaW5nJywgJ2NvbnN0cnVjdG9yJywg4oCmKSB3b3VsZCByZXR1cm5cbiAgLy8gdHJ1ZSBhbmQgdGhlbiBgZ2V0VGllckxpbWl0c2Agd291bGQgcmVhZCBgLmxpbWl0c2Agb2ZmIGEgZnVuY3Rpb24g4oaSIGNyYXNoLlxuICAvLyBgdGllcmAgaXMgYXR0YWNrZXItaW5mbHVlbmNlYWJsZSAoSldUIC8gcmVxdWVzdCBib2R5IC8gREVGQVVMVF9RVU9UQV9USUVSIGVudikuXG4gIHJldHVybiAoVkFMSURfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cblxuLyoqIEdldCB0aGUgZGVmYXVsdCBsaW1pdHMgZm9yIGEgZ2l2ZW4gdGllciAoZmFsbHMgYmFjayB0byBkZXZlbG9wZXIpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpZXJMaW1pdHModGllcjogc3RyaW5nKTogUXVvdGFUaWVyTGltaXRzIHtcbiAgcmV0dXJuIGlzVmFsaWRUaWVyKHRpZXIpID8gUVVPVEFfVElFUlNbdGllcl0ubGltaXRzOiBRVU9UQV9USUVSUy5kZXZlbG9wZXIubGltaXRzO1xufVxuIl19
217
+ /**
218
+ * The period (days) every usage counter rolls over on. All quotas are per-period
219
+ * FLOW counters on one shared period: the quota service resets a counter this
220
+ * many days after it expires, and platform seeds a new org's counters with the
221
+ * same window (`QUOTA_RESET_DAYS`, default 3).
222
+ */
223
+ export const QUOTA_RESET_DAYS = envInt('QUOTA_RESET_DAYS', 3, { min: 1 });
224
+ /** The next quota reset: local midnight `days` from `now`. */
225
+ export function nextQuotaResetDate(days = QUOTA_RESET_DAYS, now = new Date()) {
226
+ const date = new Date(now);
227
+ date.setDate(date.getDate() + days);
228
+ date.setHours(0, 0, 0, 0);
229
+ return date;
230
+ }
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQTZEMUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBdUM7SUFDOUQsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxTQUFTLEVBQUUsQ0FBQztRQUNaLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQ3BCLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsUUFBUSxFQUFFLENBQUM7UUFDWCxLQUFLLEVBQUUsQ0FBQztRQUNSLGtCQUFrQixFQUFFLEVBQUU7UUFDdEIsaUJBQWlCLEVBQUUsR0FBRztLQUN2QjtJQUNELCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsT0FBTyxFQUFFLEtBQUs7UUFDZCxZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDckIsVUFBVSxFQUFFLEdBQUc7UUFDZixVQUFVLEVBQUUsR0FBRztRQUNmLGlCQUFpQixFQUFFLEVB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RSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUUxRSw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQUksR0FBVyxnQkFBZ0IsRUFBRSxHQUFHLEdBQVMsSUFBSSxJQUFJLEVBQUU7SUFDeEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZW52Qm9vbCwgZW52SW50LCBlbnZTdHIgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuXG4vKiogQXZhaWxhYmxlIHF1b3RhIHRpZXIgaWRlbnRpZmllcnMuXG4gKlxuICogYHVubGltaXRlZGAgaXMgYSBzcGVjaWFsIHRpZXI6IGV2ZXJ5IHF1b3RhIGlzIGAtMWAgKHVuY2FwcGVkKSBhbmQgaXQgaW5jbHVkZXNcbiAqIGV2ZXJ5IGZlYXR1cmUvYWRkLW9uIGJ1bmRsZS4gSXQgaXMgdGhlIERFRkFVTFQgd2hlbiBiaWxsaW5nIGlzIGRpc2FibGVkIChub1xuICogbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSBleGlzdHMsIHNvIG5vdGhpbmcgaXMgY2FwcGVkKSwgYW5kIGl0IGlzIE5FVkVSXG4gKiBzaG93biBvciBzZWxlY3RhYmxlIHdoZW4gYmlsbGluZyBpcyBlbmFibGVkIOKAlCBzZWUgYFNUQU5EQVJEX1RJRVJTYC4gKi9cbmV4cG9ydCB0eXBlIFF1b3RhVGllciA9ICdkZXZlbG9wZXInIHwgJ3BybycgfCAndGVhbScgfCAnZW50ZXJwcmlzZScgfCAndW5saW1pdGVkJztcblxuLyoqIExpbWl0IHZhbHVlcyBmb3IgZWFjaCBxdW90YSB0eXBlIHdpdGhpbiBhIHRpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhVGllckxpbWl0cyB7XG4gIHBsdWdpbnM6IG51bWJlcjtcbiAgcGlwZWxpbmVzOiBudW1iZXI7XG4gIGFwaUNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKiBDb3VudC1xdW90YXMgb24gdGhlIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZ1xuICAgKiAgRG9TIHZpYSBzcGFtLiAtMSBtZWFucyB1bmxpbWl0ZWQuICovXG4gIGRhc2hib2FyZHM6IG51bWJlcjtcbiAgYWxlcnRSdWxlczogbnVtYmVyO1xuICBhbGVydERlc3RpbmF0aW9uczogbnVtYmVyO1xuICBpZHBDb25maWdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBY3RpdmUsIG5vbi1zdXNwZW5kZWQgcGx1Z2luLWVjb3N5c3RlbSBsaXN0aW5ncyB0aGUgb3JnIHB1Ymxpc2hlc1xuICAgKiAoZG9jcy9wbHVnaW4taW5zdGFsbGluZy5tZCkuIEEgQ09VTlQgcXVvdGEg4oCUIGluc3RhbGxzIG5ldmVyXG4gICAqIGNvdW50LiAtMSA9IHVubGltaXRlZC4gRXh0ZW5kYWJsZSB2aWEgdGhlIGBsaXN0aW5nX3BhY2tgIGFkZC1vbiBidW5kbGUuXG4gICAqL1xuICBsaXN0aW5nczogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IG9yZyBtZW1iZXJzIChhY3RpdmUgdXNlcnMgLyBzZWF0cykuIC0xID0gdW5saW1pdGVkLiBUaGlzIGlzIHRoZSBcIlRlYW1cIlxuICAgKiB0aWVyIGRpZmZlcmVudGlhdG9yIOKAlCBlbmZvcmNlZCBhdCBtZW1iZXItaW52aXRlIHRpbWUgKGFuIGludml0ZSBpcyBibG9ja2VkXG4gICAqIHdoZW4gYWN0aXZlIG1lbWJlcnMgKyBwZW5kaW5nIGludml0ZXMgd291bGQgZXhjZWVkIHRoaXMpLlxuICAgKi9cbiAgc2VhdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDUwIEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMjUsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYWlDYWxsczogMjUsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgbGlzdGluZ3M6IDMsXG4gICAgc2VhdHM6IDEsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDUwLFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMjUwXzAwMCxcbiAgICBhaUNhbGxzOiAxXzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDI1ICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAwLFxuICAgIGFsZXJ0UnVsZXM6IDUwMCxcbiAgICBhbGVydERlc3RpbmF0aW9uczogNTAsXG4gICAgaWRwQ29uZmlnczogNSxcbiAgICBsaXN0aW5nczogMTAsXG4gICAgc2VhdHM6IDEsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBUZWFtID0gY29sbGFib3JhdGlvbiB0aWVyOyB0aGUgc2VhdCBsaW1pdCAoMykgaXMgdGhlIHJlYWwgZGlmZmVyZW50aWF0b3Igb3ZlclxuICAvLyBQcm8gKHNpbmdsZS1zZWF0KSDigJQgaXQncyB0aGUgbXVsdGktc2VhdCBjb2xsYWJvcmF0aW9uIGZsb29yLiBMZWFuIGJhc2UgKCQ3OSk6XG4gIC8vIGdyb3d0aCByaWRlcyB0aGUgc2VhdC9waXBlbGluZS9ldGMgYWRkLW9ucyAobGFuZC1hbmQtZXhwYW5kKS4gTGltaXRzIHNpdFxuICAvLyBiZXR3ZWVuIFBybyBhbmQgRW50ZXJwcmlzZS5cbiAgdGVhbToge1xuICAgIHBsdWdpbnM6IDc1LFxuICAgIHBpcGVsaW5lczogNixcbiAgICBhcGlDYWxsczogNTAwXzAwMCxcbiAgICBhaUNhbGxzOiAyXzUwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDYwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDI1LFxuICAgIHNlYXRzOiAzLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gRW50ZXJwcmlzZSAoJDU5OSwgaGVsZCk6IHRoZSBhbGwtaW5jbHVzaXZlIHRpZXIg4oCUIDE1IHNlYXRzLCAzMCBwaXBlbGluZXMsIEFMTFxuICAvLyBwcmVtaXVtIGZlYXR1cmVzIGluY2x1ZGVkIChzZWUgVElFUl9GRUFUVVJFUykuIEZBSVItVVNFIOKAlCBjb3N0IGRyaXZlcnMgKGFwaUNhbGxzLFxuICAvLyBhaUNhbGxzLCBzdG9yYWdlQnl0ZXMpIGNhcHBlZCBzbyBvbmUgYWNjb3VudCBjYW4ndCBydW4gdXAgdW5ib3VuZGVkXG4gIC8vIGNvbXB1dGUvcHJvdmlkZXIvc3RvcmFnZSBjb3N0IG9uIGEgZmxhdCBwcmljZTsgY2hlYXAgY291bnQtcXVvdGFzIHN0YXkgLTEuXG4gIGVudGVycHJpc2U6IHtcbiAgICBwbHVnaW5zOiAxNTAsXG4gICAgcGlwZWxpbmVzOiAzMCxcbiAgICBhcGlDYWxsczogOTAwXzAwMCxcbiAgICBhaUNhbGxzOiA5XzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDI1MCAqIEdCLFxuICAgIGRhc2hib2FyZHM6IC0xLFxuICAgIGFsZXJ0UnVsZXM6IC0xLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiAtMSxcbiAgICBpZHBDb25maWdzOiAtMSxcbiAgICBsaXN0aW5nczogMTAwLFxuICAgIHNlYXRzOiAxNSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFVubGltaXRlZDogRVZFUlkgcXVvdGEgdW5jYXBwZWQgKC0xKS4gVGhlIGRlZmF1bHQgd2hlbiBiaWxsaW5nIGlzIGRpc2FibGVkXG4gIC8vIChubyBlbmZvcmNlbWVudCBzdXJmYWNlKSDigJQgbmV2ZXIgc2hvd24vc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZC5cbiAgdW5saW1pdGVkOiB7XG4gICAgcGx1Z2luczogLTEsXG4gICAgcGlwZWxpbmVzOiAtMSxcbiAgICBhcGlDYWxsczogLTEsXG4gICAgYWlDYWxsczogLTEsXG4gICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IC0xLFxuICAgIHNlYXRzOiAtMSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IC0xLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAtMSxcbiAgfSxcbn07XG5cbi8qKlxuICogUmVhZCBhIHRpZXIgTElNSVQgZW52IHZhci4gYC0xYCA9IHVubGltaXRlZDsgYW55dGhpbmcgYmVsb3cgdGhhdCBpcyBub25zZW5zZVxuICogKGEgYC01YCBsaW1pdCB3b3VsZCBzaGlwIGEgYnJva2VuIGZpbml0ZSBjYXApLCBzbyBpdCBmYWxscyBiYWNrIHRvIHRoZSBjb2RlXG4gKiBkZWZhdWx0IHJhdGhlciB0aGFuIGNsYW1waW5nIHVwIHRvIGAtMWAuIFRoZSBwYXJzaW5nIGl0c2VsZiBpcyBhcGktY29yZSdzXG4gKiBzaGFyZWQgYGVudkludGAg4oCUIHN0cmljdCBhYm91dCBkZWNpbWFscy9nYXJiYWdlIOKAlCBub3QgYSBsb2NhbCByZS1kZXJpdmF0aW9uLlxuICovXG5mdW5jdGlvbiB0aWVyTGltaXRFbnYobmFtZTogc3RyaW5nLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IGVudkludChuYW1lLCBmYWxsYmFjayk7XG4gIHJldHVybiBuIDwgLTEgPyBmYWxsYmFjayA6IG47XG59XG5cbi8qKlxuICogUGVyLXRpZXIgbGltaXRzLCBlYWNoIG92ZXJyaWRhYmxlIHZpYSBgUVVPVEFfVElFUl88VElFUj5fPExJTUlUPmAgZW52IHZhcnNcbiAqIChlLmcuIGBRVU9UQV9USUVSX1BST19QSVBFTElORVM9MjUwYCwgYFFVT1RBX1RJRVJfREVWRUxPUEVSX1NUT1JBR0VfQllURVM9Li4uYCkuXG4gKiBVbnNldC9lbXB0eSDihpIgdGhlIGNvZGUgZGVmYXVsdC4gYC0xYCA9IHVubGltaXRlZC4gUmVhZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlFxuICogb24gazhzIHRoZXNlIGZsb3cgaW4gdmlhIHRoZSBgYXBwLWVudmAgQ29uZmlnTWFwIChidWlsdCBmcm9tIGAuZW52YCkuXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdHModGllcjogUXVvdGFUaWVyKTogUXVvdGFUaWVyTGltaXRzIHtcbiAgLy8gYHVubGltaXRlZGAgaXMgdW5jYXBwZWQgQlkgREVGSU5JVElPTjogRVZFUlkgcXVvdGEgaXMgLTEgYW5kIGl0IGlzIE5PVFxuICAvLyBlbnYtb3ZlcnJpZGFibGUuIFJlYWRpbmcgUVVPVEFfVElFUl9VTkxJTUlURURfKiBoZXJlIHdvdWxkIGxldCBhIHN0cmF5IGVudlxuICAvLyB2YXIgc2lsZW50bHkgY2FwIHRoZSBiaWxsaW5nLURJU0FCTEVEIGRlZmF1bHQgdGllciDigJQgc3VyZmFjaW5nIGFzIGEgc3B1cmlvdXNcbiAgLy8gXCJxdW90YSBleGNlZWRlZFwiIG9uIGEgZGVwbG95IHRoYXQgbWV0ZXJzIG5vdGhpbmcuIERlcml2ZSAtMSBmb3IgZXZlcnkgZmllbGRcbiAgLy8gZnJvbSB0aGUgbGltaXRzIHNoYXBlIHNvIGEgbmV3bHktYWRkZWQgcXVvdGEgaXMgdW5jYXBwZWQgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICBpZiAodGllciA9PT0gJ3VubGltaXRlZCcpIHtcbiAgICBjb25zdCB1bmNhcHBlZCA9IHsgLi4uREVGQVVMVF9USUVSX0xJTUlUUy51bmxpbWl0ZWQgfTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModW5jYXBwZWQpIGFzIChrZXlvZiBRdW90YVRpZXJMaW1pdHMpW10pIHVuY2FwcGVkW2tdID0gLTE7XG4gICAgcmV0dXJuIHVuY2FwcGVkO1xuICB9XG4gIGNvbnN0IGQgPSBERUZBVUxUX1RJRVJfTElNSVRTW3RpZXJdO1xuICBjb25zdCBUID0gdGllci50b1VwcGVyQ2FzZSgpO1xuICByZXR1cm4ge1xuICAgIHBsdWdpbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1BMVUdJTlNgLCBkLnBsdWdpbnMpLFxuICAgIHBpcGVsaW5lczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fUElQRUxJTkVTYCwgZC5waXBlbGluZXMpLFxuICAgIGFwaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BUElfQ0FMTFNgLCBkLmFwaUNhbGxzKSxcbiAgICBhaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGRhc2hib2FyZHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0RBU0hCT0FSRFNgLCBkLmRhc2hib2FyZHMpLFxuICAgIGFsZXJ0UnVsZXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX1JVTEVTYCwgZC5hbGVydFJ1bGVzKSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQUxFUlRfREVTVElOQVRJT05TYCwgZC5hbGVydERlc3RpbmF0aW9ucyksXG4gICAgaWRwQ29uZmlnczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fSURQX0NPTkZJR1NgLCBkLmlkcENvbmZpZ3MpLFxuICAgIGxpc3RpbmdzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9MSVNUSU5HU2AsIGQubGlzdGluZ3MpLFxuICAgIHNlYXRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TRUFUU2AsIGQuc2VhdHMpLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fRVZFTlRfUkVURU5USU9OX0RBWVNgLCBkLmV2ZW50UmV0ZW50aW9uRGF5cyksXG4gICAgZG9yYVJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0RPUkFfUkVURU5USU9OX0RBWVNgLCBkLmRvcmFSZXRlbnRpb25EYXlzKSxcbiAgfTtcbn1cblxuLy8gTGFiZWxzIGFyZSBvdmVycmlkYWJsZSB2aWEgYFFVT1RBX1RJRVJfPFRJRVI+X0xBQkVMYCAoZGlzcGxheSBuYW1lIG9ubHkpLlxuZXhwb3J0IGNvbnN0IFFVT1RBX1RJRVJTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+ID0ge1xuICBkZXZlbG9wZXI6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9ERVZFTE9QRVJfTEFCRUwnLCAnRGV2ZWxvcGVyJyksIGxpbWl0czogdGllckxpbWl0cygnZGV2ZWxvcGVyJykgfSxcbiAgcHJvOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfUFJPX0xBQkVMJywgJ1BybycpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3BybycpIH0sXG4gIHRlYW06IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9URUFNX0xBQkVMJywgJ1RlYW0nKSwgbGltaXRzOiB0aWVyTGltaXRzKCd0ZWFtJykgfSxcbiAgZW50ZXJwcmlzZTogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX0VOVEVSUFJJU0VfTEFCRUwnLCAnRW50ZXJwcmlzZScpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2VudGVycHJpc2UnKSB9LFxuICB1bmxpbWl0ZWQ6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9VTkxJTUlURURfTEFCRUwnLCAnVW5saW1pdGVkJyksIGxpbWl0czogdGllckxpbWl0cygndW5saW1pdGVkJykgfSxcbn07XG5cbi8qKiBBbGwgdmFsaWQgdGllciBuYW1lcyAoaW5jbC4gYHVubGltaXRlZGApLiBVc2VkIGZvciB2YWxpZGF0aW9uIG9mIGEgKnN0b3JlZCpcbiAqICB0aWVyIOKAlCBgdW5saW1pdGVkYCBpcyBhIHZhbGlkIHZhbHVlIGV2ZW4gdGhvdWdoIGl0J3MgbmV2ZXIgb2ZmZXJlZCBmb3Igc2FsZS4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRF9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBPYmplY3Qua2V5cyhRVU9UQV9USUVSUykgYXMgUXVvdGFUaWVyW107XG5cbi8qKiBUaGUgc3RhbmRhcmQsIGJpbGxpbmctc2VsZWN0YWJsZSB0aWVycyDigJQgdGhlIG9uZXMgb2ZmZXJlZCBhcyBwdXJjaGFzYWJsZSBwbGFuc1xuICogIGFuZCBzaG93biBpbiB0aWVyIHBpY2tlcnMuIERlcml2ZWQgYXMgXCJldmVyeSB2YWxpZCB0aWVyIGV4Y2VwdCBgdW5saW1pdGVkYFwiLFxuICogIHdoaWNoIGlzIHRoZSBiaWxsaW5nLURJU0FCTEVEIGRlZmF1bHQgYW5kIGlzIG5ldmVyIGRpc3BsYXllZC9zZWxlY3RhYmxlIHdoZW5cbiAqICBiaWxsaW5nIGlzIGVuYWJsZWQuIEtlcHQgRFJZIG9mZiBgVkFMSURfVElFUlNgIHNvIGFkZGluZyBhIHRpZXIgZmxvd3MgdGhyb3VnaC4gKi9cbmV4cG9ydCBjb25zdCBTVEFOREFSRF9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBWQUxJRF9USUVSUy5maWx0ZXIoKHQpID0+IHQgIT09ICd1bmxpbWl0ZWQnKTtcblxuLyoqIFRpZXJzIHRoYXQgcGVybWl0IHRoZSBvcmcg4oaSIHRlYW0gaGllcmFyY2h5IChuZXN0aW5nIHRlYW1zIHVuZGVyIGEgcm9vdCkuIFRoZVxuICogIGJpbGxpbmctb2ZmIGB1bmxpbWl0ZWRgIHRpZXIgaXMgdGVhbS1jYXBhYmxlIChpdCdzIHRoZSBtb3N0IHBlcm1pc3NpdmUpOyB0aGVcbiAqICBlbnRyeS1sZXZlbCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBhcmUgbm90LiBTaW5nbGUgc291cmNlIGZvciB0aGUgcGFyZW50LVxuICogIGVsaWdpYmlsaXR5ICsgZG93bmdyYWRlLW92ZXJjYXAgY2hlY2tzIHNvIHRoZXkgY2FuJ3QgZHJpZnQuICovXG5leHBvcnQgY29uc3QgVEVBTV9DQVBBQkxFX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdlbnRlcnByaXNlJywgJ3VubGltaXRlZCddO1xuZXhwb3J0IGZ1bmN0aW9uIHRpZXJBbGxvd3NUZWFtcyh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXRpZXIgJiYgKFRFQU1fQ0FQQUJMRV9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModGllcik7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Closed string vocabularies that cross the wire between the services and the
3
+ * browser. Each is an `as const` array (the runtime list a Zod enum, a Mongoose
4
+ * enum or a drizzle `$type` builds from) plus the union type derived from it.
5
+ *
6
+ * Dependency-free on purpose: the frontend imports these types, so a value added
7
+ * here reaches the UI's exhaustive label maps as a compile error instead of a
8
+ * silently unhandled string. The Postgres CHECK constraints in
9
+ * deploy/shared/postgres-init.sql mirror the ones stored in SQL.
10
+ */
11
+ export declare const RULE_SEVERITIES: readonly ['warning', 'error', 'critical'];
12
+ export type RuleSeverity = (typeof RULE_SEVERITIES)[number];
13
+ export declare const RULE_TARGETS: readonly ['plugin', 'pipeline'];
14
+ export type RuleTarget = (typeof RULE_TARGETS)[number];
15
+ /** Field-evaluation operators; the engine's implementations live in api/compliance. */
16
+ export declare const RULE_OPERATORS: readonly ['eq', 'neq', 'contains', 'notContains', 'regex', 'gt', 'gte', 'lt', 'lte', 'in', 'notIn', 'exists', 'notExists', 'notEmpty', 'countGt', 'countLt', 'lengthGt', 'lengthLt'];
17
+ export type RuleOperator = (typeof RULE_OPERATORS)[number];
18
+ /** Operators that test presence only and take no comparison value. */
19
+ export declare const VALUELESS_RULE_OPERATORS: readonly ["exists", "notExists", "notEmpty"];
20
+ /** How a multi-condition rule combines its conditions. */
21
+ export declare const RULE_CONDITION_MODES: readonly ['all', 'any'];
22
+ export type RuleConditionMode = (typeof RULE_CONDITION_MODES)[number];
23
+ /** `published` rules belong to the system org and apply by subscription. */
24
+ export declare const RULE_SCOPES: readonly ['org', 'published'];
25
+ export type RuleScope = (typeof RULE_SCOPES)[number];
26
+ export declare const MESSAGE_TYPES: readonly ['announcement', 'conversation'];
27
+ export type MessageType = (typeof MESSAGE_TYPES)[number];
28
+ export declare const MESSAGE_PRIORITIES: readonly ['normal', 'high', 'urgent'];
29
+ export type MessagePriority = (typeof MESSAGE_PRIORITIES)[number];
30
+ export declare const SUBSCRIPTION_STATUSES: readonly ['active', 'canceled', 'past_due', 'trialing', 'incomplete'];
31
+ export type SubscriptionStatus = (typeof SUBSCRIPTION_STATUSES)[number];
32
+ export declare const BILLING_INTERVALS: readonly ['monthly', 'annual'];
33
+ export type BillingInterval = (typeof BILLING_INTERVALS)[number];
34
+ /** OIDC providers an org IdP config can name (GitHub is OAuth-only and refused by the OIDC engine). */
35
+ export declare const IDP_PROVIDERS: readonly ['generic-oidc', 'cognito', 'google', 'github'];
36
+ export type IdpProvider = (typeof IDP_PROVIDERS)[number];
37
+ /** The federation protocol an org signs in over — one per org. */
38
+ export declare const IDP_PROTOCOLS: readonly ['oidc', 'saml'];
39
+ export type IdpProtocol = (typeof IDP_PROTOCOLS)[number];
40
+ /**
41
+ * Which SAML assertion attribute carries which identity field. An empty name
42
+ * means "use the common spellings" (short names plus the Entra/Shibboleth URIs).
43
+ */
44
+ export interface SamlAttributeMapping {
45
+ /** Attribute holding the user's email address. */
46
+ email?: string;
47
+ /** Attribute holding the display name. */
48
+ name?: string;
49
+ /** Attribute holding group memberships (drives JIT role mapping). */
50
+ groups?: string;
51
+ }
52
+ /** The coarse grant a permission role gives its members. */
53
+ export declare const ROLE_GRANTS: readonly ['superadmin', 'admin', 'member'];
54
+ export type RoleGrant = (typeof ROLE_GRANTS)[number];
55
+ /** Publisher trust tier. */
56
+ export declare const PUBLISHER_TIERS: readonly ['official', 'verified', 'community', 'unverified'];
57
+ export type PublisherTier = (typeof PUBLISHER_TIERS)[number];
58
+ /** A directory listing's lifecycle state. */
59
+ export declare const LISTING_STATES: readonly ['listed', 'unmaintained', 'suspended', 'transferred'];
60
+ export type ListingState = (typeof LISTING_STATES)[number];
61
+ /** What a publish request asks the system org to do. */
62
+ export declare const PUBLISH_REQUEST_KINDS: readonly ['new_listing', 'new_version', 'listing_update', 'yank', 'unpause', 'transfer', 'claim', 'profile_change', 'advisory', 'verify', 'moderation', 'submission'];
63
+ export type PublishRequestKind = (typeof PUBLISH_REQUEST_KINDS)[number];
64
+ export declare const PUBLISH_REQUEST_STATUSES: readonly ['pending', 'pending_second_approval', 'approved', 'rejected', 'withdrawn'];
65
+ export type PublishRequestStatus = (typeof PUBLISH_REQUEST_STATUSES)[number];
66
+ /** The statuses a request is still "open" in (drives the one-open-request index). */
67
+ export declare const OPEN_PUBLISH_REQUEST_STATUSES: readonly ["pending", "pending_second_approval"];
68
+ /** `security` requests jump the moderation queue. */
69
+ export declare const PUBLISH_REQUEST_LANES: readonly ['standard', 'security'];
70
+ export type PublishRequestLane = (typeof PUBLISH_REQUEST_LANES)[number];
71
+ /** Install version policy: exact, `~`, `^`, or anything non-breaking. */
72
+ export declare const INSTALL_VERSION_POLICIES: readonly ['pinned', 'patch', 'minor', 'latest'];
73
+ export type InstallVersionPolicy = (typeof INSTALL_VERSION_POLICIES)[number];
74
+ export declare const INSTALL_STATUSES: readonly ['active', 'pending_approval', 'denied'];
75
+ export type InstallStatus = (typeof INSTALL_STATUSES)[number];
76
+ /** The advisory severity at which a consumption policy blocks installs. */
77
+ export declare const BLOCK_ON_ADVISORY_LEVELS: readonly ['critical', 'high', 'never'];
78
+ export type BlockOnAdvisory = (typeof BLOCK_ON_ADVISORY_LEVELS)[number];
79
+ /** Whether official plugins need an explicit install before a pipeline can use them. */
80
+ export declare const OFFICIAL_INSTALLS_MODES: readonly ['implicit', 'explicit'];
81
+ export type OfficialInstalls = (typeof OFFICIAL_INSTALLS_MODES)[number];
82
+ export declare const REVIEW_STATUSES: readonly ['published', 'held', 'removed'];
83
+ export type ReviewStatus = (typeof REVIEW_STATUSES)[number];
84
+ /** Why a held review is held. */
85
+ export declare const REVIEW_HOLD_REASONS: readonly ['reports', 'burst', 'filter', 'security', 'moderator'];
86
+ export type ReviewHoldReason = (typeof REVIEW_HOLD_REASONS)[number];
87
+ /** A review report's category; `security` routes privately to the advisory path. */
88
+ export declare const REVIEW_REPORT_CATEGORIES: readonly ['spam', 'abuse', 'off_topic', 'security'];
89
+ export type ReviewReportCategory = (typeof REVIEW_REPORT_CATEGORIES)[number];
90
+ export declare const ADVISORY_SEVERITIES: readonly ['critical', 'high', 'medium', 'low'];
91
+ export type AdvisorySeverity = (typeof ADVISORY_SEVERITIES)[number];
92
+ export declare const ADVISORY_STATES: readonly ['draft', 'published', 'withdrawn'];
93
+ export type AdvisoryState = (typeof ADVISORY_STATES)[number];
94
+ export declare const ADVISORY_SOURCES: readonly ['publisher', 'moderator', 'cve_rescan', 'review'];
95
+ export type AdvisorySource = (typeof ADVISORY_SOURCES)[number];
96
+ /**
97
+ * An anonymous submission's lifecycle. `publishing` is the short claim an
98
+ * approval takes before it copies the quarantined image out, so an expiry can
99
+ * never delete the artifacts of a submission that is being published.
100
+ */
101
+ export declare const SUBMISSION_STATUSES: readonly ['pending_verification', 'pending_review', 'publishing', 'gate_failed', 'approved', 'rejected', 'expired', 'claimed'];
102
+ export type SubmissionStatus = (typeof SUBMISSION_STATUSES)[number];