@grainql/analytics-web 2.3.0 → 2.5.0

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 (66) hide show
  1. package/dist/cjs/countries.d.ts +13 -0
  2. package/dist/cjs/countries.d.ts.map +1 -0
  3. package/dist/cjs/countries.js +2907 -0
  4. package/dist/cjs/countries.js.map +1 -0
  5. package/dist/cjs/index.d.ts +29 -1
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/interaction-tracking.d.ts +71 -0
  9. package/dist/cjs/interaction-tracking.d.ts.map +1 -0
  10. package/dist/cjs/interaction-tracking.js +270 -0
  11. package/dist/cjs/interaction-tracking.js.map +1 -0
  12. package/dist/cjs/page-tracking.d.ts.map +1 -1
  13. package/dist/cjs/page-tracking.js +5 -1
  14. package/dist/cjs/page-tracking.js.map +1 -1
  15. package/dist/cjs/section-tracking.d.ts +91 -0
  16. package/dist/cjs/section-tracking.d.ts.map +1 -0
  17. package/dist/cjs/section-tracking.js +373 -0
  18. package/dist/cjs/section-tracking.js.map +1 -0
  19. package/dist/cjs/types/auto-tracking.d.ts +55 -0
  20. package/dist/cjs/types/auto-tracking.d.ts.map +1 -0
  21. package/dist/cjs/types/auto-tracking.js +6 -0
  22. package/dist/cjs/types/auto-tracking.js.map +1 -0
  23. package/dist/countries.d.ts +13 -0
  24. package/dist/countries.d.ts.map +1 -0
  25. package/dist/countries.js +2907 -0
  26. package/dist/esm/countries.d.ts +13 -0
  27. package/dist/esm/countries.d.ts.map +1 -0
  28. package/dist/esm/countries.js +2902 -0
  29. package/dist/esm/countries.js.map +1 -0
  30. package/dist/esm/index.d.ts +29 -1
  31. package/dist/esm/index.d.ts.map +1 -1
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/interaction-tracking.d.ts +71 -0
  34. package/dist/esm/interaction-tracking.d.ts.map +1 -0
  35. package/dist/esm/interaction-tracking.js +266 -0
  36. package/dist/esm/interaction-tracking.js.map +1 -0
  37. package/dist/esm/page-tracking.d.ts.map +1 -1
  38. package/dist/esm/page-tracking.js +5 -1
  39. package/dist/esm/page-tracking.js.map +1 -1
  40. package/dist/esm/section-tracking.d.ts +91 -0
  41. package/dist/esm/section-tracking.d.ts.map +1 -0
  42. package/dist/esm/section-tracking.js +369 -0
  43. package/dist/esm/section-tracking.js.map +1 -0
  44. package/dist/esm/types/auto-tracking.d.ts +55 -0
  45. package/dist/esm/types/auto-tracking.d.ts.map +1 -0
  46. package/dist/esm/types/auto-tracking.js +5 -0
  47. package/dist/esm/types/auto-tracking.js.map +1 -0
  48. package/dist/index.d.ts +29 -1
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.global.dev.js +3609 -2
  51. package/dist/index.global.dev.js.map +4 -4
  52. package/dist/index.global.js +2 -2
  53. package/dist/index.global.js.map +4 -4
  54. package/dist/index.js +130 -1
  55. package/dist/index.mjs +93 -0
  56. package/dist/interaction-tracking.d.ts +71 -0
  57. package/dist/interaction-tracking.d.ts.map +1 -0
  58. package/dist/interaction-tracking.js +270 -0
  59. package/dist/page-tracking.d.ts.map +1 -1
  60. package/dist/page-tracking.js +5 -1
  61. package/dist/section-tracking.d.ts +91 -0
  62. package/dist/section-tracking.d.ts.map +1 -0
  63. package/dist/section-tracking.js +373 -0
  64. package/dist/types/auto-tracking.d.ts +55 -0
  65. package/dist/types/auto-tracking.d.ts.map +1 -0
  66. package/package.json +1 -1
@@ -1,10 +1,13 @@
1
- /* Grain Analytics Web SDK v2.3.0 | MIT License | Development Build */
1
+ /* Grain Analytics Web SDK v2.5.0 | MIT License | Development Build */
2
2
  "use strict";
3
3
  var Grain = (() => {
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
8
11
  var __export = (target, all) => {
9
12
  for (var name in all)
10
13
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -19,6 +22,622 @@ var Grain = (() => {
19
22
  };
20
23
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
24
 
25
+ // src/interaction-tracking.ts
26
+ var interaction_tracking_exports = {};
27
+ __export(interaction_tracking_exports, {
28
+ InteractionTrackingManager: () => InteractionTrackingManager
29
+ });
30
+ var InteractionTrackingManager;
31
+ var init_interaction_tracking = __esm({
32
+ "src/interaction-tracking.ts"() {
33
+ "use strict";
34
+ InteractionTrackingManager = class {
35
+ constructor(tracker, interactions, config = {}) {
36
+ this.isDestroyed = false;
37
+ this.attachedListeners = /* @__PURE__ */ new Map();
38
+ this.xpathCache = /* @__PURE__ */ new Map();
39
+ this.mutationObserver = null;
40
+ this.mutationDebounceTimer = null;
41
+ this.tracker = tracker;
42
+ this.interactions = interactions;
43
+ this.config = {
44
+ debug: config.debug ?? false,
45
+ enableMutationObserver: config.enableMutationObserver ?? true,
46
+ mutationDebounceDelay: config.mutationDebounceDelay ?? 500
47
+ };
48
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
49
+ if (document.readyState === "loading") {
50
+ document.addEventListener("DOMContentLoaded", () => this.attachAllListeners());
51
+ } else {
52
+ setTimeout(() => this.attachAllListeners(), 0);
53
+ }
54
+ if (this.config.enableMutationObserver) {
55
+ this.setupMutationObserver();
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Attach listeners to all configured interactions
61
+ */
62
+ attachAllListeners() {
63
+ if (this.isDestroyed)
64
+ return;
65
+ this.log("Attaching interaction listeners for", this.interactions.length, "interactions");
66
+ for (const interaction of this.interactions) {
67
+ this.attachInteractionListener(interaction);
68
+ }
69
+ }
70
+ /**
71
+ * Attach listener to a specific interaction
72
+ */
73
+ attachInteractionListener(interaction) {
74
+ if (this.isDestroyed)
75
+ return;
76
+ const element = this.findElementByXPath(interaction.selector);
77
+ if (!element) {
78
+ this.log("Element not found for interaction:", interaction.eventName, "selector:", interaction.selector);
79
+ return;
80
+ }
81
+ if (this.attachedListeners.has(element)) {
82
+ this.log("Listeners already attached for element:", element);
83
+ return;
84
+ }
85
+ const handlers = [];
86
+ const clickHandler = (event) => this.handleInteractionClick(interaction, event);
87
+ element.addEventListener("click", clickHandler, { passive: true });
88
+ handlers.push({ event: "click", handler: clickHandler });
89
+ if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {
90
+ const focusHandler = (event) => this.handleInteractionFocus(interaction, event);
91
+ element.addEventListener("focus", focusHandler, { passive: true });
92
+ handlers.push({ event: "focus", handler: focusHandler });
93
+ }
94
+ this.attachedListeners.set(element, handlers);
95
+ this.log("Attached listeners to element for:", interaction.eventName);
96
+ }
97
+ /**
98
+ * Handle click event on interaction
99
+ */
100
+ handleInteractionClick(interaction, event) {
101
+ if (this.isDestroyed)
102
+ return;
103
+ if (!this.tracker.hasConsent("analytics"))
104
+ return;
105
+ const element = event.target;
106
+ this.tracker.track(interaction.eventName, {
107
+ interaction_type: "click",
108
+ interaction_label: interaction.label,
109
+ interaction_description: interaction.description,
110
+ interaction_priority: interaction.priority,
111
+ element_tag: element.tagName?.toLowerCase(),
112
+ element_text: element.textContent?.trim().substring(0, 100),
113
+ element_id: element.id || void 0,
114
+ element_class: element.className || void 0,
115
+ timestamp: Date.now()
116
+ });
117
+ this.log("Tracked click interaction:", interaction.eventName);
118
+ }
119
+ /**
120
+ * Handle focus event on interaction (for form fields)
121
+ */
122
+ handleInteractionFocus(interaction, event) {
123
+ if (this.isDestroyed)
124
+ return;
125
+ if (!this.tracker.hasConsent("analytics"))
126
+ return;
127
+ const element = event.target;
128
+ this.tracker.track(interaction.eventName, {
129
+ interaction_type: "focus",
130
+ interaction_label: interaction.label,
131
+ interaction_description: interaction.description,
132
+ interaction_priority: interaction.priority,
133
+ element_tag: element.tagName?.toLowerCase(),
134
+ element_id: element.id || void 0,
135
+ element_class: element.className || void 0,
136
+ timestamp: Date.now()
137
+ });
138
+ this.log("Tracked focus interaction:", interaction.eventName);
139
+ }
140
+ /**
141
+ * Find element by XPath selector
142
+ */
143
+ findElementByXPath(xpath) {
144
+ if (this.xpathCache.has(xpath)) {
145
+ const cached = this.xpathCache.get(xpath);
146
+ if (cached && document.contains(cached)) {
147
+ return cached;
148
+ }
149
+ this.xpathCache.delete(xpath);
150
+ }
151
+ try {
152
+ const result = document.evaluate(
153
+ xpath,
154
+ document,
155
+ null,
156
+ XPathResult.FIRST_ORDERED_NODE_TYPE,
157
+ null
158
+ );
159
+ const element = result.singleNodeValue;
160
+ if (element) {
161
+ this.xpathCache.set(xpath, element);
162
+ }
163
+ return element;
164
+ } catch (error) {
165
+ this.log("Error evaluating XPath:", xpath, error);
166
+ return null;
167
+ }
168
+ }
169
+ /**
170
+ * Setup mutation observer to handle dynamic content
171
+ */
172
+ setupMutationObserver() {
173
+ if (typeof MutationObserver === "undefined") {
174
+ this.log("MutationObserver not supported");
175
+ return;
176
+ }
177
+ this.mutationObserver = new MutationObserver((mutations) => {
178
+ if (this.mutationDebounceTimer !== null) {
179
+ clearTimeout(this.mutationDebounceTimer);
180
+ }
181
+ this.mutationDebounceTimer = window.setTimeout(() => {
182
+ this.handleMutations(mutations);
183
+ this.mutationDebounceTimer = null;
184
+ }, this.config.mutationDebounceDelay);
185
+ });
186
+ this.mutationObserver.observe(document.body, {
187
+ childList: true,
188
+ subtree: true
189
+ });
190
+ this.log("Mutation observer setup");
191
+ }
192
+ /**
193
+ * Handle DOM mutations
194
+ */
195
+ handleMutations(mutations) {
196
+ if (this.isDestroyed)
197
+ return;
198
+ this.xpathCache.clear();
199
+ const removedElements = /* @__PURE__ */ new Set();
200
+ for (const mutation of mutations) {
201
+ mutation.removedNodes.forEach((node) => {
202
+ if (node instanceof Element) {
203
+ removedElements.add(node);
204
+ this.attachedListeners.forEach((handlers, element) => {
205
+ if (node.contains(element)) {
206
+ removedElements.add(element);
207
+ }
208
+ });
209
+ }
210
+ });
211
+ }
212
+ removedElements.forEach((element) => {
213
+ this.detachListeners(element);
214
+ });
215
+ this.attachAllListeners();
216
+ }
217
+ /**
218
+ * Detach listeners from an element
219
+ */
220
+ detachListeners(element) {
221
+ const handlers = this.attachedListeners.get(element);
222
+ if (!handlers)
223
+ return;
224
+ handlers.forEach(({ event, handler }) => {
225
+ element.removeEventListener(event, handler);
226
+ });
227
+ this.attachedListeners.delete(element);
228
+ this.log("Detached listeners from element");
229
+ }
230
+ /**
231
+ * Log debug messages
232
+ */
233
+ log(...args) {
234
+ if (this.config.debug) {
235
+ console.log("[InteractionTracking]", ...args);
236
+ }
237
+ }
238
+ /**
239
+ * Update interactions configuration
240
+ */
241
+ updateInteractions(interactions) {
242
+ if (this.isDestroyed)
243
+ return;
244
+ this.log("Updating interactions configuration");
245
+ this.attachedListeners.forEach((handlers, element) => {
246
+ this.detachListeners(element);
247
+ });
248
+ this.xpathCache.clear();
249
+ this.interactions = interactions;
250
+ this.attachAllListeners();
251
+ }
252
+ /**
253
+ * Cleanup and destroy
254
+ */
255
+ destroy() {
256
+ if (this.isDestroyed)
257
+ return;
258
+ this.log("Destroying interaction tracking manager");
259
+ this.isDestroyed = true;
260
+ if (this.mutationDebounceTimer !== null) {
261
+ clearTimeout(this.mutationDebounceTimer);
262
+ this.mutationDebounceTimer = null;
263
+ }
264
+ if (this.mutationObserver) {
265
+ this.mutationObserver.disconnect();
266
+ this.mutationObserver = null;
267
+ }
268
+ this.attachedListeners.forEach((handlers, element) => {
269
+ this.detachListeners(element);
270
+ });
271
+ this.attachedListeners.clear();
272
+ this.xpathCache.clear();
273
+ }
274
+ };
275
+ }
276
+ });
277
+
278
+ // src/section-tracking.ts
279
+ var section_tracking_exports = {};
280
+ __export(section_tracking_exports, {
281
+ SectionTrackingManager: () => SectionTrackingManager
282
+ });
283
+ var DEFAULT_OPTIONS, SectionTrackingManager;
284
+ var init_section_tracking = __esm({
285
+ "src/section-tracking.ts"() {
286
+ "use strict";
287
+ DEFAULT_OPTIONS = {
288
+ minDwellTime: 1e3,
289
+ // 1 second minimum
290
+ scrollVelocityThreshold: 500,
291
+ // 500px/s
292
+ intersectionThreshold: 0.1,
293
+ // 10% visible
294
+ debounceDelay: 100,
295
+ batchDelay: 2e3,
296
+ // 2 seconds
297
+ debug: false
298
+ };
299
+ SectionTrackingManager = class {
300
+ constructor(tracker, sections, options = {}) {
301
+ this.isDestroyed = false;
302
+ // Tracking state
303
+ this.sectionStates = /* @__PURE__ */ new Map();
304
+ this.intersectionObserver = null;
305
+ this.xpathCache = /* @__PURE__ */ new Map();
306
+ // Scroll tracking
307
+ this.lastScrollPosition = 0;
308
+ this.lastScrollTime = Date.now();
309
+ this.scrollVelocity = 0;
310
+ this.scrollDebounceTimer = null;
311
+ // Event batching
312
+ this.pendingEvents = [];
313
+ this.batchTimer = null;
314
+ this.tracker = tracker;
315
+ this.sections = sections;
316
+ this.options = { ...DEFAULT_OPTIONS, ...options };
317
+ if (typeof window !== "undefined" && typeof document !== "undefined") {
318
+ if (document.readyState === "loading") {
319
+ document.addEventListener("DOMContentLoaded", () => this.initialize());
320
+ } else {
321
+ setTimeout(() => this.initialize(), 0);
322
+ }
323
+ }
324
+ }
325
+ /**
326
+ * Initialize section tracking
327
+ */
328
+ initialize() {
329
+ if (this.isDestroyed)
330
+ return;
331
+ this.log("Initializing section tracking for", this.sections.length, "sections");
332
+ this.setupIntersectionObserver();
333
+ this.setupScrollListener();
334
+ this.initializeSections();
335
+ }
336
+ /**
337
+ * Setup IntersectionObserver for section visibility
338
+ */
339
+ setupIntersectionObserver() {
340
+ if (typeof IntersectionObserver === "undefined") {
341
+ this.log("IntersectionObserver not supported");
342
+ return;
343
+ }
344
+ this.intersectionObserver = new IntersectionObserver(
345
+ (entries) => {
346
+ entries.forEach((entry) => {
347
+ this.handleIntersection(entry);
348
+ });
349
+ },
350
+ {
351
+ threshold: [0, 0.1, 0.25, 0.5, 0.75, 1],
352
+ rootMargin: "0px"
353
+ }
354
+ );
355
+ this.log("IntersectionObserver created");
356
+ }
357
+ /**
358
+ * Setup scroll listener for velocity calculation
359
+ */
360
+ setupScrollListener() {
361
+ if (typeof window === "undefined")
362
+ return;
363
+ const scrollHandler = () => {
364
+ if (this.scrollDebounceTimer !== null) {
365
+ clearTimeout(this.scrollDebounceTimer);
366
+ }
367
+ this.scrollDebounceTimer = window.setTimeout(() => {
368
+ this.updateScrollVelocity();
369
+ this.scrollDebounceTimer = null;
370
+ }, this.options.debounceDelay);
371
+ };
372
+ window.addEventListener("scroll", scrollHandler, { passive: true });
373
+ this.log("Scroll listener attached");
374
+ }
375
+ /**
376
+ * Initialize sections and start observing
377
+ */
378
+ initializeSections() {
379
+ for (const section of this.sections) {
380
+ const element = this.findElementByXPath(section.selector);
381
+ if (!element) {
382
+ this.log("Section element not found:", section.sectionName, "selector:", section.selector);
383
+ continue;
384
+ }
385
+ const state = {
386
+ element,
387
+ config: section,
388
+ entryTime: null,
389
+ exitTime: null,
390
+ isVisible: false,
391
+ lastScrollPosition: window.scrollY,
392
+ lastScrollTime: Date.now(),
393
+ entryScrollSpeed: 0,
394
+ exitScrollSpeed: 0,
395
+ maxVisibleArea: 0
396
+ };
397
+ this.sectionStates.set(section.sectionName, state);
398
+ if (this.intersectionObserver) {
399
+ this.intersectionObserver.observe(element);
400
+ }
401
+ this.log("Section initialized and observed:", section.sectionName);
402
+ }
403
+ }
404
+ /**
405
+ * Handle intersection observer entry
406
+ */
407
+ handleIntersection(entry) {
408
+ if (this.isDestroyed)
409
+ return;
410
+ const state = Array.from(this.sectionStates.values()).find(
411
+ (s) => s.element === entry.target
412
+ );
413
+ if (!state)
414
+ return;
415
+ const isVisible = entry.isIntersecting && entry.intersectionRatio >= this.options.intersectionThreshold;
416
+ const visibleArea = entry.intersectionRatio;
417
+ if (visibleArea > state.maxVisibleArea) {
418
+ state.maxVisibleArea = visibleArea;
419
+ }
420
+ if (isVisible && !state.isVisible) {
421
+ this.handleSectionEntry(state);
422
+ } else if (!isVisible && state.isVisible) {
423
+ this.handleSectionExit(state);
424
+ }
425
+ state.isVisible = isVisible;
426
+ }
427
+ /**
428
+ * Handle section entry (became visible)
429
+ */
430
+ handleSectionEntry(state) {
431
+ this.log("Section entered view:", state.config.sectionName);
432
+ state.entryTime = Date.now();
433
+ state.entryScrollSpeed = this.scrollVelocity;
434
+ state.lastScrollPosition = window.scrollY;
435
+ state.lastScrollTime = Date.now();
436
+ state.maxVisibleArea = 0;
437
+ }
438
+ /**
439
+ * Handle section exit (became invisible)
440
+ */
441
+ handleSectionExit(state) {
442
+ this.log("Section exited view:", state.config.sectionName);
443
+ if (state.entryTime === null)
444
+ return;
445
+ state.exitTime = Date.now();
446
+ state.exitScrollSpeed = this.scrollVelocity;
447
+ const duration = state.exitTime - state.entryTime;
448
+ const viewData = {
449
+ sectionName: state.config.sectionName,
450
+ sectionType: state.config.sectionType,
451
+ entryTime: state.entryTime,
452
+ exitTime: state.exitTime,
453
+ duration,
454
+ viewportWidth: window.innerWidth,
455
+ viewportHeight: window.innerHeight,
456
+ scrollDepth: this.calculateScrollDepth(),
457
+ visibleAreaPercentage: Math.round(state.maxVisibleArea * 100),
458
+ scrollSpeedAtEntry: state.entryScrollSpeed,
459
+ scrollSpeedAtExit: state.exitScrollSpeed
460
+ };
461
+ if (this.shouldTrackSection(viewData)) {
462
+ this.queueSectionView(viewData);
463
+ } else {
464
+ this.log("Section view filtered out:", state.config.sectionName, "duration:", duration);
465
+ }
466
+ state.entryTime = null;
467
+ }
468
+ /**
469
+ * Update scroll velocity
470
+ */
471
+ updateScrollVelocity() {
472
+ const now = Date.now();
473
+ const currentPosition = window.scrollY;
474
+ const timeDelta = now - this.lastScrollTime;
475
+ const positionDelta = Math.abs(currentPosition - this.lastScrollPosition);
476
+ if (timeDelta > 0) {
477
+ this.scrollVelocity = positionDelta / timeDelta * 1e3;
478
+ }
479
+ this.lastScrollPosition = currentPosition;
480
+ this.lastScrollTime = now;
481
+ }
482
+ /**
483
+ * Calculate current scroll depth as percentage
484
+ */
485
+ calculateScrollDepth() {
486
+ if (typeof window === "undefined" || typeof document === "undefined")
487
+ return 0;
488
+ const windowHeight = window.innerHeight;
489
+ const documentHeight = Math.max(
490
+ document.body.scrollHeight,
491
+ document.body.offsetHeight,
492
+ document.documentElement.clientHeight,
493
+ document.documentElement.scrollHeight,
494
+ document.documentElement.offsetHeight
495
+ );
496
+ const scrollTop = window.scrollY;
497
+ const scrollableHeight = documentHeight - windowHeight;
498
+ if (scrollableHeight <= 0)
499
+ return 100;
500
+ return Math.round(scrollTop / scrollableHeight * 100);
501
+ }
502
+ /**
503
+ * Determine if section view should be tracked (sanitization)
504
+ */
505
+ shouldTrackSection(viewData) {
506
+ if (viewData.duration < this.options.minDwellTime) {
507
+ return false;
508
+ }
509
+ const avgScrollSpeed = (viewData.scrollSpeedAtEntry + viewData.scrollSpeedAtExit) / 2;
510
+ if (avgScrollSpeed > this.options.scrollVelocityThreshold * 2) {
511
+ return false;
512
+ }
513
+ if (viewData.visibleAreaPercentage < 10) {
514
+ return false;
515
+ }
516
+ return true;
517
+ }
518
+ /**
519
+ * Queue section view for batching
520
+ */
521
+ queueSectionView(viewData) {
522
+ this.pendingEvents.push(viewData);
523
+ this.log("Queued section view:", viewData.sectionName, "duration:", viewData.duration);
524
+ if (this.batchTimer === null) {
525
+ this.batchTimer = window.setTimeout(() => {
526
+ this.flushPendingEvents();
527
+ }, this.options.batchDelay);
528
+ }
529
+ }
530
+ /**
531
+ * Flush pending section view events
532
+ */
533
+ flushPendingEvents() {
534
+ if (this.isDestroyed || this.pendingEvents.length === 0)
535
+ return;
536
+ if (!this.tracker.hasConsent("analytics")) {
537
+ this.pendingEvents = [];
538
+ return;
539
+ }
540
+ this.log("Flushing", this.pendingEvents.length, "section view events");
541
+ for (const viewData of this.pendingEvents) {
542
+ this.tracker.trackSystemEvent("_grain_section_view", {
543
+ section_name: viewData.sectionName,
544
+ section_type: viewData.sectionType,
545
+ duration_ms: viewData.duration,
546
+ viewport_width: viewData.viewportWidth,
547
+ viewport_height: viewData.viewportHeight,
548
+ scroll_depth_percent: viewData.scrollDepth,
549
+ visible_area_percent: viewData.visibleAreaPercentage,
550
+ scroll_speed_entry: Math.round(viewData.scrollSpeedAtEntry || 0),
551
+ scroll_speed_exit: Math.round(viewData.scrollSpeedAtExit || 0),
552
+ entry_timestamp: viewData.entryTime,
553
+ exit_timestamp: viewData.exitTime
554
+ });
555
+ }
556
+ this.pendingEvents = [];
557
+ this.batchTimer = null;
558
+ }
559
+ /**
560
+ * Find element by XPath selector
561
+ */
562
+ findElementByXPath(xpath) {
563
+ if (this.xpathCache.has(xpath)) {
564
+ const cached = this.xpathCache.get(xpath);
565
+ if (cached && document.contains(cached)) {
566
+ return cached;
567
+ }
568
+ this.xpathCache.delete(xpath);
569
+ }
570
+ try {
571
+ const result = document.evaluate(
572
+ xpath,
573
+ document,
574
+ null,
575
+ XPathResult.FIRST_ORDERED_NODE_TYPE,
576
+ null
577
+ );
578
+ const element = result.singleNodeValue;
579
+ if (element) {
580
+ this.xpathCache.set(xpath, element);
581
+ }
582
+ return element;
583
+ } catch (error) {
584
+ this.log("Error evaluating XPath:", xpath, error);
585
+ return null;
586
+ }
587
+ }
588
+ /**
589
+ * Log debug messages
590
+ */
591
+ log(...args) {
592
+ if (this.options.debug) {
593
+ console.log("[SectionTracking]", ...args);
594
+ }
595
+ }
596
+ /**
597
+ * Update sections configuration
598
+ */
599
+ updateSections(sections) {
600
+ if (this.isDestroyed)
601
+ return;
602
+ this.log("Updating sections configuration");
603
+ if (this.intersectionObserver) {
604
+ this.intersectionObserver.disconnect();
605
+ }
606
+ this.sectionStates.clear();
607
+ this.xpathCache.clear();
608
+ this.sections = sections;
609
+ this.setupIntersectionObserver();
610
+ this.initializeSections();
611
+ }
612
+ /**
613
+ * Cleanup and destroy
614
+ */
615
+ destroy() {
616
+ if (this.isDestroyed)
617
+ return;
618
+ this.log("Destroying section tracking manager");
619
+ this.isDestroyed = true;
620
+ this.flushPendingEvents();
621
+ if (this.scrollDebounceTimer !== null) {
622
+ clearTimeout(this.scrollDebounceTimer);
623
+ this.scrollDebounceTimer = null;
624
+ }
625
+ if (this.batchTimer !== null) {
626
+ clearTimeout(this.batchTimer);
627
+ this.batchTimer = null;
628
+ }
629
+ if (this.intersectionObserver) {
630
+ this.intersectionObserver.disconnect();
631
+ this.intersectionObserver = null;
632
+ }
633
+ this.sectionStates.clear();
634
+ this.xpathCache.clear();
635
+ this.pendingEvents = [];
636
+ }
637
+ };
638
+ }
639
+ });
640
+
22
641
  // src/index.ts
23
642
  var src_exports = {};
24
643
  __export(src_exports, {
@@ -26,6 +645,9 @@ var Grain = (() => {
26
645
  categorizeReferrer: () => categorizeReferrer,
27
646
  createGrainAnalytics: () => createGrainAnalytics,
28
647
  default: () => src_default,
648
+ getCountry: () => getCountry,
649
+ getCountryCodeFromTimezone: () => getCountryCodeFromTimezone,
650
+ getState: () => getState,
29
651
  parseUTMParameters: () => parseUTMParameters
30
652
  });
31
653
 
@@ -665,6 +1287,2898 @@ var Grain = (() => {
665
1287
  sessionUTMParams = params;
666
1288
  }
667
1289
 
1290
+ // src/countries.ts
1291
+ var countries = {
1292
+ AD: "Andorra",
1293
+ AE: "United Arab Emirates",
1294
+ AF: "Afghanistan",
1295
+ AG: "Antigua and Barbuda",
1296
+ AI: "Anguilla",
1297
+ AL: "Albania",
1298
+ AM: "Armenia",
1299
+ AO: "Angola",
1300
+ AQ: "Antarctica",
1301
+ AR: "Argentina",
1302
+ AS: "American Samoa",
1303
+ AT: "Austria",
1304
+ AU: "Australia",
1305
+ AW: "Aruba",
1306
+ AX: "\xC5land Islands",
1307
+ AZ: "Azerbaijan",
1308
+ BA: "Bosnia and Herzegovina",
1309
+ BB: "Barbados",
1310
+ BD: "Bangladesh",
1311
+ BE: "Belgium",
1312
+ BF: "Burkina Faso",
1313
+ BG: "Bulgaria",
1314
+ BH: "Bahrain",
1315
+ BI: "Burundi",
1316
+ BJ: "Benin",
1317
+ BL: "Saint Barth\xE9lemy",
1318
+ BM: "Bermuda",
1319
+ BN: "Brunei",
1320
+ BO: "Bolivia",
1321
+ BQ: "Caribbean Netherlands",
1322
+ BR: "Brazil",
1323
+ BS: "Bahamas",
1324
+ BT: "Bhutan",
1325
+ BV: "Bouvet Island",
1326
+ BW: "Botswana",
1327
+ BY: "Belarus",
1328
+ BZ: "Belize",
1329
+ CA: "Canada",
1330
+ CC: "Cocos Islands",
1331
+ CD: "Democratic Republic of the Congo",
1332
+ CF: "Central African Republic",
1333
+ CG: "Republic of the Congo",
1334
+ CH: "Switzerland",
1335
+ CI: "Ivory Coast",
1336
+ CK: "Cook Islands",
1337
+ CL: "Chile",
1338
+ CM: "Cameroon",
1339
+ CN: "China",
1340
+ CO: "Colombia",
1341
+ CR: "Costa Rica",
1342
+ CU: "Cuba",
1343
+ CV: "Cabo Verde",
1344
+ CW: "Cura\xE7ao",
1345
+ CX: "Christmas Island",
1346
+ CY: "Cyprus",
1347
+ CZ: "Czechia",
1348
+ DE: "Germany",
1349
+ DJ: "Djibouti",
1350
+ DK: "Denmark",
1351
+ DM: "Dominica",
1352
+ DO: "Dominican Republic",
1353
+ DZ: "Algeria",
1354
+ EC: "Ecuador",
1355
+ EE: "Estonia",
1356
+ EG: "Egypt",
1357
+ EH: "Western Sahara",
1358
+ ER: "Eritrea",
1359
+ ES: "Spain",
1360
+ ET: "Ethiopia",
1361
+ FI: "Finland",
1362
+ FJ: "Fiji",
1363
+ FK: "Falkland Islands",
1364
+ FM: "Micronesia",
1365
+ FO: "Faroe Islands",
1366
+ FR: "France",
1367
+ GA: "Gabon",
1368
+ GB: "United Kingdom",
1369
+ GD: "Grenada",
1370
+ GE: "Georgia",
1371
+ GF: "French Guiana",
1372
+ GG: "Guernsey",
1373
+ GH: "Ghana",
1374
+ GI: "Gibraltar",
1375
+ GL: "Greenland",
1376
+ GM: "Gambia",
1377
+ GN: "Guinea",
1378
+ GP: "Guadeloupe",
1379
+ GQ: "Equatorial Guinea",
1380
+ GR: "Greece",
1381
+ GS: "South Georgia and the South Sandwich Islands",
1382
+ GT: "Guatemala",
1383
+ GU: "Guam",
1384
+ GW: "Guinea-Bissau",
1385
+ GY: "Guyana",
1386
+ HK: "Hong Kong",
1387
+ HM: "Heard Island and McDonald Islands",
1388
+ HN: "Honduras",
1389
+ HR: "Croatia",
1390
+ HT: "Haiti",
1391
+ HU: "Hungary",
1392
+ ID: "Indonesia",
1393
+ IE: "Ireland",
1394
+ IL: "Israel",
1395
+ IM: "Isle of Man",
1396
+ IN: "India",
1397
+ IO: "British Indian Ocean Territory",
1398
+ IQ: "Iraq",
1399
+ IR: "Iran",
1400
+ IS: "Iceland",
1401
+ IT: "Italy",
1402
+ JE: "Jersey",
1403
+ JM: "Jamaica",
1404
+ JO: "Jordan",
1405
+ JP: "Japan",
1406
+ KE: "Kenya",
1407
+ KG: "Kyrgyzstan",
1408
+ KH: "Cambodia",
1409
+ KI: "Kiribati",
1410
+ KM: "Comoros",
1411
+ KN: "Saint Kitts and Nevis",
1412
+ KP: "North Korea",
1413
+ KR: "South Korea",
1414
+ KW: "Kuwait",
1415
+ KY: "Cayman Islands",
1416
+ KZ: "Kazakhstan",
1417
+ LA: "Laos",
1418
+ LB: "Lebanon",
1419
+ LC: "Saint Lucia",
1420
+ LI: "Liechtenstein",
1421
+ LK: "Sri Lanka",
1422
+ LR: "Liberia",
1423
+ LS: "Lesotho",
1424
+ LT: "Lithuania",
1425
+ LU: "Luxembourg",
1426
+ LV: "Latvia",
1427
+ LY: "Libya",
1428
+ MA: "Morocco",
1429
+ MC: "Monaco",
1430
+ MD: "Moldova",
1431
+ ME: "Montenegro",
1432
+ MF: "Saint Martin",
1433
+ MG: "Madagascar",
1434
+ MH: "Marshall Islands",
1435
+ MK: "North Macedonia",
1436
+ ML: "Mali",
1437
+ MM: "Myanmar",
1438
+ MN: "Mongolia",
1439
+ MO: "Macao",
1440
+ MP: "Northern Mariana Islands",
1441
+ MQ: "Martinique",
1442
+ MR: "Mauritania",
1443
+ MS: "Montserrat",
1444
+ MT: "Malta",
1445
+ MU: "Mauritius",
1446
+ MV: "Maldives",
1447
+ MW: "Malawi",
1448
+ MX: "Mexico",
1449
+ MY: "Malaysia",
1450
+ MZ: "Mozambique",
1451
+ NA: "Namibia",
1452
+ NC: "New Caledonia",
1453
+ NE: "Niger",
1454
+ NF: "Norfolk Island",
1455
+ NG: "Nigeria",
1456
+ NI: "Nicaragua",
1457
+ NL: "Netherlands",
1458
+ NO: "Norway",
1459
+ NP: "Nepal",
1460
+ NR: "Nauru",
1461
+ NU: "Niue",
1462
+ NZ: "New Zealand",
1463
+ OM: "Oman",
1464
+ PA: "Panama",
1465
+ PE: "Peru",
1466
+ PF: "French Polynesia",
1467
+ PG: "Papua New Guinea",
1468
+ PH: "Philippines",
1469
+ PK: "Pakistan",
1470
+ PL: "Poland",
1471
+ PM: "Saint Pierre and Miquelon",
1472
+ PN: "Pitcairn",
1473
+ PR: "Puerto Rico",
1474
+ PS: "Palestine",
1475
+ PT: "Portugal",
1476
+ PW: "Palau",
1477
+ PY: "Paraguay",
1478
+ QA: "Qatar",
1479
+ RE: "R\xE9union",
1480
+ RO: "Romania",
1481
+ RS: "Serbia",
1482
+ RU: "Russia",
1483
+ RW: "Rwanda",
1484
+ SA: "Saudi Arabia",
1485
+ SB: "Solomon Islands",
1486
+ SC: "Seychelles",
1487
+ SD: "Sudan",
1488
+ SE: "Sweden",
1489
+ SG: "Singapore",
1490
+ SH: "Saint Helena, Ascension and Tristan da Cunha",
1491
+ SI: "Slovenia",
1492
+ SJ: "Svalbard and Jan Mayen",
1493
+ SK: "Slovakia",
1494
+ SL: "Sierra Leone",
1495
+ SM: "San Marino",
1496
+ SN: "Senegal",
1497
+ SO: "Somalia",
1498
+ SR: "Suriname",
1499
+ SS: "South Sudan",
1500
+ ST: "Sao Tome and Principe",
1501
+ SV: "El Salvador",
1502
+ SX: "Sint Maarten",
1503
+ SY: "Syria",
1504
+ SZ: "Eswatini",
1505
+ TC: "Turks and Caicos Islands",
1506
+ TD: "Chad",
1507
+ TF: "French Southern Territories",
1508
+ TG: "Togo",
1509
+ TH: "Thailand",
1510
+ TJ: "Tajikistan",
1511
+ TK: "Tokelau",
1512
+ TL: "Timor-Leste",
1513
+ TM: "Turkmenistan",
1514
+ TN: "Tunisia",
1515
+ TO: "Tonga",
1516
+ TR: "Turkey",
1517
+ TT: "Trinidad and Tobago",
1518
+ TV: "Tuvalu",
1519
+ TW: "Taiwan",
1520
+ TZ: "Tanzania",
1521
+ UA: "Ukraine",
1522
+ UG: "Uganda",
1523
+ UM: "United States Minor Outlying Islands",
1524
+ US: "United States of America",
1525
+ UY: "Uruguay",
1526
+ UZ: "Uzbekistan",
1527
+ VA: "Holy See",
1528
+ VC: "Saint Vincent and the Grenadines",
1529
+ VE: "Venezuela",
1530
+ VG: "Virgin Islands (UK)",
1531
+ VI: "Virgin Islands (US)",
1532
+ VN: "Vietnam",
1533
+ VU: "Vanuatu",
1534
+ WF: "Wallis and Futuna",
1535
+ WS: "Samoa",
1536
+ YE: "Yemen",
1537
+ YT: "Mayotte",
1538
+ ZA: "South Africa",
1539
+ ZM: "Zambia",
1540
+ ZW: "Zimbabwe"
1541
+ };
1542
+ var timezones = {
1543
+ "Africa/Abidjan": {
1544
+ u: 0,
1545
+ c: ["CI", "BF", "GH", "GM", "GN", "ML", "MR", "SH", "SL", "SN", "TG"]
1546
+ },
1547
+ "Africa/Accra": {
1548
+ a: "Africa/Abidjan",
1549
+ c: ["GH"],
1550
+ r: 1
1551
+ },
1552
+ "Africa/Addis_Ababa": {
1553
+ a: "Africa/Nairobi",
1554
+ c: ["ET"],
1555
+ r: 1
1556
+ },
1557
+ "Africa/Algiers": {
1558
+ u: 60,
1559
+ c: ["DZ"]
1560
+ },
1561
+ "Africa/Asmara": {
1562
+ a: "Africa/Nairobi",
1563
+ c: ["ER"],
1564
+ r: 1
1565
+ },
1566
+ "Africa/Asmera": {
1567
+ a: "Africa/Nairobi",
1568
+ c: ["ER"],
1569
+ r: 1
1570
+ },
1571
+ "Africa/Bamako": {
1572
+ a: "Africa/Abidjan",
1573
+ c: ["ML"],
1574
+ r: 1
1575
+ },
1576
+ "Africa/Bangui": {
1577
+ a: "Africa/Lagos",
1578
+ c: ["CF"],
1579
+ r: 1
1580
+ },
1581
+ "Africa/Banjul": {
1582
+ a: "Africa/Abidjan",
1583
+ c: ["GM"],
1584
+ r: 1
1585
+ },
1586
+ "Africa/Bissau": {
1587
+ u: 0,
1588
+ c: ["GW"]
1589
+ },
1590
+ "Africa/Blantyre": {
1591
+ a: "Africa/Maputo",
1592
+ c: ["MW"],
1593
+ r: 1
1594
+ },
1595
+ "Africa/Brazzaville": {
1596
+ a: "Africa/Lagos",
1597
+ c: ["CG"],
1598
+ r: 1
1599
+ },
1600
+ "Africa/Bujumbura": {
1601
+ a: "Africa/Maputo",
1602
+ c: ["BI"],
1603
+ r: 1
1604
+ },
1605
+ "Africa/Cairo": {
1606
+ u: 120,
1607
+ c: ["EG"]
1608
+ },
1609
+ "Africa/Casablanca": {
1610
+ u: 60,
1611
+ d: 0,
1612
+ c: ["MA"]
1613
+ },
1614
+ "Africa/Ceuta": {
1615
+ u: 60,
1616
+ d: 120,
1617
+ c: ["ES"]
1618
+ },
1619
+ "Africa/Conakry": {
1620
+ a: "Africa/Abidjan",
1621
+ c: ["GN"],
1622
+ r: 1
1623
+ },
1624
+ "Africa/Dakar": {
1625
+ a: "Africa/Abidjan",
1626
+ c: ["SN"],
1627
+ r: 1
1628
+ },
1629
+ "Africa/Dar_es_Salaam": {
1630
+ a: "Africa/Nairobi",
1631
+ c: ["TZ"],
1632
+ r: 1
1633
+ },
1634
+ "Africa/Djibouti": {
1635
+ a: "Africa/Nairobi",
1636
+ c: ["DJ"],
1637
+ r: 1
1638
+ },
1639
+ "Africa/Douala": {
1640
+ a: "Africa/Lagos",
1641
+ c: ["CM"],
1642
+ r: 1
1643
+ },
1644
+ "Africa/El_Aaiun": {
1645
+ u: 60,
1646
+ d: 0,
1647
+ c: ["EH"]
1648
+ },
1649
+ "Africa/Freetown": {
1650
+ a: "Africa/Abidjan",
1651
+ c: ["SL"],
1652
+ r: 1
1653
+ },
1654
+ "Africa/Gaborone": {
1655
+ a: "Africa/Maputo",
1656
+ c: ["BW"],
1657
+ r: 1
1658
+ },
1659
+ "Africa/Harare": {
1660
+ a: "Africa/Maputo",
1661
+ c: ["ZW"],
1662
+ r: 1
1663
+ },
1664
+ "Africa/Johannesburg": {
1665
+ u: 120,
1666
+ c: ["ZA", "LS", "SZ"]
1667
+ },
1668
+ "Africa/Juba": {
1669
+ u: 120,
1670
+ c: ["SS"]
1671
+ },
1672
+ "Africa/Kampala": {
1673
+ a: "Africa/Nairobi",
1674
+ c: ["UG"],
1675
+ r: 1
1676
+ },
1677
+ "Africa/Khartoum": {
1678
+ u: 120,
1679
+ c: ["SD"]
1680
+ },
1681
+ "Africa/Kigali": {
1682
+ a: "Africa/Maputo",
1683
+ c: ["RW"],
1684
+ r: 1
1685
+ },
1686
+ "Africa/Kinshasa": {
1687
+ a: "Africa/Lagos",
1688
+ c: ["CD"],
1689
+ r: 1
1690
+ },
1691
+ "Africa/Lagos": {
1692
+ u: 60,
1693
+ c: ["NG", "AO", "BJ", "CD", "CF", "CG", "CM", "GA", "GQ", "NE"]
1694
+ },
1695
+ "Africa/Libreville": {
1696
+ a: "Africa/Lagos",
1697
+ c: ["GA"],
1698
+ r: 1
1699
+ },
1700
+ "Africa/Lome": {
1701
+ a: "Africa/Abidjan",
1702
+ c: ["TG"],
1703
+ r: 1
1704
+ },
1705
+ "Africa/Luanda": {
1706
+ a: "Africa/Lagos",
1707
+ c: ["AO"],
1708
+ r: 1
1709
+ },
1710
+ "Africa/Lubumbashi": {
1711
+ a: "Africa/Maputo",
1712
+ c: ["CD"],
1713
+ r: 1
1714
+ },
1715
+ "Africa/Lusaka": {
1716
+ a: "Africa/Maputo",
1717
+ c: ["ZM"],
1718
+ r: 1
1719
+ },
1720
+ "Africa/Malabo": {
1721
+ a: "Africa/Lagos",
1722
+ c: ["GQ"],
1723
+ r: 1
1724
+ },
1725
+ "Africa/Maputo": {
1726
+ u: 120,
1727
+ c: ["MZ", "BI", "BW", "CD", "MW", "RW", "ZM", "ZW"]
1728
+ },
1729
+ "Africa/Maseru": {
1730
+ a: "Africa/Johannesburg",
1731
+ c: ["LS"],
1732
+ r: 1
1733
+ },
1734
+ "Africa/Mbabane": {
1735
+ a: "Africa/Johannesburg",
1736
+ c: ["SZ"],
1737
+ r: 1
1738
+ },
1739
+ "Africa/Mogadishu": {
1740
+ a: "Africa/Nairobi",
1741
+ c: ["SO"],
1742
+ r: 1
1743
+ },
1744
+ "Africa/Monrovia": {
1745
+ u: 0,
1746
+ c: ["LR"]
1747
+ },
1748
+ "Africa/Nairobi": {
1749
+ u: 180,
1750
+ c: ["KE", "DJ", "ER", "ET", "KM", "MG", "SO", "TZ", "UG", "YT"]
1751
+ },
1752
+ "Africa/Ndjamena": {
1753
+ u: 60,
1754
+ c: ["TD"]
1755
+ },
1756
+ "Africa/Niamey": {
1757
+ a: "Africa/Lagos",
1758
+ c: ["NE"],
1759
+ r: 1
1760
+ },
1761
+ "Africa/Nouakchott": {
1762
+ a: "Africa/Abidjan",
1763
+ c: ["MR"],
1764
+ r: 1
1765
+ },
1766
+ "Africa/Ouagadougou": {
1767
+ a: "Africa/Abidjan",
1768
+ c: ["BF"],
1769
+ r: 1
1770
+ },
1771
+ "Africa/Porto-Novo": {
1772
+ a: "Africa/Lagos",
1773
+ c: ["BJ"],
1774
+ r: 1
1775
+ },
1776
+ "Africa/Sao_Tome": {
1777
+ u: 0,
1778
+ c: ["ST"]
1779
+ },
1780
+ "Africa/Timbuktu": {
1781
+ a: "Africa/Abidjan",
1782
+ c: ["ML"],
1783
+ r: 1
1784
+ },
1785
+ "Africa/Tripoli": {
1786
+ u: 120,
1787
+ c: ["LY"]
1788
+ },
1789
+ "Africa/Tunis": {
1790
+ u: 60,
1791
+ c: ["TN"]
1792
+ },
1793
+ "Africa/Windhoek": {
1794
+ u: 120,
1795
+ c: ["NA"]
1796
+ },
1797
+ "America/Adak": {
1798
+ u: -600,
1799
+ d: -540,
1800
+ c: ["US"]
1801
+ },
1802
+ "America/Anchorage": {
1803
+ u: -540,
1804
+ d: -480,
1805
+ c: ["US"]
1806
+ },
1807
+ "America/Anguilla": {
1808
+ a: "America/Puerto_Rico",
1809
+ c: ["AI"],
1810
+ r: 1
1811
+ },
1812
+ "America/Antigua": {
1813
+ a: "America/Puerto_Rico",
1814
+ c: ["AG"],
1815
+ r: 1
1816
+ },
1817
+ "America/Araguaina": {
1818
+ u: -180,
1819
+ c: ["BR"]
1820
+ },
1821
+ "America/Argentina/Buenos_Aires": {
1822
+ u: -180,
1823
+ c: ["AR"]
1824
+ },
1825
+ "America/Argentina/Catamarca": {
1826
+ u: -180,
1827
+ c: ["AR"]
1828
+ },
1829
+ "America/Argentina/ComodRivadavia": {
1830
+ a: "America/Argentina/Catamarca",
1831
+ r: 1
1832
+ },
1833
+ "America/Argentina/Cordoba": {
1834
+ u: -180,
1835
+ c: ["AR"]
1836
+ },
1837
+ "America/Argentina/Jujuy": {
1838
+ u: -180,
1839
+ c: ["AR"]
1840
+ },
1841
+ "America/Argentina/La_Rioja": {
1842
+ u: -180,
1843
+ c: ["AR"]
1844
+ },
1845
+ "America/Argentina/Mendoza": {
1846
+ u: -180,
1847
+ c: ["AR"]
1848
+ },
1849
+ "America/Argentina/Rio_Gallegos": {
1850
+ u: -180,
1851
+ c: ["AR"]
1852
+ },
1853
+ "America/Argentina/Salta": {
1854
+ u: -180,
1855
+ c: ["AR"]
1856
+ },
1857
+ "America/Argentina/San_Juan": {
1858
+ u: -180,
1859
+ c: ["AR"]
1860
+ },
1861
+ "America/Argentina/San_Luis": {
1862
+ u: -180,
1863
+ c: ["AR"]
1864
+ },
1865
+ "America/Argentina/Tucuman": {
1866
+ u: -180,
1867
+ c: ["AR"]
1868
+ },
1869
+ "America/Argentina/Ushuaia": {
1870
+ u: -180,
1871
+ c: ["AR"]
1872
+ },
1873
+ "America/Aruba": {
1874
+ a: "America/Puerto_Rico",
1875
+ c: ["AW"],
1876
+ r: 1
1877
+ },
1878
+ "America/Asuncion": {
1879
+ u: -240,
1880
+ d: -180,
1881
+ c: ["PY"]
1882
+ },
1883
+ "America/Atikokan": {
1884
+ a: "America/Panama",
1885
+ c: ["CA"],
1886
+ r: 1
1887
+ },
1888
+ "America/Atka": {
1889
+ a: "America/Adak",
1890
+ r: 1
1891
+ },
1892
+ "America/Bahia": {
1893
+ u: -180,
1894
+ c: ["BR"]
1895
+ },
1896
+ "America/Bahia_Banderas": {
1897
+ u: -360,
1898
+ d: -300,
1899
+ c: ["MX"]
1900
+ },
1901
+ "America/Barbados": {
1902
+ u: -240,
1903
+ c: ["BB"]
1904
+ },
1905
+ "America/Belem": {
1906
+ u: -180,
1907
+ c: ["BR"]
1908
+ },
1909
+ "America/Belize": {
1910
+ u: -360,
1911
+ c: ["BZ"]
1912
+ },
1913
+ "America/Blanc-Sablon": {
1914
+ a: "America/Puerto_Rico",
1915
+ c: ["CA"],
1916
+ r: 1
1917
+ },
1918
+ "America/Boa_Vista": {
1919
+ u: -240,
1920
+ c: ["BR"]
1921
+ },
1922
+ "America/Bogota": {
1923
+ u: -300,
1924
+ c: ["CO"]
1925
+ },
1926
+ "America/Boise": {
1927
+ u: -420,
1928
+ d: -360,
1929
+ c: ["US"]
1930
+ },
1931
+ "America/Buenos_Aires": {
1932
+ a: "America/Argentina/Buenos_Aires",
1933
+ r: 1
1934
+ },
1935
+ "America/Cambridge_Bay": {
1936
+ u: -420,
1937
+ d: -360,
1938
+ c: ["CA"]
1939
+ },
1940
+ "America/Campo_Grande": {
1941
+ u: -240,
1942
+ c: ["BR"]
1943
+ },
1944
+ "America/Cancun": {
1945
+ u: -300,
1946
+ c: ["MX"]
1947
+ },
1948
+ "America/Caracas": {
1949
+ u: -240,
1950
+ c: ["VE"]
1951
+ },
1952
+ "America/Catamarca": {
1953
+ a: "America/Argentina/Catamarca",
1954
+ r: 1
1955
+ },
1956
+ "America/Cayenne": {
1957
+ u: -180,
1958
+ c: ["GF"]
1959
+ },
1960
+ "America/Cayman": {
1961
+ a: "America/Panama",
1962
+ c: ["KY"],
1963
+ r: 1
1964
+ },
1965
+ "America/Chicago": {
1966
+ u: -360,
1967
+ d: -300,
1968
+ c: ["US"]
1969
+ },
1970
+ "America/Chihuahua": {
1971
+ u: -420,
1972
+ d: -360,
1973
+ c: ["MX"]
1974
+ },
1975
+ "America/Coral_Harbour": {
1976
+ a: "America/Panama",
1977
+ c: ["CA"],
1978
+ r: 1
1979
+ },
1980
+ "America/Cordoba": {
1981
+ a: "America/Argentina/Cordoba",
1982
+ r: 1
1983
+ },
1984
+ "America/Costa_Rica": {
1985
+ u: -360,
1986
+ c: ["CR"]
1987
+ },
1988
+ "America/Creston": {
1989
+ a: "America/Phoenix",
1990
+ c: ["CA"],
1991
+ r: 1
1992
+ },
1993
+ "America/Cuiaba": {
1994
+ u: -240,
1995
+ c: ["BR"]
1996
+ },
1997
+ "America/Curacao": {
1998
+ a: "America/Puerto_Rico",
1999
+ c: ["CW"],
2000
+ r: 1
2001
+ },
2002
+ "America/Danmarkshavn": {
2003
+ u: 0,
2004
+ c: ["GL"]
2005
+ },
2006
+ "America/Dawson": {
2007
+ u: -420,
2008
+ c: ["CA"]
2009
+ },
2010
+ "America/Dawson_Creek": {
2011
+ u: -420,
2012
+ c: ["CA"]
2013
+ },
2014
+ "America/Denver": {
2015
+ u: -420,
2016
+ d: -360,
2017
+ c: ["US"]
2018
+ },
2019
+ "America/Detroit": {
2020
+ u: -300,
2021
+ d: -240,
2022
+ c: ["US"]
2023
+ },
2024
+ "America/Dominica": {
2025
+ a: "America/Puerto_Rico",
2026
+ c: ["DM"],
2027
+ r: 1
2028
+ },
2029
+ "America/Edmonton": {
2030
+ u: -420,
2031
+ d: -360,
2032
+ c: ["CA"]
2033
+ },
2034
+ "America/Eirunepe": {
2035
+ u: -300,
2036
+ c: ["BR"]
2037
+ },
2038
+ "America/El_Salvador": {
2039
+ u: -360,
2040
+ c: ["SV"]
2041
+ },
2042
+ "America/Ensenada": {
2043
+ a: "America/Tijuana",
2044
+ r: 1
2045
+ },
2046
+ "America/Fort_Nelson": {
2047
+ u: -420,
2048
+ c: ["CA"]
2049
+ },
2050
+ "America/Fort_Wayne": {
2051
+ a: "America/Indiana/Indianapolis",
2052
+ r: 1
2053
+ },
2054
+ "America/Fortaleza": {
2055
+ u: -180,
2056
+ c: ["BR"]
2057
+ },
2058
+ "America/Glace_Bay": {
2059
+ u: -240,
2060
+ d: -180,
2061
+ c: ["CA"]
2062
+ },
2063
+ "America/Godthab": {
2064
+ a: "America/Nuuk",
2065
+ r: 1
2066
+ },
2067
+ "America/Goose_Bay": {
2068
+ u: -240,
2069
+ d: -180,
2070
+ c: ["CA"]
2071
+ },
2072
+ "America/Grand_Turk": {
2073
+ u: -300,
2074
+ d: -240,
2075
+ c: ["TC"]
2076
+ },
2077
+ "America/Grenada": {
2078
+ a: "America/Puerto_Rico",
2079
+ c: ["GD"],
2080
+ r: 1
2081
+ },
2082
+ "America/Guadeloupe": {
2083
+ a: "America/Puerto_Rico",
2084
+ c: ["GP"],
2085
+ r: 1
2086
+ },
2087
+ "America/Guatemala": {
2088
+ u: -360,
2089
+ c: ["GT"]
2090
+ },
2091
+ "America/Guayaquil": {
2092
+ u: -300,
2093
+ c: ["EC"]
2094
+ },
2095
+ "America/Guyana": {
2096
+ u: -240,
2097
+ c: ["GY"]
2098
+ },
2099
+ "America/Halifax": {
2100
+ u: -240,
2101
+ d: -180,
2102
+ c: ["CA"]
2103
+ },
2104
+ "America/Havana": {
2105
+ u: -300,
2106
+ d: -240,
2107
+ c: ["CU"]
2108
+ },
2109
+ "America/Hermosillo": {
2110
+ u: -420,
2111
+ c: ["MX"]
2112
+ },
2113
+ "America/Indiana/Indianapolis": {
2114
+ u: -300,
2115
+ d: -240,
2116
+ c: ["US"]
2117
+ },
2118
+ "America/Indiana/Knox": {
2119
+ u: -360,
2120
+ d: -300,
2121
+ c: ["US"]
2122
+ },
2123
+ "America/Indiana/Marengo": {
2124
+ u: -300,
2125
+ d: -240,
2126
+ c: ["US"]
2127
+ },
2128
+ "America/Indiana/Petersburg": {
2129
+ u: -300,
2130
+ d: -240,
2131
+ c: ["US"]
2132
+ },
2133
+ "America/Indiana/Tell_City": {
2134
+ u: -360,
2135
+ d: -300,
2136
+ c: ["US"]
2137
+ },
2138
+ "America/Indiana/Vevay": {
2139
+ u: -300,
2140
+ d: -240,
2141
+ c: ["US"]
2142
+ },
2143
+ "America/Indiana/Vincennes": {
2144
+ u: -300,
2145
+ d: -240,
2146
+ c: ["US"]
2147
+ },
2148
+ "America/Indiana/Winamac": {
2149
+ u: -300,
2150
+ d: -240,
2151
+ c: ["US"]
2152
+ },
2153
+ "America/Indianapolis": {
2154
+ a: "America/Indiana/Indianapolis",
2155
+ r: 1
2156
+ },
2157
+ "America/Inuvik": {
2158
+ u: -420,
2159
+ d: -360,
2160
+ c: ["CA"]
2161
+ },
2162
+ "America/Iqaluit": {
2163
+ u: -300,
2164
+ d: -240,
2165
+ c: ["CA"]
2166
+ },
2167
+ "America/Jamaica": {
2168
+ u: -300,
2169
+ c: ["JM"]
2170
+ },
2171
+ "America/Jujuy": {
2172
+ a: "America/Argentina/Jujuy",
2173
+ r: 1
2174
+ },
2175
+ "America/Juneau": {
2176
+ u: -540,
2177
+ d: -480,
2178
+ c: ["US"]
2179
+ },
2180
+ "America/Kentucky/Louisville": {
2181
+ u: -300,
2182
+ d: -240,
2183
+ c: ["US"]
2184
+ },
2185
+ "America/Kentucky/Monticello": {
2186
+ u: -300,
2187
+ d: -240,
2188
+ c: ["US"]
2189
+ },
2190
+ "America/Knox_IN": {
2191
+ a: "America/Indiana/Knox",
2192
+ r: 1
2193
+ },
2194
+ "America/Kralendijk": {
2195
+ a: "America/Puerto_Rico",
2196
+ c: ["BQ"],
2197
+ r: 1
2198
+ },
2199
+ "America/La_Paz": {
2200
+ u: -240,
2201
+ c: ["BO"]
2202
+ },
2203
+ "America/Lima": {
2204
+ u: -300,
2205
+ c: ["PE"]
2206
+ },
2207
+ "America/Los_Angeles": {
2208
+ u: -480,
2209
+ d: -420,
2210
+ c: ["US"]
2211
+ },
2212
+ "America/Louisville": {
2213
+ a: "America/Kentucky/Louisville",
2214
+ r: 1
2215
+ },
2216
+ "America/Lower_Princes": {
2217
+ a: "America/Puerto_Rico",
2218
+ c: ["SX"],
2219
+ r: 1
2220
+ },
2221
+ "America/Maceio": {
2222
+ u: -180,
2223
+ c: ["BR"]
2224
+ },
2225
+ "America/Managua": {
2226
+ u: -360,
2227
+ c: ["NI"]
2228
+ },
2229
+ "America/Manaus": {
2230
+ u: -240,
2231
+ c: ["BR"]
2232
+ },
2233
+ "America/Marigot": {
2234
+ a: "America/Puerto_Rico",
2235
+ c: ["MF"],
2236
+ r: 1
2237
+ },
2238
+ "America/Martinique": {
2239
+ u: -240,
2240
+ c: ["MQ"]
2241
+ },
2242
+ "America/Matamoros": {
2243
+ u: -360,
2244
+ d: -300,
2245
+ c: ["MX"]
2246
+ },
2247
+ "America/Mazatlan": {
2248
+ u: -420,
2249
+ d: -360,
2250
+ c: ["MX"]
2251
+ },
2252
+ "America/Mendoza": {
2253
+ a: "America/Argentina/Mendoza",
2254
+ r: 1
2255
+ },
2256
+ "America/Menominee": {
2257
+ u: -360,
2258
+ d: -300,
2259
+ c: ["US"]
2260
+ },
2261
+ "America/Merida": {
2262
+ u: -360,
2263
+ d: -300,
2264
+ c: ["MX"]
2265
+ },
2266
+ "America/Metlakatla": {
2267
+ u: -540,
2268
+ d: -480,
2269
+ c: ["US"]
2270
+ },
2271
+ "America/Mexico_City": {
2272
+ u: -360,
2273
+ d: -300,
2274
+ c: ["MX"]
2275
+ },
2276
+ "America/Miquelon": {
2277
+ u: -180,
2278
+ d: -120,
2279
+ c: ["PM"]
2280
+ },
2281
+ "America/Moncton": {
2282
+ u: -240,
2283
+ d: -180,
2284
+ c: ["CA"]
2285
+ },
2286
+ "America/Monterrey": {
2287
+ u: -360,
2288
+ d: -300,
2289
+ c: ["MX"]
2290
+ },
2291
+ "America/Montevideo": {
2292
+ u: -180,
2293
+ c: ["UY"]
2294
+ },
2295
+ "America/Montreal": {
2296
+ a: "America/Toronto",
2297
+ c: ["CA"],
2298
+ r: 1
2299
+ },
2300
+ "America/Montserrat": {
2301
+ a: "America/Puerto_Rico",
2302
+ c: ["MS"],
2303
+ r: 1
2304
+ },
2305
+ "America/Nassau": {
2306
+ a: "America/Toronto",
2307
+ c: ["BS"],
2308
+ r: 1
2309
+ },
2310
+ "America/New_York": {
2311
+ u: -300,
2312
+ d: -240,
2313
+ c: ["US"]
2314
+ },
2315
+ "America/Nipigon": {
2316
+ u: -300,
2317
+ d: -240,
2318
+ c: ["CA"]
2319
+ },
2320
+ "America/Nome": {
2321
+ u: -540,
2322
+ d: -480,
2323
+ c: ["US"]
2324
+ },
2325
+ "America/Noronha": {
2326
+ u: -120,
2327
+ c: ["BR"]
2328
+ },
2329
+ "America/North_Dakota/Beulah": {
2330
+ u: -360,
2331
+ d: -300,
2332
+ c: ["US"]
2333
+ },
2334
+ "America/North_Dakota/Center": {
2335
+ u: -360,
2336
+ d: -300,
2337
+ c: ["US"]
2338
+ },
2339
+ "America/North_Dakota/New_Salem": {
2340
+ u: -360,
2341
+ d: -300,
2342
+ c: ["US"]
2343
+ },
2344
+ "America/Nuuk": {
2345
+ u: -180,
2346
+ d: -120,
2347
+ c: ["GL"]
2348
+ },
2349
+ "America/Ojinaga": {
2350
+ u: -420,
2351
+ d: -360,
2352
+ c: ["MX"]
2353
+ },
2354
+ "America/Panama": {
2355
+ u: -300,
2356
+ c: ["PA", "CA", "KY"]
2357
+ },
2358
+ "America/Pangnirtung": {
2359
+ u: -300,
2360
+ d: -240,
2361
+ c: ["CA"]
2362
+ },
2363
+ "America/Paramaribo": {
2364
+ u: -180,
2365
+ c: ["SR"]
2366
+ },
2367
+ "America/Phoenix": {
2368
+ u: -420,
2369
+ c: ["US", "CA"]
2370
+ },
2371
+ "America/Port-au-Prince": {
2372
+ u: -300,
2373
+ d: -240,
2374
+ c: ["HT"]
2375
+ },
2376
+ "America/Port_of_Spain": {
2377
+ a: "America/Puerto_Rico",
2378
+ c: ["TT"],
2379
+ r: 1
2380
+ },
2381
+ "America/Porto_Acre": {
2382
+ a: "America/Rio_Branco",
2383
+ r: 1
2384
+ },
2385
+ "America/Porto_Velho": {
2386
+ u: -240,
2387
+ c: ["BR"]
2388
+ },
2389
+ "America/Puerto_Rico": {
2390
+ u: -240,
2391
+ c: [
2392
+ "PR",
2393
+ "AG",
2394
+ "CA",
2395
+ "AI",
2396
+ "AW",
2397
+ "BL",
2398
+ "BQ",
2399
+ "CW",
2400
+ "DM",
2401
+ "GD",
2402
+ "GP",
2403
+ "KN",
2404
+ "LC",
2405
+ "MF",
2406
+ "MS",
2407
+ "SX",
2408
+ "TT",
2409
+ "VC",
2410
+ "VG",
2411
+ "VI"
2412
+ ]
2413
+ },
2414
+ "America/Punta_Arenas": {
2415
+ u: -180,
2416
+ c: ["CL"]
2417
+ },
2418
+ "America/Rainy_River": {
2419
+ u: -360,
2420
+ d: -300,
2421
+ c: ["CA"]
2422
+ },
2423
+ "America/Rankin_Inlet": {
2424
+ u: -360,
2425
+ d: -300,
2426
+ c: ["CA"]
2427
+ },
2428
+ "America/Recife": {
2429
+ u: -180,
2430
+ c: ["BR"]
2431
+ },
2432
+ "America/Regina": {
2433
+ u: -360,
2434
+ c: ["CA"]
2435
+ },
2436
+ "America/Resolute": {
2437
+ u: -360,
2438
+ d: -300,
2439
+ c: ["CA"]
2440
+ },
2441
+ "America/Rio_Branco": {
2442
+ u: -300,
2443
+ c: ["BR"]
2444
+ },
2445
+ "America/Rosario": {
2446
+ a: "America/Argentina/Cordoba",
2447
+ r: 1
2448
+ },
2449
+ "America/Santa_Isabel": {
2450
+ a: "America/Tijuana",
2451
+ r: 1
2452
+ },
2453
+ "America/Santarem": {
2454
+ u: -180,
2455
+ c: ["BR"]
2456
+ },
2457
+ "America/Santiago": {
2458
+ u: -240,
2459
+ d: -180,
2460
+ c: ["CL"]
2461
+ },
2462
+ "America/Santo_Domingo": {
2463
+ u: -240,
2464
+ c: ["DO"]
2465
+ },
2466
+ "America/Sao_Paulo": {
2467
+ u: -180,
2468
+ c: ["BR"]
2469
+ },
2470
+ "America/Scoresbysund": {
2471
+ u: -60,
2472
+ d: 0,
2473
+ c: ["GL"]
2474
+ },
2475
+ "America/Shiprock": {
2476
+ a: "America/Denver",
2477
+ r: 1
2478
+ },
2479
+ "America/Sitka": {
2480
+ u: -540,
2481
+ d: -480,
2482
+ c: ["US"]
2483
+ },
2484
+ "America/St_Barthelemy": {
2485
+ a: "America/Puerto_Rico",
2486
+ c: ["BL"],
2487
+ r: 1
2488
+ },
2489
+ "America/St_Johns": {
2490
+ u: -150,
2491
+ d: -90,
2492
+ c: ["CA"]
2493
+ },
2494
+ "America/St_Kitts": {
2495
+ a: "America/Puerto_Rico",
2496
+ c: ["KN"],
2497
+ r: 1
2498
+ },
2499
+ "America/St_Lucia": {
2500
+ a: "America/Puerto_Rico",
2501
+ c: ["LC"],
2502
+ r: 1
2503
+ },
2504
+ "America/St_Thomas": {
2505
+ a: "America/Puerto_Rico",
2506
+ c: ["VI"],
2507
+ r: 1
2508
+ },
2509
+ "America/St_Vincent": {
2510
+ a: "America/Puerto_Rico",
2511
+ c: ["VC"],
2512
+ r: 1
2513
+ },
2514
+ "America/Swift_Current": {
2515
+ u: -360,
2516
+ c: ["CA"]
2517
+ },
2518
+ "America/Tegucigalpa": {
2519
+ u: -360,
2520
+ c: ["HN"]
2521
+ },
2522
+ "America/Thule": {
2523
+ u: -240,
2524
+ d: -180,
2525
+ c: ["GL"]
2526
+ },
2527
+ "America/Thunder_Bay": {
2528
+ u: -300,
2529
+ d: -240,
2530
+ c: ["CA"]
2531
+ },
2532
+ "America/Tijuana": {
2533
+ u: -480,
2534
+ d: -420,
2535
+ c: ["MX"]
2536
+ },
2537
+ "America/Toronto": {
2538
+ u: -300,
2539
+ d: -240,
2540
+ c: ["CA", "BS"]
2541
+ },
2542
+ "America/Tortola": {
2543
+ a: "America/Puerto_Rico",
2544
+ c: ["VG"],
2545
+ r: 1
2546
+ },
2547
+ "America/Vancouver": {
2548
+ u: -480,
2549
+ d: -420,
2550
+ c: ["CA"]
2551
+ },
2552
+ "America/Virgin": {
2553
+ a: "America/Puerto_Rico",
2554
+ c: ["VI"],
2555
+ r: 1
2556
+ },
2557
+ "America/Whitehorse": {
2558
+ u: -420,
2559
+ c: ["CA"]
2560
+ },
2561
+ "America/Winnipeg": {
2562
+ u: -360,
2563
+ d: -300,
2564
+ c: ["CA"]
2565
+ },
2566
+ "America/Yakutat": {
2567
+ u: -540,
2568
+ d: -480,
2569
+ c: ["US"]
2570
+ },
2571
+ "America/Yellowknife": {
2572
+ u: -420,
2573
+ d: -360,
2574
+ c: ["CA"]
2575
+ },
2576
+ "Antarctica/Casey": {
2577
+ u: 660,
2578
+ c: ["AQ"]
2579
+ },
2580
+ "Antarctica/Davis": {
2581
+ u: 420,
2582
+ c: ["AQ"]
2583
+ },
2584
+ "Antarctica/DumontDUrville": {
2585
+ a: "Pacific/Port_Moresby",
2586
+ c: ["AQ"],
2587
+ r: 1
2588
+ },
2589
+ "Antarctica/Macquarie": {
2590
+ u: 600,
2591
+ d: 660,
2592
+ c: ["AU"]
2593
+ },
2594
+ "Antarctica/Mawson": {
2595
+ u: 300,
2596
+ c: ["AQ"]
2597
+ },
2598
+ "Antarctica/McMurdo": {
2599
+ a: "Pacific/Auckland",
2600
+ c: ["AQ"],
2601
+ r: 1
2602
+ },
2603
+ "Antarctica/Palmer": {
2604
+ u: -180,
2605
+ c: ["AQ"]
2606
+ },
2607
+ "Antarctica/Rothera": {
2608
+ u: -180,
2609
+ c: ["AQ"]
2610
+ },
2611
+ "Antarctica/South_Pole": {
2612
+ a: "Pacific/Auckland",
2613
+ c: ["AQ"],
2614
+ r: 1
2615
+ },
2616
+ "Antarctica/Syowa": {
2617
+ a: "Asia/Riyadh",
2618
+ c: ["AQ"],
2619
+ r: 1
2620
+ },
2621
+ "Antarctica/Troll": {
2622
+ u: 0,
2623
+ d: 120,
2624
+ c: ["AQ"]
2625
+ },
2626
+ "Antarctica/Vostok": {
2627
+ u: 360,
2628
+ c: ["AQ"]
2629
+ },
2630
+ "Arctic/Longyearbyen": {
2631
+ a: "Europe/Oslo",
2632
+ c: ["SJ"],
2633
+ r: 1
2634
+ },
2635
+ "Asia/Aden": {
2636
+ a: "Asia/Riyadh",
2637
+ c: ["YE"],
2638
+ r: 1
2639
+ },
2640
+ "Asia/Almaty": {
2641
+ u: 360,
2642
+ c: ["KZ"]
2643
+ },
2644
+ "Asia/Amman": {
2645
+ u: 120,
2646
+ d: 180,
2647
+ c: ["JO"]
2648
+ },
2649
+ "Asia/Anadyr": {
2650
+ u: 720,
2651
+ c: ["RU"]
2652
+ },
2653
+ "Asia/Aqtau": {
2654
+ u: 300,
2655
+ c: ["KZ"]
2656
+ },
2657
+ "Asia/Aqtobe": {
2658
+ u: 300,
2659
+ c: ["KZ"]
2660
+ },
2661
+ "Asia/Ashgabat": {
2662
+ u: 300,
2663
+ c: ["TM"]
2664
+ },
2665
+ "Asia/Ashkhabad": {
2666
+ a: "Asia/Ashgabat",
2667
+ r: 1
2668
+ },
2669
+ "Asia/Atyrau": {
2670
+ u: 300,
2671
+ c: ["KZ"]
2672
+ },
2673
+ "Asia/Baghdad": {
2674
+ u: 180,
2675
+ c: ["IQ"]
2676
+ },
2677
+ "Asia/Bahrain": {
2678
+ a: "Asia/Qatar",
2679
+ c: ["BH"],
2680
+ r: 1
2681
+ },
2682
+ "Asia/Baku": {
2683
+ u: 240,
2684
+ c: ["AZ"]
2685
+ },
2686
+ "Asia/Bangkok": {
2687
+ u: 420,
2688
+ c: ["TH", "KH", "LA", "VN"]
2689
+ },
2690
+ "Asia/Barnaul": {
2691
+ u: 420,
2692
+ c: ["RU"]
2693
+ },
2694
+ "Asia/Beirut": {
2695
+ u: 120,
2696
+ d: 180,
2697
+ c: ["LB"]
2698
+ },
2699
+ "Asia/Bishkek": {
2700
+ u: 360,
2701
+ c: ["KG"]
2702
+ },
2703
+ "Asia/Brunei": {
2704
+ u: 480,
2705
+ c: ["BN"]
2706
+ },
2707
+ "Asia/Calcutta": {
2708
+ a: "Asia/Kolkata",
2709
+ r: 1
2710
+ },
2711
+ "Asia/Chita": {
2712
+ u: 540,
2713
+ c: ["RU"]
2714
+ },
2715
+ "Asia/Choibalsan": {
2716
+ u: 480,
2717
+ c: ["MN"]
2718
+ },
2719
+ "Asia/Chongqing": {
2720
+ a: "Asia/Shanghai",
2721
+ r: 1
2722
+ },
2723
+ "Asia/Chungking": {
2724
+ a: "Asia/Shanghai",
2725
+ r: 1
2726
+ },
2727
+ "Asia/Colombo": {
2728
+ u: 330,
2729
+ c: ["LK"]
2730
+ },
2731
+ "Asia/Dacca": {
2732
+ a: "Asia/Dhaka",
2733
+ r: 1
2734
+ },
2735
+ "Asia/Damascus": {
2736
+ u: 120,
2737
+ d: 180,
2738
+ c: ["SY"]
2739
+ },
2740
+ "Asia/Dhaka": {
2741
+ u: 360,
2742
+ c: ["BD"]
2743
+ },
2744
+ "Asia/Dili": {
2745
+ u: 540,
2746
+ c: ["TL"]
2747
+ },
2748
+ "Asia/Dubai": {
2749
+ u: 240,
2750
+ c: ["AE", "OM"]
2751
+ },
2752
+ "Asia/Dushanbe": {
2753
+ u: 300,
2754
+ c: ["TJ"]
2755
+ },
2756
+ "Asia/Famagusta": {
2757
+ u: 120,
2758
+ d: 180,
2759
+ c: ["CY"]
2760
+ },
2761
+ "Asia/Gaza": {
2762
+ u: 120,
2763
+ d: 180,
2764
+ c: ["PS"]
2765
+ },
2766
+ "Asia/Harbin": {
2767
+ a: "Asia/Shanghai",
2768
+ r: 1
2769
+ },
2770
+ "Asia/Hebron": {
2771
+ u: 120,
2772
+ d: 180,
2773
+ c: ["PS"]
2774
+ },
2775
+ "Asia/Ho_Chi_Minh": {
2776
+ u: 420,
2777
+ c: ["VN"]
2778
+ },
2779
+ "Asia/Hong_Kong": {
2780
+ u: 480,
2781
+ c: ["HK"]
2782
+ },
2783
+ "Asia/Hovd": {
2784
+ u: 420,
2785
+ c: ["MN"]
2786
+ },
2787
+ "Asia/Irkutsk": {
2788
+ u: 480,
2789
+ c: ["RU"]
2790
+ },
2791
+ "Asia/Istanbul": {
2792
+ a: "Europe/Istanbul",
2793
+ r: 1
2794
+ },
2795
+ "Asia/Jakarta": {
2796
+ u: 420,
2797
+ c: ["ID"]
2798
+ },
2799
+ "Asia/Jayapura": {
2800
+ u: 540,
2801
+ c: ["ID"]
2802
+ },
2803
+ "Asia/Jerusalem": {
2804
+ u: 120,
2805
+ d: 180,
2806
+ c: ["IL"]
2807
+ },
2808
+ "Asia/Kabul": {
2809
+ u: 270,
2810
+ c: ["AF"]
2811
+ },
2812
+ "Asia/Kamchatka": {
2813
+ u: 720,
2814
+ c: ["RU"]
2815
+ },
2816
+ "Asia/Karachi": {
2817
+ u: 300,
2818
+ c: ["PK"]
2819
+ },
2820
+ "Asia/Kashgar": {
2821
+ a: "Asia/Urumqi",
2822
+ r: 1
2823
+ },
2824
+ "Asia/Kathmandu": {
2825
+ u: 345,
2826
+ c: ["NP"]
2827
+ },
2828
+ "Asia/Katmandu": {
2829
+ a: "Asia/Kathmandu",
2830
+ r: 1
2831
+ },
2832
+ "Asia/Khandyga": {
2833
+ u: 540,
2834
+ c: ["RU"]
2835
+ },
2836
+ "Asia/Kolkata": {
2837
+ u: 330,
2838
+ c: ["IN"]
2839
+ },
2840
+ "Asia/Krasnoyarsk": {
2841
+ u: 420,
2842
+ c: ["RU"]
2843
+ },
2844
+ "Asia/Kuala_Lumpur": {
2845
+ u: 480,
2846
+ c: ["MY"]
2847
+ },
2848
+ "Asia/Kuching": {
2849
+ u: 480,
2850
+ c: ["MY"]
2851
+ },
2852
+ "Asia/Kuwait": {
2853
+ a: "Asia/Riyadh",
2854
+ c: ["KW"],
2855
+ r: 1
2856
+ },
2857
+ "Asia/Macao": {
2858
+ a: "Asia/Macau",
2859
+ r: 1
2860
+ },
2861
+ "Asia/Macau": {
2862
+ u: 480,
2863
+ c: ["MO"]
2864
+ },
2865
+ "Asia/Magadan": {
2866
+ u: 660,
2867
+ c: ["RU"]
2868
+ },
2869
+ "Asia/Makassar": {
2870
+ u: 480,
2871
+ c: ["ID"]
2872
+ },
2873
+ "Asia/Manila": {
2874
+ u: 480,
2875
+ c: ["PH"]
2876
+ },
2877
+ "Asia/Muscat": {
2878
+ a: "Asia/Dubai",
2879
+ c: ["OM"],
2880
+ r: 1
2881
+ },
2882
+ "Asia/Nicosia": {
2883
+ u: 120,
2884
+ d: 180,
2885
+ c: ["CY"]
2886
+ },
2887
+ "Asia/Novokuznetsk": {
2888
+ u: 420,
2889
+ c: ["RU"]
2890
+ },
2891
+ "Asia/Novosibirsk": {
2892
+ u: 420,
2893
+ c: ["RU"]
2894
+ },
2895
+ "Asia/Omsk": {
2896
+ u: 360,
2897
+ c: ["RU"]
2898
+ },
2899
+ "Asia/Oral": {
2900
+ u: 300,
2901
+ c: ["KZ"]
2902
+ },
2903
+ "Asia/Phnom_Penh": {
2904
+ a: "Asia/Bangkok",
2905
+ c: ["KH"],
2906
+ r: 1
2907
+ },
2908
+ "Asia/Pontianak": {
2909
+ u: 420,
2910
+ c: ["ID"]
2911
+ },
2912
+ "Asia/Pyongyang": {
2913
+ u: 540,
2914
+ c: ["KP"]
2915
+ },
2916
+ "Asia/Qatar": {
2917
+ u: 180,
2918
+ c: ["QA", "BH"]
2919
+ },
2920
+ "Asia/Qostanay": {
2921
+ u: 360,
2922
+ c: ["KZ"]
2923
+ },
2924
+ "Asia/Qyzylorda": {
2925
+ u: 300,
2926
+ c: ["KZ"]
2927
+ },
2928
+ "Asia/Rangoon": {
2929
+ a: "Asia/Yangon",
2930
+ r: 1
2931
+ },
2932
+ "Asia/Riyadh": {
2933
+ u: 180,
2934
+ c: ["SA", "AQ", "KW", "YE"]
2935
+ },
2936
+ "Asia/Saigon": {
2937
+ a: "Asia/Ho_Chi_Minh",
2938
+ r: 1
2939
+ },
2940
+ "Asia/Sakhalin": {
2941
+ u: 660,
2942
+ c: ["RU"]
2943
+ },
2944
+ "Asia/Samarkand": {
2945
+ u: 300,
2946
+ c: ["UZ"]
2947
+ },
2948
+ "Asia/Seoul": {
2949
+ u: 540,
2950
+ c: ["KR"]
2951
+ },
2952
+ "Asia/Shanghai": {
2953
+ u: 480,
2954
+ c: ["CN"]
2955
+ },
2956
+ "Asia/Singapore": {
2957
+ u: 480,
2958
+ c: ["SG", "MY"]
2959
+ },
2960
+ "Asia/Srednekolymsk": {
2961
+ u: 660,
2962
+ c: ["RU"]
2963
+ },
2964
+ "Asia/Taipei": {
2965
+ u: 480,
2966
+ c: ["TW"]
2967
+ },
2968
+ "Asia/Tashkent": {
2969
+ u: 300,
2970
+ c: ["UZ"]
2971
+ },
2972
+ "Asia/Tbilisi": {
2973
+ u: 240,
2974
+ c: ["GE"]
2975
+ },
2976
+ "Asia/Tehran": {
2977
+ u: 210,
2978
+ d: 270,
2979
+ c: ["IR"]
2980
+ },
2981
+ "Asia/Tel_Aviv": {
2982
+ a: "Asia/Jerusalem",
2983
+ r: 1
2984
+ },
2985
+ "Asia/Thimbu": {
2986
+ a: "Asia/Thimphu",
2987
+ r: 1
2988
+ },
2989
+ "Asia/Thimphu": {
2990
+ u: 360,
2991
+ c: ["BT"]
2992
+ },
2993
+ "Asia/Tokyo": {
2994
+ u: 540,
2995
+ c: ["JP"]
2996
+ },
2997
+ "Asia/Tomsk": {
2998
+ u: 420,
2999
+ c: ["RU"]
3000
+ },
3001
+ "Asia/Ujung_Pandang": {
3002
+ a: "Asia/Makassar",
3003
+ r: 1
3004
+ },
3005
+ "Asia/Ulaanbaatar": {
3006
+ u: 480,
3007
+ c: ["MN"]
3008
+ },
3009
+ "Asia/Ulan_Bator": {
3010
+ a: "Asia/Ulaanbaatar",
3011
+ r: 1
3012
+ },
3013
+ "Asia/Urumqi": {
3014
+ u: 360,
3015
+ c: ["CN"]
3016
+ },
3017
+ "Asia/Ust-Nera": {
3018
+ u: 600,
3019
+ c: ["RU"]
3020
+ },
3021
+ "Asia/Vientiane": {
3022
+ a: "Asia/Bangkok",
3023
+ c: ["LA"],
3024
+ r: 1
3025
+ },
3026
+ "Asia/Vladivostok": {
3027
+ u: 600,
3028
+ c: ["RU"]
3029
+ },
3030
+ "Asia/Yakutsk": {
3031
+ u: 540,
3032
+ c: ["RU"]
3033
+ },
3034
+ "Asia/Yangon": {
3035
+ u: 390,
3036
+ c: ["MM"]
3037
+ },
3038
+ "Asia/Yekaterinburg": {
3039
+ u: 300,
3040
+ c: ["RU"]
3041
+ },
3042
+ "Asia/Yerevan": {
3043
+ u: 240,
3044
+ c: ["AM"]
3045
+ },
3046
+ "Atlantic/Azores": {
3047
+ u: -60,
3048
+ d: 0,
3049
+ c: ["PT"]
3050
+ },
3051
+ "Atlantic/Bermuda": {
3052
+ u: -240,
3053
+ d: -180,
3054
+ c: ["BM"]
3055
+ },
3056
+ "Atlantic/Canary": {
3057
+ u: 0,
3058
+ d: 60,
3059
+ c: ["ES"]
3060
+ },
3061
+ "Atlantic/Cape_Verde": {
3062
+ u: -60,
3063
+ c: ["CV"]
3064
+ },
3065
+ "Atlantic/Faeroe": {
3066
+ a: "Atlantic/Faroe",
3067
+ r: 1
3068
+ },
3069
+ "Atlantic/Faroe": {
3070
+ u: 0,
3071
+ d: 60,
3072
+ c: ["FO"]
3073
+ },
3074
+ "Atlantic/Jan_Mayen": {
3075
+ a: "Europe/Oslo",
3076
+ c: ["SJ"],
3077
+ r: 1
3078
+ },
3079
+ "Atlantic/Madeira": {
3080
+ u: 0,
3081
+ d: 60,
3082
+ c: ["PT"]
3083
+ },
3084
+ "Atlantic/Reykjavik": {
3085
+ u: 0,
3086
+ c: ["IS"]
3087
+ },
3088
+ "Atlantic/South_Georgia": {
3089
+ u: -120,
3090
+ c: ["GS"]
3091
+ },
3092
+ "Atlantic/St_Helena": {
3093
+ a: "Africa/Abidjan",
3094
+ c: ["SH"],
3095
+ r: 1
3096
+ },
3097
+ "Atlantic/Stanley": {
3098
+ u: -180,
3099
+ c: ["FK"]
3100
+ },
3101
+ "Australia/ACT": {
3102
+ a: "Australia/Sydney",
3103
+ r: 1
3104
+ },
3105
+ "Australia/Adelaide": {
3106
+ u: 570,
3107
+ d: 630,
3108
+ c: ["AU"]
3109
+ },
3110
+ "Australia/Brisbane": {
3111
+ u: 600,
3112
+ c: ["AU"]
3113
+ },
3114
+ "Australia/Broken_Hill": {
3115
+ u: 570,
3116
+ d: 630,
3117
+ c: ["AU"]
3118
+ },
3119
+ "Australia/Canberra": {
3120
+ a: "Australia/Sydney",
3121
+ r: 1
3122
+ },
3123
+ "Australia/Currie": {
3124
+ a: "Australia/Hobart",
3125
+ r: 1
3126
+ },
3127
+ "Australia/Darwin": {
3128
+ u: 570,
3129
+ c: ["AU"]
3130
+ },
3131
+ "Australia/Eucla": {
3132
+ u: 525,
3133
+ c: ["AU"]
3134
+ },
3135
+ "Australia/Hobart": {
3136
+ u: 600,
3137
+ d: 660,
3138
+ c: ["AU"]
3139
+ },
3140
+ "Australia/LHI": {
3141
+ a: "Australia/Lord_Howe",
3142
+ r: 1
3143
+ },
3144
+ "Australia/Lindeman": {
3145
+ u: 600,
3146
+ c: ["AU"]
3147
+ },
3148
+ "Australia/Lord_Howe": {
3149
+ u: 630,
3150
+ d: 660,
3151
+ c: ["AU"]
3152
+ },
3153
+ "Australia/Melbourne": {
3154
+ u: 600,
3155
+ d: 660,
3156
+ c: ["AU"]
3157
+ },
3158
+ "Australia/NSW": {
3159
+ a: "Australia/Sydney",
3160
+ r: 1
3161
+ },
3162
+ "Australia/North": {
3163
+ a: "Australia/Darwin",
3164
+ r: 1
3165
+ },
3166
+ "Australia/Perth": {
3167
+ u: 480,
3168
+ c: ["AU"]
3169
+ },
3170
+ "Australia/Queensland": {
3171
+ a: "Australia/Brisbane",
3172
+ r: 1
3173
+ },
3174
+ "Australia/South": {
3175
+ a: "Australia/Adelaide",
3176
+ r: 1
3177
+ },
3178
+ "Australia/Sydney": {
3179
+ u: 600,
3180
+ d: 660,
3181
+ c: ["AU"]
3182
+ },
3183
+ "Australia/Tasmania": {
3184
+ a: "Australia/Hobart",
3185
+ r: 1
3186
+ },
3187
+ "Australia/Victoria": {
3188
+ a: "Australia/Melbourne",
3189
+ r: 1
3190
+ },
3191
+ "Australia/West": {
3192
+ a: "Australia/Perth",
3193
+ r: 1
3194
+ },
3195
+ "Australia/Yancowinna": {
3196
+ a: "Australia/Broken_Hill",
3197
+ r: 1
3198
+ },
3199
+ "Brazil/Acre": {
3200
+ a: "America/Rio_Branco",
3201
+ r: 1
3202
+ },
3203
+ "Brazil/DeNoronha": {
3204
+ a: "America/Noronha",
3205
+ r: 1
3206
+ },
3207
+ "Brazil/East": {
3208
+ a: "America/Sao_Paulo",
3209
+ r: 1
3210
+ },
3211
+ "Brazil/West": {
3212
+ a: "America/Manaus",
3213
+ r: 1
3214
+ },
3215
+ CET: {
3216
+ u: 60,
3217
+ d: 120
3218
+ },
3219
+ CST6CDT: {
3220
+ u: -360,
3221
+ d: -300
3222
+ },
3223
+ "Canada/Atlantic": {
3224
+ a: "America/Halifax",
3225
+ r: 1
3226
+ },
3227
+ "Canada/Central": {
3228
+ a: "America/Winnipeg",
3229
+ r: 1
3230
+ },
3231
+ "Canada/Eastern": {
3232
+ a: "America/Toronto",
3233
+ c: ["CA"],
3234
+ r: 1
3235
+ },
3236
+ "Canada/Mountain": {
3237
+ a: "America/Edmonton",
3238
+ r: 1
3239
+ },
3240
+ "Canada/Newfoundland": {
3241
+ a: "America/St_Johns",
3242
+ r: 1
3243
+ },
3244
+ "Canada/Pacific": {
3245
+ a: "America/Vancouver",
3246
+ r: 1
3247
+ },
3248
+ "Canada/Saskatchewan": {
3249
+ a: "America/Regina",
3250
+ r: 1
3251
+ },
3252
+ "Canada/Yukon": {
3253
+ a: "America/Whitehorse",
3254
+ r: 1
3255
+ },
3256
+ "Chile/Continental": {
3257
+ a: "America/Santiago",
3258
+ r: 1
3259
+ },
3260
+ "Chile/EasterIsland": {
3261
+ a: "Pacific/Easter",
3262
+ r: 1
3263
+ },
3264
+ Cuba: {
3265
+ a: "America/Havana",
3266
+ r: 1
3267
+ },
3268
+ EET: {
3269
+ u: 120,
3270
+ d: 180
3271
+ },
3272
+ EST: {
3273
+ u: -300
3274
+ },
3275
+ EST5EDT: {
3276
+ u: -300,
3277
+ d: -240
3278
+ },
3279
+ Egypt: {
3280
+ a: "Africa/Cairo",
3281
+ r: 1
3282
+ },
3283
+ Eire: {
3284
+ a: "Europe/Dublin",
3285
+ r: 1
3286
+ },
3287
+ "Etc/GMT": {
3288
+ u: 0
3289
+ },
3290
+ "Etc/GMT+0": {
3291
+ a: "Etc/GMT",
3292
+ r: 1
3293
+ },
3294
+ "Etc/GMT+1": {
3295
+ u: -60
3296
+ },
3297
+ "Etc/GMT+10": {
3298
+ u: -600
3299
+ },
3300
+ "Etc/GMT+11": {
3301
+ u: -660
3302
+ },
3303
+ "Etc/GMT+12": {
3304
+ u: -720
3305
+ },
3306
+ "Etc/GMT+2": {
3307
+ u: -120
3308
+ },
3309
+ "Etc/GMT+3": {
3310
+ u: -180
3311
+ },
3312
+ "Etc/GMT+4": {
3313
+ u: -240
3314
+ },
3315
+ "Etc/GMT+5": {
3316
+ u: -300
3317
+ },
3318
+ "Etc/GMT+6": {
3319
+ u: -360
3320
+ },
3321
+ "Etc/GMT+7": {
3322
+ u: -420
3323
+ },
3324
+ "Etc/GMT+8": {
3325
+ u: -480
3326
+ },
3327
+ "Etc/GMT+9": {
3328
+ u: -540
3329
+ },
3330
+ "Etc/GMT-0": {
3331
+ a: "Etc/GMT",
3332
+ r: 1
3333
+ },
3334
+ "Etc/GMT-1": {
3335
+ u: 60
3336
+ },
3337
+ "Etc/GMT-10": {
3338
+ u: 600
3339
+ },
3340
+ "Etc/GMT-11": {
3341
+ u: 660
3342
+ },
3343
+ "Etc/GMT-12": {
3344
+ u: 720
3345
+ },
3346
+ "Etc/GMT-13": {
3347
+ u: 780
3348
+ },
3349
+ "Etc/GMT-14": {
3350
+ u: 840
3351
+ },
3352
+ "Etc/GMT-2": {
3353
+ u: 120
3354
+ },
3355
+ "Etc/GMT-3": {
3356
+ u: 180
3357
+ },
3358
+ "Etc/GMT-4": {
3359
+ u: 240
3360
+ },
3361
+ "Etc/GMT-5": {
3362
+ u: 300
3363
+ },
3364
+ "Etc/GMT-6": {
3365
+ u: 360
3366
+ },
3367
+ "Etc/GMT-7": {
3368
+ u: 420
3369
+ },
3370
+ "Etc/GMT-8": {
3371
+ u: 480
3372
+ },
3373
+ "Etc/GMT-9": {
3374
+ u: 540
3375
+ },
3376
+ "Etc/GMT0": {
3377
+ a: "Etc/GMT",
3378
+ r: 1
3379
+ },
3380
+ "Etc/Greenwich": {
3381
+ a: "Etc/GMT",
3382
+ r: 1
3383
+ },
3384
+ "Etc/UCT": {
3385
+ a: "Etc/UTC",
3386
+ r: 1
3387
+ },
3388
+ "Etc/UTC": {
3389
+ u: 0
3390
+ },
3391
+ "Etc/Universal": {
3392
+ a: "Etc/UTC",
3393
+ r: 1
3394
+ },
3395
+ "Etc/Zulu": {
3396
+ a: "Etc/UTC",
3397
+ r: 1
3398
+ },
3399
+ "Europe/Amsterdam": {
3400
+ u: 60,
3401
+ d: 120,
3402
+ c: ["NL"]
3403
+ },
3404
+ "Europe/Andorra": {
3405
+ u: 60,
3406
+ d: 120,
3407
+ c: ["AD"]
3408
+ },
3409
+ "Europe/Astrakhan": {
3410
+ u: 240,
3411
+ c: ["RU"]
3412
+ },
3413
+ "Europe/Athens": {
3414
+ u: 120,
3415
+ d: 180,
3416
+ c: ["GR"]
3417
+ },
3418
+ "Europe/Belfast": {
3419
+ a: "Europe/London",
3420
+ c: ["GB"],
3421
+ r: 1
3422
+ },
3423
+ "Europe/Belgrade": {
3424
+ u: 60,
3425
+ d: 120,
3426
+ c: ["RS", "BA", "HR", "ME", "MK", "SI"]
3427
+ },
3428
+ "Europe/Berlin": {
3429
+ u: 60,
3430
+ d: 120,
3431
+ c: ["DE"]
3432
+ },
3433
+ "Europe/Bratislava": {
3434
+ a: "Europe/Prague",
3435
+ c: ["SK"],
3436
+ r: 1
3437
+ },
3438
+ "Europe/Brussels": {
3439
+ u: 60,
3440
+ d: 120,
3441
+ c: ["BE"]
3442
+ },
3443
+ "Europe/Bucharest": {
3444
+ u: 120,
3445
+ d: 180,
3446
+ c: ["RO"]
3447
+ },
3448
+ "Europe/Budapest": {
3449
+ u: 60,
3450
+ d: 120,
3451
+ c: ["HU"]
3452
+ },
3453
+ "Europe/Busingen": {
3454
+ a: "Europe/Zurich",
3455
+ c: ["DE"],
3456
+ r: 1
3457
+ },
3458
+ "Europe/Chisinau": {
3459
+ u: 120,
3460
+ d: 180,
3461
+ c: ["MD"]
3462
+ },
3463
+ "Europe/Copenhagen": {
3464
+ u: 60,
3465
+ d: 120,
3466
+ c: ["DK"]
3467
+ },
3468
+ "Europe/Dublin": {
3469
+ u: 60,
3470
+ d: 0,
3471
+ c: ["IE"]
3472
+ },
3473
+ "Europe/Gibraltar": {
3474
+ u: 60,
3475
+ d: 120,
3476
+ c: ["GI"]
3477
+ },
3478
+ "Europe/Guernsey": {
3479
+ a: "Europe/London",
3480
+ c: ["GG"],
3481
+ r: 1
3482
+ },
3483
+ "Europe/Helsinki": {
3484
+ u: 120,
3485
+ d: 180,
3486
+ c: ["FI", "AX"]
3487
+ },
3488
+ "Europe/Isle_of_Man": {
3489
+ a: "Europe/London",
3490
+ c: ["IM"],
3491
+ r: 1
3492
+ },
3493
+ "Europe/Istanbul": {
3494
+ u: 180,
3495
+ c: ["TR"]
3496
+ },
3497
+ "Europe/Jersey": {
3498
+ a: "Europe/London",
3499
+ c: ["JE"],
3500
+ r: 1
3501
+ },
3502
+ "Europe/Kaliningrad": {
3503
+ u: 120,
3504
+ c: ["RU"]
3505
+ },
3506
+ "Europe/Kiev": {
3507
+ u: 120,
3508
+ d: 180,
3509
+ c: ["UA"]
3510
+ },
3511
+ "Europe/Kirov": {
3512
+ u: 180,
3513
+ c: ["RU"]
3514
+ },
3515
+ "Europe/Lisbon": {
3516
+ u: 0,
3517
+ d: 60,
3518
+ c: ["PT"]
3519
+ },
3520
+ "Europe/Ljubljana": {
3521
+ a: "Europe/Belgrade",
3522
+ c: ["SI"],
3523
+ r: 1
3524
+ },
3525
+ "Europe/London": {
3526
+ u: 0,
3527
+ d: 60,
3528
+ c: ["GB", "GG", "IM", "JE"]
3529
+ },
3530
+ "Europe/Luxembourg": {
3531
+ u: 60,
3532
+ d: 120,
3533
+ c: ["LU"]
3534
+ },
3535
+ "Europe/Madrid": {
3536
+ u: 60,
3537
+ d: 120,
3538
+ c: ["ES"]
3539
+ },
3540
+ "Europe/Malta": {
3541
+ u: 60,
3542
+ d: 120,
3543
+ c: ["MT"]
3544
+ },
3545
+ "Europe/Mariehamn": {
3546
+ a: "Europe/Helsinki",
3547
+ c: ["AX"],
3548
+ r: 1
3549
+ },
3550
+ "Europe/Minsk": {
3551
+ u: 180,
3552
+ c: ["BY"]
3553
+ },
3554
+ "Europe/Monaco": {
3555
+ u: 60,
3556
+ d: 120,
3557
+ c: ["MC"]
3558
+ },
3559
+ "Europe/Moscow": {
3560
+ u: 180,
3561
+ c: ["RU"]
3562
+ },
3563
+ "Europe/Nicosia": {
3564
+ a: "Asia/Nicosia",
3565
+ r: 1
3566
+ },
3567
+ "Europe/Oslo": {
3568
+ u: 60,
3569
+ d: 120,
3570
+ c: ["NO", "SJ", "BV"]
3571
+ },
3572
+ "Europe/Paris": {
3573
+ u: 60,
3574
+ d: 120,
3575
+ c: ["FR"]
3576
+ },
3577
+ "Europe/Podgorica": {
3578
+ a: "Europe/Belgrade",
3579
+ c: ["ME"],
3580
+ r: 1
3581
+ },
3582
+ "Europe/Prague": {
3583
+ u: 60,
3584
+ d: 120,
3585
+ c: ["CZ", "SK"]
3586
+ },
3587
+ "Europe/Riga": {
3588
+ u: 120,
3589
+ d: 180,
3590
+ c: ["LV"]
3591
+ },
3592
+ "Europe/Rome": {
3593
+ u: 60,
3594
+ d: 120,
3595
+ c: ["IT", "SM", "VA"]
3596
+ },
3597
+ "Europe/Samara": {
3598
+ u: 240,
3599
+ c: ["RU"]
3600
+ },
3601
+ "Europe/San_Marino": {
3602
+ a: "Europe/Rome",
3603
+ c: ["SM"],
3604
+ r: 1
3605
+ },
3606
+ "Europe/Sarajevo": {
3607
+ a: "Europe/Belgrade",
3608
+ c: ["BA"],
3609
+ r: 1
3610
+ },
3611
+ "Europe/Saratov": {
3612
+ u: 240,
3613
+ c: ["RU"]
3614
+ },
3615
+ "Europe/Simferopol": {
3616
+ u: 180,
3617
+ c: ["RU", "UA"]
3618
+ },
3619
+ "Europe/Skopje": {
3620
+ a: "Europe/Belgrade",
3621
+ c: ["MK"],
3622
+ r: 1
3623
+ },
3624
+ "Europe/Sofia": {
3625
+ u: 120,
3626
+ d: 180,
3627
+ c: ["BG"]
3628
+ },
3629
+ "Europe/Stockholm": {
3630
+ u: 60,
3631
+ d: 120,
3632
+ c: ["SE"]
3633
+ },
3634
+ "Europe/Tallinn": {
3635
+ u: 120,
3636
+ d: 180,
3637
+ c: ["EE"]
3638
+ },
3639
+ "Europe/Tirane": {
3640
+ u: 60,
3641
+ d: 120,
3642
+ c: ["AL"]
3643
+ },
3644
+ "Europe/Tiraspol": {
3645
+ a: "Europe/Chisinau",
3646
+ r: 1
3647
+ },
3648
+ "Europe/Ulyanovsk": {
3649
+ u: 240,
3650
+ c: ["RU"]
3651
+ },
3652
+ "Europe/Uzhgorod": {
3653
+ u: 120,
3654
+ d: 180,
3655
+ c: ["UA"]
3656
+ },
3657
+ "Europe/Vaduz": {
3658
+ a: "Europe/Zurich",
3659
+ c: ["LI"],
3660
+ r: 1
3661
+ },
3662
+ "Europe/Vatican": {
3663
+ a: "Europe/Rome",
3664
+ c: ["VA"],
3665
+ r: 1
3666
+ },
3667
+ "Europe/Vienna": {
3668
+ u: 60,
3669
+ d: 120,
3670
+ c: ["AT"]
3671
+ },
3672
+ "Europe/Vilnius": {
3673
+ u: 120,
3674
+ d: 180,
3675
+ c: ["LT"]
3676
+ },
3677
+ "Europe/Volgograd": {
3678
+ u: 180,
3679
+ c: ["RU"]
3680
+ },
3681
+ "Europe/Warsaw": {
3682
+ u: 60,
3683
+ d: 120,
3684
+ c: ["PL"]
3685
+ },
3686
+ "Europe/Zagreb": {
3687
+ a: "Europe/Belgrade",
3688
+ c: ["HR"],
3689
+ r: 1
3690
+ },
3691
+ "Europe/Zaporozhye": {
3692
+ u: 120,
3693
+ d: 180,
3694
+ c: ["UA"]
3695
+ },
3696
+ "Europe/Zurich": {
3697
+ u: 60,
3698
+ d: 120,
3699
+ c: ["CH", "DE", "LI"]
3700
+ },
3701
+ Factory: {
3702
+ u: 0
3703
+ },
3704
+ GB: {
3705
+ a: "Europe/London",
3706
+ c: ["GB"],
3707
+ r: 1
3708
+ },
3709
+ "GB-Eire": {
3710
+ a: "Europe/London",
3711
+ c: ["GB"],
3712
+ r: 1
3713
+ },
3714
+ GMT: {
3715
+ a: "Etc/GMT",
3716
+ r: 1
3717
+ },
3718
+ "GMT+0": {
3719
+ a: "Etc/GMT",
3720
+ r: 1
3721
+ },
3722
+ "GMT-0": {
3723
+ a: "Etc/GMT",
3724
+ r: 1
3725
+ },
3726
+ GMT0: {
3727
+ a: "Etc/GMT",
3728
+ r: 1
3729
+ },
3730
+ Greenwich: {
3731
+ a: "Etc/GMT",
3732
+ r: 1
3733
+ },
3734
+ HST: {
3735
+ u: -600
3736
+ },
3737
+ Hongkong: {
3738
+ a: "Asia/Hong_Kong",
3739
+ r: 1
3740
+ },
3741
+ Iceland: {
3742
+ a: "Atlantic/Reykjavik",
3743
+ r: 1
3744
+ },
3745
+ "Indian/Antananarivo": {
3746
+ a: "Africa/Nairobi",
3747
+ c: ["MG"],
3748
+ r: 1
3749
+ },
3750
+ "Indian/Chagos": {
3751
+ u: 360,
3752
+ c: ["IO"]
3753
+ },
3754
+ "Indian/Christmas": {
3755
+ u: 420,
3756
+ c: ["CX"]
3757
+ },
3758
+ "Indian/Cocos": {
3759
+ u: 390,
3760
+ c: ["CC"]
3761
+ },
3762
+ "Indian/Comoro": {
3763
+ a: "Africa/Nairobi",
3764
+ c: ["KM"],
3765
+ r: 1
3766
+ },
3767
+ "Indian/Kerguelen": {
3768
+ u: 300,
3769
+ c: ["TF", "HM"]
3770
+ },
3771
+ "Indian/Mahe": {
3772
+ u: 240,
3773
+ c: ["SC"]
3774
+ },
3775
+ "Indian/Maldives": {
3776
+ u: 300,
3777
+ c: ["MV"]
3778
+ },
3779
+ "Indian/Mauritius": {
3780
+ u: 240,
3781
+ c: ["MU"]
3782
+ },
3783
+ "Indian/Mayotte": {
3784
+ a: "Africa/Nairobi",
3785
+ c: ["YT"],
3786
+ r: 1
3787
+ },
3788
+ "Indian/Reunion": {
3789
+ u: 240,
3790
+ c: ["RE", "TF"]
3791
+ },
3792
+ Iran: {
3793
+ a: "Asia/Tehran",
3794
+ r: 1
3795
+ },
3796
+ Israel: {
3797
+ a: "Asia/Jerusalem",
3798
+ r: 1
3799
+ },
3800
+ Jamaica: {
3801
+ a: "America/Jamaica",
3802
+ r: 1
3803
+ },
3804
+ Japan: {
3805
+ a: "Asia/Tokyo",
3806
+ r: 1
3807
+ },
3808
+ Kwajalein: {
3809
+ a: "Pacific/Kwajalein",
3810
+ r: 1
3811
+ },
3812
+ Libya: {
3813
+ a: "Africa/Tripoli",
3814
+ r: 1
3815
+ },
3816
+ MET: {
3817
+ u: 60,
3818
+ d: 120
3819
+ },
3820
+ MST: {
3821
+ u: -420
3822
+ },
3823
+ MST7MDT: {
3824
+ u: -420,
3825
+ d: -360
3826
+ },
3827
+ "Mexico/BajaNorte": {
3828
+ a: "America/Tijuana",
3829
+ r: 1
3830
+ },
3831
+ "Mexico/BajaSur": {
3832
+ a: "America/Mazatlan",
3833
+ r: 1
3834
+ },
3835
+ "Mexico/General": {
3836
+ a: "America/Mexico_City",
3837
+ r: 1
3838
+ },
3839
+ NZ: {
3840
+ a: "Pacific/Auckland",
3841
+ c: ["NZ"],
3842
+ r: 1
3843
+ },
3844
+ "NZ-CHAT": {
3845
+ a: "Pacific/Chatham",
3846
+ r: 1
3847
+ },
3848
+ Navajo: {
3849
+ a: "America/Denver",
3850
+ r: 1
3851
+ },
3852
+ PRC: {
3853
+ a: "Asia/Shanghai",
3854
+ r: 1
3855
+ },
3856
+ PST8PDT: {
3857
+ u: -480,
3858
+ d: -420
3859
+ },
3860
+ "Pacific/Apia": {
3861
+ u: 780,
3862
+ c: ["WS"]
3863
+ },
3864
+ "Pacific/Auckland": {
3865
+ u: 720,
3866
+ d: 780,
3867
+ c: ["NZ", "AQ"]
3868
+ },
3869
+ "Pacific/Bougainville": {
3870
+ u: 660,
3871
+ c: ["PG"]
3872
+ },
3873
+ "Pacific/Chatham": {
3874
+ u: 765,
3875
+ d: 825,
3876
+ c: ["NZ"]
3877
+ },
3878
+ "Pacific/Chuuk": {
3879
+ u: 600,
3880
+ c: ["FM"]
3881
+ },
3882
+ "Pacific/Easter": {
3883
+ u: -360,
3884
+ d: -300,
3885
+ c: ["CL"]
3886
+ },
3887
+ "Pacific/Efate": {
3888
+ u: 660,
3889
+ c: ["VU"]
3890
+ },
3891
+ "Pacific/Enderbury": {
3892
+ a: "Pacific/Kanton",
3893
+ r: 1
3894
+ },
3895
+ "Pacific/Fakaofo": {
3896
+ u: 780,
3897
+ c: ["TK"]
3898
+ },
3899
+ "Pacific/Fiji": {
3900
+ u: 720,
3901
+ d: 780,
3902
+ c: ["FJ"]
3903
+ },
3904
+ "Pacific/Funafuti": {
3905
+ u: 720,
3906
+ c: ["TV"]
3907
+ },
3908
+ "Pacific/Galapagos": {
3909
+ u: -360,
3910
+ c: ["EC"]
3911
+ },
3912
+ "Pacific/Gambier": {
3913
+ u: -540,
3914
+ c: ["PF"]
3915
+ },
3916
+ "Pacific/Guadalcanal": {
3917
+ u: 660,
3918
+ c: ["SB"]
3919
+ },
3920
+ "Pacific/Guam": {
3921
+ u: 600,
3922
+ c: ["GU", "MP"]
3923
+ },
3924
+ "Pacific/Honolulu": {
3925
+ u: -600,
3926
+ c: ["US", "UM"]
3927
+ },
3928
+ "Pacific/Johnston": {
3929
+ a: "Pacific/Honolulu",
3930
+ c: ["UM"],
3931
+ r: 1
3932
+ },
3933
+ "Pacific/Kanton": {
3934
+ u: 780,
3935
+ c: ["KI"]
3936
+ },
3937
+ "Pacific/Kiritimati": {
3938
+ u: 840,
3939
+ c: ["KI"]
3940
+ },
3941
+ "Pacific/Kosrae": {
3942
+ u: 660,
3943
+ c: ["FM"]
3944
+ },
3945
+ "Pacific/Kwajalein": {
3946
+ u: 720,
3947
+ c: ["MH"]
3948
+ },
3949
+ "Pacific/Majuro": {
3950
+ u: 720,
3951
+ c: ["MH"]
3952
+ },
3953
+ "Pacific/Marquesas": {
3954
+ u: -510,
3955
+ c: ["PF"]
3956
+ },
3957
+ "Pacific/Midway": {
3958
+ a: "Pacific/Pago_Pago",
3959
+ c: ["UM"],
3960
+ r: 1
3961
+ },
3962
+ "Pacific/Nauru": {
3963
+ u: 720,
3964
+ c: ["NR"]
3965
+ },
3966
+ "Pacific/Niue": {
3967
+ u: -660,
3968
+ c: ["NU"]
3969
+ },
3970
+ "Pacific/Norfolk": {
3971
+ u: 660,
3972
+ d: 720,
3973
+ c: ["NF"]
3974
+ },
3975
+ "Pacific/Noumea": {
3976
+ u: 660,
3977
+ c: ["NC"]
3978
+ },
3979
+ "Pacific/Pago_Pago": {
3980
+ u: -660,
3981
+ c: ["AS", "UM"]
3982
+ },
3983
+ "Pacific/Palau": {
3984
+ u: 540,
3985
+ c: ["PW"]
3986
+ },
3987
+ "Pacific/Pitcairn": {
3988
+ u: -480,
3989
+ c: ["PN"]
3990
+ },
3991
+ "Pacific/Pohnpei": {
3992
+ u: 660,
3993
+ c: ["FM"]
3994
+ },
3995
+ "Pacific/Ponape": {
3996
+ a: "Pacific/Pohnpei",
3997
+ r: 1
3998
+ },
3999
+ "Pacific/Port_Moresby": {
4000
+ u: 600,
4001
+ c: ["PG", "AQ"]
4002
+ },
4003
+ "Pacific/Rarotonga": {
4004
+ u: -600,
4005
+ c: ["CK"]
4006
+ },
4007
+ "Pacific/Saipan": {
4008
+ a: "Pacific/Guam",
4009
+ c: ["MP"],
4010
+ r: 1
4011
+ },
4012
+ "Pacific/Samoa": {
4013
+ a: "Pacific/Pago_Pago",
4014
+ c: ["WS"],
4015
+ r: 1
4016
+ },
4017
+ "Pacific/Tahiti": {
4018
+ u: -600,
4019
+ c: ["PF"]
4020
+ },
4021
+ "Pacific/Tarawa": {
4022
+ u: 720,
4023
+ c: ["KI"]
4024
+ },
4025
+ "Pacific/Tongatapu": {
4026
+ u: 780,
4027
+ c: ["TO"]
4028
+ },
4029
+ "Pacific/Truk": {
4030
+ a: "Pacific/Chuuk",
4031
+ r: 1
4032
+ },
4033
+ "Pacific/Wake": {
4034
+ u: 720,
4035
+ c: ["UM"]
4036
+ },
4037
+ "Pacific/Wallis": {
4038
+ u: 720,
4039
+ c: ["WF"]
4040
+ },
4041
+ "Pacific/Yap": {
4042
+ a: "Pacific/Chuuk",
4043
+ r: 1
4044
+ },
4045
+ Poland: {
4046
+ a: "Europe/Warsaw",
4047
+ r: 1
4048
+ },
4049
+ Portugal: {
4050
+ a: "Europe/Lisbon",
4051
+ r: 1
4052
+ },
4053
+ ROC: {
4054
+ a: "Asia/Taipei",
4055
+ r: 1
4056
+ },
4057
+ ROK: {
4058
+ a: "Asia/Seoul",
4059
+ r: 1
4060
+ },
4061
+ Singapore: {
4062
+ a: "Asia/Singapore",
4063
+ c: ["SG"],
4064
+ r: 1
4065
+ },
4066
+ Turkey: {
4067
+ a: "Europe/Istanbul",
4068
+ r: 1
4069
+ },
4070
+ UCT: {
4071
+ a: "Etc/UTC",
4072
+ r: 1
4073
+ },
4074
+ "US/Alaska": {
4075
+ a: "America/Anchorage",
4076
+ r: 1
4077
+ },
4078
+ "US/Aleutian": {
4079
+ a: "America/Adak",
4080
+ r: 1
4081
+ },
4082
+ "US/Arizona": {
4083
+ a: "America/Phoenix",
4084
+ c: ["US"],
4085
+ r: 1
4086
+ },
4087
+ "US/Central": {
4088
+ a: "America/Chicago",
4089
+ r: 1
4090
+ },
4091
+ "US/East-Indiana": {
4092
+ a: "America/Indiana/Indianapolis",
4093
+ r: 1
4094
+ },
4095
+ "US/Eastern": {
4096
+ a: "America/New_York",
4097
+ r: 1
4098
+ },
4099
+ "US/Hawaii": {
4100
+ a: "Pacific/Honolulu",
4101
+ c: ["US"],
4102
+ r: 1
4103
+ },
4104
+ "US/Indiana-Starke": {
4105
+ a: "America/Indiana/Knox",
4106
+ r: 1
4107
+ },
4108
+ "US/Michigan": {
4109
+ a: "America/Detroit",
4110
+ r: 1
4111
+ },
4112
+ "US/Mountain": {
4113
+ a: "America/Denver",
4114
+ r: 1
4115
+ },
4116
+ "US/Pacific": {
4117
+ a: "America/Los_Angeles",
4118
+ r: 1
4119
+ },
4120
+ "US/Samoa": {
4121
+ a: "Pacific/Pago_Pago",
4122
+ c: ["WS"],
4123
+ r: 1
4124
+ },
4125
+ UTC: {
4126
+ a: "Etc/UTC",
4127
+ r: 1
4128
+ },
4129
+ Universal: {
4130
+ a: "Etc/UTC",
4131
+ r: 1
4132
+ },
4133
+ "W-SU": {
4134
+ a: "Europe/Moscow",
4135
+ r: 1
4136
+ },
4137
+ WET: {
4138
+ u: 0,
4139
+ d: 60
4140
+ },
4141
+ Zulu: {
4142
+ a: "Etc/UTC",
4143
+ r: 1
4144
+ }
4145
+ };
4146
+ function getCountry() {
4147
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
4148
+ if (timezone === "" || !timezone) {
4149
+ return null;
4150
+ }
4151
+ try {
4152
+ const _country = timezones[timezone]?.c?.[0];
4153
+ if (!_country)
4154
+ return null;
4155
+ const country = countries[_country];
4156
+ return country || null;
4157
+ } catch {
4158
+ return null;
4159
+ }
4160
+ }
4161
+ function getCountryCodeFromTimezone() {
4162
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
4163
+ if (timezone === "" || !timezone) {
4164
+ return "Unknown";
4165
+ }
4166
+ try {
4167
+ const countryCode = timezones[timezone]?.c?.[0];
4168
+ return countryCode || "Unknown";
4169
+ } catch {
4170
+ return "Unknown";
4171
+ }
4172
+ }
4173
+ function getState() {
4174
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
4175
+ if (timezone === "" || !timezone) {
4176
+ return null;
4177
+ }
4178
+ const state = timezone.split("/")[1]?.replace("_", " ");
4179
+ return state || null;
4180
+ }
4181
+
668
4182
  // src/page-tracking.ts
669
4183
  var PageTrackingManager = class {
670
4184
  constructor(tracker, config) {
@@ -795,7 +4309,9 @@ var Grain = (() => {
795
4309
  properties.browser = this.getBrowser();
796
4310
  properties.os = this.getOS();
797
4311
  properties.language = navigator.language || "";
798
- properties.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
4312
+ const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
4313
+ properties.timezone = timezone;
4314
+ properties.country = getCountryCodeFromTimezone();
799
4315
  properties.screen_resolution = `${screen.width}x${screen.height}`;
800
4316
  properties.viewport = `${window.innerWidth}x${window.innerHeight}`;
801
4317
  }
@@ -981,6 +4497,9 @@ var Grain = (() => {
981
4497
  this.pageTrackingManager = null;
982
4498
  this.ephemeralSessionId = null;
983
4499
  this.eventCountSinceLastHeartbeat = 0;
4500
+ // Auto-tracking properties
4501
+ this.interactionTrackingManager = null;
4502
+ this.sectionTrackingManager = null;
984
4503
  // Session tracking
985
4504
  this.sessionStartTime = Date.now();
986
4505
  this.sessionEventCount = 0;
@@ -1499,6 +5018,86 @@ var Grain = (() => {
1499
5018
  this.log("Failed to initialize page view tracking:", error);
1500
5019
  }
1501
5020
  }
5021
+ this.initializeAutoTracking();
5022
+ }
5023
+ /**
5024
+ * Initialize auto-tracking (interactions and sections)
5025
+ */
5026
+ async initializeAutoTracking() {
5027
+ try {
5028
+ const userId = this.globalUserId || this.persistentAnonymousUserId || this.generateUUID();
5029
+ const currentUrl = typeof window !== "undefined" ? window.location.href : "";
5030
+ const request = {
5031
+ userId,
5032
+ immediateKeys: [],
5033
+ properties: {},
5034
+ currentUrl
5035
+ // Add current URL to request
5036
+ };
5037
+ const headers = await this.getAuthHeaders();
5038
+ const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/config/configurations`;
5039
+ const response = await fetch(url, {
5040
+ method: "POST",
5041
+ headers,
5042
+ body: JSON.stringify(request)
5043
+ });
5044
+ if (response.ok) {
5045
+ const configResponse = await response.json();
5046
+ if (configResponse.autoTrackingConfig) {
5047
+ this.setupAutoTrackingManagers(configResponse.autoTrackingConfig);
5048
+ }
5049
+ }
5050
+ } catch (error) {
5051
+ this.log("Failed to initialize auto-tracking:", error);
5052
+ }
5053
+ }
5054
+ /**
5055
+ * Setup auto-tracking managers
5056
+ */
5057
+ setupAutoTrackingManagers(config) {
5058
+ Promise.resolve().then(() => (init_interaction_tracking(), interaction_tracking_exports)).then(({ InteractionTrackingManager: InteractionTrackingManager2 }) => {
5059
+ try {
5060
+ if (config.interactions && config.interactions.length > 0) {
5061
+ this.interactionTrackingManager = new InteractionTrackingManager2(
5062
+ this,
5063
+ config.interactions,
5064
+ {
5065
+ debug: this.config.debug,
5066
+ enableMutationObserver: true,
5067
+ mutationDebounceDelay: 500
5068
+ }
5069
+ );
5070
+ this.log("Interaction tracking initialized with", config.interactions.length, "interactions");
5071
+ }
5072
+ } catch (error) {
5073
+ this.log("Failed to initialize interaction tracking:", error);
5074
+ }
5075
+ }).catch((error) => {
5076
+ this.log("Failed to load interaction tracking module:", error);
5077
+ });
5078
+ Promise.resolve().then(() => (init_section_tracking(), section_tracking_exports)).then(({ SectionTrackingManager: SectionTrackingManager2 }) => {
5079
+ try {
5080
+ if (config.sections && config.sections.length > 0) {
5081
+ this.sectionTrackingManager = new SectionTrackingManager2(
5082
+ this,
5083
+ config.sections,
5084
+ {
5085
+ minDwellTime: 1e3,
5086
+ scrollVelocityThreshold: 500,
5087
+ intersectionThreshold: 0.1,
5088
+ debounceDelay: 100,
5089
+ batchDelay: 2e3,
5090
+ debug: this.config.debug
5091
+ }
5092
+ );
5093
+ this.log("Section tracking initialized with", config.sections.length, "sections");
5094
+ }
5095
+ } catch (error) {
5096
+ this.log("Failed to initialize section tracking:", error);
5097
+ }
5098
+ }).catch((error) => {
5099
+ this.log("Failed to load section tracking module:", error);
5100
+ });
1502
5101
  }
1503
5102
  /**
1504
5103
  * Track session start event
@@ -2458,6 +6057,14 @@ var Grain = (() => {
2458
6057
  this.activityDetector.destroy();
2459
6058
  this.activityDetector = null;
2460
6059
  }
6060
+ if (this.interactionTrackingManager) {
6061
+ this.interactionTrackingManager.destroy();
6062
+ this.interactionTrackingManager = null;
6063
+ }
6064
+ if (this.sectionTrackingManager) {
6065
+ this.sectionTrackingManager.destroy();
6066
+ this.sectionTrackingManager = null;
6067
+ }
2461
6068
  if (this.eventQueue.length > 0) {
2462
6069
  const eventsToSend = [...this.eventQueue];
2463
6070
  this.eventQueue = [];