@bicharts/chart-host 0.5.118 → 0.5.120

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.
@@ -22,8 +22,8 @@ var require_papaparse_min = __commonJS({
22
22
  "function" == typeof define && define.amd ? define([], t) : "object" == typeof module && "undefined" != typeof exports ? module.exports = t() : e.Papa = t();
23
23
  })(exports, function r() {
24
24
  var n = "undefined" != typeof self ? self : "undefined" != typeof window ? window : void 0 !== n ? n : {};
25
- var d2, s = !n.document && !!n.postMessage, a4 = n.IS_PAPA_WORKER || false, o = {}, h4 = 0, v3 = {};
26
- function P4(e) {
25
+ var d2, s = !n.document && !!n.postMessage, a4 = n.IS_PAPA_WORKER || false, o = {}, h3 = 0, v2 = {};
26
+ function P2(e) {
27
27
  return 65279 === e.charCodeAt(0) ? e.slice(1) : e;
28
28
  }
29
29
  function u2(e) {
@@ -41,7 +41,7 @@ var require_papaparse_min = __commonJS({
41
41
  var i2 = this._partialLine + t, r2 = (this._partialLine = "", this._handle.parse(i2, this._baseIndex, !this._finished));
42
42
  if (!this._handle.paused() && !this._handle.aborted()) {
43
43
  t = r2.meta.cursor, i2 = (this._finished || (this._partialLine = i2.substring(t - this._baseIndex), this._baseIndex = t), r2 && r2.data && (this._rowCount += r2.data.length), this._finished || this._config.preview && this._rowCount >= this._config.preview);
44
- if (a4) n.postMessage({ results: r2, workerId: v3.WORKER_ID, finished: i2 });
44
+ if (a4) n.postMessage({ results: r2, workerId: v2.WORKER_ID, finished: i2 });
45
45
  else if (q4(this._config.chunk) && !e2) {
46
46
  if (this._config.chunk(r2, this._handle), this._handle.paused() || this._handle.aborted()) return void (this._halted = true);
47
47
  this._completeResults = r2 = void 0;
@@ -50,12 +50,12 @@ var require_papaparse_min = __commonJS({
50
50
  }
51
51
  this._halted = true;
52
52
  }, this._sendError = function(e2) {
53
- q4(this._config.error) ? this._config.error(e2) : a4 && this._config.error && n.postMessage({ workerId: v3.WORKER_ID, error: e2, finished: false });
53
+ q4(this._config.error) ? this._config.error(e2) : a4 && this._config.error && n.postMessage({ workerId: v2.WORKER_ID, error: e2, finished: false });
54
54
  };
55
55
  }
56
56
  function f4(e) {
57
57
  var r2;
58
- (e = e || {}).chunkSize || (e.chunkSize = v3.RemoteChunkSize), u2.call(this, e), this._nextChunk = s ? function() {
58
+ (e = e || {}).chunkSize || (e.chunkSize = v2.RemoteChunkSize), u2.call(this, e), this._nextChunk = s ? function() {
59
59
  this._readChunk(), this._chunkLoaded();
60
60
  } : function() {
61
61
  this._readChunk();
@@ -85,7 +85,7 @@ var require_papaparse_min = __commonJS({
85
85
  };
86
86
  }
87
87
  function l(e) {
88
- (e = e || {}).chunkSize || (e.chunkSize = v3.LocalChunkSize), u2.call(this, e);
88
+ (e = e || {}).chunkSize || (e.chunkSize = v2.LocalChunkSize), u2.call(this, e);
89
89
  var i2, r2, n2 = "undefined" != typeof FileReader;
90
90
  this.stream = function(e2) {
91
91
  this._input = e2, r2 = e2.slice || e2.webkitSlice || e2.mozSlice, n2 ? ((i2 = new FileReader()).onload = y5(this._chunkLoaded, this), i2.onerror = y5(this._chunkError, this)) : i2 = new FileReaderSync(), this._nextChunk();
@@ -137,20 +137,20 @@ var require_papaparse_min = __commonJS({
137
137
  }, this);
138
138
  }
139
139
  function i(m4) {
140
- var n2, s2, a5, t, o2 = Math.pow(2, 53), h5 = -o2, u4 = /^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/, d3 = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/, i2 = this, r2 = 0, f5 = 0, l2 = false, e = false, c4 = [], p4 = { data: [], errors: [], meta: {} };
140
+ var n2, s2, a5, t, o2 = Math.pow(2, 53), h4 = -o2, u4 = /^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/, d3 = /^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/, i2 = this, r2 = 0, f5 = 0, l2 = false, e = false, c4 = [], p4 = { data: [], errors: [], meta: {} };
141
141
  function y6(e2) {
142
142
  return "greedy" === m4.skipEmptyLines ? "" === e2.join("").trim() : 1 === e2.length && 0 === e2[0].length;
143
143
  }
144
144
  function g4() {
145
- if (p4 && a5 && (k2("Delimiter", "UndetectableDelimiter", "Unable to auto-detect delimiting character; defaulted to '" + v3.DefaultDelimiter + "'"), a5 = false), m4.skipEmptyLines && (p4.data = p4.data.filter(function(e4) {
145
+ if (p4 && a5 && (k3("Delimiter", "UndetectableDelimiter", "Unable to auto-detect delimiting character; defaulted to '" + v2.DefaultDelimiter + "'"), a5 = false), m4.skipEmptyLines && (p4.data = p4.data.filter(function(e4) {
146
146
  return !y6(e4);
147
- })), _3()) {
147
+ })), _4()) {
148
148
  let t4 = function(e4, t5) {
149
- e4 = P4(e4), q4(m4.transformHeader) && (e4 = m4.transformHeader(e4, t5)), c4.push(e4);
149
+ e4 = P2(e4), q4(m4.transformHeader) && (e4 = m4.transformHeader(e4, t5)), c4.push(e4);
150
150
  };
151
151
  var t2 = t4;
152
152
  if (p4) if (Array.isArray(p4.data[0])) {
153
- for (var e2 = 0; _3() && e2 < p4.data.length; e2++) p4.data[e2].forEach(t4);
153
+ for (var e2 = 0; _4() && e2 < p4.data.length; e2++) p4.data[e2].forEach(t4);
154
154
  p4.data.splice(0, 1);
155
155
  } else p4.data.forEach(t4);
156
156
  }
@@ -159,35 +159,35 @@ var require_papaparse_min = __commonJS({
159
159
  var n4 = r5, s4 = e4[r5], s4 = ((e5, t5) => ((e6) => (m4.dynamicTypingFunction && void 0 === m4.dynamicTyping[e6] && (m4.dynamicTyping[e6] = m4.dynamicTypingFunction(e6)), true === (m4.dynamicTyping[e6] || m4.dynamicTyping)))(e5) ? "true" === t5 || "TRUE" === t5 || "false" !== t5 && "FALSE" !== t5 && (((e6) => {
160
160
  if (u4.test(e6)) {
161
161
  e6 = parseFloat(e6);
162
- if (h5 < e6 && e6 < o2) return 1;
162
+ if (h4 < e6 && e6 < o2) return 1;
163
163
  }
164
164
  })(t5) ? parseFloat(t5) : d3.test(t5) ? new Date(t5) : "" === t5 ? null : t5) : t5)(n4 = m4.header ? r5 >= c4.length ? "__parsed_extra" : c4[r5] : n4, s4 = m4.transform ? m4.transform(s4, n4) : s4);
165
165
  "__parsed_extra" === n4 ? (i5[n4] = i5[n4] || [], i5[n4].push(s4)) : i5[n4] = s4;
166
166
  }
167
- return m4.header && (r5 > c4.length ? k2("FieldMismatch", "TooManyFields", "Too many fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4) : r5 < c4.length && k2("FieldMismatch", "TooFewFields", "Too few fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4)), i5;
167
+ return m4.header && (r5 > c4.length ? k3("FieldMismatch", "TooManyFields", "Too many fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4) : r5 < c4.length && k3("FieldMismatch", "TooFewFields", "Too few fields: expected " + c4.length + " fields but parsed " + r5, f5 + t4)), i5;
168
168
  }
169
169
  var r4;
170
170
  p4 && (m4.header || m4.dynamicTyping || m4.transform) && (r4 = 1, !p4.data.length || Array.isArray(p4.data[0]) ? (p4.data = p4.data.map(i4), r4 = p4.data.length) : p4.data = i4(p4.data, 0), m4.header && p4.meta && (p4.meta.fields = c4), f5 += r4);
171
171
  }
172
- function _3() {
172
+ function _4() {
173
173
  return m4.header && 0 === c4.length;
174
174
  }
175
- function k2(e2, t2, i4, r4) {
175
+ function k3(e2, t2, i4, r4) {
176
176
  e2 = { type: e2, code: t2, message: i4 };
177
177
  void 0 !== r4 && (e2.row = r4), p4.errors.push(e2);
178
178
  }
179
179
  q4(m4.step) && (t = m4.step, m4.step = function(e2) {
180
- p4 = e2, _3() ? g4() : (g4(), 0 !== p4.data.length && (r2 += e2.data.length, m4.preview && r2 > m4.preview ? s2.abort() : (p4.data = p4.data[0], t(p4, i2))));
180
+ p4 = e2, _4() ? g4() : (g4(), 0 !== p4.data.length && (r2 += e2.data.length, m4.preview && r2 > m4.preview ? s2.abort() : (p4.data = p4.data[0], t(p4, i2))));
181
181
  }), this.parse = function(e2, t2, i4) {
182
182
  var r4 = m4.quoteChar || '"', r4 = (m4.newline || (m4.newline = this.guessLineEndings(e2, r4)), a5 = false, m4.delimiter ? q4(m4.delimiter) && (m4.delimiter = m4.delimiter(e2), p4.meta.delimiter = m4.delimiter) : ((r4 = ((e4, t4, i5, r5, n4) => {
183
- var s4, a6, o4, h6;
184
- n4 = n4 || [",", " ", "|", ";", v3.RECORD_SEP, v3.UNIT_SEP];
183
+ var s4, a6, o4, h5;
184
+ n4 = n4 || [",", " ", "|", ";", v2.RECORD_SEP, v2.UNIT_SEP];
185
185
  for (var u5 = 0; u5 < n4.length; u5++) {
186
- for (var d4, f6 = n4[u5], l3 = 0, c5 = 0, p5 = 0, g5 = (o4 = void 0, new E4({ comments: r5, delimiter: f6, newline: t4, preview: 10 }).parse(e4)), _4 = 0; _4 < g5.data.length; _4++) i5 && y6(g5.data[_4]) ? p5++ : (d4 = g5.data[_4].length, c5 += d4, void 0 === o4 ? o4 = d4 : 0 < d4 && (l3 += Math.abs(d4 - o4), o4 = d4));
187
- 0 < g5.data.length && (c5 /= g5.data.length - p5), (void 0 === a6 || l3 <= a6) && (void 0 === h6 || h6 < c5) && 1.99 < c5 && (a6 = l3, s4 = f6, h6 = c5);
186
+ for (var d4, f6 = n4[u5], l3 = 0, c5 = 0, p5 = 0, g5 = (o4 = void 0, new E4({ comments: r5, delimiter: f6, newline: t4, preview: 10 }).parse(e4)), _5 = 0; _5 < g5.data.length; _5++) i5 && y6(g5.data[_5]) ? p5++ : (d4 = g5.data[_5].length, c5 += d4, void 0 === o4 ? o4 = d4 : 0 < d4 && (l3 += Math.abs(d4 - o4), o4 = d4));
187
+ 0 < g5.data.length && (c5 /= g5.data.length - p5), (void 0 === a6 || l3 <= a6) && (void 0 === h5 || h5 < c5) && 1.99 < c5 && (a6 = l3, s4 = f6, h5 = c5);
188
188
  }
189
189
  return { successful: !!(m4.delimiter = s4), bestDelimiter: s4 };
190
- })(e2, m4.newline, m4.skipEmptyLines, m4.comments, m4.delimitersToGuess)).successful ? m4.delimiter = r4.bestDelimiter : (a5 = true, m4.delimiter = v3.DefaultDelimiter), p4.meta.delimiter = m4.delimiter), b4(m4));
190
+ })(e2, m4.newline, m4.skipEmptyLines, m4.comments, m4.delimitersToGuess)).successful ? m4.delimiter = r4.bestDelimiter : (a5 = true, m4.delimiter = v2.DefaultDelimiter), p4.meta.delimiter = m4.delimiter), b4(m4));
191
191
  return m4.preview && m4.header && r4.preview++, n2 = e2, s2 = new E4(r4), p4 = s2.parse(n2, t2, i4), g4(), l2 ? { meta: { paused: true } } : p4 || { meta: { paused: false } };
192
192
  }, this.paused = function() {
193
193
  return l2;
@@ -211,89 +211,89 @@ var require_papaparse_min = __commonJS({
211
211
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
212
212
  }
213
213
  function E4(C) {
214
- var S = (C = C || {}).delimiter, O2 = C.newline, x3 = C.comments, I2 = C.step, A = C.preview, T3 = C.fastMode, D4 = null, L2 = false, F4 = null == C.quoteChar ? '"' : C.quoteChar, j2 = F4;
215
- if (void 0 !== C.escapeChar && (j2 = C.escapeChar), ("string" != typeof S || -1 < v3.BAD_DELIMITERS.indexOf(S)) && (S = ","), x3 === S) throw new Error("Comment character same as delimiter");
216
- true === x3 ? x3 = "#" : ("string" != typeof x3 || -1 < v3.BAD_DELIMITERS.indexOf(x3)) && (x3 = false), "\n" !== O2 && "\r" !== O2 && "\r\n" !== O2 && (O2 = "\n");
214
+ var S = (C = C || {}).delimiter, O3 = C.newline, x4 = C.comments, I2 = C.step, A2 = C.preview, T3 = C.fastMode, D3 = null, L2 = false, F3 = null == C.quoteChar ? '"' : C.quoteChar, j3 = F3;
215
+ if (void 0 !== C.escapeChar && (j3 = C.escapeChar), ("string" != typeof S || -1 < v2.BAD_DELIMITERS.indexOf(S)) && (S = ","), x4 === S) throw new Error("Comment character same as delimiter");
216
+ true === x4 ? x4 = "#" : ("string" != typeof x4 || -1 < v2.BAD_DELIMITERS.indexOf(x4)) && (x4 = false), "\n" !== O3 && "\r" !== O3 && "\r\n" !== O3 && (O3 = "\n");
217
217
  var z3 = 0, M2 = false;
218
218
  this.parse = function(i2, t, r2) {
219
219
  if ("string" != typeof i2) throw new Error("Input must be a string");
220
- var n2 = i2.length, e = S.length, s2 = O2.length, a5 = x3.length, o2 = q4(I2), h5 = [], u4 = [], d3 = [], f5 = z3 = 0;
220
+ var n2 = i2.length, e = S.length, s2 = O3.length, a5 = x4.length, o2 = q4(I2), h4 = [], u4 = [], d3 = [], f5 = z3 = 0;
221
221
  if (!i2) return w2();
222
- if (T3 || false !== T3 && -1 === i2.indexOf(F4)) {
223
- for (var l2 = i2.split(O2), c4 = 0; c4 < l2.length; c4++) {
224
- if (d3 = l2[c4], z3 += d3.length, c4 !== l2.length - 1) z3 += O2.length;
222
+ if (T3 || false !== T3 && -1 === i2.indexOf(F3)) {
223
+ for (var l2 = i2.split(O3), c4 = 0; c4 < l2.length; c4++) {
224
+ if (d3 = l2[c4], z3 += d3.length, c4 !== l2.length - 1) z3 += O3.length;
225
225
  else if (r2) return w2();
226
- if (!x3 || d3.substring(0, a5) !== x3) {
226
+ if (!x4 || d3.substring(0, a5) !== x4) {
227
227
  if (o2) {
228
- if (h5 = [], k2(d3.split(S)), R2(), M2) return w2();
229
- } else k2(d3.split(S));
230
- if (A && A <= c4) return h5 = h5.slice(0, A), w2(true);
228
+ if (h4 = [], k3(d3.split(S)), R2(), M2) return w2();
229
+ } else k3(d3.split(S));
230
+ if (A2 && A2 <= c4) return h4 = h4.slice(0, A2), w2(true);
231
231
  }
232
232
  }
233
233
  return w2();
234
234
  }
235
- for (var p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O2, z3), _3 = new RegExp(U2(j2) + U2(F4), "g"), m4 = i2.indexOf(F4, z3); ; ) if (i2[z3] === F4) for (m4 = z3, z3++; ; ) {
236
- if (-1 === (m4 = i2.indexOf(F4, m4 + 1))) return r2 || u4.push({ type: "Quotes", code: "MissingQuotes", message: "Quoted field unterminated", row: h5.length, index: z3 }), E5();
237
- if (m4 === n2 - 1) return E5(i2.substring(z3, m4).replace(_3, F4));
238
- if (F4 === j2 && i2[m4 + 1] === j2) m4++;
239
- else if (F4 === j2 || 0 === m4 || i2[m4 - 1] !== j2) {
235
+ for (var p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O3, z3), _4 = new RegExp(U2(j3) + U2(F3), "g"), m4 = i2.indexOf(F3, z3); ; ) if (i2[z3] === F3) for (m4 = z3, z3++; ; ) {
236
+ if (-1 === (m4 = i2.indexOf(F3, m4 + 1))) return r2 || u4.push({ type: "Quotes", code: "MissingQuotes", message: "Quoted field unterminated", row: h4.length, index: z3 }), E5();
237
+ if (m4 === n2 - 1) return E5(i2.substring(z3, m4).replace(_4, F3));
238
+ if (F3 === j3 && i2[m4 + 1] === j3) m4++;
239
+ else if (F3 === j3 || 0 === m4 || i2[m4 - 1] !== j3) {
240
240
  -1 !== p4 && p4 < m4 + 1 && (p4 = i2.indexOf(S, m4 + 1));
241
- var y6 = v4(-1 === (g4 = -1 !== g4 && g4 < m4 + 1 ? i2.indexOf(O2, m4 + 1) : g4) ? p4 : Math.min(p4, g4));
241
+ var y6 = v3(-1 === (g4 = -1 !== g4 && g4 < m4 + 1 ? i2.indexOf(O3, m4 + 1) : g4) ? p4 : Math.min(p4, g4));
242
242
  if (i2.substr(m4 + 1 + y6, e) === S) {
243
- d3.push(i2.substring(z3, m4).replace(_3, F4)), i2[z3 = m4 + 1 + y6 + e] !== F4 && (m4 = i2.indexOf(F4, z3)), p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O2, z3);
243
+ d3.push(i2.substring(z3, m4).replace(_4, F3)), i2[z3 = m4 + 1 + y6 + e] !== F3 && (m4 = i2.indexOf(F3, z3)), p4 = i2.indexOf(S, z3), g4 = i2.indexOf(O3, z3);
244
244
  break;
245
245
  }
246
- y6 = v4(g4);
247
- if (i2.substring(m4 + 1 + y6, m4 + 1 + y6 + s2) === O2) {
248
- if (d3.push(i2.substring(z3, m4).replace(_3, F4)), b5(m4 + 1 + y6 + s2), p4 = i2.indexOf(S, z3), m4 = i2.indexOf(F4, z3), o2 && (R2(), M2)) return w2();
249
- if (A && h5.length >= A) return w2(true);
246
+ y6 = v3(g4);
247
+ if (i2.substring(m4 + 1 + y6, m4 + 1 + y6 + s2) === O3) {
248
+ if (d3.push(i2.substring(z3, m4).replace(_4, F3)), b5(m4 + 1 + y6 + s2), p4 = i2.indexOf(S, z3), m4 = i2.indexOf(F3, z3), o2 && (R2(), M2)) return w2();
249
+ if (A2 && h4.length >= A2) return w2(true);
250
250
  break;
251
251
  }
252
- u4.push({ type: "Quotes", code: "InvalidQuotes", message: "Trailing quote on quoted field is malformed", row: h5.length, index: z3 }), m4++;
252
+ u4.push({ type: "Quotes", code: "InvalidQuotes", message: "Trailing quote on quoted field is malformed", row: h4.length, index: z3 }), m4++;
253
253
  }
254
254
  }
255
- else if (x3 && 0 === d3.length && i2.substring(z3, z3 + a5) === x3) {
255
+ else if (x4 && 0 === d3.length && i2.substring(z3, z3 + a5) === x4) {
256
256
  if (-1 === g4) return w2();
257
- z3 = g4 + s2, g4 = i2.indexOf(O2, z3), p4 = i2.indexOf(S, z3);
257
+ z3 = g4 + s2, g4 = i2.indexOf(O3, z3), p4 = i2.indexOf(S, z3);
258
258
  } else if (-1 !== p4 && (p4 < g4 || -1 === g4)) d3.push(i2.substring(z3, p4)), z3 = p4 + e, p4 = i2.indexOf(S, z3);
259
259
  else {
260
260
  if (-1 === g4) break;
261
261
  if (d3.push(i2.substring(z3, g4)), b5(g4 + s2), o2 && (R2(), M2)) return w2();
262
- if (A && h5.length >= A) return w2(true);
262
+ if (A2 && h4.length >= A2) return w2(true);
263
263
  }
264
264
  return E5();
265
- function k2(e2) {
266
- h5.push(e2), f5 = z3;
265
+ function k3(e2) {
266
+ h4.push(e2), f5 = z3;
267
267
  }
268
- function v4(e2) {
268
+ function v3(e2) {
269
269
  var t2 = 0;
270
270
  return t2 = -1 !== e2 && (e2 = i2.substring(m4 + 1, e2)) && "" === e2.trim() ? e2.length : t2;
271
271
  }
272
272
  function E5(e2) {
273
- return r2 || (void 0 === e2 && (e2 = i2.substring(z3)), d3.push(e2), z3 = n2, k2(d3), o2 && R2()), w2();
273
+ return r2 || (void 0 === e2 && (e2 = i2.substring(z3)), d3.push(e2), z3 = n2, k3(d3), o2 && R2()), w2();
274
274
  }
275
275
  function b5(e2) {
276
- z3 = e2, k2(d3), d3 = [], g4 = i2.indexOf(O2, z3);
276
+ z3 = e2, k3(d3), d3 = [], g4 = i2.indexOf(O3, z3);
277
277
  }
278
278
  function w2(e2) {
279
- if (C.header && !t && h5.length && !L2) {
280
- var s4 = h5[0], a6 = /* @__PURE__ */ Object.create(null), o4 = new Set(s4);
279
+ if (C.header && !t && h4.length && !L2) {
280
+ var s4 = h4[0], a6 = /* @__PURE__ */ Object.create(null), o4 = new Set(s4);
281
281
  let n4 = false;
282
282
  for (let r4 = 0; r4 < s4.length; r4++) {
283
- let i4 = P4(s4[r4]);
283
+ let i4 = P2(s4[r4]);
284
284
  if (a6[i4 = q4(C.transformHeader) ? C.transformHeader(i4, r4) : i4]) {
285
285
  let e4, t2 = a6[i4];
286
286
  for (; e4 = i4 + "_" + t2, t2++, o4.has(e4); ) ;
287
- o4.add(e4), s4[r4] = e4, a6[i4]++, n4 = true, (D4 = null === D4 ? {} : D4)[e4] = i4;
287
+ o4.add(e4), s4[r4] = e4, a6[i4]++, n4 = true, (D3 = null === D3 ? {} : D3)[e4] = i4;
288
288
  } else a6[i4] = 1, s4[r4] = i4;
289
289
  o4.add(i4);
290
290
  }
291
291
  n4 && console.warn("Duplicate headers found and renamed."), L2 = true;
292
292
  }
293
- return { data: h5, errors: u4, meta: { delimiter: S, linebreak: O2, aborted: M2, truncated: !!e2, cursor: f5 + (t || 0), renamedHeaders: D4 } };
293
+ return { data: h4, errors: u4, meta: { delimiter: S, linebreak: O3, aborted: M2, truncated: !!e2, cursor: f5 + (t || 0), renamedHeaders: D3 } };
294
294
  }
295
295
  function R2() {
296
- I2(w2()), h5 = [], u4 = [];
296
+ I2(w2()), h4 = [], u4 = [];
297
297
  }
298
298
  }, this.abort = function() {
299
299
  M2 = true;
@@ -306,16 +306,16 @@ var require_papaparse_min = __commonJS({
306
306
  if (t.error) i2.userError(t.error, t.file);
307
307
  else if (t.results && t.results.data) {
308
308
  var n2 = { abort: function() {
309
- r2 = true, _2(t.workerId, { data: [], errors: [], meta: { aborted: true } });
309
+ r2 = true, _3(t.workerId, { data: [], errors: [], meta: { aborted: true } });
310
310
  }, pause: m2, resume: m2 };
311
311
  if (q4(i2.userStep)) {
312
312
  for (var s2 = 0; s2 < t.results.data.length && (i2.userStep({ data: t.results.data[s2], errors: t.results.errors, meta: t.results.meta }, n2), !r2); s2++) ;
313
313
  delete t.results;
314
314
  } else q4(i2.userChunk) && (i2.userChunk(t.results, n2, t.file), delete t.results);
315
315
  }
316
- t.finished && !r2 && _2(t.workerId, t.results);
316
+ t.finished && !r2 && _3(t.workerId, t.results);
317
317
  }
318
- function _2(e, t) {
318
+ function _3(e, t) {
319
319
  var i2 = o[e];
320
320
  q4(i2.userComplete) && i2.userComplete(t), i2.terminate(), delete o[e];
321
321
  }
@@ -336,27 +336,27 @@ var require_papaparse_min = __commonJS({
336
336
  function q4(e) {
337
337
  return "function" == typeof e;
338
338
  }
339
- return v3.parse = function(e, t) {
339
+ return v2.parse = function(e, t) {
340
340
  var i2 = (t = t || {}).dynamicTyping || false;
341
341
  q4(i2) && (t.dynamicTypingFunction = i2, i2 = {});
342
- if (t.dynamicTyping = i2, t.transform = !!q4(t.transform) && t.transform, !t.worker || !v3.WORKERS_SUPPORTED) return i2 = null, v3.NODE_STREAM_INPUT, "string" == typeof e ? (e = P4(e), i2 = new (t.download ? f4 : c2)(t)) : true === e.readable && q4(e.read) && q4(e.on) ? i2 = new p2(t) : (n.File && e instanceof File || e instanceof Object) && (i2 = new l(t)), i2.stream(e);
342
+ if (t.dynamicTyping = i2, t.transform = !!q4(t.transform) && t.transform, !t.worker || !v2.WORKERS_SUPPORTED) return i2 = null, v2.NODE_STREAM_INPUT, "string" == typeof e ? (e = P2(e), i2 = new (t.download ? f4 : c2)(t)) : true === e.readable && q4(e.read) && q4(e.on) ? i2 = new p2(t) : (n.File && e instanceof File || e instanceof Object) && (i2 = new l(t)), i2.stream(e);
343
343
  (i2 = (() => {
344
344
  var e2;
345
- return !!v3.WORKERS_SUPPORTED && (e2 = (() => {
345
+ return !!v2.WORKERS_SUPPORTED && (e2 = (() => {
346
346
  var e4 = n.URL || n.webkitURL || null, t2 = r.toString();
347
- return v3.BLOB_URL || (v3.BLOB_URL = e4.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ", "(", t2, ")();"], { type: "text/javascript" })));
348
- })(), (e2 = new n.Worker(e2)).onmessage = g3, e2.id = h4++, o[e2.id] = e2);
347
+ return v2.BLOB_URL || (v2.BLOB_URL = e4.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ", "(", t2, ")();"], { type: "text/javascript" })));
348
+ })(), (e2 = new n.Worker(e2)).onmessage = g3, e2.id = h3++, o[e2.id] = e2);
349
349
  })()).userStep = t.step, i2.userChunk = t.chunk, i2.userComplete = t.complete, i2.userError = t.error, t.step = q4(t.step), t.chunk = q4(t.chunk), t.complete = q4(t.complete), t.error = q4(t.error), delete t.worker, i2.postMessage({ input: e, config: t, workerId: i2.id });
350
- }, v3.unparse = function(e, t) {
351
- var s2 = false, _3 = true, m4 = ",", y6 = "\r\n", a5 = '"', o2 = a5 + a5, i2 = false, r2 = null, h5 = false, u4 = ((() => {
350
+ }, v2.unparse = function(e, t) {
351
+ var s2 = false, _4 = true, m4 = ",", y6 = "\r\n", a5 = '"', o2 = a5 + a5, i2 = false, r2 = null, h4 = false, u4 = ((() => {
352
352
  if ("object" == typeof t) {
353
- if ("string" != typeof t.delimiter || v3.BAD_DELIMITERS.filter(function(e2) {
353
+ if ("string" != typeof t.delimiter || v2.BAD_DELIMITERS.filter(function(e2) {
354
354
  return -1 !== t.delimiter.indexOf(e2);
355
- }).length || (m4 = t.delimiter), "boolean" != typeof t.quotes && "function" != typeof t.quotes && !Array.isArray(t.quotes) || (s2 = t.quotes), "boolean" != typeof t.skipEmptyLines && "string" != typeof t.skipEmptyLines || (i2 = t.skipEmptyLines), "string" == typeof t.newline && (y6 = t.newline), "string" == typeof t.quoteChar && (a5 = t.quoteChar, o2 = a5 + a5), "boolean" == typeof t.header && (_3 = t.header), Array.isArray(t.columns)) {
355
+ }).length || (m4 = t.delimiter), "boolean" != typeof t.quotes && "function" != typeof t.quotes && !Array.isArray(t.quotes) || (s2 = t.quotes), "boolean" != typeof t.skipEmptyLines && "string" != typeof t.skipEmptyLines || (i2 = t.skipEmptyLines), "string" == typeof t.newline && (y6 = t.newline), "string" == typeof t.quoteChar && (a5 = t.quoteChar, o2 = a5 + a5), "boolean" == typeof t.header && (_4 = t.header), Array.isArray(t.columns)) {
356
356
  if (0 === t.columns.length) throw new Error("Option columns is empty");
357
357
  r2 = t.columns;
358
358
  }
359
- void 0 !== t.escapeChar && (o2 = t.escapeChar + a5), t.escapeFormulae instanceof RegExp ? h5 = t.escapeFormulae : "boolean" == typeof t.escapeFormulae && t.escapeFormulae && (h5 = /^[=+\-@\t\r].*$/);
359
+ void 0 !== t.escapeChar && (o2 = t.escapeChar + a5), t.escapeFormulae instanceof RegExp ? h4 = t.escapeFormulae : "boolean" == typeof t.escapeFormulae && t.escapeFormulae && (h4 = /^[=+\-@\t\r].*$/);
360
360
  }
361
361
  })(), new RegExp(U2(a5), "g"));
362
362
  "string" == typeof e && (e = JSON.parse(e));
@@ -367,47 +367,47 @@ var require_papaparse_min = __commonJS({
367
367
  throw new Error("Unable to serialize unrecognized input");
368
368
  function n2(e2, t2, i4) {
369
369
  var r4 = "", n4 = ("string" == typeof e2 && (e2 = JSON.parse(e2)), "string" == typeof t2 && (t2 = JSON.parse(t2)), Array.isArray(e2) && 0 < e2.length), s4 = !Array.isArray(t2[0]);
370
- if (n4 && _3) {
371
- for (var a6 = 0; a6 < e2.length; a6++) 0 < a6 && (r4 += m4), r4 += k2(e2[a6], a6);
370
+ if (n4 && _4) {
371
+ for (var a6 = 0; a6 < e2.length; a6++) 0 < a6 && (r4 += m4), r4 += k3(e2[a6], a6);
372
372
  0 < t2.length && (r4 += y6);
373
373
  }
374
374
  for (var o4 = 0; o4 < t2.length; o4++) {
375
- var h6 = (n4 ? e2 : t2[o4]).length, u5 = false, d3 = n4 ? 0 === Object.keys(t2[o4]).length : 0 === t2[o4].length;
375
+ var h5 = (n4 ? e2 : t2[o4]).length, u5 = false, d3 = n4 ? 0 === Object.keys(t2[o4]).length : 0 === t2[o4].length;
376
376
  if (i4 && !n4 && (u5 = "greedy" === i4 ? "" === t2[o4].join("").trim() : 1 === t2[o4].length && 0 === t2[o4][0].length), "greedy" === i4 && n4) {
377
- for (var f5 = [], l2 = 0; l2 < h6; l2++) {
377
+ for (var f5 = [], l2 = 0; l2 < h5; l2++) {
378
378
  var c4 = s4 ? e2[l2] : l2;
379
379
  f5.push(t2[o4][c4]);
380
380
  }
381
381
  u5 = "" === f5.join("").trim();
382
382
  }
383
383
  if (!u5) {
384
- for (var p4 = 0; p4 < h6; p4++) {
384
+ for (var p4 = 0; p4 < h5; p4++) {
385
385
  0 < p4 && !d3 && (r4 += m4);
386
386
  var g4 = n4 && s4 ? e2[p4] : p4;
387
- r4 += k2(t2[o4][g4], p4);
387
+ r4 += k3(t2[o4][g4], p4);
388
388
  }
389
- o4 < t2.length - 1 && (!i4 || 0 < h6 && !d3) && (r4 += y6);
389
+ o4 < t2.length - 1 && (!i4 || 0 < h5 && !d3) && (r4 += y6);
390
390
  }
391
391
  }
392
392
  return r4;
393
393
  }
394
- function k2(e2, t2) {
394
+ function k3(e2, t2) {
395
395
  var i4, r4, n4;
396
- return null == e2 ? "" : e2.constructor === Date ? JSON.stringify(e2).slice(1, 25) : (n4 = false, h5 && "string" == typeof e2 && h5.test(e2) && (e2 = "'" + e2, n4 = true), r4 = (i4 = e2.toString()).replace(u4, o2), (n4 = n4 || true === s2 || "function" == typeof s2 && s2(e2, t2) || Array.isArray(s2) && s2[t2] || ((e4, t4) => {
396
+ return null == e2 ? "" : e2.constructor === Date ? JSON.stringify(e2).slice(1, 25) : (n4 = false, h4 && "string" == typeof e2 && h4.test(e2) && (e2 = "'" + e2, n4 = true), r4 = (i4 = e2.toString()).replace(u4, o2), (n4 = n4 || true === s2 || "function" == typeof s2 && s2(e2, t2) || Array.isArray(s2) && s2[t2] || ((e4, t4) => {
397
397
  for (var i5 = 0; i5 < t4.length; i5++) if (-1 < e4.indexOf(t4[i5])) return true;
398
398
  return false;
399
- })(r4, v3.BAD_DELIMITERS) || -1 < r4.indexOf(m4) || -1 < i4.indexOf(a5) || " " === r4.charAt(0) || " " === r4.charAt(r4.length - 1)) ? a5 + r4 + a5 : r4);
399
+ })(r4, v2.BAD_DELIMITERS) || -1 < r4.indexOf(m4) || -1 < i4.indexOf(a5) || " " === r4.charAt(0) || " " === r4.charAt(r4.length - 1)) ? a5 + r4 + a5 : r4);
400
400
  }
401
- }, v3.RECORD_SEP = String.fromCharCode(30), v3.UNIT_SEP = String.fromCharCode(31), v3.BYTE_ORDER_MARK = "\uFEFF", v3.BAD_DELIMITERS = ["\r", "\n", '"', v3.BYTE_ORDER_MARK], v3.WORKERS_SUPPORTED = !s && !!n.Worker, v3.NODE_STREAM_INPUT = 1, v3.LocalChunkSize = 10485760, v3.RemoteChunkSize = 5242880, v3.DefaultDelimiter = ",", v3.Parser = E4, v3.ParserHandle = i, v3.NetworkStreamer = f4, v3.FileStreamer = l, v3.StringStreamer = c2, v3.ReadableStreamStreamer = p2, n.jQuery && ((d2 = n.jQuery).fn.parse = function(o2) {
402
- var i2 = o2.config || {}, h5 = [];
401
+ }, v2.RECORD_SEP = String.fromCharCode(30), v2.UNIT_SEP = String.fromCharCode(31), v2.BYTE_ORDER_MARK = "\uFEFF", v2.BAD_DELIMITERS = ["\r", "\n", '"', v2.BYTE_ORDER_MARK], v2.WORKERS_SUPPORTED = !s && !!n.Worker, v2.NODE_STREAM_INPUT = 1, v2.LocalChunkSize = 10485760, v2.RemoteChunkSize = 5242880, v2.DefaultDelimiter = ",", v2.Parser = E4, v2.ParserHandle = i, v2.NetworkStreamer = f4, v2.FileStreamer = l, v2.StringStreamer = c2, v2.ReadableStreamStreamer = p2, n.jQuery && ((d2 = n.jQuery).fn.parse = function(o2) {
402
+ var i2 = o2.config || {}, h4 = [];
403
403
  return this.each(function(e2) {
404
404
  if (!("INPUT" === d2(this).prop("tagName").toUpperCase() && "file" === d2(this).attr("type").toLowerCase() && n.FileReader) || !this.files || 0 === this.files.length) return true;
405
- for (var t = 0; t < this.files.length; t++) h5.push({ file: this.files[t], inputElem: this, instanceConfig: d2.extend({}, i2) });
405
+ for (var t = 0; t < this.files.length; t++) h4.push({ file: this.files[t], inputElem: this, instanceConfig: d2.extend({}, i2) });
406
406
  }), e(), this;
407
407
  function e() {
408
- if (0 === h5.length) q4(o2.complete) && o2.complete();
408
+ if (0 === h4.length) q4(o2.complete) && o2.complete();
409
409
  else {
410
- var e2, t, i4, r2, n2 = h5[0];
410
+ var e2, t, i4, r2, n2 = h4[0];
411
411
  if (q4(o2.before)) {
412
412
  var s2 = o2.before(n2.file, n2.inputElem);
413
413
  if ("object" == typeof s2) {
@@ -419,23 +419,23 @@ var require_papaparse_min = __commonJS({
419
419
  var a5 = n2.instanceConfig.complete;
420
420
  n2.instanceConfig.complete = function(e4) {
421
421
  q4(a5) && a5(e4, n2.file, n2.inputElem), u4();
422
- }, v3.parse(n2.file, n2.instanceConfig);
422
+ }, v2.parse(n2.file, n2.instanceConfig);
423
423
  }
424
424
  }
425
425
  function u4() {
426
- h5.splice(0, 1), e();
426
+ h4.splice(0, 1), e();
427
427
  }
428
428
  }), a4 && (n.onmessage = function(e) {
429
429
  e = e.data;
430
- void 0 === v3.WORKER_ID && e && (v3.WORKER_ID = e.workerId);
431
- "string" == typeof e.input ? n.postMessage({ workerId: v3.WORKER_ID, results: v3.parse(e.input, e.config), finished: true }) : (n.File && e.input instanceof File || e.input instanceof Object) && (e = v3.parse(e.input, e.config)) && n.postMessage({ workerId: v3.WORKER_ID, results: e, finished: true });
432
- }), (f4.prototype = Object.create(u2.prototype)).constructor = f4, (l.prototype = Object.create(u2.prototype)).constructor = l, (c2.prototype = Object.create(c2.prototype)).constructor = c2, (p2.prototype = Object.create(u2.prototype)).constructor = p2, v3;
430
+ void 0 === v2.WORKER_ID && e && (v2.WORKER_ID = e.workerId);
431
+ "string" == typeof e.input ? n.postMessage({ workerId: v2.WORKER_ID, results: v2.parse(e.input, e.config), finished: true }) : (n.File && e.input instanceof File || e.input instanceof Object) && (e = v2.parse(e.input, e.config)) && n.postMessage({ workerId: v2.WORKER_ID, results: e, finished: true });
432
+ }), (f4.prototype = Object.create(u2.prototype)).constructor = f4, (l.prototype = Object.create(u2.prototype)).constructor = l, (c2.prototype = Object.create(c2.prototype)).constructor = c2, (p2.prototype = Object.create(u2.prototype)).constructor = p2, v2;
433
433
  });
434
434
  }
435
435
  });
436
436
 
437
437
  // src/contract.ts
438
- var HOST_CONTRACT_VERSION = "1.10.0";
438
+ var HOST_CONTRACT_VERSION = "1.11.0";
439
439
  var GEO_POINT_PRECISIONS = ["latlon", "city", "zip3", "state", "country"];
440
440
  var MARK_CLASS = "d3-mark";
441
441
  var LEGEND_MARK_CLASS = "d3-legend-mark";
@@ -447,6 +447,14 @@ var CONTAINER_SLOT_ANIM_STOP = "__llmAnimStop";
447
447
  var CONTAINER_SLOT_XF_CLEAR = "__llmXfClear";
448
448
  var CONTAINER_SLOT_INITIAL_XF_MARK = "__llmInitialXfMark";
449
449
  var CONTAINER_SLOT_UI_STATE = "__lchUiState";
450
+ var VIEW_ONLY_UI_STATE_KEYS = Object.freeze(["camera", "llmZoom"]);
451
+ function withoutViewOnlyKeys(bag) {
452
+ if (!bag || typeof bag !== "object") return bag;
453
+ if (!VIEW_ONLY_UI_STATE_KEYS.some((k3) => Object.prototype.hasOwnProperty.call(bag, k3))) return bag;
454
+ const out = { ...bag };
455
+ for (const k3 of VIEW_ONLY_UI_STATE_KEYS) delete out[k3];
456
+ return out;
457
+ }
450
458
  var HOST_CONTAINER_CLASS = "bic-chart-host";
451
459
  var SELECTION_ACTIVE_CLASS = "lch-has-selection";
452
460
  var MARK_SELECTED_CLASS = "lch-mark-selected";
@@ -487,8 +495,8 @@ var MAX_MAP_POINTS_DEFAULT = 2e3;
487
495
 
488
496
  // src/deltaE.ts
489
497
  function linearise(c2) {
490
- const v3 = c2 / 255;
491
- return v3 <= 0.04045 ? v3 / 12.92 : Math.pow((v3 + 0.055) / 1.055, 2.4);
498
+ const v2 = c2 / 255;
499
+ return v2 <= 0.04045 ? v2 / 12.92 : Math.pow((v2 + 0.055) / 1.055, 2.4);
492
500
  }
493
501
  var Xn = 0.95047;
494
502
  var Yn = 1;
@@ -502,15 +510,15 @@ function rgbToLab(r, g3, b4) {
502
510
  const R2 = linearise(r), G3 = linearise(g3), B2 = linearise(b4);
503
511
  const X2 = 0.4124564 * R2 + 0.3575761 * G3 + 0.1804375 * B2;
504
512
  const Y2 = 0.2126729 * R2 + 0.7151522 * G3 + 0.072175 * B2;
505
- const Z3 = 0.0193339 * R2 + 0.119192 * G3 + 0.9503041 * B2;
506
- const fx = f(X2 / Xn), fy = f(Y2 / Yn), fz = f(Z3 / Zn);
513
+ const Z2 = 0.0193339 * R2 + 0.119192 * G3 + 0.9503041 * B2;
514
+ const fx = f(X2 / Xn), fy = f(Y2 / Yn), fz = f(Z2 / Zn);
507
515
  return { L: 116 * fy - 16, a: 500 * (fx - fy), b: 200 * (fy - fz) };
508
516
  }
509
517
  function hexToLab(hex2) {
510
518
  const m2 = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex2.trim());
511
519
  if (!m2) return null;
512
- const h4 = m2[1].length === 3 ? m2[1][0] + m2[1][0] + m2[1][1] + m2[1][1] + m2[1][2] + m2[1][2] : m2[1];
513
- return rgbToLab(parseInt(h4.slice(0, 2), 16), parseInt(h4.slice(2, 4), 16), parseInt(h4.slice(4, 6), 16));
520
+ const h3 = m2[1].length === 3 ? m2[1][0] + m2[1][0] + m2[1][1] + m2[1][1] + m2[1][2] + m2[1][2] : m2[1];
521
+ return rgbToLab(parseInt(h3.slice(0, 2), 16), parseInt(h3.slice(2, 4), 16), parseInt(h3.slice(4, 6), 16));
514
522
  }
515
523
  var RAD = Math.PI / 180;
516
524
  var DEG = 180 / Math.PI;
@@ -560,14 +568,14 @@ function labToHex(lab) {
560
568
  const fy = (lab.L + 16) / 116, fx = fy + lab.a / 500, fz = fy - lab.b / 200;
561
569
  const X2 = Xn * finv(fx);
562
570
  const Y2 = Yn * (lab.L > KAPPA * EPS ? fy * fy * fy : lab.L / KAPPA);
563
- const Z3 = Zn * finv(fz);
571
+ const Z2 = Zn * finv(fz);
564
572
  const lin = [
565
- 3.2404542 * X2 - 1.5371385 * Y2 - 0.4985314 * Z3,
566
- -0.969266 * X2 + 1.8760108 * Y2 + 0.041556 * Z3,
567
- 0.0556434 * X2 - 0.2040259 * Y2 + 1.0572252 * Z3
573
+ 3.2404542 * X2 - 1.5371385 * Y2 - 0.4985314 * Z2,
574
+ -0.969266 * X2 + 1.8760108 * Y2 + 0.041556 * Z2,
575
+ 0.0556434 * X2 - 0.2040259 * Y2 + 1.0572252 * Z2
568
576
  ];
569
- return "#" + lin.map((v3) => {
570
- const c2 = Math.max(0, Math.min(1, v3));
577
+ return "#" + lin.map((v2) => {
578
+ const c2 = Math.max(0, Math.min(1, v2));
571
579
  const g3 = c2 <= 31308e-7 ? 12.92 * c2 : 1.055 * Math.pow(c2, 1 / 2.4) - 0.055;
572
580
  return Math.round(g3 * 255).toString(16).padStart(2, "0");
573
581
  }).join("");
@@ -605,8 +613,8 @@ function toRgb(raw) {
605
613
  if (!s || s === "none" || s === "transparent") return null;
606
614
  const hex2 = /^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(s);
607
615
  if (hex2) {
608
- const h4 = hex2[1];
609
- const full = h4.length === 3 ? h4[0] + h4[0] + h4[1] + h4[1] + h4[2] + h4[2] : h4;
616
+ const h3 = hex2[1];
617
+ const full = h3.length === 3 ? h3[0] + h3[0] + h3[1] + h3[1] + h3[2] + h3[2] : h3;
610
618
  return [
611
619
  parseInt(full.slice(0, 2), 16),
612
620
  parseInt(full.slice(2, 4), 16),
@@ -626,7 +634,7 @@ function cellKey(rgb) {
626
634
  ].join(",");
627
635
  }
628
636
  function hex(rgb) {
629
- return "#" + rgb.map((v3) => Math.max(0, Math.min(255, v3)).toString(16).padStart(2, "0")).join("");
637
+ return "#" + rgb.map((v2) => Math.max(0, Math.min(255, v2)).toString(16).padStart(2, "0")).join("");
630
638
  }
631
639
  function censusColourSpread(container, doc) {
632
640
  if (!container || typeof container.querySelectorAll !== "function") return EMPTY;
@@ -657,10 +665,10 @@ function censusColourSpread(container, doc) {
657
665
  for (const { rgb } of counted) {
658
666
  marks++;
659
667
  distinct.add(rgb.join(","));
660
- const k2 = cellKey(rgb);
661
- const cur = cells.get(k2);
668
+ const k3 = cellKey(rgb);
669
+ const cur = cells.get(k3);
662
670
  if (cur) cur.n++;
663
- else cells.set(k2, { rgb, n: 1 });
671
+ else cells.set(k3, { rgb, n: 1 });
664
672
  }
665
673
  if (marks < MIN_MARKS || distinct.size < MIN_RAMP_FILLS) return EMPTY;
666
674
  const top = [...cells.values()].sort((a4, b4) => b4.n - a4.n).slice(0, MAX_CELLS);
@@ -669,14 +677,14 @@ function censusColourSpread(container, doc) {
669
677
  const d2 = cs.map(() => new Array(cs.length).fill(0));
670
678
  let span = 0, lo = 0, hi = 1;
671
679
  for (let i = 0; i < cs.length; i++) {
672
- for (let j2 = i + 1; j2 < cs.length; j2++) {
673
- const v3 = deltaE2000(cs[i], cs[j2]);
674
- d2[i][j2] = v3;
675
- d2[j2][i] = v3;
676
- if (v3 > span) {
677
- span = v3;
680
+ for (let j3 = i + 1; j3 < cs.length; j3++) {
681
+ const v2 = deltaE2000(cs[i], cs[j3]);
682
+ d2[i][j3] = v2;
683
+ d2[j3][i] = v2;
684
+ if (v2 > span) {
685
+ span = v2;
678
686
  lo = i;
679
- hi = j2;
687
+ hi = j3;
680
688
  }
681
689
  }
682
690
  }
@@ -691,8 +699,8 @@ function censusColourSpread(container, doc) {
691
699
  let crowd = 0;
692
700
  for (let i = 0; i < cs.length; i++) {
693
701
  let n = 0;
694
- for (let j2 = 0; j2 < cs.length; j2++) {
695
- if (i === j2 || d2[i][j2] <= SAME_SHADE_DELTA_E) n += top[j2].n;
702
+ for (let j3 = 0; j3 < cs.length; j3++) {
703
+ if (i === j3 || d2[i][j3] <= SAME_SHADE_DELTA_E) n += top[j3].n;
696
704
  }
697
705
  if (n > crowd) crowd = n;
698
706
  }
@@ -722,8 +730,8 @@ function normHex(raw) {
722
730
  if (typeof raw !== "string") return null;
723
731
  const m2 = HEX.exec(raw.trim());
724
732
  if (!m2) return null;
725
- const h4 = m2[1].length === 3 ? m2[1].split("").map((c2) => c2 + c2).join("") : m2[1];
726
- return "#" + h4.toLowerCase();
733
+ const h3 = m2[1].length === 3 ? m2[1].split("").map((c2) => c2 + c2).join("") : m2[1];
734
+ return "#" + h3.toLowerCase();
727
735
  }
728
736
  function mixLab(a4, b4, t) {
729
737
  return { L: a4.L + (b4.L - a4.L) * t, a: a4.a + (b4.a - a4.a) * t, b: a4.b + (b4.b - a4.b) * t };
@@ -731,7 +739,7 @@ function mixLab(a4, b4, t) {
731
739
  function paintedOver(fg, canvas, alpha) {
732
740
  const f4 = [1, 3, 5].map((i) => parseInt(fg.slice(i, i + 2), 16));
733
741
  const c2 = [1, 3, 5].map((i) => parseInt(canvas.slice(i, i + 2), 16));
734
- const mixed = f4.map((v3, i) => Math.round(v3 * alpha + c2[i] * (1 - alpha))).map((v3) => v3.toString(16).padStart(2, "0"));
742
+ const mixed = f4.map((v2, i) => Math.round(v2 * alpha + c2[i] * (1 - alpha))).map((v2) => v2.toString(16).padStart(2, "0"));
735
743
  return hexToLab("#" + mixed.join(""));
736
744
  }
737
745
  function autoRampMinStep(low, high, canvas, classes = AUTO_RAMP_CLASSES, opacity = AUTO_RAMP_DRAWN_OPACITY) {
@@ -739,8 +747,8 @@ function autoRampMinStep(low, high, canvas, classes = AUTO_RAMP_CLASSES, opacity
739
747
  const bg = normHex(canvas);
740
748
  if (!lo || !hi || !bg || classes < 2) return NaN;
741
749
  let prev = null, min = Infinity;
742
- for (let k2 = 0; k2 < classes; k2++) {
743
- const painted = paintedOver(labToHex(mixLab(lo, hi, k2 / (classes - 1))), bg, opacity);
750
+ for (let k3 = 0; k3 < classes; k3++) {
751
+ const painted = paintedOver(labToHex(mixLab(lo, hi, k3 / (classes - 1))), bg, opacity);
744
752
  if (prev) min = Math.min(min, deltaE2000(prev, painted));
745
753
  prev = painted;
746
754
  }
@@ -764,15 +772,15 @@ function resolveAutoColorScale(p2) {
764
772
  };
765
773
  const candidates = p2.isHighContrast ? [normHex(p2.themeAccent), normHex(p2.themeFg)] : [...palette.map(normHex), normHex(p2.themeAccent), normHex(p2.themeFg)];
766
774
  const accent = candidates.find(usable) ?? FALLBACK_ACCENT;
767
- const A = hexToLab(accent);
775
+ const A2 = hexToLab(accent);
768
776
  let t = 0.1;
769
- let low = mixLab(bg, A, t);
777
+ let low = mixLab(bg, A2, t);
770
778
  while (t < 0.6 && deltaE2000(paintedOver(labToHex(low), canvas, AUTO_RAMP_DRAWN_OPACITY), bg) < SAME_SHADE_DELTA_E) {
771
779
  t += 0.02;
772
- low = mixLab(bg, A, t);
780
+ low = mixLab(bg, A2, t);
773
781
  }
774
782
  const lowHex = labToHex(low);
775
- let high = { ...A };
783
+ let high = { ...A2 };
776
784
  let highHex = labToHex(high);
777
785
  for (let step = 0; step < 80 && autoRampMinStep(lowHex, highHex, canvas) < AUTO_RAMP_MIN_STEP_DELTA_E; step++) {
778
786
  const L2 = Math.max(4, Math.min(98, high.L + (darkCanvas ? 1 : -1)));
@@ -863,20 +871,20 @@ function resolveOptions(p2) {
863
871
  // never reach a chart as a live mode. Both of these are read on EVERY render, so a
864
872
  // reader can change their mind about a cached chart without regenerating it.
865
873
  approximatePositions: (() => {
866
- const v3 = (p2.approximatePositions == null ? "" : String(p2.approximatePositions)).toLowerCase();
867
- return v3 === "mark" || v3 === "aggregate" || v3 === "skip" ? v3 : APPROXIMATE_POSITIONS_DEFAULT;
874
+ const v2 = (p2.approximatePositions == null ? "" : String(p2.approximatePositions)).toLowerCase();
875
+ return v2 === "mark" || v2 === "aggregate" || v2 === "skip" ? v2 : APPROXIMATE_POSITIONS_DEFAULT;
868
876
  })(),
869
877
  valueAxisBaseline: (() => {
870
- const v3 = (p2.valueAxisBaseline == null ? "" : String(p2.valueAxisBaseline)).toLowerCase();
871
- return v3 === "zero" || v3 === "fit" || v3 === "auto" ? v3 : VALUE_AXIS_BASELINE_DEFAULT;
878
+ const v2 = (p2.valueAxisBaseline == null ? "" : String(p2.valueAxisBaseline)).toLowerCase();
879
+ return v2 === "zero" || v2 === "fit" || v2 === "auto" ? v2 : VALUE_AXIS_BASELINE_DEFAULT;
872
880
  })(),
873
881
  // Same shape, and the same reason for it: an unrecognised string must never reach a chart
874
882
  // as a live mode. Failing open to "auto" is the conservative direction here — "auto" is
875
883
  // the setting that makes the chart PROVE the grid before it names a period, so a garbled
876
884
  // value withdraws the claim rather than asserting one.
877
885
  seasonalMarkers: (() => {
878
- const v3 = (p2.seasonalMarkers == null ? "" : String(p2.seasonalMarkers)).toLowerCase();
879
- return v3 === "auto" || v3 === "always" || v3 === "never" ? v3 : SEASONAL_MARKERS_DEFAULT;
886
+ const v2 = (p2.seasonalMarkers == null ? "" : String(p2.seasonalMarkers)).toLowerCase();
887
+ return v2 === "auto" || v2 === "always" || v2 === "never" ? v2 : SEASONAL_MARKERS_DEFAULT;
880
888
  })(),
881
889
  // ---- animation: booleans, default+clamp numerics, "" default enum ----
882
890
  animAutoPlay: !!p2.animAutoPlay,
@@ -944,12 +952,12 @@ var byAsset = /* @__PURE__ */ new Map();
944
952
  var _na;
945
953
  function geoAssetFor(geoKind) {
946
954
  if (!geoKind) return null;
947
- const k2 = geoKind.toLowerCase();
948
- if (/^country/.test(k2)) return "world";
949
- if (k2 === "north-america") return "world";
950
- if (k2 === "world") return "world";
951
- if (k2 === "us-state-code" || k2 === "us-state-name") return "us-states";
952
- if (k2 === "us-zip5") return "us-zip3";
955
+ const k3 = geoKind.toLowerCase();
956
+ if (/^country/.test(k3)) return "world";
957
+ if (k3 === "north-america") return "world";
958
+ if (k3 === "world") return "world";
959
+ if (k3 === "us-state-code" || k3 === "us-state-name") return "us-states";
960
+ if (k3 === "us-zip5") return "us-zip3";
953
961
  return null;
954
962
  }
955
963
  var _worldBase;
@@ -1231,12 +1239,12 @@ function A3(n) {
1231
1239
  if (f4 && f4.length) {
1232
1240
  let d2 = n.state === void 0 || n.state === null ? "" : String(n.state).trim(), R2 = d2 ? u(d2) : "", g3 = d2 ? Y(d2) : null, S = [], m2 = -1;
1233
1241
  for (let c2 of f4) {
1234
- let l = c2.row, A = 0;
1235
- if (d2 && l.a1 !== "") if (g3 && l.a1 === g3 || u(l.a1) === R2) A++;
1242
+ let l = c2.row, A2 = 0;
1243
+ if (d2 && l.a1 !== "") if (g3 && l.a1 === g3 || u(l.a1) === R2) A2++;
1236
1244
  else continue;
1237
- if (i) if (T(l.cc) === i) A++;
1245
+ if (i) if (T(l.cc) === i) A2++;
1238
1246
  else continue;
1239
- A > m2 ? (m2 = A, S = [c2]) : A === m2 && S.push(c2);
1247
+ A2 > m2 ? (m2 = A2, S = [c2]) : A2 === m2 && S.push(c2);
1240
1248
  }
1241
1249
  S.some((c2) => c2.primary) && (S = S.filter((c2) => c2.primary));
1242
1250
  let p2 = /* @__PURE__ */ new Map();
@@ -1267,19 +1275,19 @@ var x = 8;
1267
1275
  function y3(n, e) {
1268
1276
  let t = new Array(n.length), o = new Array(n.length), i = new Array(n.length), r = /* @__PURE__ */ new Set(), a4 = [], s = /* @__PURE__ */ new Set(), f4 = [], d2 = /* @__PURE__ */ new Set(), R2 = [], g3 = { latlon: 0, city: 0, zip3: 0, state: 0, country: 0 }, S = 0, m2 = 0, p2 = null;
1269
1277
  for (let l = 0; l < n.length; ++l) {
1270
- let A = n[l], C = A3({ ...A, mapKind: e });
1278
+ let A2 = n[l], C = A3({ ...A2, mapKind: e });
1271
1279
  if (S3(C)) {
1272
1280
  t[l] = null, o[l] = null, i[l] = null, m2++;
1273
- let M2 = K(A);
1281
+ let M2 = K(A2);
1274
1282
  M2 && !d2.has(M2.toLowerCase()) && (d2.add(M2.toLowerCase()), R2.length < x && R2.push(M2));
1275
1283
  } else if (C) {
1276
1284
  if (t[l] = C.lat, o[l] = C.lon, i[l] = C.precision, S++, g3[C.precision]++, (p2 === null || G[C.precision] > G[p2]) && (p2 = C.precision), G[C.precision] > G.city) {
1277
- let M2 = K(A);
1285
+ let M2 = K(A2);
1278
1286
  M2 && !s.has(M2.toLowerCase()) && (s.add(M2.toLowerCase()), f4.length < x && f4.push(M2));
1279
1287
  }
1280
1288
  } else {
1281
1289
  t[l] = null, o[l] = null, i[l] = null;
1282
- let M2 = K(A);
1290
+ let M2 = K(A2);
1283
1291
  M2 && !r.has(M2.toLowerCase()) && (r.add(M2.toLowerCase()), a4.push(M2));
1284
1292
  }
1285
1293
  }
@@ -1425,10 +1433,10 @@ function It(n, s) {
1425
1433
  return s === "us-zip5" ? w.has(n.slice(0, 3)) : true;
1426
1434
  }
1427
1435
  function Wt(n, s) {
1428
- let i = new Array(n.length), r = /* @__PURE__ */ new Set(), M2 = [], h4 = 0;
1436
+ let i = new Array(n.length), r = /* @__PURE__ */ new Set(), M2 = [], h3 = 0;
1429
1437
  for (let N2 = 0; N2 < n.length; ++N2) {
1430
- let I2 = Mt(n[N2], s), O2 = I2 !== null && It(I2, s) ? I2 : null;
1431
- if (i[N2] = O2, O2 !== null) h4++;
1438
+ let I2 = Mt(n[N2], s), O3 = I2 !== null && It(I2, s) ? I2 : null;
1439
+ if (i[N2] = O3, O3 !== null) h3++;
1432
1440
  else {
1433
1441
  let d2 = n[N2];
1434
1442
  if (d2 != null) {
@@ -1440,10 +1448,10 @@ function Wt(n, s) {
1440
1448
  }
1441
1449
  }
1442
1450
  }
1443
- return { iso: i, unmatched: M2, matchedRows: h4, totalRows: n.length };
1451
+ return { iso: i, unmatched: M2, matchedRows: h3, totalRows: n.length };
1444
1452
  }
1445
1453
 
1446
- // ../shape-core/dist/chunk-RS7LNZD7.mjs
1454
+ // ../shape-core/dist/chunk-NY26PXWD.mjs
1447
1455
  var import_papaparse = __toESM(require_papaparse_min(), 1);
1448
1456
  /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
1449
1457
  var Se = { "north-america": "AG AI AW BB BL BM BQ BS BZ CA CR CU CW DM DO GD GL GP GT HN HT JM KN KY LC MF MQ MS MX NI PA PM PR SV SX TC TT US VC VG VI", "south-america": "AR BO BR CL CO EC FK GF GY PE PY SR UY VE", europe: "AD AL AT AX BA BE BG BY CH CY CZ DE DK EE ES FI FO FR GB GG GI GR HR HU IE IM IS IT JE LI LT LU LV MC MD ME MK MT NL NO PL PT RO RS RU SE SI SJ SK SM UA VA", africa: "AO BF BI BJ BW CD CF CG CI CM CV DJ DZ EG EH ER ET GA GH GM GN GQ GW KE KM LR LS LY MA MG ML MR MU MW MZ NA NE NG RE RW SC SD SH SL SN SO SS ST SZ TD TG TN TZ UG YT ZA ZM ZW", asia: "AE AF AM AZ BD BH BN BT CC CN CX GE HK ID IL IN IO IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO MV MY NP OM PH PK PS QA SA SG SY TH TJ TL TM TR TW UZ VN YE", oceania: "AS AU CK FJ FM GU KI MH MP NC NF NR NU NZ PF PG PN PW SB TK TO TV UM VU WF WS", antarctica: "AQ BV GS HM TF" };
@@ -1550,51 +1558,51 @@ var ct2 = new RegExp([String.raw`\bisMeasure\b`, String.raw`\bdataType\b`, Strin
1550
1558
 
1551
1559
  // ../shape-core/dist/index.mjs
1552
1560
  /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
1553
- var E2 = 2;
1554
- var Z2 = 400;
1555
- function F3(i) {
1561
+ var G2 = 2;
1562
+ var q3 = 400;
1563
+ function O2(i) {
1556
1564
  return !!E(i);
1557
1565
  }
1558
- function P2(i) {
1566
+ function A(i) {
1559
1567
  let n = /* @__PURE__ */ new Set();
1560
1568
  for (let t of i) {
1561
1569
  if (t == null) continue;
1562
- let s = u(String(t));
1563
- if (!V(s) && !n.has(s) && (n.add(s), n.size >= Z2)) break;
1570
+ let r = u(String(t));
1571
+ if (!V(r) && !n.has(r) && (n.add(r), n.size >= q3)) break;
1564
1572
  }
1565
1573
  return Array.from(n);
1566
1574
  }
1567
- function h3(i) {
1568
- let n = P2(i);
1569
- if (n.length === 0 || G2(i) < 95) return false;
1570
- let t = n.filter((l) => F3(l) && !Y(l)).length, s = n.filter((l) => !F3(l) && !!Y(l)).length;
1571
- return t >= 1 && t >= s;
1575
+ function x3(i) {
1576
+ let n = A(i);
1577
+ if (n.length === 0 || E2(i) < 95) return false;
1578
+ let t = n.filter((c2) => O2(c2) && !Y(c2)).length, r = n.filter((c2) => !O2(c2) && !!Y(c2)).length;
1579
+ return t >= 1 && t >= r;
1572
1580
  }
1573
1581
  function W2(i, n) {
1574
1582
  if (!Y(i)) return false;
1575
1583
  let t = E(i);
1576
1584
  return t ? n === "world" ? true : s3.has(t) : false;
1577
1585
  }
1578
- function G2(i) {
1579
- let n = P2(i);
1586
+ function E2(i) {
1587
+ let n = A(i);
1580
1588
  if (n.length === 0) return 0;
1581
1589
  let t = 0;
1582
- for (let s of n) F3(s) && t++;
1590
+ for (let r of n) O2(r) && t++;
1583
1591
  return Math.round(t / n.length * 1e3) / 10;
1584
1592
  }
1585
- function v2(i) {
1586
- let n = P2(i);
1593
+ function _2(i) {
1594
+ let n = A(i);
1587
1595
  if (n.length === 0) return 0;
1588
1596
  let t = 0;
1589
- for (let s of n) Y(s) && t++;
1597
+ for (let r of n) Y(r) && t++;
1590
1598
  return Math.round(t / n.length * 1e3) / 10;
1591
1599
  }
1592
1600
  function $2(i) {
1593
1601
  let n = /* @__PURE__ */ new Set();
1594
1602
  for (let t of i) {
1595
1603
  if (t == null) continue;
1596
- let s = String(t).trim();
1597
- if (!V(u(s)) && !n.has(s) && (n.add(s), n.size >= Z2)) break;
1604
+ let r = String(t).trim();
1605
+ if (!V(u(r)) && !n.has(r) && (n.add(r), n.size >= q3)) break;
1598
1606
  }
1599
1607
  return Array.from(n);
1600
1608
  }
@@ -1602,95 +1610,95 @@ function z2(i) {
1602
1610
  let n = $2(i);
1603
1611
  if (n.length === 0) return 0;
1604
1612
  let t = 0;
1605
- for (let s of n) Z(s).length > 0 && t++;
1613
+ for (let r of n) Z(r).length > 0 && t++;
1606
1614
  return Math.round(t / n.length * 1e3) / 10;
1607
1615
  }
1608
- function q3(i, n) {
1616
+ function j2(i, n) {
1609
1617
  return y2(n, rt) ? true : $2(i).some((t) => /^\d{5}(-\d{4})?$/.test(t.replace(/\.0+$/, "")));
1610
1618
  }
1611
- function gt(i, n) {
1612
- let t = P2(i);
1619
+ function yt2(i, n) {
1620
+ let t = A(i);
1613
1621
  if (t.length === 0) return 0;
1614
- let s = 0;
1615
- for (let l of t) p3(l, n) && s++;
1616
- return Math.round(s / t.length * 1e3) / 10;
1622
+ let r = 0;
1623
+ for (let c2 of t) p3(c2, n) && r++;
1624
+ return Math.round(r / t.length * 1e3) / 10;
1617
1625
  }
1618
- function D3(i, n) {
1626
+ function k2(i, n) {
1619
1627
  let t = 0;
1620
- for (let s of P2(i)) n(s) && t++;
1628
+ for (let r of A(i)) n(r) && t++;
1621
1629
  return t;
1622
1630
  }
1623
- function yt2(i, n) {
1631
+ function Ct(i, n) {
1624
1632
  let t = 0;
1625
- for (let s of $2(i)) n(s) && t++;
1633
+ for (let r of $2(i)) n(r) && t++;
1626
1634
  return t;
1627
1635
  }
1628
- function Ct(i, n, t, s, l) {
1629
- let x3 = [], c2 = [], o = {}, I2 = {}, _2 = new Set(i), u2 = (e) => n.map((r) => r[e]);
1636
+ function ht(i, n, t, r, c2) {
1637
+ let l = [], a4 = [], o = {}, R2 = {}, h3 = new Set(i), f4 = (e) => n.map((s) => s[e]);
1630
1638
  for (let e of ["city", "country"]) {
1631
- let r = t?.[e];
1632
- r && _2.has(r) && (o[e] = r);
1639
+ let s = t?.[e];
1640
+ s && h3.has(s) && (o[e] = s);
1633
1641
  }
1634
- let X2 = new Set(l ?? i);
1642
+ let Y2 = new Set(c2 ?? i);
1635
1643
  for (let e of ["lat", "lon"]) {
1636
- let r = t?.[e];
1637
- r && X2.has(r) && (o[e] = r);
1644
+ let s = t?.[e];
1645
+ s && Y2.has(s) && (o[e] = s);
1638
1646
  }
1639
- let d2 = t?.zip;
1640
- if (d2 && _2.has(d2)) {
1641
- let e = u2(d2), r = z2(e);
1642
- r < 95 ? c2.push(`zip=${d2} (only ${r}% of values read as ZIPs)`) : q3(e, d2) ? o.zip = d2 : c2.push(`zip=${d2} (all values are 3-4 digits with nothing to say they are postal)`);
1647
+ let g3 = t?.zip;
1648
+ if (g3 && h3.has(g3)) {
1649
+ let e = f4(g3), s = z2(e);
1650
+ s < 95 ? a4.push(`zip=${g3} (only ${s}% of values read as ZIPs)`) : j2(e, g3) ? o.zip = g3 : a4.push(`zip=${g3} (all values are 3-4 digits with nothing to say they are postal)`);
1643
1651
  }
1644
- let m2 = t?.state;
1645
- if (m2 && _2.has(m2)) {
1646
- let e = u2(m2), r = P2(e);
1647
- r.length > 0 && r.every((a4) => W2(a4, s)) ? c2.push(`state=${m2} (every value is "CA", which is both Canada and California)`) : h3(e) ? (c2.push(`state=${m2} (every value is a country, not a state)`), o.country || (o.country = m2)) : v2(e) < 95 ? c2.push(`state=${m2} (only ${v2(e)}% of values are states/provinces)`) : o.state = m2;
1652
+ let p2 = t?.state;
1653
+ if (p2 && h3.has(p2)) {
1654
+ let e = f4(p2), s = A(e);
1655
+ s.length > 0 && s.every((u2) => W2(u2, r)) ? a4.push(`state=${p2} (every value is "CA", which is both Canada and California)`) : x3(e) ? (a4.push(`state=${p2} (every value is a country, not a state)`), o.country || (o.country = p2)) : _2(e) < 95 ? a4.push(`state=${p2} (only ${_2(e)}% of values are states/provinces)`) : o.state = p2;
1648
1656
  }
1649
- let g3 = new Set(Object.values(o).filter(Boolean)), A = i.filter((e) => !g3.has(e) && !e.startsWith("__"));
1657
+ let y5 = new Set(Object.values(o).filter(Boolean)), S = i.filter((e) => !y5.has(e) && !e.startsWith("__"));
1650
1658
  if (!o.state) {
1651
1659
  let e = null;
1652
- for (let r of A) {
1653
- let a4 = u2(r);
1654
- if (h3(a4)) continue;
1655
- let f4 = v2(a4);
1656
- if (f4 < 95) continue;
1657
- let k2 = D3(a4, (R2) => !!Y(R2)), J2 = D3(a4, (R2) => !!Y(R2) && !W2(R2, s));
1658
- k2 < E2 && J2 < 1 || (!e || f4 > e.pct) && (e = { name: r, pct: f4 });
1659
- }
1660
- e && (o.state = e.name, g3.add(e.name), x3.push(`state=${e.name} (${e.pct}% states/provinces)`));
1661
- }
1662
- if (!o.zip) for (let e of A) {
1663
- if (g3.has(e)) continue;
1664
- let r = u2(e), a4 = z2(r);
1665
- if (!(a4 < 95) && q3(r, e) && !(yt2(r, (f4) => Z(f4).length > 0) < E2)) {
1666
- o.zip = e, g3.add(e), x3.push(`zip=${e} (${a4}% ZIP codes)`);
1660
+ for (let s of S) {
1661
+ let u2 = f4(s);
1662
+ if (x3(u2)) continue;
1663
+ let m2 = _2(u2);
1664
+ if (m2 < 95) continue;
1665
+ let w2 = k2(u2, (T3) => !!Y(T3)), Q3 = k2(u2, (T3) => !!Y(T3) && !W2(T3, r));
1666
+ w2 < G2 && Q3 < 1 || (!e || m2 > e.pct) && (e = { name: s, pct: m2 });
1667
+ }
1668
+ e && (o.state = e.name, y5.add(e.name), l.push(`state=${e.name} (${e.pct}% states/provinces)`));
1669
+ }
1670
+ if (!o.zip) for (let e of S) {
1671
+ if (y5.has(e)) continue;
1672
+ let s = f4(e), u2 = z2(s);
1673
+ if (!(u2 < 95) && j2(s, e) && !(Ct(s, (m2) => Z(m2).length > 0) < G2)) {
1674
+ o.zip = e, y5.add(e), l.push(`zip=${e} (${u2}% ZIP codes)`);
1667
1675
  break;
1668
1676
  }
1669
1677
  }
1670
- let C = o.country;
1671
- if (!C || !h3(u2(C))) {
1678
+ let P2 = o.country;
1679
+ if (!P2 || !x3(f4(P2))) {
1672
1680
  let e = null;
1673
- for (let r of A) {
1674
- if (g3.has(r) || !h3(u2(r))) continue;
1675
- let a4 = G2(u2(r));
1676
- (!e || a4 > e.pct) && (e = { name: r, pct: a4 });
1681
+ for (let s of S) {
1682
+ if (y5.has(s) || !x3(f4(s))) continue;
1683
+ let u2 = E2(f4(s));
1684
+ (!e || u2 > e.pct) && (e = { name: s, pct: u2 });
1677
1685
  }
1678
- e && (C && (c2.push(`country=${C} (only ${G2(u2(C))}% of values are country identifiers; using ${e.name} instead)`), I2.country = C), o.country = e.name, g3.add(e.name), x3.push(`country=${e.name}`));
1686
+ e && (P2 && (a4.push(`country=${P2} (only ${E2(f4(P2))}% of values are country identifiers; using ${e.name} instead)`), R2.country = P2), o.country = e.name, y5.add(e.name), l.push(`country=${e.name}`));
1679
1687
  }
1680
1688
  if (!o.city) {
1681
1689
  let e = null;
1682
- for (let r of A) {
1683
- if (g3.has(r)) continue;
1684
- let a4 = u2(r), f4 = gt(a4, s);
1685
- f4 < m3 || D3(a4, (k2) => p3(k2, s)) < E2 || (!e || f4 > e.pct) && (e = { name: r, pct: f4 });
1690
+ for (let s of S) {
1691
+ if (y5.has(s)) continue;
1692
+ let u2 = f4(s), m2 = yt2(u2, r);
1693
+ m2 < m3 || k2(u2, (w2) => p3(w2, r)) < G2 || (!e || m2 > e.pct) && (e = { name: s, pct: m2 });
1686
1694
  }
1687
- e && (o.city = e.name, x3.push(`city=${e.name} (${e.pct}% known cities)`));
1695
+ e && (o.city = e.name, l.push(`city=${e.name} (${e.pct}% known cities)`));
1688
1696
  }
1689
- let B2 = o.country ? u2(o.country) : [], L2 = !!o.country && h3(B2), Y2 = L2 ? new Set(B2.map((e) => E(e == null ? null : String(e))).filter(Boolean)).size : 0, K3 = L2 && Y2 >= 2, N2 = !!(o.lat && o.lon) && n.some((e) => {
1690
- let r = +String(e[o.lat] ?? "").trim(), a4 = +String(e[o.lon] ?? "").trim();
1691
- return isFinite(r) && isFinite(a4) && r >= -90 && r <= 90 && a4 >= -180 && a4 <= 180 && String(e[o.lat] ?? "").trim() !== "" && String(e[o.lon] ?? "").trim() !== "";
1697
+ let B2 = o.country ? f4(o.country) : [], D3 = !!o.country && x3(B2), J2 = D3 ? new Set(B2.map((e) => E(e == null ? null : String(e))).filter(Boolean)).size : 0, H2 = D3 && J2 >= 2, L2 = !!(o.lat && o.lon) && n.some((e) => {
1698
+ let s = +String(e[o.lat] ?? "").trim(), u2 = +String(e[o.lon] ?? "").trim();
1699
+ return isFinite(s) && isFinite(u2) && s >= -90 && s <= 90 && u2 >= -180 && u2 <= 180 && String(e[o.lat] ?? "").trim() !== "" && String(e[o.lon] ?? "").trim() !== "";
1692
1700
  });
1693
- return o.lat && o.lon && !N2 && c2.push(`lat/lon=${o.lat}/${o.lon} (no row holds a usable coordinate pair)`), o.country && !K3 && !(o.city || o.state || o.zip || N2) && c2.push(L2 ? `country=${o.country} (every row resolves to the same country - nothing to place apart)` : `country=${o.country} (values are not country identifiers)`), { bind: !!(o.city || o.state || o.zip || K3 || N2) ? o : null, backfilled: x3, refused: c2, ...Object.keys(I2).length ? { labelFallback: I2 } : {} };
1701
+ return o.lat && o.lon && !L2 && a4.push(`lat/lon=${o.lat}/${o.lon} (no row holds a usable coordinate pair)`), o.country && !H2 && !(o.city || o.state || o.zip || L2) && a4.push(D3 ? `country=${o.country} (every row resolves to the same country - nothing to place apart)` : `country=${o.country} (values are not country identifiers)`), { bind: !!(o.city || o.state || o.zip || H2 || L2) ? o : null, backfilled: l, refused: a4, ...Object.keys(R2).length ? { labelFallback: R2 } : {} };
1694
1702
  }
1695
1703
 
1696
1704
  // src/payload.ts
@@ -1705,7 +1713,7 @@ function resolvePointChannel(cols, rowObjs, point) {
1705
1713
  let labelCol;
1706
1714
  if (bind) {
1707
1715
  const dims = cols.filter((c2) => !c2.isMeasure).map((c2) => c2.name);
1708
- const res = Ct(dims, rowObjs, bind, point?.mapKind, cols.map((c2) => c2.name));
1716
+ const res = ht(dims, rowObjs, bind, point?.mapKind, cols.map((c2) => c2.name));
1709
1717
  bind = res.bind;
1710
1718
  rolesBackfilled = res.backfilled;
1711
1719
  rolesRefused = res.refused;
@@ -1793,27 +1801,27 @@ function buildRenderPayload(cols, rowObjs, geo, point, destination, opts) {
1793
1801
  const row = rowObjs[r];
1794
1802
  const a4 = new Array(cols.length + extra);
1795
1803
  for (let c2 = 0; c2 < cols.length; c2++) {
1796
- const v3 = row[colNames[c2]];
1797
- if (v3 instanceof Date) {
1798
- a4[c2] = v3.toISOString();
1804
+ const v2 = row[colNames[c2]];
1805
+ if (v2 instanceof Date) {
1806
+ a4[c2] = v2.toISOString();
1799
1807
  } else {
1800
- a4[c2] = v3 ?? null;
1808
+ a4[c2] = v2 ?? null;
1801
1809
  }
1802
1810
  }
1803
- let k2 = cols.length;
1804
- a4[k2++] = r;
1805
- if (geoIso) a4[k2++] = geoIso[r];
1811
+ let k3 = cols.length;
1812
+ a4[k3++] = r;
1813
+ if (geoIso) a4[k3++] = geoIso[r];
1806
1814
  if (pLat && pLon) {
1807
- a4[k2++] = pLat[r];
1808
- a4[k2++] = pLon[r];
1809
- a4[k2++] = pPrec ? pPrec[r] : null;
1815
+ a4[k3++] = pLat[r];
1816
+ a4[k3++] = pLon[r];
1817
+ a4[k3++] = pPrec ? pPrec[r] : null;
1810
1818
  }
1811
1819
  if (dLat && dLon) {
1812
- a4[k2++] = dLat[r];
1813
- a4[k2++] = dLon[r];
1814
- a4[k2++] = dPrec ? dPrec[r] : null;
1820
+ a4[k3++] = dLat[r];
1821
+ a4[k3++] = dLon[r];
1822
+ a4[k3++] = dPrec ? dPrec[r] : null;
1815
1823
  }
1816
- for (const ac of aliasCols) a4[k2++] = a4[ac.from];
1824
+ for (const ac of aliasCols) a4[k3++] = a4[ac.from];
1817
1825
  out[r] = a4;
1818
1826
  }
1819
1827
  const colsOut = [...cols, { name: "__rowIdx__", dataType: "Integer", isMeasure: false, modelDesc: "" }];
@@ -1848,6 +1856,141 @@ function buildRenderPayload(cols, rowObjs, geo, point, destination, opts) {
1848
1856
  };
1849
1857
  }
1850
1858
 
1859
+ // src/codeComments.ts
1860
+ function stripJsComments(code) {
1861
+ const src = String(code ?? "");
1862
+ const n = src.length;
1863
+ let out = "";
1864
+ let i = 0;
1865
+ const templates = [];
1866
+ let prevSig = "";
1867
+ let prevWord = "";
1868
+ let wordOpen = false;
1869
+ const regexMayFollow = () => {
1870
+ if (prevSig === "") return true;
1871
+ if ("(,=:[!&|?{};+-*%<>~^".includes(prevSig)) return true;
1872
+ return /^(return|typeof|instanceof|in|of|new|delete|void|throw|case|do|else|yield|await)$/.test(prevWord);
1873
+ };
1874
+ while (i < n) {
1875
+ const ch = src[i];
1876
+ const next = i + 1 < n ? src[i + 1] : "";
1877
+ const top = templates.length > 0 ? templates[templates.length - 1] : null;
1878
+ if (top === -1) {
1879
+ if (ch === "\\") {
1880
+ out += src.slice(i, i + 2);
1881
+ i += 2;
1882
+ continue;
1883
+ }
1884
+ if (ch === "`") {
1885
+ templates.pop();
1886
+ out += ch;
1887
+ i++;
1888
+ prevSig = "`";
1889
+ prevWord = "";
1890
+ wordOpen = false;
1891
+ continue;
1892
+ }
1893
+ if (ch === "$" && next === "{") {
1894
+ templates[templates.length - 1] = 0;
1895
+ out += "${";
1896
+ i += 2;
1897
+ prevSig = "{";
1898
+ prevWord = "";
1899
+ wordOpen = false;
1900
+ continue;
1901
+ }
1902
+ out += ch;
1903
+ i++;
1904
+ continue;
1905
+ }
1906
+ if (ch === "/" && next === "/") {
1907
+ let j3 = i + 2;
1908
+ while (j3 < n && src[j3] !== "\n" && src[j3] !== "\r") j3++;
1909
+ out += " ";
1910
+ i = j3;
1911
+ wordOpen = false;
1912
+ continue;
1913
+ }
1914
+ if (ch === "/" && next === "*") {
1915
+ const end = src.indexOf("*/", i + 2);
1916
+ const body = end < 0 ? src.slice(i + 2) : src.slice(i + 2, end);
1917
+ const newlines = body.match(/\r\n|\r|\n/g);
1918
+ out += newlines ? newlines.join("") : " ";
1919
+ i = end < 0 ? n : end + 2;
1920
+ wordOpen = false;
1921
+ continue;
1922
+ }
1923
+ if (ch === "'" || ch === '"') {
1924
+ let j3 = i + 1;
1925
+ while (j3 < n && src[j3] !== ch && src[j3] !== "\n") j3 += src[j3] === "\\" ? 2 : 1;
1926
+ out += src.slice(i, Math.min(j3 + 1, n));
1927
+ i = j3 + 1;
1928
+ prevSig = ch;
1929
+ prevWord = "";
1930
+ wordOpen = false;
1931
+ continue;
1932
+ }
1933
+ if (ch === "`") {
1934
+ templates.push(-1);
1935
+ out += ch;
1936
+ i++;
1937
+ wordOpen = false;
1938
+ continue;
1939
+ }
1940
+ if (ch === "/" && regexMayFollow()) {
1941
+ let j3 = i + 1, inClass = false;
1942
+ while (j3 < n && src[j3] !== "\n") {
1943
+ const c2 = src[j3];
1944
+ if (c2 === "\\") {
1945
+ j3 += 2;
1946
+ continue;
1947
+ }
1948
+ if (c2 === "[") inClass = true;
1949
+ else if (c2 === "]") inClass = false;
1950
+ else if (c2 === "/" && !inClass) break;
1951
+ j3++;
1952
+ }
1953
+ if (j3 < n && src[j3] === "/") {
1954
+ j3++;
1955
+ while (j3 < n && /[A-Za-z]/.test(src[j3])) j3++;
1956
+ out += src.slice(i, j3);
1957
+ i = j3;
1958
+ prevSig = "/";
1959
+ prevWord = "";
1960
+ wordOpen = false;
1961
+ continue;
1962
+ }
1963
+ }
1964
+ if (top !== null && top >= 0) {
1965
+ if (ch === "{") templates[templates.length - 1] = top + 1;
1966
+ else if (ch === "}") {
1967
+ if (top === 0) {
1968
+ templates[templates.length - 1] = -1;
1969
+ out += ch;
1970
+ i++;
1971
+ continue;
1972
+ }
1973
+ templates[templates.length - 1] = top - 1;
1974
+ }
1975
+ }
1976
+ out += ch;
1977
+ i++;
1978
+ if (/\s/.test(ch)) {
1979
+ wordOpen = false;
1980
+ } else {
1981
+ if (/[A-Za-z0-9_$]/.test(ch)) {
1982
+ prevWord = wordOpen ? prevWord + ch : ch;
1983
+ wordOpen = true;
1984
+ } else {
1985
+ prevWord = "";
1986
+ wordOpen = false;
1987
+ }
1988
+ prevSig = ch;
1989
+ }
1990
+ }
1991
+ return out;
1992
+ }
1993
+
1851
1994
  // src/selection.ts
1852
1995
  function createMarkResolver(env) {
1853
1996
  const { root, doc, log } = env;
@@ -1872,7 +2015,7 @@ function createMarkResolver(env) {
1872
2015
  const so = parseFloat(el.getAttribute("stroke-opacity") || "1");
1873
2016
  return s === "transparent" || s === "none" || so <= 0.01;
1874
2017
  };
1875
- const distToPathCenterline = (el, x3, y5) => {
2018
+ const distToPathCenterline = (el, x4, y5) => {
1876
2019
  const L2 = el.getTotalLength();
1877
2020
  if (!(L2 > 0)) return Number.MAX_VALUE;
1878
2021
  const m2 = el.getScreenCTM();
@@ -1881,17 +2024,17 @@ function createMarkResolver(env) {
1881
2024
  const N2 = 64;
1882
2025
  for (let i = 0; i <= N2; i++) {
1883
2026
  const pt = el.getPointAtLength(L2 * i / N2);
1884
- const dx = m2.a * pt.x + m2.c * pt.y + m2.e - x3;
2027
+ const dx = m2.a * pt.x + m2.c * pt.y + m2.e - x4;
1885
2028
  const dy = m2.b * pt.x + m2.d * pt.y + m2.f - y5;
1886
2029
  const d2 = dx * dx + dy * dy;
1887
2030
  if (d2 < best) best = d2;
1888
2031
  }
1889
2032
  return Math.sqrt(best);
1890
2033
  };
1891
- const refineHitCorridor = (mark, x3, y5, sel) => {
2034
+ const refineHitCorridor = (mark, x4, y5, sel) => {
1892
2035
  try {
1893
2036
  if (!mark || !isInvisibleStrokePath(mark) || !mark.getAttribute("data-row-idx")) return mark;
1894
- const stack = doc.elementsFromPoint(x3, y5);
2037
+ const stack = doc.elementsFromPoint(x4, y5);
1895
2038
  const candidates = [];
1896
2039
  for (const el of stack) {
1897
2040
  if (!root.contains(el)) continue;
@@ -1905,7 +2048,7 @@ function createMarkResolver(env) {
1905
2048
  let best = mark;
1906
2049
  let bestD = Number.MAX_VALUE;
1907
2050
  for (const el of candidates) {
1908
- const d2 = distToPathCenterline(el, x3, y5);
2051
+ const d2 = distToPathCenterline(el, x4, y5);
1909
2052
  if (d2 < bestD) {
1910
2053
  bestD = d2;
1911
2054
  best = el;
@@ -1942,9 +2085,9 @@ function createMarkResolver(env) {
1942
2085
  }
1943
2086
  return out;
1944
2087
  };
1945
- const penetrateOverlayAt = (x3, y5, sel) => {
2088
+ const penetrateOverlayAt = (x4, y5, sel) => {
1946
2089
  try {
1947
- const stack = doc.elementsFromPoint(x3, y5);
2090
+ const stack = doc.elementsFromPoint(x4, y5);
1948
2091
  for (const el of stack) {
1949
2092
  if (!root.contains(el) || !isElement(el)) continue;
1950
2093
  const cand = el.matches(sel) ? el : el.closest(sel);
@@ -1956,7 +2099,7 @@ function createMarkResolver(env) {
1956
2099
  }
1957
2100
  return null;
1958
2101
  };
1959
- const resolveByGeometry = (x3, y5, sel) => {
2102
+ const resolveByGeometry = (x4, y5, sel) => {
1960
2103
  try {
1961
2104
  const cands = root.querySelectorAll(sel);
1962
2105
  let best = null, bestArea = Number.MAX_VALUE;
@@ -1965,7 +2108,7 @@ function createMarkResolver(env) {
1965
2108
  if (!el.getAttribute("data-row-idx")) continue;
1966
2109
  const r = el.getBoundingClientRect ? el.getBoundingClientRect() : null;
1967
2110
  if (!r || r.width <= 0 || r.height <= 0) continue;
1968
- if (x3 < r.left || x3 > r.right || y5 < r.top || y5 > r.bottom) continue;
2111
+ if (x4 < r.left || x4 > r.right || y5 < r.top || y5 > r.bottom) continue;
1969
2112
  const area = r.width * r.height;
1970
2113
  if (area < bestArea) {
1971
2114
  bestArea = area;
@@ -2201,9 +2344,9 @@ var VALUE_AXIS_MIN_FIT = 0.8;
2201
2344
  var MIN_AXIS_SPAN_PX = 40;
2202
2345
  var EMPTY4 = { marks: 0, axis: "", column: "", fit: 0, offShare: 0, medianOffRadii: 0 };
2203
2346
  function num(el, name) {
2204
- const v3 = el.getAttribute?.(name);
2205
- if (v3 === null || v3 === void 0 || String(v3).trim() === "") return NaN;
2206
- return parseFloat(String(v3));
2347
+ const v2 = el.getAttribute?.(name);
2348
+ if (v2 === null || v2 === void 0 || String(v2).trim() === "") return NaN;
2349
+ return parseFloat(String(v2));
2207
2350
  }
2208
2351
  function median(xs) {
2209
2352
  if (!xs.length) return NaN;
@@ -2211,15 +2354,15 @@ function median(xs) {
2211
2354
  const m2 = s.length >> 1;
2212
2355
  return s.length % 2 ? s[m2] : (s[m2 - 1] + s[m2]) / 2;
2213
2356
  }
2214
- function robustLine(v3, pos) {
2215
- const n = v3.length;
2357
+ function robustLine(v2, pos) {
2358
+ const n = v2.length;
2216
2359
  const step = Math.max(1, Math.floor(n / FIT_SAMPLE));
2217
2360
  const idx = [];
2218
2361
  for (let i = 0; i < n; i += step) idx.push(i);
2219
2362
  const slopes = [];
2220
2363
  for (let p2 = 0; p2 < idx.length; p2++) {
2221
2364
  for (let q4 = p2 + 1; q4 < idx.length; q4++) {
2222
- const dv = v3[idx[q4]] - v3[idx[p2]];
2365
+ const dv = v2[idx[q4]] - v2[idx[p2]];
2223
2366
  if (Math.abs(dv) < 1e-12) continue;
2224
2367
  slopes.push((pos[idx[q4]] - pos[idx[p2]]) / dv);
2225
2368
  }
@@ -2227,7 +2370,7 @@ function robustLine(v3, pos) {
2227
2370
  if (slopes.length < 3) return null;
2228
2371
  const b4 = median(slopes);
2229
2372
  if (!Number.isFinite(b4) || Math.abs(b4) < 1e-12) return null;
2230
- const a4 = median(pos.map((y5, i) => y5 - b4 * v3[i]));
2373
+ const a4 = median(pos.map((y5, i) => y5 - b4 * v2[i]));
2231
2374
  return Number.isFinite(a4) ? { a: a4, b: b4 } : null;
2232
2375
  }
2233
2376
  function censusValuePlacement(container, data) {
@@ -2245,40 +2388,40 @@ function censusValuePlacement(container, data) {
2245
2388
  if (!/^\d+$/.test(raw)) continue;
2246
2389
  const i = +raw;
2247
2390
  const row = rows[i];
2248
- const x3 = num(el, "cx"), y5 = num(el, "cy"), r = num(el, "r");
2249
- if (!row || !Number.isFinite(x3) || !Number.isFinite(y5) || !(r > 0)) continue;
2391
+ const x4 = num(el, "cx"), y5 = num(el, "cy"), r = num(el, "r");
2392
+ if (!row || !Number.isFinite(x4) || !Number.isFinite(y5) || !(r > 0)) continue;
2250
2393
  seen.add(i);
2251
- dots.push({ row, x: x3, y: y5, r });
2394
+ dots.push({ row, x: x4, y: y5, r });
2252
2395
  }
2253
2396
  if (dots.length < MIN_MARKS2 || seen.size < dots.length * 0.9) return EMPTY4;
2254
2397
  let best = null;
2255
2398
  for (let c2 = 0; c2 < columns.length; c2++) {
2256
2399
  if (/^__.*__$/.test(String(columns[c2]?.name ?? ""))) continue;
2257
2400
  const vals = dots.map((d2) => {
2258
- const v3 = d2.row[c2];
2259
- return v3 === null || v3 === void 0 || v3 === "" ? NaN : typeof v3 === "number" ? v3 : Number(v3);
2401
+ const v2 = d2.row[c2];
2402
+ return v2 === null || v2 === void 0 || v2 === "" ? NaN : typeof v2 === "number" ? v2 : Number(v2);
2260
2403
  });
2261
2404
  const finite = vals.filter(Number.isFinite);
2262
2405
  if (finite.length < dots.length * 0.9 || new Set(finite).size < 8) continue;
2263
- const logs = finite.every((v3) => v3 > 0) ? [false, true] : [false];
2406
+ const logs = finite.every((v2) => v2 > 0) ? [false, true] : [false];
2264
2407
  for (const log of logs) {
2265
2408
  for (const axis of ["x", "y"]) {
2266
2409
  const keep = [];
2267
- const v3 = [], pos = [];
2268
- dots.forEach((d2, k2) => {
2269
- if (!Number.isFinite(vals[k2])) return;
2270
- keep.push(k2);
2271
- v3.push(log ? Math.log10(vals[k2]) : vals[k2]);
2410
+ const v2 = [], pos = [];
2411
+ dots.forEach((d2, k3) => {
2412
+ if (!Number.isFinite(vals[k3])) return;
2413
+ keep.push(k3);
2414
+ v2.push(log ? Math.log10(vals[k3]) : vals[k3]);
2272
2415
  pos.push(axis === "x" ? d2.x : d2.y);
2273
2416
  });
2274
- const line = robustLine(v3, pos);
2417
+ const line = robustLine(v2, pos);
2275
2418
  if (!line) continue;
2276
2419
  const lo = Math.min(...pos), hi = Math.max(...pos);
2277
2420
  if (hi - lo < MIN_AXIS_SPAN_PX) continue;
2278
2421
  const mean = pos.reduce((s, p2) => s + p2, 0) / pos.length;
2279
2422
  let ssRes = 0, ssTot = 0;
2280
- const res = pos.map((p2, k2) => {
2281
- const e = p2 - (line.a + line.b * v3[k2]);
2423
+ const res = pos.map((p2, k3) => {
2424
+ const e = p2 - (line.a + line.b * v2[k3]);
2282
2425
  ssRes += e * e;
2283
2426
  ssTot += (p2 - mean) ** 2;
2284
2427
  return e;
@@ -2287,8 +2430,8 @@ function censusValuePlacement(container, data) {
2287
2430
  const fit = 1 - ssRes / ssTot;
2288
2431
  if (fit >= VALUE_AXIS_MIN_FIT && (!best || fit > best.fit)) {
2289
2432
  const full = new Array(dots.length).fill(NaN);
2290
- keep.forEach((k2, j2) => {
2291
- full[k2] = res[j2];
2433
+ keep.forEach((k3, j3) => {
2434
+ full[k3] = res[j3];
2292
2435
  });
2293
2436
  best = { col: c2, axis, fit, res: full, log };
2294
2437
  }
@@ -2298,8 +2441,8 @@ function censusValuePlacement(container, data) {
2298
2441
  if (!best) return EMPTY4;
2299
2442
  let off = 0, measured = 0;
2300
2443
  const radii = [];
2301
- dots.forEach((d2, k2) => {
2302
- const e = best.res[k2];
2444
+ dots.forEach((d2, k3) => {
2445
+ const e = best.res[k3];
2303
2446
  if (!Number.isFinite(e)) return;
2304
2447
  measured++;
2305
2448
  const inRadii = Math.abs(e) / Math.max(d2.r, 1);
@@ -2339,12 +2482,12 @@ function contentExtentOf(boxes) {
2339
2482
  if (usable.length === 0) return { w: 0, h: 0, source: "none" };
2340
2483
  const inFlow = usable.filter((b4) => !b4.floating);
2341
2484
  const counted = inFlow.length > 0 ? inFlow : usable;
2342
- let w2 = 0, h4 = 0;
2485
+ let w2 = 0, h3 = 0;
2343
2486
  for (const b4 of counted) {
2344
2487
  if (b4.right > w2) w2 = b4.right;
2345
- if (b4.bottom > h4) h4 = b4.bottom;
2488
+ if (b4.bottom > h3) h3 = b4.bottom;
2346
2489
  }
2347
- return { w: w2, h: h4, source: inFlow.length > 0 ? "in-flow" : "all-floating" };
2490
+ return { w: w2, h: h3, source: inFlow.length > 0 ? "in-flow" : "all-floating" };
2348
2491
  }
2349
2492
  function scrollFitFor(contentW, contentH, viewportW, viewportH, slackPx = SCROLL_SLACK_PX) {
2350
2493
  return {
@@ -2354,8 +2497,8 @@ function scrollFitFor(contentW, contentH, viewportW, viewportH, slackPx = SCROLL
2354
2497
  }
2355
2498
  var FIT_CONTENT_SELECTOR = "text, .d3-mark, .d3-legend-mark";
2356
2499
  var PHANTOM_FRACTION = 0.95;
2357
- function isPhantomBox(w2, h4, refW, refH) {
2358
- return w2 > refW * PHANTOM_FRACTION || h4 > refH * PHANTOM_FRACTION;
2500
+ function isPhantomBox(w2, h3, refW, refH) {
2501
+ return w2 > refW * PHANTOM_FRACTION || h3 > refH * PHANTOM_FRACTION;
2359
2502
  }
2360
2503
  var MAX_FRAME_GROW_FACTOR = 20;
2361
2504
  function planFrameGrow(inkBottomPx, elHeightPx, viewBoxH, ctmScale, slackPx = SCROLL_SLACK_PX, maxFactor = MAX_FRAME_GROW_FACTOR) {
@@ -2654,8 +2797,8 @@ function pinScrolledAxis(container, svg) {
2654
2797
  }
2655
2798
  const pinSvg = doc.createElementNS(SVG_NS2, "svg");
2656
2799
  for (const a4 of ["font-family", "font-size", "font-weight", "font", "fill", "color", "text-rendering"]) {
2657
- const v3 = svg.getAttribute(a4);
2658
- if (v3) pinSvg.setAttribute(a4, v3);
2800
+ const v2 = svg.getAttribute(a4);
2801
+ if (v2) pinSvg.setAttribute(a4, v2);
2659
2802
  }
2660
2803
  const styles = svg.querySelectorAll("style");
2661
2804
  for (let i = 0; i < styles.length; i++) pinSvg.appendChild(styles[i].cloneNode(true));
@@ -2836,10 +2979,10 @@ function parseRGBA(c2) {
2836
2979
  const s = c2.trim();
2837
2980
  const m2 = s.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);
2838
2981
  if (m2) return [parseFloat(m2[1]), parseFloat(m2[2]), parseFloat(m2[3]), m2[4] !== void 0 ? parseFloat(m2[4]) : 1];
2839
- let h4 = s.replace(/^#/, "");
2840
- if (h4.length === 3) h4 = h4.split("").map((ch) => ch + ch).join("");
2841
- if (h4.length === 6 && /^[0-9a-fA-F]{6}$/.test(h4)) {
2842
- return [parseInt(h4.slice(0, 2), 16), parseInt(h4.slice(2, 4), 16), parseInt(h4.slice(4, 6), 16), 1];
2982
+ let h3 = s.replace(/^#/, "");
2983
+ if (h3.length === 3) h3 = h3.split("").map((ch) => ch + ch).join("");
2984
+ if (h3.length === 6 && /^[0-9a-fA-F]{6}$/.test(h3)) {
2985
+ return [parseInt(h3.slice(0, 2), 16), parseInt(h3.slice(2, 4), 16), parseInt(h3.slice(4, 6), 16), 1];
2843
2986
  }
2844
2987
  return null;
2845
2988
  }
@@ -2874,8 +3017,8 @@ var NAMED = {
2874
3017
  };
2875
3018
  function toRGBA(c2) {
2876
3019
  if (typeof c2 !== "string") return null;
2877
- const k2 = c2.trim().toLowerCase();
2878
- if (k2 in NAMED) return NAMED[k2];
3020
+ const k3 = c2.trim().toLowerCase();
3021
+ if (k3 in NAMED) return NAMED[k3];
2879
3022
  return parseRGBA(c2);
2880
3023
  }
2881
3024
  function compositeOver(fg, bg) {
@@ -2887,8 +3030,8 @@ function compositeOver(fg, bg) {
2887
3030
  ];
2888
3031
  }
2889
3032
  function relativeLuminance(rgb) {
2890
- const lin = rgb.map((v3) => {
2891
- const s = v3 / 255;
3033
+ const lin = rgb.map((v2) => {
3034
+ const s = v2 / 255;
2892
3035
  return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
2893
3036
  });
2894
3037
  return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2];
@@ -2925,20 +3068,20 @@ var GLYPH_SAMPLE_N = 3;
2925
3068
  function glyphSampleGrid(box, n = GLYPH_SAMPLE_N) {
2926
3069
  const out = [];
2927
3070
  if (!box || !(box.width > 0) || !(box.height > 0) || !(n >= 1)) return out;
2928
- const k2 = Math.floor(n);
2929
- for (let i = 0; i < k2; i++) {
2930
- for (let j2 = 0; j2 < k2; j2++) {
3071
+ const k3 = Math.floor(n);
3072
+ for (let i = 0; i < k3; i++) {
3073
+ for (let j3 = 0; j3 < k3; j3++) {
2931
3074
  out.push({
2932
- x: box.left + box.width * (i + 0.5) / k2,
2933
- y: box.top + box.height * (j2 + 0.5) / k2
3075
+ x: box.left + box.width * (i + 0.5) / k3,
3076
+ y: box.top + box.height * (j3 + 0.5) / k3
2934
3077
  });
2935
3078
  }
2936
3079
  }
2937
3080
  return out;
2938
3081
  }
2939
- function clamp01(v3) {
2940
- if (typeof v3 !== "number" || !isFinite(v3)) return 1;
2941
- return Math.max(0, Math.min(1, v3));
3082
+ function clamp01(v2) {
3083
+ if (typeof v2 !== "number" || !isFinite(v2)) return 1;
3084
+ return Math.max(0, Math.min(1, v2));
2942
3085
  }
2943
3086
  function hexToRGB(hex2) {
2944
3087
  const p2 = toRGBA(hex2);
@@ -3054,31 +3197,31 @@ function applyLabelContrast(container, opts = {}) {
3054
3197
  const glyphArea = tr.width * tr.height;
3055
3198
  const txRoot = paintRoot(tx, container);
3056
3199
  let over = 0;
3057
- const boxed = rects.map((mk) => ({ mk, ov: ovArea(mk.r) })).filter((x3) => {
3058
- if (!(x3.ov > 0)) return false;
3059
- if (drawnBeneath(x3.mk, tx, txRoot)) return true;
3060
- if (effAlpha(x3.mk) >= PILL_MIN_ALPHA) over++;
3200
+ const boxed = rects.map((mk) => ({ mk, ov: ovArea(mk.r) })).filter((x4) => {
3201
+ if (!(x4.ov > 0)) return false;
3202
+ if (drawnBeneath(x4.mk, tx, txRoot)) return true;
3203
+ if (effAlpha(x4.mk) >= PILL_MIN_ALPHA) over++;
3061
3204
  return false;
3062
3205
  });
3063
3206
  if (over > 0) report.paintedOver++;
3064
3207
  const pts = glyphSampleGrid({ left: tr.left, top: tr.top, width: tr.width, height: tr.height });
3065
3208
  const painted = pts.map(() => false);
3066
3209
  let unmeasured = 0;
3067
- const under = boxed.map((x3) => {
3068
- const mask = backedSamples(x3.mk.el, pts);
3210
+ const under = boxed.map((x4) => {
3211
+ const mask = backedSamples(x4.mk.el, pts);
3069
3212
  if (mask === null) {
3070
3213
  unmeasured++;
3071
- return x3;
3214
+ return x4;
3072
3215
  }
3073
3216
  let inside = 0;
3074
- const paints = effAlpha(x3.mk) >= PILL_MIN_ALPHA;
3217
+ const paints = effAlpha(x4.mk) >= PILL_MIN_ALPHA;
3075
3218
  for (let i = 0; i < mask.length; i++) {
3076
3219
  if (!mask[i]) continue;
3077
3220
  inside++;
3078
3221
  if (paints) painted[i] = true;
3079
3222
  }
3080
- return { mk: x3.mk, ov: glyphArea * (inside / mask.length) };
3081
- }).filter((x3) => x3.ov > 0);
3223
+ return { mk: x4.mk, ov: glyphArea * (inside / mask.length) };
3224
+ }).filter((x4) => x4.ov > 0);
3082
3225
  if (under.length === 0 && boxed.length > 0) report.offFill++;
3083
3226
  if (under.length === 0) continue;
3084
3227
  if (unmeasured === 0 && pts.length > 0) {
@@ -3090,10 +3233,10 @@ function applyLabelContrast(container, opts = {}) {
3090
3233
  }
3091
3234
  }
3092
3235
  report.scanned++;
3093
- const opaqueUnder = under.filter((x3) => effAlpha(x3.mk) >= PILL_OPAQUE_ALPHA);
3236
+ const opaqueUnder = under.filter((x4) => effAlpha(x4.mk) >= PILL_OPAQUE_ALPHA);
3094
3237
  const cellEntry = (opaqueUnder.length ? opaqueUnder : under).reduce((a4, b4) => b4.ov > a4.ov || b4.ov === a4.ov && b4.mk.ord > a4.mk.ord ? b4 : a4);
3095
3238
  const cell = cellEntry.mk;
3096
- const pill = under.find((x3) => x3.mk !== cell && isPillBackdropAlpha(effAlpha(x3.mk)) && x3.mk.ord > cell.ord && pillBacksGlyph(x3.ov, glyphArea))?.mk;
3239
+ const pill = under.find((x4) => x4.mk !== cell && isPillBackdropAlpha(effAlpha(x4.mk)) && x4.mk.ord > cell.ord && pillBacksGlyph(x4.ov, glyphArea))?.mk;
3097
3240
  const cellRGBA = toRGBA(cell.fill);
3098
3241
  let bgRGB = cellRGBA ? compositeOver([cellRGBA[0], cellRGBA[1], cellRGBA[2], cellRGBA[3] * cell.op], pageRGB) : pageRGB;
3099
3242
  if (pill) {
@@ -3145,7 +3288,7 @@ function sessionViewStateProvider(container) {
3145
3288
  load: () => store,
3146
3289
  save: (next) => {
3147
3290
  if (!next || typeof next !== "object") return;
3148
- for (const k2 of Object.keys(store)) delete store[k2];
3291
+ for (const k3 of Object.keys(store)) delete store[k3];
3149
3292
  Object.assign(store, next);
3150
3293
  }
3151
3294
  };
@@ -3154,7 +3297,7 @@ function noopViewStateProvider() {
3154
3297
  return { load: () => ({}), save: () => {
3155
3298
  } };
3156
3299
  }
3157
- var parseRowIdxs = (s) => (s || "").split(",").map((x3) => parseInt(x3, 10)).filter((n) => Number.isFinite(n));
3300
+ var parseRowIdxs = (s) => (s || "").split(",").map((x4) => parseInt(x4, 10)).filter((n) => Number.isFinite(n));
3158
3301
  var D3_PLUGIN_PACKAGES = {
3159
3302
  sankey: "d3-sankey",
3160
3303
  sankeyLinkHorizontal: "d3-sankey",
@@ -3184,9 +3327,15 @@ var D3_PLUGIN_PACKAGES = {
3184
3327
  };
3185
3328
  function requiredD3Plugins(code) {
3186
3329
  const out = /* @__PURE__ */ new Set();
3187
- for (const m2 of String(code || "").matchAll(/\bd3\s*\.\s*(\w+)\s*[.(]/g)) {
3188
- const pkg = D3_PLUGIN_PACKAGES[m2[1]];
3330
+ const body = stripJsComments(String(code || ""));
3331
+ const add = (name) => {
3332
+ const pkg = D3_PLUGIN_PACKAGES[name];
3189
3333
  if (pkg) out.add(pkg);
3334
+ };
3335
+ for (const m2 of body.matchAll(/\bd3\s*\.\s*(\w+)/g)) add(m2[1]);
3336
+ for (const m2 of body.matchAll(/\bd3\s*\[\s*['"](\w+)['"]\s*\]/g)) add(m2[1]);
3337
+ for (const m2 of body.matchAll(/\{([^{}]*)\}\s*=\s*d3\b/g)) {
3338
+ for (const part of m2[1].split(",")) add(part.split(":")[0].trim());
3190
3339
  }
3191
3340
  return [...out].sort();
3192
3341
  }
@@ -3239,7 +3388,7 @@ function compileRenderFn(code, win, doc, d3) {
3239
3388
  return fn;
3240
3389
  }
3241
3390
  var ASYNC_RENDER_TIMEOUT_MS = 15e3;
3242
- var isThenable = (v3) => !!v3 && (typeof v3 === "object" || typeof v3 === "function") && typeof v3.then === "function";
3391
+ var isThenable = (v2) => !!v2 && (typeof v2 === "object" || typeof v2 === "function") && typeof v2.then === "function";
3243
3392
  function createChartHost(container, config) {
3244
3393
  const doc = container.ownerDocument;
3245
3394
  const win = doc?.defaultView ?? globalThis;
@@ -3247,7 +3396,7 @@ function createChartHost(container, config) {
3247
3396
  let data = config.data;
3248
3397
  {
3249
3398
  const stamped = config.data?.meta?.hostContract;
3250
- const major = (v3) => (v3 || "").split(".")[0];
3399
+ const major = (v2) => (v2 || "").split(".")[0];
3251
3400
  if (stamped && major(stamped) !== major(HOST_CONTRACT_VERSION)) {
3252
3401
  try {
3253
3402
  (win?.console ?? console)?.warn(
@@ -3669,6 +3818,8 @@ export {
3669
3818
  CONTAINER_SLOT_XF_CLEAR,
3670
3819
  CONTAINER_SLOT_INITIAL_XF_MARK,
3671
3820
  CONTAINER_SLOT_UI_STATE,
3821
+ VIEW_ONLY_UI_STATE_KEYS,
3822
+ withoutViewOnlyKeys,
3672
3823
  HOST_CONTAINER_CLASS,
3673
3824
  SELECTION_ACTIVE_CLASS,
3674
3825
  MARK_SELECTED_CLASS,
@@ -3720,6 +3871,7 @@ export {
3720
3871
  Xt,
3721
3872
  qt,
3722
3873
  buildRenderPayload,
3874
+ stripJsComments,
3723
3875
  createMarkResolver,
3724
3876
  ensureCrossfilterHitTargets,
3725
3877
  censusMarks,