@pipeline-builder/pipeline-data 4.1.24 → 4.1.26

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 (64) hide show
  1. package/lib/api/alert-destinations.d.ts +17 -0
  2. package/lib/api/alert-destinations.js +36 -0
  3. package/lib/api/reporting/analytics-queries.d.ts +274 -0
  4. package/lib/api/reporting/analytics-queries.js +598 -0
  5. package/lib/api/reporting/daily-rollup.d.ts +41 -0
  6. package/lib/api/reporting/daily-rollup.js +173 -0
  7. package/lib/api/reporting/deploy-rollup.d.ts +78 -0
  8. package/lib/api/reporting/deploy-rollup.js +203 -0
  9. package/lib/api/reporting/dora-scoring.d.ts +14 -0
  10. package/lib/api/reporting/dora-scoring.js +25 -1
  11. package/lib/api/reporting/dora.js +30 -6
  12. package/lib/api/reporting/failure-classifier.d.ts +54 -0
  13. package/lib/api/reporting/failure-classifier.js +179 -0
  14. package/lib/api/reporting/ingest.d.ts +2 -2
  15. package/lib/api/reporting/ingest.js +129 -4
  16. package/lib/api/reporting/last-deploy.d.ts +31 -0
  17. package/lib/api/reporting/last-deploy.js +93 -0
  18. package/lib/api/reporting/needs-attention.d.ts +93 -0
  19. package/lib/api/reporting/needs-attention.js +152 -0
  20. package/lib/api/reporting/plugin-exposure.d.ts +129 -0
  21. package/lib/api/reporting/plugin-exposure.js +312 -0
  22. package/lib/api/reporting/retention-sweep.js +9 -1
  23. package/lib/api/reporting/sql-helpers.d.ts +35 -2
  24. package/lib/api/reporting/sql-helpers.js +39 -1
  25. package/lib/api/reporting/stakeholder/compose.d.ts +115 -0
  26. package/lib/api/reporting/stakeholder/compose.js +234 -0
  27. package/lib/api/reporting/stakeholder/index.d.ts +14 -0
  28. package/lib/api/reporting/stakeholder/index.js +17 -0
  29. package/lib/api/reporting/stakeholder/period.d.ts +102 -0
  30. package/lib/api/reporting/stakeholder/period.js +273 -0
  31. package/lib/api/reporting/stakeholder/report-html.d.ts +93 -0
  32. package/lib/api/reporting/stakeholder/report-html.js +208 -0
  33. package/lib/api/reporting/stakeholder/sections.d.ts +117 -0
  34. package/lib/api/reporting/stakeholder/sections.js +249 -0
  35. package/lib/api/reporting/stakeholder/store.d.ts +450 -0
  36. package/lib/api/reporting/stakeholder/store.js +981 -0
  37. package/lib/api/reporting/stakeholder/templates.d.ts +21 -0
  38. package/lib/api/reporting/stakeholder/templates.js +104 -0
  39. package/lib/api/reporting/types.d.ts +73 -0
  40. package/lib/api/reporting/types.js +1 -1
  41. package/lib/api/reporting-service.d.ts +94 -5
  42. package/lib/api/reporting-service.js +169 -10
  43. package/lib/api/soft-delete-sweep.d.ts +11 -2
  44. package/lib/api/soft-delete-sweep.js +17 -6
  45. package/lib/database/drizzle-schema.d.ts +2244 -385
  46. package/lib/database/drizzle-schema.js +18 -7
  47. package/lib/database/index.d.ts +1 -1
  48. package/lib/database/index.js +4 -2
  49. package/lib/database/schema/compliance.d.ts +0 -682
  50. package/lib/database/schema/compliance.js +6 -66
  51. package/lib/database/schema/ecosystem.d.ts +20 -157
  52. package/lib/database/schema/ecosystem.js +23 -16
  53. package/lib/database/schema/pipeline.d.ts +200 -0
  54. package/lib/database/schema/pipeline.js +100 -1
  55. package/lib/database/schema/plugin.d.ts +20 -1
  56. package/lib/database/schema/plugin.js +13 -1
  57. package/lib/database/schema/reporting-analytics.d.ts +1212 -0
  58. package/lib/database/schema/reporting-analytics.js +250 -0
  59. package/lib/database/schema/reporting-stakeholder.d.ts +1373 -0
  60. package/lib/database/schema/reporting-stakeholder.js +251 -0
  61. package/lib/index.d.ts +10 -1
  62. package/lib/index.js +15 -1
  63. package/lib/testing/exports.json +67 -4
  64. package/package.json +4 -3
@@ -0,0 +1,251 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Stakeholder reports — scheduled, manager-facing summaries a lead developer
5
+ * composes, reviews and publishes.
6
+ *
7
+ * Four tables, and the reason each exists:
8
+ *
9
+ * - `report_definitions` — the saved "what and when". Reporting was entirely
10
+ * on-demand before this: the dashboard picked a from/to and nothing could be
11
+ * saved, scheduled or kept.
12
+ * - `report_runs` — the FROZEN snapshot of one period's output. This is the load
13
+ * bearing table. The retention sweep purges raw `pipeline_events` by tier, so
14
+ * without a snapshot last quarter's report cannot be regenerated once its
15
+ * events are gone — and a manager who read a number on Monday must see the same
16
+ * number on Friday.
17
+ * - `report_share_links` — expiring, revocable read-only links, because the
18
+ * managers a report is for usually have no platform account.
19
+ * - `report_recipients` — per-org delivery addresses, with verification and
20
+ * bounce state. Recipient emails are PII and the org owns the list, not the
21
+ * definition, so one lead's list is reusable and one unsubscribe is honoured
22
+ * everywhere.
23
+ *
24
+ * Every table is org-scoped with RLS + soft-delete, mirroring postgres-init.sql
25
+ * (which is what actually deploys; `schema-reflection.test.ts` keeps the two in
26
+ * lock-step, name for name).
27
+ */
28
+ import { sql } from 'drizzle-orm';
29
+ import { boolean, index, integer, jsonb, pgTable, text, timestamp, uniqueIndex, varchar } from 'drizzle-orm/pg-core';
30
+ /** How often a definition produces a report. */
31
+ export const REPORT_CADENCES = ['weekly', 'monthly', 'quarterly'];
32
+ /** The manager-facing templates. Each is a fixed list of section ids. */
33
+ export const REPORT_TEMPLATES = ['weekly_delivery', 'monthly_health', 'quarterly_review'];
34
+ /**
35
+ * A run's lifecycle. `drafting` → `ready_for_review` → `published`, with `failed`
36
+ * as a terminal side branch. Nothing reaches a manager before `published`, which
37
+ * is what makes the lead's approval the gate.
38
+ */
39
+ export const REPORT_RUN_STATUSES = ['drafting', 'ready_for_review', 'published', 'failed'];
40
+ /**
41
+ * Why a definition stopped running. Recorded rather than inferred, because the
42
+ * three causes need different fixes and the lead sees this string: the add-on
43
+ * lapsed, the owner was deactivated, or the owner lost the permission that let
44
+ * them author it.
45
+ */
46
+ export const REPORT_PAUSE_REASONS = ['entitlement', 'owner_inactive', 'permission_lost'];
47
+ /** What a definition reports on. */
48
+ export const REPORT_SCOPE_KINDS = ['org', 'projects', 'rollup'];
49
+ /**
50
+ * A saved report: what to compute, how often, in whose timezone, and who receives
51
+ * it.
52
+ *
53
+ * @table report_definitions
54
+ */
55
+ export const reportDefinition = pgTable('report_definitions', {
56
+ id: varchar('id', { length: 255 }).primaryKey(),
57
+ orgId: varchar('org_id', { length: 255 }).notNull(),
58
+ /**
59
+ * The lead who owns this definition. Runs re-check THIS user's permissions, not
60
+ * the caller's, because a scheduled run has no caller — so a lead who loses
61
+ * access stops producing reports rather than keeping a standing grant.
62
+ */
63
+ ownerId: text('owner_id').notNull(),
64
+ name: varchar('name', { length: 200 }).notNull(),
65
+ template: varchar('template', { length: 40 }).$type().notNull(),
66
+ /** Section ids, resolved through the section registry at run time. */
67
+ sections: jsonb('sections').$type().default([]).notNull(),
68
+ cadence: varchar('cadence', { length: 20 }).$type().notNull(),
69
+ /** IANA name. Periods are cut in THIS zone, not the database session's. */
70
+ timezone: varchar('timezone', { length: 64 }).default('UTC').notNull(),
71
+ weekStart: varchar('week_start', { length: 10 }).default('monday').notNull(),
72
+ scope: jsonb('scope').$type().notNull(),
73
+ /** Recipient ids from `report_recipients`, not raw addresses. */
74
+ recipients: jsonb('recipients').$type().default([]).notNull(),
75
+ /**
76
+ * Publish without the lead reviewing. Off by default: the whole point of the
77
+ * review step is that the data cannot supply the context a manager needs
78
+ * ("we paused deploys Tuesday for the migration").
79
+ */
80
+ autoSend: boolean('auto_send').default(false).notNull(),
81
+ isActive: boolean('is_active').default(true).notNull(),
82
+ pausedReason: varchar('paused_reason', { length: 30 }).$type(),
83
+ nextRunAt: timestamp('next_run_at', { withTimezone: true }),
84
+ lastRunAt: timestamp('last_run_at', { withTimezone: true }),
85
+ createdBy: text('created_by').notNull(),
86
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
87
+ updatedBy: text('updated_by'),
88
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
89
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
90
+ deletedBy: text('deleted_by'),
91
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
92
+ }, (table) => ({
93
+ orgIdx: index('report_definition_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
94
+ ownerIdx: index('report_definition_owner_idx').on(table.ownerId).where(sql `deleted_at IS NULL`),
95
+ // Drives the scheduler's claim scan: the due, live, unpaused definitions only.
96
+ dueIdx: index('report_definition_due_idx').on(table.nextRunAt)
97
+ .where(sql `deleted_at IS NULL AND is_active = true`),
98
+ purgeIdx: index('report_definition_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
99
+ }));
100
+ /**
101
+ * One period's frozen output.
102
+ *
103
+ * @table report_runs
104
+ */
105
+ export const reportRun = pgTable('report_runs', {
106
+ id: varchar('id', { length: 255 }).primaryKey(),
107
+ orgId: varchar('org_id', { length: 255 }).notNull(),
108
+ definitionId: varchar('definition_id', { length: 255 }).notNull(),
109
+ /** Inclusive period start, exclusive end — both instants, in UTC. */
110
+ periodStart: timestamp('period_start', { withTimezone: true }).notNull(),
111
+ periodEnd: timestamp('period_end', { withTimezone: true }).notNull(),
112
+ /** Human label in the definition's timezone: `2026-W38`, `2026-08`, `2026-Q3`. */
113
+ periodLabel: varchar('period_label', { length: 20 }).notNull(),
114
+ /**
115
+ * Regenerating a period produces version N+1 and supersedes the old row rather
116
+ * than overwriting it. Late events (the ingest redrives its dead-letter queue
117
+ * hours later) mean a corrected report is normal — and a manager who already
118
+ * read v1 must still be able to see exactly what they read.
119
+ */
120
+ version: integer('version').default(1).notNull(),
121
+ status: varchar('status', { length: 20 }).$type().default('drafting').notNull(),
122
+ /** The computed sections. Survives the raw-event purge — that is the point. */
123
+ snapshot: jsonb('snapshot').$type(),
124
+ /** AI-generated executive summary, from the snapshot's numbers only. */
125
+ aiDraft: text('ai_draft'),
126
+ /** The lead's own words. The context the data cannot supply. */
127
+ leadNotes: text('lead_notes'),
128
+ // `asks` was DELETED here, and it is the removal most worth explaining, because the idea
129
+ // was good: what the lead needs a decision on, from whom, by when — kept apart from
130
+ // `leadNotes` because a request for a decision buried in narrative reads as commentary
131
+ // and gets no answer. It was declared in Phase 2 and then never written or read by
132
+ // anything: no route accepted one, no composer emitted one, no view rendered one, and
133
+ // the shared report a manager actually reads never showed them. A column that only ever
134
+ // held its own default is not a feature in progress, it is a claim the schema makes and
135
+ // the product does not honour. Whoever builds asks should add the column back WITH the
136
+ // write path, the review UI and a place in the shared view, in one change.
137
+ failureReason: text('failure_reason'),
138
+ /**
139
+ * What happened when this run was DELIVERED: counts per channel, and the notes a lead
140
+ * needs to read ("no outbound email is configured, so 12 recipients were not mailed").
141
+ *
142
+ * On the run rather than in a log, because the question it answers is asked days later
143
+ * and about one specific report: "did the board actually get last month's?" A log line
144
+ * cannot be shown next to the report, and `leadNotes` cannot hold it — that column is
145
+ * frozen at publish, which is exactly when delivery happens.
146
+ */
147
+ delivery: jsonb('delivery').$type(),
148
+ publishedBy: text('published_by'),
149
+ publishedAt: timestamp('published_at', { withTimezone: true }),
150
+ supersededBy: varchar('superseded_by', { length: 255 }),
151
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
152
+ updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),
153
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
154
+ deletedBy: text('deleted_by'),
155
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
156
+ }, (table) => ({
157
+ // The idempotency key. A retry, a catch-up pass and a manual backfill can all
158
+ // ask for the same period; without this they would each insert a row.
159
+ periodUnique: uniqueIndex('report_run_period_unique')
160
+ .on(table.definitionId, table.periodStart, table.version),
161
+ definitionIdx: index('report_run_definition_idx').on(table.definitionId, table.periodStart)
162
+ .where(sql `deleted_at IS NULL`),
163
+ orgIdx: index('report_run_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
164
+ purgeIdx: index('report_run_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
165
+ }));
166
+ /**
167
+ * A read-only, expiring link to one published run.
168
+ *
169
+ * @table report_share_links
170
+ */
171
+ export const reportShareLink = pgTable('report_share_links', {
172
+ id: varchar('id', { length: 255 }).primaryKey(),
173
+ orgId: varchar('org_id', { length: 255 }).notNull(),
174
+ runId: varchar('run_id', { length: 255 }).notNull(),
175
+ /**
176
+ * SHA-256 of the token, never the token. The raw value is shown once, at
177
+ * creation — a stored token is a stored credential for org data that anyone
178
+ * holding the link can read.
179
+ */
180
+ tokenHash: varchar('token_hash', { length: 64 }).notNull(),
181
+ expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
182
+ revokedAt: timestamp('revoked_at', { withTimezone: true }),
183
+ revokedBy: text('revoked_by'),
184
+ /** Redact pipeline/project names in the public view — internal names leak intent. */
185
+ redactNames: boolean('redact_names').default(false).notNull(),
186
+ viewCount: integer('view_count').default(0).notNull(),
187
+ lastViewedAt: timestamp('last_viewed_at', { withTimezone: true }),
188
+ createdBy: text('created_by').notNull(),
189
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
190
+ }, (table) => ({
191
+ // The public route's only lookup: by token hash. Unique so a hash collision
192
+ // cannot resolve to two runs.
193
+ tokenUnique: uniqueIndex('report_share_link_token_unique').on(table.tokenHash),
194
+ runIdx: index('report_share_link_run_idx').on(table.runId),
195
+ orgIdx: index('report_share_link_org_idx').on(table.orgId),
196
+ }));
197
+ /**
198
+ * A verified delivery address for one org.
199
+ *
200
+ * @table report_recipients
201
+ */
202
+ export const reportRecipient = pgTable('report_recipients', {
203
+ id: varchar('id', { length: 255 }).primaryKey(),
204
+ orgId: varchar('org_id', { length: 255 }).notNull(),
205
+ email: varchar('email', { length: 320 }).notNull(),
206
+ displayName: varchar('display_name', { length: 200 }),
207
+ /**
208
+ * Set when the recipient confirms by email. Nothing is delivered before this:
209
+ * otherwise a lead could send org data to any address by typing it.
210
+ */
211
+ verifiedAt: timestamp('verified_at', { withTimezone: true }),
212
+ verificationTokenHash: varchar('verification_token_hash', { length: 64 }),
213
+ /** Honoured across every definition — an unsubscribe is per person, not per report. */
214
+ unsubscribedAt: timestamp('unsubscribed_at', { withTimezone: true }),
215
+ /**
216
+ * The recipient's stable unsubscribe nonce, minted once with the row.
217
+ *
218
+ * STORED IN THE CLEAR, unlike every other token in this file, and the difference is
219
+ * what it authorizes. A share-link token grants READ ACCESS to an org's report, so it
220
+ * is only ever kept as a hash; this one authorizes exactly one self-limiting action —
221
+ * "stop emailing this address" — so the worst a database read buys an attacker is the
222
+ * ability to make the product send less mail.
223
+ *
224
+ * It has to be readable because every report email rebuilds the link, and a hash
225
+ * cannot be turned back into the URL. The alternative, a signed URL, would be
226
+ * invalidated by the default EPHEMERAL service key on every restart, silently breaking
227
+ * the unsubscribe link in every report already sitting in a manager's mailbox — which
228
+ * is the one failure here that has a regulator attached to it.
229
+ */
230
+ unsubscribeToken: varchar('unsubscribe_token', { length: 64 }),
231
+ bounceCount: integer('bounce_count').default(0).notNull(),
232
+ lastBounceAt: timestamp('last_bounce_at', { withTimezone: true }),
233
+ /** Set when an admin approved an address outside the allowed domains. */
234
+ approvedBy: text('approved_by'),
235
+ createdBy: text('created_by').notNull(),
236
+ createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
237
+ deletedAt: timestamp('deleted_at', { withTimezone: true }),
238
+ deletedBy: text('deleted_by'),
239
+ purgeAfter: timestamp('purge_after', { withTimezone: true }),
240
+ }, (table) => ({
241
+ // One row per address per org, so re-adding a recipient reuses its verification
242
+ // and unsubscribe state rather than resetting them.
243
+ orgEmailUnique: uniqueIndex('report_recipient_org_email_unique').on(table.orgId, table.email),
244
+ orgIdx: index('report_recipient_org_idx').on(table.orgId).where(sql `deleted_at IS NULL`),
245
+ purgeIdx: index('report_recipient_purge_idx').on(table.purgeAfter).where(sql `deleted_at IS NOT NULL`),
246
+ // The unsubscribe link's only lookup. Unique so one token can never resolve to two
247
+ // addresses.
248
+ unsubTokenUnique: uniqueIndex('report_recipient_unsub_token_unique').on(table.unsubscribeToken)
249
+ .where(sql `unsubscribe_token IS NOT NULL`),
250
+ }));
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLXN0YWtlaG9sZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL3NjaGVtYS9yZXBvcnRpbmctc3Rha2Vob2xkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBRUgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVySCxnREFBZ0Q7QUFDaEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQVUsQ0FBQztBQUczRSx5RUFBeUU7QUFDekUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBVSxDQUFDO0FBR25HOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFHcEc7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBVSxDQUFDO0FBR2xHLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFVekU7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLEVBQUU7SUFD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LEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUM3RixNQUFNLEVBQUUsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFBLG9CQUFvQixDQUFDO0lBQ3hGLFFBQVEsRUFBRSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUEsd0JBQXdCLENBQUM7SUFDckcsbUZBQW1GO0lBQ25GLGFBQWE7SUFDYixnQkFBZ0IsRUFBRSxXQUFXLENBQUMscUNBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1NBQzVGLEtBQUssQ0FBQyxHQUFHLENBQUEsK0JBQStCLENBQUM7Q0FDN0MsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTdGFrZWhvbGRlciByZXBvcnRzIOKAlCBzY2hlZHVsZWQsIG1hbmFnZXItZmFjaW5nIHN1bW1hcmllcyBhIGxlYWQgZGV2ZWxvcGVyXG4gKiBjb21wb3NlcywgcmV2aWV3cyBhbmQgcHVibGlzaGVzLlxuICpcbiAqIEZvdXIgdGFibGVzLCBhbmQgdGhlIHJlYXNvbiBlYWNoIGV4aXN0czpcbiAqXG4gKiAgLSBgcmVwb3J0X2RlZmluaXRpb25zYCDigJQgdGhlIHNhdmVkIFwid2hhdCBhbmQgd2hlblwiLiBSZXBvcnRpbmcgd2FzIGVudGlyZWx5XG4gKiAgICBvbi1kZW1hbmQgYmVmb3JlIHRoaXM6IHRoZSBkYXNoYm9hcmQgcGlja2VkIGEgZnJvbS90byBhbmQgbm90aGluZyBjb3VsZCBiZVxuICogICAgc2F2ZWQsIHNjaGVkdWxlZCBvciBrZXB0LlxuICogIC0gYHJlcG9ydF9ydW5zYCDigJQgdGhlIEZST1pFTiBzbmFwc2hvdCBvZiBvbmUgcGVyaW9kJ3Mgb3V0cHV0LiBUaGlzIGlzIHRoZSBsb2FkXG4gKiAgICBiZWFyaW5nIHRhYmxlLiBUaGUgcmV0ZW50aW9uIHN3ZWVwIHB1cmdlcyByYXcgYHBpcGVsaW5lX2V2ZW50c2AgYnkgdGllciwgc29cbiAqICAgIHdpdGhvdXQgYSBzbmFwc2hvdCBsYXN0IHF1YXJ0ZXIncyByZXBvcnQgY2Fubm90IGJlIHJlZ2VuZXJhdGVkIG9uY2UgaXRzXG4gKiAgICBldmVudHMgYXJlIGdvbmUg4oCUIGFuZCBhIG1hbmFnZXIgd2hvIHJlYWQgYSBudW1iZXIgb24gTW9uZGF5IG11c3Qgc2VlIHRoZSBzYW1lXG4gKiAgICBudW1iZXIgb24gRnJpZGF5LlxuICogIC0gYHJlcG9ydF9zaGFyZV9saW5rc2Ag4oCUIGV4cGlyaW5nLCByZXZvY2FibGUgcmVhZC1vbmx5IGxpbmtzLCBiZWNhdXNlIHRoZVxuICogICAgbWFuYWdlcnMgYSByZXBvcnQgaXMgZm9yIHVzdWFsbHkgaGF2ZSBubyBwbGF0Zm9ybSBhY2NvdW50LlxuICogIC0gYHJlcG9ydF9yZWNpcGllbnRzYCDigJQgcGVyLW9yZyBkZWxpdmVyeSBhZGRyZXNzZXMsIHdpdGggdmVyaWZpY2F0aW9uIGFuZFxuICogICAgYm91bmNlIHN0YXRlLiBSZWNpcGllbnQgZW1haWxzIGFyZSBQSUkgYW5kIHRoZSBvcmcgb3ducyB0aGUgbGlzdCwgbm90IHRoZVxuICogICAgZGVmaW5pdGlvbiwgc28gb25lIGxlYWQncyBsaXN0IGlzIHJldXNhYmxlIGFuZCBvbmUgdW5zdWJzY3JpYmUgaXMgaG9ub3VyZWRcbiAqICAgIGV2ZXJ5d2hlcmUuXG4gKlxuICogRXZlcnkgdGFibGUgaXMgb3JnLXNjb3BlZCB3aXRoIFJMUyArIHNvZnQtZGVsZXRlLCBtaXJyb3JpbmcgcG9zdGdyZXMtaW5pdC5zcWxcbiAqICh3aGljaCBpcyB3aGF0IGFjdHVhbGx5IGRlcGxveXM7IGBzY2hlbWEtcmVmbGVjdGlvbi50ZXN0LnRzYCBrZWVwcyB0aGUgdHdvIGluXG4gKiBsb2NrLXN0ZXAsIG5hbWUgZm9yIG5hbWUpLlxuICovXG5cbmltcG9ydCB7IHNxbCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IGJvb2xlYW4sIGluZGV4LCBpbnRlZ2VyLCBqc29uYiwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1bmlxdWVJbmRleCwgdmFyY2hhciB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vKiogSG93IG9mdGVuIGEgZGVmaW5pdGlvbiBwcm9kdWNlcyBhIHJlcG9ydC4gKi9cbmV4cG9ydCBjb25zdCBSRVBPUlRfQ0FERU5DRVMgPSBbJ3dlZWtseScsICdtb250aGx5JywgJ3F1YXJ0ZXJseSddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0Q2FkZW5jZSA9ICh0eXBlb2YgUkVQT1JUX0NBREVOQ0VTKVtudW1iZXJdO1xuXG4vKiogVGhlIG1hbmFnZXItZmFjaW5nIHRlbXBsYXRlcy4gRWFjaCBpcyBhIGZpeGVkIGxpc3Qgb2Ygc2VjdGlvbiBpZHMuICovXG5leHBvcnQgY29uc3QgUkVQT1JUX1RFTVBMQVRFUyA9IFsnd2Vla2x5X2RlbGl2ZXJ5JywgJ21vbnRobHlfaGVhbHRoJywgJ3F1YXJ0ZXJseV9yZXZpZXcnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFJlcG9ydFRlbXBsYXRlID0gKHR5cGVvZiBSRVBPUlRfVEVNUExBVEVTKVtudW1iZXJdO1xuXG4vKipcbiAqIEEgcnVuJ3MgbGlmZWN5Y2xlLiBgZHJhZnRpbmdgIOKGkiBgcmVhZHlfZm9yX3Jldmlld2Ag4oaSIGBwdWJsaXNoZWRgLCB3aXRoIGBmYWlsZWRgXG4gKiBhcyBhIHRlcm1pbmFsIHNpZGUgYnJhbmNoLiBOb3RoaW5nIHJlYWNoZXMgYSBtYW5hZ2VyIGJlZm9yZSBgcHVibGlzaGVkYCwgd2hpY2hcbiAqIGlzIHdoYXQgbWFrZXMgdGhlIGxlYWQncyBhcHByb3ZhbCB0aGUgZ2F0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9SVU5fU1RBVFVTRVMgPSBbJ2RyYWZ0aW5nJywgJ3JlYWR5X2Zvcl9yZXZpZXcnLCAncHVibGlzaGVkJywgJ2ZhaWxlZCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UnVuU3RhdHVzID0gKHR5cGVvZiBSRVBPUlRfUlVOX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKipcbiAqIFdoeSBhIGRlZmluaXRpb24gc3RvcHBlZCBydW5uaW5nLiBSZWNvcmRlZCByYXRoZXIgdGhhbiBpbmZlcnJlZCwgYmVjYXVzZSB0aGVcbiAqIHRocmVlIGNhdXNlcyBuZWVkIGRpZmZlcmVudCBmaXhlcyBhbmQgdGhlIGxlYWQgc2VlcyB0aGlzIHN0cmluZzogdGhlIGFkZC1vblxuICogbGFwc2VkLCB0aGUgb3duZXIgd2FzIGRlYWN0aXZhdGVkLCBvciB0aGUgb3duZXIgbG9zdCB0aGUgcGVybWlzc2lvbiB0aGF0IGxldFxuICogdGhlbSBhdXRob3IgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSRVBPUlRfUEFVU0VfUkVBU09OUyA9IFsnZW50aXRsZW1lbnQnLCAnb3duZXJfaW5hY3RpdmUnLCAncGVybWlzc2lvbl9sb3N0J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBSZXBvcnRQYXVzZVJlYXNvbiA9ICh0eXBlb2YgUkVQT1JUX1BBVVNFX1JFQVNPTlMpW251bWJlcl07XG5cbi8qKiBXaGF0IGEgZGVmaW5pdGlvbiByZXBvcnRzIG9uLiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9TQ09QRV9LSU5EUyA9IFsnb3JnJywgJ3Byb2plY3RzJywgJ3JvbGx1cCddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0U2NvcGVLaW5kID0gKHR5cGVvZiBSRVBPUlRfU0NPUEVfS0lORFMpW251bWJlcl07XG5cbi8qKiBUaGUgYHNjb3BlYCBKU09OOiB3aGljaCBwaXBlbGluZXMgYSBydW4gY292ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTY29wZSB7XG4gIGtpbmQ6IFJlcG9ydFNjb3BlS2luZDtcbiAgLyoqIFByb2plY3QgbmFtZXMsIHdoZW4gYGtpbmQgPT09ICdwcm9qZWN0cydgLiBFbXB0eSBmb3Igb3JnL3JvbGx1cC4gKi9cbiAgcHJvamVjdHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHNhdmVkIHJlcG9ydDogd2hhdCB0byBjb21wdXRlLCBob3cgb2Z0ZW4sIGluIHdob3NlIHRpbWV6b25lLCBhbmQgd2hvIHJlY2VpdmVzXG4gKiBpdC5cbiAqXG4gKiBAdGFibGUgcmVwb3J0X2RlZmluaXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnREZWZpbml0aW9uID0gcGdUYWJsZSgncmVwb3J0X2RlZmluaXRpb25zJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICAvKipcbiAgICogVGhlIGxlYWQgd2hvIG93bnMgdGhpcyBkZWZpbml0aW9uLiBSdW5zIHJlLWNoZWNrIFRISVMgdXNlcidzIHBlcm1pc3Npb25zLCBub3RcbiAgICogdGhlIGNhbGxlcidzLCBiZWNhdXNlIGEgc2NoZWR1bGVkIHJ1biBoYXMgbm8gY2FsbGVyIOKAlCBzbyBhIGxlYWQgd2hvIGxvc2VzXG4gICAqIGFjY2VzcyBzdG9wcyBwcm9kdWNpbmcgcmVwb3J0cyByYXRoZXIgdGhhbiBrZWVwaW5nIGEgc3RhbmRpbmcgZ3JhbnQuXG4gICAqL1xuICBvd25lcklkOiB0ZXh0KCdvd25lcl9pZCcpLm5vdE51bGwoKSxcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyMDAgfSkubm90TnVsbCgpLFxuICB0ZW1wbGF0ZTogdmFyY2hhcigndGVtcGxhdGUnLCB7IGxlbmd0aDogNDAgfSkuJHR5cGU8UmVwb3J0VGVtcGxhdGU+KCkubm90TnVsbCgpLFxuICAvKiogU2VjdGlvbiBpZHMsIHJlc29sdmVkIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVnaXN0cnkgYXQgcnVuIHRpbWUuICovXG4gIHNlY3Rpb25zOiBqc29uYignc2VjdGlvbnMnKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksXG4gIGNhZGVuY2U6IHZhcmNoYXIoJ2NhZGVuY2UnLCB7IGxlbmd0aDogMjAgfSkuJHR5cGU8UmVwb3J0Q2FkZW5jZT4oKS5ub3ROdWxsKCksXG4gIC8qKiBJQU5BIG5hbWUuIFBlcmlvZHMgYXJlIGN1dCBpbiBUSElTIHpvbmUsIG5vdCB0aGUgZGF0YWJhc2Ugc2Vzc2lvbidzLiAqL1xuICB0aW1lem9uZTogdmFyY2hhcigndGltZXpvbmUnLCB7IGxlbmd0aDogNjQgfSkuZGVmYXVsdCgnVVRDJykubm90TnVsbCgpLFxuICB3ZWVrU3RhcnQ6IHZhcmNoYXIoJ3dlZWtfc3RhcnQnLCB7IGxlbmd0aDogMTAgfSkuZGVmYXVsdCgnbW9uZGF5Jykubm90TnVsbCgpLFxuICBzY29wZToganNvbmIoJ3Njb3BlJykuJHR5cGU8UmVwb3J0U2NvcGU+KCkubm90TnVsbCgpLFxuICAvKiogUmVjaXBpZW50IGlkcyBmcm9tIGByZXBvcnRfcmVjaXBpZW50c2AsIG5vdCByYXcgYWRkcmVzc2VzLiAqL1xuICByZWNpcGllbnRzOiBqc29uYigncmVjaXBpZW50cycpLiR0eXBlPHN0cmluZ1tdPigpLmRlZmF1bHQoW10pLm5vdE51bGwoKSxcbiAgLyoqXG4gICAqIFB1Ymxpc2ggd2l0aG91dCB0aGUgbGVhZCByZXZpZXdpbmcuIE9mZiBieSBkZWZhdWx0OiB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlXG4gICAqIHJldmlldyBzdGVwIGlzIHRoYXQgdGhlIGRhdGEgY2Fubm90IHN1cHBseSB0aGUgY29udGV4dCBhIG1hbmFnZXIgbmVlZHNcbiAgICogKFwid2UgcGF1c2VkIGRlcGxveXMgVHVlc2RheSBmb3IgdGhlIG1pZ3JhdGlvblwiKS5cbiAgICovXG4gIGF1dG9TZW5kOiBib29sZWFuKCdhdXRvX3NlbmQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgcGF1c2VkUmVhc29uOiB2YXJjaGFyKCdwYXVzZWRfcmVhc29uJywgeyBsZW5ndGg6IDMwIH0pLiR0eXBlPFJlcG9ydFBhdXNlUmVhc29uPigpLFxuICBuZXh0UnVuQXQ6IHRpbWVzdGFtcCgnbmV4dF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgbGFzdFJ1bkF0OiB0aW1lc3RhbXAoJ2xhc3RfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbiAgcHVyZ2VBZnRlcjogdGltZXN0YW1wKCdwdXJnZV9hZnRlcicsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdJZHg6IGluZGV4KCdyZXBvcnRfZGVmaW5pdGlvbl9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgb3duZXJJZHg6IGluZGV4KCdyZXBvcnRfZGVmaW5pdGlvbl9vd25lcl9pZHgnKS5vbih0YWJsZS5vd25lcklkKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOVUxMYCksXG4gIC8vIERyaXZlcyB0aGUgc2NoZWR1bGVyJ3MgY2xhaW0gc2NhbjogdGhlIGR1ZSwgbGl2ZSwgdW5wYXVzZWQgZGVmaW5pdGlvbnMgb25seS5cbiAgZHVlSWR4OiBpbmRleCgncmVwb3J0X2RlZmluaXRpb25fZHVlX2lkeCcpLm9uKHRhYmxlLm5leHRSdW5BdClcbiAgICAud2hlcmUoc3FsYGRlbGV0ZWRfYXQgSVMgTlVMTCBBTkQgaXNfYWN0aXZlID0gdHJ1ZWApLFxuICBwdXJnZUlkeDogaW5kZXgoJ3JlcG9ydF9kZWZpbml0aW9uX3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogT25lIHBlcmlvZCdzIGZyb3plbiBvdXRwdXQuXG4gKlxuICogQHRhYmxlIHJlcG9ydF9ydW5zXG4gKi9cbmV4cG9ydCBjb25zdCByZXBvcnRSdW4gPSBwZ1RhYmxlKCdyZXBvcnRfcnVucycsIHtcbiAgaWQ6IHZhcmNoYXIoJ2lkJywgeyBsZW5ndGg6IDI1NSB9KS5wcmltYXJ5S2V5KCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgZGVmaW5pdGlvbklkOiB2YXJjaGFyKCdkZWZpbml0aW9uX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKiBJbmNsdXNpdmUgcGVyaW9kIHN0YXJ0LCBleGNsdXNpdmUgZW5kIOKAlCBib3RoIGluc3RhbnRzLCBpbiBVVEMuICovXG4gIHBlcmlvZFN0YXJ0OiB0aW1lc3RhbXAoJ3BlcmlvZF9zdGFydCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLm5vdE51bGwoKSxcbiAgcGVyaW9kRW5kOiB0aW1lc3RhbXAoJ3BlcmlvZF9lbmQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIC8qKiBIdW1hbiBsYWJlbCBpbiB0aGUgZGVmaW5pdGlvbidzIHRpbWV6b25lOiBgMjAyNi1XMzhgLCBgMjAyNi0wOGAsIGAyMDI2LVEzYC4gKi9cbiAgcGVyaW9kTGFiZWw6IHZhcmNoYXIoJ3BlcmlvZF9sYWJlbCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBSZWdlbmVyYXRpbmcgYSBwZXJpb2QgcHJvZHVjZXMgdmVyc2lvbiBOKzEgYW5kIHN1cGVyc2VkZXMgdGhlIG9sZCByb3cgcmF0aGVyXG4gICAqIHRoYW4gb3ZlcndyaXRpbmcgaXQuIExhdGUgZXZlbnRzICh0aGUgaW5nZXN0IHJlZHJpdmVzIGl0cyBkZWFkLWxldHRlciBxdWV1ZVxuICAgKiBob3VycyBsYXRlcikgbWVhbiBhIGNvcnJlY3RlZCByZXBvcnQgaXMgbm9ybWFsIOKAlCBhbmQgYSBtYW5hZ2VyIHdobyBhbHJlYWR5XG4gICAqIHJlYWQgdjEgbXVzdCBzdGlsbCBiZSBhYmxlIHRvIHNlZSBleGFjdGx5IHdoYXQgdGhleSByZWFkLlxuICAgKi9cbiAgdmVyc2lvbjogaW50ZWdlcigndmVyc2lvbicpLmRlZmF1bHQoMSkubm90TnVsbCgpLFxuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSZXBvcnRSdW5TdGF0dXM+KCkuZGVmYXVsdCgnZHJhZnRpbmcnKS5ub3ROdWxsKCksXG4gIC8qKiBUaGUgY29tcHV0ZWQgc2VjdGlvbnMuIFN1cnZpdmVzIHRoZSByYXctZXZlbnQgcHVyZ2Ug4oCUIHRoYXQgaXMgdGhlIHBvaW50LiAqL1xuICBzbmFwc2hvdDoganNvbmIoJ3NuYXBzaG90JykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCksXG4gIC8qKiBBSS1nZW5lcmF0ZWQgZXhlY3V0aXZlIHN1bW1hcnksIGZyb20gdGhlIHNuYXBzaG90J3MgbnVtYmVycyBvbmx5LiAqL1xuICBhaURyYWZ0OiB0ZXh0KCdhaV9kcmFmdCcpLFxuICAvKiogVGhlIGxlYWQncyBvd24gd29yZHMuIFRoZSBjb250ZXh0IHRoZSBkYXRhIGNhbm5vdCBzdXBwbHkuICovXG4gIGxlYWROb3RlczogdGV4dCgnbGVhZF9ub3RlcycpLFxuICAvLyBgYXNrc2Agd2FzIERFTEVURUQgaGVyZSwgYW5kIGl0IGlzIHRoZSByZW1vdmFsIG1vc3Qgd29ydGggZXhwbGFpbmluZywgYmVjYXVzZSB0aGUgaWRlYVxuICAvLyB3YXMgZ29vZDogd2hhdCB0aGUgbGVhZCBuZWVkcyBhIGRlY2lzaW9uIG9uLCBmcm9tIHdob20sIGJ5IHdoZW4g4oCUIGtlcHQgYXBhcnQgZnJvbVxuICAvLyBgbGVhZE5vdGVzYCBiZWNhdXNlIGEgcmVxdWVzdCBmb3IgYSBkZWNpc2lvbiBidXJpZWQgaW4gbmFycmF0aXZlIHJlYWRzIGFzIGNvbW1lbnRhcnlcbiAgLy8gYW5kIGdldHMgbm8gYW5zd2VyLiBJdCB3YXMgZGVjbGFyZWQgaW4gUGhhc2UgMiBhbmQgdGhlbiBuZXZlciB3cml0dGVuIG9yIHJlYWQgYnlcbiAgLy8gYW55dGhpbmc6IG5vIHJvdXRlIGFjY2VwdGVkIG9uZSwgbm8gY29tcG9zZXIgZW1pdHRlZCBvbmUsIG5vIHZpZXcgcmVuZGVyZWQgb25lLCBhbmRcbiAgLy8gdGhlIHNoYXJlZCByZXBvcnQgYSBtYW5hZ2VyIGFjdHVhbGx5IHJlYWRzIG5ldmVyIHNob3dlZCB0aGVtLiBBIGNvbHVtbiB0aGF0IG9ubHkgZXZlclxuICAvLyBoZWxkIGl0cyBvd24gZGVmYXVsdCBpcyBub3QgYSBmZWF0dXJlIGluIHByb2dyZXNzLCBpdCBpcyBhIGNsYWltIHRoZSBzY2hlbWEgbWFrZXMgYW5kXG4gIC8vIHRoZSBwcm9kdWN0IGRvZXMgbm90IGhvbm91ci4gV2hvZXZlciBidWlsZHMgYXNrcyBzaG91bGQgYWRkIHRoZSBjb2x1bW4gYmFjayBXSVRIIHRoZVxuICAvLyB3cml0ZSBwYXRoLCB0aGUgcmV2aWV3IFVJIGFuZCBhIHBsYWNlIGluIHRoZSBzaGFyZWQgdmlldywgaW4gb25lIGNoYW5nZS5cbiAgZmFpbHVyZVJlYXNvbjogdGV4dCgnZmFpbHVyZV9yZWFzb24nKSxcbiAgLyoqXG4gICAqIFdoYXQgaGFwcGVuZWQgd2hlbiB0aGlzIHJ1biB3YXMgREVMSVZFUkVEOiBjb3VudHMgcGVyIGNoYW5uZWwsIGFuZCB0aGUgbm90ZXMgYSBsZWFkXG4gICAqIG5lZWRzIHRvIHJlYWQgKFwibm8gb3V0Ym91bmQgZW1haWwgaXMgY29uZmlndXJlZCwgc28gMTIgcmVjaXBpZW50cyB3ZXJlIG5vdCBtYWlsZWRcIikuXG4gICAqXG4gICAqIE9uIHRoZSBydW4gcmF0aGVyIHRoYW4gaW4gYSBsb2csIGJlY2F1c2UgdGhlIHF1ZXN0aW9uIGl0IGFuc3dlcnMgaXMgYXNrZWQgZGF5cyBsYXRlclxuICAgKiBhbmQgYWJvdXQgb25lIHNwZWNpZmljIHJlcG9ydDogXCJkaWQgdGhlIGJvYXJkIGFjdHVhbGx5IGdldCBsYXN0IG1vbnRoJ3M/XCIgQSBsb2cgbGluZVxuICAgKiBjYW5ub3QgYmUgc2hvd24gbmV4dCB0byB0aGUgcmVwb3J0LCBhbmQgYGxlYWROb3Rlc2AgY2Fubm90IGhvbGQgaXQg4oCUIHRoYXQgY29sdW1uIGlzXG4gICAqIGZyb3plbiBhdCBwdWJsaXNoLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gZGVsaXZlcnkgaGFwcGVucy5cbiAgICovXG4gIGRlbGl2ZXJ5OiBqc29uYignZGVsaXZlcnknKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgcHVibGlzaGVkQnk6IHRleHQoJ3B1Ymxpc2hlZF9ieScpLFxuICBwdWJsaXNoZWRBdDogdGltZXN0YW1wKCdwdWJsaXNoZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgc3VwZXJzZWRlZEJ5OiB2YXJjaGFyKCdzdXBlcnNlZGVkX2J5JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxuICBwdXJnZUFmdGVyOiB0aW1lc3RhbXAoJ3B1cmdlX2FmdGVyJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIFRoZSBpZGVtcG90ZW5jeSBrZXkuIEEgcmV0cnksIGEgY2F0Y2gtdXAgcGFzcyBhbmQgYSBtYW51YWwgYmFja2ZpbGwgY2FuIGFsbFxuICAvLyBhc2sgZm9yIHRoZSBzYW1lIHBlcmlvZDsgd2l0aG91dCB0aGlzIHRoZXkgd291bGQgZWFjaCBpbnNlcnQgYSByb3cuXG4gIHBlcmlvZFVuaXF1ZTogdW5pcXVlSW5kZXgoJ3JlcG9ydF9ydW5fcGVyaW9kX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLmRlZmluaXRpb25JZCwgdGFibGUucGVyaW9kU3RhcnQsIHRhYmxlLnZlcnNpb24pLFxuICBkZWZpbml0aW9uSWR4OiBpbmRleCgncmVwb3J0X3J1bl9kZWZpbml0aW9uX2lkeCcpLm9uKHRhYmxlLmRlZmluaXRpb25JZCwgdGFibGUucGVyaW9kU3RhcnQpXG4gICAgLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgb3JnSWR4OiBpbmRleCgncmVwb3J0X3J1bl9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5VTExgKSxcbiAgcHVyZ2VJZHg6IGluZGV4KCdyZXBvcnRfcnVuX3B1cmdlX2lkeCcpLm9uKHRhYmxlLnB1cmdlQWZ0ZXIpLndoZXJlKHNxbGBkZWxldGVkX2F0IElTIE5PVCBOVUxMYCksXG59KSk7XG5cbi8qKlxuICogQSByZWFkLW9ubHksIGV4cGlyaW5nIGxpbmsgdG8gb25lIHB1Ymxpc2hlZCBydW4uXG4gKlxuICogQHRhYmxlIHJlcG9ydF9zaGFyZV9saW5rc1xuICovXG5leHBvcnQgY29uc3QgcmVwb3J0U2hhcmVMaW5rID0gcGdUYWJsZSgncmVwb3J0X3NoYXJlX2xpbmtzJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBydW5JZDogdmFyY2hhcigncnVuX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIC8qKlxuICAgKiBTSEEtMjU2IG9mIHRoZSB0b2tlbiwgbmV2ZXIgdGhlIHRva2VuLiBUaGUgcmF3IHZhbHVlIGlzIHNob3duIG9uY2UsIGF0XG4gICAqIGNyZWF0aW9uIOKAlCBhIHN0b3JlZCB0b2tlbiBpcyBhIHN0b3JlZCBjcmVkZW50aWFsIGZvciBvcmcgZGF0YSB0aGF0IGFueW9uZVxuICAgKiBob2xkaW5nIHRoZSBsaW5rIGNhbiByZWFkLlxuICAgKi9cbiAgdG9rZW5IYXNoOiB2YXJjaGFyKCd0b2tlbl9oYXNoJywgeyBsZW5ndGg6IDY0IH0pLm5vdE51bGwoKSxcbiAgZXhwaXJlc0F0OiB0aW1lc3RhbXAoJ2V4cGlyZXNfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5ub3ROdWxsKCksXG4gIHJldm9rZWRBdDogdGltZXN0YW1wKCdyZXZva2VkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIHJldm9rZWRCeTogdGV4dCgncmV2b2tlZF9ieScpLFxuICAvKiogUmVkYWN0IHBpcGVsaW5lL3Byb2plY3QgbmFtZXMgaW4gdGhlIHB1YmxpYyB2aWV3IOKAlCBpbnRlcm5hbCBuYW1lcyBsZWFrIGludGVudC4gKi9cbiAgcmVkYWN0TmFtZXM6IGJvb2xlYW4oJ3JlZGFjdF9uYW1lcycpLmRlZmF1bHQoZmFsc2UpLm5vdE51bGwoKSxcbiAgdmlld0NvdW50OiBpbnRlZ2VyKCd2aWV3X2NvdW50JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIGxhc3RWaWV3ZWRBdDogdGltZXN0YW1wKCdsYXN0X3ZpZXdlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gVGhlIHB1YmxpYyByb3V0ZSdzIG9ubHkgbG9va3VwOiBieSB0b2tlbiBoYXNoLiBVbmlxdWUgc28gYSBoYXNoIGNvbGxpc2lvblxuICAvLyBjYW5ub3QgcmVzb2x2ZSB0byB0d28gcnVucy5cbiAgdG9rZW5VbmlxdWU6IHVuaXF1ZUluZGV4KCdyZXBvcnRfc2hhcmVfbGlua190b2tlbl91bmlxdWUnKS5vbih0YWJsZS50b2tlbkhhc2gpLFxuICBydW5JZHg6IGluZGV4KCdyZXBvcnRfc2hhcmVfbGlua19ydW5faWR4Jykub24odGFibGUucnVuSWQpLFxuICBvcmdJZHg6IGluZGV4KCdyZXBvcnRfc2hhcmVfbGlua19vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIEEgdmVyaWZpZWQgZGVsaXZlcnkgYWRkcmVzcyBmb3Igb25lIG9yZy5cbiAqXG4gKiBAdGFibGUgcmVwb3J0X3JlY2lwaWVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlcG9ydFJlY2lwaWVudCA9IHBnVGFibGUoJ3JlcG9ydF9yZWNpcGllbnRzJywge1xuICBpZDogdmFyY2hhcignaWQnLCB7IGxlbmd0aDogMjU1IH0pLnByaW1hcnlLZXkoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBlbWFpbDogdmFyY2hhcignZW1haWwnLCB7IGxlbmd0aDogMzIwIH0pLm5vdE51bGwoKSxcbiAgZGlzcGxheU5hbWU6IHZhcmNoYXIoJ2Rpc3BsYXlfbmFtZScsIHsgbGVuZ3RoOiAyMDAgfSksXG4gIC8qKlxuICAgKiBTZXQgd2hlbiB0aGUgcmVjaXBpZW50IGNvbmZpcm1zIGJ5IGVtYWlsLiBOb3RoaW5nIGlzIGRlbGl2ZXJlZCBiZWZvcmUgdGhpczpcbiAgICogb3RoZXJ3aXNlIGEgbGVhZCBjb3VsZCBzZW5kIG9yZyBkYXRhIHRvIGFueSBhZGRyZXNzIGJ5IHR5cGluZyBpdC5cbiAgICovXG4gIHZlcmlmaWVkQXQ6IHRpbWVzdGFtcCgndmVyaWZpZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgdmVyaWZpY2F0aW9uVG9rZW5IYXNoOiB2YXJjaGFyKCd2ZXJpZmljYXRpb25fdG9rZW5faGFzaCcsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgLyoqIEhvbm91cmVkIGFjcm9zcyBldmVyeSBkZWZpbml0aW9uIOKAlCBhbiB1bnN1YnNjcmliZSBpcyBwZXIgcGVyc29uLCBub3QgcGVyIHJlcG9ydC4gKi9cbiAgdW5zdWJzY3JpYmVkQXQ6IHRpbWVzdGFtcCgndW5zdWJzY3JpYmVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIC8qKlxuICAgKiBUaGUgcmVjaXBpZW50J3Mgc3RhYmxlIHVuc3Vic2NyaWJlIG5vbmNlLCBtaW50ZWQgb25jZSB3aXRoIHRoZSByb3cuXG4gICAqXG4gICAqIFNUT1JFRCBJTiBUSEUgQ0xFQVIsIHVubGlrZSBldmVyeSBvdGhlciB0b2tlbiBpbiB0aGlzIGZpbGUsIGFuZCB0aGUgZGlmZmVyZW5jZSBpc1xuICAgKiB3aGF0IGl0IGF1dGhvcml6ZXMuIEEgc2hhcmUtbGluayB0b2tlbiBncmFudHMgUkVBRCBBQ0NFU1MgdG8gYW4gb3JnJ3MgcmVwb3J0LCBzbyBpdFxuICAgKiBpcyBvbmx5IGV2ZXIga2VwdCBhcyBhIGhhc2g7IHRoaXMgb25lIGF1dGhvcml6ZXMgZXhhY3RseSBvbmUgc2VsZi1saW1pdGluZyBhY3Rpb24g4oCUXG4gICAqIFwic3RvcCBlbWFpbGluZyB0aGlzIGFkZHJlc3NcIiDigJQgc28gdGhlIHdvcnN0IGEgZGF0YWJhc2UgcmVhZCBidXlzIGFuIGF0dGFja2VyIGlzIHRoZVxuICAgKiBhYmlsaXR5IHRvIG1ha2UgdGhlIHByb2R1Y3Qgc2VuZCBsZXNzIG1haWwuXG4gICAqXG4gICAqIEl0IGhhcyB0byBiZSByZWFkYWJsZSBiZWNhdXNlIGV2ZXJ5IHJlcG9ydCBlbWFpbCByZWJ1aWxkcyB0aGUgbGluaywgYW5kIGEgaGFzaFxuICAgKiBjYW5ub3QgYmUgdHVybmVkIGJhY2sgaW50byB0aGUgVVJMLiBUaGUgYWx0ZXJuYXRpdmUsIGEgc2lnbmVkIFVSTCwgd291bGQgYmVcbiAgICogaW52YWxpZGF0ZWQgYnkgdGhlIGRlZmF1bHQgRVBIRU1FUkFMIHNlcnZpY2Uga2V5IG9uIGV2ZXJ5IHJlc3RhcnQsIHNpbGVudGx5IGJyZWFraW5nXG4gICAqIHRoZSB1bnN1YnNjcmliZSBsaW5rIGluIGV2ZXJ5IHJlcG9ydCBhbHJlYWR5IHNpdHRpbmcgaW4gYSBtYW5hZ2VyJ3MgbWFpbGJveCDigJQgd2hpY2hcbiAgICogaXMgdGhlIG9uZSBmYWlsdXJlIGhlcmUgdGhhdCBoYXMgYSByZWd1bGF0b3IgYXR0YWNoZWQgdG8gaXQuXG4gICAqL1xuICB1bnN1YnNjcmliZVRva2VuOiB2YXJjaGFyKCd1bnN1YnNjcmliZV90b2tlbicsIHsgbGVuZ3RoOiA2NCB9KSxcbiAgYm91bmNlQ291bnQ6IGludGVnZXIoJ2JvdW5jZV9jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBsYXN0Qm91bmNlQXQ6IHRpbWVzdGFtcCgnbGFzdF9ib3VuY2VfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgLyoqIFNldCB3aGVuIGFuIGFkbWluIGFwcHJvdmVkIGFuIGFkZHJlc3Mgb3V0c2lkZSB0aGUgYWxsb3dlZCBkb21haW5zLiAqL1xuICBhcHByb3ZlZEJ5OiB0ZXh0KCdhcHByb3ZlZF9ieScpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG4gIHB1cmdlQWZ0ZXI6IHRpbWVzdGFtcCgncHVyZ2VfYWZ0ZXInLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gT25lIHJvdyBwZXIgYWRkcmVzcyBwZXIgb3JnLCBzbyByZS1hZGRpbmcgYSByZWNpcGllbnQgcmV1c2VzIGl0cyB2ZXJpZmljYXRpb25cbiAgLy8gYW5kIHVuc3Vic2NyaWJlIHN0YXRlIHJhdGhlciB0aGFuIHJlc2V0dGluZyB0aGVtLlxuICBvcmdFbWFpbFVuaXF1ZTogdW5pcXVlSW5kZXgoJ3JlcG9ydF9yZWNpcGllbnRfb3JnX2VtYWlsX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5lbWFpbCksXG4gIG9yZ0lkeDogaW5kZXgoJ3JlcG9ydF9yZWNpcGllbnRfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOVUxMYCksXG4gIHB1cmdlSWR4OiBpbmRleCgncmVwb3J0X3JlY2lwaWVudF9wdXJnZV9pZHgnKS5vbih0YWJsZS5wdXJnZUFmdGVyKS53aGVyZShzcWxgZGVsZXRlZF9hdCBJUyBOT1QgTlVMTGApLFxuICAvLyBUaGUgdW5zdWJzY3JpYmUgbGluaydzIG9ubHkgbG9va3VwLiBVbmlxdWUgc28gb25lIHRva2VuIGNhbiBuZXZlciByZXNvbHZlIHRvIHR3b1xuICAvLyBhZGRyZXNzZXMuXG4gIHVuc3ViVG9rZW5VbmlxdWU6IHVuaXF1ZUluZGV4KCdyZXBvcnRfcmVjaXBpZW50X3Vuc3ViX3Rva2VuX3VuaXF1ZScpLm9uKHRhYmxlLnVuc3Vic2NyaWJlVG9rZW4pXG4gICAgLndoZXJlKHNxbGB1bnN1YnNjcmliZV90b2tlbiBJUyBOT1QgTlVMTGApLFxufSkpO1xuXG5leHBvcnQgdHlwZSBSZXBvcnREZWZpbml0aW9uID0gdHlwZW9mIHJlcG9ydERlZmluaXRpb24uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0RGVmaW5pdGlvbkluc2VydCA9IHR5cGVvZiByZXBvcnREZWZpbml0aW9uLiRpbmZlckluc2VydDtcbmV4cG9ydCB0eXBlIFJlcG9ydFJ1biA9IHR5cGVvZiByZXBvcnRSdW4uJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UnVuSW5zZXJ0ID0gdHlwZW9mIHJlcG9ydFJ1bi4kaW5mZXJJbnNlcnQ7XG5leHBvcnQgdHlwZSBSZXBvcnRTaGFyZUxpbmsgPSB0eXBlb2YgcmVwb3J0U2hhcmVMaW5rLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFJlcG9ydFNoYXJlTGlua0luc2VydCA9IHR5cGVvZiByZXBvcnRTaGFyZUxpbmsuJGluZmVySW5zZXJ0O1xuZXhwb3J0IHR5cGUgUmVwb3J0UmVjaXBpZW50ID0gdHlwZW9mIHJlcG9ydFJlY2lwaWVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBSZXBvcnRSZWNpcGllbnRJbnNlcnQgPSB0eXBlb2YgcmVwb3J0UmVjaXBpZW50LiRpbmZlckluc2VydDtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -29,9 +29,18 @@ export * from './api/viewer-context.js';
29
29
  export * from './api/crud-service.js';
30
30
  export { parseSemver, compareSemverParts, compareSemver, isVersionRange, satisfiesVersionSpec, semverOrderBy, } from './api/semver-range.js';
31
31
  export { normalizeQuery, searchPublicListings, listPublicCategories, getPublicListing, getPublicListedVersion, listPublicReviews, listPublicListingsForSitemap, type DirectoryTrustTier, type DirectorySort, DIRECTORY_SORTS, DIRECTORY_TIERS, type DirectorySearchParams, type ReviewSort, REVIEW_SORTS, type PublicListingRow, } from './api/public-directory.js';
32
+ export { listEnabledAlertDestinations, type NotificationDestination, } from './api/alert-destinations.js';
32
33
  export { policyOf, effectiveConsumptionPolicy, applyPolicyUpdate, type ConsumptionPolicy, DEFAULT_CONSUMPTION_POLICY, } from './api/plugin-consumption-policy.js';
33
34
  export { advisoryRangeCovers, advisoryRangeProblem, advisoriesCovering, blockingAdvisories, } from './api/plugin-advisories.js';
34
35
  export { listingBlock, implicitInstallRange, installAdmits, scopeOrgIds, installModeFor, drizzleListingSource, resolveListingReference, listedVersionWarnings, listedPluginRecord, loadOrgInstallContext, orgListingStates, resolvableListings, type ResolutionRefusal, type ResolutionScope, type ListingDataSource, type ListingResolved, type OrgListingState, } from './api/plugin-resolution.js';
35
36
  export { runSoftDeletePurge, createSoftDeletePurgeScheduler, type PurgeableEntity, } from './api/soft-delete-sweep.js';
36
- export { type BuildHealth, type DoraLevel, type DoraMetrics, type DoraOptions, type DoraTrendPoint, type IncidentListItem, type ReportingSettings, type IncidentTestResult, type IngestMetric, type PluginRuntimeFilter, type PluginRuntimeStats, ReportingService, reportingService, } from './api/reporting-service.js';
37
+ export { type BuildHealth, type DoraLevel, type DoraMetrics, type DoraOptions, type DoraTrendPoint, type IncidentListItem, type ReportingSettings, type IncidentTestResult, type IngestCaller, type IngestMetric, type LastDeployedCommit, } from './api/reporting-service.js';
38
+ export { upsertDeployments, applyDeployOutcome, correlateIncident, isDeployEvent, leadTimeGapOf, type DeployCandidate, } from './api/reporting/deploy-rollup.js';
39
+ export { rebuildDay, runRollupPass, rollupSettleHours, rollupBatchDays, utcDayStart, } from './api/reporting/daily-rollup.js';
40
+ export { classifyFailure, isTeamActionable, FAILURE_CATEGORY_LABELS, } from './api/reporting/failure-classifier.js';
41
+ export { getPipelineBreakdown, getFailureAnalysis, getStagePerformance, getResourceConsumption, getPromotionView, getOutdatedPlugins, getPluginVulnerabilities, getAdoption, type AnalyticsScope, type PipelineBreakdownRow, type FailureCategoryRow, type StagePerformanceRow, type ResourceRow, type PromotionRow, type OutdatedPluginRow, type VulnerabilityRow, type AdoptionSummary, } from './api/reporting/analytics-queries.js';
42
+ export { evaluateNeedsAttention, thresholdsFrom, DEFAULT_THRESHOLDS, type NeedsAttentionThresholds, type AttentionFinding, type AttentionItem, type AttentionInput, type AttentionRuleId, } from './api/reporting/needs-attention.js';
43
+ export { replacePipelineResolution, refreshLatestForPlugin, upsertExposures, closeFixedExposures, openExposures, triageExposure, lapsedAcceptances, versionGap, type ResolvedStep, type ExposureInput, type VersionGap, } from './api/reporting/plugin-exposure.js';
44
+ export { resolvePeriod, resolvePeriodByLabel, rejectUnreportablePeriod, nextPeriodBoundary, completePeriodsSince, registerSection, getSection, allSections, sectionIds, REPORT_TEMPLATE_SPECS, getTemplate, composeSnapshot, LOW_SAMPLE_THRESHOLD, REPORT_FEATURE_SUBSTITUTES, renderReportHtml, reportFileName, trendSentence, type ReportHtmlInput, type ResolvedPeriod, type PeriodRejection, type SectionSpec, type SectionContext, type SectionDataSource, type TemplateSpec, type ReportSnapshot, type ComposedSection, type DataQualityNote, type ComposeOptions, type TrendDirection, StakeholderReportStore, stakeholderReportStore, hashToken, mintToken, DEFAULT_SHARE_LINK_TTL_DAYS, MAX_SHARE_LINK_TTL_DAYS, MAX_BOUNCES, VERIFICATION_TTL_MS, type CreateDefinitionInput, type UpdateDefinitionInput, type MintedShareLink, type ResolvedShareLink, } from './api/reporting/stakeholder/index.js';
45
+ export { type PluginRuntimeFilter, type PluginRuntimeStats, ReportingService, reportingService, } from './api/reporting-service.js';
37
46
  export { type PluginFilter, type PipelineFilter, type PipelineTemplateFilter, type MessageFilter, type CompliancePolicyFilter, type ComplianceRuleFilter, type ComplianceExemptionFilter, type ComplianceAuditFilter, type ComplianceScanFilter, } from './core/query-filters.js';
package/lib/index.js CHANGED
@@ -33,13 +33,27 @@ export * from './api/viewer-context.js';
33
33
  export * from './api/crud-service.js';
34
34
  export { parseSemver, compareSemverParts, compareSemver, isVersionRange, satisfiesVersionSpec, semverOrderBy, } from './api/semver-range.js';
35
35
  export { normalizeQuery, searchPublicListings, listPublicCategories, getPublicListing, getPublicListedVersion, listPublicReviews, listPublicListingsForSitemap, DIRECTORY_SORTS, DIRECTORY_TIERS, REVIEW_SORTS, } from './api/public-directory.js';
36
+ export { listEnabledAlertDestinations, } from './api/alert-destinations.js';
36
37
  export { policyOf, effectiveConsumptionPolicy, applyPolicyUpdate, DEFAULT_CONSUMPTION_POLICY, } from './api/plugin-consumption-policy.js';
37
38
  export { advisoryRangeCovers, advisoryRangeProblem, advisoriesCovering, blockingAdvisories, } from './api/plugin-advisories.js';
38
39
  export { listingBlock, implicitInstallRange, installAdmits, scopeOrgIds, installModeFor, drizzleListingSource, resolveListingReference, listedVersionWarnings, listedPluginRecord, loadOrgInstallContext, orgListingStates, resolvableListings, } from './api/plugin-resolution.js';
39
40
  // `isSoftDeletePurgeEnabled` is the module's own env gate — `runSoftDeletePurge`
40
41
  // and the scheduler already apply it, so callers never ask separately.
41
42
  export { runSoftDeletePurge, createSoftDeletePurgeScheduler, } from './api/soft-delete-sweep.js';
43
+ export {} from './api/reporting-service.js';
44
+ // The reporting ANALYTICS layer: the per-deploy rollup written at ingest, the
45
+ // daily rollup every section reads, and the failure classifier that labels what
46
+ // broke (see the modules' own headers for why each is written rather than derived).
47
+ export { upsertDeployments, applyDeployOutcome, correlateIncident, isDeployEvent, leadTimeGapOf, } from './api/reporting/deploy-rollup.js';
48
+ export { rebuildDay, runRollupPass, rollupSettleHours, rollupBatchDays, utcDayStart, } from './api/reporting/daily-rollup.js';
49
+ export { classifyFailure, isTeamActionable, FAILURE_CATEGORY_LABELS, } from './api/reporting/failure-classifier.js';
50
+ export { getPipelineBreakdown, getFailureAnalysis, getStagePerformance, getResourceConsumption, getPromotionView, getOutdatedPlugins, getPluginVulnerabilities, getAdoption, } from './api/reporting/analytics-queries.js';
51
+ export { evaluateNeedsAttention, thresholdsFrom, DEFAULT_THRESHOLDS, } from './api/reporting/needs-attention.js';
52
+ export { replacePipelineResolution, refreshLatestForPlugin, upsertExposures, closeFixedExposures, openExposures, triageExposure, lapsedAcceptances, versionGap, } from './api/reporting/plugin-exposure.js';
53
+ // The stakeholder-report engine: period resolution, section registry, templates
54
+ // and the composer that freezes a period into a snapshot.
55
+ export { resolvePeriod, resolvePeriodByLabel, rejectUnreportablePeriod, nextPeriodBoundary, completePeriodsSince, registerSection, getSection, allSections, sectionIds, REPORT_TEMPLATE_SPECS, getTemplate, composeSnapshot, LOW_SAMPLE_THRESHOLD, REPORT_FEATURE_SUBSTITUTES, renderReportHtml, reportFileName, trendSentence, StakeholderReportStore, stakeholderReportStore, hashToken, mintToken, DEFAULT_SHARE_LINK_TTL_DAYS, MAX_SHARE_LINK_TTL_DAYS, MAX_BOUNCES, VERIFICATION_TTL_MS, } from './api/reporting/stakeholder/index.js';
42
56
  export { ReportingService, reportingService, } from './api/reporting-service.js';
43
57
  // Filters
44
58
  export {} from './core/query-filters.js';
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxXQUFXO0FBQ1gsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyw4QkFBOEI7QUFDOUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBRUwseUJBQXlCLEdBQzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsR0FDZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsZUFBZSxFQUNmLGVBQWUsRUFHZixZQUFZLEdBRWIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLDBCQUEwQixFQUMxQixpQkFBaUIsRUFFakIsMEJBQTBCLEdBQzNCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixHQUNuQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFDTCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLG9CQUFvQixFQUNwQix1QkFBdUIsRUFDdkIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQU1uQixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLGlGQUFpRjtBQUNqRix1RUFBdUU7QUFDdkUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiw4QkFBOEIsR0FFL0IsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBWUwsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLFVBQVU7QUFDVixPQUFPLEVBVU4sTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YVxuICpcbiAqIERhdGFiYXNlIGxheWVyOiBEcml6emxlIE9STSBzY2hlbWFzLCBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGFuZCBxdWVyeSBpbmZyYXN0cnVjdHVyZS5cbiAqXG4gKiAqKkRhdGFiYXNlKipcbiAqIC0gZGIg4oCUIHNoYXJlZCBEcml6emxlIGRhdGFiYXNlIGluc3RhbmNlXG4gKiAtIGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiDigJQgUG9zdGdyZVNRTCBjb25uZWN0aW9uIGxpZmVjeWNsZSB3aXRoIHJldHJ5IGxvZ2ljXG4gKiAtIHNjaGVtYSDigJQgRHJpenpsZSB0YWJsZSBkZWZpbml0aW9ucyAocGx1Z2lucywgcGlwZWxpbmVzLCBtZXNzYWdlcywgY29tcGxpYW5jZSwgZXRjLilcbiAqXG4gKiAqKlNlcnZpY2VzKipcbiAqIC0gQ3J1ZFNlcnZpY2Ug4oCUIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgbXVsdGktdGVuYW50IENSVUQgd2l0aCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvblxuICogLSBSZXBvcnRpbmdTZXJ2aWNlIOKAlCBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJlcG9ydGluZyBiYXNlIGNsYXNzXG4gKlxuICogKipRdWVyeSBCdWlsZGVycyoqXG4gKiAtIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucywgYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMsIGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnMg4oCUIGZpbHRlci10by1TUUwgY29uZGl0aW9uIGJ1aWxkZXJzXG4gKiAtIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMsIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zLCBldGMuIOKAlCBjb21wbGlhbmNlIHF1ZXJ5IGJ1aWxkZXJzXG4gKiAtIEFjY2Vzc0NvbnRyb2xCdWlsZGVyIOKAlCByb3ctbGV2ZWwgYWNjZXNzIGNvbnRyb2wgY29uZGl0aW9uIGJ1aWxkZXJcbiAqXG4gKiAqKkZpbHRlcnMqKlxuICogLSBQbHVnaW5GaWx0ZXIsIFBpcGVsaW5lRmlsdGVyLCBNZXNzYWdlRmlsdGVyIOKAlCB0eXBlZCBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLCBDb21wbGlhbmNlUnVsZUZpbHRlciwgZXRjLiDigJQgY29tcGxpYW5jZSBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBkcml6emxlUm93cywgZHJpenpsZUNvdW50IOKAlCBEcml6emxlIHJlc3VsdCB0eXBlIGhlbHBlcnNcbiAqL1xuXG4vLyBEYXRhYmFzZVxuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZS9pbmRleC5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXJzIGFuZCBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9hcGkvcXVlcnktYnVpbGRlcnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBCYXNlQWNjZXNzRmlsdGVyLFxuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxufSBmcm9tICcuL2FwaS9hY2Nlc3MtY29udHJvbC1idWlsZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3ZpZXdlci1jb250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL2NydWQtc2VydmljZS5qcyc7XG5leHBvcnQge1xuICBwYXJzZVNlbXZlcixcbiAgY29tcGFyZVNlbXZlclBhcnRzLFxuICBjb21wYXJlU2VtdmVyLFxuICBpc1ZlcnNpb25SYW5nZSxcbiAgc2F0aXNmaWVzVmVyc2lvblNwZWMsXG4gIHNlbXZlck9yZGVyQnksXG59IGZyb20gJy4vYXBpL3NlbXZlci1yYW5nZS5qcyc7XG5leHBvcnQge1xuICBub3JtYWxpemVRdWVyeSxcbiAgc2VhcmNoUHVibGljTGlzdGluZ3MsXG4gIGxpc3RQdWJsaWNDYXRlZ29yaWVzLFxuICBnZXRQdWJsaWNMaXN0aW5nLFxuICBnZXRQdWJsaWNMaXN0ZWRWZXJzaW9uLFxuICBsaXN0UHVibGljUmV2aWV3cyxcbiAgbGlzdFB1YmxpY0xpc3RpbmdzRm9yU2l0ZW1hcCxcbiAgdHlwZSBEaXJlY3RvcnlUcnVzdFRpZXIsXG4gIHR5cGUgRGlyZWN0b3J5U29ydCxcbiAgRElSRUNUT1JZX1NPUlRTLFxuICBESVJFQ1RPUllfVElFUlMsXG4gIHR5cGUgRGlyZWN0b3J5U2VhcmNoUGFyYW1zLFxuICB0eXBlIFJldmlld1NvcnQsXG4gIFJFVklFV19TT1JUUyxcbiAgdHlwZSBQdWJsaWNMaXN0aW5nUm93LFxufSBmcm9tICcuL2FwaS9wdWJsaWMtZGlyZWN0b3J5LmpzJztcbmV4cG9ydCB7XG4gIHBvbGljeU9mLFxuICBlZmZlY3RpdmVDb25zdW1wdGlvblBvbGljeSxcbiAgYXBwbHlQb2xpY3lVcGRhdGUsXG4gIHR5cGUgQ29uc3VtcHRpb25Qb2xpY3ksXG4gIERFRkFVTFRfQ09OU1VNUFRJT05fUE9MSUNZLFxufSBmcm9tICcuL2FwaS9wbHVnaW4tY29uc3VtcHRpb24tcG9saWN5LmpzJztcbmV4cG9ydCB7XG4gIGFkdmlzb3J5UmFuZ2VDb3ZlcnMsXG4gIGFkdmlzb3J5UmFuZ2VQcm9ibGVtLFxuICBhZHZpc29yaWVzQ292ZXJpbmcsXG4gIGJsb2NraW5nQWR2aXNvcmllcyxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLWFkdmlzb3JpZXMuanMnO1xuZXhwb3J0IHtcbiAgbGlzdGluZ0Jsb2NrLFxuICBpbXBsaWNpdEluc3RhbGxSYW5nZSxcbiAgaW5zdGFsbEFkbWl0cyxcbiAgc2NvcGVPcmdJZHMsXG4gIGluc3RhbGxNb2RlRm9yLFxuICBkcml6emxlTGlzdGluZ1NvdXJjZSxcbiAgcmVzb2x2ZUxpc3RpbmdSZWZlcmVuY2UsXG4gIGxpc3RlZFZlcnNpb25XYXJuaW5ncyxcbiAgbGlzdGVkUGx1Z2luUmVjb3JkLFxuICBsb2FkT3JnSW5zdGFsbENvbnRleHQsXG4gIG9yZ0xpc3RpbmdTdGF0ZXMsXG4gIHJlc29sdmFibGVMaXN0aW5ncyxcbiAgdHlwZSBSZXNvbHV0aW9uUmVmdXNhbCxcbiAgdHlwZSBSZXNvbHV0aW9uU2NvcGUsXG4gIHR5cGUgTGlzdGluZ0RhdGFTb3VyY2UsXG4gIHR5cGUgTGlzdGluZ1Jlc29sdmVkLFxuICB0eXBlIE9yZ0xpc3RpbmdTdGF0ZSxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLXJlc29sdXRpb24uanMnO1xuLy8gYGlzU29mdERlbGV0ZVB1cmdlRW5hYmxlZGAgaXMgdGhlIG1vZHVsZSdzIG93biBlbnYgZ2F0ZSDigJQgYHJ1blNvZnREZWxldGVQdXJnZWBcbi8vIGFuZCB0aGUgc2NoZWR1bGVyIGFscmVhZHkgYXBwbHkgaXQsIHNvIGNhbGxlcnMgbmV2ZXIgYXNrIHNlcGFyYXRlbHkuXG5leHBvcnQge1xuICBydW5Tb2Z0RGVsZXRlUHVyZ2UsXG4gIGNyZWF0ZVNvZnREZWxldGVQdXJnZVNjaGVkdWxlcixcbiAgdHlwZSBQdXJnZWFibGVFbnRpdHksXG59IGZyb20gJy4vYXBpL3NvZnQtZGVsZXRlLXN3ZWVwLmpzJztcbmV4cG9ydCB7XG4gIHR5cGUgQnVpbGRIZWFsdGgsXG4gIHR5cGUgRG9yYUxldmVsLFxuICB0eXBlIERvcmFNZXRyaWNzLFxuICB0eXBlIERvcmFPcHRpb25zLFxuICB0eXBlIERvcmFUcmVuZFBvaW50LFxuICB0eXBlIEluY2lkZW50TGlzdEl0ZW0sXG4gIHR5cGUgUmVwb3J0aW5nU2V0dGluZ3MsXG4gIHR5cGUgSW5jaWRlbnRUZXN0UmVzdWx0LFxuICB0eXBlIEluZ2VzdE1ldHJpYyxcbiAgdHlwZSBQbHVnaW5SdW50aW1lRmlsdGVyLFxuICB0eXBlIFBsdWdpblJ1bnRpbWVTdGF0cyxcbiAgUmVwb3J0aW5nU2VydmljZSxcbiAgcmVwb3J0aW5nU2VydmljZSxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nLXNlcnZpY2UuanMnO1xuXG4vLyBGaWx0ZXJzXG5leHBvcnQge1xuICB0eXBlIFBsdWdpbkZpbHRlcixcbiAgdHlwZSBQaXBlbGluZUZpbHRlcixcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlRmlsdGVyLFxuICB0eXBlIE1lc3NhZ2VGaWx0ZXIsXG4gIHR5cGUgQ29tcGxpYW5jZVBvbGljeUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlUnVsZUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VBdWRpdEZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlU2NhbkZpbHRlcixcbn0gZnJvbSAnLi9jb3JlL3F1ZXJ5LWZpbHRlcnMuanMnO1xuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFFSCxXQUFXO0FBQ1gsY0FBYyxxQkFBcUIsQ0FBQztBQUVwQyw4QkFBOEI7QUFDOUIsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxPQUFPLEVBRUwseUJBQXlCLEdBQzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGFBQWEsR0FDZCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFDTCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQiw0QkFBNEIsRUFHNUIsZUFBZSxFQUNmLGVBQWUsRUFHZixZQUFZLEdBRWIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0wsNEJBQTRCLEdBRTdCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLFFBQVEsRUFDUiwwQkFBMEIsRUFDMUIsaUJBQWlCLEVBRWpCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixhQUFhLEVBQ2IsV0FBVyxFQUNYLGNBQWMsRUFDZCxvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixrQkFBa0IsR0FNbkIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxpRkFBaUY7QUFDakYsdUVBQXVFO0FBQ3ZFLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsOEJBQThCLEdBRS9CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQVlOLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLGdGQUFnRjtBQUNoRixvRkFBb0Y7QUFDcEYsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixhQUFhLEdBRWQsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLFdBQVcsR0FDWixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLHVCQUF1QixHQUN4QixNQUFNLHVDQUF1QyxDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsV0FBVyxHQVVaLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixjQUFjLEVBQ2Qsa0JBQWtCLEdBTW5CLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixVQUFVLEdBSVgsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1QyxnRkFBZ0Y7QUFDaEYsMERBQTBEO0FBQzFELE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsV0FBVyxFQUNYLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsMEJBQTBCLEVBQzFCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsYUFBYSxFQWFiLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsU0FBUyxFQUNULFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxtQkFBbUIsR0FLcEIsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBR0wsZ0JBQWdCLEVBQ2hCLGdCQUFnQixHQUNqQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLFVBQVU7QUFDVixPQUFPLEVBVU4sTUFBTSx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIEBtb2R1bGUgQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtZGF0YVxuICpcbiAqIERhdGFiYXNlIGxheWVyOiBEcml6emxlIE9STSBzY2hlbWFzLCBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGFuZCBxdWVyeSBpbmZyYXN0cnVjdHVyZS5cbiAqXG4gKiAqKkRhdGFiYXNlKipcbiAqIC0gZGIg4oCUIHNoYXJlZCBEcml6emxlIGRhdGFiYXNlIGluc3RhbmNlXG4gKiAtIGdldENvbm5lY3Rpb24sIGNsb3NlQ29ubmVjdGlvbiDigJQgUG9zdGdyZVNRTCBjb25uZWN0aW9uIGxpZmVjeWNsZSB3aXRoIHJldHJ5IGxvZ2ljXG4gKiAtIHNjaGVtYSDigJQgRHJpenpsZSB0YWJsZSBkZWZpbml0aW9ucyAocGx1Z2lucywgcGlwZWxpbmVzLCBtZXNzYWdlcywgY29tcGxpYW5jZSwgZXRjLilcbiAqXG4gKiAqKlNlcnZpY2VzKipcbiAqIC0gQ3J1ZFNlcnZpY2Ug4oCUIGdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgbXVsdGktdGVuYW50IENSVUQgd2l0aCBhY2Nlc3MgY29udHJvbCBhbmQgcGFnaW5hdGlvblxuICogLSBSZXBvcnRpbmdTZXJ2aWNlIOKAlCBhZ2dyZWdhdGUgcXVlcnkgYW5kIHJlcG9ydGluZyBiYXNlIGNsYXNzXG4gKlxuICogKipRdWVyeSBCdWlsZGVycyoqXG4gKiAtIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucywgYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMsIGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnMg4oCUIGZpbHRlci10by1TUUwgY29uZGl0aW9uIGJ1aWxkZXJzXG4gKiAtIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMsIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zLCBldGMuIOKAlCBjb21wbGlhbmNlIHF1ZXJ5IGJ1aWxkZXJzXG4gKiAtIEFjY2Vzc0NvbnRyb2xCdWlsZGVyIOKAlCByb3ctbGV2ZWwgYWNjZXNzIGNvbnRyb2wgY29uZGl0aW9uIGJ1aWxkZXJcbiAqXG4gKiAqKkZpbHRlcnMqKlxuICogLSBQbHVnaW5GaWx0ZXIsIFBpcGVsaW5lRmlsdGVyLCBNZXNzYWdlRmlsdGVyIOKAlCB0eXBlZCBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLCBDb21wbGlhbmNlUnVsZUZpbHRlciwgZXRjLiDigJQgY29tcGxpYW5jZSBmaWx0ZXIgaW50ZXJmYWNlc1xuICogLSBkcml6emxlUm93cywgZHJpenpsZUNvdW50IOKAlCBEcml6emxlIHJlc3VsdCB0eXBlIGhlbHBlcnNcbiAqL1xuXG4vLyBEYXRhYmFzZVxuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZS9pbmRleC5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXJzIGFuZCBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9hcGkvcXVlcnktYnVpbGRlcnMuanMnO1xuZXhwb3J0IHtcbiAgdHlwZSBCYXNlQWNjZXNzRmlsdGVyLFxuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxufSBmcm9tICcuL2FwaS9hY2Nlc3MtY29udHJvbC1idWlsZGVyLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3ZpZXdlci1jb250ZXh0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL2NydWQtc2VydmljZS5qcyc7XG5leHBvcnQge1xuICBwYXJzZVNlbXZlcixcbiAgY29tcGFyZVNlbXZlclBhcnRzLFxuICBjb21wYXJlU2VtdmVyLFxuICBpc1ZlcnNpb25SYW5nZSxcbiAgc2F0aXNmaWVzVmVyc2lvblNwZWMsXG4gIHNlbXZlck9yZGVyQnksXG59IGZyb20gJy4vYXBpL3NlbXZlci1yYW5nZS5qcyc7XG5leHBvcnQge1xuICBub3JtYWxpemVRdWVyeSxcbiAgc2VhcmNoUHVibGljTGlzdGluZ3MsXG4gIGxpc3RQdWJsaWNDYXRlZ29yaWVzLFxuICBnZXRQdWJsaWNMaXN0aW5nLFxuICBnZXRQdWJsaWNMaXN0ZWRWZXJzaW9uLFxuICBsaXN0UHVibGljUmV2aWV3cyxcbiAgbGlzdFB1YmxpY0xpc3RpbmdzRm9yU2l0ZW1hcCxcbiAgdHlwZSBEaXJlY3RvcnlUcnVzdFRpZXIsXG4gIHR5cGUgRGlyZWN0b3J5U29ydCxcbiAgRElSRUNUT1JZX1NPUlRTLFxuICBESVJFQ1RPUllfVElFUlMsXG4gIHR5cGUgRGlyZWN0b3J5U2VhcmNoUGFyYW1zLFxuICB0eXBlIFJldmlld1NvcnQsXG4gIFJFVklFV19TT1JUUyxcbiAgdHlwZSBQdWJsaWNMaXN0aW5nUm93LFxufSBmcm9tICcuL2FwaS9wdWJsaWMtZGlyZWN0b3J5LmpzJztcbmV4cG9ydCB7XG4gIGxpc3RFbmFibGVkQWxlcnREZXN0aW5hdGlvbnMsXG4gIHR5cGUgTm90aWZpY2F0aW9uRGVzdGluYXRpb24sXG59IGZyb20gJy4vYXBpL2FsZXJ0LWRlc3RpbmF0aW9ucy5qcyc7XG5leHBvcnQge1xuICBwb2xpY3lPZixcbiAgZWZmZWN0aXZlQ29uc3VtcHRpb25Qb2xpY3ksXG4gIGFwcGx5UG9saWN5VXBkYXRlLFxuICB0eXBlIENvbnN1bXB0aW9uUG9saWN5LFxuICBERUZBVUxUX0NPTlNVTVBUSU9OX1BPTElDWSxcbn0gZnJvbSAnLi9hcGkvcGx1Z2luLWNvbnN1bXB0aW9uLXBvbGljeS5qcyc7XG5leHBvcnQge1xuICBhZHZpc29yeVJhbmdlQ292ZXJzLFxuICBhZHZpc29yeVJhbmdlUHJvYmxlbSxcbiAgYWR2aXNvcmllc0NvdmVyaW5nLFxuICBibG9ja2luZ0Fkdmlzb3JpZXMsXG59IGZyb20gJy4vYXBpL3BsdWdpbi1hZHZpc29yaWVzLmpzJztcbmV4cG9ydCB7XG4gIGxpc3RpbmdCbG9jayxcbiAgaW1wbGljaXRJbnN0YWxsUmFuZ2UsXG4gIGluc3RhbGxBZG1pdHMsXG4gIHNjb3BlT3JnSWRzLFxuICBpbnN0YWxsTW9kZUZvcixcbiAgZHJpenpsZUxpc3RpbmdTb3VyY2UsXG4gIHJlc29sdmVMaXN0aW5nUmVmZXJlbmNlLFxuICBsaXN0ZWRWZXJzaW9uV2FybmluZ3MsXG4gIGxpc3RlZFBsdWdpblJlY29yZCxcbiAgbG9hZE9yZ0luc3RhbGxDb250ZXh0LFxuICBvcmdMaXN0aW5nU3RhdGVzLFxuICByZXNvbHZhYmxlTGlzdGluZ3MsXG4gIHR5cGUgUmVzb2x1dGlvblJlZnVzYWwsXG4gIHR5cGUgUmVzb2x1dGlvblNjb3BlLFxuICB0eXBlIExpc3RpbmdEYXRhU291cmNlLFxuICB0eXBlIExpc3RpbmdSZXNvbHZlZCxcbiAgdHlwZSBPcmdMaXN0aW5nU3RhdGUsXG59IGZyb20gJy4vYXBpL3BsdWdpbi1yZXNvbHV0aW9uLmpzJztcbi8vIGBpc1NvZnREZWxldGVQdXJnZUVuYWJsZWRgIGlzIHRoZSBtb2R1bGUncyBvd24gZW52IGdhdGUg4oCUIGBydW5Tb2Z0RGVsZXRlUHVyZ2VgXG4vLyBhbmQgdGhlIHNjaGVkdWxlciBhbHJlYWR5IGFwcGx5IGl0LCBzbyBjYWxsZXJzIG5ldmVyIGFzayBzZXBhcmF0ZWx5LlxuZXhwb3J0IHtcbiAgcnVuU29mdERlbGV0ZVB1cmdlLFxuICBjcmVhdGVTb2Z0RGVsZXRlUHVyZ2VTY2hlZHVsZXIsXG4gIHR5cGUgUHVyZ2VhYmxlRW50aXR5LFxufSBmcm9tICcuL2FwaS9zb2Z0LWRlbGV0ZS1zd2VlcC5qcyc7XG5leHBvcnQge1xuICB0eXBlIEJ1aWxkSGVhbHRoLFxuICB0eXBlIERvcmFMZXZlbCxcbiAgdHlwZSBEb3JhTWV0cmljcyxcbiAgdHlwZSBEb3JhT3B0aW9ucyxcbiAgdHlwZSBEb3JhVHJlbmRQb2ludCxcbiAgdHlwZSBJbmNpZGVudExpc3RJdGVtLFxuICB0eXBlIFJlcG9ydGluZ1NldHRpbmdzLFxuICB0eXBlIEluY2lkZW50VGVzdFJlc3VsdCxcbiAgdHlwZSBJbmdlc3RDYWxsZXIsXG4gIHR5cGUgSW5nZXN0TWV0cmljLFxuICB0eXBlIExhc3REZXBsb3llZENvbW1pdCxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nLXNlcnZpY2UuanMnO1xuXG4vLyBUaGUgcmVwb3J0aW5nIEFOQUxZVElDUyBsYXllcjogdGhlIHBlci1kZXBsb3kgcm9sbHVwIHdyaXR0ZW4gYXQgaW5nZXN0LCB0aGVcbi8vIGRhaWx5IHJvbGx1cCBldmVyeSBzZWN0aW9uIHJlYWRzLCBhbmQgdGhlIGZhaWx1cmUgY2xhc3NpZmllciB0aGF0IGxhYmVscyB3aGF0XG4vLyBicm9rZSAoc2VlIHRoZSBtb2R1bGVzJyBvd24gaGVhZGVycyBmb3Igd2h5IGVhY2ggaXMgd3JpdHRlbiByYXRoZXIgdGhhbiBkZXJpdmVkKS5cbmV4cG9ydCB7XG4gIHVwc2VydERlcGxveW1lbnRzLFxuICBhcHBseURlcGxveU91dGNvbWUsXG4gIGNvcnJlbGF0ZUluY2lkZW50LFxuICBpc0RlcGxveUV2ZW50LFxuICBsZWFkVGltZUdhcE9mLFxuICB0eXBlIERlcGxveUNhbmRpZGF0ZSxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL2RlcGxveS1yb2xsdXAuanMnO1xuZXhwb3J0IHtcbiAgcmVidWlsZERheSxcbiAgcnVuUm9sbHVwUGFzcyxcbiAgcm9sbHVwU2V0dGxlSG91cnMsXG4gIHJvbGx1cEJhdGNoRGF5cyxcbiAgdXRjRGF5U3RhcnQsXG59IGZyb20gJy4vYXBpL3JlcG9ydGluZy9kYWlseS1yb2xsdXAuanMnO1xuZXhwb3J0IHtcbiAgY2xhc3NpZnlGYWlsdXJlLFxuICBpc1RlYW1BY3Rpb25hYmxlLFxuICBGQUlMVVJFX0NBVEVHT1JZX0xBQkVMUyxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL2ZhaWx1cmUtY2xhc3NpZmllci5qcyc7XG5leHBvcnQge1xuICBnZXRQaXBlbGluZUJyZWFrZG93bixcbiAgZ2V0RmFpbHVyZUFuYWx5c2lzLFxuICBnZXRTdGFnZVBlcmZvcm1hbmNlLFxuICBnZXRSZXNvdXJjZUNvbnN1bXB0aW9uLFxuICBnZXRQcm9tb3Rpb25WaWV3LFxuICBnZXRPdXRkYXRlZFBsdWdpbnMsXG4gIGdldFBsdWdpblZ1bG5lcmFiaWxpdGllcyxcbiAgZ2V0QWRvcHRpb24sXG4gIHR5cGUgQW5hbHl0aWNzU2NvcGUsXG4gIHR5cGUgUGlwZWxpbmVCcmVha2Rvd25Sb3csXG4gIHR5cGUgRmFpbHVyZUNhdGVnb3J5Um93LFxuICB0eXBlIFN0YWdlUGVyZm9ybWFuY2VSb3csXG4gIHR5cGUgUmVzb3VyY2VSb3csXG4gIHR5cGUgUHJvbW90aW9uUm93LFxuICB0eXBlIE91dGRhdGVkUGx1Z2luUm93LFxuICB0eXBlIFZ1bG5lcmFiaWxpdHlSb3csXG4gIHR5cGUgQWRvcHRpb25TdW1tYXJ5LFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmcvYW5hbHl0aWNzLXF1ZXJpZXMuanMnO1xuZXhwb3J0IHtcbiAgZXZhbHVhdGVOZWVkc0F0dGVudGlvbixcbiAgdGhyZXNob2xkc0Zyb20sXG4gIERFRkFVTFRfVEhSRVNIT0xEUyxcbiAgdHlwZSBOZWVkc0F0dGVudGlvblRocmVzaG9sZHMsXG4gIHR5cGUgQXR0ZW50aW9uRmluZGluZyxcbiAgdHlwZSBBdHRlbnRpb25JdGVtLFxuICB0eXBlIEF0dGVudGlvbklucHV0LFxuICB0eXBlIEF0dGVudGlvblJ1bGVJZCxcbn0gZnJvbSAnLi9hcGkvcmVwb3J0aW5nL25lZWRzLWF0dGVudGlvbi5qcyc7XG5leHBvcnQge1xuICByZXBsYWNlUGlwZWxpbmVSZXNvbHV0aW9uLFxuICByZWZyZXNoTGF0ZXN0Rm9yUGx1Z2luLFxuICB1cHNlcnRFeHBvc3VyZXMsXG4gIGNsb3NlRml4ZWRFeHBvc3VyZXMsXG4gIG9wZW5FeHBvc3VyZXMsXG4gIHRyaWFnZUV4cG9zdXJlLFxuICBsYXBzZWRBY2NlcHRhbmNlcyxcbiAgdmVyc2lvbkdhcCxcbiAgdHlwZSBSZXNvbHZlZFN0ZXAsXG4gIHR5cGUgRXhwb3N1cmVJbnB1dCxcbiAgdHlwZSBWZXJzaW9uR2FwLFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmcvcGx1Z2luLWV4cG9zdXJlLmpzJztcblxuLy8gVGhlIHN0YWtlaG9sZGVyLXJlcG9ydCBlbmdpbmU6IHBlcmlvZCByZXNvbHV0aW9uLCBzZWN0aW9uIHJlZ2lzdHJ5LCB0ZW1wbGF0ZXNcbi8vIGFuZCB0aGUgY29tcG9zZXIgdGhhdCBmcmVlemVzIGEgcGVyaW9kIGludG8gYSBzbmFwc2hvdC5cbmV4cG9ydCB7XG4gIHJlc29sdmVQZXJpb2QsXG4gIHJlc29sdmVQZXJpb2RCeUxhYmVsLFxuICByZWplY3RVbnJlcG9ydGFibGVQZXJpb2QsXG4gIG5leHRQZXJpb2RCb3VuZGFyeSxcbiAgY29tcGxldGVQZXJpb2RzU2luY2UsXG4gIHJlZ2lzdGVyU2VjdGlvbixcbiAgZ2V0U2VjdGlvbixcbiAgYWxsU2VjdGlvbnMsXG4gIHNlY3Rpb25JZHMsXG4gIFJFUE9SVF9URU1QTEFURV9TUEVDUyxcbiAgZ2V0VGVtcGxhdGUsXG4gIGNvbXBvc2VTbmFwc2hvdCxcbiAgTE9XX1NBTVBMRV9USFJFU0hPTEQsXG4gIFJFUE9SVF9GRUFUVVJFX1NVQlNUSVRVVEVTLFxuICByZW5kZXJSZXBvcnRIdG1sLFxuICByZXBvcnRGaWxlTmFtZSxcbiAgdHJlbmRTZW50ZW5jZSxcbiAgdHlwZSBSZXBvcnRIdG1sSW5wdXQsXG4gIHR5cGUgUmVzb2x2ZWRQZXJpb2QsXG4gIHR5cGUgUGVyaW9kUmVqZWN0aW9uLFxuICB0eXBlIFNlY3Rpb25TcGVjLFxuICB0eXBlIFNlY3Rpb25Db250ZXh0LFxuICB0eXBlIFNlY3Rpb25EYXRhU291cmNlLFxuICB0eXBlIFRlbXBsYXRlU3BlYyxcbiAgdHlwZSBSZXBvcnRTbmFwc2hvdCxcbiAgdHlwZSBDb21wb3NlZFNlY3Rpb24sXG4gIHR5cGUgRGF0YVF1YWxpdHlOb3RlLFxuICB0eXBlIENvbXBvc2VPcHRpb25zLFxuICB0eXBlIFRyZW5kRGlyZWN0aW9uLFxuICBTdGFrZWhvbGRlclJlcG9ydFN0b3JlLFxuICBzdGFrZWhvbGRlclJlcG9ydFN0b3JlLFxuICBoYXNoVG9rZW4sXG4gIG1pbnRUb2tlbixcbiAgREVGQVVMVF9TSEFSRV9MSU5LX1RUTF9EQVlTLFxuICBNQVhfU0hBUkVfTElOS19UVExfREFZUyxcbiAgTUFYX0JPVU5DRVMsXG4gIFZFUklGSUNBVElPTl9UVExfTVMsXG4gIHR5cGUgQ3JlYXRlRGVmaW5pdGlvbklucHV0LFxuICB0eXBlIFVwZGF0ZURlZmluaXRpb25JbnB1dCxcbiAgdHlwZSBNaW50ZWRTaGFyZUxpbmssXG4gIHR5cGUgUmVzb2x2ZWRTaGFyZUxpbmssXG59IGZyb20gJy4vYXBpL3JlcG9ydGluZy9zdGFrZWhvbGRlci9pbmRleC5qcyc7XG5leHBvcnQge1xuICB0eXBlIFBsdWdpblJ1bnRpbWVGaWx0ZXIsXG4gIHR5cGUgUGx1Z2luUnVudGltZVN0YXRzLFxuICBSZXBvcnRpbmdTZXJ2aWNlLFxuICByZXBvcnRpbmdTZXJ2aWNlLFxufSBmcm9tICcuL2FwaS9yZXBvcnRpbmctc2VydmljZS5qcyc7XG5cbi8vIEZpbHRlcnNcbmV4cG9ydCB7XG4gIHR5cGUgUGx1Z2luRmlsdGVyLFxuICB0eXBlIFBpcGVsaW5lRmlsdGVyLFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXIsXG4gIHR5cGUgTWVzc2FnZUZpbHRlcixcbiAgdHlwZSBDb21wbGlhbmNlUG9saWN5RmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb25GaWx0ZXIsXG4gIHR5cGUgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyLFxuICB0eXBlIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxufSBmcm9tICcuL2NvcmUvcXVlcnktZmlsdGVycy5qcyc7XG4iXX0=
@@ -6,6 +6,8 @@
6
6
  "advisoriesCovering": "function",
7
7
  "advisoryRangeCovers": "function",
8
8
  "advisoryRangeProblem": "function",
9
+ "allSections": "function",
10
+ "applyDeployOutcome": "function",
9
11
  "applyPolicyUpdate": "function",
10
12
  "blockingAdvisories": "function",
11
13
  "buildComplianceAuditConditions": "function",
@@ -18,26 +20,28 @@
18
20
  "buildPipelineTemplateConditions": "function",
19
21
  "buildPluginConditions": "function",
20
22
  "buildPublishedRuleCatalogConditions": "function",
23
+ "classifyFailure": "function",
21
24
  "closeConnection": "function",
25
+ "closeFixedExposures": "function",
22
26
  "closePublicReader": "function",
23
27
  "COMMUNITY_PUBLISHER_HANDLE": "value",
24
28
  "compareSemver": "function",
25
29
  "compareSemverParts": "function",
30
+ "completePeriodsSince": "function",
26
31
  "complianceAuditLog": "value",
27
32
  "complianceExemption": "value",
28
33
  "complianceNotificationLog": "value",
29
34
  "complianceNotificationPreference": "value",
30
35
  "compliancePolicy": "value",
31
- "complianceReport": "value",
32
- "complianceReportSchedule": "value",
33
- "complianceRole": "value",
34
36
  "complianceRule": "value",
35
37
  "complianceRuleHistory": "value",
36
38
  "complianceRuleSubscription": "value",
37
39
  "complianceScan": "value",
38
40
  "complianceScanSchedule": "value",
41
+ "composeSnapshot": "function",
39
42
  "Connection": "class",
40
43
  "ConnectionRetryStrategy": "class",
44
+ "correlateIncident": "function",
41
45
  "createSoftDeletePurgeScheduler": "function",
42
46
  "CrudService": "class",
43
47
  "currentViewerUserId": "function",
@@ -45,6 +49,8 @@
45
49
  "dashboardPanel": "value",
46
50
  "db": "value",
47
51
  "DEFAULT_CONSUMPTION_POLICY": "value",
52
+ "DEFAULT_SHARE_LINK_TTL_DAYS": "value",
53
+ "DEFAULT_THRESHOLDS": "value",
48
54
  "deploymentOutcome": "value",
49
55
  "DIRECTORY_SORTS": "value",
50
56
  "DIRECTORY_TIERS": "value",
@@ -53,40 +59,63 @@
53
59
  "drizzleListingSource": "function",
54
60
  "drizzleRows": "function",
55
61
  "ecosystemAutoApprovalRule": "value",
56
- "ecosystemCollection": "value",
57
62
  "ecosystemNotificationQueue": "value",
58
63
  "ecosystemReservedName": "value",
59
64
  "ecosystemSearchMiss": "value",
60
65
  "ecosystemSetting": "value",
61
66
  "effectiveConsumptionPolicy": "function",
67
+ "evaluateNeedsAttention": "function",
62
68
  "executeRows": "function",
69
+ "FAILURE_CATEGORY_LABELS": "value",
70
+ "getAdoption": "function",
63
71
  "getConnection": "function",
72
+ "getFailureAnalysis": "function",
73
+ "getOutdatedPlugins": "function",
74
+ "getPipelineBreakdown": "function",
75
+ "getPluginVulnerabilities": "function",
76
+ "getPromotionView": "function",
64
77
  "getPublicListedVersion": "function",
65
78
  "getPublicListing": "function",
66
79
  "getPublicReaderDb": "function",
80
+ "getResourceConsumption": "function",
81
+ "getSection": "function",
67
82
  "getSslConfig": "function",
83
+ "getStagePerformance": "function",
84
+ "getTemplate": "function",
68
85
  "getTenantContext": "function",
86
+ "hashToken": "function",
69
87
  "implicitInstallRange": "function",
70
88
  "incident": "value",
71
89
  "ingestHealth": "value",
72
90
  "INSTALL_VERSION_POLICIES": "value",
73
91
  "installAdmits": "function",
74
92
  "installModeFor": "function",
93
+ "isDeployEvent": "function",
75
94
  "isPublicReaderConfigured": "function",
95
+ "isTeamActionable": "function",
76
96
  "isUniqueViolation": "function",
77
97
  "isVersionRange": "function",
98
+ "lapsedAcceptances": "function",
99
+ "leadTimeGapOf": "function",
78
100
  "listedPluginRecord": "function",
79
101
  "listedVersionWarnings": "function",
102
+ "listEnabledAlertDestinations": "function",
80
103
  "listingBlock": "function",
81
104
  "listPublicCategories": "function",
82
105
  "listPublicListingsForSitemap": "function",
83
106
  "listPublicReviews": "function",
84
107
  "loadOrgInstallContext": "function",
108
+ "LOW_SAMPLE_THRESHOLD": "value",
109
+ "MAX_BOUNCES": "value",
110
+ "MAX_SHARE_LINK_TTL_DAYS": "value",
85
111
  "message": "value",
86
112
  "messageAttachment": "value",
113
+ "mintToken": "function",
114
+ "nextPeriodBoundary": "function",
87
115
  "normalizeQuery": "function",
88
116
  "OFFICIAL_PUBLISHER_HANDLE": "value",
89
117
  "OPEN_PUBLISH_REQUEST_STATUSES": "value",
118
+ "openExposures": "function",
90
119
  "orgAlertDestination": "value",
91
120
  "orgAlertRule": "value",
92
121
  "orgListingStates": "function",
@@ -121,23 +150,57 @@
121
150
  "publicReviews": "value",
122
151
  "publisher": "value",
123
152
  "PUBLISHER_TIERS": "value",
153
+ "rebuildDay": "function",
154
+ "refreshLatestForPlugin": "function",
155
+ "registerSection": "function",
156
+ "rejectUnreportablePeriod": "function",
157
+ "renderReportHtml": "function",
158
+ "replacePipelineResolution": "function",
159
+ "REPORT_CADENCES": "value",
160
+ "REPORT_FEATURE_SUBSTITUTES": "value",
161
+ "REPORT_PAUSE_REASONS": "value",
162
+ "REPORT_RUN_STATUSES": "value",
163
+ "REPORT_SCOPE_KINDS": "value",
164
+ "REPORT_TEMPLATE_SPECS": "value",
165
+ "REPORT_TEMPLATES": "value",
166
+ "reportDefinition": "value",
167
+ "reportFileName": "function",
124
168
  "reportingService": "value",
125
169
  "ReportingService": "class",
170
+ "reportRecipient": "value",
171
+ "reportRun": "value",
172
+ "reportShareLink": "value",
126
173
  "resolvableListings": "function",
127
174
  "resolveListingReference": "function",
175
+ "resolvePeriod": "function",
176
+ "resolvePeriodByLabel": "function",
128
177
  "resultRows": "function",
129
178
  "REVIEW_REPORT_CATEGORIES": "value",
130
179
  "REVIEW_SORTS": "value",
180
+ "rollupBatchDays": "function",
181
+ "rollupSettleHours": "function",
182
+ "runRollupPass": "function",
131
183
  "runSoftDeletePurge": "function",
132
184
  "runWithTenantContext": "function",
133
185
  "satisfiesVersionSpec": "function",
134
186
  "schema": "value",
135
187
  "scopeOrgIds": "function",
136
188
  "searchPublicListings": "function",
189
+ "sectionIds": "function",
137
190
  "semverOrderBy": "function",
138
191
  "softDeleteRetentionMs": "function",
192
+ "stakeholderReportStore": "value",
193
+ "StakeholderReportStore": "class",
139
194
  "tenantContext": "value",
140
195
  "testConnection": "function",
196
+ "thresholdsFrom": "function",
197
+ "trendSentence": "function",
198
+ "triageExposure": "function",
199
+ "upsertDeployments": "function",
200
+ "upsertExposures": "function",
201
+ "utcDayStart": "function",
202
+ "VERIFICATION_TTL_MS": "value",
203
+ "versionGap": "function",
141
204
  "viewerCacheSegment": "function",
142
205
  "withTenantTx": "function",
143
206
  "withViewerContext": "function"
package/package.json CHANGED
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "drizzle-orm": "0.45.3",
28
28
  "pg": "8.23.0",
29
- "@pipeline-builder/api-core": "4.1.22"
29
+ "@pipeline-builder/api-core": "5.0.1"
30
30
  },
31
31
  "keywords": [
32
32
  "ci-cd",
@@ -66,7 +66,7 @@
66
66
  "cli"
67
67
  ],
68
68
  "engines": {
69
- "node": ">= 24.14.0"
69
+ "node": ">= 24.21.0"
70
70
  },
71
71
  "devEngines": {
72
72
  "packageManager": {
@@ -82,7 +82,7 @@
82
82
  "access": "public",
83
83
  "registry": "https://registry.npmjs.org/"
84
84
  },
85
- "version": "4.1.24",
85
+ "version": "4.1.26",
86
86
  "bugs": {
87
87
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
88
88
  },
@@ -150,6 +150,7 @@
150
150
  "src/**/*.ts",
151
151
  "!src/**/*.d.ts",
152
152
  "!src/testing/**",
153
+ "!src/api/reporting/stakeholder/index.ts",
153
154
  "!src/api/reporting/types.ts",
154
155
  "!src/core/query-filters.ts",
155
156
  "!src/database/index.ts",