@rudderhq/server 0.7.0 → 0.7.1

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 (139) hide show
  1. package/dist/bootstrap/register-api-routes.js +1 -1
  2. package/dist/bootstrap/register-api-routes.js.map +1 -1
  3. package/dist/bundled-plugins/plugin-linear/dist/worker.js +3 -1
  4. package/dist/bundled-plugins/plugin-linear/dist/worker.js.map +2 -2
  5. package/dist/product-analytics-collector-config.d.ts +33 -0
  6. package/dist/product-analytics-collector-config.d.ts.map +1 -0
  7. package/dist/product-analytics-collector-config.js +67 -0
  8. package/dist/product-analytics-collector-config.js.map +1 -0
  9. package/dist/product-analytics-collector-server.d.ts +26 -0
  10. package/dist/product-analytics-collector-server.d.ts.map +1 -0
  11. package/dist/product-analytics-collector-server.js +150 -0
  12. package/dist/product-analytics-collector-server.js.map +1 -0
  13. package/dist/routes/instance-settings.d.ts +1 -0
  14. package/dist/routes/instance-settings.d.ts.map +1 -1
  15. package/dist/routes/instance-settings.js +58 -0
  16. package/dist/routes/instance-settings.js.map +1 -1
  17. package/dist/routes/product-analytics-collector-report.d.ts +7 -0
  18. package/dist/routes/product-analytics-collector-report.d.ts.map +1 -0
  19. package/dist/routes/product-analytics-collector-report.js +159 -0
  20. package/dist/routes/product-analytics-collector-report.js.map +1 -0
  21. package/dist/routes/product-analytics-collector.d.ts +14 -2
  22. package/dist/routes/product-analytics-collector.d.ts.map +1 -1
  23. package/dist/routes/product-analytics-collector.js +141 -4
  24. package/dist/routes/product-analytics-collector.js.map +1 -1
  25. package/dist/routes/product-analytics.d.ts.map +1 -1
  26. package/dist/routes/product-analytics.js +40 -3
  27. package/dist/routes/product-analytics.js.map +1 -1
  28. package/dist/services/instance-settings.d.ts.map +1 -1
  29. package/dist/services/instance-settings.js +4 -0
  30. package/dist/services/instance-settings.js.map +1 -1
  31. package/dist/services/product-analytics-collector-maintenance.d.ts +25 -0
  32. package/dist/services/product-analytics-collector-maintenance.d.ts.map +1 -0
  33. package/dist/services/product-analytics-collector-maintenance.js +309 -0
  34. package/dist/services/product-analytics-collector-maintenance.js.map +1 -0
  35. package/dist/services/product-analytics-collector-maintenance.test.d.ts +2 -0
  36. package/dist/services/product-analytics-collector-maintenance.test.d.ts.map +1 -0
  37. package/dist/services/product-analytics-collector-maintenance.test.js +14 -0
  38. package/dist/services/product-analytics-collector-maintenance.test.js.map +1 -0
  39. package/dist/services/product-analytics-collector.d.ts +75 -3
  40. package/dist/services/product-analytics-collector.d.ts.map +1 -1
  41. package/dist/services/product-analytics-collector.js +363 -12
  42. package/dist/services/product-analytics-collector.js.map +1 -1
  43. package/dist/services/product-analytics-collector.test.js +25 -0
  44. package/dist/services/product-analytics-collector.test.js.map +1 -1
  45. package/dist/services/product-analytics-fixture.d.ts +7 -0
  46. package/dist/services/product-analytics-fixture.d.ts.map +1 -0
  47. package/dist/services/product-analytics-fixture.js +65 -0
  48. package/dist/services/product-analytics-fixture.js.map +1 -0
  49. package/dist/services/product-analytics-prd-gates.test.d.ts +2 -0
  50. package/dist/services/product-analytics-prd-gates.test.d.ts.map +1 -0
  51. package/dist/services/product-analytics-prd-gates.test.js +135 -0
  52. package/dist/services/product-analytics-prd-gates.test.js.map +1 -0
  53. package/dist/services/product-analytics.d.ts +17 -5
  54. package/dist/services/product-analytics.d.ts.map +1 -1
  55. package/dist/services/product-analytics.js +94 -12
  56. package/dist/services/product-analytics.js.map +1 -1
  57. package/package.json +17 -14
  58. package/ui-dist/assets/{LibraryLiveSurface-DeUIV5N_.js → LibraryLiveSurface-CZED7oKj.js} +1 -1
  59. package/ui-dist/assets/{abnfDiagram-VRR7QNED-BaoLM9Pd.js → abnfDiagram-VRR7QNED-BoPyIoAq.js} +1 -1
  60. package/ui-dist/assets/{arc-Cx0L6o2z.js → arc-DTYs4RCH.js} +1 -1
  61. package/ui-dist/assets/{architectureDiagram-ZJ3FMSHR-zVfZP7v4.js → architectureDiagram-ZJ3FMSHR-BGfp2S_3.js} +1 -1
  62. package/ui-dist/assets/{blockDiagram-677ZJIJ3-BiWWFP9R.js → blockDiagram-677ZJIJ3-aW0EGIUf.js} +1 -1
  63. package/ui-dist/assets/{c4Diagram-LMCZKHZV-CX65GSJ6.js → c4Diagram-LMCZKHZV--1itKgA2.js} +1 -1
  64. package/ui-dist/assets/channel-DLNwhPnC.js +1 -0
  65. package/ui-dist/assets/{chunk-2Q5K7J3B-CH6PlelX.js → chunk-2Q5K7J3B-ZIqIozPQ.js} +1 -1
  66. package/ui-dist/assets/{chunk-32BRIVSS-C7ZEXYO8.js → chunk-32BRIVSS-DiwBEZVQ.js} +1 -1
  67. package/ui-dist/assets/{chunk-5VM5RSS4-CyInWuue.js → chunk-5VM5RSS4-CLOrTmL8.js} +1 -1
  68. package/ui-dist/assets/{chunk-EX3LRPZG-D58qFIdM.js → chunk-EX3LRPZG-D6xZzF47.js} +1 -1
  69. package/ui-dist/assets/{chunk-JWPE2WC7-CJ3Qx30f.js → chunk-JWPE2WC7-B9tYvTZl.js} +1 -1
  70. package/ui-dist/assets/{chunk-MOJQB5TN-BO4bKVLH.js → chunk-MOJQB5TN-D_qo-SzM.js} +1 -1
  71. package/ui-dist/assets/{chunk-RYQCIY6F-DxBmxcYc.js → chunk-RYQCIY6F-ChPHGc2P.js} +1 -1
  72. package/ui-dist/assets/{chunk-V7JOEXUC-Chdnd6Lq.js → chunk-V7JOEXUC-Dk6GbZYp.js} +1 -1
  73. package/ui-dist/assets/{chunk-VR4S4FIN-GkW_x_pD.js → chunk-VR4S4FIN-B6AREC1T.js} +1 -1
  74. package/ui-dist/assets/{chunk-XXDRQBXY-BJyBGcSF.js → chunk-XXDRQBXY-CUyO-JUr.js} +1 -1
  75. package/ui-dist/assets/classDiagram-OUVF2IWQ-JsIc-rlc.js +1 -0
  76. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-JsIc-rlc.js +1 -0
  77. package/ui-dist/assets/{cose-bilkent-JH36ORCC-BWP2r8TX.js → cose-bilkent-JH36ORCC-BCxIInLZ.js} +1 -1
  78. package/ui-dist/assets/{cynefin-VYW2F7L2-C08dfI3w.js → cynefin-VYW2F7L2-DqsnpnHA.js} +1 -1
  79. package/ui-dist/assets/{cynefinDiagram-TSTJHNR4-h6dXjTaO.js → cynefinDiagram-TSTJHNR4-BD7QQNLW.js} +1 -1
  80. package/ui-dist/assets/{dagre-VKFMJZFB-CWDgoFQD.js → dagre-VKFMJZFB-DaE160f7.js} +1 -1
  81. package/ui-dist/assets/{diagram-FQU43EPY-CK1j48d-.js → diagram-FQU43EPY-DZ0c59y8.js} +1 -1
  82. package/ui-dist/assets/{diagram-G47NLZAW-CoSiG57q.js → diagram-G47NLZAW-C_413g5E.js} +1 -1
  83. package/ui-dist/assets/{diagram-NH7WQ7WH-DRG-xXGQ.js → diagram-NH7WQ7WH-D_o9pXB-.js} +1 -1
  84. package/ui-dist/assets/{diagram-OA4YK3LP-D04mMwYs.js → diagram-OA4YK3LP-BI2xMqiW.js} +1 -1
  85. package/ui-dist/assets/{diagram-WEI45ONY-ZkC1ZQMq.js → diagram-WEI45ONY-hhM8R_14.js} +1 -1
  86. package/ui-dist/assets/{ebnfDiagram-CCIWWBDH-BxMIw9PZ.js → ebnfDiagram-CCIWWBDH-DfFgEtmG.js} +1 -1
  87. package/ui-dist/assets/{erDiagram-Q63AITRT-B4Zwbn84.js → erDiagram-Q63AITRT-CCw4ysHK.js} +1 -1
  88. package/ui-dist/assets/{flowDiagram-23GEKE2U-D5pYz8Px.js → flowDiagram-23GEKE2U-CzC1SMmo.js} +1 -1
  89. package/ui-dist/assets/{ganttDiagram-NO4QXBWP-RSramodc.js → ganttDiagram-NO4QXBWP-CbPJIrIw.js} +1 -1
  90. package/ui-dist/assets/{gitGraphDiagram-IHSO6WYX-BFQfCkMd.js → gitGraphDiagram-IHSO6WYX-jCxJ66_C.js} +1 -1
  91. package/ui-dist/assets/{graph-DuSS8poS.js → graph-BfNZ9Jzj.js} +1 -1
  92. package/ui-dist/assets/{index-DRbt_Svi.js → index-B3h9Vdxx.js} +1 -1
  93. package/ui-dist/assets/{index-9U78M9Np.js → index-B8q4cbOz.js} +1 -1
  94. package/ui-dist/assets/{index-olsHIcXs.js → index-BE1vSI6a.js} +1 -1
  95. package/ui-dist/assets/{index-B-NP8fOI.js → index-BKn4zRjf.js} +1 -1
  96. package/ui-dist/assets/{index-BKXUkeeU.js → index-BULll2e0.js} +1 -1
  97. package/ui-dist/assets/{index-BpvytaKr.js → index-BjxRqzZK.js} +1 -1
  98. package/ui-dist/assets/{index-Cyq94-QT.js → index-Bwo-C8W5.js} +1 -1
  99. package/ui-dist/assets/{index-BADa8mxG.js → index-ByUFNj0O.js} +1 -1
  100. package/ui-dist/assets/{index-CHbXMgL0.js → index-Chop-Dpa.js} +1 -1
  101. package/ui-dist/assets/{index-BU0KLNTt.js → index-Ck-ZNQeD.js} +541 -528
  102. package/ui-dist/assets/index-CxPYXL3t.css +1 -0
  103. package/ui-dist/assets/{index-wZlfBtwh.js → index-D00XdcOq.js} +1 -1
  104. package/ui-dist/assets/{index-BGcgy63z.js → index-D_K-9VDs.js} +1 -1
  105. package/ui-dist/assets/{index-DzdRgH-y.js → index-DiMDROQY.js} +1 -1
  106. package/ui-dist/assets/{index-5tzBDABj.js → index-DmjAbzHq.js} +1 -1
  107. package/ui-dist/assets/{index-De3vaw_P.js → index-SkHIC7Ma.js} +1 -1
  108. package/ui-dist/assets/{infoDiagram-FWYZ7A6U-f5i4pO3J.js → infoDiagram-FWYZ7A6U-BkDimGw3.js} +1 -1
  109. package/ui-dist/assets/{ishikawaDiagram-FXEZZL3T-CVEdv5i_.js → ishikawaDiagram-FXEZZL3T-BAyUfn6x.js} +1 -1
  110. package/ui-dist/assets/{journeyDiagram-5HDEW3XC-Cvp7vWcy.js → journeyDiagram-5HDEW3XC-DlbpTZHG.js} +1 -1
  111. package/ui-dist/assets/{kanban-definition-HUTT4EX6-C6dURjjK.js → kanban-definition-HUTT4EX6-Cd67S14K.js} +1 -1
  112. package/ui-dist/assets/{layout-DxdOu9MY.js → layout-Dc4YEiCC.js} +1 -1
  113. package/ui-dist/assets/{linear-CRi8RB_7.js → linear-BhRsbD_5.js} +1 -1
  114. package/ui-dist/assets/{map-BlpDrw_l.js → map-CEWybj6z.js} +1 -1
  115. package/ui-dist/assets/{mermaid.core-2Gz9YusH.js → mermaid.core-CqqAFYNg.js} +4 -4
  116. package/ui-dist/assets/{mindmap-definition-LN4V7U3C-BmSjJLTI.js → mindmap-definition-LN4V7U3C-CCb-XmEi.js} +1 -1
  117. package/ui-dist/assets/{pegDiagram-2B236MQR-BTUboUw8.js → pegDiagram-2B236MQR-CqUV14VZ.js} +1 -1
  118. package/ui-dist/assets/{pieDiagram-ENE6RG2P-CVPP8SYv.js → pieDiagram-ENE6RG2P-Dn_M_GRM.js} +1 -1
  119. package/ui-dist/assets/{quadrantDiagram-ABIIQ3AL-BG4FmirT.js → quadrantDiagram-ABIIQ3AL-rAEhJDr2.js} +1 -1
  120. package/ui-dist/assets/{railroadDiagram-RFXS5EU6-DFRNo9hF.js → railroadDiagram-RFXS5EU6-iE2o_jkH.js} +1 -1
  121. package/ui-dist/assets/{requirementDiagram-TGXJPOKE-DpnVF9qP.js → requirementDiagram-TGXJPOKE-BFyKBR1h.js} +1 -1
  122. package/ui-dist/assets/{sankeyDiagram-HTMAVEWB-D1ETFdSE.js → sankeyDiagram-HTMAVEWB-DRa_2YB6.js} +1 -1
  123. package/ui-dist/assets/{sequenceDiagram-DBY2YBRQ-CNqzB_AL.js → sequenceDiagram-DBY2YBRQ-BG8VIjD7.js} +1 -1
  124. package/ui-dist/assets/{sizeCapture-X5ZJPWSS-DuoMCjdH.js → sizeCapture-X5ZJPWSS-CS1xlbzG.js} +1 -1
  125. package/ui-dist/assets/{stateDiagram-2N3HPSRC-fmHeKL8l.js → stateDiagram-2N3HPSRC-BSl2RUJ1.js} +1 -1
  126. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DUVNSzI8.js +1 -0
  127. package/ui-dist/assets/{swimlanes-5IMT3BWC-hjosaIhT.js → swimlanes-5IMT3BWC-BT8Hrm9J.js} +2 -2
  128. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DfLFj7sh.js +8 -0
  129. package/ui-dist/assets/{timeline-definition-FHXFAJF6-xoMEClc-.js → timeline-definition-FHXFAJF6-CfYIqEuQ.js} +1 -1
  130. package/ui-dist/assets/{vennDiagram-L72KCM5P-sdSXQfX-.js → vennDiagram-L72KCM5P-C8zBH7o9.js} +1 -1
  131. package/ui-dist/assets/{wardleyDiagram-EHGQE667-BbQBSKlD.js → wardleyDiagram-EHGQE667-D5HyFfI9.js} +1 -1
  132. package/ui-dist/assets/{xychartDiagram-FW5EYKEG-BfAtadyK.js → xychartDiagram-FW5EYKEG-CGItJmLx.js} +1 -1
  133. package/ui-dist/index.html +2 -2
  134. package/ui-dist/assets/channel-CHc3ibOz.js +0 -1
  135. package/ui-dist/assets/classDiagram-OUVF2IWQ-9iLZpz3t.js +0 -1
  136. package/ui-dist/assets/classDiagram-v2-EOCWNBFH-9iLZpz3t.js +0 -1
  137. package/ui-dist/assets/index-QrRs-r-4.css +0 -1
  138. package/ui-dist/assets/stateDiagram-v2-6OUMAXLB-DajAVikh.js +0 -1
  139. package/ui-dist/assets/swimlanesDiagram-G3AALYLV-DJjG9OJ-.js +0 -8
@@ -1,5 +1,7 @@
1
+ import { privateProductAnalyticsCollectorEvents, privateProductAnalyticsCollectorInstallations, privateProductAnalyticsCollectorQualityCounters, privateProductAnalyticsCollectorSubjects, } from "@rudderhq/db";
2
+ import { and, eq, sql } from "drizzle-orm";
1
3
  import { createHash } from "node:crypto";
2
- import { PRODUCT_ANALYTICS_EVENT_NAMES } from "./product-analytics.js";
4
+ import { PRODUCT_ANALYTICS_EVENT_NAMES, PRODUCT_ANALYTICS_EVENT_PROPERTY_ALLOWLIST } from "./product-analytics.js";
3
5
  const MAX_BATCH_EVENTS = 100;
4
6
  const MAX_BATCH_BYTES = 64 * 1024;
5
7
  const MAX_EVENT_BYTES = 2 * 1024;
@@ -10,6 +12,7 @@ const SENSITIVE_KEY = /(prompt|transcript|title|description|body|content|url|tok
10
12
  const EVENT_NAMES = new Set(PRODUCT_ANALYTICS_EVENT_NAMES);
11
13
  export class InMemoryProductAnalyticsCollectorStore {
12
14
  installations = new Map();
15
+ subjects = new Map();
13
16
  events = new Map();
14
17
  getInstallationState(installationId) {
15
18
  return this.installations.get(installationId) ?? null;
@@ -17,6 +20,12 @@ export class InMemoryProductAnalyticsCollectorStore {
17
20
  setInstallationState(installationId, state) {
18
21
  this.installations.set(installationId, { ...state });
19
22
  }
23
+ getSubjectState(installationId, analyticsSubject) {
24
+ return this.subjects.get(`${installationId}\u0000${analyticsSubject}`) ?? null;
25
+ }
26
+ setSubjectState(installationId, analyticsSubject, state) {
27
+ this.subjects.set(`${installationId}\u0000${analyticsSubject}`, { ...state });
28
+ }
20
29
  getEvent(eventId) {
21
30
  return this.events.get(eventId) ?? null;
22
31
  }
@@ -41,13 +50,81 @@ function canonicalJson(value) {
41
50
  }
42
51
  return JSON.stringify(value);
43
52
  }
44
- function hashPayload(value) {
53
+ export function hashProductAnalyticsCollectorPayload(value) {
45
54
  return createHash("sha256").update(canonicalJson(value)).digest("hex");
46
55
  }
56
+ /**
57
+ * Build a privacy-safe collector dashboard without exposing installation IDs.
58
+ * The central deployment can persist the same dimensions in SQL rollups; this
59
+ * pure projection is also the deterministic contract fixture for those jobs.
60
+ */
61
+ export function buildProductAnalyticsCollectorDashboard(events, options = {}) {
62
+ const privacyThreshold = Number.isInteger(options.privacyThreshold) && (options.privacyThreshold ?? 0) > 0
63
+ ? options.privacyThreshold
64
+ : 10;
65
+ const rollupGroups = new Map();
66
+ const firstSeenByInstallation = new Map();
67
+ let lateEventCount = 0;
68
+ let backfillEventCount = 0;
69
+ let missingPseudonymousInstallationCount = 0;
70
+ for (const event of events) {
71
+ const occurredAt = new Date(event.occurredAt);
72
+ const effectiveAt = new Date(event.effectiveAt);
73
+ if (event.late || effectiveAt.getTime() !== occurredAt.getTime())
74
+ lateEventCount += 1;
75
+ if (event.isBackfill)
76
+ backfillEventCount += 1;
77
+ if (!event.pseudonymousInstallationId)
78
+ missingPseudonymousInstallationCount += 1;
79
+ const day = occurredAt.toISOString().slice(0, 10);
80
+ const key = `${day}\u0000${event.eventName}\u0000${event.origin}`;
81
+ const group = rollupGroups.get(key) ?? { day, eventName: event.eventName, origin: event.origin, eventCount: 0, installations: new Set() };
82
+ group.eventCount += 1;
83
+ group.installations.add(event.installationId);
84
+ rollupGroups.set(key, group);
85
+ const firstSeenDay = firstSeenByInstallation.get(event.installationId);
86
+ if (!firstSeenDay || day < firstSeenDay)
87
+ firstSeenByInstallation.set(event.installationId, day);
88
+ }
89
+ const rollups = [...rollupGroups.values()]
90
+ .sort((left, right) => left.day.localeCompare(right.day) || left.eventName.localeCompare(right.eventName) || left.origin.localeCompare(right.origin))
91
+ .map((group) => {
92
+ const contributingInstallations = group.installations.size;
93
+ const suppressed = contributingInstallations < privacyThreshold;
94
+ return {
95
+ day: group.day,
96
+ eventName: group.eventName,
97
+ origin: group.origin,
98
+ eventCount: suppressed ? null : group.eventCount,
99
+ contributingInstallations,
100
+ suppressed,
101
+ };
102
+ });
103
+ const cohorts = [...firstSeenByInstallation.values()].reduce((counts, day) => {
104
+ counts.set(day, (counts.get(day) ?? 0) + 1);
105
+ return counts;
106
+ }, new Map());
107
+ return {
108
+ rollups,
109
+ cohorts: [...cohorts.entries()].sort(([left], [right]) => left.localeCompare(right)).map(([firstSeenDay, installationCount]) => ({
110
+ firstSeenDay,
111
+ installationCount: installationCount < privacyThreshold ? null : installationCount,
112
+ suppressed: installationCount < privacyThreshold,
113
+ })),
114
+ quality: {
115
+ acceptedEventCount: events.length,
116
+ lateEventCount,
117
+ backfillEventCount,
118
+ missingPseudonymousInstallationCount,
119
+ suppressedRollupCount: rollups.filter((rollup) => rollup.suppressed).length,
120
+ privacyThreshold,
121
+ },
122
+ };
123
+ }
47
124
  function reject(code, eventId, late = false) {
48
125
  return { eventId, status: "rejected", errorCode: code, late };
49
126
  }
50
- function validateEvent(value) {
127
+ export function validateProductAnalyticsCollectorEvent(value, now = new Date()) {
51
128
  if (!value || typeof value !== "object" || Array.isArray(value))
52
129
  return reject("invalid_schema", "unknown");
53
130
  const event = value;
@@ -69,10 +146,10 @@ function validateEvent(value) {
69
146
  const occurredAt = new Date(event.occurredAt);
70
147
  if (Number.isNaN(occurredAt.getTime()))
71
148
  return reject("invalid_event", event.eventId);
72
- const now = Date.now();
73
- if (occurredAt.getTime() > now + MAX_FUTURE_SKEW_MS)
149
+ const nowMs = now.getTime();
150
+ if (occurredAt.getTime() > nowMs + MAX_FUTURE_SKEW_MS)
74
151
  return reject("future_event", event.eventId);
75
- const late = now - occurredAt.getTime() > MAX_LATE_EVENT_MS;
152
+ const late = nowMs - occurredAt.getTime() > MAX_LATE_EVENT_MS;
76
153
  if (!["production", "development", "test"].includes(String(event.environment)))
77
154
  return reject("invalid_event", event.eventId, late);
78
155
  if (!["development", "preview", "canary", "stable"].includes(String(event.releaseChannel)))
@@ -96,10 +173,13 @@ function validateEvent(value) {
96
173
  if (!event.properties || typeof event.properties !== "object" || Array.isArray(event.properties))
97
174
  return reject("invalid_event", event.eventId, late);
98
175
  for (const [key, property] of Object.entries(event.properties)) {
99
- if (SENSITIVE_KEY.test(key) || !isScalar(property) || (typeof property === "string" && property.length > 80) || (typeof property === "number" && !Number.isFinite(property))) {
176
+ const allowlist = PRODUCT_ANALYTICS_EVENT_PROPERTY_ALLOWLIST[event.eventName];
177
+ if (!allowlist?.has(key) || SENSITIVE_KEY.test(key) || !isScalar(property) || (typeof property === "string" && property.length > 80) || (typeof property === "number" && !Number.isFinite(property))) {
100
178
  return reject("invalid_event", event.eventId, late);
101
179
  }
102
180
  }
181
+ if (event.pseudonymousInstallationId === null || typeof event.pseudonymousInstallationId !== "string")
182
+ return reject("invalid_event", event.eventId, late);
103
183
  const serialized = JSON.stringify(event);
104
184
  if (Buffer.byteLength(serialized, "utf8") > MAX_EVENT_BYTES)
105
185
  return reject("too_large", event.eventId, late);
@@ -120,19 +200,25 @@ export function createProductAnalyticsCollector(store = new InMemoryProductAnaly
120
200
  if (events.length > MAX_BATCH_EVENTS || Buffer.byteLength(serializedBatch, "utf8") > MAX_BATCH_BYTES) {
121
201
  return { accepted: 0, duplicate: 0, rejected: [{ eventId: "batch", status: "rejected", errorCode: "too_large", late: false }], receivedAt: now.toISOString() };
122
202
  }
123
- const installationState = store.getInstallationState(authorization.installationId);
203
+ const installationState = authorization.mode === "account_linked" && authorization.analyticsSubject
204
+ ? store.getSubjectState?.(authorization.installationId, authorization.analyticsSubject)
205
+ : store.getInstallationState(authorization.installationId);
124
206
  if (!installationState || installationState.revoked || installationState.consentEpoch !== authorization.consentEpoch || installationState.consentVersion !== authorization.consentVersion) {
125
207
  return { accepted: 0, duplicate: 0, rejected: events.map((value) => reject("revoked", typeof value?.eventId === "string" ? String(value.eventId) : "unknown")), receivedAt: now.toISOString() };
126
208
  }
127
209
  const acks = [];
128
210
  for (const value of events) {
129
- const result = validateEvent(value);
211
+ const result = validateProductAnalyticsCollectorEvent(value, now);
130
212
  if ("status" in result) {
131
213
  acks.push(result);
132
214
  continue;
133
215
  }
216
+ if (authorization.pseudonymousInstallationId && result.event.pseudonymousInstallationId !== authorization.pseudonymousInstallationId) {
217
+ acks.push(reject("invalid_event", result.event.eventId, result.late));
218
+ continue;
219
+ }
134
220
  const existing = store.getEvent(result.event.eventId);
135
- const payloadSha256 = hashPayload(result.event);
221
+ const payloadSha256 = hashProductAnalyticsCollectorPayload(result.event);
136
222
  if (existing) {
137
223
  acks.push(existing.payloadSha256 === payloadSha256
138
224
  ? { eventId: result.event.eventId, status: "duplicate", late: result.late }
@@ -147,6 +233,8 @@ export function createProductAnalyticsCollector(store = new InMemoryProductAnaly
147
233
  consentEpoch: authorization.consentEpoch,
148
234
  payloadSha256,
149
235
  receivedAt: now.toISOString(),
236
+ effectiveAt: (result.late ? now : new Date(result.event.occurredAt)).toISOString(),
237
+ late: result.late,
150
238
  });
151
239
  acks.push({ eventId: result.event.eventId, status: "accepted", late: result.late });
152
240
  }
@@ -158,15 +246,278 @@ export function createProductAnalyticsCollector(store = new InMemoryProductAnaly
158
246
  };
159
247
  }
160
248
  function advanceConsent(input) {
161
- const current = store.getInstallationState(input.installationId);
249
+ const current = input.analyticsSubject
250
+ ? store.getSubjectState?.(input.installationId, input.analyticsSubject)
251
+ : store.getInstallationState(input.installationId);
162
252
  // Consent epochs are monotonic. Treat an equal or older epoch as already
163
253
  // applied so a replay cannot change revocation state without a new epoch.
164
254
  if (current && input.consentEpoch <= current.consentEpoch)
165
255
  return current;
166
256
  const next = { consentVersion: input.consentVersion, consentEpoch: input.consentEpoch, revoked: input.revoked };
167
- store.setInstallationState(input.installationId, next);
257
+ if (input.analyticsSubject)
258
+ store.setSubjectState?.(input.installationId, input.analyticsSubject, next);
259
+ else
260
+ store.setInstallationState(input.installationId, next);
168
261
  return next;
169
262
  }
170
263
  return { ingestBatch, advanceConsent, store };
171
264
  }
265
+ /**
266
+ * PostgreSQL-backed collector used by the private telemetry deployment. The
267
+ * local app never mounts this route, so these tables can live in a separately
268
+ * permissioned database/schema in production while sharing the same contract.
269
+ */
270
+ export function createProductAnalyticsPersistentCollector(db) {
271
+ async function recordQualityCounters(input) {
272
+ const day = input.now.toISOString().slice(0, 10);
273
+ await db.insert(privateProductAnalyticsCollectorQualityCounters).values({
274
+ day,
275
+ receivedBatches: 1,
276
+ acceptedEvents: input.acceptedEvents,
277
+ duplicateEvents: input.duplicateEvents,
278
+ rejectedEvents: input.rejectedEvents,
279
+ lateEvents: input.lateEvents,
280
+ updatedAt: input.now,
281
+ }).onConflictDoUpdate({
282
+ target: privateProductAnalyticsCollectorQualityCounters.day,
283
+ set: {
284
+ receivedBatches: sql `${privateProductAnalyticsCollectorQualityCounters.receivedBatches} + 1`,
285
+ acceptedEvents: sql `${privateProductAnalyticsCollectorQualityCounters.acceptedEvents} + ${input.acceptedEvents}`,
286
+ duplicateEvents: sql `${privateProductAnalyticsCollectorQualityCounters.duplicateEvents} + ${input.duplicateEvents}`,
287
+ rejectedEvents: sql `${privateProductAnalyticsCollectorQualityCounters.rejectedEvents} + ${input.rejectedEvents}`,
288
+ lateEvents: sql `${privateProductAnalyticsCollectorQualityCounters.lateEvents} + ${input.lateEvents}`,
289
+ updatedAt: input.now,
290
+ },
291
+ });
292
+ }
293
+ async function readState(installationId) {
294
+ const [row] = await db.select({
295
+ mode: privateProductAnalyticsCollectorInstallations.mode,
296
+ consentVersion: privateProductAnalyticsCollectorInstallations.consentVersion,
297
+ consentEpoch: privateProductAnalyticsCollectorInstallations.consentEpoch,
298
+ revoked: privateProductAnalyticsCollectorInstallations.revoked,
299
+ analyticsSubject: privateProductAnalyticsCollectorInstallations.analyticsSubject,
300
+ }).from(privateProductAnalyticsCollectorInstallations)
301
+ .where(eq(privateProductAnalyticsCollectorInstallations.installationId, installationId)).limit(1);
302
+ return row ?? null;
303
+ }
304
+ async function readSubjectState(installationId, analyticsSubject) {
305
+ const [row] = await db.select({
306
+ consentVersion: privateProductAnalyticsCollectorSubjects.consentVersion,
307
+ consentEpoch: privateProductAnalyticsCollectorSubjects.consentEpoch,
308
+ revoked: sql `${privateProductAnalyticsCollectorSubjects.revokedAt} IS NOT NULL`,
309
+ }).from(privateProductAnalyticsCollectorSubjects)
310
+ .where(and(eq(privateProductAnalyticsCollectorSubjects.installationId, installationId), eq(privateProductAnalyticsCollectorSubjects.analyticsSubject, analyticsSubject))).limit(1);
311
+ return row ?? null;
312
+ }
313
+ async function ensureState(authorization, now) {
314
+ void now;
315
+ // A signed assertion proves identity, not consent. The Identity ledger
316
+ // sync hook must establish this row before upload is accepted.
317
+ return readState(authorization.installationId);
318
+ }
319
+ async function ensureSubjectState(authorization, now) {
320
+ const analyticsSubject = authorization.analyticsSubject;
321
+ if (!analyticsSubject)
322
+ return null;
323
+ const existing = await readSubjectState(authorization.installationId, analyticsSubject);
324
+ void now;
325
+ // Do not advance or create a subject row from assertion claims. A grant
326
+ // must arrive through the private Identity consent sync hook.
327
+ return existing;
328
+ }
329
+ async function ingestBatch(input) {
330
+ const now = input.now ?? new Date();
331
+ const events = Array.isArray(input.events) ? input.events : null;
332
+ if (!events) {
333
+ await recordQualityCounters({ now, acceptedEvents: 0, duplicateEvents: 0, rejectedEvents: 1, lateEvents: 0 });
334
+ return { accepted: 0, duplicate: 0, rejected: [{ eventId: "batch", status: "rejected", errorCode: "invalid_schema", late: false }], receivedAt: now.toISOString() };
335
+ }
336
+ const serializedBatch = JSON.stringify(events) ?? "";
337
+ if (events.length > MAX_BATCH_EVENTS || Buffer.byteLength(serializedBatch, "utf8") > MAX_BATCH_BYTES) {
338
+ await recordQualityCounters({ now, acceptedEvents: 0, duplicateEvents: 0, rejectedEvents: 1, lateEvents: 0 });
339
+ return { accepted: 0, duplicate: 0, rejected: [{ eventId: "batch", status: "rejected", errorCode: "too_large", late: false }], receivedAt: now.toISOString() };
340
+ }
341
+ const installationState = await ensureState(input.authorization, now);
342
+ const state = input.authorization.mode === "account_linked"
343
+ ? await ensureSubjectState(input.authorization, now)
344
+ : installationState?.mode === "anonymous" ? installationState : null;
345
+ if (input.authorization.mode === "account_linked" && !input.authorization.analyticsSubject) {
346
+ return { accepted: 0, duplicate: 0, rejected: events.map((value) => reject("invalid_schema", typeof value?.eventId === "string" ? String(value.eventId) : "unknown")), receivedAt: now.toISOString() };
347
+ }
348
+ if (!state || state.revoked || state.consentEpoch !== input.authorization.consentEpoch || state.consentVersion !== input.authorization.consentVersion) {
349
+ return { accepted: 0, duplicate: 0, rejected: events.map((value) => reject("revoked", typeof value?.eventId === "string" ? String(value.eventId) : "unknown")), receivedAt: now.toISOString() };
350
+ }
351
+ const acknowledgements = [];
352
+ for (const value of events) {
353
+ const result = validateProductAnalyticsCollectorEvent(value, now);
354
+ if ("status" in result) {
355
+ acknowledgements.push(result);
356
+ continue;
357
+ }
358
+ if (input.authorization.pseudonymousInstallationId && result.event.pseudonymousInstallationId !== input.authorization.pseudonymousInstallationId) {
359
+ acknowledgements.push(reject("invalid_event", result.event.eventId, result.late));
360
+ continue;
361
+ }
362
+ const payloadSha256 = hashProductAnalyticsCollectorPayload(result.event);
363
+ const [existing] = await db.select({ payloadSha256: privateProductAnalyticsCollectorEvents.payloadSha256 })
364
+ .from(privateProductAnalyticsCollectorEvents).where(eq(privateProductAnalyticsCollectorEvents.eventId, result.event.eventId)).limit(1);
365
+ if (existing) {
366
+ acknowledgements.push(existing.payloadSha256 === payloadSha256
367
+ ? { eventId: result.event.eventId, status: "duplicate", late: result.late }
368
+ : { eventId: result.event.eventId, status: "rejected", errorCode: "conflict", late: result.late });
369
+ continue;
370
+ }
371
+ const [inserted] = await db.insert(privateProductAnalyticsCollectorEvents).values({
372
+ eventId: result.event.eventId,
373
+ installationId: input.authorization.installationId,
374
+ analyticsSubject: input.authorization.mode === "account_linked" ? input.authorization.analyticsSubject ?? null : null,
375
+ eventName: result.event.eventName,
376
+ schemaVersion: result.event.schemaVersion,
377
+ occurredAt: new Date(result.event.occurredAt),
378
+ receivedAt: now,
379
+ effectiveAt: result.late ? now : new Date(result.event.occurredAt),
380
+ environment: result.event.environment,
381
+ appVersion: result.event.appVersion,
382
+ releaseChannel: result.event.releaseChannel,
383
+ deploymentMode: result.event.deploymentMode,
384
+ coarsePlatform: null,
385
+ actorKind: result.event.actorKind,
386
+ origin: result.event.origin,
387
+ isInternal: false,
388
+ pseudonymousInstallationId: result.event.pseudonymousInstallationId,
389
+ pseudonymousOrgId: result.event.pseudonymousOrgId,
390
+ pseudonymousWorkId: result.event.pseudonymousWorkId,
391
+ pseudonymousWorkCycleId: result.event.pseudonymousWorkCycleId,
392
+ pseudonymousRootRunId: result.event.pseudonymousRootRunId,
393
+ pseudonymousRunId: result.event.pseudonymousRunId,
394
+ completionRevision: result.event.completionRevision,
395
+ properties: result.event.properties,
396
+ confidence: result.event.confidence,
397
+ isBackfill: result.event.isBackfill,
398
+ late: result.late,
399
+ consentVersion: input.authorization.consentVersion,
400
+ consentEpoch: input.authorization.consentEpoch,
401
+ payloadSha256,
402
+ }).onConflictDoNothing({ target: privateProductAnalyticsCollectorEvents.eventId }).returning({ eventId: privateProductAnalyticsCollectorEvents.eventId });
403
+ // A concurrent request may win the event-id race after the read above.
404
+ // Do not increment a rollup for that loser: it is a duplicate (or a
405
+ // conflict if the winning payload has a different digest).
406
+ if (!inserted) {
407
+ const [winner] = await db.select({ payloadSha256: privateProductAnalyticsCollectorEvents.payloadSha256 })
408
+ .from(privateProductAnalyticsCollectorEvents)
409
+ .where(eq(privateProductAnalyticsCollectorEvents.eventId, result.event.eventId)).limit(1);
410
+ acknowledgements.push(winner?.payloadSha256 === payloadSha256
411
+ ? { eventId: result.event.eventId, status: "duplicate", late: result.late }
412
+ : { eventId: result.event.eventId, status: "rejected", errorCode: "conflict", late: result.late });
413
+ continue;
414
+ }
415
+ acknowledgements.push({ eventId: result.event.eventId, status: "accepted", late: result.late });
416
+ }
417
+ await db.update(privateProductAnalyticsCollectorInstallations).set({ lastSeenAt: now, updatedAt: now }).where(eq(privateProductAnalyticsCollectorInstallations.installationId, input.authorization.installationId));
418
+ const accepted = acknowledgements.filter((ack) => ack.status === "accepted").length;
419
+ const duplicate = acknowledgements.filter((ack) => ack.status === "duplicate").length;
420
+ const rejected = acknowledgements.filter((ack) => ack.status === "rejected");
421
+ await recordQualityCounters({
422
+ now,
423
+ acceptedEvents: accepted,
424
+ duplicateEvents: duplicate,
425
+ rejectedEvents: rejected.length,
426
+ lateEvents: acknowledgements.filter((ack) => ack.late).length,
427
+ });
428
+ return { accepted, duplicate, rejected, receivedAt: now.toISOString() };
429
+ }
430
+ async function advanceConsent(input) {
431
+ if (input.analyticsSubject) {
432
+ const now = new Date();
433
+ // Keep an installation row for account-linked subjects as well. Reports
434
+ // use this row for installation cohorts, while the subject table remains
435
+ // the authorization source for per-user uploads on shared installations.
436
+ const installation = await readState(input.installationId);
437
+ if (!installation) {
438
+ await db.insert(privateProductAnalyticsCollectorInstallations).values({
439
+ installationId: input.installationId,
440
+ mode: "account_linked",
441
+ consentVersion: input.consentVersion,
442
+ // Subject consent must never become installation-wide consent. The
443
+ // row exists for cohort reporting until an anonymous decision creates
444
+ // its own installation-scoped authorization state.
445
+ consentEpoch: 0,
446
+ revoked: true,
447
+ analyticsSubject: null,
448
+ firstSeenAt: now,
449
+ lastSeenAt: now,
450
+ updatedAt: now,
451
+ }).onConflictDoNothing({ target: privateProductAnalyticsCollectorInstallations.installationId });
452
+ }
453
+ const current = await readSubjectState(input.installationId, input.analyticsSubject);
454
+ if (current && input.consentEpoch <= current.consentEpoch)
455
+ return current;
456
+ const [row] = current
457
+ ? await db.update(privateProductAnalyticsCollectorSubjects).set({
458
+ consentVersion: input.consentVersion,
459
+ consentEpoch: input.consentEpoch,
460
+ revokedAt: input.revoked ? now : null,
461
+ updatedAt: now,
462
+ }).where(and(eq(privateProductAnalyticsCollectorSubjects.installationId, input.installationId), eq(privateProductAnalyticsCollectorSubjects.analyticsSubject, input.analyticsSubject), eq(privateProductAnalyticsCollectorSubjects.consentEpoch, current.consentEpoch))).returning({
463
+ consentVersion: privateProductAnalyticsCollectorSubjects.consentVersion,
464
+ consentEpoch: privateProductAnalyticsCollectorSubjects.consentEpoch,
465
+ revoked: sql `${privateProductAnalyticsCollectorSubjects.revokedAt} IS NOT NULL`,
466
+ })
467
+ : await db.insert(privateProductAnalyticsCollectorSubjects).values({
468
+ installationId: input.installationId,
469
+ analyticsSubject: input.analyticsSubject,
470
+ consentVersion: input.consentVersion,
471
+ consentEpoch: input.consentEpoch,
472
+ revokedAt: input.revoked ? now : null,
473
+ consentedAt: now,
474
+ updatedAt: now,
475
+ }).onConflictDoNothing({ target: [privateProductAnalyticsCollectorSubjects.installationId, privateProductAnalyticsCollectorSubjects.analyticsSubject] }).returning({
476
+ consentVersion: privateProductAnalyticsCollectorSubjects.consentVersion,
477
+ consentEpoch: privateProductAnalyticsCollectorSubjects.consentEpoch,
478
+ revoked: sql `${privateProductAnalyticsCollectorSubjects.revokedAt} IS NOT NULL`,
479
+ });
480
+ return row ?? await readSubjectState(input.installationId, input.analyticsSubject) ?? { consentVersion: input.consentVersion, consentEpoch: input.consentEpoch, revoked: input.revoked };
481
+ }
482
+ // Anonymous consent has its own epoch stream. Retry a bounded number of
483
+ // times when a concurrent subject sync inserts the cohort sentinel between
484
+ // our compare-and-set update and installation insert.
485
+ for (let attempt = 0; attempt < 3; attempt += 1) {
486
+ const current = await readState(input.installationId);
487
+ if (current?.mode === "anonymous" && input.consentEpoch <= current.consentEpoch)
488
+ return current;
489
+ const [row] = await db.update(privateProductAnalyticsCollectorInstallations).set({
490
+ mode: "anonymous",
491
+ consentVersion: input.consentVersion,
492
+ consentEpoch: input.consentEpoch,
493
+ revoked: input.revoked,
494
+ updatedAt: new Date(),
495
+ }).where(current
496
+ ? and(eq(privateProductAnalyticsCollectorInstallations.installationId, input.installationId), eq(privateProductAnalyticsCollectorInstallations.consentEpoch, current.consentEpoch))
497
+ : eq(privateProductAnalyticsCollectorInstallations.installationId, input.installationId)).returning({
498
+ consentVersion: privateProductAnalyticsCollectorInstallations.consentVersion,
499
+ consentEpoch: privateProductAnalyticsCollectorInstallations.consentEpoch,
500
+ revoked: privateProductAnalyticsCollectorInstallations.revoked,
501
+ });
502
+ if (row)
503
+ return row;
504
+ const [created] = await db.insert(privateProductAnalyticsCollectorInstallations).values({
505
+ installationId: input.installationId,
506
+ mode: "anonymous",
507
+ consentVersion: input.consentVersion,
508
+ consentEpoch: input.consentEpoch,
509
+ revoked: input.revoked,
510
+ }).onConflictDoNothing({ target: privateProductAnalyticsCollectorInstallations.installationId }).returning({
511
+ consentVersion: privateProductAnalyticsCollectorInstallations.consentVersion,
512
+ consentEpoch: privateProductAnalyticsCollectorInstallations.consentEpoch,
513
+ revoked: privateProductAnalyticsCollectorInstallations.revoked,
514
+ });
515
+ if (created)
516
+ return created;
517
+ }
518
+ const winner = await readState(input.installationId);
519
+ return winner ?? { consentVersion: input.consentVersion, consentEpoch: input.consentEpoch, revoked: input.revoked };
520
+ }
521
+ return { ingestBatch, advanceConsent };
522
+ }
172
523
  //# sourceMappingURL=product-analytics-collector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-analytics-collector.js","sourceRoot":"","sources":["../../src/services/product-analytics-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-analytics-collector.js","sourceRoot":"","sources":["../../src/services/product-analytics-collector.ts"],"names":[],"mappings":"AACA,OAAO,EACL,sCAAsC,EACtC,6CAA6C,EAC7C,+CAA+C,EAC/C,wCAAwC,GACzC,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,0CAA0C,EAAE,MAAM,wBAAwB,CAAC;AAEnH,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC;AACjC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,iBAAiB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnD,MAAM,SAAS,GAAG,4EAA4E,CAAC;AAC/F,MAAM,aAAa,GAAG,kHAAkH,CAAC;AACzI,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,6BAA6B,CAAC,CAAC;AAoEnE,MAAM,OAAO,sCAAsC;IAChC,aAAa,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAC;IAChD,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;IAElE,oBAAoB,CAAC,cAAsB;QACzC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC;IACxD,CAAC;IAED,oBAAoB,CAAC,cAAsB,EAAE,KAAwB;QACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,eAAe,CAAC,cAAsB,EAAE,gBAAwB;QAC9D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,gBAAgB,EAAE,CAAC,IAAI,IAAI,CAAC;IACjF,CAAC;IAED,eAAe,CAAC,cAAsB,EAAE,gBAAwB,EAAE,KAAwB;QACxF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,cAAc,SAAS,gBAAgB,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,QAAQ,CAAC,OAAe;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,QAAQ,CAAC,KAA2B;QAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC;AAChH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aACxD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;aACvE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,oCAAoC,CAAC,KAAc;IACjE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AA0BD;;;;GAIG;AACH,MAAM,UAAU,uCAAuC,CACrD,MAA0D,EAC1D,UAAyC,EAAE;IAE3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC;QACxG,CAAC,CAAC,OAAO,CAAC,gBAAiB;QAC3B,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8G,CAAC;IAC3I,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1D,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,oCAAoC,GAAG,CAAC,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,OAAO,EAAE;YAAE,cAAc,IAAI,CAAC,CAAC;QACtF,IAAI,KAAK,CAAC,UAAU;YAAE,kBAAkB,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,0BAA0B;YAAE,oCAAoC,IAAI,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,KAAK,CAAC,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;QAClJ,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QACtB,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9C,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,MAAM,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,YAAY,IAAI,GAAG,GAAG,YAAY;YAAE,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;SACvC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACpJ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,yBAAyB,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC;QAC3D,MAAM,UAAU,GAAG,yBAAyB,GAAG,gBAAgB,CAAC;QAChE,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU;YAChD,yBAAyB;YACzB,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,MAAM,OAAO,GAAG,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,IAAI,GAAG,EAAkB,CAAC,CAAC;IAC9B,OAAO;QACL,OAAO;QACP,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/H,YAAY;YACZ,iBAAiB,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB;YAClF,UAAU,EAAE,iBAAiB,GAAG,gBAAgB;SACjD,CAAC,CAAC;QACH,OAAO,EAAE;YACP,kBAAkB,EAAE,MAAM,CAAC,MAAM;YACjC,cAAc;YACd,kBAAkB;YAClB,oCAAoC;YACpC,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM;YAC3E,gBAAgB;SACjB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAA+C,EAAE,OAAe,EAAE,IAAI,GAAG,KAAK;IAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,sCAAsC,CAAC,KAAc,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IACrF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB;QACpG,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,oBAAoB;QAChH,yBAAyB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;KACxI,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrH,OAAO,MAAM,CAAC,gBAAgB,EAAE,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjG,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACpH,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzJ,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC5B,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,kBAAkB;QAAE,OAAO,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpG,MAAM,IAAI,GAAG,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC;IAC9D,IAAI,CAAE,CAAC,YAAY,EAAE,aAAa,EAAE,MAAM,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClJ,IAAI,CAAE,CAAC,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9J,IAAI,CAAE,CAAC,eAAe,EAAE,aAAa,EAAE,eAAe,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjK,IAAI,CAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpJ,IAAI,CAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9J,IAAI,CAAE,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3I,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACvK,IAAI,KAAK,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACpL,KAAK,MAAM,GAAG,IAAI,CAAC,4BAA4B,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACrK,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9I,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtJ,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAqC,CAAC,EAAE,CAAC;QAC1F,MAAM,SAAS,GAAG,0CAA0C,CAAC,KAAK,CAAC,SAAoE,CAAC,CAAC;QACzI,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YACrM,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,0BAA0B,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,0BAA0B,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3J,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,eAAe;QAAE,OAAO,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7G,OAAO,EAAE,KAAK,EAAE,KAAkD,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,QAAwC,IAAI,sCAAsC,EAAE;IAClI,SAAS,WAAW,CAAC,KAA6F;QAChH,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;QAChC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,aAAa,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,aAAa,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YACrH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAQ,KAAiC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,KAAiC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3Q,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAmB,EAAE,SAAS,EAAE,gBAAyB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACxL,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;YACrG,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAmB,EAAE,SAAS,EAAE,WAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACnL,CAAC;QACD,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,KAAK,gBAAgB,IAAI,aAAa,CAAC,gBAAgB;YACjG,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,aAAa,CAAC,gBAAgB,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,YAAY,KAAK,aAAa,CAAC,YAAY,IAAI,iBAAiB,CAAC,cAAc,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;YAC1L,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAQ,KAAiC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,KAAiC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5P,CAAC;QACD,MAAM,IAAI,GAAmC,EAAE,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,sCAAsC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAClE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClB,SAAS;YACX,CAAC;YACD,IAAI,aAAa,CAAC,0BAA0B,IAAI,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,aAAa,CAAC,0BAA0B,EAAE,CAAC;gBACrI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtE,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,aAAa,GAAG,oCAAoC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzE,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,aAAa;oBAChD,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;oBAC3E,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrG,SAAS;YACX,CAAC;YACD,KAAK,CAAC,QAAQ,CAAC;gBACb,GAAG,MAAM,CAAC,KAAK;gBACf,cAAc,EAAE,aAAa,CAAC,cAAc;gBAC5C,gBAAgB,EAAE,aAAa,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;gBACzG,cAAc,EAAE,aAAa,CAAC,cAAc;gBAC5C,YAAY,EAAE,aAAa,CAAC,YAAY;gBACxC,aAAa;gBACb,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;gBAC7B,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,EAAE;gBAClF,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM;YAChE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM;YAClE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC;YACzD,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;SAC9B,CAAC;IACJ,CAAC;IAED,SAAS,cAAc,CAAC,KAAmI;QACzJ,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB;YACpC,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC;YACvE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrD,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,OAAO,IAAI,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;YAAE,OAAO,OAAO,CAAC;QAC1E,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAChH,IAAI,KAAK,CAAC,gBAAgB;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;;YACnG,KAAK,CAAC,oBAAoB,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,yCAAyC,CAAC,EAAM;IAC9D,KAAK,UAAU,qBAAqB,CAAC,KAMpC;QACC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,MAAM,CAAC;YACtE,GAAG;YACH,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,KAAK,CAAC,GAAG;SACrB,CAAC,CAAC,kBAAkB,CAAC;YACpB,MAAM,EAAE,+CAA+C,CAAC,GAAG;YAC3D,GAAG,EAAE;gBACH,eAAe,EAAE,GAAG,CAAA,GAAG,+CAA+C,CAAC,eAAe,MAAM;gBAC5F,cAAc,EAAE,GAAG,CAAA,GAAG,+CAA+C,CAAC,cAAc,MAAM,KAAK,CAAC,cAAc,EAAE;gBAChH,eAAe,EAAE,GAAG,CAAA,GAAG,+CAA+C,CAAC,eAAe,MAAM,KAAK,CAAC,eAAe,EAAE;gBACnH,cAAc,EAAE,GAAG,CAAA,GAAG,+CAA+C,CAAC,cAAc,MAAM,KAAK,CAAC,cAAc,EAAE;gBAChH,UAAU,EAAE,GAAG,CAAA,GAAG,+CAA+C,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU,EAAE;gBACpG,SAAS,EAAE,KAAK,CAAC,GAAG;aACrB;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,SAAS,CAAC,cAAsB;QAC7C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,6CAA6C,CAAC,IAAI;YACxD,cAAc,EAAE,6CAA6C,CAAC,cAAc;YAC5E,YAAY,EAAE,6CAA6C,CAAC,YAAY;YACxE,OAAO,EAAE,6CAA6C,CAAC,OAAO;YAC9D,gBAAgB,EAAE,6CAA6C,CAAC,gBAAgB;SACjF,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC;aACnD,KAAK,CAAC,EAAE,CAAC,6CAA6C,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpG,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,UAAU,gBAAgB,CAAC,cAAsB,EAAE,gBAAwB;QAC9E,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;YAC5B,cAAc,EAAE,wCAAwC,CAAC,cAAc;YACvE,YAAY,EAAE,wCAAwC,CAAC,YAAY;YACnE,OAAO,EAAE,GAAG,CAAS,GAAG,wCAAwC,CAAC,SAAS,cAAc;SACzF,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC;aAC9C,KAAK,CAAC,GAAG,CACR,EAAE,CAAC,wCAAwC,CAAC,cAAc,EAAE,cAAc,CAAC,EAC3E,EAAE,CAAC,wCAAwC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAChF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,aAAqD,EAAE,GAAS;QACzF,KAAK,GAAG,CAAC;QACT,uEAAuE;QACvE,+DAA+D;QAC/D,OAAO,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,UAAU,kBAAkB,CAAC,aAAqD,EAAE,GAAS;QAChG,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,CAAC;QACxD,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACxF,KAAK,GAAG,CAAC;QACT,wEAAwE;QACxE,8DAA8D;QAC9D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,KAA6F;QACtH,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,qBAAqB,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9G,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAmB,EAAE,SAAS,EAAE,gBAAyB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACxL,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,GAAG,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,eAAe,EAAE,CAAC;YACrG,MAAM,qBAAqB,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9G,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAmB,EAAE,SAAS,EAAE,WAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACnL,CAAC;QACD,MAAM,iBAAiB,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,gBAAgB;YACzD,CAAC,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC;YACpD,CAAC,CAAC,iBAAiB,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;YAC3F,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAQ,KAAiC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,KAAiC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QACnQ,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,KAAK,CAAC,aAAa,CAAC,YAAY,IAAI,KAAK,CAAC,cAAc,KAAK,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;YACtJ,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAQ,KAAiC,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,KAAiC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5P,CAAC;QACD,MAAM,gBAAgB,GAAmC,EAAE,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,sCAAsC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAClE,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,CAAC,0BAA0B,IAAI,MAAM,CAAC,KAAK,CAAC,0BAA0B,KAAK,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE,CAAC;gBACjJ,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClF,SAAS;YACX,CAAC;YACD,MAAM,aAAa,GAAG,oCAAoC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,sCAAsC,CAAC,aAAa,EAAE,CAAC;iBACxG,IAAI,CAAC,sCAAsC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzI,IAAI,QAAQ,EAAE,CAAC;gBACb,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,KAAK,aAAa;oBAC5D,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;oBAC3E,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrG,SAAS;YACX,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,MAAM,CAAC;gBAChF,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;gBAC7B,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc;gBAClD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;gBACrH,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;gBACjC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;gBACzC,UAAU,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC7C,UAAU,EAAE,GAAG;gBACf,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAClE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;gBACrC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;gBACnC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc;gBAC3C,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc;gBAC3C,cAAc,EAAE,IAAI;gBACpB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS;gBACjC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;gBAC3B,UAAU,EAAE,KAAK;gBACjB,0BAA0B,EAAE,MAAM,CAAC,KAAK,CAAC,0BAA0B;gBACnE,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;gBACjD,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB;gBACnD,uBAAuB,EAAE,MAAM,CAAC,KAAK,CAAC,uBAAuB;gBAC7D,qBAAqB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB;gBACzD,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;gBACjD,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB;gBACnD,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;gBACnC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;gBACnC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU;gBACnC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc;gBAClD,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,YAAY;gBAC9C,aAAa;aACd,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,sCAAsC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,sCAAsC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1J,uEAAuE;YACvE,oEAAoE;YACpE,2DAA2D;YAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,sCAAsC,CAAC,aAAa,EAAE,CAAC;qBACtG,IAAI,CAAC,sCAAsC,CAAC;qBAC5C,KAAK,CAAC,EAAE,CAAC,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5F,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa;oBAC3D,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;oBAC3E,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACrG,SAAS;YACX,CAAC;YACD,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,6CAA6C,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;QACpN,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QACpF,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QACtF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;QAC7E,MAAM,qBAAqB,CAAC;YAC1B,GAAG;YACH,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,SAAS;YAC1B,cAAc,EAAE,QAAQ,CAAC,MAAM;YAC/B,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM;SAC9D,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;IAC1E,CAAC;IAED,KAAK,UAAU,cAAc,CAAC,KAAmI;QAC/J,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,wEAAwE;YACxE,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,MAAM,CAAC;oBACpE,cAAc,EAAE,KAAK,CAAC,cAAc;oBACpC,IAAI,EAAE,gBAAgB;oBACtB,cAAc,EAAE,KAAK,CAAC,cAAc;oBACpC,mEAAmE;oBACnE,sEAAsE;oBACtE,mDAAmD;oBACnD,YAAY,EAAE,CAAC;oBACf,OAAO,EAAE,IAAI;oBACb,gBAAgB,EAAE,IAAI;oBACtB,WAAW,EAAE,GAAG;oBAChB,UAAU,EAAE,GAAG;oBACf,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,6CAA6C,CAAC,cAAc,EAAE,CAAC,CAAC;YACnG,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACrF,IAAI,OAAO,IAAI,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;gBAAE,OAAO,OAAO,CAAC;YAC1E,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO;gBACnB,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC;oBAC9D,cAAc,EAAE,KAAK,CAAC,cAAc;oBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;oBACrC,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC,KAAK,CAAC,GAAG,CACV,EAAE,CAAC,wCAAwC,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,EACjF,EAAE,CAAC,wCAAwC,CAAC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,CAAC,EACrF,EAAE,CAAC,wCAAwC,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAChF,CAAC,CAAC,SAAS,CAAC;oBACX,cAAc,EAAE,wCAAwC,CAAC,cAAc;oBACvE,YAAY,EAAE,wCAAwC,CAAC,YAAY;oBACnE,OAAO,EAAE,GAAG,CAAS,GAAG,wCAAwC,CAAC,SAAS,cAAc;iBACzF,CAAC;gBACF,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,MAAM,CAAC;oBACjE,cAAc,EAAE,KAAK,CAAC,cAAc;oBACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,cAAc,EAAE,KAAK,CAAC,cAAc;oBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;oBACrC,WAAW,EAAE,GAAG;oBAChB,SAAS,EAAE,GAAG;iBACf,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,wCAAwC,CAAC,cAAc,EAAE,wCAAwC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;oBACjK,cAAc,EAAE,wCAAwC,CAAC,cAAc;oBACvE,YAAY,EAAE,wCAAwC,CAAC,YAAY;oBACnE,OAAO,EAAE,GAAG,CAAS,GAAG,wCAAwC,CAAC,SAAS,cAAc;iBACzF,CAAC,CAAC;YACL,OAAO,GAAG,IAAI,MAAM,gBAAgB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3L,CAAC;QACD,wEAAwE;QACxE,2EAA2E;QAC3E,sDAAsD;QACtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACtD,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY;gBAAE,OAAO,OAAO,CAAC;YAChG,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC;gBAC/E,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACd,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,6CAA6C,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,6CAA6C,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;gBACnL,CAAC,CAAC,EAAE,CAAC,6CAA6C,CAAC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpG,cAAc,EAAE,6CAA6C,CAAC,cAAc;gBAC5E,YAAY,EAAE,6CAA6C,CAAC,YAAY;gBACxE,OAAO,EAAE,6CAA6C,CAAC,OAAO;aAC/D,CAAC,CAAC;YACH,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;YACpB,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,6CAA6C,CAAC,CAAC,MAAM,CAAC;gBACtF,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,IAAI,EAAE,WAAW;gBACjB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,6CAA6C,CAAC,cAAc,EAAE,CAAC,CAAC,SAAS,CAAC;gBACzG,cAAc,EAAE,6CAA6C,CAAC,cAAc;gBAC5E,YAAY,EAAE,6CAA6C,CAAC,YAAY;gBACxE,OAAO,EAAE,6CAA6C,CAAC,OAAO;aAC/D,CAAC,CAAC;YACH,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACrD,OAAO,MAAM,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACtH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC"}
@@ -39,6 +39,13 @@ function createCollector() {
39
39
  return createProductAnalyticsCollector(store);
40
40
  }
41
41
  describe("product analytics collector", () => {
42
+ it("does not bootstrap consent from an assertion authorization", () => {
43
+ const collector = createProductAnalyticsCollector(new InMemoryProductAnalyticsCollectorStore());
44
+ const result = collector.ingestBatch({ authorization, events: [event()] });
45
+ expect(result.accepted).toBe(0);
46
+ expect(result.rejected[0]).toMatchObject({ errorCode: "revoked" });
47
+ expect(collector.store.listEvents()).toHaveLength(0);
48
+ });
42
49
  it("accepts a valid event and treats the same payload as a duplicate", () => {
43
50
  const collector = createCollector();
44
51
  const first = collector.ingestBatch({ authorization, events: [event()] });
@@ -65,6 +72,11 @@ describe("product analytics collector", () => {
65
72
  expect(result.rejected.map((ack) => ack.errorCode)).toEqual(["invalid_event", "future_event"]);
66
73
  expect(collector.store.listEvents()).toHaveLength(0);
67
74
  });
75
+ it("rejects properties outside the event contract", () => {
76
+ const collector = createCollector();
77
+ const result = collector.ingestBatch({ authorization, events: [event({ properties: { unexpected_dimension: true } })] });
78
+ expect(result.rejected[0]).toMatchObject({ errorCode: "invalid_event" });
79
+ });
68
80
  it("rejects old consent epochs after revocation", () => {
69
81
  const collector = createCollector();
70
82
  collector.advanceConsent({ installationId, consentVersion: "v1", consentEpoch: 2, revoked: true });
@@ -77,5 +89,18 @@ describe("product analytics collector", () => {
77
89
  const replay = collector.advanceConsent({ installationId, consentVersion: "v1", consentEpoch: 2, revoked: false });
78
90
  expect(replay).toEqual({ consentVersion: "v1", consentEpoch: 2, revoked: true });
79
91
  });
92
+ it("isolates account-linked consent by subject on a shared installation", () => {
93
+ const store = new InMemoryProductAnalyticsCollectorStore();
94
+ store.setSubjectState(installationId, "user-a", { consentVersion: "v1", consentEpoch: 1, revoked: false });
95
+ store.setSubjectState(installationId, "user-b", { consentVersion: "v1", consentEpoch: 1, revoked: false });
96
+ const collector = createProductAnalyticsCollector(store);
97
+ const authA = { ...authorization, mode: "account_linked", analyticsSubject: "user-a" };
98
+ const authB = { ...authorization, mode: "account_linked", analyticsSubject: "user-b" };
99
+ expect(collector.ingestBatch({ authorization: authA, events: [event()] }).accepted).toBe(1);
100
+ expect(collector.ingestBatch({ authorization: authB, events: [event({ eventId: "33333333-3333-4333-8333-333333333333" })] }).accepted).toBe(1);
101
+ collector.advanceConsent({ installationId, analyticsSubject: "user-a", consentVersion: "v1", consentEpoch: 2, revoked: true });
102
+ expect(collector.ingestBatch({ authorization: authA, events: [event({ eventId: "44444444-4444-4444-8444-444444444444" })] }).rejected[0]?.errorCode).toBe("revoked");
103
+ expect(collector.ingestBatch({ authorization: authB, events: [event({ eventId: "55555555-5555-4555-8555-555555555555" })] }).accepted).toBe(1);
104
+ });
80
105
  });
81
106
  //# sourceMappingURL=product-analytics-collector.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"product-analytics-collector.test.js","sourceRoot":"","sources":["../../src/services/product-analytics-collector.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"product-analytics-collector.test.js","sourceRoot":"","sources":["../../src/services/product-analytics-collector.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProductAnalyticsCollectorAuthorization, ProductAnalyticsCollectorDashboardEvent, ProductAnalyticsCollectorEvent } from "./product-analytics-collector.js";
2
+ export declare const PRODUCT_ANALYTICS_FIXTURE_NOW = "2026-08-04T00:00:00.000Z";
3
+ export declare const PRODUCT_ANALYTICS_FIXTURE_INSTALLATIONS: readonly ["11111111-1111-4111-8111-111111111111", "11111111-1111-4111-8111-111111111112", "11111111-1111-4111-8111-111111111113"];
4
+ export declare const PRODUCT_ANALYTICS_FIXTURE_AUTHORIZATION: ProductAnalyticsCollectorAuthorization;
5
+ export declare function productAnalyticsFixtureEvent(index: number, overrides?: Partial<ProductAnalyticsCollectorEvent>): ProductAnalyticsCollectorEvent;
6
+ export declare function productAnalyticsFixtureDashboardEvents(count?: number): ProductAnalyticsCollectorDashboardEvent[];
7
+ //# sourceMappingURL=product-analytics-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-analytics-fixture.d.ts","sourceRoot":"","sources":["../../src/services/product-analytics-fixture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sCAAsC,EACtC,uCAAuC,EACvC,8BAA8B,EAC/B,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,6BAA6B,6BAA6B,CAAC;AACxE,eAAO,MAAM,uCAAuC,mIAI1C,CAAC;AAEX,eAAO,MAAM,uCAAuC,EAAE,sCAMrD,CAAC;AAIF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,8BAA8B,CAkChC;AAMD,wBAAgB,sCAAsC,CAAC,KAAK,SAAK,GAAG,uCAAuC,EAAE,CAW5G"}