@pipeline-builder/pipeline-data 4.1.14 → 4.1.16

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 (60) hide show
  1. package/lib/api/access-control-builder.d.ts +18 -1
  2. package/lib/api/access-control-builder.js +19 -6
  3. package/lib/api/crud-service.d.ts +94 -36
  4. package/lib/api/crud-service.js +188 -166
  5. package/lib/api/plugin-resolution.d.ts +253 -0
  6. package/lib/api/plugin-resolution.js +649 -0
  7. package/lib/api/public-directory.d.ts +281 -0
  8. package/lib/api/public-directory.js +457 -0
  9. package/lib/api/query-builders.d.ts +13 -0
  10. package/lib/api/query-builders.js +74 -9
  11. package/lib/api/reporting/caches.js +4 -4
  12. package/lib/api/reporting/dora-scoring.d.ts +3 -3
  13. package/lib/api/reporting/dora-scoring.js +4 -4
  14. package/lib/api/reporting/dora.d.ts +6 -6
  15. package/lib/api/reporting/dora.js +97 -73
  16. package/lib/api/reporting/plugin-runtime.d.ts +25 -0
  17. package/lib/api/reporting/plugin-runtime.js +106 -0
  18. package/lib/api/reporting/query-scope.d.ts +8 -2
  19. package/lib/api/reporting/query-scope.js +16 -7
  20. package/lib/api/reporting/retention.d.ts +4 -10
  21. package/lib/api/reporting/retention.js +8 -11
  22. package/lib/api/reporting/sql-helpers.d.ts +4 -7
  23. package/lib/api/reporting/sql-helpers.js +8 -9
  24. package/lib/api/reporting/types.d.ts +55 -17
  25. package/lib/api/reporting/types.js +1 -1
  26. package/lib/api/reporting-service.d.ts +35 -26
  27. package/lib/api/reporting-service.js +245 -161
  28. package/lib/api/semver-range.d.ts +73 -0
  29. package/lib/api/semver-range.js +227 -0
  30. package/lib/api/soft-delete-sweep.js +8 -20
  31. package/lib/core/query-filters.d.ts +18 -3
  32. package/lib/core/query-filters.js +1 -1
  33. package/lib/database/drizzle-schema.d.ts +7790 -2461
  34. package/lib/database/drizzle-schema.js +29 -1
  35. package/lib/database/index.d.ts +4 -2
  36. package/lib/database/index.js +5 -3
  37. package/lib/database/pg-result.d.ts +19 -0
  38. package/lib/database/pg-result.js +32 -0
  39. package/lib/database/postgres-connection.js +14 -24
  40. package/lib/database/public-reader.d.ts +14 -0
  41. package/lib/database/public-reader.js +68 -0
  42. package/lib/database/retry-strategy.d.ts +3 -5
  43. package/lib/database/retry-strategy.js +4 -6
  44. package/lib/database/schema/compliance.d.ts +16 -34
  45. package/lib/database/schema/compliance.js +4 -4
  46. package/lib/database/schema/dashboard.js +4 -2
  47. package/lib/database/schema/ecosystem.d.ts +6586 -0
  48. package/lib/database/schema/ecosystem.js +709 -0
  49. package/lib/database/schema/message.d.ts +6 -12
  50. package/lib/database/schema/message.js +3 -1
  51. package/lib/database/schema/pipeline.d.ts +79 -5
  52. package/lib/database/schema/pipeline.js +46 -25
  53. package/lib/database/schema/plugin.d.ts +587 -3
  54. package/lib/database/schema/plugin.js +86 -14
  55. package/lib/database/tenancy.d.ts +6 -7
  56. package/lib/database/tenancy.js +13 -14
  57. package/lib/index.d.ts +7 -4
  58. package/lib/index.js +7 -4
  59. package/lib/testing/exports.json +146 -0
  60. package/package.json +44 -7
@@ -1,12 +1,16 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
4
- import { and, eq, ilike, isNull, not, or, gte, lte, sql, SQL } from 'drizzle-orm';
4
+ import { and, asc, desc, eq, ilike, isNull, not, or, gte, lte, sql, SQL } from 'drizzle-orm';
5
5
  import { AccessControlQueryBuilder, buildJsonbKeywordCondition, escapeLikeWildcards, normalizeStringFilter, parseBooleanFilter, } from './access-control-builder.js';
6
+ import { isVersionRange, semverOrderBy, versionSpecCondition } from './semver-range.js';
6
7
  import { schema, } from '../database/drizzle-schema.js';
7
8
  // Query builder instances
8
9
  const pipelineBuilder = new AccessControlQueryBuilder(schema.pipeline);
9
- const pluginBuilder = new AccessControlQueryBuilder(schema.plugin);
10
+ // A system-org plugin reaches other orgs only as an Official LISTING, resolved
11
+ // through the org's (explicit or implicit) install — see plugin-resolution.ts —
12
+ // never through `visibility = 'public'` on its `plugins` row.
13
+ const pluginBuilder = new AccessControlQueryBuilder(schema.plugin, { systemCatalog: false });
10
14
  const pipelineTemplateBuilder = new AccessControlQueryBuilder(schema.pipelineTemplate);
11
15
  /**
12
16
  * Equality predicate for a filter's `id` (a single string, or the first id of a
@@ -92,6 +96,35 @@ export function buildPipelineConditions(filter, orgId, parentOrgId) {
92
96
  }
93
97
  return conditions;
94
98
  }
99
+ /**
100
+ * THE ranking for resolving one plugin ROW by name (`/plugins/lookup`,
101
+ * `/plugins/find`, the pipeline service's contract check) — one definition so
102
+ * synth and the contract check never pick different winners. Rows are only the
103
+ * org's own and its parent's: the Official catalog and every other publisher
104
+ * resolve as LISTINGS afterwards (plugin-resolution.ts).
105
+ * 1. owner — the caller's own org, then its parent org (a team reads the
106
+ * parent's shared rows), then anything else a superadmin can see;
107
+ * 2. the default version;
108
+ * 3. the highest semver (so `^1.2` resolves to the newest matching release);
109
+ * 4. `id`, a total tiebreak.
110
+ */
111
+ export function pluginResolutionOrderBy(orgId, parentOrgId) {
112
+ const ownerRank = orgId
113
+ ? parentOrgId
114
+ ? sql `CASE ${schema.plugin.orgId} WHEN ${orgId} THEN 0 WHEN ${parentOrgId} THEN 1 ELSE 2 END`
115
+ : sql `CASE ${schema.plugin.orgId} WHEN ${orgId} THEN 0 ELSE 2 END`
116
+ : null;
117
+ return [
118
+ ...(ownerRank ? [ownerRank] : []),
119
+ desc(schema.plugin.isDefault),
120
+ ...semverOrderBy(schema.plugin.version),
121
+ asc(schema.plugin.id),
122
+ ];
123
+ }
124
+ /** A plugin version that has not been yanked (timestamp and lifecycle agree). */
125
+ function notYanked() {
126
+ return [isNull(schema.plugin.yankedAt), sql `${schema.plugin.lifecycle} <> 'yanked'`];
127
+ }
95
128
  /**
96
129
  * Build SQL conditions for plugin queries
97
130
  *
@@ -109,11 +142,26 @@ export function buildPluginConditions(filter, orgId, parentOrgId) {
109
142
  if (filter.orgId !== undefined) {
110
143
  conditions.push(eq(schema.plugin.orgId, normalizeStringFilter(filter.orgId)));
111
144
  }
145
+ // Substring search for the list / search UI; EXACT for resolution (the
146
+ // lookup path sets `nameMatch: 'exact'`) so `trivy` never resolves to
147
+ // `trivy-scan` or another org's `my-trivy`.
112
148
  if (filter.name !== undefined) {
113
- conditions.push(ilike(schema.plugin.name, `%${escapeLikeWildcards(normalizeStringFilter(filter.name))}%`));
114
- }
149
+ const name = normalizeStringFilter(filter.name);
150
+ conditions.push(filter.nameMatch === 'exact'
151
+ ? eq(schema.plugin.name, name)
152
+ : ilike(schema.plugin.name, `%${escapeLikeWildcards(name)}%`));
153
+ }
154
+ // Exact version, or a semver range / `latest` (see semver-range.ts). A range
155
+ // never resolves to a yanked version: yank stops a version resolving for
156
+ // new synths, while an exact pin still finds it (so the caller can explain).
115
157
  if (filter.version !== undefined) {
116
- conditions.push(eq(schema.plugin.version, filter.version));
158
+ const spec = filter.version;
159
+ conditions.push(versionSpecCondition(schema.plugin.version, spec));
160
+ if (isVersionRange(spec))
161
+ conditions.push(...notYanked());
162
+ }
163
+ if (filter.excludeYanked === true) {
164
+ conditions.push(...notYanked());
117
165
  }
118
166
  if (filter.keyword !== undefined) {
119
167
  conditions.push(buildJsonbKeywordCondition(schema.plugin.keywords, normalizeStringFilter(filter.keyword)));
@@ -186,8 +234,9 @@ export function buildMessageConditions(filter, orgId) {
186
234
  // org-wide rows (recipient_user_id IS NULL) stay visible to everyone in the
187
235
  // org. Absent a viewer id, the recipient side sees org-wide rows only, so a
188
236
  // targeted message never leaks to other members (it stays visible to its
189
- // target, the sender org, and the system org). The SENDER branch is
190
- // unconditional — you always see what you sent, targeted or not.
237
+ // target, the sender org, and the system org). The SENDER branch shows what
238
+ // your org sent — except a reply your org's TARGETED user wrote inside their
239
+ // private thread, which stays private to them (see `senderVisible`).
191
240
  if (normalizedOrgId === SYSTEM_ORG_ID) {
192
241
  // System org can see all messages
193
242
  }
@@ -195,7 +244,23 @@ export function buildMessageConditions(filter, orgId) {
195
244
  const recipientVisible = filter.viewerUserId
196
245
  ? or(isNull(schema.message.recipientUserId), eq(schema.message.recipientUserId, filter.viewerUserId))
197
246
  : isNull(schema.message.recipientUserId);
198
- conditions.push(or(eq(schema.message.orgId, normalizedOrgId), and(eq(schema.message.recipientOrgId, normalizedOrgId), recipientVisible),
247
+ // Sender side of a PRIVATE thread: a reply authored by the org that holds a
248
+ // user-targeted root (the targeted user answering) carries `org_id` = that
249
+ // org, so the unconditional sender branch showed the private exchange to
250
+ // every one of its members. Such a reply is visible on its own org's side
251
+ // only to the root's target user; with no viewer it is hidden (fail-closed).
252
+ // Every other row (roots, replies in untargeted threads, replies in a thread
253
+ // targeted at SOMEONE ELSE's org) keeps the unconditional sender view.
254
+ const privateRootForOtherViewer = filter.viewerUserId
255
+ ? sql `root.recipient_user_id IS NOT NULL AND root.recipient_user_id <> ${filter.viewerUserId}`
256
+ : sql `root.recipient_user_id IS NOT NULL`;
257
+ const senderVisible = or(isNull(schema.message.threadId), sql `NOT EXISTS (
258
+ SELECT 1 FROM ${schema.message} AS root
259
+ WHERE root.id = ${schema.message.threadId}
260
+ AND lower(root.recipient_org_id) = ${normalizedOrgId}
261
+ AND ${privateRootForOtherViewer}
262
+ )`);
263
+ conditions.push(or(and(eq(schema.message.orgId, normalizedOrgId), senderVisible), and(eq(schema.message.recipientOrgId, normalizedOrgId), recipientVisible),
199
264
  // Broadcast (announcements). Self-defending: only ever org-wide rows —
200
265
  // a mis-created '*' + per-user row can't leak to every org.
201
266
  and(eq(schema.message.recipientOrgId, '*'), isNull(schema.message.recipientUserId))));
@@ -464,4 +529,4 @@ export function buildComplianceScanConditions(filter, orgId) {
464
529
  }
465
530
  return conditions;
466
531
  }
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWxGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsa0JBQWtCLEdBQ25CLE1BQU0sNkJBQTZCLENBQUM7QUFZckMsT0FBTyxFQUNMLE1BQU0sR0FNUCxNQUFNLCtCQUErQixDQUFDO0FBRXZDLDBCQUEwQjtBQUMxQixNQUFNLGVBQWUsR0FBRyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RSxNQUFNLGFBQWEsR0FBRyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRSxNQUFNLHVCQUF1QixHQUFHLElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFFdkY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxRQUFRLENBQUMsR0FBYyxFQUFFLEVBQXFCO0lBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztJQUNy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ckMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCwgdHlwZSBMaWZlY3ljbGUgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGVxLCBpbGlrZSwgaXNOdWxsLCBub3QsIG9yLCBndGUsIGx0ZSwgc3FsLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxuICBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbixcbiAgZXNjYXBlTGlrZVdpbGRjYXJkcyxcbiAgbm9ybWFsaXplU3RyaW5nRmlsdGVyLFxuICBwYXJzZUJvb2xlYW5GaWx0ZXIsXG59IGZyb20gJy4vYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lc3NhZ2VGaWx0ZXIsXG4gIFBpcGVsaW5lRmlsdGVyLFxuICBQaXBlbGluZVRlbXBsYXRlRmlsdGVyLFxuICBQbHVnaW5GaWx0ZXIsXG4gIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIsXG4gIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICBDb21wbGlhbmNlQXVkaXRGaWx0ZXIsXG4gIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxufSBmcm9tICcuLi9jb3JlL3F1ZXJ5LWZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgc2NoZW1hLFxuICB0eXBlIE1lc3NhZ2VQcmlvcml0eSxcbiAgdHlwZSBNZXNzYWdlVHlwZSxcbiAgdHlwZSBSdWxlVGFyZ2V0LFxuICB0eXBlIFJ1bGVTZXZlcml0eSxcbiAgdHlwZSBSdWxlU2NvcGUsXG59IGZyb20gJy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcblxuLy8gUXVlcnkgYnVpbGRlciBpbnN0YW5jZXNcbmNvbnN0IHBpcGVsaW5lQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5waXBlbGluZSk7XG5jb25zdCBwbHVnaW5CdWlsZGVyID0gbmV3IEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIoc2NoZW1hLnBsdWdpbik7XG5jb25zdCBwaXBlbGluZVRlbXBsYXRlQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlKTtcblxuLyoqXG4gKiBFcXVhbGl0eSBwcmVkaWNhdGUgZm9yIGEgZmlsdGVyJ3MgYGlkYCAoYSBzaW5nbGUgc3RyaW5nLCBvciB0aGUgZmlyc3QgaWQgb2YgYVxuICogbGlzdCkuIEFuIEVNUFRZIGxpc3QgY2FycmllcyBubyB2YWxpZCBpZCwgc28gaW5zdGVhZCBvZiBwcm9kdWNpbmcgYSBtYWxmb3JtZWRcbiAqIGBlcShjb2wsIHVuZGVmaW5lZClgICh3aGljaCBQb3N0Z3JlcyB3b3VsZCByZWplY3QgLyB0cmVhdCB1bnByZWRpY3RhYmx5KSBpdFxuICogeWllbGRzIHRoZSBmYWlsLWNsb3NlZCBJTVBPU1NJQkxFIHByZWRpY2F0ZSDigJQgYW4gZW1wdHkgaWQgZmlsdGVyIG1hdGNoZXMgbm9cbiAqIHJvd3MsIGNvbnNpc3RlbnQgd2l0aCBcIm5vIGlkIGdpdmVuIOKHkiBub3RoaW5nIHNlbGVjdGVkXCIuXG4gKi9cbmZ1bmN0aW9uIGlkRXF1YWxzKGNvbDogQW55Q29sdW1uLCBpZDogc3RyaW5nIHwgc3RyaW5nW10pOiBTUUwge1xuICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICByZXR1cm4gaWQubGVuZ3RoID4gMCA/IGVxKGNvbCwgaWRbMF0pIDogSU1QT1NTSUJMRTtcbiAgfVxuICByZXR1cm4gZXEoY29sLCBpZCk7XG59XG5cbi8qKlxuICogUHVzaCB0aGUgc2hhcmVkIFwiaXNBY3RpdmVcIiBjb25kaXRpb246XG4gKiAtIGV4cGxpY2l0IGBpc0FjdGl2ZWAg4oaSIGBlcShjb2wsIGJvb2wpYDtcbiAqIC0gb3RoZXJ3aXNlIGRlZmF1bHQgdG8gYWN0aXZlLW9ubHksIEVYQ0VQVCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgaWQgc28gYVxuICogICBgZmluZEJ5SWRgIG9mIGFuIGluYWN0aXZlIHJvdyBzdGlsbCByZXR1cm5zIGl0LiBQYXNzIGBoYXNJZD1mYWxzZWAgdG8gYWx3YXlzXG4gKiAgIGRlZmF1bHQgKGUuZy4gdGhlIHB1Ymxpc2hlZC1jYXRhbG9nIGJyb3dzZSwgd2hpY2ggbmV2ZXIga2V5cyBvZmYgaWQpLlxuICovXG5mdW5jdGlvbiBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnM6IFNRTFtdLCBjb2w6IEFueUNvbHVtbiwgaXNBY3RpdmU6IHVua25vd24sIGhhc0lkOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChpc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbCwgcGFyc2VCb29sZWFuRmlsdGVyKGlzQWN0aXZlKSkpO1xuICB9IGVsc2UgaWYgKCFoYXNJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2wsIHRydWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhaWwtY2xvc2VkIG9yZyBndWFyZCBmb3IgY29tcGxpYW5jZSBidWlsZGVycyB3aG9zZSBvbmx5IHRlbmFuY3kgZ2F0ZSBpcyB0aGVcbiAqIGFwcC1sYXllciBgb3JnSWRgIHByZWRpY2F0ZS4gV2hlbiBgb3JnSWRgIGlzIGFic2VudCB3ZSBlbWl0IGFuIGltcG9zc2libGVcbiAqIHByZWRpY2F0ZSBzbyB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MgcmF0aGVyIHRoYW4gbGVha2luZyBhY3Jvc3MgdGVuYW50c1xuICogKG1pcnJvcnMgdGhlIGFub255bW91cyBmYWxsYmFjayBpbiBhY2Nlc3MtY29udHJvbC1idWlsZGVyLnRzKS5cbiAqL1xuY29uc3QgSU1QT1NTSUJMRTogU1FMID0gc3FsYGZhbHNlYDtcblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUgcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGlzIHRoZSBzaGFyZWQgdGhyZWUtcnVuZyBgdmlzaWJpbGl0eWAgbGFkZGVyIOKAlCBzZWVcbiAqIGBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLmJ1aWxkQWNjZXNzQ29udHJvbGAgZm9yIHRoZSBmdWxsIHByZWRpY2F0ZS5cbiAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIHdpZGVucyB0aGUgY2F0YWxvZyB2aWV3IHNvIGEgdGVhbSBvcmdcbiAqIGFsc28gc2VlcyBpdHMgcGFyZW50J3MgcHVibGljIHBpcGVsaW5lcy5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGlwZWxpbmUgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgYW5vbnltb3VzIGdldHMgc3lzdGVtIHB1YmxpYyBvbmx5KVxuICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gUGFyZW50IG9yZyBJRCB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICAvLyBVc2UgZ2VuZXJpYyBidWlsZGVyIGZvciBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wsIElELCBib29sZWFucywgdmlzaWJpbGl0eSlcbiAgY29uc3QgY29uZGl0aW9ucyA9IHBpcGVsaW5lQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEV4cGxpY2l0IG93bmVyLW9yZyBuYXJyb3dpbmcsIGFzIHRoZSBwbHVnaW4gYW5kIHRlbXBsYXRlIGJ1aWxkZXJzIGFscmVhZHlcbiAgLy8gZG8uIFRoZSBzY2hlbWEgYWNjZXB0cyBgP29yZ0lkPWAgZm9yIHBpcGVsaW5lcyB0b28sIGJ1dCB0aGlzIGJ1aWxkZXIgZHJvcHBlZFxuICAvLyBpdCwgc28gdGhlIGZpbHRlciBzaWxlbnRseSBkaWQgbm90aGluZy4gSXQgaXMgQU5EJ2Qgb250byB0aGUgYWNjZXNzXG4gIC8vIHByZWRpY2F0ZSBhYm92ZSwgc28gaXQgY2FuIG9ubHkgTkFSUk9XIHRoZSB2aXNpYmxlIHNldCwgbmV2ZXIgd2lkZW4gaXQuXG4gIGlmIChmaWx0ZXIub3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQpKSk7XG4gIH1cblxuICAvLyBBZGQgcGlwZWxpbmUtc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLnByb2plY3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUucHJvamVjdCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5wcm9qZWN0KSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5vcmdhbml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnYW5pemF0aW9uLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ2FuaXphdGlvbikpKTtcbiAgfVxuXG4gIC8vIEV4YWN0LW1hdGNoIG5hbWUgZmlsdGVyIChtaXJyb3JzIHRoZSBzaWJsaW5nIGBwcm9qZWN0YC9gb3JnYW5pemF0aW9uYFxuICAvLyBwcmVkaWNhdGVzKS4gVGhlIENMSSdzIGAtLXBpcGVsaW5lLW5hbWVgIGlzIGRvY3VtZW50ZWQgYXMgYW4gZXhhY3QgZmlsdGVyLFxuICAvLyBzbyB0aGlzIHVzZXMgYGVxYCByYXRoZXIgdGhhbiBhbiBJTElLRSBjb250YWlucy4gTnVsbC1zYWZlOiBhYnNlbnRcbiAgLy8gcGlwZWxpbmVOYW1lIOKHkiBubyBwcmVkaWNhdGUuXG4gIGlmIChmaWx0ZXIucGlwZWxpbmVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLnBpcGVsaW5lTmFtZSwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5waXBlbGluZU5hbWUpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmUua2V5d29yZHMsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIua2V5d29yZCkpKTtcbiAgfVxuXG4gIC8vIERldmVsb3Blci1wb3J0YWwgY2F0YWxvZyBmaWx0ZXJzIChvd25lciAvIGxpZmVjeWNsZSkuXG4gIGlmIChmaWx0ZXIub3duZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUubGlmZWN5Y2xlLCBmaWx0ZXIubGlmZWN5Y2xlIGFzIExpZmVjeWNsZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIHBsdWdpbiBxdWVyaWVzXG4gKlxuICogQWNjZXNzIGNvbnRyb2wgaXMgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIg4oCUIHNlZVxuICogYEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIuYnVpbGRBY2Nlc3NDb250cm9sYC5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGx1Z2luIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQbHVnaW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCB2aXNpYmlsaXR5KVxuICBjb25zdCBjb25kaXRpb25zID0gcGx1Z2luQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEFkZCBwbHVnaW4tc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdJZCkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5wbHVnaW4ubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4udmVyc2lvbiwgZmlsdGVyLnZlcnNpb24gYXMgc3RyaW5nKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGx1Z2luLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5jYXRlZ29yeSwgZmlsdGVyLmNhdGVnb3J5IGFzIHN0cmluZykpO1xuICB9XG5cbiAgLy8gRGV2ZWxvcGVyLXBvcnRhbCBjYXRhbG9nIGZpbHRlcnMgKG93bmVyIC8gbGlmZWN5Y2xlKS5cbiAgaWYgKGZpbHRlci5vd25lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLmxpZmVjeWNsZSwgZmlsdGVyLmxpZmVjeWNsZSBhcyBMaWZlY3ljbGUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBwaXBlbGluZS10ZW1wbGF0ZSBxdWVyaWVzLlxuICpcbiAqIFRlbXBsYXRlcyB3ZXJlIGJyaWVmbHkgdGhlIG9ubHkgZW50aXR5IG9uIHRoZSB0aHJlZS1ydW5nIGxhZGRlciBhbmQgbmVlZGVkIGFcbiAqIGJlc3Bva2UgcHJlZGljYXRlOyBub3cgdGhhdCBldmVyeSBjYXRhbG9nIGVudGl0eSBzaGFyZXMgaXQsIHRoZXkgYXJlIGJhY2sgb25cbiAqIHRoZSBTQU1FIGBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyYCBhcyBwaXBlbGluZXMgYW5kIHBsdWdpbnMuIFZpc2liaWxpdHlcbiAqIHNlbWFudGljcyBsaXZlIGluIG9uZSBwbGFjZSDigJQgc2VlIGBidWlsZEFjY2Vzc0NvbnRyb2xgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQaXBlbGluZVRlbXBsYXRlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lVGVtcGxhdGVGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBwaXBlbGluZVRlbXBsYXRlQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIE9wdGlvbmFsIG5hcnJvd2luZyB0byBhIHNwZWNpZmljIG9yZyB3aXRoaW4gdGhlIGNhbGxlcidzIHZpc2liaWxpdHkgKG1pcnJvcnNcbiAgLy8gdGhlIHBsdWdpbiBidWlsZGVyKS4gQWNjZXNzIGNvbnRyb2wgYWJvdmUgc3RpbGwgYm91bmRzIHdoYXQncyB2aXNpYmxlLlxuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQgYXMgc3RyaW5nKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIC8vIFZlcmJhdGltIG1hdGNoLCBjb25zaXN0ZW50IHdpdGggdGhlIHBsdWdpbiBidWlsZGVyIChjYXRlZ29yaWVzIGFyZSBzdG9yZWQgYXMtaXMpLlxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUuY2F0ZWdvcnksIGZpbHRlci5jYXRlZ29yeSBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIua2V5d29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm93bmVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5saWZlY3ljbGUsIGZpbHRlci5saWZlY3ljbGUgYXMgTGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgbWVzc2FnZSBxdWVyaWVzLlxuICpcbiAqIEN1c3RvbSBhY2Nlc3MgY29udHJvbCBmb3IgbWVzc2FnZXM6XG4gKiAtIE1lc3NhZ2VzIGFyZSB2aXNpYmxlIHRvIHRoZSBzZW5kZXIgb3JnIChvcmdJZCkgT1IgdGhlIHJlY2lwaWVudCBvcmcgKHJlY2lwaWVudE9yZ0lkKVxuICogLSBCcm9hZGNhc3QgYW5ub3VuY2VtZW50cyAocmVjaXBpZW50T3JnSWQgPSAnKicpIGFyZSB2aXNpYmxlIHRvIGFsbCBvcmdzXG4gKiAtIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gTWVzc2FnZSBmaWx0ZXIgY3JpdGVyaWFcbiAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSURcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1lc3NhZ2VDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8TWVzc2FnZUZpbHRlcj4sXG4gIG9yZ0lkOiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG4gIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ3VzdG9tIGFjY2VzcyBjb250cm9sOiBzZW5kZXIgT1IgcmVjaXBpZW50IE9SIGJyb2FkY2FzdC5cbiAgLy9cbiAgLy8gUGVyLXVzZXIgdGFyZ2V0aW5nOiBhIHJvdyB3aXRoIGByZWNpcGllbnRfdXNlcl9pZGAgc2V0IGlzIHByaXZhdGUgdG8gdGhhdFxuICAvLyB1c2VyIFdJVEhJTiB0aGUgcmVjaXBpZW50IG9yZy4gVGhlIHJlY2lwaWVudC1zaWRlIGJyYW5jaCB0aGVyZWZvcmUgYWRtaXRzIGFcbiAgLy8gdGFyZ2V0ZWQgcm93IG9ubHkgd2hlbiB0aGUgdmlld2VyIElTIHRoYXQgdXNlciAoYGZpbHRlci52aWV3ZXJVc2VySWRgKTtcbiAgLy8gb3JnLXdpZGUgcm93cyAocmVjaXBpZW50X3VzZXJfaWQgSVMgTlVMTCkgc3RheSB2aXNpYmxlIHRvIGV2ZXJ5b25lIGluIHRoZVxuICAvLyBvcmcuIEFic2VudCBhIHZpZXdlciBpZCwgdGhlIHJlY2lwaWVudCBzaWRlIHNlZXMgb3JnLXdpZGUgcm93cyBvbmx5LCBzbyBhXG4gIC8vIHRhcmdldGVkIG1lc3NhZ2UgbmV2ZXIgbGVha3MgdG8gb3RoZXIgbWVtYmVycyAoaXQgc3RheXMgdmlzaWJsZSB0byBpdHNcbiAgLy8gdGFyZ2V0LCB0aGUgc2VuZGVyIG9yZywgYW5kIHRoZSBzeXN0ZW0gb3JnKS4gVGhlIFNFTkRFUiBicmFuY2ggaXNcbiAgLy8gdW5jb25kaXRpb25hbCDigJQgeW91IGFsd2F5cyBzZWUgd2hhdCB5b3Ugc2VudCwgdGFyZ2V0ZWQgb3Igbm90LlxuICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgLy8gU3lzdGVtIG9yZyBjYW4gc2VlIGFsbCBtZXNzYWdlc1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlY2lwaWVudFZpc2libGUgPSBmaWx0ZXIudmlld2VyVXNlcklkXG4gICAgICA/IG9yKFxuICAgICAgICBpc051bGwoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkKSxcbiAgICAgICAgZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkLCBmaWx0ZXIudmlld2VyVXNlcklkKSxcbiAgICAgICkhXG4gICAgICA6IGlzTnVsbChzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQpO1xuICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgIG9yKFxuICAgICAgICBlcShzY2hlbWEubWVzc2FnZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgYW5kKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCByZWNpcGllbnRWaXNpYmxlKSEsXG4gICAgICAgIC8vIEJyb2FkY2FzdCAoYW5ub3VuY2VtZW50cykuIFNlbGYtZGVmZW5kaW5nOiBvbmx5IGV2ZXIgb3JnLXdpZGUgcm93cyDigJRcbiAgICAgICAgLy8gYSBtaXMtY3JlYXRlZCAnKicgKyBwZXItdXNlciByb3cgY2FuJ3QgbGVhayB0byBldmVyeSBvcmcuXG4gICAgICAgIGFuZChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgJyonKSwgaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCkpISxcbiAgICAgICkhLFxuICAgICk7XG4gIH1cblxuICAvLyBBY3RpdmUgZmlsdGVyIChkZWZhdWx0IHRvIGFjdGl2ZSBvbmx5KVxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICAvLyBUaHJlYWQgZmlsdGVyIChudWxsID0gcm9vdCBtZXNzYWdlcyBvbmx5IHZpYSBJUyBOVUxMKVxuICBpZiAoZmlsdGVyLnRocmVhZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLnRocmVhZElkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS50aHJlYWRJZCwgZmlsdGVyLnRocmVhZElkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjaXBpZW50IG9yZyBmaWx0ZXJcbiAgaWYgKGZpbHRlci5yZWNpcGllbnRPcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnJlY2lwaWVudE9yZ0lkKSkpO1xuICB9XG5cbiAgLy8gUmVjaXBpZW50IHVzZXIgZmlsdGVyIChleHBsaWNpdCk6IG51bGwg4oaSIG9yZy13aWRlIHJvd3Mgb25seTsgYSB2YWx1ZSDihpJcbiAgLy8gcm93cyB0YXJnZXRlZCBhdCB0aGF0IHVzZXIuIERpc3RpbmN0IGZyb20gYHZpZXdlclVzZXJJZGAsIHdoaWNoIHdpZGVuc1xuICAvLyB2aXNpYmlsaXR5IHJhdGhlciB0aGFuIG5hcnJvd2luZyBpdC5cbiAgaWYgKGZpbHRlci5yZWNpcGllbnRVc2VySWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChmaWx0ZXIucmVjaXBpZW50VXNlcklkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb21wYXJlIHRoZSByYXcgdXNlciBpZCDigJQgY2FzZS1wcmVzZXJ2aW5nLCBtYXRjaGluZyBob3cgaXQncyBzdG9yZWQgYW5kXG4gICAgICAvLyBob3cgYHZpZXdlclVzZXJJZGAgaXMgY29tcGFyZWQgKGRvIE5PVCBsb3dlcmNhc2UgdmlhIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcikuXG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkLCBmaWx0ZXIucmVjaXBpZW50VXNlcklkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWVzc2FnZSB0eXBlIGZpbHRlclxuICBpZiAoZmlsdGVyLm1lc3NhZ2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UubWVzc2FnZVR5cGUsIGZpbHRlci5tZXNzYWdlVHlwZSBhcyBNZXNzYWdlVHlwZSkpO1xuICB9XG5cbiAgLy8gUHJpb3JpdHkgZmlsdGVyXG4gIGlmIChmaWx0ZXIucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5wcmlvcml0eSwgZmlsdGVyLnByaW9yaXR5IGFzIE1lc3NhZ2VQcmlvcml0eSkpO1xuICB9XG5cbiAgLy8gQ2hhbm5lbCBmaWx0ZXIgKG51bGwgPSBubyBjaGFubmVsIC8gb3JnLXRvLW9yZyBtZXNzYWdlcylcbiAgaWYgKGZpbHRlci5jaGFubmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLmNoYW5uZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5jaGFubmVsKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlYWQtc3RhdGUgZmlsdGVyIOKAlCBKU09OQiBrZXktZXhpc3RlbmNlIGNoZWNrIGFnYWluc3QgYHJlYWRfYnlgLlxuICAvLyBXZSB1c2UganNvbmJfZXhpc3RzKHJlYWRfYnksICRvcmdJZCkgcmF0aGVyIHRoYW4gdGhlIGA/YCBvcGVyYXRvclxuICAvLyBiZWNhdXNlIHBvc3RncmVzLWpzIC8gZHJpenpsZSdzIHBhcmFtZXRlciBiaW5kaW5nIHRyZWF0cyBgP2AgYXMgYVxuICAvLyBwbGFjZWhvbGRlciwgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgSlNPTkIgYD9gIG9wZXJhdG9yLlxuICBpZiAoZmlsdGVyLmlzUmVhZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5RXhpc3RzID0gc3FsYGpzb25iX2V4aXN0cygke3NjaGVtYS5tZXNzYWdlLnJlYWRCeX0sICR7bm9ybWFsaXplZE9yZ0lkfSlgO1xuICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIuaXNSZWFkID8ga2V5RXhpc3RzIDogbm90KGtleUV4aXN0cykpO1xuICB9XG5cbiAgLy8gSUQgZmlsdGVyXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpZEVxdWFscyhzY2hlbWEubWVzc2FnZS5pZCwgZmlsdGVyLmlkKSk7XG4gIH1cblxuICAvLyBGcmVlLXRleHQgaW5ib3ggc2VhcmNoIOKAlCBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvdmVyIHN1YmplY3QgT1IgY29udGVudC5cbiAgLy8gV2lsZGNhcmRzIGluIHRoZSB0ZXJtIGFyZSBlc2NhcGVkIHNvIGEgbGl0ZXJhbCBgJWAvYF9gIGlzIG1hdGNoZWQgbGl0ZXJhbGx5O1xuICAvLyBhbiBhbGwtd2hpdGVzcGFjZSB0ZXJtIGlzIGlnbm9yZWQgKG5vLW9wKSByYXRoZXIgdGhhbiBtYXRjaGluZyBldmVyeXRoaW5nLlxuICBpZiAoZmlsdGVyLnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdGVybSA9IG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIuc2VhcmNoKS50cmltKCk7XG4gICAgaWYgKHRlcm0pIHtcbiAgICAgIGNvbnN0IGxpa2UgPSBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyh0ZXJtKX0lYDtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgaWxpa2Uoc2NoZW1hLm1lc3NhZ2Uuc3ViamVjdCwgbGlrZSksXG4gICAgICAgICAgaWxpa2Uoc2NoZW1hLm1lc3NhZ2UuY29udGVudCwgbGlrZSksXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBRdWVyeSBCdWlsZGVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHBvbGljeSBxdWVyaWVzLlxuICpcbiAqIFZpc2liaWxpdHk6XG4gKiAtIFRoZSByZXF1ZXN0aW5nIG9yZydzIG93biBwb2xpY2llcywgQU5EXG4gKiAtIFRoZSBzeXN0ZW0gb3JnJ3MgcG9saWN5IHRlbXBsYXRlcyAoc28gdGhlIHNoYXJlZCBjYXRhbG9nIGlzIGFsd2F5cyB2aXNpYmxlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUG9saWN5RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIG9yKFxuICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBTWVNURU1fT1JHX0lEKSxcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzVGVtcGxhdGUsIHRydWUpLFxuICAgICAgICAgICkhLFxuICAgICAgICApISxcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZhaWwtY2xvc2VkOiBubyBvcmcgY29udGV4dCDih5Igbm8gcm93cyAobmV2ZXIgbGVhayBldmVyeSB0ZW5hbnQncyBwb2xpY2llcykuXG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlkRXF1YWxzKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlkLCBmaWx0ZXIuaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzVGVtcGxhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc1RlbXBsYXRlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzVGVtcGxhdGUpKSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSURcbiAgLy8gKG90aGVyd2lzZSBmaW5kQnlJZCBvZiBhbiBpbmFjdGl2ZSBwb2xpY3kgcmV0dXJucyBub3RoaW5nKS5cbiAgYWN0aXZlRGVmYXVsdChjb25kaXRpb25zLCBzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc0FjdGl2ZSwgZmlsdGVyLmlzQWN0aXZlLCBmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcnVsZSBxdWVyaWVzLlxuICpcbiAqIFZpc2liaWxpdHk6XG4gKiAtIFRoZSByZXF1ZXN0aW5nIG9yZydzIG93biBydWxlcyAoYW55IHNjb3BlKSwgQU5EXG4gKiAtIFRoZSBzeXN0ZW0gb3JnJ3MgcHVibGlzaGVkIHJ1bGVzIChzbyB0aGUgZ2xvYmFsIGNhdGFsb2cgaXMgYWx3YXlzIHZpc2libGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUnVsZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICAgIGFuZChcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgU1lTVEVNX09SR19JRCksXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSksXG4gICAgICAgICAgKSEsXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFpbC1jbG9zZWQ6IG5vIG9yZyBjb250ZXh0IOKHkiBubyByb3dzIChuZXZlciBsZWFrIGV2ZXJ5IHRlbmFudCdzIHJ1bGVzKS5cbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWRFcXVhbHMoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlkLCBmaWx0ZXIuaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5wb2xpY3lJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5wb2xpY3lJZCwgZmlsdGVyLnBvbGljeUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgZmlsdGVyLnNjb3BlIGFzIFJ1bGVTY29wZSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICAvLyBEZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSUQuXG4gIGFjdGl2ZURlZmF1bHQoY29uZGl0aW9ucywgc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBmaWx0ZXIuaXNBY3RpdmUsIGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgYnJvd3NpbmcgdGhlIHB1Ymxpc2hlZCBydWxlcyBjYXRhbG9nLlxuICogT25seSByZXR1cm5zIHN5c3RlbS1vcmcgcHVibGlzaGVkIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQdWJsaXNoZWRSdWxlQ2F0YWxvZ0NvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgLy8gT25seSBzY29wZT0ncHVibGlzaGVkJyBpcyBuZWVkZWQg4oCUIHRoZSBjcmVhdGUgZW5kcG9pbnQgYWxyZWFkeSBlbmZvcmNlc1xuICAvLyB0aGF0IG9ubHkgdGhlIHN5c3RlbSBvcmcgY2FuIGNyZWF0ZSBwdWJsaXNoZWQgcnVsZXMsIHNvIGZpbHRlcmluZyBieSBvcmdJZFxuICAvLyBpcyByZWR1bmRhbnQgYW5kIGJyZWFrcyB3aGVuIHRoZSBzeXN0ZW0gb3JnJ3MgREIgSUQgZGlmZmVycyBmcm9tIFNZU1RFTV9PUkdfSUQuXG4gIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSkpO1xuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2V2ZXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2V2ZXJpdHksIGZpbHRlci5zZXZlcml0eSBhcyBSdWxlU2V2ZXJpdHkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhZ3MsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIudGFnKSkpO1xuICB9XG5cbiAgLy8gVGhlIGNhdGFsb2cgaXMgYWx3YXlzIGFjdGl2ZS1vbmx5IChubyBzaW5nbGUtaWQgZXhlbXB0aW9uIGhlcmUpLlxuICBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnMsIHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pc0FjdGl2ZSwgZmlsdGVyLmlzQWN0aXZlLCBmYWxzZSk7XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9uIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VFeGVtcHRpb25Db25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5vcmdJZCwgb3JnSWQudG9Mb3dlckNhc2UoKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucnVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24ucnVsZUlkLCBmaWx0ZXIucnVsZUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlUeXBlLCBmaWx0ZXIuZW50aXR5VHlwZSBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uZW50aXR5SWQsIGZpbHRlci5lbnRpdHlJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5zdGF0dXMsIGZpbHRlci5zdGF0dXMpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIGF1ZGl0IGxvZyBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlQXVkaXRDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUF1ZGl0RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cub3JnSWQsIG9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5hY3Rpb24sIGZpbHRlci5hY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5yZXN1bHQsIGZpbHRlci5yZXN1bHQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2NhbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5zY2FuSWQsIGZpbHRlci5zY2FuSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZUZyb20gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChndGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlRnJvbSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZVRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2gobHRlKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuY3JlYXRlZEF0LCBuZXcgRGF0ZShmaWx0ZXIuZGF0ZVRvKSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2Ugc2NhbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlU2NhbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlU2NhbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4ub3JnSWQsIG9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50YXJnZXQsIGZpbHRlci50YXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50cmlnZ2VyZWRCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50cmlnZ2VyZWRCeSwgZmlsdGVyLnRyaWdnZXJlZEJ5KSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cbiJdfQ==
532
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBa0IsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBWXhGLE9BQU8sRUFDTCxNQUFNLEdBT1AsTUFBTSwrQkFBK0IsQ0FBQztBQUV2QywwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkUsK0VBQStFO0FBQy9FLGdGQUFnRjtBQUNoRiw4REFBOEQ7QUFDOUQsTUFBTSxhQUFhLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRXZGOzs7Ozs7R0FNRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQWMsRUFBRSxFQUFxQjtJQUNyRCxJQUFJLEtBQUssQ0FBQyxP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QUFXLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQsIHR5cGUgTGlmZWN5Y2xlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBhc2MsIGRlc2MsIGVxLCBpbGlrZSwgaXNOdWxsLCBub3QsIG9yLCBndGUsIGx0ZSwgc3FsLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQgdHlwZSB7IEFueUNvbHVtbiB9IGZyb20gJ2RyaXp6bGUtb3JtL2NvbHVtbic7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxuICBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbixcbiAgZXNjYXBlTGlrZVdpbGRjYXJkcyxcbiAgbm9ybWFsaXplU3RyaW5nRmlsdGVyLFxuICBwYXJzZUJvb2xlYW5GaWx0ZXIsXG59IGZyb20gJy4vYWNjZXNzLWNvbnRyb2wtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1ZlcnNpb25SYW5nZSwgc2VtdmVyT3JkZXJCeSwgdmVyc2lvblNwZWNDb25kaXRpb24gfSBmcm9tICcuL3NlbXZlci1yYW5nZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lc3NhZ2VGaWx0ZXIsXG4gIFBpcGVsaW5lRmlsdGVyLFxuICBQaXBlbGluZVRlbXBsYXRlRmlsdGVyLFxuICBQbHVnaW5GaWx0ZXIsXG4gIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIsXG4gIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICBDb21wbGlhbmNlQXVkaXRGaWx0ZXIsXG4gIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxufSBmcm9tICcuLi9jb3JlL3F1ZXJ5LWZpbHRlcnMuanMnO1xuaW1wb3J0IHtcbiAgc2NoZW1hLFxuICB0eXBlIE1lc3NhZ2VQcmlvcml0eSxcbiAgdHlwZSBNZXNzYWdlVHlwZSxcbiAgdHlwZSBSdWxlVGFyZ2V0LFxuICB0eXBlIFJ1bGVTZXZlcml0eSxcbiAgdHlwZSBSdWxlU2NvcGUsXG4gIHR5cGUgUGx1Z2luTGlmZWN5Y2xlLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYS5qcyc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXIgaW5zdGFuY2VzXG5jb25zdCBwaXBlbGluZUJ1aWxkZXIgPSBuZXcgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcihzY2hlbWEucGlwZWxpbmUpO1xuLy8gQSBzeXN0ZW0tb3JnIHBsdWdpbiByZWFjaGVzIG90aGVyIG9yZ3Mgb25seSBhcyBhbiBPZmZpY2lhbCBMSVNUSU5HLCByZXNvbHZlZFxuLy8gdGhyb3VnaCB0aGUgb3JnJ3MgKGV4cGxpY2l0IG9yIGltcGxpY2l0KSBpbnN0YWxsIOKAlCBzZWUgcGx1Z2luLXJlc29sdXRpb24udHMg4oCUXG4vLyBuZXZlciB0aHJvdWdoIGB2aXNpYmlsaXR5ID0gJ3B1YmxpYydgIG9uIGl0cyBgcGx1Z2luc2Agcm93LlxuY29uc3QgcGx1Z2luQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5wbHVnaW4sIHsgc3lzdGVtQ2F0YWxvZzogZmFsc2UgfSk7XG5jb25zdCBwaXBlbGluZVRlbXBsYXRlQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlKTtcblxuLyoqXG4gKiBFcXVhbGl0eSBwcmVkaWNhdGUgZm9yIGEgZmlsdGVyJ3MgYGlkYCAoYSBzaW5nbGUgc3RyaW5nLCBvciB0aGUgZmlyc3QgaWQgb2YgYVxuICogbGlzdCkuIEFuIEVNUFRZIGxpc3QgY2FycmllcyBubyB2YWxpZCBpZCwgc28gaW5zdGVhZCBvZiBwcm9kdWNpbmcgYSBtYWxmb3JtZWRcbiAqIGBlcShjb2wsIHVuZGVmaW5lZClgICh3aGljaCBQb3N0Z3JlcyB3b3VsZCByZWplY3QgLyB0cmVhdCB1bnByZWRpY3RhYmx5KSBpdFxuICogeWllbGRzIHRoZSBmYWlsLWNsb3NlZCBJTVBPU1NJQkxFIHByZWRpY2F0ZSDigJQgYW4gZW1wdHkgaWQgZmlsdGVyIG1hdGNoZXMgbm9cbiAqIHJvd3MsIGNvbnNpc3RlbnQgd2l0aCBcIm5vIGlkIGdpdmVuIOKHkiBub3RoaW5nIHNlbGVjdGVkXCIuXG4gKi9cbmZ1bmN0aW9uIGlkRXF1YWxzKGNvbDogQW55Q29sdW1uLCBpZDogc3RyaW5nIHwgc3RyaW5nW10pOiBTUUwge1xuICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcbiAgICByZXR1cm4gaWQubGVuZ3RoID4gMCA/IGVxKGNvbCwgaWRbMF0pIDogSU1QT1NTSUJMRTtcbiAgfVxuICByZXR1cm4gZXEoY29sLCBpZCk7XG59XG5cbi8qKlxuICogUHVzaCB0aGUgc2hhcmVkIFwiaXNBY3RpdmVcIiBjb25kaXRpb246XG4gKiAtIGV4cGxpY2l0IGBpc0FjdGl2ZWAg4oaSIGBlcShjb2wsIGJvb2wpYDtcbiAqIC0gb3RoZXJ3aXNlIGRlZmF1bHQgdG8gYWN0aXZlLW9ubHksIEVYQ0VQVCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgaWQgc28gYVxuICogICBgZmluZEJ5SWRgIG9mIGFuIGluYWN0aXZlIHJvdyBzdGlsbCByZXR1cm5zIGl0LiBQYXNzIGBoYXNJZD1mYWxzZWAgdG8gYWx3YXlzXG4gKiAgIGRlZmF1bHQgKGUuZy4gdGhlIHB1Ymxpc2hlZC1jYXRhbG9nIGJyb3dzZSwgd2hpY2ggbmV2ZXIga2V5cyBvZmYgaWQpLlxuICovXG5mdW5jdGlvbiBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnM6IFNRTFtdLCBjb2w6IEFueUNvbHVtbiwgaXNBY3RpdmU6IHVua25vd24sIGhhc0lkOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChpc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKGNvbCwgcGFyc2VCb29sZWFuRmlsdGVyKGlzQWN0aXZlKSkpO1xuICB9IGVsc2UgaWYgKCFoYXNJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShjb2wsIHRydWUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhaWwtY2xvc2VkIG9yZyBndWFyZCBmb3IgY29tcGxpYW5jZSBidWlsZGVycyB3aG9zZSBvbmx5IHRlbmFuY3kgZ2F0ZSBpcyB0aGVcbiAqIGFwcC1sYXllciBgb3JnSWRgIHByZWRpY2F0ZS4gV2hlbiBgb3JnSWRgIGlzIGFic2VudCB3ZSBlbWl0IGFuIGltcG9zc2libGVcbiAqIHByZWRpY2F0ZSBzbyB0aGUgcXVlcnkgcmV0dXJucyB6ZXJvIHJvd3MgcmF0aGVyIHRoYW4gbGVha2luZyBhY3Jvc3MgdGVuYW50c1xuICogKG1pcnJvcnMgdGhlIGFub255bW91cyBmYWxsYmFjayBpbiBhY2Nlc3MtY29udHJvbC1idWlsZGVyLnRzKS5cbiAqL1xuY29uc3QgSU1QT1NTSUJMRTogU1FMID0gc3FsYGZhbHNlYDtcblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUgcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGlzIHRoZSBzaGFyZWQgdGhyZWUtcnVuZyBgdmlzaWJpbGl0eWAgbGFkZGVyIOKAlCBzZWVcbiAqIGBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLmJ1aWxkQWNjZXNzQ29udHJvbGAgZm9yIHRoZSBmdWxsIHByZWRpY2F0ZS5cbiAqIGBwYXJlbnRPcmdJZGAgKG9yZyDihpIgdGVhbSBoaWVyYXJjaHkpIHdpZGVucyB0aGUgY2F0YWxvZyB2aWV3IHNvIGEgdGVhbSBvcmdcbiAqIGFsc28gc2VlcyBpdHMgcGFyZW50J3MgcHVibGljIHBpcGVsaW5lcy5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGlwZWxpbmUgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgYW5vbnltb3VzIGdldHMgc3lzdGVtIHB1YmxpYyBvbmx5KVxuICogQHBhcmFtIHBhcmVudE9yZ0lkIC0gUGFyZW50IG9yZyBJRCB3aGVuIHRoZSBjYWxsZXIgaXMgYSB0ZWFtIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICAvLyBVc2UgZ2VuZXJpYyBidWlsZGVyIGZvciBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wsIElELCBib29sZWFucywgdmlzaWJpbGl0eSlcbiAgY29uc3QgY29uZGl0aW9ucyA9IHBpcGVsaW5lQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEV4cGxpY2l0IG93bmVyLW9yZyBuYXJyb3dpbmcsIGFzIHRoZSBwbHVnaW4gYW5kIHRlbXBsYXRlIGJ1aWxkZXJzIGFscmVhZHlcbiAgLy8gZG8uIFRoZSBzY2hlbWEgYWNjZXB0cyBgP29yZ0lkPWAgZm9yIHBpcGVsaW5lcyB0b28sIGJ1dCB0aGlzIGJ1aWxkZXIgZHJvcHBlZFxuICAvLyBpdCwgc28gdGhlIGZpbHRlciBzaWxlbnRseSBkaWQgbm90aGluZy4gSXQgaXMgQU5EJ2Qgb250byB0aGUgYWNjZXNzXG4gIC8vIHByZWRpY2F0ZSBhYm92ZSwgc28gaXQgY2FuIG9ubHkgTkFSUk9XIHRoZSB2aXNpYmxlIHNldCwgbmV2ZXIgd2lkZW4gaXQuXG4gIGlmIChmaWx0ZXIub3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQpKSk7XG4gIH1cblxuICAvLyBBZGQgcGlwZWxpbmUtc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLnByb2plY3QgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUucHJvamVjdCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5wcm9qZWN0KSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5vcmdhbml6YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUub3JnYW5pemF0aW9uLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ2FuaXphdGlvbikpKTtcbiAgfVxuXG4gIC8vIEV4YWN0LW1hdGNoIG5hbWUgZmlsdGVyIChtaXJyb3JzIHRoZSBzaWJsaW5nIGBwcm9qZWN0YC9gb3JnYW5pemF0aW9uYFxuICAvLyBwcmVkaWNhdGVzKS4gVGhlIENMSSdzIGAtLXBpcGVsaW5lLW5hbWVgIGlzIGRvY3VtZW50ZWQgYXMgYW4gZXhhY3QgZmlsdGVyLFxuICAvLyBzbyB0aGlzIHVzZXMgYGVxYCByYXRoZXIgdGhhbiBhbiBJTElLRSBjb250YWlucy4gTnVsbC1zYWZlOiBhYnNlbnRcbiAgLy8gcGlwZWxpbmVOYW1lIOKHkiBubyBwcmVkaWNhdGUuXG4gIGlmIChmaWx0ZXIucGlwZWxpbmVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLnBpcGVsaW5lTmFtZSwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5waXBlbGluZU5hbWUpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmUua2V5d29yZHMsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIua2V5d29yZCkpKTtcbiAgfVxuXG4gIC8vIERldmVsb3Blci1wb3J0YWwgY2F0YWxvZyBmaWx0ZXJzIChvd25lciAvIGxpZmVjeWNsZSkuXG4gIGlmIChmaWx0ZXIub3duZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vd25lcklkLCBmaWx0ZXIub3duZXJJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5saWZlY3ljbGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGlwZWxpbmUubGlmZWN5Y2xlLCBmaWx0ZXIubGlmZWN5Y2xlIGFzIExpZmVjeWNsZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogVEhFIHJhbmtpbmcgZm9yIHJlc29sdmluZyBvbmUgcGx1Z2luIFJPVyBieSBuYW1lIChgL3BsdWdpbnMvbG9va3VwYCxcbiAqIGAvcGx1Z2lucy9maW5kYCwgdGhlIHBpcGVsaW5lIHNlcnZpY2UncyBjb250cmFjdCBjaGVjaykg4oCUIG9uZSBkZWZpbml0aW9uIHNvXG4gKiBzeW50aCBhbmQgdGhlIGNvbnRyYWN0IGNoZWNrIG5ldmVyIHBpY2sgZGlmZmVyZW50IHdpbm5lcnMuIFJvd3MgYXJlIG9ubHkgdGhlXG4gKiBvcmcncyBvd24gYW5kIGl0cyBwYXJlbnQnczogdGhlIE9mZmljaWFsIGNhdGFsb2cgYW5kIGV2ZXJ5IG90aGVyIHB1Ymxpc2hlclxuICogcmVzb2x2ZSBhcyBMSVNUSU5HUyBhZnRlcndhcmRzIChwbHVnaW4tcmVzb2x1dGlvbi50cykuXG4gKiAgIDEuIG93bmVyIOKAlCB0aGUgY2FsbGVyJ3Mgb3duIG9yZywgdGhlbiBpdHMgcGFyZW50IG9yZyAoYSB0ZWFtIHJlYWRzIHRoZVxuICogICAgICBwYXJlbnQncyBzaGFyZWQgcm93cyksIHRoZW4gYW55dGhpbmcgZWxzZSBhIHN1cGVyYWRtaW4gY2FuIHNlZTtcbiAqICAgMi4gdGhlIGRlZmF1bHQgdmVyc2lvbjtcbiAqICAgMy4gdGhlIGhpZ2hlc3Qgc2VtdmVyIChzbyBgXjEuMmAgcmVzb2x2ZXMgdG8gdGhlIG5ld2VzdCBtYXRjaGluZyByZWxlYXNlKTtcbiAqICAgNC4gYGlkYCwgYSB0b3RhbCB0aWVicmVhay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsdWdpblJlc29sdXRpb25PcmRlckJ5KG9yZ0lkPzogc3RyaW5nLCBwYXJlbnRPcmdJZD86IHN0cmluZyk6IFNRTFtdIHtcbiAgY29uc3Qgb3duZXJSYW5rID0gb3JnSWRcbiAgICA/IHBhcmVudE9yZ0lkXG4gICAgICA/IHNxbGBDQVNFICR7c2NoZW1hLnBsdWdpbi5vcmdJZH0gV0hFTiAke29yZ0lkfSBUSEVOIDAgV0hFTiAke3BhcmVudE9yZ0lkfSBUSEVOIDEgRUxTRSAyIEVORGBcbiAgICAgIDogc3FsYENBU0UgJHtzY2hlbWEucGx1Z2luLm9yZ0lkfSBXSEVOICR7b3JnSWR9IFRIRU4gMCBFTFNFIDIgRU5EYFxuICAgIDogbnVsbDtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3duZXJSYW5rID8gW293bmVyUmFua10gOiBbXSksXG4gICAgZGVzYyhzY2hlbWEucGx1Z2luLmlzRGVmYXVsdCksXG4gICAgLi4uc2VtdmVyT3JkZXJCeShzY2hlbWEucGx1Z2luLnZlcnNpb24pLFxuICAgIGFzYyhzY2hlbWEucGx1Z2luLmlkKSxcbiAgXTtcbn1cblxuLyoqIEEgcGx1Z2luIHZlcnNpb24gdGhhdCBoYXMgbm90IGJlZW4geWFua2VkICh0aW1lc3RhbXAgYW5kIGxpZmVjeWNsZSBhZ3JlZSkuICovXG5mdW5jdGlvbiBub3RZYW5rZWQoKTogU1FMW10ge1xuICByZXR1cm4gW2lzTnVsbChzY2hlbWEucGx1Z2luLnlhbmtlZEF0KSwgc3FsYCR7c2NoZW1hLnBsdWdpbi5saWZlY3ljbGV9IDw+ICd5YW5rZWQnYF07XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIHBsdWdpbiBxdWVyaWVzXG4gKlxuICogQWNjZXNzIGNvbnRyb2wgaXMgdGhlIHNoYXJlZCB0aHJlZS1ydW5nIGB2aXNpYmlsaXR5YCBsYWRkZXIg4oCUIHNlZVxuICogYEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIuYnVpbGRBY2Nlc3NDb250cm9sYC5cbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGx1Z2luIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQbHVnaW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCB2aXNpYmlsaXR5KVxuICBjb25zdCBjb25kaXRpb25zID0gcGx1Z2luQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEFkZCBwbHVnaW4tc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdJZCkpKTtcbiAgfVxuXG4gIC8vIFN1YnN0cmluZyBzZWFyY2ggZm9yIHRoZSBsaXN0IC8gc2VhcmNoIFVJOyBFWEFDVCBmb3IgcmVzb2x1dGlvbiAodGhlXG4gIC8vIGxvb2t1cCBwYXRoIHNldHMgYG5hbWVNYXRjaDogJ2V4YWN0J2ApIHNvIGB0cml2eWAgbmV2ZXIgcmVzb2x2ZXMgdG9cbiAgLy8gYHRyaXZ5LXNjYW5gIG9yIGFub3RoZXIgb3JnJ3MgYG15LXRyaXZ5YC5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuYW1lID0gbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKTtcbiAgICBjb25kaXRpb25zLnB1c2goZmlsdGVyLm5hbWVNYXRjaCA9PT0gJ2V4YWN0J1xuICAgICAgPyBlcShzY2hlbWEucGx1Z2luLm5hbWUsIG5hbWUpXG4gICAgICA6IGlsaWtlKHNjaGVtYS5wbHVnaW4ubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobmFtZSl9JWApKTtcbiAgfVxuXG4gIC8vIEV4YWN0IHZlcnNpb24sIG9yIGEgc2VtdmVyIHJhbmdlIC8gYGxhdGVzdGAgKHNlZSBzZW12ZXItcmFuZ2UudHMpLiBBIHJhbmdlXG4gIC8vIG5ldmVyIHJlc29sdmVzIHRvIGEgeWFua2VkIHZlcnNpb246IHlhbmsgc3RvcHMgYSB2ZXJzaW9uIHJlc29sdmluZyBmb3JcbiAgLy8gbmV3IHN5bnRocywgd2hpbGUgYW4gZXhhY3QgcGluIHN0aWxsIGZpbmRzIGl0IChzbyB0aGUgY2FsbGVyIGNhbiBleHBsYWluKS5cbiAgaWYgKGZpbHRlci52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzcGVjID0gZmlsdGVyLnZlcnNpb24gYXMgc3RyaW5nO1xuICAgIGNvbmRpdGlvbnMucHVzaCh2ZXJzaW9uU3BlY0NvbmRpdGlvbihzY2hlbWEucGx1Z2luLnZlcnNpb24sIHNwZWMpKTtcbiAgICBpZiAoaXNWZXJzaW9uUmFuZ2Uoc3BlYykpIGNvbmRpdGlvbnMucHVzaCguLi5ub3RZYW5rZWQoKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmV4Y2x1ZGVZYW5rZWQgPT09IHRydWUpIHtcbiAgICBjb25kaXRpb25zLnB1c2goLi4ubm90WWFua2VkKCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5rZXl3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLnBsdWdpbi5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4uY2F0ZWdvcnksIGZpbHRlci5jYXRlZ29yeSBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIC8vIERldmVsb3Blci1wb3J0YWwgY2F0YWxvZyBmaWx0ZXJzIChvd25lciAvIGxpZmVjeWNsZSkuXG4gIGlmIChmaWx0ZXIub3duZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4ub3duZXJJZCwgZmlsdGVyLm93bmVySWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubGlmZWN5Y2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5saWZlY3ljbGUsIGZpbHRlci5saWZlY3ljbGUgYXMgUGx1Z2luTGlmZWN5Y2xlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUtdGVtcGxhdGUgcXVlcmllcy5cbiAqXG4gKiBUZW1wbGF0ZXMgd2VyZSBicmllZmx5IHRoZSBvbmx5IGVudGl0eSBvbiB0aGUgdGhyZWUtcnVuZyBsYWRkZXIgYW5kIG5lZWRlZCBhXG4gKiBiZXNwb2tlIHByZWRpY2F0ZTsgbm93IHRoYXQgZXZlcnkgY2F0YWxvZyBlbnRpdHkgc2hhcmVzIGl0LCB0aGV5IGFyZSBiYWNrIG9uXG4gKiB0aGUgU0FNRSBgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcmAgYXMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zLiBWaXNpYmlsaXR5XG4gKiBzZW1hbnRpY3MgbGl2ZSBpbiBvbmUgcGxhY2Ug4oCUIHNlZSBgYnVpbGRBY2Nlc3NDb250cm9sYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGlwZWxpbmVUZW1wbGF0ZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQaXBlbGluZVRlbXBsYXRlRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4gIHBhcmVudE9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zID0gcGlwZWxpbmVUZW1wbGF0ZUJ1aWxkZXIuYnVpbGRDb21tb25Db25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAvLyBPcHRpb25hbCBuYXJyb3dpbmcgdG8gYSBzcGVjaWZpYyBvcmcgd2l0aGluIHRoZSBjYWxsZXIncyB2aXNpYmlsaXR5IChtaXJyb3JzXG4gIC8vIHRoZSBwbHVnaW4gYnVpbGRlcikuIEFjY2VzcyBjb250cm9sIGFib3ZlIHN0aWxsIGJvdW5kcyB3aGF0J3MgdmlzaWJsZS5cbiAgaWYgKGZpbHRlci5vcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLm9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ0lkIGFzIHN0cmluZykpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICAvLyBWZXJiYXRpbSBtYXRjaCwgY29uc2lzdGVudCB3aXRoIHRoZSBwbHVnaW4gYnVpbGRlciAoY2F0ZWdvcmllcyBhcmUgc3RvcmVkIGFzLWlzKS5cbiAgaWYgKGZpbHRlci5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZVRlbXBsYXRlLmNhdGVnb3J5LCBmaWx0ZXIuY2F0ZWdvcnkgYXMgc3RyaW5nKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmVUZW1wbGF0ZS5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5vd25lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUub3duZXJJZCwgZmlsdGVyLm93bmVySWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubGlmZWN5Y2xlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lVGVtcGxhdGUubGlmZWN5Y2xlLCBmaWx0ZXIubGlmZWN5Y2xlIGFzIExpZmVjeWNsZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIG1lc3NhZ2UgcXVlcmllcy5cbiAqXG4gKiBDdXN0b20gYWNjZXNzIGNvbnRyb2wgZm9yIG1lc3NhZ2VzOlxuICogLSBNZXNzYWdlcyBhcmUgdmlzaWJsZSB0byB0aGUgc2VuZGVyIG9yZyAob3JnSWQpIE9SIHRoZSByZWNpcGllbnQgb3JnIChyZWNpcGllbnRPcmdJZClcbiAqIC0gQnJvYWRjYXN0IGFubm91bmNlbWVudHMgKHJlY2lwaWVudE9yZ0lkID0gJyonKSBhcmUgdmlzaWJsZSB0byBhbGwgb3Jnc1xuICogLSBTeXN0ZW0gb3JnIGNhbiBzZWUgYWxsIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIGZpbHRlciAtIE1lc3NhZ2UgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNZXNzYWdlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPE1lc3NhZ2VGaWx0ZXI+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEN1c3RvbSBhY2Nlc3MgY29udHJvbDogc2VuZGVyIE9SIHJlY2lwaWVudCBPUiBicm9hZGNhc3QuXG4gIC8vXG4gIC8vIFBlci11c2VyIHRhcmdldGluZzogYSByb3cgd2l0aCBgcmVjaXBpZW50X3VzZXJfaWRgIHNldCBpcyBwcml2YXRlIHRvIHRoYXRcbiAgLy8gdXNlciBXSVRISU4gdGhlIHJlY2lwaWVudCBvcmcuIFRoZSByZWNpcGllbnQtc2lkZSBicmFuY2ggdGhlcmVmb3JlIGFkbWl0cyBhXG4gIC8vIHRhcmdldGVkIHJvdyBvbmx5IHdoZW4gdGhlIHZpZXdlciBJUyB0aGF0IHVzZXIgKGBmaWx0ZXIudmlld2VyVXNlcklkYCk7XG4gIC8vIG9yZy13aWRlIHJvd3MgKHJlY2lwaWVudF91c2VyX2lkIElTIE5VTEwpIHN0YXkgdmlzaWJsZSB0byBldmVyeW9uZSBpbiB0aGVcbiAgLy8gb3JnLiBBYnNlbnQgYSB2aWV3ZXIgaWQsIHRoZSByZWNpcGllbnQgc2lkZSBzZWVzIG9yZy13aWRlIHJvd3Mgb25seSwgc28gYVxuICAvLyB0YXJnZXRlZCBtZXNzYWdlIG5ldmVyIGxlYWtzIHRvIG90aGVyIG1lbWJlcnMgKGl0IHN0YXlzIHZpc2libGUgdG8gaXRzXG4gIC8vIHRhcmdldCwgdGhlIHNlbmRlciBvcmcsIGFuZCB0aGUgc3lzdGVtIG9yZykuIFRoZSBTRU5ERVIgYnJhbmNoIHNob3dzIHdoYXRcbiAgLy8geW91ciBvcmcgc2VudCDigJQgZXhjZXB0IGEgcmVwbHkgeW91ciBvcmcncyBUQVJHRVRFRCB1c2VyIHdyb3RlIGluc2lkZSB0aGVpclxuICAvLyBwcml2YXRlIHRocmVhZCwgd2hpY2ggc3RheXMgcHJpdmF0ZSB0byB0aGVtIChzZWUgYHNlbmRlclZpc2libGVgKS5cbiAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgIC8vIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAgfSBlbHNlIHtcbiAgICBjb25zdCByZWNpcGllbnRWaXNpYmxlID0gZmlsdGVyLnZpZXdlclVzZXJJZFxuICAgICAgPyBvcihcbiAgICAgICAgaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCksXG4gICAgICAgIGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCwgZmlsdGVyLnZpZXdlclVzZXJJZCksXG4gICAgICApIVxuICAgICAgOiBpc051bGwoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50VXNlcklkKTtcbiAgICAvLyBTZW5kZXIgc2lkZSBvZiBhIFBSSVZBVEUgdGhyZWFkOiBhIHJlcGx5IGF1dGhvcmVkIGJ5IHRoZSBvcmcgdGhhdCBob2xkcyBhXG4gICAgLy8gdXNlci10YXJnZXRlZCByb290ICh0aGUgdGFyZ2V0ZWQgdXNlciBhbnN3ZXJpbmcpIGNhcnJpZXMgYG9yZ19pZGAgPSB0aGF0XG4gICAgLy8gb3JnLCBzbyB0aGUgdW5jb25kaXRpb25hbCBzZW5kZXIgYnJhbmNoIHNob3dlZCB0aGUgcHJpdmF0ZSBleGNoYW5nZSB0b1xuICAgIC8vIGV2ZXJ5IG9uZSBvZiBpdHMgbWVtYmVycy4gU3VjaCBhIHJlcGx5IGlzIHZpc2libGUgb24gaXRzIG93biBvcmcncyBzaWRlXG4gICAgLy8gb25seSB0byB0aGUgcm9vdCdzIHRhcmdldCB1c2VyOyB3aXRoIG5vIHZpZXdlciBpdCBpcyBoaWRkZW4gKGZhaWwtY2xvc2VkKS5cbiAgICAvLyBFdmVyeSBvdGhlciByb3cgKHJvb3RzLCByZXBsaWVzIGluIHVudGFyZ2V0ZWQgdGhyZWFkcywgcmVwbGllcyBpbiBhIHRocmVhZFxuICAgIC8vIHRhcmdldGVkIGF0IFNPTUVPTkUgRUxTRSdzIG9yZykga2VlcHMgdGhlIHVuY29uZGl0aW9uYWwgc2VuZGVyIHZpZXcuXG4gICAgY29uc3QgcHJpdmF0ZVJvb3RGb3JPdGhlclZpZXdlciA9IGZpbHRlci52aWV3ZXJVc2VySWRcbiAgICAgID8gc3FsYHJvb3QucmVjaXBpZW50X3VzZXJfaWQgSVMgTk9UIE5VTEwgQU5EIHJvb3QucmVjaXBpZW50X3VzZXJfaWQgPD4gJHtmaWx0ZXIudmlld2VyVXNlcklkfWBcbiAgICAgIDogc3FsYHJvb3QucmVjaXBpZW50X3VzZXJfaWQgSVMgTk9UIE5VTExgO1xuICAgIGNvbnN0IHNlbmRlclZpc2libGUgPSBvcihcbiAgICAgIGlzTnVsbChzY2hlbWEubWVzc2FnZS50aHJlYWRJZCksXG4gICAgICBzcWxgTk9UIEVYSVNUUyAoXG4gICAgICAgIFNFTEVDVCAxIEZST00gJHtzY2hlbWEubWVzc2FnZX0gQVMgcm9vdFxuICAgICAgICBXSEVSRSByb290LmlkID0gJHtzY2hlbWEubWVzc2FnZS50aHJlYWRJZH1cbiAgICAgICAgICBBTkQgbG93ZXIocm9vdC5yZWNpcGllbnRfb3JnX2lkKSA9ICR7bm9ybWFsaXplZE9yZ0lkfVxuICAgICAgICAgIEFORCAke3ByaXZhdGVSb290Rm9yT3RoZXJWaWV3ZXJ9XG4gICAgICApYCxcbiAgICApITtcbiAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICBvcihcbiAgICAgICAgYW5kKGVxKHNjaGVtYS5tZXNzYWdlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLCBzZW5kZXJWaXNpYmxlKSEsXG4gICAgICAgIGFuZChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSwgcmVjaXBpZW50VmlzaWJsZSkhLFxuICAgICAgICAvLyBCcm9hZGNhc3QgKGFubm91bmNlbWVudHMpLiBTZWxmLWRlZmVuZGluZzogb25seSBldmVyIG9yZy13aWRlIHJvd3Mg4oCUXG4gICAgICAgIC8vIGEgbWlzLWNyZWF0ZWQgJyonICsgcGVyLXVzZXIgcm93IGNhbid0IGxlYWsgdG8gZXZlcnkgb3JnLlxuICAgICAgICBhbmQoZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50T3JnSWQsICcqJyksIGlzTnVsbChzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQpKSEsXG4gICAgICApISxcbiAgICApO1xuICB9XG5cbiAgLy8gQWN0aXZlIGZpbHRlciAoZGVmYXVsdCB0byBhY3RpdmUgb25seSlcbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgLy8gVGhyZWFkIGZpbHRlciAobnVsbCA9IHJvb3QgbWVzc2FnZXMgb25seSB2aWEgSVMgTlVMTClcbiAgaWYgKGZpbHRlci50aHJlYWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci50aHJlYWRJZCA9PT0gbnVsbCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGlzTnVsbChzY2hlbWEubWVzc2FnZS50aHJlYWRJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UudGhyZWFkSWQsIGZpbHRlci50aHJlYWRJZCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlY2lwaWVudCBvcmcgZmlsdGVyXG4gIGlmIChmaWx0ZXIucmVjaXBpZW50T3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5yZWNpcGllbnRPcmdJZCkpKTtcbiAgfVxuXG4gIC8vIFJlY2lwaWVudCB1c2VyIGZpbHRlciAoZXhwbGljaXQpOiBudWxsIOKGkiBvcmctd2lkZSByb3dzIG9ubHk7IGEgdmFsdWUg4oaSXG4gIC8vIHJvd3MgdGFyZ2V0ZWQgYXQgdGhhdCB1c2VyLiBEaXN0aW5jdCBmcm9tIGB2aWV3ZXJVc2VySWRgLCB3aGljaCB3aWRlbnNcbiAgLy8gdmlzaWJpbGl0eSByYXRoZXIgdGhhbiBuYXJyb3dpbmcgaXQuXG4gIGlmIChmaWx0ZXIucmVjaXBpZW50VXNlcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLnJlY2lwaWVudFVzZXJJZCA9PT0gbnVsbCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGlzTnVsbChzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRVc2VySWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29tcGFyZSB0aGUgcmF3IHVzZXIgaWQg4oCUIGNhc2UtcHJlc2VydmluZywgbWF0Y2hpbmcgaG93IGl0J3Mgc3RvcmVkIGFuZFxuICAgICAgLy8gaG93IGB2aWV3ZXJVc2VySWRgIGlzIGNvbXBhcmVkIChkbyBOT1QgbG93ZXJjYXNlIHZpYSBub3JtYWxpemVTdHJpbmdGaWx0ZXIpLlxuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudFVzZXJJZCwgZmlsdGVyLnJlY2lwaWVudFVzZXJJZCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lc3NhZ2UgdHlwZSBmaWx0ZXJcbiAgaWYgKGZpbHRlci5tZXNzYWdlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLm1lc3NhZ2VUeXBlLCBmaWx0ZXIubWVzc2FnZVR5cGUgYXMgTWVzc2FnZVR5cGUpKTtcbiAgfVxuXG4gIC8vIFByaW9yaXR5IGZpbHRlclxuICBpZiAoZmlsdGVyLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucHJpb3JpdHksIGZpbHRlci5wcmlvcml0eSBhcyBNZXNzYWdlUHJpb3JpdHkpKTtcbiAgfVxuXG4gIC8vIENoYW5uZWwgZmlsdGVyIChudWxsID0gbm8gY2hhbm5lbCAvIG9yZy10by1vcmcgbWVzc2FnZXMpXG4gIGlmIChmaWx0ZXIuY2hhbm5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci5jaGFubmVsID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLmNoYW5uZWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmNoYW5uZWwsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIuY2hhbm5lbCkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFkLXN0YXRlIGZpbHRlciDigJQgSlNPTkIga2V5LWV4aXN0ZW5jZSBjaGVjayBhZ2FpbnN0IGByZWFkX2J5YC5cbiAgLy8gV2UgdXNlIGpzb25iX2V4aXN0cyhyZWFkX2J5LCAkb3JnSWQpIHJhdGhlciB0aGFuIHRoZSBgP2Agb3BlcmF0b3JcbiAgLy8gYmVjYXVzZSBwb3N0Z3Jlcy1qcyAvIGRyaXp6bGUncyBwYXJhbWV0ZXIgYmluZGluZyB0cmVhdHMgYD9gIGFzIGFcbiAgLy8gcGxhY2Vob2xkZXIsIHdoaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIEpTT05CIGA/YCBvcGVyYXRvci5cbiAgaWYgKGZpbHRlci5pc1JlYWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGtleUV4aXN0cyA9IHNxbGBqc29uYl9leGlzdHMoJHtzY2hlbWEubWVzc2FnZS5yZWFkQnl9LCAke25vcm1hbGl6ZWRPcmdJZH0pYDtcbiAgICBjb25kaXRpb25zLnB1c2goZmlsdGVyLmlzUmVhZCA/IGtleUV4aXN0cyA6IG5vdChrZXlFeGlzdHMpKTtcbiAgfVxuXG4gIC8vIElEIGZpbHRlclxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWRFcXVhbHMoc2NoZW1hLm1lc3NhZ2UuaWQsIGZpbHRlci5pZCkpO1xuICB9XG5cbiAgLy8gRnJlZS10ZXh0IGluYm94IHNlYXJjaCDigJQgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgb3ZlciBzdWJqZWN0IE9SIGNvbnRlbnQuXG4gIC8vIFdpbGRjYXJkcyBpbiB0aGUgdGVybSBhcmUgZXNjYXBlZCBzbyBhIGxpdGVyYWwgYCVgL2BfYCBpcyBtYXRjaGVkIGxpdGVyYWxseTtcbiAgLy8gYW4gYWxsLXdoaXRlc3BhY2UgdGVybSBpcyBpZ25vcmVkIChuby1vcCkgcmF0aGVyIHRoYW4gbWF0Y2hpbmcgZXZlcnl0aGluZy5cbiAgaWYgKGZpbHRlci5zZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHRlcm0gPSBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnNlYXJjaCkudHJpbSgpO1xuICAgIGlmICh0ZXJtKSB7XG4gICAgICBjb25zdCBsaWtlID0gYCUke2VzY2FwZUxpa2VXaWxkY2FyZHModGVybSl9JWA7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIG9yKFxuICAgICAgICAgIGlsaWtlKHNjaGVtYS5tZXNzYWdlLnN1YmplY3QsIGxpa2UpLFxuICAgICAgICAgIGlsaWtlKHNjaGVtYS5tZXNzYWdlLmNvbnRlbnQsIGxpa2UpLFxuICAgICAgICApISxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbXBsaWFuY2UgUXVlcnkgQnVpbGRlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBwb2xpY3kgcXVlcmllcy5cbiAqXG4gKiBWaXNpYmlsaXR5OlxuICogLSBUaGUgcmVxdWVzdGluZyBvcmcncyBvd24gcG9saWNpZXMsIEFORFxuICogLSBUaGUgc3lzdGVtIG9yZydzIHBvbGljeSB0ZW1wbGF0ZXMgKHNvIHRoZSBzaGFyZWQgY2F0YWxvZyBpcyBhbHdheXMgdmlzaWJsZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VQb2xpY3lDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVBvbGljeUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBvcihcbiAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgU1lTVEVNX09SR19JRCksXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc1RlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICApISxcbiAgICAgICAgKSEsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGYWlsLWNsb3NlZDogbm8gb3JnIGNvbnRleHQg4oeSIG5vIHJvd3MgKG5ldmVyIGxlYWsgZXZlcnkgdGVuYW50J3MgcG9saWNpZXMpLlxuICAgIGNvbmRpdGlvbnMucHVzaChJTVBPU1NJQkxFKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpZEVxdWFscyhzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pZCwgZmlsdGVyLmlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpbGlrZShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc1RlbXBsYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNUZW1wbGF0ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc1RlbXBsYXRlKSkpO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBhY3RpdmU9dHJ1ZSBmb3IgbGlzdCBxdWVyaWVzLCBub3Qgc2luZ2xlLWVudGl0eSBsb29rdXBzIGJ5IElEXG4gIC8vIChvdGhlcndpc2UgZmluZEJ5SWQgb2YgYW4gaW5hY3RpdmUgcG9saWN5IHJldHVybnMgbm90aGluZykuXG4gIGFjdGl2ZURlZmF1bHQoY29uZGl0aW9ucywgc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNBY3RpdmUsIGZpbHRlci5pc0FjdGl2ZSwgZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpO1xuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHJ1bGUgcXVlcmllcy5cbiAqXG4gKiBWaXNpYmlsaXR5OlxuICogLSBUaGUgcmVxdWVzdGluZyBvcmcncyBvd24gcnVsZXMgKGFueSBzY29wZSksIEFORFxuICogLSBUaGUgc3lzdGVtIG9yZydzIHB1Ymxpc2hlZCBydWxlcyAoc28gdGhlIGdsb2JhbCBjYXRhbG9nIGlzIGFsd2F5cyB2aXNpYmxlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVJ1bGVGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkT3JnSWQgPT09IFNZU1RFTV9PUkdfSUQpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIG9yKFxuICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNjb3BlLCAncHVibGlzaGVkJyBhcyBSdWxlU2NvcGUpLFxuICAgICAgICAgICkhLFxuICAgICAgICApISxcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEZhaWwtY2xvc2VkOiBubyBvcmcgY29udGV4dCDih5Igbm8gcm93cyAobmV2ZXIgbGVhayBldmVyeSB0ZW5hbnQncyBydWxlcykuXG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlkRXF1YWxzKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pZCwgZmlsdGVyLmlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpbGlrZShzY2hlbWEuY29tcGxpYW5jZVJ1bGUubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucG9saWN5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUucG9saWN5SWQsIGZpbHRlci5wb2xpY3lJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2V2ZXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2V2ZXJpdHksIGZpbHRlci5zZXZlcml0eSBhcyBSdWxlU2V2ZXJpdHkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsIGZpbHRlci5zY29wZSBhcyBSdWxlU2NvcGUpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhZ3MsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIudGFnKSkpO1xuICB9XG5cbiAgLy8gRGVmYXVsdCB0byBhY3RpdmU9dHJ1ZSBmb3IgbGlzdCBxdWVyaWVzLCBub3Qgc2luZ2xlLWVudGl0eSBsb29rdXBzIGJ5IElELlxuICBhY3RpdmVEZWZhdWx0KGNvbmRpdGlvbnMsIHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pc0FjdGl2ZSwgZmlsdGVyLmlzQWN0aXZlLCBmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGJyb3dzaW5nIHRoZSBwdWJsaXNoZWQgcnVsZXMgY2F0YWxvZy5cbiAqIE9ubHkgcmV0dXJucyBzeXN0ZW0tb3JnIHB1Ymxpc2hlZCBydWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUHVibGlzaGVkUnVsZUNhdGFsb2dDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVJ1bGVGaWx0ZXI+LFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIC8vIE9ubHkgc2NvcGU9J3B1Ymxpc2hlZCcgaXMgbmVlZGVkIOKAlCB0aGUgY3JlYXRlIGVuZHBvaW50IGFscmVhZHkgZW5mb3JjZXNcbiAgLy8gdGhhdCBvbmx5IHRoZSBzeXN0ZW0gb3JnIGNhbiBjcmVhdGUgcHVibGlzaGVkIHJ1bGVzLCBzbyBmaWx0ZXJpbmcgYnkgb3JnSWRcbiAgLy8gaXMgcmVkdW5kYW50IGFuZCBicmVha3Mgd2hlbiB0aGUgc3lzdGVtIG9yZydzIERCIElEIGRpZmZlcnMgZnJvbSBTWVNURU1fT1JHX0lELlxuICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNjb3BlLCAncHVibGlzaGVkJyBhcyBSdWxlU2NvcGUpKTtcblxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpbGlrZShzY2hlbWEuY29tcGxpYW5jZVJ1bGUubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhcmdldCwgZmlsdGVyLnRhcmdldCBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNldmVyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNldmVyaXR5LCBmaWx0ZXIuc2V2ZXJpdHkgYXMgUnVsZVNldmVyaXR5KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YWdzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnRhZykpKTtcbiAgfVxuXG4gIC8vIFRoZSBjYXRhbG9nIGlzIGFsd2F5cyBhY3RpdmUtb25seSAobm8gc2luZ2xlLWlkIGV4ZW1wdGlvbiBoZXJlKS5cbiAgYWN0aXZlRGVmYXVsdChjb25kaXRpb25zLCBzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaXNBY3RpdmUsIGZpbHRlci5pc0FjdGl2ZSwgZmFsc2UpO1xuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIGV4ZW1wdGlvbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlRXhlbXB0aW9uQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VFeGVtcHRpb25GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24ub3JnSWQsIG9yZ0lkLnRvTG93ZXJDYXNlKCkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goSU1QT1NTSUJMRSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnJ1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLnJ1bGVJZCwgZmlsdGVyLnJ1bGVJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5lbnRpdHlUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uZW50aXR5VHlwZSwgZmlsdGVyLmVudGl0eVR5cGUgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5lbnRpdHlJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLmVudGl0eUlkLCBmaWx0ZXIuZW50aXR5SWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uc3RhdHVzLCBmaWx0ZXIuc3RhdHVzKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBhdWRpdCBsb2cgcXVlcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZUF1ZGl0Q29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VBdWRpdEZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLm9yZ0lkLCBvcmdJZC50b0xvd2VyQ2FzZSgpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLnRhcmdldCwgZmlsdGVyLnRhcmdldCBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuYWN0aW9uLCBmaWx0ZXIuYWN0aW9uKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cucmVzdWx0LCBmaWx0ZXIucmVzdWx0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNjYW5JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuc2NhbklkLCBmaWx0ZXIuc2NhbklkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmRhdGVGcm9tICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZ3RlKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuY3JlYXRlZEF0LCBuZXcgRGF0ZShmaWx0ZXIuZGF0ZUZyb20pKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmRhdGVUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGx0ZShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLmNyZWF0ZWRBdCwgbmV3IERhdGUoZmlsdGVyLmRhdGVUbykpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHNjYW4gcXVlcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVNjYW5Db25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVNjYW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLm9yZ0lkLCBvcmdJZC50b0xvd2VyQ2FzZSgpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKElNUE9TU0lCTEUpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4udGFyZ2V0LCBmaWx0ZXIudGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi5zdGF0dXMsIGZpbHRlci5zdGF0dXMpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudHJpZ2dlcmVkQnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4udHJpZ2dlcmVkQnksIGZpbHRlci50cmlnZ2VyZWRCeSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG4iXX0=
@@ -8,7 +8,7 @@
8
8
  * Inventory reads (plugin summary/distribution/versions) change rarely — 5 min.
9
9
  * Timeseries reads (execution/build metrics over a range) — 2 min.
10
10
  */
11
- import { createCacheService } from '@pipeline-builder/api-core';
12
- export const inventoryCache = createCacheService('report:inv:', parseInt(process.env.CACHE_TTL_REPORT_INVENTORY || '300', 10));
13
- export const timeseriesCache = createCacheService('report:ts:', parseInt(process.env.CACHE_TTL_REPORT_TIMESERIES || '120', 10));
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvY2FjaGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSB0d28gcmVwb3J0IGNhY2hlcy4gQSBzZXBhcmF0ZSBtb2R1bGUgYmVjYXVzZSBib3RoIHRoZSBzZXJ2aWNlIChmb3JcbiAqIGludmFsaWRhdGlvbikgYW5kIHRoZSBleHRyYWN0ZWQgcXVlcnkgbW9kdWxlcyAodmlhIHJ1blJlcG9ydCkgbmVlZCB0aGVtLCBhbmQgYVxuICogc2hhcmVkIHNpbmdsZXRvbiBtdXN0IGhhdmUgZXhhY3RseSBvbmUgZGVmaW5pdGlvbiBzaXRlLlxuICpcbiAqIEludmVudG9yeSByZWFkcyAocGx1Z2luIHN1bW1hcnkvZGlzdHJpYnV0aW9uL3ZlcnNpb25zKSBjaGFuZ2UgcmFyZWx5IOKAlCA1IG1pbi5cbiAqIFRpbWVzZXJpZXMgcmVhZHMgKGV4ZWN1dGlvbi9idWlsZCBtZXRyaWNzIG92ZXIgYSByYW5nZSkg4oCUIDIgbWluLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUNhY2hlU2VydmljZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuZXhwb3J0IGNvbnN0IGludmVudG9yeUNhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6aW52OicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfSU5WRU5UT1JZIHx8ICczMDAnLCAxMCkpO1xuZXhwb3J0IGNvbnN0IHRpbWVzZXJpZXNDYWNoZSA9IGNyZWF0ZUNhY2hlU2VydmljZSgncmVwb3J0OnRzOicsIHBhcnNlSW50KHByb2Nlc3MuZW52LkNBQ0hFX1RUTF9SRVBPUlRfVElNRVNFUklFUyB8fCAnMTIwJywgMTApKTtcbiJdfQ==
11
+ import { createCacheService, envInt } from '@pipeline-builder/api-core';
12
+ export const inventoryCache = createCacheService('report:inv:', envInt('CACHE_TTL_REPORT_INVENTORY', 300, { min: 1 }));
13
+ export const timeseriesCache = createCacheService('report:ts:', envInt('CACHE_TTL_REPORT_TIMESERIES', 120, { min: 1 }));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvY2FjaGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgdHdvIHJlcG9ydCBjYWNoZXMuIEEgc2VwYXJhdGUgbW9kdWxlIGJlY2F1c2UgYm90aCB0aGUgc2VydmljZSAoZm9yXG4gKiBpbnZhbGlkYXRpb24pIGFuZCB0aGUgZXh0cmFjdGVkIHF1ZXJ5IG1vZHVsZXMgKHZpYSBydW5SZXBvcnQpIG5lZWQgdGhlbSwgYW5kIGFcbiAqIHNoYXJlZCBzaW5nbGV0b24gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGRlZmluaXRpb24gc2l0ZS5cbiAqXG4gKiBJbnZlbnRvcnkgcmVhZHMgKHBsdWdpbiBzdW1tYXJ5L2Rpc3RyaWJ1dGlvbi92ZXJzaW9ucykgY2hhbmdlIHJhcmVseSDigJQgNSBtaW4uXG4gKiBUaW1lc2VyaWVzIHJlYWRzIChleGVjdXRpb24vYnVpbGQgbWV0cmljcyBvdmVyIGEgcmFuZ2UpIOKAlCAyIG1pbi5cbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVDYWNoZVNlcnZpY2UsIGVudkludCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcblxuZXhwb3J0IGNvbnN0IGludmVudG9yeUNhY2hlID0gY3JlYXRlQ2FjaGVTZXJ2aWNlKCdyZXBvcnQ6aW52OicsIGVudkludCgnQ0FDSEVfVFRMX1JFUE9SVF9JTlZFTlRPUlknLCAzMDAsIHsgbWluOiAxIH0pKTtcbmV4cG9ydCBjb25zdCB0aW1lc2VyaWVzQ2FjaGUgPSBjcmVhdGVDYWNoZVNlcnZpY2UoJ3JlcG9ydDp0czonLCBlbnZJbnQoJ0NBQ0hFX1RUTF9SRVBPUlRfVElNRVNFUklFUycsIDEyMCwgeyBtaW46IDEgfSkpO1xuIl19
@@ -11,14 +11,14 @@ import type { DoraLevel } from './types.js';
11
11
  */
12
12
  export declare const HEADLINE_ENV = "production";
13
13
  /**
14
- * Incident→deploy correlation window (Phase 5). An incident is attributed to the
14
+ * Incident→deploy correlation window. An incident is attributed to the
15
15
  * most recent SUCCESSFUL deploy to its environment whose `completed_at` is within
16
16
  * this many hours before the incident's `opened_at`. Default 24h; override via
17
17
  * `DORA_INCIDENT_WINDOW_HOURS`. Guarded to a positive finite number.
18
18
  */
19
19
  export declare const DORA_INCIDENT_WINDOW_HOURS: number;
20
20
  /**
21
- * Resolve the effective incident→deploy correlation window (Phase 5b). A per-org
21
+ * Resolve the effective incident→deploy correlation window. A per-org
22
22
  * override (from `dora_settings.incident_window_hours`, surfaced through the
23
23
  * settings endpoint and threaded into {@link DoraOptions.incidentWindowHours})
24
24
  * wins when it is a positive finite number; otherwise the global env default
@@ -27,7 +27,7 @@ export declare const DORA_INCIDENT_WINDOW_HOURS: number;
27
27
  */
28
28
  export declare function resolveIncidentWindowHours(override?: number | null): number;
29
29
  /**
30
- * Reporting retention windows (Phase 7). Records in `pipeline_events`,
30
+ * Reporting retention windows. Records in `pipeline_events`,
31
31
  * `deployment_outcomes`, and `incidents` grow unbounded without a sweep, so a
32
32
  * split, per-org retention purge (see {@link ReportingService.purgeExpiredReportingData})
33
33
  * hard-deletes rows older than these windows, by `created_at`:
@@ -12,7 +12,7 @@
12
12
  */
13
13
  export const HEADLINE_ENV = 'production';
14
14
  /**
15
- * Incident→deploy correlation window (Phase 5). An incident is attributed to the
15
+ * Incident→deploy correlation window. An incident is attributed to the
16
16
  * most recent SUCCESSFUL deploy to its environment whose `completed_at` is within
17
17
  * this many hours before the incident's `opened_at`. Default 24h; override via
18
18
  * `DORA_INCIDENT_WINDOW_HOURS`. Guarded to a positive finite number.
@@ -22,7 +22,7 @@ export const DORA_INCIDENT_WINDOW_HOURS = (() => {
22
22
  return Number.isFinite(raw) && raw > 0 ? raw : 24;
23
23
  })();
24
24
  /**
25
- * Resolve the effective incident→deploy correlation window (Phase 5b). A per-org
25
+ * Resolve the effective incident→deploy correlation window. A per-org
26
26
  * override (from `dora_settings.incident_window_hours`, surfaced through the
27
27
  * settings endpoint and threaded into {@link DoraOptions.incidentWindowHours})
28
28
  * wins when it is a positive finite number; otherwise the global env default
@@ -33,7 +33,7 @@ export function resolveIncidentWindowHours(override) {
33
33
  return override != null && Number.isFinite(override) && override > 0 ? override : DORA_INCIDENT_WINDOW_HOURS;
34
34
  }
35
35
  /**
36
- * Reporting retention windows (Phase 7). Records in `pipeline_events`,
36
+ * Reporting retention windows. Records in `pipeline_events`,
37
37
  * `deployment_outcomes`, and `incidents` grow unbounded without a sweep, so a
38
38
  * split, per-org retention purge (see {@link ReportingService.purgeExpiredReportingData})
39
39
  * hard-deletes rows older than these windows, by `created_at`:
@@ -125,4 +125,4 @@ export function median(values) {
125
125
  * trend, and build health — so the precedence can't drift between them. Assumes the
126
126
  * grouped event alias is `e`.
127
127
  */
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS1zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvZG9yYS1zY29yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEM7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsUUFBd0I7SUFDakUsT0FBTyxRQUFRLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUMvRyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtJQUN2RSxJQUFJLFdBQVcsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ2xFLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdCLElBQUksR0FBRyxJQUFJLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQXlCO0lBQzNELElBQUksVUFBVSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdEMsSUFBSSxVQUFVLEdBQUcsS0FBSztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3RDLElBQUksVUFBVSxHQUFHLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN6QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGFBQTRCO0lBQy9ELElBQUksYUFBYSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxJQUFJLGFBQWEsR0FBRyxLQUFLO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDMUMsSUFBSSxhQUFhLEdBQUcsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzFDLElBQUksYUFBYSxHQUFHLE9BQU87UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFnQjtJQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7R0FNRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IERvcmFMZXZlbCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZGluZyBwbHVzIHRoZSBzbWFsbCBzdGF0aXN0aWNzIGhlbHBlcnMgaXQgbmVlZHMuXG4gKiBQdXJlIGZ1bmN0aW9ucyDigJQgbm8gZGF0YWJhc2UgYWNjZXNzLCBubyBJL08g4oCUIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGVcbiAqIHRocmVzaG9sZHMgYmUgdW5pdC10ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgcXVlcmllcyB0aGF0IGZlZWQgdGhlbS5cbiAqL1xuXG4vKipcbiAqIFRoZSBET1JBIGhlYWRsaW5lIGVudmlyb25tZW50LiBEZXBsb3ltZW50IHRvIHRoaXMgbGl0ZXJhbCBlbnYgbmFtZSBpcyB0aGVcbiAqIGluZHVzdHJ5LXN0YW5kYXJkIERPUkEgc2lnbmFsOyBNVFRSIGlzIG1lYXN1cmVkIHByb2R1Y3Rpb24tb25seSwgYW5kIHRoaXNcbiAqIGVudmlyb25tZW50J3MgY2FyZCBpcyB0aGUgc3VtbWFyeSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhFQURMSU5FX0VOViA9ICdwcm9kdWN0aW9uJztcblxuLyoqXG4gKiBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cgKFBoYXNlIDUpLiBBbiBpbmNpZGVudCBpcyBhdHRyaWJ1dGVkIHRvIHRoZVxuICogbW9zdCByZWNlbnQgU1VDQ0VTU0ZVTCBkZXBsb3kgdG8gaXRzIGVudmlyb25tZW50IHdob3NlIGBjb21wbGV0ZWRfYXRgIGlzIHdpdGhpblxuICogdGhpcyBtYW55IGhvdXJzIGJlZm9yZSB0aGUgaW5jaWRlbnQncyBgb3BlbmVkX2F0YC4gRGVmYXVsdCAyNGg7IG92ZXJyaWRlIHZpYVxuICogYERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTYC4gR3VhcmRlZCB0byBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyA9ICgoKSA9PiB7XG4gIGNvbnN0IHJhdyA9IE51bWJlcihwcm9jZXNzLmVudi5ET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUyk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocmF3KSAmJiByYXcgPiAwID8gcmF3IDogMjQ7XG59KSgpO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGVmZmVjdGl2ZSBpbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cgKFBoYXNlIDViKS4gQSBwZXItb3JnXG4gKiBvdmVycmlkZSAoZnJvbSBgZG9yYV9zZXR0aW5ncy5pbmNpZGVudF93aW5kb3dfaG91cnNgLCBzdXJmYWNlZCB0aHJvdWdoIHRoZVxuICogc2V0dGluZ3MgZW5kcG9pbnQgYW5kIHRocmVhZGVkIGludG8ge0BsaW5rIERvcmFPcHRpb25zLmluY2lkZW50V2luZG93SG91cnN9KVxuICogd2lucyB3aGVuIGl0IGlzIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgb3RoZXJ3aXNlIHRoZSBnbG9iYWwgZW52IGRlZmF1bHRcbiAqIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AgYXBwbGllcy4gQ2VudHJhbGl6ZWQgc28gdGhlIERPUkEgY29ycmVsYXRpb24sIHRoZVxuICogaW5jaWRlbnRzIGxpc3QsIGFuZCB0aGUgd2lyaW5nLXRlc3QgZHJ5LXJ1biBhbGwgYWdyZWUgb24gdGhlIHNhbWUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKG92ZXJyaWRlPzogbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XG4gIHJldHVybiBvdmVycmlkZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShvdmVycmlkZSkgJiYgb3ZlcnJpZGUgPiAwID8gb3ZlcnJpZGUgOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUztcbn1cblxuLyoqXG4gKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHdpbmRvd3MgKFBoYXNlIDcpLiBSZWNvcmRzIGluIGBwaXBlbGluZV9ldmVudHNgLFxuICogYGRlcGxveW1lbnRfb3V0Y29tZXNgLCBhbmQgYGluY2lkZW50c2AgZ3JvdyB1bmJvdW5kZWQgd2l0aG91dCBhIHN3ZWVwLCBzbyBhXG4gKiBzcGxpdCwgcGVyLW9yZyByZXRlbnRpb24gcHVyZ2UgKHNlZSB7QGxpbmsgUmVwb3J0aW5nU2VydmljZS5wdXJnZUV4cGlyZWRSZXBvcnRpbmdEYXRhfSlcbiAqIGhhcmQtZGVsZXRlcyByb3dzIG9sZGVyIHRoYW4gdGhlc2Ugd2luZG93cywgYnkgYGNyZWF0ZWRfYXRgOlxuICogIC0gKipTdGFuZGFyZCBldmVudHMqKiDigJQgYHBpcGVsaW5lX2V2ZW50c2Agd2l0aCBgZW52aXJvbm1lbnQgSVMgTlVMTGAgYW5kIG5vXG4gKiAgICBgY29tbWl0X3RpbWVzdGFtcGAgKG5vbi1kZXBsb3kgU1RBR0UvQUNUSU9OL2J1aWxkKS4gSGlnaCB2b2x1bWUg4oaSIHNob3J0XG4gKiAgICBkZWZhdWx0ICgzMCBkYXlzKS4gQSByb3cgdGhhdCBET0VTIGNhcnJ5IGEgY29tbWl0IHRpbWVzdGFtcCBpcyBET1JBIHNvdXJjZVxuICogICAgZGF0YSDigJQgbGVhZCB0aW1lIGpvaW5zIG9uIGl0IOKAlCBzbyBpdCBmb2xsb3dzIHRoZSBET1JBIHdpbmRvdyBpbnN0ZWFkLlxuICogIC0gKipET1JBIHNvdXJjZSoqIOKAlCBgcGlwZWxpbmVfZXZlbnRzYCB3aXRoIGBlbnZpcm9ubWVudCBJUyBOT1QgTlVMTGAgKGRlcGxveVxuICogICAgc3RhZ2VzKSBwbHVzIGFsbCBvZiBgZGVwbG95bWVudF9vdXRjb21lc2AgYW5kIGBpbmNpZGVudHNgLiBMb3cgdm9sdW1lIOKGklxuICogICAgbG9uZ2VyIGRlZmF1bHQgKDE4MCBkYXlzKS4gRE9SQSBoaXN0b3J5IGlzIHRoZXJlZm9yZSBib3VuZGVkIGJ5IHRoaXMgd2luZG93O1xuICogICAgdGhlIHJlcG9ydCBxdWVyeSBzdGlsbCBoYXJkLWNhcHMgYXQgMzY1IGRheXMgKGEgbG9uZ2VyIHBlci1vcmcgb3ZlcnJpZGUgb25seVxuICogICAgcmV0YWlucyByYXcgc291cmNlIHJvd3MsIG5ldmVyIHdpZGVucyBhIHJlcG9ydCkuXG4gKiBgaW5nZXN0X2hlYWx0aGAgYW5kIGBkb3JhX3NldHRpbmdzYCBhcmUgbmV2ZXIgcHVyZ2VkLiBFbnYtb3ZlcnJpZGFibGUgZ2xvYmFscztcbiAqIGEgcGVyLW9yZyBvdmVycmlkZSBpbiBgZG9yYV9zZXR0aW5nc2Agd2lucyAoc2VlIHtAbGluayByZXNvbHZlRXZlbnRSZXRlbnRpb25EYXlzfSkuXG4gKi9cblxuLyoqIERlcGxveW1lbnQgZnJlcXVlbmN5IGJ5IGRlcGxveXMvZGF5OiBlbGl0ZSDiiaUxL2RheSwgaGlnaCDiiaUxL3dlZWssIG1lZGl1bSDiiaUxL21vbnRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckZyZXF1ZW5jeShwZXJEYXk6IG51bWJlciwgZGVwbG95bWVudHM6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmIChkZXBsb3ltZW50cyA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBlckRheSA+PSAxKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBlckRheSA+PSAxIC8gNykgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBlckRheSA+PSAxIC8gMzApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIENoYW5nZSBmYWlsdXJlIHJhdGUgYnkgcGVyY2VudDogZWxpdGUg4omkNSUsIGhpZ2gg4omkMTAlLCBtZWRpdW0g4omkMTUlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckNoYW5nZUZhaWx1cmUocGN0OiBudW1iZXIsIHRvdGFsOiBudW1iZXIpOiBEb3JhTGV2ZWwge1xuICBpZiAodG90YWwgPD0gMCkgcmV0dXJuIG51bGw7XG4gIGlmIChwY3QgPD0gNSkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChwY3QgPD0gMTApIHJldHVybiAnaGlnaCc7XG4gIGlmIChwY3QgPD0gMTUpIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIFRpbWUgdG8gcmVzdG9yZSBieSBzZWNvbmRzOiBlbGl0ZSA8MWgsIGhpZ2ggPDEgZGF5LCBtZWRpdW0gPDEgd2Vlay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3JhTGV2ZWxGb3JSZXN0b3JlKGF2Z1NlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAoYXZnU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKGF2Z1NlY29uZHMgPCAzNjAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKGF2Z1NlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuLyoqIExlYWQgdGltZSBieSBzZWNvbmRzOiBlbGl0ZSA8MSBkYXksIGhpZ2ggPDEgd2VlaywgbWVkaXVtIDwxIG1vbnRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvckxlYWRUaW1lKG1lZGlhblNlY29uZHM6IG51bWJlciB8IG51bGwpOiBEb3JhTGV2ZWwge1xuICBpZiAobWVkaWFuU2Vjb25kcyA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA4NjQwMCkgcmV0dXJuICdlbGl0ZSc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgNjA0ODAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDI1OTIwMDApIHJldHVybiAnbWVkaXVtJztcbiAgcmV0dXJuICdsb3cnO1xufVxuXG4vKipcbiAqIFJvdW5kIGB2YWx1ZWAgdG8gYGRpZ2l0c2AgZGVjaW1hbCBwbGFjZXMsIHJldHVybmluZyBhIHJlYWwgbnVtYmVyLiBTbWFsbFxuICogbW9kdWxlLXByaXZhdGUgaGVscGVyIHNvIHRoZSBET1JBIHNoYXBpbmcgZG9lc24ndCByZXBlYXQgdGhlXG4gKiBgTnVtYmVyKE51bWJlcih4KS50b0ZpeGVkKG4pKWAgcGF0dGVybiAodG9GaXhlZCBhbG9uZSB5aWVsZHMgYSBzdHJpbmcpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm91bmQodmFsdWU6IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHZhbHVlLnRvRml4ZWQoZGlnaXRzKSk7XG59XG5cbi8qKlxuICogTWVkaWFuIG9mIGEgbnVtZXJpYyBzYW1wbGUsIG9yIGBudWxsYCB3aGVuIGVtcHR5LiBVc2VkIGZvciBtZWFzdXJlZCBsZWFkIHRpbWVcbiAqIGFuZCBNVFRSIOKAlCBib3RoIGFyZSBjcm9zcy1zb3VyY2UgZ2FwcyBjb21wdXRlZCBpbiBKUyBmcm9tIGNsYW1wZWQgZGVsdGFzLCBzb1xuICogdGhlIG1lZGlhbiBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGluIFNRTCBQRVJDRU5USUxFX0NPTlQgKGtlZXBzIHRoZSBnb2xkZW5cbiAqIGZpeHR1cmUgdGVzdHMgYWJsZSB0byBwcm92ZSB0aGUgbWV0cmljIG1hdGggd2l0aG91dCBhIGxpdmUgUG9zdGdyZXMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVkaWFuKHZhbHVlczogbnVtYmVyW10pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCBzID0gWy4uLnZhbHVlc10uc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKHMubGVuZ3RoIC8gMik7XG4gIHJldHVybiBzLmxlbmd0aCAlIDIgPT09IDEgPyBzW21pZF0gOiAoc1ttaWQgLSAxXSArIHNbbWlkXSkgLyAyO1xufVxuXG4vKipcbiAqIFJvbGwgYSBncm91cCBvZiBkZXBsb3kvc3RhZ2UgZXZlbnRzIChncm91cGVkIHBlciBleGVjdXRpb24pIHVwIHRvIG9uZSB0ZXJtaW5hbFxuICogc3RhdHVzOiBGQUlMRUQgd2lucywgdGhlbiBTVUNDRUVERUQsIGVsc2UgT1RIRVIgKHN0aWxsLXJ1bm5pbmcgLyBub24tdGVybWluYWwpLlxuICogU2hhcmVkIGJ5IHRoZSB0aHJlZSBwZXItKGVudnxzdGFnZSwgZXhlY3V0aW9uKSByb2xsdXAgQ1RFcyDigJQgRE9SQSBtZXRyaWNzLCBET1JBXG4gKiB0cmVuZCwgYW5kIGJ1aWxkIGhlYWx0aCDigJQgc28gdGhlIHByZWNlZGVuY2UgY2FuJ3QgZHJpZnQgYmV0d2VlbiB0aGVtLiBBc3N1bWVzIHRoZVxuICogZ3JvdXBlZCBldmVudCBhbGlhcyBpcyBgZWAuXG4gKi9cbiJdfQ==
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9yYS1zY29yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9yZXBvcnRpbmcvZG9yYS1zY29yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEM7Ozs7R0FJRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7SUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUMzRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQUMsUUFBd0I7SUFDakUsT0FBTyxRQUFRLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztBQUMvRyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCx3RkFBd0Y7QUFDeEYsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxXQUFtQjtJQUN2RSxJQUFJLFdBQVcsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDbEMsSUFBSSxNQUFNLElBQUksQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2hDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ2xFLElBQUksS0FBSyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdCLElBQUksR0FBRyxJQUFJLEVBQUU7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMvQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQXlCO0lBQzNELElBQUksVUFBVSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLFVBQVUsR0FBRyxJQUFJO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDdEMsSUFBSSxVQUFVLEdBQUcsS0FBSztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3RDLElBQUksVUFBVSxHQUFHLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUN6QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFDRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLGFBQTRCO0lBQy9ELElBQUksYUFBYSxJQUFJLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QyxJQUFJLGFBQWEsR0FBRyxLQUFLO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDMUMsSUFBSSxhQUFhLEdBQUcsTUFBTTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzFDLElBQUksYUFBYSxHQUFHLE9BQU87UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUNqRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBQyxNQUFnQjtJQUNyQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7R0FNRyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IERvcmFMZXZlbCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIERPUkEgcGVyZm9ybWFuY2UgYmFuZGluZyBwbHVzIHRoZSBzbWFsbCBzdGF0aXN0aWNzIGhlbHBlcnMgaXQgbmVlZHMuXG4gKiBQdXJlIGZ1bmN0aW9ucyDigJQgbm8gZGF0YWJhc2UgYWNjZXNzLCBubyBJL08g4oCUIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGVcbiAqIHRocmVzaG9sZHMgYmUgdW5pdC10ZXN0ZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgcXVlcmllcyB0aGF0IGZlZWQgdGhlbS5cbiAqL1xuXG4vKipcbiAqIFRoZSBET1JBIGhlYWRsaW5lIGVudmlyb25tZW50LiBEZXBsb3ltZW50IHRvIHRoaXMgbGl0ZXJhbCBlbnYgbmFtZSBpcyB0aGVcbiAqIGluZHVzdHJ5LXN0YW5kYXJkIERPUkEgc2lnbmFsOyBNVFRSIGlzIG1lYXN1cmVkIHByb2R1Y3Rpb24tb25seSwgYW5kIHRoaXNcbiAqIGVudmlyb25tZW50J3MgY2FyZCBpcyB0aGUgc3VtbWFyeSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lbC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhFQURMSU5FX0VOViA9ICdwcm9kdWN0aW9uJztcblxuLyoqXG4gKiBJbmNpZGVudOKGkmRlcGxveSBjb3JyZWxhdGlvbiB3aW5kb3cuIEFuIGluY2lkZW50IGlzIGF0dHJpYnV0ZWQgdG8gdGhlXG4gKiBtb3N0IHJlY2VudCBTVUNDRVNTRlVMIGRlcGxveSB0byBpdHMgZW52aXJvbm1lbnQgd2hvc2UgYGNvbXBsZXRlZF9hdGAgaXMgd2l0aGluXG4gKiB0aGlzIG1hbnkgaG91cnMgYmVmb3JlIHRoZSBpbmNpZGVudCdzIGBvcGVuZWRfYXRgLiBEZWZhdWx0IDI0aDsgb3ZlcnJpZGUgdmlhXG4gKiBgRE9SQV9JTkNJREVOVF9XSU5ET1dfSE9VUlNgLiBHdWFyZGVkIHRvIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gTnVtYmVyKHByb2Nlc3MuZW52LkRPUkFfSU5DSURFTlRfV0lORE9XX0hPVVJTKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShyYXcpICYmIHJhdyA+IDAgPyByYXcgOiAyNDtcbn0pKCk7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIGluY2lkZW504oaSZGVwbG95IGNvcnJlbGF0aW9uIHdpbmRvdy4gQSBwZXItb3JnXG4gKiBvdmVycmlkZSAoZnJvbSBgZG9yYV9zZXR0aW5ncy5pbmNpZGVudF93aW5kb3dfaG91cnNgLCBzdXJmYWNlZCB0aHJvdWdoIHRoZVxuICogc2V0dGluZ3MgZW5kcG9pbnQgYW5kIHRocmVhZGVkIGludG8ge0BsaW5rIERvcmFPcHRpb25zLmluY2lkZW50V2luZG93SG91cnN9KVxuICogd2lucyB3aGVuIGl0IGlzIGEgcG9zaXRpdmUgZmluaXRlIG51bWJlcjsgb3RoZXJ3aXNlIHRoZSBnbG9iYWwgZW52IGRlZmF1bHRcbiAqIGBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSU2AgYXBwbGllcy4gQ2VudHJhbGl6ZWQgc28gdGhlIERPUkEgY29ycmVsYXRpb24sIHRoZVxuICogaW5jaWRlbnRzIGxpc3QsIGFuZCB0aGUgd2lyaW5nLXRlc3QgZHJ5LXJ1biBhbGwgYWdyZWUgb24gdGhlIHNhbWUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJbmNpZGVudFdpbmRvd0hvdXJzKG92ZXJyaWRlPzogbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XG4gIHJldHVybiBvdmVycmlkZSAhPSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShvdmVycmlkZSkgJiYgb3ZlcnJpZGUgPiAwID8gb3ZlcnJpZGUgOiBET1JBX0lOQ0lERU5UX1dJTkRPV19IT1VSUztcbn1cblxuLyoqXG4gKiBSZXBvcnRpbmcgcmV0ZW50aW9uIHdpbmRvd3MuIFJlY29yZHMgaW4gYHBpcGVsaW5lX2V2ZW50c2AsXG4gKiBgZGVwbG95bWVudF9vdXRjb21lc2AsIGFuZCBgaW5jaWRlbnRzYCBncm93IHVuYm91bmRlZCB3aXRob3V0IGEgc3dlZXAsIHNvIGFcbiAqIHNwbGl0LCBwZXItb3JnIHJldGVudGlvbiBwdXJnZSAoc2VlIHtAbGluayBSZXBvcnRpbmdTZXJ2aWNlLnB1cmdlRXhwaXJlZFJlcG9ydGluZ0RhdGF9KVxuICogaGFyZC1kZWxldGVzIHJvd3Mgb2xkZXIgdGhhbiB0aGVzZSB3aW5kb3dzLCBieSBgY3JlYXRlZF9hdGA6XG4gKiAgLSAqKlN0YW5kYXJkIGV2ZW50cyoqIOKAlCBgcGlwZWxpbmVfZXZlbnRzYCB3aXRoIGBlbnZpcm9ubWVudCBJUyBOVUxMYCBhbmQgbm9cbiAqICAgIGBjb21taXRfdGltZXN0YW1wYCAobm9uLWRlcGxveSBTVEFHRS9BQ1RJT04vYnVpbGQpLiBIaWdoIHZvbHVtZSDihpIgc2hvcnRcbiAqICAgIGRlZmF1bHQgKDMwIGRheXMpLiBBIHJvdyB0aGF0IERPRVMgY2FycnkgYSBjb21taXQgdGltZXN0YW1wIGlzIERPUkEgc291cmNlXG4gKiAgICBkYXRhIOKAlCBsZWFkIHRpbWUgam9pbnMgb24gaXQg4oCUIHNvIGl0IGZvbGxvd3MgdGhlIERPUkEgd2luZG93IGluc3RlYWQuXG4gKiAgLSAqKkRPUkEgc291cmNlKiog4oCUIGBwaXBlbGluZV9ldmVudHNgIHdpdGggYGVudmlyb25tZW50IElTIE5PVCBOVUxMYCAoZGVwbG95XG4gKiAgICBzdGFnZXMpIHBsdXMgYWxsIG9mIGBkZXBsb3ltZW50X291dGNvbWVzYCBhbmQgYGluY2lkZW50c2AuIExvdyB2b2x1bWUg4oaSXG4gKiAgICBsb25nZXIgZGVmYXVsdCAoMTgwIGRheXMpLiBET1JBIGhpc3RvcnkgaXMgdGhlcmVmb3JlIGJvdW5kZWQgYnkgdGhpcyB3aW5kb3c7XG4gKiAgICB0aGUgcmVwb3J0IHF1ZXJ5IHN0aWxsIGhhcmQtY2FwcyBhdCAzNjUgZGF5cyAoYSBsb25nZXIgcGVyLW9yZyBvdmVycmlkZSBvbmx5XG4gKiAgICByZXRhaW5zIHJhdyBzb3VyY2Ugcm93cywgbmV2ZXIgd2lkZW5zIGEgcmVwb3J0KS5cbiAqIGBpbmdlc3RfaGVhbHRoYCBhbmQgYGRvcmFfc2V0dGluZ3NgIGFyZSBuZXZlciBwdXJnZWQuIEVudi1vdmVycmlkYWJsZSBnbG9iYWxzO1xuICogYSBwZXItb3JnIG92ZXJyaWRlIGluIGBkb3JhX3NldHRpbmdzYCB3aW5zIChzZWUge0BsaW5rIHJlc29sdmVFdmVudFJldGVudGlvbkRheXN9KS5cbiAqL1xuXG4vKiogRGVwbG95bWVudCBmcmVxdWVuY3kgYnkgZGVwbG95cy9kYXk6IGVsaXRlIOKJpTEvZGF5LCBoaWdoIOKJpTEvd2VlaywgbWVkaXVtIOKJpTEvbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yRnJlcXVlbmN5KHBlckRheTogbnVtYmVyLCBkZXBsb3ltZW50czogbnVtYmVyKTogRG9yYUxldmVsIHtcbiAgaWYgKGRlcGxveW1lbnRzIDw9IDApIHJldHVybiBudWxsO1xuICBpZiAocGVyRGF5ID49IDEpIHJldHVybiAnZWxpdGUnO1xuICBpZiAocGVyRGF5ID49IDEgLyA3KSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAocGVyRGF5ID49IDEgLyAzMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogQ2hhbmdlIGZhaWx1cmUgcmF0ZSBieSBwZXJjZW50OiBlbGl0ZSDiiaQ1JSwgaGlnaCDiiaQxMCUsIG1lZGl1bSDiiaQxNSUuICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yQ2hhbmdlRmFpbHVyZShwY3Q6IG51bWJlciwgdG90YWw6IG51bWJlcik6IERvcmFMZXZlbCB7XG4gIGlmICh0b3RhbCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBjdCA8PSA1KSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKHBjdCA8PSAxMCkgcmV0dXJuICdoaWdoJztcbiAgaWYgKHBjdCA8PSAxNSkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogVGltZSB0byByZXN0b3JlIGJ5IHNlY29uZHM6IGVsaXRlIDwxaCwgaGlnaCA8MSBkYXksIG1lZGl1bSA8MSB3ZWVrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvcmFMZXZlbEZvclJlc3RvcmUoYXZnU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChhdmdTZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAoYXZnU2Vjb25kcyA8IDM2MDApIHJldHVybiAnZWxpdGUnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2hpZ2gnO1xuICBpZiAoYXZnU2Vjb25kcyA8IDYwNDgwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG4vKiogTGVhZCB0aW1lIGJ5IHNlY29uZHM6IGVsaXRlIDwxIGRheSwgaGlnaCA8MSB3ZWVrLCBtZWRpdW0gPDEgbW9udGguICovXG5leHBvcnQgZnVuY3Rpb24gZG9yYUxldmVsRm9yTGVhZFRpbWUobWVkaWFuU2Vjb25kczogbnVtYmVyIHwgbnVsbCk6IERvcmFMZXZlbCB7XG4gIGlmIChtZWRpYW5TZWNvbmRzID09IG51bGwpIHJldHVybiBudWxsO1xuICBpZiAobWVkaWFuU2Vjb25kcyA8IDg2NDAwKSByZXR1cm4gJ2VsaXRlJztcbiAgaWYgKG1lZGlhblNlY29uZHMgPCA2MDQ4MDApIHJldHVybiAnaGlnaCc7XG4gIGlmIChtZWRpYW5TZWNvbmRzIDwgMjU5MjAwMCkgcmV0dXJuICdtZWRpdW0nO1xuICByZXR1cm4gJ2xvdyc7XG59XG5cbi8qKlxuICogUm91bmQgYHZhbHVlYCB0byBgZGlnaXRzYCBkZWNpbWFsIHBsYWNlcywgcmV0dXJuaW5nIGEgcmVhbCBudW1iZXIuIFNtYWxsXG4gKiBtb2R1bGUtcHJpdmF0ZSBoZWxwZXIgc28gdGhlIERPUkEgc2hhcGluZyBkb2Vzbid0IHJlcGVhdCB0aGVcbiAqIGBOdW1iZXIoTnVtYmVyKHgpLnRvRml4ZWQobikpYCBwYXR0ZXJuICh0b0ZpeGVkIGFsb25lIHlpZWxkcyBhIHN0cmluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCBkaWdpdHM6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBOdW1iZXIodmFsdWUudG9GaXhlZChkaWdpdHMpKTtcbn1cblxuLyoqXG4gKiBNZWRpYW4gb2YgYSBudW1lcmljIHNhbXBsZSwgb3IgYG51bGxgIHdoZW4gZW1wdHkuIFVzZWQgZm9yIG1lYXN1cmVkIGxlYWQgdGltZVxuICogYW5kIE1UVFIg4oCUIGJvdGggYXJlIGNyb3NzLXNvdXJjZSBnYXBzIGNvbXB1dGVkIGluIEpTIGZyb20gY2xhbXBlZCBkZWx0YXMsIHNvXG4gKiB0aGUgbWVkaWFuIGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gU1FMIFBFUkNFTlRJTEVfQ09OVCAoa2VlcHMgdGhlIGdvbGRlblxuICogZml4dHVyZSB0ZXN0cyBhYmxlIHRvIHByb3ZlIHRoZSBtZXRyaWMgbWF0aCB3aXRob3V0IGEgbGl2ZSBQb3N0Z3JlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odmFsdWVzOiBudW1iZXJbXSk6IG51bWJlciB8IG51bGwge1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHMgPSBbLi4udmFsdWVzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IG1pZCA9IE1hdGguZmxvb3Iocy5sZW5ndGggLyAyKTtcbiAgcmV0dXJuIHMubGVuZ3RoICUgMiA9PT0gMSA/IHNbbWlkXSA6IChzW21pZCAtIDFdICsgc1ttaWRdKSAvIDI7XG59XG5cbi8qKlxuICogUm9sbCBhIGdyb3VwIG9mIGRlcGxveS9zdGFnZSBldmVudHMgKGdyb3VwZWQgcGVyIGV4ZWN1dGlvbikgdXAgdG8gb25lIHRlcm1pbmFsXG4gKiBzdGF0dXM6IEZBSUxFRCB3aW5zLCB0aGVuIFNVQ0NFRURFRCwgZWxzZSBPVEhFUiAoc3RpbGwtcnVubmluZyAvIG5vbi10ZXJtaW5hbCkuXG4gKiBTaGFyZWQgYnkgdGhlIHRocmVlIHBlci0oZW52fHN0YWdlLCBleGVjdXRpb24pIHJvbGx1cCBDVEVzIOKAlCBET1JBIG1ldHJpY3MsIERPUkFcbiAqIHRyZW5kLCBhbmQgYnVpbGQgaGVhbHRoIOKAlCBzbyB0aGUgcHJlY2VkZW5jZSBjYW4ndCBkcmlmdCBiZXR3ZWVuIHRoZW0uIEFzc3VtZXMgdGhlXG4gKiBncm91cGVkIGV2ZW50IGFsaWFzIGlzIGBlYC5cbiAqL1xuIl19
@@ -1,6 +1,6 @@
1
1
  import type { DoraOptions, DoraMetrics, DoraTrendPoint, BuildHealth } from './types.js';
2
2
  /**
3
- * 1.9 DORA metrics over a [from,to] deploy-completion window, org-scoped +
3
+ * DORA metrics over a [from,to] deploy-completion window, org-scoped +
4
4
  * rollup-aware. DEPLOY-BASIS ONLY — every metric derives from real deploy-stage
5
5
  * executions (`event_type='STAGE'` with a non-null `environment`, set by the
6
6
  * forwarder for the stages a user declared in `pb.deploys`). No run-based
@@ -9,8 +9,8 @@ import type { DoraOptions, DoraMetrics, DoraTrendPoint, BuildHealth } from './ty
9
9
  * Four scoped SQL scans run inside one tx (each org-gated by `p.org_id ${pred}`
10
10
  * / `o.org_id ${pred}` so a rollup passes the org→team subtree and a foreign
11
11
  * org's rows never enter): (1) terminal deploy rows PER (execution, env) — one
12
- * "deployment" = one execution reaching an env (D1) — → DF / deploy-time CFR /
13
- * measured lead time (lead time joins the execution's earliest commit, D2);
12
+ * "deployment" = one execution reaching an env — → DF / deploy-time CFR /
13
+ * measured lead time (lead time joins the execution's earliest commit);
14
14
  * the scan also reaches back `windowHours` before `from` so incidents opened
15
15
  * near the window start can correlate to a just-prior deploy; (2) `deployment_outcomes`
16
16
  * in-window → post-deploy CFR component; (3) production restored/failed
@@ -23,7 +23,7 @@ import type { DoraOptions, DoraMetrics, DoraTrendPoint, BuildHealth } from './ty
23
23
  */
24
24
  export declare function getDoraMetrics(orgId: string, from: string, to: string, orgIds?: string[], opts?: DoraOptions): Promise<DoraMetrics>;
25
25
  /**
26
- * 1.9b DORA trend — deployment frequency + deploy-time change-failure rate
26
+ * DORA trend — deployment frequency + deploy-time change-failure rate
27
27
  * bucketed by `interval` (day/week/month) for a sparkline. Deploy-basis like
28
28
  * getDoraMetrics: buckets terminal deploy-stage executions on their
29
29
  * `completed_at`. Shares the org/rollup + pipelineId/environment scoping. MTTR,
@@ -31,7 +31,7 @@ export declare function getDoraMetrics(orgId: string, from: string, to: string,
31
31
  */
32
32
  export declare function getDoraTrend(orgId: string, interval: string, from: string, to: string, orgIds?: string[], opts?: DoraOptions): Promise<DoraTrendPoint[]>;
33
33
  /**
34
- * 1.10 Per-pipeline BUILD HEALTH (Phase 6) — a standard (NOT `advanced_reporting`)
34
+ * Per-pipeline BUILD HEALTH — a standard (NOT `advanced_reporting`)
35
35
  * per-stage breakdown for one pipeline over a [from,to] window. Aggregates the
36
36
  * existing `pipeline_events` STAGE rows: each stage is rolled up per execution
37
37
  * to a terminal status (FAILED wins, then SUCCEEDED) + its max duration, then
@@ -41,7 +41,7 @@ export declare function getDoraTrend(orgId: string, interval: string, from: stri
41
41
  * a pipelineId owned by another org returns an empty breakdown.
42
42
  */
43
43
  export declare function getBuildHealth(orgId: string, pipelineId: string, from: string, to: string, orgIds?: string[]): Promise<BuildHealth>;
44
- /** 2.1 Plugin summary — counts and breakdowns.
44
+ /** Plugin summary — counts and breakdowns.
45
45
  * INTENTIONALLY SINGLE-ORG (no rollup): plugin inventory is an org-owned
46
46
  * asset count, not an execution/build activity report, so a parent's view is
47
47
  * its own plugins — teams manage their own inventory. Single `= $org` scope. */