@reportwright/viewer 0.0.0-stage → 0.11.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 (96) hide show
  1. package/CHANGELOG.md +206 -0
  2. package/LICENSE +23 -0
  3. package/README.md +146 -2
  4. package/dist/chunk-2NAW3MAP.js +1284 -0
  5. package/dist/chunk-2NAW3MAP.js.map +6 -0
  6. package/dist/chunk-3D43XGIN.js +1167 -0
  7. package/dist/chunk-3D43XGIN.js.map +6 -0
  8. package/dist/chunk-66QZ3RDV.js +1661 -0
  9. package/dist/chunk-66QZ3RDV.js.map +6 -0
  10. package/dist/chunk-72S6DETS.js +40 -0
  11. package/dist/chunk-72S6DETS.js.map +6 -0
  12. package/dist/chunk-AH47FS6Y.js +13 -0
  13. package/dist/chunk-AH47FS6Y.js.map +6 -0
  14. package/dist/chunk-APRPSQOD.js +301 -0
  15. package/dist/chunk-APRPSQOD.js.map +6 -0
  16. package/dist/chunk-BXKUE45K.js +1284 -0
  17. package/dist/chunk-BXKUE45K.js.map +6 -0
  18. package/dist/chunk-D2NTLAKL.js +14 -0
  19. package/dist/chunk-D2NTLAKL.js.map +6 -0
  20. package/dist/chunk-E7INJHTL.js +1284 -0
  21. package/dist/chunk-E7INJHTL.js.map +6 -0
  22. package/dist/chunk-FGEFSGJT.js +1284 -0
  23. package/dist/chunk-FGEFSGJT.js.map +6 -0
  24. package/dist/chunk-GJS242RR.js +1652 -0
  25. package/dist/chunk-GJS242RR.js.map +6 -0
  26. package/dist/chunk-HAMBWF6C.js +20682 -0
  27. package/dist/chunk-HAMBWF6C.js.map +6 -0
  28. package/dist/chunk-J56FRCFU.js +1284 -0
  29. package/dist/chunk-J56FRCFU.js.map +6 -0
  30. package/dist/chunk-KJTRZJHN.js +599 -0
  31. package/dist/chunk-KJTRZJHN.js.map +6 -0
  32. package/dist/chunk-N5WHQ4DM.js +153 -0
  33. package/dist/chunk-N5WHQ4DM.js.map +6 -0
  34. package/dist/chunk-NJWQT6VB.js +1284 -0
  35. package/dist/chunk-NJWQT6VB.js.map +6 -0
  36. package/dist/chunk-ODREGGKA.js +219 -0
  37. package/dist/chunk-ODREGGKA.js.map +6 -0
  38. package/dist/chunk-OLLMACWA.js +35 -0
  39. package/dist/chunk-OLLMACWA.js.map +6 -0
  40. package/dist/chunk-PXXMOP4N.js +1284 -0
  41. package/dist/chunk-PXXMOP4N.js.map +6 -0
  42. package/dist/chunk-RKGIVPK5.js +1284 -0
  43. package/dist/chunk-RKGIVPK5.js.map +6 -0
  44. package/dist/chunk-RYHJUQSV.js +98 -0
  45. package/dist/chunk-RYHJUQSV.js.map +6 -0
  46. package/dist/chunk-SBD55ZES.js +316 -0
  47. package/dist/chunk-SBD55ZES.js.map +6 -0
  48. package/dist/chunk-SR2TQ2ZK.js +70 -0
  49. package/dist/chunk-SR2TQ2ZK.js.map +6 -0
  50. package/dist/chunk-WQOBRZAL.js +14777 -0
  51. package/dist/chunk-WQOBRZAL.js.map +6 -0
  52. package/dist/designer.d.ts +48 -0
  53. package/dist/designer.js +35865 -0
  54. package/dist/designer.js.map +6 -0
  55. package/dist/peer/chunk-2NJMXASD.js +1282 -0
  56. package/dist/peer/chunk-2NJMXASD.js.map +6 -0
  57. package/dist/peer/chunk-5X4ZSSJT.js +1660 -0
  58. package/dist/peer/chunk-5X4ZSSJT.js.map +6 -0
  59. package/dist/peer/chunk-6YO42ALN.js +14777 -0
  60. package/dist/peer/chunk-6YO42ALN.js.map +6 -0
  61. package/dist/peer/chunk-76ZABVTI.js +598 -0
  62. package/dist/peer/chunk-76ZABVTI.js.map +6 -0
  63. package/dist/peer/chunk-776OR56A.js +6040 -0
  64. package/dist/peer/chunk-776OR56A.js.map +6 -0
  65. package/dist/peer/chunk-BPF3SLL4.js +1282 -0
  66. package/dist/peer/chunk-BPF3SLL4.js.map +6 -0
  67. package/dist/peer/chunk-BWVDLOVL.js +1282 -0
  68. package/dist/peer/chunk-BWVDLOVL.js.map +6 -0
  69. package/dist/peer/chunk-CXM3YSWF.js +1282 -0
  70. package/dist/peer/chunk-CXM3YSWF.js.map +6 -0
  71. package/dist/peer/chunk-DQFZ6LVB.js +1282 -0
  72. package/dist/peer/chunk-DQFZ6LVB.js.map +6 -0
  73. package/dist/peer/chunk-EKWTFHVE.js +152 -0
  74. package/dist/peer/chunk-EKWTFHVE.js.map +6 -0
  75. package/dist/peer/chunk-IMQRHDR4.js +12 -0
  76. package/dist/peer/chunk-IMQRHDR4.js.map +6 -0
  77. package/dist/peer/chunk-IPU2YRL2.js +300 -0
  78. package/dist/peer/chunk-IPU2YRL2.js.map +6 -0
  79. package/dist/peer/chunk-M4AGFUWE.js +97 -0
  80. package/dist/peer/chunk-M4AGFUWE.js.map +6 -0
  81. package/dist/peer/chunk-PG2PNYDX.js +1282 -0
  82. package/dist/peer/chunk-PG2PNYDX.js.map +6 -0
  83. package/dist/peer/chunk-QRAJXW2D.js +1282 -0
  84. package/dist/peer/chunk-QRAJXW2D.js.map +6 -0
  85. package/dist/peer/chunk-SHVCNAUG.js +1282 -0
  86. package/dist/peer/chunk-SHVCNAUG.js.map +6 -0
  87. package/dist/peer/chunk-Y5CAHLXS.js +218 -0
  88. package/dist/peer/chunk-Y5CAHLXS.js.map +6 -0
  89. package/dist/peer/designer.js +35841 -0
  90. package/dist/peer/designer.js.map +6 -0
  91. package/dist/peer/viewer.js +1061 -0
  92. package/dist/peer/viewer.js.map +6 -0
  93. package/dist/viewer.d.ts +77 -0
  94. package/dist/viewer.js +1066 -0
  95. package/dist/viewer.js.map +6 -0
  96. package/package.json +76 -4
@@ -0,0 +1,1652 @@
1
+ // src/engine/expr/parser.js
2
+ var ExprError = class extends Error {
3
+ /** @param {string} msg @param {number} [pos] @param {string} [src] */
4
+ constructor(msg, pos, src) {
5
+ super(pos != null ? `${msg} (at ${pos + 1})` : msg);
6
+ this.pos = pos;
7
+ this.src = src;
8
+ }
9
+ };
10
+ var MAX_TEXT = 1e6;
11
+ var capText = (fname, n) => {
12
+ if (n > MAX_TEXT) throw new ExprError(`${fname}: the result would be longer than 1,000,000 characters`);
13
+ };
14
+ var MAX_PATTERN = 1e3;
15
+ var MAX_DIGITS = 340;
16
+ var capPattern = (fname, pat) => {
17
+ if (pat.length > MAX_PATTERN) throw new ExprError(`${fname}: a format longer than ${MAX_PATTERN} characters`);
18
+ };
19
+ var capDigits = (fname, n) => {
20
+ if (n > MAX_DIGITS) throw new ExprError(`${fname}: ${n} digits is more than ${MAX_DIGITS}`);
21
+ };
22
+ var OPS = ["<>", "<=", ">=", "==", "!=", "&&", "||", "+", "-", "*", "/", "%", "&", "=", "<", ">", "(", ")", ",", ".", "!", "[", "]", "?", ":", "^", "\\"];
23
+ var KEYWORDS = /* @__PURE__ */ new Set(["and", "or", "not", "true", "false", "null", "nothing", "mod", "is", "isnot", "xor", "andalso", "orelse"]);
24
+ function lex(src) {
25
+ const toks = [];
26
+ let i = 0;
27
+ while (i < src.length) {
28
+ const c = src[i];
29
+ if (/\s/.test(c)) {
30
+ i++;
31
+ continue;
32
+ }
33
+ if (/[0-9]/.test(c) || c === "." && /[0-9]/.test(src[i + 1] || "")) {
34
+ let j = i;
35
+ while (j < src.length && /[0-9.]/.test(src[j])) j++;
36
+ if (/[eE]/.test(src[j] || "") && /[-+0-9]/.test(src[j + 1] || "")) {
37
+ j += 2;
38
+ while (/[0-9]/.test(src[j] || "")) j++;
39
+ }
40
+ const n = Number(src.slice(i, j));
41
+ if (Number.isNaN(n)) throw new ExprError(`Bad number "${src.slice(i, j)}"`, i, src);
42
+ toks.push({ t: "num", v: n, p: i });
43
+ i = j;
44
+ continue;
45
+ }
46
+ if (c === '"' || c === "'") {
47
+ let j = i + 1, s = "";
48
+ while (j < src.length && src[j] !== c) {
49
+ if (src[j] === "\\" && j + 1 < src.length) {
50
+ s += src[j + 1];
51
+ j += 2;
52
+ continue;
53
+ }
54
+ s += src[j++];
55
+ }
56
+ if (j >= src.length) throw new ExprError("A string has no closing quote", i, src);
57
+ toks.push({ t: "str", v: s, p: i });
58
+ i = j + 1;
59
+ continue;
60
+ }
61
+ if (/[A-Za-z_$]/.test(c)) {
62
+ let j = i;
63
+ while (j < src.length && /[A-Za-z0-9_$]/.test(src[j])) j++;
64
+ const w = src.slice(i, j);
65
+ toks.push(KEYWORDS.has(w.toLowerCase()) ? { t: "kw", v: w.toLowerCase(), p: i } : { t: "id", v: w, p: i });
66
+ i = j;
67
+ continue;
68
+ }
69
+ const op = OPS.find((o) => src.startsWith(o, i));
70
+ if (op) {
71
+ toks.push({ t: "op", v: op, p: i });
72
+ i += op.length;
73
+ continue;
74
+ }
75
+ throw new ExprError(`Unexpected character "${c}"`, i, src);
76
+ }
77
+ toks.push({ t: "eof", v: "", p: src.length });
78
+ return toks;
79
+ }
80
+ var BIN = {
81
+ "or": 1,
82
+ "||": 1,
83
+ "orelse": 1,
84
+ "xor": 1,
85
+ "and": 2,
86
+ "&&": 2,
87
+ "andalso": 2,
88
+ "=": 4,
89
+ "==": 4,
90
+ "<>": 4,
91
+ "!=": 4,
92
+ "<": 4,
93
+ "<=": 4,
94
+ ">": 4,
95
+ ">=": 4,
96
+ "is": 4,
97
+ "isnot": 4,
98
+ "&": 5,
99
+ "+": 6,
100
+ "-": 6,
101
+ // VB: Mod below \ below * and /, all above + -; ^ above unary minus (-2 ^ 2 is -4), left to right (2 ^ 3 ^ 2 is 64)
102
+ "mod": 6.4,
103
+ "\\": 6.7,
104
+ "*": 7,
105
+ "/": 7,
106
+ "%": 7,
107
+ "^": 8.5
108
+ };
109
+ function parse(src) {
110
+ const toks = lex(src);
111
+ let k = 0;
112
+ const peek = () => toks[k];
113
+ const next = () => toks[k++];
114
+ const expect = (v) => {
115
+ const t = next();
116
+ if (t.v !== v) throw new ExprError(`Expected "${v}" but found "${t.v || "end"}"`, t.p, src);
117
+ return t;
118
+ };
119
+ const lbp = (t) => {
120
+ if (t.t === "op" && (t.v === "." || t.v === "[")) return 9;
121
+ if (t.t === "op" && t.v === "(") return 9;
122
+ if (t.t === "op" && t.v === "?") return 0.5;
123
+ if ((t.t === "op" || t.t === "kw") && BIN[t.v] != null) return BIN[t.v];
124
+ return 0;
125
+ };
126
+ function callArgs() {
127
+ const args = [];
128
+ if (peek().v !== ")") {
129
+ do {
130
+ args.push(expr(0));
131
+ } while (peek().v === "," && next());
132
+ }
133
+ expect(")");
134
+ return args;
135
+ }
136
+ function nud() {
137
+ const t = next();
138
+ if (t.t === "num" || t.t === "str") return { type: "lit", v: t.v };
139
+ if (t.t === "kw") {
140
+ if (t.v === "true") return { type: "lit", v: true };
141
+ if (t.v === "false") return { type: "lit", v: false };
142
+ if (t.v === "null" || t.v === "nothing") return { type: "lit", v: null };
143
+ if (t.v === "not") return { type: "unary", op: "not", arg: expr(3) };
144
+ }
145
+ if (t.t === "id") {
146
+ if (peek().v === "(") {
147
+ next();
148
+ return { type: "call", name: t.v, args: callArgs(), p: t.p };
149
+ }
150
+ return { type: "id", name: t.v, p: t.p };
151
+ }
152
+ if (t.t === "op") {
153
+ if (t.v === "(") {
154
+ const e = expr(0);
155
+ expect(")");
156
+ return e;
157
+ }
158
+ if (t.v === "-") return { type: "unary", op: "neg", arg: expr(8) };
159
+ if (t.v === "+") return expr(8);
160
+ if (t.v === "!") return { type: "unary", op: "not", arg: expr(8) };
161
+ }
162
+ throw new ExprError(t.t === "eof" ? "The expression ends too early" : `Unexpected "${t.v}"`, t.p, src);
163
+ }
164
+ function led(left) {
165
+ const t = next();
166
+ if (t.v === ".") {
167
+ const id = next();
168
+ if (id.t !== "id" && id.t !== "kw") throw new ExprError('Expected a name after "."', id.p, src);
169
+ if (peek().v === "(") {
170
+ next();
171
+ return { type: "call", name: id.v, args: callArgs(), p: id.p, obj: left };
172
+ }
173
+ return { type: "member", obj: left, prop: id.v };
174
+ }
175
+ if (t.v === "[") {
176
+ const e = expr(0);
177
+ expect("]");
178
+ return { type: "index", obj: left, key: e };
179
+ }
180
+ if (t.v === "(") {
181
+ const args = callArgs();
182
+ if (args.length !== 1) throw new ExprError('An index needs one value: Split(s, ",")(1)', t.p, src);
183
+ return { type: "index", obj: left, key: args[0] };
184
+ }
185
+ if (t.v === "?") {
186
+ const a = expr(0);
187
+ expect(":");
188
+ const b = expr(0);
189
+ return { type: "cond", test: left, a, b };
190
+ }
191
+ return { type: "bin", op: t.v, a: left, b: expr(BIN[t.v]) };
192
+ }
193
+ function expr(rbp) {
194
+ let left = nud();
195
+ while (rbp < lbp(peek())) left = led(left);
196
+ return left;
197
+ }
198
+ const ast = expr(0);
199
+ if (peek().t !== "eof") throw new ExprError(`Unexpected "${peek().v}"`, peek().p, src);
200
+ return ast;
201
+ }
202
+
203
+ // src/engine/expr/javafmt.js
204
+ var cache = /* @__PURE__ */ new Map();
205
+ var memo = (key, make) => {
206
+ let v = cache.get(key);
207
+ if (v === void 0) {
208
+ v = make();
209
+ if (cache.size >= 500) cache.clear();
210
+ cache.set(key, v);
211
+ }
212
+ return v;
213
+ };
214
+ function symbols(locale) {
215
+ return memo(`s${locale}`, () => {
216
+ const s = { digits: "0123456789", dec: ".", grp: ",", minus: "-", percent: "%", exp: "E", expMinus: "-", inf: "∞", nan: "NaN", perMille: "‰", latnDec: "." };
217
+ try {
218
+ const nf2 = new Intl.NumberFormat(locale, { useGrouping: false });
219
+ s.digits = [..."0123456789"].map((d) => nf2.format(Number(d))).join("");
220
+ const BIDI = /^[\u061c\u200e\u200f]+$/;
221
+ const parts = (f, v) => f.formatToParts(v);
222
+ const signed = (ps, type) => {
223
+ const i = ps.findIndex((p) => p.type === type);
224
+ if (i < 0) return null;
225
+ return (i > 0 && BIDI.test(ps[i - 1].value) ? ps[i - 1].value : "") + ps[i].value + (BIDI.test(ps[i + 1]?.value || "") ? ps[i + 1].value : "");
226
+ };
227
+ const np = parts(new Intl.NumberFormat(locale), -12345.5);
228
+ for (const p of np) {
229
+ if (p.type === "decimal") s.dec = p.value;
230
+ else if (p.type === "group") s.grp = p.value;
231
+ }
232
+ s.minus = signed(np, "minusSign") ?? "-";
233
+ s.percent = signed(parts(new Intl.NumberFormat(locale, { style: "percent" }), 0.5), "percentSign") ?? "%";
234
+ const ep = parts(new Intl.NumberFormat(locale, { notation: "scientific" }), -15e-6);
235
+ s.exp = ep.find((p) => p.type === "exponentSeparator")?.value ?? "E";
236
+ s.expMinus = signed(ep, "exponentMinusSign") ?? "-";
237
+ s.inf = nf2.format(Infinity);
238
+ s.nan = nf2.format(NaN);
239
+ for (const p of new Intl.NumberFormat(locale, { numberingSystem: "latn" }).formatToParts(1.5)) if (p.type === "decimal") s.latnDec = p.value;
240
+ if (s.digits[0] === "٠") s.perMille = "؉";
241
+ } catch {
242
+ }
243
+ if (s.digits.length !== 10) s.digits = "0123456789";
244
+ return s;
245
+ });
246
+ }
247
+ var localDigits = (str, sy) => sy.digits === "0123456789" ? str : str.replace(/[0-9]/g, (d) => sy.digits[Number(d)]);
248
+ function currency(locale, iso) {
249
+ return memo(`c${locale}${iso}`, () => {
250
+ try {
251
+ const f = new Intl.NumberFormat(locale, { style: "currency", currency: iso });
252
+ const ps = f.formatToParts(1), i = ps.findIndex((p) => p.type === "currency");
253
+ const sym = i < 0 ? iso : ps[i].value + (/^[\u200e\u200f\u061c]+$/.test(ps[i + 1]?.value || "") ? ps[i + 1].value : "");
254
+ return { sym, iso, digits: f.resolvedOptions().maximumFractionDigits ?? 2 };
255
+ } catch {
256
+ return { sym: iso, iso, digits: 2 };
257
+ }
258
+ });
259
+ }
260
+ function exact(x) {
261
+ if (x === 0) return { M: 0n, s: 0 };
262
+ const dv = new DataView(new ArrayBuffer(8));
263
+ dv.setFloat64(0, x);
264
+ const hi = dv.getUint32(0), lo = dv.getUint32(4);
265
+ const be = hi >>> 20 & 2047;
266
+ let m = BigInt(hi & 1048575) << 32n | BigInt(lo);
267
+ let e = be - 1075;
268
+ if (be === 0) e = -1074;
269
+ else m |= 1n << 52n;
270
+ if (e >= 0) return { M: m << BigInt(e), s: 0 };
271
+ return { M: m * 5n ** BigInt(-e), s: -e };
272
+ }
273
+ function shortest(x) {
274
+ if (x === 0) return { M: 0n, s: 0 };
275
+ const [mant, ex] = x.toExponential().split("e");
276
+ const digits = mant.replace(".", "");
277
+ return { M: BigInt(digits), s: digits.length - 1 - Number(ex) };
278
+ }
279
+ var P10 = (n) => 10n ** BigInt(n);
280
+ function roundTo(d, f, mode, neg) {
281
+ if (d.s <= f) return { M: d.M * P10(f - d.s), s: f };
282
+ const k = P10(d.s - f), q = d.M / k, r = d.M % k, half = k / 2n;
283
+ let up;
284
+ switch (mode) {
285
+ case "HALF_UP":
286
+ up = r >= half;
287
+ break;
288
+ case "HALF_DOWN":
289
+ up = r > half;
290
+ break;
291
+ case "UP":
292
+ up = r > 0n;
293
+ break;
294
+ case "DOWN":
295
+ up = false;
296
+ break;
297
+ case "CEILING":
298
+ up = r > 0n && !neg;
299
+ break;
300
+ case "FLOOR":
301
+ up = r > 0n && neg;
302
+ break;
303
+ default:
304
+ up = r > half || r === half && q % 2n === 1n;
305
+ }
306
+ return { M: up ? q + 1n : q, s: f };
307
+ }
308
+ var digitCount = (M) => M === 0n ? 0 : M.toString().length;
309
+ function affix(text) {
310
+ const out = [];
311
+ for (let i = 0; i < text.length; i++) {
312
+ const c = text[i];
313
+ if (c === "'") {
314
+ const e = text.indexOf("'", i + 1);
315
+ if (e === i + 1) {
316
+ out.push("'");
317
+ i++;
318
+ continue;
319
+ }
320
+ out.push(e < 0 ? text.slice(i + 1) : text.slice(i + 1, e));
321
+ i = e < 0 ? text.length : e;
322
+ continue;
323
+ }
324
+ if (c === "¤") {
325
+ let n = 1;
326
+ while (text[i + n] === "¤") n++;
327
+ out.push({ t: n >= 2 ? "iso" : "cur" });
328
+ i += n - 1;
329
+ continue;
330
+ }
331
+ if (c === "%" || c === "‰" || c === "-" || c === "‰") {
332
+ out.push({ t: c === "-" ? "minus" : c === "%" ? "pct" : "mille" });
333
+ continue;
334
+ }
335
+ out.push(c);
336
+ }
337
+ return out;
338
+ }
339
+ function numberPattern(pat) {
340
+ return memo(`n${pat}`, () => {
341
+ let mode = "HALF_EVEN";
342
+ pat = pat.replace(/\{RoundingMode=([A-Z_]+)\}/, (_, m) => {
343
+ mode = m;
344
+ return "";
345
+ });
346
+ const split = (s) => {
347
+ let q = false, start = -1;
348
+ for (let i = 0; i < s.length; i++) {
349
+ const c = s[i];
350
+ if (c === "'") {
351
+ q = !q;
352
+ continue;
353
+ }
354
+ if (!q && "#0,.".includes(c)) {
355
+ start = i;
356
+ break;
357
+ }
358
+ }
359
+ if (start < 0) return { prefix: s, num: "", suffix: "" };
360
+ let end = start;
361
+ while (end < s.length && "#0,.".includes(s[end])) end++;
362
+ if (s[end] === "E") {
363
+ let k = end + 1;
364
+ if (s[k] === "+") k++;
365
+ if (s[k] === "0") {
366
+ while (s[k] === "0") k++;
367
+ end = k;
368
+ }
369
+ }
370
+ return { prefix: s.slice(0, start), num: s.slice(start, end), suffix: s.slice(end) };
371
+ };
372
+ const [posText, negText] = (() => {
373
+ let q = false;
374
+ for (let i = 0; i < pat.length; i++) {
375
+ if (pat[i] === "'") q = !q;
376
+ else if (!q && pat[i] === ";") return [pat.slice(0, i), pat.slice(i + 1)];
377
+ }
378
+ return [pat, null];
379
+ })();
380
+ const pos = split(posText);
381
+ const num = pos.num;
382
+ const ei = num.indexOf("E");
383
+ const mant = ei >= 0 ? num.slice(0, ei) : num;
384
+ const expPart = ei >= 0 ? num.slice(ei + 1) : null;
385
+ const di = mant.indexOf(".");
386
+ const intPart = di >= 0 ? mant.slice(0, di) : mant, fracPart = di >= 0 ? mant.slice(di + 1) : "";
387
+ let zeros = (intPart.match(/0/g) || []).length, hashes = (intPart.match(/#/g) || []).length;
388
+ let minFrac = (fracPart.match(/0/g) || []).length, maxFrac = (fracPart.match(/[0#]/g) || []).length;
389
+ if (zeros === 0 && hashes > 0 && di >= 0) {
390
+ zeros = 1;
391
+ hashes--;
392
+ }
393
+ const commas = [];
394
+ for (let i = 0, d = 0; i < intPart.length; i++) {
395
+ if (intPart[i] === ",") commas.push(d);
396
+ else d++;
397
+ }
398
+ const intDigits = zeros + hashes;
399
+ const grouping = commas.length ? intDigits - commas[commas.length - 1] : 0;
400
+ const secondary = commas.length > 1 ? commas[commas.length - 1] - commas[commas.length - 2] : 0;
401
+ const pa = affix(pos.prefix), sa = affix(pos.suffix);
402
+ const all = [...pa, ...sa];
403
+ const mult = all.some((x) => typeof x === "object" && x.t === "pct") ? 2 : all.some((x) => typeof x === "object" && x.t === "mille") ? 3 : 0;
404
+ const neg = negText != null ? split(negText) : null;
405
+ for (const n of [intDigits, maxFrac, (expPart?.match(/0/g) || []).length]) capDigits("Format", n);
406
+ return {
407
+ mode,
408
+ minInt: zeros,
409
+ maxInt: expPart != null ? intDigits : Infinity,
410
+ minFrac,
411
+ maxFrac,
412
+ grouping,
413
+ secondary,
414
+ exp: expPart != null ? { plus: expPart.startsWith("+"), min: (expPart.match(/0/g) || []).length || 1 } : null,
415
+ prefix: pa,
416
+ suffix: sa,
417
+ negPrefix: neg ? affix(neg.prefix) : null,
418
+ negSuffix: neg ? affix(neg.suffix) : null,
419
+ mult,
420
+ cur: all.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso"))
421
+ };
422
+ });
423
+ }
424
+ var renderAffix = (parts, sy, cur) => parts.map((p) => typeof p === "string" ? p : p.t === "pct" ? sy.percent : p.t === "mille" ? sy.perMille : p.t === "minus" ? sy.minus : p.t === "iso" ? cur.iso : cur.sym).join("");
425
+ function group(int, size, secondary, sep) {
426
+ if (!size || int.length <= size) return int;
427
+ const head = int.slice(0, -size), tail = int.slice(-size);
428
+ const s2 = secondary || size;
429
+ const parts = [];
430
+ for (let i = head.length; i > 0; i -= s2) parts.unshift(head.slice(Math.max(0, i - s2), i));
431
+ return [...parts, tail].join(sep);
432
+ }
433
+ function formatNumber(v, pat, locale, icu) {
434
+ const sy = symbols(locale);
435
+ const p = numberPattern(pat);
436
+ const neg = v < 0 || Object.is(v, -0);
437
+ const iso = currencyOf(locale) || "USD";
438
+ const cur = currency(locale, iso);
439
+ let minFrac = p.minFrac, maxFrac = p.maxFrac;
440
+ if (icu && p.cur && !p.exp) {
441
+ minFrac = cur.digits;
442
+ maxFrac = cur.digits;
443
+ }
444
+ let body;
445
+ if (!Number.isFinite(v)) body = Number.isNaN(v) ? sy.nan : sy.inf;
446
+ else {
447
+ const a = Math.abs(v);
448
+ const d0 = icu ? shortest(a) : exact(p.mult ? a * 10 ** p.mult : a);
449
+ const d = icu && p.mult ? { M: d0.M, s: d0.s - p.mult } : d0;
450
+ body = p.exp ? sci(d, p, minFrac, maxFrac, sy, neg) : fixed(d, p, minFrac, maxFrac, sy, neg);
451
+ }
452
+ if (Number.isNaN(v)) return body;
453
+ let pre, suf;
454
+ if (neg && p.negPrefix) {
455
+ pre = renderAffix(p.negPrefix, sy, cur);
456
+ suf = renderAffix(p.negSuffix || [], sy, cur);
457
+ } else {
458
+ pre = (neg ? sy.minus : "") + renderAffix(p.prefix, sy, cur);
459
+ suf = renderAffix(p.suffix, sy, cur);
460
+ }
461
+ if (icu && p.cur) {
462
+ const notSym = (ch) => ch && !/[\p{S}\s]/u.test(ch);
463
+ const last = pre.replace(/[‎‏؜]+$/, "").slice(-1), first = suf.replace(/^[‎‏؜]+/, "")[0];
464
+ if (p.prefix.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso")) && notSym(last)) pre += " ";
465
+ if (p.suffix.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso")) && notSym(first) && !/^\s/.test(suf)) suf = " " + suf;
466
+ }
467
+ return pre + body + suf;
468
+ }
469
+ function fixed(d, p, minFrac, maxFrac, sy, neg) {
470
+ const r = roundTo(d, maxFrac, p.mode, neg);
471
+ let s = r.M.toString().padStart(r.s + 1, "0");
472
+ let int = s.slice(0, s.length - r.s), frac = s.slice(s.length - r.s);
473
+ frac = frac.replace(/0+$/, "");
474
+ if (frac.length < minFrac) frac = frac.padEnd(minFrac, "0");
475
+ int = int.replace(/^0+/, "");
476
+ if (int.length < p.minInt) int = int.padStart(p.minInt, "0");
477
+ if (!int && !frac) int = "0";
478
+ const g = group(int, p.grouping, p.secondary, "\0");
479
+ return localDigits(g, sy).replace(/\u0000/g, sy.grp) + (frac ? sy.dec + localDigits(frac, sy) : "");
480
+ }
481
+ function sci(d, p, minFrac, maxFrac, sy, neg) {
482
+ const maxInt = p.maxInt === Infinity ? p.minInt : p.maxInt;
483
+ const sig = Math.max(1, maxInt + maxFrac);
484
+ let M = d.M, s = d.s;
485
+ let exponent = 0, intDigits;
486
+ if (M === 0n) {
487
+ exponent = 0;
488
+ intDigits = Math.max(1, p.minInt);
489
+ M = 0n;
490
+ } else {
491
+ const n = digitCount(M);
492
+ if (n > sig) {
493
+ const r = roundTo({ M, s: n - 1 }, sig - 1, p.mode, neg);
494
+ M = r.M;
495
+ s = s - (n - 1) + (sig - 1);
496
+ }
497
+ const n2 = digitCount(M);
498
+ const decimalAt = n2 - s;
499
+ if (maxInt > 1 && maxInt > p.minInt) {
500
+ exponent = decimalAt >= 1 ? Math.trunc((decimalAt - 1) / maxInt) * maxInt : Math.trunc((decimalAt - maxInt) / maxInt) * maxInt;
501
+ intDigits = decimalAt - exponent;
502
+ } else {
503
+ exponent = decimalAt - Math.max(1, p.minInt);
504
+ intDigits = Math.max(1, p.minInt);
505
+ }
506
+ }
507
+ let digits = M === 0n ? "" : M.toString().replace(/0+$/, "");
508
+ const minDigits = p.minInt + minFrac;
509
+ const total = Math.max(digits.length, minDigits, intDigits);
510
+ digits = digits.padEnd(total, "0");
511
+ const int = digits.slice(0, intDigits).padEnd(intDigits, "0");
512
+ let frac = digits.slice(intDigits);
513
+ if (frac.length > minFrac) frac = frac.replace(/0+$/, "").padEnd(minFrac, "0");
514
+ const e = String(Math.abs(exponent)).padStart(p.exp.min, "0");
515
+ const es = exponent < 0 ? sy.expMinus : p.exp.plus ? "+" : "";
516
+ return localDigits(int, sy) + (frac ? sy.dec + localDigits(frac, sy) : "") + sy.exp + es + localDigits(e, sy);
517
+ }
518
+ function javaDouble(x) {
519
+ if (Number.isNaN(x)) return "NaN";
520
+ if (!Number.isFinite(x)) return x > 0 ? "Infinity" : "-Infinity";
521
+ if (x === 0) return Object.is(x, -0) ? "-0.0" : "0.0";
522
+ const a = Math.abs(x);
523
+ if (a >= 1e-3 && a < 1e7) {
524
+ const s = String(x);
525
+ return s.includes(".") ? s : `${s}.0`;
526
+ }
527
+ const [m, e] = x.toExponential().split("e");
528
+ return `${m.includes(".") ? m : `${m}.0`}E${Number(e)}`;
529
+ }
530
+ var dtf = (locale, opts) => memo(`d${locale}${JSON.stringify(opts)}`, () => {
531
+ try {
532
+ return new Intl.DateTimeFormat(locale, { timeZone: "UTC", ...opts });
533
+ } catch {
534
+ return new Intl.DateTimeFormat("en-US", { timeZone: "UTC", ...opts });
535
+ }
536
+ });
537
+ var part = (locale, opts, w, type) => dtf(locale, opts).formatToParts(w).find((p) => p.type === type)?.value ?? "";
538
+ function weekInfo(locale) {
539
+ return memo(`w${locale}`, () => {
540
+ try {
541
+ const L = (
542
+ /** @type {any} */
543
+ new Intl.Locale(locale)
544
+ );
545
+ const w = L.getWeekInfo?.() || L.weekInfo;
546
+ if (w) return { first: w.firstDay, min: w.minimalDays };
547
+ } catch {
548
+ }
549
+ return { first: 7, min: 1 };
550
+ });
551
+ }
552
+ var DAY_MS = 864e5;
553
+ function weekOf(w, info) {
554
+ const dow = (x) => ((x.getUTCDay() || 7) - info.first + 7) % 7;
555
+ const y = w.getUTCFullYear();
556
+ const jan1 = new Date(Date.UTC(y, 0, 1));
557
+ const doy = Math.round((Date.UTC(y, w.getUTCMonth(), w.getUTCDate()) - jan1.getTime()) / DAY_MS);
558
+ const offset = dow(jan1);
559
+ const firstWeekStart = 7 - offset >= info.min ? -offset : 7 - offset;
560
+ let week = Math.floor((doy - firstWeekStart) / 7) + 1, wy = y;
561
+ if (week < 1) {
562
+ const prev = weekOf(new Date(Date.UTC(y - 1, 11, 31)), info);
563
+ return prev;
564
+ }
565
+ const nextJan1 = new Date(Date.UTC(y + 1, 0, 1));
566
+ const nOff = dow(nextJan1);
567
+ const nextStart = Math.round((nextJan1.getTime() - jan1.getTime()) / DAY_MS) + (7 - nOff >= info.min ? -nOff : 7 - nOff);
568
+ if (doy >= nextStart) {
569
+ week = 1;
570
+ wy = y + 1;
571
+ }
572
+ return { week, year: wy };
573
+ }
574
+ function formatDatePattern(d, pat, locale, tz, icu) {
575
+ const sy = symbols(locale);
576
+ const w = new Date(toWall(d, tz));
577
+ const num = (n, width) => localDigits(String(n).padStart(width, "0"), sy);
578
+ let out = "";
579
+ for (let i = 0; i < pat.length; ) {
580
+ const c = pat[i];
581
+ if (c === "'") {
582
+ if (pat[i + 1] === "'") {
583
+ out += "'";
584
+ i += 2;
585
+ continue;
586
+ }
587
+ const e = pat.indexOf("'", i + 1);
588
+ const lit = e < 0 ? pat.slice(i + 1) : pat.slice(i + 1, e);
589
+ out += lit.replace(/''/g, "'");
590
+ i = e < 0 ? pat.length : e + 1;
591
+ continue;
592
+ }
593
+ if (!/[A-Za-z]/.test(c)) {
594
+ out += c;
595
+ i++;
596
+ continue;
597
+ }
598
+ let n = 1;
599
+ while (pat[i + n] === c) n++;
600
+ i += n;
601
+ capDigits("Format", n);
602
+ out += field(c, n);
603
+ }
604
+ return out;
605
+ function field(c, n) {
606
+ const h = w.getUTCHours();
607
+ switch (c) {
608
+ case "G":
609
+ return part(locale, { era: n >= 4 ? "long" : "short", year: "numeric" }, w, "era");
610
+ case "y":
611
+ case "Y":
612
+ case "u": {
613
+ if (c === "u" && !icu) return num(w.getUTCDay() || 7, n);
614
+ const y = c === "Y" ? weekOf(w, weekInfo(locale)).year : w.getUTCFullYear();
615
+ return n === 2 ? num(y % 100, 2) : num(y, n);
616
+ }
617
+ case "M":
618
+ case "L": {
619
+ const m = w.getUTCMonth() + 1;
620
+ if (n <= 2) return num(m, n);
621
+ const style = n === 3 ? "short" : n === 5 && icu ? "narrow" : "long";
622
+ const fmtForm = c === "M" ? part(locale, { day: "numeric", month: style }, w, "month") : "";
623
+ return fmtForm && !/^[\d\u0660-\u0669\u06f0-\u06f9]+$/.test(fmtForm) ? fmtForm : dtf(locale, { month: style }).format(w);
624
+ }
625
+ case "d":
626
+ return num(w.getUTCDate(), n);
627
+ case "D":
628
+ return num(Math.round((Date.UTC(w.getUTCFullYear(), w.getUTCMonth(), w.getUTCDate()) - Date.UTC(w.getUTCFullYear(), 0, 1)) / DAY_MS) + 1, n);
629
+ case "F":
630
+ return num(Math.floor((w.getUTCDate() - 1) / 7) + 1, n);
631
+ case "w":
632
+ return num(weekOf(w, weekInfo(locale)).week, n);
633
+ case "W": {
634
+ const info = weekInfo(locale), first = new Date(Date.UTC(w.getUTCFullYear(), w.getUTCMonth(), 1));
635
+ const off = ((first.getUTCDay() || 7) - info.first + 7) % 7;
636
+ const startWeek1 = 7 - off >= info.min ? -off : 7 - off;
637
+ return num(Math.floor((w.getUTCDate() - 1 - startWeek1) / 7) + 1, n);
638
+ }
639
+ case "E":
640
+ case "c":
641
+ case "e":
642
+ if ((c === "e" || c === "c") && n <= 2) return num((w.getUTCDay() - weekInfo(locale).first + 7) % 7 + 1, n);
643
+ return part(locale, { weekday: n >= 4 && !(n === 5 && icu) ? "long" : n === 5 && icu ? "narrow" : "short", day: "numeric", month: "long" }, w, "weekday");
644
+ case "a":
645
+ return part(locale, { hour: "numeric", hour12: true }, w, "dayPeriod") || (h < 12 ? "AM" : "PM");
646
+ case "H":
647
+ return num(h, n);
648
+ case "k":
649
+ return num(h || 24, n);
650
+ case "K":
651
+ return num(h % 12, n);
652
+ case "h":
653
+ return num(h % 12 || 12, n);
654
+ case "m":
655
+ return num(w.getUTCMinutes(), n);
656
+ case "s":
657
+ return num(w.getUTCSeconds(), n);
658
+ case "S": {
659
+ const ms = w.getUTCMilliseconds();
660
+ if (!icu) return num(ms, n);
661
+ return localDigits(String(ms).padStart(3, "0").padEnd(n, "0").slice(0, n), sy);
662
+ }
663
+ case "z": {
664
+ try {
665
+ return new Intl.DateTimeFormat(locale, { timeZone: tz || void 0, timeZoneName: n >= 4 ? "long" : "short" }).formatToParts(d).find((x) => x.type === "timeZoneName")?.value || "UTC";
666
+ } catch {
667
+ return "UTC";
668
+ }
669
+ }
670
+ case "Z":
671
+ case "X":
672
+ case "x": {
673
+ const off = Math.round((w.getTime() - d.getTime()) / 6e4);
674
+ if (c === "X" && off === 0) return "Z";
675
+ const sign = off < 0 ? "-" : "+", a = Math.abs(off), hh = String(Math.floor(a / 60)).padStart(2, "0"), mm = String(a % 60).padStart(2, "0");
676
+ if (c === "Z") return n >= 4 ? `GMT${sign}${hh}:${mm}` : `${sign}${hh}${mm}`;
677
+ return n === 1 ? `${sign}${hh}${mm === "00" ? "" : mm}` : n === 2 ? `${sign}${hh}${mm}` : `${sign}${hh}:${mm}`;
678
+ }
679
+ }
680
+ return icu ? "" : c.repeat(n);
681
+ }
682
+ }
683
+ function formatStyle(d, spec, locale, tz) {
684
+ const o = {};
685
+ for (const kv of spec.split(";")) {
686
+ const [k, v] = kv.split("=");
687
+ if ((k === "date" || k === "time") && /^(short|medium|long|full)$/.test(v)) o[`${k}Style`] = v;
688
+ }
689
+ try {
690
+ return new Intl.DateTimeFormat(locale, { ...o, timeZone: tz || void 0 }).format(d);
691
+ } catch {
692
+ return d.toISOString();
693
+ }
694
+ }
695
+ var JAVA_DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
696
+ var JAVA_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
697
+ function javaDateString(d, tz) {
698
+ const w = new Date(toWall(d, tz)), p = (n) => String(n).padStart(2, "0");
699
+ const zone = tz && tz !== "UTC" ? part("en-US", { timeZoneName: "short" }, d, "timeZoneName") : "UTC";
700
+ return `${JAVA_DAYS[w.getUTCDay()]} ${JAVA_MONTHS[w.getUTCMonth()]} ${p(w.getUTCDate())} ${p(w.getUTCHours())}:${p(w.getUTCMinutes())}:${p(w.getUTCSeconds())} ${zone} ${w.getUTCFullYear()}`;
701
+ }
702
+ var isJavaFormat = (fmt) => typeof fmt === "string" && (fmt.startsWith("java:") || fmt.startsWith("icu:"));
703
+ function formatJava(value, fmt, opt = {}) {
704
+ if (value == null) return "";
705
+ capPattern("Format", fmt);
706
+ const icu = fmt.startsWith("icu:");
707
+ const pat = fmt.slice(icu ? 4 : 5);
708
+ const locale = opt.locale || "en-US";
709
+ if (typeof value === "boolean") return value ? "true" : "false";
710
+ if (value instanceof Date) {
711
+ if (Number.isNaN(value.getTime())) return "";
712
+ if (!pat) {
713
+ if (!icu) return javaDateString(value, opt.timeZone);
714
+ const s = formatStyle(value, "date=medium;time=short", locale, opt.timeZone);
715
+ return /^en\b/i.test(locale) ? s.replace(/^(.*\d{4}), /, "$1 ") : s;
716
+ }
717
+ if (pat.startsWith("@")) return formatStyle(value, pat.slice(1), locale, opt.timeZone);
718
+ return formatDatePattern(value, pat, locale, opt.timeZone, icu);
719
+ }
720
+ if (typeof value === "number") {
721
+ if (!pat || pat.startsWith("@")) {
722
+ if (!icu) return javaDouble(value);
723
+ if (!Number.isFinite(value)) return Number.isNaN(value) ? "NaN" : value > 0 ? "Infinity" : "-Infinity";
724
+ return javaDouble(value).replace(/\.0$/, "").replace(".", symbols(locale).dec);
725
+ }
726
+ return formatNumber(value, pat, locale, icu);
727
+ }
728
+ return String(value);
729
+ }
730
+ function javaString(v, kind, tz) {
731
+ if (v == null) return "null";
732
+ if (typeof v === "boolean") return v ? "true" : "false";
733
+ if (typeof v === "number") return String(kind).toLowerCase() === "int" && Number.isFinite(v) ? String(Math.trunc(v)) : javaDouble(v);
734
+ if (v instanceof Date) return javaDateString(v, tz);
735
+ return String(v);
736
+ }
737
+ function jsString(v) {
738
+ if (v === null) return "null";
739
+ if (v === void 0) return "undefined";
740
+ if (v instanceof Date) return v.toString();
741
+ return String(v);
742
+ }
743
+ function javaFormatString(f, args, locale = "en-US", tz) {
744
+ const sy = symbols(locale);
745
+ let next = 0, out = "";
746
+ const re = /%(?:(\d{1,4})\$)?([-#+ 0,(]{0,7})(\d{1,9})?(?:\.(\d{1,9}))?([a-zA-Z%])/g;
747
+ capText("JavaFormat", f.length);
748
+ let last = 0, m;
749
+ const lit = (a, b) => {
750
+ const t = f.slice(a, b);
751
+ if (t.includes("%")) throw new ExprError(`JavaFormat: "${t.slice(t.indexOf("%"), t.indexOf("%") + 12)}…" is not a format specifier`);
752
+ return t;
753
+ };
754
+ while (m = re.exec(f)) {
755
+ out += lit(last, m.index);
756
+ last = re.lastIndex;
757
+ const [, idx, flags, width, prec, conv] = m;
758
+ if (conv === "%") {
759
+ out += "%";
760
+ continue;
761
+ }
762
+ if (conv === "n") {
763
+ out += "\n";
764
+ continue;
765
+ }
766
+ const v = idx ? args[Number(idx) - 1] : args[next++];
767
+ const w = width ? Number(width) : 0, p = prec != null ? Number(prec) : null;
768
+ capDigits("JavaFormat", w);
769
+ if (p != null && /[fFeE]/.test(conv)) capDigits("JavaFormat", p);
770
+ let s;
771
+ const lc = conv.toLowerCase();
772
+ if (lc === "s") s = javaString(v, void 0, tz);
773
+ else if (lc === "b") s = v == null ? "false" : typeof v === "boolean" ? String(v) : "true";
774
+ else if (lc === "c") s = v == null ? "null" : typeof v === "number" ? String.fromCodePoint(v) : String(v)[0] ?? "";
775
+ else if (v == null) s = "null";
776
+ else {
777
+ const x = Number(v);
778
+ const neg = x < 0 || Object.is(x, -0);
779
+ let body;
780
+ if (lc === "d") body = group(String(Math.abs(Math.trunc(x))), flags.includes(",") ? 3 : 0, 0, "\0");
781
+ else if (lc === "o" || lc === "x") {
782
+ const t = Math.trunc(x);
783
+ const u = t >= 0 ? t : t >= -(2 ** 31) ? t >>> 0 : Number(BigInt.asUintN(64, BigInt(t)));
784
+ body = u.toString(lc === "o" ? 8 : 16);
785
+ } else if (lc === "f") {
786
+ const r = roundTo(shortest(Math.abs(x)), p ?? 6, "HALF_UP", neg);
787
+ const str = r.M.toString().padStart(r.s + 1, "0");
788
+ const int = str.slice(0, str.length - r.s), frac = str.slice(str.length - r.s);
789
+ body = group(int, flags.includes(",") ? 3 : 0, 0, "\0") + (frac ? `${frac}` : "");
790
+ } else if (lc === "e") {
791
+ const d = shortest(Math.abs(x)), n = digitCount(d.M) || 1, pp = p ?? 6;
792
+ const r = d.M === 0n ? { M: 0n, s: pp } : roundTo({ M: d.M, s: n - 1 }, pp, "HALF_UP", neg);
793
+ let e = d.M === 0n ? 0 : n - 1 - d.s;
794
+ let str = r.M.toString();
795
+ if (str.length > pp + 1) {
796
+ str = str.slice(0, -1);
797
+ e++;
798
+ }
799
+ str = str.padStart(pp + 1, "0");
800
+ body = str[0] + (pp ? `${str.slice(1)}` : "") + `${conv}${e < 0 ? "-" : "+"}${String(Math.abs(e)).padStart(2, "0")}`;
801
+ } else {
802
+ s = String(v);
803
+ body = null;
804
+ }
805
+ if (body != null) {
806
+ const loc = lc === "x" || lc === "o" ? body : localDigits(body, sy).replace(/\u0000/g, sy.grp).replace(/\u0001/g, sy.dec);
807
+ const signed = lc === "x" || lc === "o" ? loc : neg ? flags.includes("(") ? `(${loc})` : `-${loc}` : flags.includes("+") ? `+${loc}` : flags.includes(" ") ? ` ${loc}` : loc;
808
+ s = signed;
809
+ if (flags.includes("0") && !flags.includes("-") && s.length < w) {
810
+ const sign = /^[-+ (]/.test(s) ? s[0] : "";
811
+ s = sign + localDigits("0".repeat(w - s.length), sy) + s.slice(sign.length);
812
+ }
813
+ }
814
+ }
815
+ if (p != null && (lc === "s" || lc === "b" || lc === "c")) s = s.slice(0, p);
816
+ if (conv === "S" || conv === "B" || conv === "X" || conv === "E") s = s.toUpperCase();
817
+ if (s.length < w) s = flags.includes("-") ? s.padEnd(w) : s.padStart(w);
818
+ capText("JavaFormat", out.length + s.length + (f.length - last));
819
+ out += s;
820
+ }
821
+ return out + lit(last, f.length);
822
+ }
823
+
824
+ // src/engine/expr/format.js
825
+ var nfCache = /* @__PURE__ */ new Map();
826
+ function nf(locale, opts) {
827
+ const key = locale + JSON.stringify(opts);
828
+ let f = nfCache.get(key);
829
+ if (!f) {
830
+ f = new Intl.NumberFormat(locale, { numberingSystem: "latn", ...opts });
831
+ if (nfCache.size >= 500) nfCache.clear();
832
+ nfCache.set(key, f);
833
+ }
834
+ return f;
835
+ }
836
+ var DAY_MS2 = 864e5;
837
+ var zoneFmt = /* @__PURE__ */ new Map();
838
+ function offsetAt(t, tz) {
839
+ if (!tz) return -new Date(t).getTimezoneOffset();
840
+ if (tz === "UTC" || tz === "Etc/UTC") return 0;
841
+ let z = zoneFmt.get(tz);
842
+ if (!z) {
843
+ let f = null;
844
+ try {
845
+ f = new Intl.DateTimeFormat("en-US", { timeZone: tz, hourCycle: "h23", year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric" });
846
+ } catch {
847
+ }
848
+ z = { f, cache: /* @__PURE__ */ new Map() };
849
+ if (zoneFmt.size >= 100) zoneFmt.clear();
850
+ zoneFmt.set(tz, z);
851
+ }
852
+ if (!z.f) return -new Date(t).getTimezoneOffset();
853
+ const key = Math.floor(t / 9e5);
854
+ let o = z.cache.get(key);
855
+ if (o === void 0) {
856
+ const p = {};
857
+ for (const x of z.f.formatToParts(new Date(key * 9e5))) p[x.type] = Number(x.value);
858
+ o = Math.round((Date.UTC(p.year, p.month - 1, p.day, p.hour, p.minute, p.second) - key * 9e5) / 6e4);
859
+ if (z.cache.size >= 2e4) z.cache.clear();
860
+ z.cache.set(key, o);
861
+ }
862
+ return o;
863
+ }
864
+ var validTimeZone = (tz) => {
865
+ try {
866
+ new Intl.DateTimeFormat("en-US", { timeZone: tz });
867
+ return true;
868
+ } catch {
869
+ return false;
870
+ }
871
+ };
872
+ var toWall = (d, tz) => {
873
+ const t = d instanceof Date ? d.getTime() : d;
874
+ return t + offsetAt(t, tz) * 6e4;
875
+ };
876
+ function fromWall(w, tz) {
877
+ const a = w - offsetAt(w, tz) * 6e4;
878
+ const b = w - offsetAt(a, tz) * 6e4;
879
+ return new Date(toWall(b, tz) === w ? b : a);
880
+ }
881
+ var zoneDate = (y, m, d, tz, h = 0, mi = 0, sec = 0, ms = 0) => {
882
+ const w = /* @__PURE__ */ new Date(0);
883
+ w.setUTCFullYear(y, m, d);
884
+ w.setUTCHours(h, mi, sec, ms);
885
+ return fromWall(w.getTime(), tz);
886
+ };
887
+ var wallDate = (d, tz) => new Date(toWall(d, tz));
888
+ var ISO = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?\s*(Z|[+-]\d{2}:?\d{2})?)?$/i;
889
+ var NUMERIC = /^(\d{1,4})([./-])(\d{1,2})\2(\d{1,4})(?:[ T,]+(\d{1,2}):(\d{2})(?::(\d{2}))?\s*([AaPp][Mm])?)?$/;
890
+ var orderCache = /* @__PURE__ */ new Map();
891
+ function dateOrder(locale) {
892
+ const l = locale || "en-US";
893
+ let o = orderCache.get(l);
894
+ if (!o) {
895
+ try {
896
+ o = new Intl.DateTimeFormat(l, { year: "numeric", month: "2-digit", day: "2-digit", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5))).filter((p) => p.type === "year" || p.type === "month" || p.type === "day").map((p) => p.type[0]).join("");
897
+ } catch {
898
+ o = "mdy";
899
+ }
900
+ if (!/^(mdy|dmy|ymd)$/.test(o)) o = "mdy";
901
+ if (orderCache.size >= 200) orderCache.clear();
902
+ orderCache.set(l, o);
903
+ }
904
+ return o;
905
+ }
906
+ var year2 = (y) => y < 100 ? y + (y < 30 ? 2e3 : 1900) : y;
907
+ var validParts = (y, mo, d, h = 0, mi = 0, s = 0) => mo >= 1 && mo <= 12 && d >= 1 && d <= new Date(Date.UTC(y, mo, 0)).getUTCDate() && h <= 23 && mi <= 59 && s <= 59;
908
+ function toDate(v, opt) {
909
+ if (v == null || v === "") return null;
910
+ if (v instanceof Date) return Number.isNaN(v.getTime()) ? null : v;
911
+ if (typeof v === "number") {
912
+ const d2 = new Date(v);
913
+ return Number.isNaN(d2.getTime()) ? null : d2;
914
+ }
915
+ const s = String(v).trim();
916
+ const tz = opt?.timeZone;
917
+ let m = ISO.exec(s);
918
+ if (m) {
919
+ const [y, mo, d2, h = 0, mi = 0, sec = 0] = [m[1], m[2], m[3], m[4], m[5], m[6]].map((x) => x == null ? void 0 : Number(x));
920
+ if (!validParts(y, mo, d2, h, mi, sec)) return null;
921
+ const ms = m[7] ? Math.round(Number(`0.${m[7]}`) * 1e3) : 0;
922
+ if (!m[8]) return zoneDate(y, mo - 1, d2, tz, h, mi, sec, ms);
923
+ const off = m[8].toUpperCase() === "Z" ? 0 : (m[8][0] === "-" ? -1 : 1) * (Number(m[8].slice(1, 3)) * 60 + Number(m[8].slice(-2)));
924
+ return new Date(Date.UTC(y, mo - 1, d2, h, mi, sec, ms) - off * 6e4);
925
+ }
926
+ m = NUMERIC.exec(s);
927
+ if (m) {
928
+ const a = Number(m[1]), b = Number(m[3]), c = Number(m[4]);
929
+ const ord = m[1].length === 4 ? "ymd" : dateOrder(opt?.locale);
930
+ let [y, mo, d2] = ord === "ymd" ? [a, b, c] : ord === "dmy" ? [c, b, a] : [c, a, b];
931
+ y = year2(y);
932
+ let h = m[5] ? Number(m[5]) : 0;
933
+ const mi = m[6] ? Number(m[6]) : 0, sec = m[7] ? Number(m[7]) : 0;
934
+ if (m[8]) {
935
+ if (h < 1 || h > 12) return null;
936
+ h = h % 12 + (/p/i.test(m[8]) ? 12 : 0);
937
+ }
938
+ if (!validParts(y, mo, d2, h, mi, sec)) return null;
939
+ return zoneDate(y, mo - 1, d2, tz, h, mi, sec);
940
+ }
941
+ if (!/[A-Za-z]{3}/.test(s)) return null;
942
+ const d = new Date(s);
943
+ if (Number.isNaN(d.getTime())) return null;
944
+ return /(Z|GMT|UTC|[+-]\d{2}:?\d{2})\s*$/i.test(s) || !tz ? d : zoneDate(d.getFullYear(), d.getMonth(), d.getDate(), tz, d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
945
+ }
946
+ var isoDate = (d, tz) => formatDate(d, "yyyy-MM-dd", void 0, tz);
947
+ var sepCache = /* @__PURE__ */ new Map();
948
+ function latinDecimal(locale) {
949
+ const d = separators(locale).dec;
950
+ return /^[.,]$/.test(d) ? d : ".";
951
+ }
952
+ function separators(locale) {
953
+ const l = locale || "en-US";
954
+ let r = sepCache.get(l);
955
+ if (!r) {
956
+ let dec = ".", grp = ",";
957
+ try {
958
+ for (const p of new Intl.NumberFormat(l).formatToParts(12345.6)) {
959
+ if (p.type === "decimal") dec = p.value;
960
+ else if (p.type === "group") grp = p.value;
961
+ }
962
+ } catch {
963
+ }
964
+ r = { dec, grp };
965
+ if (sepCache.size >= 200) sepCache.clear();
966
+ sepCache.set(l, r);
967
+ }
968
+ return r;
969
+ }
970
+ function parseNumber(text, locale) {
971
+ let s = String(text).trim();
972
+ if (s === "") return NaN;
973
+ if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(s)) {
974
+ const { dec: dec2, grp: grp2 } = separators(locale);
975
+ if (dec2 === "," && grp2 === "." && /^[+-]?\d{1,3}(\.\d{3})+$/.test(s)) return Number(s.replace(/\./g, ""));
976
+ return Number(s);
977
+ }
978
+ let neg = false;
979
+ if (/^\(.*\)$/.test(s)) {
980
+ neg = true;
981
+ s = s.slice(1, -1).trim();
982
+ }
983
+ let pct = false;
984
+ if (s.endsWith("%")) {
985
+ pct = true;
986
+ s = s.slice(0, -1).trim();
987
+ }
988
+ s = s.replace(/^[\p{L}\p{Sc}]+\.?\s*|\s*[\p{L}\p{Sc}]+\.?$/gu, "").replace(/^[^\d.,+-]+|[^\d.,+-]+$/g, "").trim();
989
+ if (/^[+-]/.test(s)) {
990
+ neg = neg !== (s[0] === "-");
991
+ s = s.slice(1).trim();
992
+ } else if (/[+-]$/.test(s)) {
993
+ neg = neg !== s.endsWith("-");
994
+ s = s.slice(0, -1).trim();
995
+ }
996
+ s = s.replace(/^[^\d.,]+|[^\d.,]+$/g, "").trim();
997
+ const { dec, grp } = separators(locale);
998
+ const g = grp === " " || grp === " " || grp === " " ? "[   ]" : grp === "." ? "\\." : grp === "'" || grp === "’" ? "['’]" : grp;
999
+ const d = dec === "." ? "\\." : dec;
1000
+ const india = /-IN$/i.test(locale || "");
1001
+ const re = new RegExp(`^(\\d{1,3}(?:${g}\\d{3})+${india ? `|\\d{1,2}(?:${g}\\d{2})+${g}\\d{3}` : ""}|\\d+)(?:${d}(\\d+))?$`);
1002
+ const m = re.exec(s);
1003
+ if (!m) return NaN;
1004
+ const int = m[1].replace(new RegExp(g, "g"), "");
1005
+ const n = Number(`${int}${m[2] ? `.${m[2]}` : ""}`);
1006
+ if (!Number.isFinite(n)) return NaN;
1007
+ const r = pct ? shiftDecSafe(n, -2) : n;
1008
+ return neg ? -r : r;
1009
+ }
1010
+ var shiftDecSafe = (x, e) => Number(`${x}e${e}`);
1011
+ var P10F = Array.from({ length: 23 }, (_, i) => 10 ** i);
1012
+ var shiftDec = (x, e) => {
1013
+ const [m, k = "0"] = String(x).split("e");
1014
+ return Number(`${m}e${Number(k) + e}`);
1015
+ };
1016
+ function roundHalfAway(v, digits = 0) {
1017
+ if (!Number.isFinite(v)) return v;
1018
+ if (digits >= 0 && digits <= 22) {
1019
+ const i = Math.round(v * P10F[digits]);
1020
+ if (i / P10F[digits] === v) return v + 0;
1021
+ }
1022
+ return Math.sign(v) * shiftDec(Math.round(shiftDec(Math.abs(v), digits)), -digits) + 0;
1023
+ }
1024
+ function roundHalfEven(v, digits = 0) {
1025
+ if (!Number.isFinite(v)) return v;
1026
+ const x = shiftDec(Math.abs(v), digits);
1027
+ const f = Math.floor(x), diff = x - f;
1028
+ const r = diff > 0.5 || diff === 0.5 && f % 2 !== 0 ? f + 1 : f;
1029
+ return Math.sign(v) * shiftDec(r, -digits) + 0;
1030
+ }
1031
+ var REGION_CURRENCY = {
1032
+ US: "USD",
1033
+ IN: "INR",
1034
+ GB: "GBP",
1035
+ DE: "EUR",
1036
+ FR: "EUR",
1037
+ ES: "EUR",
1038
+ IT: "EUR",
1039
+ NL: "EUR",
1040
+ BE: "EUR",
1041
+ AT: "EUR",
1042
+ PT: "EUR",
1043
+ IE: "EUR",
1044
+ FI: "EUR",
1045
+ GR: "EUR",
1046
+ JP: "JPY",
1047
+ CN: "CNY",
1048
+ CA: "CAD",
1049
+ AU: "AUD",
1050
+ NZ: "NZD",
1051
+ CH: "CHF",
1052
+ SG: "SGD",
1053
+ AE: "AED",
1054
+ SA: "SAR",
1055
+ BR: "BRL",
1056
+ MX: "MXN",
1057
+ ZA: "ZAR",
1058
+ KR: "KRW",
1059
+ RU: "RUB",
1060
+ ID: "IDR",
1061
+ MY: "MYR",
1062
+ PH: "PHP",
1063
+ TH: "THB",
1064
+ VN: "VND",
1065
+ PK: "PKR",
1066
+ BD: "BDT",
1067
+ LK: "LKR",
1068
+ NP: "NPR",
1069
+ SE: "SEK",
1070
+ NO: "NOK",
1071
+ DK: "DKK",
1072
+ PL: "PLN",
1073
+ TR: "TRY",
1074
+ IL: "ILS",
1075
+ EG: "EGP",
1076
+ NG: "NGN",
1077
+ KE: "KES",
1078
+ HK: "HKD",
1079
+ TW: "TWD"
1080
+ };
1081
+ var currencyOf = (locale) => {
1082
+ const l = locale || "";
1083
+ if (CURRENCY_OF.has(l)) return CURRENCY_OF.get(l);
1084
+ const m = /^[a-z]{2,3}-(?:[A-Za-z]{4}-)?([A-Za-z]{2})$/i.exec(l);
1085
+ const c = m ? REGION_CURRENCY[m[1].toUpperCase()] : void 0;
1086
+ if (CURRENCY_OF.size < 1e3 && l.length <= 35) CURRENCY_OF.set(l, c);
1087
+ return c;
1088
+ };
1089
+ var CURRENCY_OF = /* @__PURE__ */ new Map();
1090
+ var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
1091
+ var DAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
1092
+ function formatValue(value, fmt, opt = {}) {
1093
+ if (value == null) return "";
1094
+ if (typeof fmt === "string") capPattern("Format", fmt);
1095
+ if (isJavaFormat(fmt)) {
1096
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}/.test(value)) {
1097
+ const d = toDate(value, opt);
1098
+ if (d) value = d;
1099
+ }
1100
+ return formatJava(
1101
+ value,
1102
+ /** @type {string} */
1103
+ fmt,
1104
+ opt
1105
+ );
1106
+ }
1107
+ const locale = opt.locale || "en-US";
1108
+ if (value instanceof Date) {
1109
+ const t = value.getTime();
1110
+ if (Number.isNaN(t)) return "";
1111
+ const tz = opt.timeZone;
1112
+ if (!fmt && toWall(value, tz) % DAY_MS2 !== 0) fmt = `dd MMM yyyy ${standardDate("t", locale)}`;
1113
+ if (!opt.fmtMemo) return formatDate(value, fmt || "dd MMM yyyy", locale, tz);
1114
+ const memo2 = memoFor(opt.fmtMemo, "i", fmt || "dd MMM yyyy", locale);
1115
+ let out = memo2.get(t);
1116
+ if (out === void 0) {
1117
+ out = formatDate(value, fmt || "dd MMM yyyy", locale, tz);
1118
+ memo2.set(t, out);
1119
+ }
1120
+ return out;
1121
+ }
1122
+ if (typeof value === "number") {
1123
+ if (!Number.isFinite(value)) return opt.nonFinite === "blank" ? "" : opt.nonFinite === "error" ? "#Error" : String(value);
1124
+ if (!fmt) return Number.isSafeInteger(value) && !Object.is(value, -0) ? String(value) : general(value, 15, "E", void 0, locale);
1125
+ return numberFn(fmt, locale, opt.currency || currencyOf(opt.locale), opt.grouping)(value);
1126
+ }
1127
+ if (typeof value === "boolean") return value ? "True" : "False";
1128
+ if (typeof value === "object") return plainText(value);
1129
+ if (typeof value === "string" && fmt && /^\d{4}-\d{2}-\d{2}/.test(value)) {
1130
+ const memo2 = opt.fmtMemo && value.length <= 40 ? memoFor(opt.fmtMemo, "s", fmt, locale) : null;
1131
+ let out = memo2?.get(value);
1132
+ if (out === void 0) {
1133
+ const d = toDate(value, opt);
1134
+ out = d && /[yMd]/.test(fmt) ? formatDate(d, fmt, locale, opt.timeZone) : value;
1135
+ memo2?.set(value, out);
1136
+ }
1137
+ return out;
1138
+ }
1139
+ return String(value);
1140
+ }
1141
+ function plainText(v) {
1142
+ if (typeof v === "number") {
1143
+ const s = String(v);
1144
+ return Number.isFinite(v) && /e/.test(s) ? v.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 100 }) : s;
1145
+ }
1146
+ if (Array.isArray(v)) return v.map((x) => x == null ? "" : plainText(x)).join(", ");
1147
+ if (v && typeof v === "object" && !(v instanceof Date)) {
1148
+ try {
1149
+ return JSON.stringify(v) ?? String(v);
1150
+ } catch {
1151
+ return String(v);
1152
+ }
1153
+ }
1154
+ return String(v);
1155
+ }
1156
+ function memoFor(all, kind, fmt, locale) {
1157
+ const key = `${kind}${fmt}${locale}`;
1158
+ let memo2 = all.get(key);
1159
+ if (!memo2) {
1160
+ if (all.size >= 50) all.clear();
1161
+ memo2 = /* @__PURE__ */ new Map();
1162
+ all.set(key, memo2);
1163
+ } else if (memo2.size >= 5e3) memo2.clear();
1164
+ return memo2;
1165
+ }
1166
+ var numberFns = /* @__PURE__ */ new Map();
1167
+ function numberFn(fmt, locale, currency2, grouping) {
1168
+ const key = `${fmt}${locale}${currency2 ?? ""}${grouping ?? ""}`;
1169
+ let fn = numberFns.get(key);
1170
+ if (!fn) {
1171
+ fn = compileNumber(fmt, locale, currency2, grouping);
1172
+ if (key.length <= 128) {
1173
+ if (numberFns.size >= 2e3) numberFns.clear();
1174
+ numberFns.set(key, fn);
1175
+ }
1176
+ }
1177
+ return fn;
1178
+ }
1179
+ var BIDI_MARKS = /[\u200e\u061c]/g;
1180
+ function compileNumber(fmt, locale, currency2, grouping) {
1181
+ const m = /^([CcNnFfPpDdEeXxGgRr])(\d{0,2})$/.exec(fmt);
1182
+ if (m) {
1183
+ const k = m[1].toUpperCase();
1184
+ const d = m[2] === "" ? null : Number(m[2]);
1185
+ const useGrouping = grouping === "always" ? "always" : grouping === "never" ? false : "auto";
1186
+ const fixed2 = { minimumFractionDigits: d ?? 2, maximumFractionDigits: d ?? 2, signDisplay: "negative", useGrouping };
1187
+ switch (k) {
1188
+ // ja-JP JPY comes out as the full-width ¥ (U+FFE5), which the bundled fonts lack; .NET ja-JP writes ¥ (U+00A5)
1189
+ case "C": {
1190
+ const f = nf(locale, currency2 ? { style: "currency", currency: currency2, ...fixed2 } : fixed2);
1191
+ return (v) => f.format(v).replace(/\uFFE5/g, "¥");
1192
+ }
1193
+ case "N": {
1194
+ const f = nf(locale, fixed2);
1195
+ return (v) => f.format(v).replace(BIDI_MARKS, "");
1196
+ }
1197
+ // .NET's plain "-" (CLDR ar adds U+200E)
1198
+ case "F": {
1199
+ const f = nf(locale, { ...fixed2, useGrouping: false });
1200
+ return (v) => f.format(v);
1201
+ }
1202
+ // the locale's decimal sign, no grouping
1203
+ case "P": {
1204
+ const f = nf(locale, { style: "percent", ...fixed2 });
1205
+ return (v) => f.format(v).replace(BIDI_MARKS, "");
1206
+ }
1207
+ case "D":
1208
+ return (value) => {
1209
+ const t = Math.trunc(value);
1210
+ return (t < 0 ? "-" : "") + String(Math.abs(t)).padStart(d ?? 0, "0");
1211
+ };
1212
+ case "E": {
1213
+ const dec = latinDecimal(locale);
1214
+ return (v) => scientific(v, d ?? 6, m[1] === "e" ? "e" : "E", 3).replace(".", dec);
1215
+ }
1216
+ case "X":
1217
+ return (value) => {
1218
+ const t = Math.trunc(value);
1219
+ const h = t >= 0 ? t.toString(16) : BigInt.asUintN(t >= -(2 ** 31) ? 32 : 64, BigInt(t)).toString(16);
1220
+ return (m[1] === "X" ? h.toUpperCase() : h).padStart(d ?? 0, "0");
1221
+ };
1222
+ case "G":
1223
+ return (v) => general(v, d || 15, m[1] === "g" ? "e" : "E", void 0, locale);
1224
+ case "R":
1225
+ return (v) => general(v, 17, "E", String(v), locale);
1226
+ }
1227
+ }
1228
+ if (/[#0]/.test(fmt)) return (v) => customNumber(v, fmt, locale);
1229
+ return (v) => String(v);
1230
+ }
1231
+ function scientific(v, digits, e, expDigits) {
1232
+ const [mant, exp] = Math.abs(v).toExponential(digits).split("e");
1233
+ const x = Number(exp);
1234
+ return `${v < 0 ? "-" : ""}${mant}${e}${x < 0 ? "-" : "+"}${String(Math.abs(x)).padStart(expDigits, "0")}`;
1235
+ }
1236
+ function general(v, p, e, shortest2, locale) {
1237
+ if (v === 0) return "0";
1238
+ const [mant, exp] = (shortest2 ? Number(shortest2) : v).toExponential(shortest2 ? void 0 : Math.min(p, 100) - 1).split("e");
1239
+ const x = Number(exp), digits = mant.includes(".") ? mant.replace(/\.?0+$/, "") : mant;
1240
+ const dec = locale ? latinDecimal(locale) : ".";
1241
+ if (x > -5 && x < p) return nf("en-US", { maximumFractionDigits: 20, maximumSignificantDigits: 21, useGrouping: false }).format(Number(`${digits}e${x}`)).replace(".", dec);
1242
+ return `${digits.replace(".", dec)}${e}${x < 0 ? "-" : "+"}${String(Math.abs(x)).padStart(2, "0")}`;
1243
+ }
1244
+ function sections(fmt) {
1245
+ const out = [""];
1246
+ for (let i = 0; i < fmt.length; i++) {
1247
+ const c = fmt[i];
1248
+ if (c === "\\") {
1249
+ out[out.length - 1] += fmt.slice(i, i + 2);
1250
+ i++;
1251
+ continue;
1252
+ }
1253
+ if (c === '"' || c === "'") {
1254
+ const j = fmt.indexOf(c, i + 1);
1255
+ const end = j < 0 ? fmt.length : j;
1256
+ out[out.length - 1] += fmt.slice(i, end + 1);
1257
+ i = end;
1258
+ continue;
1259
+ }
1260
+ if (c === ";") {
1261
+ out.push("");
1262
+ continue;
1263
+ }
1264
+ out[out.length - 1] += c;
1265
+ }
1266
+ return out;
1267
+ }
1268
+ function numTokens(sec) {
1269
+ const toks = [];
1270
+ for (let i = 0; i < sec.length; i++) {
1271
+ const c = sec[i];
1272
+ if (c === "\\") {
1273
+ toks.push({ k: "lit", s: sec[i + 1] ?? "" });
1274
+ i++;
1275
+ continue;
1276
+ }
1277
+ if (c === '"' || c === "'") {
1278
+ const j = sec.indexOf(c, i + 1);
1279
+ const end = j < 0 ? sec.length : j;
1280
+ toks.push({ k: "lit", s: sec.slice(i + 1, end) });
1281
+ i = end;
1282
+ continue;
1283
+ }
1284
+ toks.push("0#.,%".includes(c) ? { k: c } : { k: "lit", s: c });
1285
+ }
1286
+ return toks;
1287
+ }
1288
+ function customNumber(v, fmt, locale) {
1289
+ const secs = sections(fmt);
1290
+ let sec = secs[0], minus = v < 0;
1291
+ if (v < 0 && secs.length > 1 && secs[1] !== "") {
1292
+ sec = secs[1];
1293
+ minus = false;
1294
+ }
1295
+ const sci2 = exponentOf(sec);
1296
+ if (sci2) return (minus ? "-" : "") + scientificCustom(Math.abs(v), sci2, locale);
1297
+ const shape = numShape(numTokens(sec));
1298
+ let x = Math.abs(v);
1299
+ if (shape.pct) x = shiftDec(x, 2 * shape.pct);
1300
+ if (shape.mille) x = shiftDec(x, 3 * shape.mille);
1301
+ if (shape.scale) x = shiftDec(x, -3 * shape.scale);
1302
+ if (secs.length > 2 && secs[2] !== "" && roundHalfAway(x, shape.decimals) === 0) return formatShape(numShape(numTokens(secs[2])), 0, false, locale);
1303
+ return formatShape(shape, x, minus, locale);
1304
+ }
1305
+ function exponentOf(sec) {
1306
+ let q = null;
1307
+ for (let i = 0; i < sec.length; i++) {
1308
+ const c = sec[i];
1309
+ if (q) {
1310
+ if (c === q) q = null;
1311
+ continue;
1312
+ }
1313
+ if (c === '"' || c === "'") {
1314
+ q = c;
1315
+ continue;
1316
+ }
1317
+ if (c === "\\") {
1318
+ i++;
1319
+ continue;
1320
+ }
1321
+ if (c === "E" || c === "e") {
1322
+ const m = /^([+-]?)(0+)/.exec(sec.slice(i + 1));
1323
+ if (m && /[0#]/.test(sec.slice(0, i))) return { mant: sec.slice(0, i), e: c, plus: m[1] === "+", digits: m[2].length, rest: sec.slice(i + 1 + m[0].length) };
1324
+ }
1325
+ }
1326
+ return null;
1327
+ }
1328
+ function scientificCustom(x, sci2, locale) {
1329
+ const intPh = (sci2.mant.split(".")[0].match(/[0#]/g) || []).length || 1;
1330
+ const decimals = ((sci2.mant.split(".")[1] || "").match(/[0#]/g) || []).length;
1331
+ let exp = 0, m = x;
1332
+ if (x !== 0) {
1333
+ exp = Math.floor(Math.log10(x)) - (intPh - 1);
1334
+ m = shiftDec(x, -exp);
1335
+ if (roundHalfAway(m, decimals) >= 10 ** intPh) {
1336
+ exp++;
1337
+ m = shiftDec(x, -exp);
1338
+ } else if (m < 10 ** (intPh - 1)) {
1339
+ exp--;
1340
+ m = shiftDec(x, -exp);
1341
+ }
1342
+ }
1343
+ const sign = exp < 0 ? "-" : sci2.plus ? "+" : "";
1344
+ const mant = formatShape(numShape(numTokens(sci2.mant)), roundHalfAway(m, decimals), false, locale);
1345
+ const rest = litText(numTokens(sci2.rest));
1346
+ return `${mant}${sci2.e}${sign}${String(Math.abs(exp)).padStart(sci2.digits, "0")}${rest}`;
1347
+ }
1348
+ function numShape(toks) {
1349
+ const ph = (t) => t.k === "0" || t.k === "#";
1350
+ const last = toks.findLastIndex(ph);
1351
+ const first = toks.findIndex((t) => ph(t) || t.k === ".");
1352
+ if (last < 0) return { toks, pre: toks, post: [], int: [], frac: [], decimals: 0, minDec: 0, minInt: 0, grouping: false, scale: 0, pct: 0, inner: false };
1353
+ const span = toks.slice(first, last + 1);
1354
+ let dot = span.findIndex((t) => t.k === ".");
1355
+ if (dot < 0) dot = span.length;
1356
+ const int = span.slice(0, dot), frac = span.slice(dot + 1).filter(ph);
1357
+ let scale = 0;
1358
+ for (let i = int.length - 1; i >= 0 && int[i].k === ","; i--) scale++;
1359
+ const intCore = int.slice(0, int.length - scale);
1360
+ if (dot === span.length) for (let j = last + 1; j < toks.length && toks[j].k === ","; j++) scale++;
1361
+ const intPh = intCore.filter(ph);
1362
+ const z = intPh.findIndex((t) => t.k === "0");
1363
+ const lastZero = frac.findLastIndex((t) => t.k === "0");
1364
+ const sizes = [];
1365
+ for (let i = intCore.length - 1, n = 0; i >= 0; i--) {
1366
+ if (intCore[i].k === ",") {
1367
+ sizes.push(n);
1368
+ n = 0;
1369
+ } else if (ph(intCore[i])) n++;
1370
+ }
1371
+ const groups = sizes.length > 1 && sizes.some((n) => n !== sizes[0]) && sizes.every((n) => n > 0) ? sizes : null;
1372
+ capDigits("Format", frac.length);
1373
+ capDigits("Format", intPh.length);
1374
+ return {
1375
+ pre: toks.slice(0, first),
1376
+ post: toks.slice(last + 1).filter((t) => t.k !== ","),
1377
+ int: intCore,
1378
+ frac,
1379
+ decimals: frac.length,
1380
+ minDec: lastZero + 1,
1381
+ minInt: z < 0 ? 0 : intPh.length - z,
1382
+ grouping: intCore.some((t) => t.k === ","),
1383
+ groups,
1384
+ inner: intCore.some((t) => t.k === "lit"),
1385
+ scale,
1386
+ pct: toks.filter((t) => t.k === "%").length,
1387
+ mille: toks.filter((t) => t.k === "lit" && t.s === "‰").length
1388
+ };
1389
+ }
1390
+ var litText = (toks) => toks.map((t) => t.k === "lit" ? t.s : t.k === "%" ? "%" : t.k === "." ? "." : t.k === "," ? "," : "").join("");
1391
+ function formatShape(s, x, minus, locale) {
1392
+ if (!s.int.length && !s.frac.length) return (minus ? "-" : "") + litText(s.pre);
1393
+ let body;
1394
+ if (s.inner) {
1395
+ const r = roundHalfAway(x, s.decimals);
1396
+ const [ip, fp = ""] = r.toFixed(s.decimals).split(".");
1397
+ let digits = ip === "0" ? "" : ip;
1398
+ const out = [];
1399
+ const phs = s.int.filter((t) => t.k === "0" || t.k === "#").length;
1400
+ let k = 0;
1401
+ for (let i = s.int.length - 1; i >= 0; i--) {
1402
+ const t = s.int[i];
1403
+ if (t.k === "lit") {
1404
+ out.unshift(t.s);
1405
+ continue;
1406
+ }
1407
+ if (t.k !== "0" && t.k !== "#") continue;
1408
+ k++;
1409
+ if (k === phs) {
1410
+ out.unshift(digits || (t.k === "0" ? "0" : ""));
1411
+ digits = "";
1412
+ continue;
1413
+ }
1414
+ const dch = digits.slice(-1);
1415
+ digits = digits.slice(0, -1);
1416
+ out.unshift(dch || (t.k === "0" ? "0" : ""));
1417
+ }
1418
+ const frac = fp.slice(0, s.decimals).replace(new RegExp(`0{0,${s.decimals - s.minDec}}$`), "");
1419
+ body = out.join("") + (frac ? latinDecimal(locale) + frac : "");
1420
+ minus = minus && r !== 0;
1421
+ } else {
1422
+ body = nf(locale, { useGrouping: s.grouping && !s.groups, minimumFractionDigits: s.minDec, maximumFractionDigits: s.decimals, minimumIntegerDigits: Math.max(1, s.minInt) }).format(x);
1423
+ minus = minus && /[1-9]/.test(body);
1424
+ if (s.groups) body = body.replace(/^\d+/, (d) => {
1425
+ const out = [];
1426
+ let k = 0;
1427
+ while (d.length > s.groups[Math.min(k, s.groups.length - 1)]) {
1428
+ const n = s.groups[Math.min(k++, s.groups.length - 1)];
1429
+ out.unshift(d.slice(-n));
1430
+ d = d.slice(0, -n);
1431
+ }
1432
+ return [d, ...out].join(separators(locale).grp);
1433
+ });
1434
+ if (s.minInt === 0) body = body.replace(/^0(?=\D|$)/, "");
1435
+ }
1436
+ return (minus ? "-" : "") + litText(s.pre) + body + litText(s.post);
1437
+ }
1438
+ var dtfCache = /* @__PURE__ */ new Map();
1439
+ function localName(locale, kind, style, w) {
1440
+ const key = `${locale}|${kind}|${style}`;
1441
+ let f = dtfCache.get(key);
1442
+ if (f === void 0) {
1443
+ try {
1444
+ f = new Intl.DateTimeFormat(locale, { [kind]: style, timeZone: "UTC" });
1445
+ } catch {
1446
+ f = null;
1447
+ }
1448
+ if (dtfCache.size >= 500) dtfCache.clear();
1449
+ dtfCache.set(key, f);
1450
+ }
1451
+ return f ? f.format(w) : null;
1452
+ }
1453
+ function localPart(locale, opts, w, type) {
1454
+ const key = `p|${locale}|${JSON.stringify(opts)}`;
1455
+ let f = dtfCache.get(key);
1456
+ if (f === void 0) {
1457
+ try {
1458
+ f = new Intl.DateTimeFormat(locale, { ...opts, timeZone: "UTC" });
1459
+ } catch {
1460
+ f = null;
1461
+ }
1462
+ if (dtfCache.size >= 500) dtfCache.clear();
1463
+ dtfCache.set(key, f);
1464
+ }
1465
+ return f ? f.formatToParts(w).find((p) => p.type === type)?.value ?? null : null;
1466
+ }
1467
+ function dateSep(locale) {
1468
+ const l = locale || "en-US";
1469
+ const key = `sep|${l}`;
1470
+ let v = dtfCache.get(key);
1471
+ if (v === void 0) {
1472
+ try {
1473
+ v = new Intl.DateTimeFormat(l, { day: "2-digit", month: "2-digit", year: "numeric", calendar: "gregory", numberingSystem: "latn", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5))).find((p) => p.type === "literal")?.value.trim() || "/";
1474
+ } catch {
1475
+ v = "/";
1476
+ }
1477
+ if (/[\u200e\u200f]/.test(v)) v = v.replace(/[\u200e\u200f]/g, "") || "/";
1478
+ dtfCache.set(key, v);
1479
+ }
1480
+ return v;
1481
+ }
1482
+ var english = (locale) => !locale || /^en\b/i.test(locale);
1483
+ var US_DATES = { d: "M/d/yyyy", D: "dddd, MMMM d, yyyy", t: "h:mm tt", T: "h:mm:ss tt", M: "MMMM d", Y: "MMMM yyyy" };
1484
+ var DAY_FIRST = { d: "dd/MM/yyyy", D: "dddd, dd MMMM yyyy", t: "HH:mm", T: "HH:mm:ss", M: "dd MMMM", Y: "MMMM yyyy" };
1485
+ var NET_SHORT = { "en-IN": "dd-MM-yyyy" };
1486
+ var INVARIANT = { s: "yyyy-MM-dd'T'HH:mm:ss", u: "yyyy-MM-dd HH:mm:ss'Z'", o: "yyyy-MM-dd'T'HH:mm:ss.fffffff" };
1487
+ var patCache = /* @__PURE__ */ new Map();
1488
+ function intlPattern(locale, opts) {
1489
+ const parts = new Intl.DateTimeFormat(locale, { ...opts, calendar: "gregory", numberingSystem: "latn", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5, 9, 4, 7)));
1490
+ const h12 = parts.some((p) => p.type === "dayPeriod");
1491
+ return parts.map((p) => {
1492
+ const v = p.value;
1493
+ switch (p.type) {
1494
+ case "year":
1495
+ return "yyyy";
1496
+ case "month":
1497
+ return /^[\d\u0660-\u0669\u06f0-\u06f9]+$/.test(v) ? v.length > 1 ? "MM" : "M" : v.length > 4 || opts.month === "long" ? "MMMM" : "MMM";
1498
+ case "day":
1499
+ return v.length > 1 ? "dd" : "d";
1500
+ case "weekday":
1501
+ return opts.weekday === "long" ? "dddd" : "ddd";
1502
+ case "hour":
1503
+ return h12 ? v.length > 1 ? "hh" : "h" : v.length > 1 ? "HH" : "H";
1504
+ case "minute":
1505
+ return "mm";
1506
+ case "second":
1507
+ return "ss";
1508
+ case "dayPeriod":
1509
+ return "tt";
1510
+ default:
1511
+ return !v ? "" : v.includes("'") ? [...v].map((c) => `\\${c}`).join("") : `'${v}'`;
1512
+ }
1513
+ }).join("");
1514
+ }
1515
+ function localePatterns(locale) {
1516
+ let p = patCache.get(locale);
1517
+ if (!p) {
1518
+ try {
1519
+ p = {
1520
+ d: NET_SHORT[locale] || intlPattern(locale, { dateStyle: "short" }),
1521
+ D: intlPattern(locale, { weekday: "long", year: "numeric", month: "long", day: "numeric" }),
1522
+ t: intlPattern(locale, { hour: "numeric", minute: "2-digit" }),
1523
+ T: intlPattern(locale, { hour: "numeric", minute: "2-digit", second: "2-digit" }),
1524
+ M: intlPattern(locale, { month: "long", day: "numeric" }),
1525
+ Y: intlPattern(locale, { year: "numeric", month: "long" })
1526
+ };
1527
+ } catch {
1528
+ p = DAY_FIRST;
1529
+ }
1530
+ if (patCache.size >= 200) patCache.clear();
1531
+ patCache.set(locale, p);
1532
+ }
1533
+ return p;
1534
+ }
1535
+ function standardDate(fmt, locale) {
1536
+ const p = !locale || /^en-US$/i.test(locale) ? US_DATES : localePatterns(locale);
1537
+ switch (fmt) {
1538
+ case "d":
1539
+ case "D":
1540
+ case "t":
1541
+ case "T":
1542
+ return p[fmt];
1543
+ case "f":
1544
+ return `${p.D} ${p.t}`;
1545
+ case "F":
1546
+ return `${p.D} ${p.T}`;
1547
+ case "g":
1548
+ return `${p.d} ${p.t}`;
1549
+ case "G":
1550
+ return `${p.d} ${p.T}`;
1551
+ case "M":
1552
+ case "m":
1553
+ return p.M;
1554
+ case "Y":
1555
+ case "y":
1556
+ return p.Y;
1557
+ case "s":
1558
+ case "u":
1559
+ case "o":
1560
+ return INVARIANT[fmt];
1561
+ case "O":
1562
+ return INVARIANT.o;
1563
+ }
1564
+ return null;
1565
+ }
1566
+ function formatDate(d, fmt, locale, tz) {
1567
+ if (fmt.length === 1) {
1568
+ const std = standardDate(fmt, locale);
1569
+ if (std) return formatDate(d, std, locale, tz);
1570
+ }
1571
+ if (fmt.length === 2 && fmt[0] === "%") fmt = fmt[1];
1572
+ const w = wallDate(d, tz);
1573
+ const en = english(locale);
1574
+ const name = (kind, style, fallback) => en ? fallback : localName(locale, kind, style, w) ?? fallback;
1575
+ const withDay = /(^|[^d])d{1,2}([^d]|$)/.test(fmt.replace(/'[^']*'|"[^"]*"/g, " "));
1576
+ const month = (style, fallback) => {
1577
+ if (en) return fallback;
1578
+ if (withDay) {
1579
+ const g = localPart(locale, { day: "numeric", month: style }, w, "month");
1580
+ if (g && !/^\d+$/.test(g)) return g;
1581
+ }
1582
+ return localName(locale, "month", style, w) ?? fallback;
1583
+ };
1584
+ const p2 = (n) => String(n).padStart(2, "0");
1585
+ return fmt.replace(/(y+|M+|d+|H+|h+|m+|s+|f+|F+|t+|z+|\/)|'([^']*)'?|"([^"]*)"?|\\(.?)/g, (tok, run, q1, q2, esc) => {
1586
+ if (!run) return q1 ?? q2 ?? esc ?? "";
1587
+ const n = run.length;
1588
+ switch (run[0]) {
1589
+ case "y": {
1590
+ const y = w.getUTCFullYear();
1591
+ return n === 1 ? String(y % 100) : n === 2 ? p2(y % 100) : String(y).padStart(n, "0");
1592
+ }
1593
+ case "M":
1594
+ return n >= 4 ? month("long", MONTHS[w.getUTCMonth()]) : n === 3 ? month("short", MONTHS[w.getUTCMonth()].slice(0, 3)) : n === 2 ? p2(w.getUTCMonth() + 1) : String(w.getUTCMonth() + 1);
1595
+ case "d":
1596
+ return n >= 4 ? name("weekday", "long", DAYS[w.getUTCDay()]) : n === 3 ? name("weekday", "short", DAYS[w.getUTCDay()].slice(0, 3)) : n === 2 ? p2(w.getUTCDate()) : String(w.getUTCDate());
1597
+ case "H":
1598
+ return n >= 2 ? p2(w.getUTCHours()) : String(w.getUTCHours());
1599
+ case "h": {
1600
+ const h = (w.getUTCHours() + 11) % 12 + 1;
1601
+ return n >= 2 ? p2(h) : String(h);
1602
+ }
1603
+ case "m":
1604
+ return n >= 2 ? p2(w.getUTCMinutes()) : String(w.getUTCMinutes());
1605
+ case "s":
1606
+ return n >= 2 ? p2(w.getUTCSeconds()) : String(w.getUTCSeconds());
1607
+ case "f":
1608
+ case "F": {
1609
+ const f = String(w.getUTCMilliseconds()).padStart(3, "0").padEnd(7, "0").slice(0, Math.min(n, 7));
1610
+ return run[0] === "F" ? f.replace(/0+$/, "") : f;
1611
+ }
1612
+ case "t": {
1613
+ const s = (en ? null : localPart(locale, { hour: "numeric", hour12: true }, w, "dayPeriod")) || (w.getUTCHours() < 12 ? "AM" : "PM");
1614
+ return n === 1 ? [...s][0] : s;
1615
+ }
1616
+ case "/":
1617
+ return dateSep(locale);
1618
+ // .NET: the culture's date separator (de-DE 05.03.2026); '/' or \/ for a slash (N17)
1619
+ case ":":
1620
+ return ":";
1621
+ case "z": {
1622
+ const o = Math.round((w.getTime() - d.getTime()) / 6e4), a = Math.abs(o), sg = o < 0 ? "-" : "+";
1623
+ return n === 1 ? `${sg}${Math.floor(a / 60)}` : n === 2 ? `${sg}${p2(Math.floor(a / 60))}` : `${sg}${p2(Math.floor(a / 60))}:${p2(a % 60)}`;
1624
+ }
1625
+ }
1626
+ return run;
1627
+ });
1628
+ }
1629
+
1630
+ export {
1631
+ ExprError,
1632
+ capText,
1633
+ parse,
1634
+ javaString,
1635
+ jsString,
1636
+ javaFormatString,
1637
+ validTimeZone,
1638
+ toWall,
1639
+ fromWall,
1640
+ toDate,
1641
+ isoDate,
1642
+ parseNumber,
1643
+ roundHalfAway,
1644
+ roundHalfEven,
1645
+ currencyOf,
1646
+ formatValue,
1647
+ plainText,
1648
+ english,
1649
+ standardDate,
1650
+ formatDate
1651
+ };
1652
+ //# sourceMappingURL=chunk-GJS242RR.js.map