@knowvah/dot-engine 2.3.1 → 2.4.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 (112) hide show
  1. package/dist/common/arith.d.ts +12 -0
  2. package/dist/common/arith.d.ts.map +1 -1
  3. package/dist/common/edge-in-box.d.ts +31 -0
  4. package/dist/common/edge-in-box.d.ts.map +1 -0
  5. package/dist/common/htmltable-emit.d.ts +1 -1
  6. package/dist/common/htmltable-emit.d.ts.map +1 -1
  7. package/dist/common/make-label.d.ts +3 -1
  8. package/dist/common/make-label.d.ts.map +1 -1
  9. package/dist/common/poly-gencode.d.ts +12 -1
  10. package/dist/common/poly-gencode.d.ts.map +1 -1
  11. package/dist/gvc/device.d.ts.map +1 -1
  12. package/dist/gvc/emit-gates.d.ts +35 -0
  13. package/dist/gvc/emit-gates.d.ts.map +1 -0
  14. package/dist/gvc/job.d.ts +4 -0
  15. package/dist/gvc/job.d.ts.map +1 -1
  16. package/dist/gvc/viewport.d.ts +13 -0
  17. package/dist/gvc/viewport.d.ts.map +1 -1
  18. package/dist/index.js +813 -542
  19. package/dist/index.js.map +4 -4
  20. package/dist/layout/circo/blockpath.d.ts +1 -38
  21. package/dist/layout/circo/blockpath.d.ts.map +1 -1
  22. package/dist/layout/circo/crossings.d.ts +59 -0
  23. package/dist/layout/circo/crossings.d.ts.map +1 -0
  24. package/dist/layout/dot/edge-route-chain.d.ts +5 -3
  25. package/dist/layout/dot/edge-route-chain.d.ts.map +1 -1
  26. package/dist/layout/dot/edge-route.d.ts.map +1 -1
  27. package/dist/layout/dot/index.d.ts +10 -2
  28. package/dist/layout/dot/index.d.ts.map +1 -1
  29. package/dist/layout/dot/ortho-adapter.d.ts +6 -2
  30. package/dist/layout/dot/ortho-adapter.d.ts.map +1 -1
  31. package/dist/layout/dot/pack-components.d.ts +4 -1
  32. package/dist/layout/dot/pack-components.d.ts.map +1 -1
  33. package/dist/layout/dot/splines-flat-multi.d.ts +4 -4
  34. package/dist/layout/dot/splines-flat.d.ts +1 -11
  35. package/dist/layout/dot/splines-flat.d.ts.map +1 -1
  36. package/dist/layout/dot/splines-route.d.ts.map +1 -1
  37. package/dist/layout/neato/constraint-adjust.d.ts +32 -0
  38. package/dist/layout/neato/constraint-adjust.d.ts.map +1 -1
  39. package/dist/layout/neato/multispline.d.ts.map +1 -1
  40. package/dist/layout/neato/splines.d.ts.map +1 -1
  41. package/dist/layout/pack/poly-place.d.ts.map +1 -1
  42. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts +23 -0
  43. package/dist/layout/sfdp/__fixtures__/pcp-rotate-native.d.ts.map +1 -0
  44. package/dist/layout/sfdp/spring-driver.d.ts +6 -0
  45. package/dist/layout/sfdp/spring-driver.d.ts.map +1 -1
  46. package/dist/ortho/index.d.ts +4 -1
  47. package/dist/ortho/index.d.ts.map +1 -1
  48. package/dist/ortho/maze.d.ts +5 -2
  49. package/dist/ortho/maze.d.ts.map +1 -1
  50. package/dist/ortho/partition.d.ts +8 -1
  51. package/dist/ortho/partition.d.ts.map +1 -1
  52. package/dist/ortho/trap-segment.d.ts +2 -1
  53. package/dist/ortho/trap-segment.d.ts.map +1 -1
  54. package/dist/ortho/trapezoid.d.ts.map +1 -1
  55. package/dist/parser/index.d.ts +0 -7
  56. package/dist/parser/index.d.ts.map +1 -1
  57. package/dist/parser/number-scan.d.ts +31 -0
  58. package/dist/parser/number-scan.d.ts.map +1 -0
  59. package/dist/render/dot/edge-draw.d.ts +12 -0
  60. package/dist/render/dot/edge-draw.d.ts.map +1 -1
  61. package/dist/render/svg-graph.d.ts +6 -5
  62. package/dist/render/svg-graph.d.ts.map +1 -1
  63. package/dist/render/svg.d.ts +2 -21
  64. package/dist/render/svg.d.ts.map +1 -1
  65. package/dist/render.js +813 -542
  66. package/dist/render.js.map +4 -4
  67. package/dist/xdot/parse.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/src/common/arith.ts +25 -0
  70. package/src/common/edge-in-box.ts +54 -0
  71. package/src/common/graph-init.ts +3 -3
  72. package/src/common/htmltable-emit.ts +4 -2
  73. package/src/common/make-label.ts +3 -1
  74. package/src/common/poly-gencode.ts +18 -4
  75. package/src/gvc/device.ts +8 -41
  76. package/src/gvc/edge-labels.ts +30 -13
  77. package/src/gvc/emit-gates.ts +89 -0
  78. package/src/gvc/job.ts +4 -0
  79. package/src/gvc/viewport.ts +29 -0
  80. package/src/layout/circo/blockpath.ts +6 -125
  81. package/src/layout/circo/crossings.ts +171 -0
  82. package/src/layout/dot/__fixtures__/2784.dot +1 -0
  83. package/src/layout/dot/__fixtures__/2784.native-16.1.svg +48 -0
  84. package/src/layout/dot/edge-route-chain.ts +11 -5
  85. package/src/layout/dot/edge-route.ts +2 -1
  86. package/src/layout/dot/index.ts +14 -4
  87. package/src/layout/dot/ortho-adapter.ts +7 -3
  88. package/src/layout/dot/pack-components.ts +11 -4
  89. package/src/layout/dot/splines-flat-multi.ts +4 -4
  90. package/src/layout/dot/splines-flat.ts +5 -32
  91. package/src/layout/dot/splines-route.ts +10 -2
  92. package/src/layout/dot/splines.ts +6 -6
  93. package/src/layout/neato/constraint-adjust.ts +10 -4
  94. package/src/layout/neato/multispline.ts +26 -9
  95. package/src/layout/neato/splines.ts +7 -7
  96. package/src/layout/pack/poly-place.ts +9 -2
  97. package/src/layout/sfdp/__fixtures__/pcp-rotate-native.ts +94 -0
  98. package/src/layout/sfdp/spring-driver.ts +45 -13
  99. package/src/ortho/index.ts +22 -13
  100. package/src/ortho/maze.ts +8 -2
  101. package/src/ortho/partition.ts +17 -2
  102. package/src/ortho/trap-segment.ts +47 -24
  103. package/src/ortho/trapezoid.ts +24 -15
  104. package/src/parser/dot.js +334 -343
  105. package/src/parser/dot.pegjs +19 -5
  106. package/src/parser/index.ts +15 -0
  107. package/src/parser/number-scan.ts +118 -0
  108. package/src/render/dot/edge-draw.ts +25 -0
  109. package/src/render/svg-graph.ts +77 -47
  110. package/src/render/svg-helpers.ts +2 -2
  111. package/src/render/svg.ts +4 -41
  112. package/src/xdot/parse.ts +19 -5
package/dist/render.js CHANGED
@@ -5086,8 +5086,8 @@ function normalizeFontName(name) {
5086
5086
  for (let i = 0; i < name.length; i++) {
5087
5087
  const ch = name[i];
5088
5088
  const code = ch.charCodeAt(0);
5089
- const isLetter = code >= 65 && code <= 90 || code >= 97 && code <= 122;
5090
- if (isLetter) result += ch.toLowerCase();
5089
+ const isLetter2 = code >= 65 && code <= 90 || code >= 97 && code <= 122;
5090
+ if (isLetter2) result += ch.toLowerCase();
5091
5091
  }
5092
5092
  return result;
5093
5093
  }
@@ -7338,7 +7338,7 @@ function interpretCRNL(str) {
7338
7338
 
7339
7339
  // src/common/make-label.ts
7340
7340
  var DEFAULT_FONTSIZE2 = 14;
7341
- var DEFAULT_FONTNAME = "Times,serif";
7341
+ var DEFAULT_FONTNAME = "Times-Roman";
7342
7342
  var DEFAULT_COLOR = "black";
7343
7343
  function getPenColor(obj) {
7344
7344
  if (obj === void 0) return void 0;
@@ -8765,6 +8765,10 @@ var RenderJob = class {
8765
8765
  format;
8766
8766
  bb = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
8767
8767
  pad = { x: 0, y: 0 };
8768
+ /** Current page clip in graph units, as setup_page computes it from the
8769
+ * viewport focus/view (see setupPageClip). Read by the SVG page translate and
8770
+ * background. @see lib/gvc/gvcjob.h:GVJ_s.clip; lib/common/emit.c:setup_page */
8771
+ clip = { ll: { x: 0, y: 0 }, ur: { x: 0, y: 0 } };
8768
8772
  /** Graph-level `margin=` (init_job_margin); page-pagination margin, distinct
8769
8773
  * from node/cluster label margin. @see lib/common/emit.c:3309-3331 */
8770
8774
  margin = { x: 0, y: 0 };
@@ -10317,11 +10321,11 @@ function emitHtmlLabel(placed, pos, renderer, job) {
10317
10321
  style: placed.style
10318
10322
  });
10319
10323
  }
10320
- for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
10321
10324
  emitTableRules(placed, pos, renderer, job);
10322
10325
  if (placed.border > 0) {
10323
10326
  emitBorder({ box: placed.box, pos, border: placed.border, color: placed.color, sides: placed.sides, style: placed.style }, renderer, job);
10324
10327
  }
10328
+ for (const cell2 of placed.cells) emitHtmlCell(cell2, pos, renderer, job);
10325
10329
  }
10326
10330
  if (inAnchor) endHtmlAnchor(renderer, job);
10327
10331
  if (clustersLast && initHtmlAnchor(anchorData, tblBox, renderer, job)) {
@@ -10509,6 +10513,18 @@ function fms(a, b, c) {
10509
10513
  function cround(v) {
10510
10514
  return v >= 0 ? Math.floor(v + 0.5) : Math.ceil(v - 0.5);
10511
10515
  }
10516
+ var INT64_MAX = 2n ** 63n - 1n;
10517
+ var INT64_MIN = -(2n ** 63n);
10518
+ var TWO_POW_63 = 2 ** 63;
10519
+ function croundNarrow32(v) {
10520
+ const r = cround(v);
10521
+ let i64;
10522
+ if (Number.isNaN(r)) i64 = 0n;
10523
+ else if (r >= TWO_POW_63) i64 = INT64_MAX;
10524
+ else if (r < -TWO_POW_63) i64 = INT64_MIN;
10525
+ else i64 = BigInt(r);
10526
+ return Number(BigInt.asIntN(32, i64));
10527
+ }
10512
10528
  function RADIANS(deg) {
10513
10529
  return deg / 180 * Math.PI;
10514
10530
  }
@@ -11346,6 +11362,8 @@ function parseSegs(colorlist) {
11346
11362
  }
11347
11363
 
11348
11364
  // src/util/math.ts
11365
+ var INT32_MAX = 2147483647;
11366
+ var INT32_MIN = -2147483648;
11349
11367
  function isExactlyEqual(a, b) {
11350
11368
  const buf = new ArrayBuffer(16);
11351
11369
  const dv = new DataView(buf);
@@ -11357,6 +11375,11 @@ function isExactlyEqual(a, b) {
11357
11375
  }
11358
11376
  return true;
11359
11377
  }
11378
+ function d2i(v) {
11379
+ if (v > INT32_MAX) return INT32_MAX;
11380
+ if (v < INT32_MIN) return INT32_MIN;
11381
+ return Math.trunc(v);
11382
+ }
11360
11383
 
11361
11384
  // src/common/colorData.ts
11362
11385
  var COLOR_LIB = [
@@ -14568,9 +14591,12 @@ function isMulticolor(fillcolor) {
14568
14591
  return fillcolor.includes(":");
14569
14592
  }
14570
14593
  function renderEllipse(ring, coord, renderer, job, filled) {
14571
- const rx = Math.abs((ring[1].x - ring[0].x) / 2);
14572
- const ry = Math.abs((ring[1].y - ring[0].y) / 2);
14573
- const center = transformPoint(coord, job);
14594
+ const af0 = { x: ring[0].x + coord.x, y: ring[0].y + coord.y };
14595
+ const af1 = { x: ring[1].x + coord.x, y: ring[1].y + coord.y };
14596
+ const mid = { x: (af0.x + af1.x) / 2, y: (af0.y + af1.y) / 2 };
14597
+ const rx = af1.x - mid.x;
14598
+ const ry = af1.y - mid.y;
14599
+ const center = transformPoint(mid, job);
14574
14600
  renderer.ellipse(center, rx, ry, filled, job);
14575
14601
  }
14576
14602
  function renderPolygon(ring, coord, renderer, job, filled) {
@@ -18173,7 +18199,7 @@ var BGCOLOR_TRANSPARENT = "\0transparent";
18173
18199
  function formatG(n) {
18174
18200
  return String(parseFloat(n.toPrecision(6)));
18175
18201
  }
18176
- function emitSvgTag(job) {
18202
+ function emitSvgTag(job, svgid = "") {
18177
18203
  const bb = job.bb;
18178
18204
  const szx = bb.ur.x - bb.ll.x + 2 * job.pad.x;
18179
18205
  const szy = bb.ur.y - bb.ll.y + 2 * job.pad.y;
@@ -18182,16 +18208,20 @@ function emitSvgTag(job) {
18182
18208
  const rotated = job.rotation !== 0;
18183
18209
  const pageX = rotated ? viewY : viewX;
18184
18210
  const pageY = rotated ? viewX : viewY;
18185
- const w = cround(pageX + 2 * job.margin.x);
18186
- const h = cround(pageY + 2 * job.margin.y);
18211
+ const w = croundNarrow32(pageX + 2 * job.margin.x);
18212
+ const h = croundNarrow32(pageY + 2 * job.margin.y);
18187
18213
  job.write('<svg width="' + String(w) + 'pt" height="' + String(h) + 'pt"\n');
18188
- const vbLLx = cround(job.margin.x);
18189
- const vbLLy = cround(job.margin.y);
18190
- const vbURx = cround(job.margin.x + pageX);
18191
- const vbURy = cround(job.margin.y + pageY);
18214
+ const vbLLx = croundNarrow32(job.margin.x);
18215
+ const vbLLy = croundNarrow32(job.margin.y);
18216
+ const vbURx = croundNarrow32(job.margin.x + pageX);
18217
+ const vbURy = croundNarrow32(job.margin.y + pageY);
18192
18218
  job.write(' viewBox="' + String(vbLLx) + ".00 " + String(vbLLy) + ".00 " + String(vbURx) + ".00 " + String(vbURy) + '.00"\n');
18193
18219
  job.write(' xmlns="http://www.w3.org/2000/svg"');
18194
- job.write(' xmlns:xlink="http://www.w3.org/1999/xlink">\n');
18220
+ job.write(' xmlns:xlink="http://www.w3.org/1999/xlink"');
18221
+ if (svgid !== void 0 && svgid.length > 0) {
18222
+ job.write(' id="' + escapeXmlTitle(svgid) + '"');
18223
+ }
18224
+ job.write(">\n");
18195
18225
  }
18196
18226
  function emitGraphGroupOpen(graphId, classStr, tx, ty, job) {
18197
18227
  const sx = formatG(job.scale.x);
@@ -18215,12 +18245,12 @@ function resolveGraphBgcolor(bgcolorAttr) {
18215
18245
  const solid = grad !== null ? grad[0] : bgcolorAttr;
18216
18246
  return colorPaint(resolveRenderColor(solid));
18217
18247
  }
18218
- function emitGraphBackground(bb, resolvedColor, job) {
18248
+ function emitGraphBackground(clip, resolvedColor, job) {
18219
18249
  if (resolvedColor === BGCOLOR_TRANSPARENT) return;
18220
- const left2 = bb.ll.x - job.pad.x;
18221
- const right2 = bb.ur.x + job.pad.x;
18222
- const top = -(bb.ur.y + job.pad.y);
18223
- const bottom = -(bb.ll.y - job.pad.y);
18250
+ const left2 = clip.ll.x;
18251
+ const right2 = clip.ur.x;
18252
+ const top = -clip.ur.y;
18253
+ const bottom = -clip.ll.y;
18224
18254
  const corners = [
18225
18255
  [left2, bottom],
18226
18256
  [left2, top],
@@ -18237,11 +18267,11 @@ function emitGraphBackground(bb, resolvedColor, job) {
18237
18267
  });
18238
18268
  job.write('"/>\n');
18239
18269
  }
18240
- function bgGradientPts(bb, pad) {
18241
- const left2 = bb.ll.x - pad.x;
18242
- const right2 = bb.ur.x + pad.x;
18243
- const bottom = bb.ll.y - pad.y;
18244
- const top = bb.ur.y + pad.y;
18270
+ function bgGradientPts(clip) {
18271
+ const left2 = clip.ll.x;
18272
+ const right2 = clip.ur.x;
18273
+ const bottom = clip.ll.y;
18274
+ const top = clip.ur.y;
18245
18275
  return [
18246
18276
  { x: left2, y: bottom },
18247
18277
  { x: left2, y: top },
@@ -18249,11 +18279,11 @@ function bgGradientPts(bb, pad) {
18249
18279
  { x: right2, y: bottom }
18250
18280
  ];
18251
18281
  }
18252
- function writeGradientPolygon(bb, id, job) {
18253
- const left2 = bb.ll.x - job.pad.x;
18254
- const right2 = bb.ur.x + job.pad.x;
18255
- const top = -(bb.ur.y + job.pad.y);
18256
- const bottom = -(bb.ll.y - job.pad.y);
18282
+ function writeGradientPolygon(clip, id, job) {
18283
+ const left2 = clip.ll.x;
18284
+ const right2 = clip.ur.x;
18285
+ const top = -clip.ur.y;
18286
+ const bottom = -clip.ll.y;
18257
18287
  const corners = [
18258
18288
  [left2, bottom],
18259
18289
  [left2, top],
@@ -18270,7 +18300,7 @@ function writeGradientPolygon(bb, id, job) {
18270
18300
  });
18271
18301
  job.write('"/>\n');
18272
18302
  }
18273
- function emitGradientBackground(bb, spec, job) {
18303
+ function emitGradientBackground(clip, spec, job) {
18274
18304
  const obj = createObjState(0 /* RootGraph */);
18275
18305
  obj.id = "graph0";
18276
18306
  obj.fillColor = resolveRenderColor(spec.fillColor);
@@ -18285,10 +18315,10 @@ function emitGradientBackground(bb, spec, job) {
18285
18315
  emitRadialGradient(job, gid);
18286
18316
  } else {
18287
18317
  gid = gradientId("graph0", "l", job.linearGradId++);
18288
- emitLinearGradient(job, bgGradientPts(bb, job.pad), gid);
18318
+ emitLinearGradient(job, bgGradientPts(clip), gid);
18289
18319
  }
18290
18320
  job.popObj();
18291
- writeGradientPolygon(bb, gid, job);
18321
+ writeGradientPolygon(clip, gid, job);
18292
18322
  }
18293
18323
  function resolveBgGradientSpec(g, bgcolorAttr) {
18294
18324
  const stop = findStopColor(bgcolorAttr);
@@ -18298,17 +18328,17 @@ function resolveBgGradientSpec(g, bgcolorAttr) {
18298
18328
  const angle = angleStr ? parseInt(angleStr, 10) || 0 : 0;
18299
18329
  return { fillColor: stop.fillColor, stopColor: stop.stopColor, frac: stop.frac, angle, radial: flags.radial };
18300
18330
  }
18301
- function emitBgcolorBackground(g, bb, bgcolorAttr, job) {
18331
+ function emitBgcolorBackground(g, clip, bgcolorAttr, job) {
18302
18332
  if (!bgcolorAttr || bgcolorAttr.length === 0 || bgcolorAttr === "transparent") {
18303
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
18333
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
18304
18334
  return;
18305
18335
  }
18306
18336
  const spec = resolveBgGradientSpec(g, bgcolorAttr);
18307
18337
  if (spec !== null) {
18308
- emitGradientBackground(bb, spec, job);
18338
+ emitGradientBackground(clip, spec, job);
18309
18339
  return;
18310
18340
  }
18311
- emitGraphBackground(bb, resolveGraphBgcolor(bgcolorAttr), job);
18341
+ emitGraphBackground(clip, resolveGraphBgcolor(bgcolorAttr), job);
18312
18342
  }
18313
18343
  function svgBeginGraph(g, job) {
18314
18344
  job.devscale = { x: 1, y: -1 };
@@ -18322,13 +18352,23 @@ function svgBeginGraph(g, job) {
18322
18352
  }
18323
18353
  job.write(SVG_DOCTYPE);
18324
18354
  job.write(SVG_GENERATOR_COMMENT);
18325
- emitSvgTag(job);
18355
+ const comment = g.attrs.get("comment");
18356
+ if (comment !== void 0 && comment.length > 0) svgComment(comment, job);
18357
+ emitTitlePagesComment(g, job);
18358
+ emitSvgTag(job, g.attrs.get("svgid"));
18359
+ }
18360
+ function emitTitlePagesComment(g, job) {
18361
+ job.write("<!--");
18362
+ if (g.name.length > 0 && g.name[0] !== "%") {
18363
+ job.write(" Title: " + escapeXmlTitle(g.name));
18364
+ }
18365
+ job.write(" Pages: 1 -->\n");
18326
18366
  }
18327
18367
  function svgBeginPage(g, job) {
18328
- const bb = job.bb;
18368
+ const clip = job.clip;
18329
18369
  const z = job.scale.x;
18330
- const tx = job.rotation !== 0 ? -(bb.ur.x + job.pad.x) - job.margin.x / z : job.pad.x + job.margin.x / z;
18331
- const ty = bb.ur.y + job.pad.y + job.margin.y / z;
18370
+ const tx = job.rotation !== 0 ? -clip.ur.x - job.margin.x / z : -clip.ll.x + job.margin.x / z;
18371
+ const ty = clip.ur.y + job.margin.y / z;
18332
18372
  emitGraphGroupOpen(
18333
18373
  job.idLayerPrefix() + svgGraphId(g, job),
18334
18374
  svgGraphClass(g),
@@ -18339,7 +18379,7 @@ function svgBeginPage(g, job) {
18339
18379
  emitGraphTitle(g, job);
18340
18380
  }
18341
18381
  function svgPageBackground(g, job) {
18342
- emitBgcolorBackground(g, job.bb, g.attrs.get("bgcolor"), job);
18382
+ emitBgcolorBackground(g, job.clip, g.attrs.get("bgcolor"), job);
18343
18383
  }
18344
18384
  function svgEndPage(job) {
18345
18385
  job.write("</g>\n");
@@ -18675,7 +18715,7 @@ function svgPolyline(pts, job) {
18675
18715
  job.write('"/>\n');
18676
18716
  }
18677
18717
  function svgComment(text, job) {
18678
- job.write("<!-- " + escapeXml(text) + " -->\n");
18718
+ job.write("<!-- " + escapeXmlTitle(text) + " -->\n");
18679
18719
  }
18680
18720
  function svgEdgePath(e, job) {
18681
18721
  const spl = e.info.spl;
@@ -18862,6 +18902,22 @@ function initJobViewportZoom(bb, size, pad) {
18862
18902
  if (drawingNeedsFit(size, szx, szy)) return Math.min(size.x / szx, size.y / szy);
18863
18903
  return 1;
18864
18904
  }
18905
+ function setupPageClip(bb, size, pad, z) {
18906
+ const jbLL = { x: bb.ll.x - pad.x, y: bb.ll.y - pad.y };
18907
+ const jbUR = { x: bb.ur.x + pad.x, y: bb.ur.y + pad.y };
18908
+ const sz = { x: jbUR.x - jbLL.x, y: jbUR.y - jbLL.y };
18909
+ if (size !== null && size.x > 1e-3 && size.y > 1e-3) {
18910
+ if (sz.x <= 1e-3) sz.x = size.x;
18911
+ if (sz.y <= 1e-3) sz.y = size.y;
18912
+ }
18913
+ const focus = { x: 0.5 * (bb.ll.x + bb.ur.x), y: 0.5 * (bb.ll.y + bb.ur.y) };
18914
+ const pageSize = { x: z * sz.x / z, y: z * sz.y / z };
18915
+ const ll = {
18916
+ x: focus.x + pageSize.x * (0 - 1 / 2),
18917
+ y: focus.y + pageSize.y * (0 - 1 / 2)
18918
+ };
18919
+ return { ll, ur: { x: ll.x + pageSize.x, y: ll.y + pageSize.y } };
18920
+ }
18865
18921
 
18866
18922
  // src/gvc/anchor.ts
18867
18923
  function attr(attrs, key) {
@@ -19373,10 +19429,22 @@ function renderClusterLabel(sg, renderer, job) {
19373
19429
  renderOneLabel(sg.info.label, renderer, job, false);
19374
19430
  }
19375
19431
 
19376
- // src/gvc/device.ts
19377
- function labelTextOf2(lp) {
19378
- return lp?.text ?? null;
19432
+ // src/common/edge-in-box.ts
19433
+ function overlapLabel(lp, b) {
19434
+ const sx = lp.dimen.x / 2;
19435
+ const sy = lp.dimen.y / 2;
19436
+ const bb = {
19437
+ ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
19438
+ ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
19439
+ };
19440
+ return boxOverlap(b, bb);
19379
19441
  }
19442
+ function edgeHasDrawableContent(e, clip) {
19443
+ const i = e.info;
19444
+ return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
19445
+ }
19446
+
19447
+ // src/gvc/emit-gates.ts
19380
19448
  function nodeBBox(n) {
19381
19449
  const { coord, lw, rw, ht } = n.info;
19382
19450
  return {
@@ -19391,6 +19459,26 @@ function nodeInBox(n, job) {
19391
19459
  };
19392
19460
  return boxOverlap(nodeBBox(n), clip);
19393
19461
  }
19462
+ function gvrenderComment(renderer, job, str) {
19463
+ if (str === void 0 || str.length === 0) return;
19464
+ renderer.comment?.(str, job);
19465
+ }
19466
+ function emitNodeComments(n, renderer, job) {
19467
+ gvrenderComment(renderer, job, n.name);
19468
+ gvrenderComment(renderer, job, nodeAttr(n, n.root, "comment"));
19469
+ }
19470
+ function emitEdgeComments(e, renderer, job) {
19471
+ if (!edgeHasDrawableContent(e, job.bb)) return;
19472
+ const kind = e.head.root.kind;
19473
+ const op = kind === "directed" || kind === "strict-directed" ? "->" : "--";
19474
+ gvrenderComment(renderer, job, e.tail.name + op + e.head.name);
19475
+ gvrenderComment(renderer, job, e.attrs.get("comment"));
19476
+ }
19477
+
19478
+ // src/gvc/device.ts
19479
+ function labelTextOf2(lp) {
19480
+ return lp?.text ?? null;
19481
+ }
19394
19482
  function emitNodeBody(n, renderer, job) {
19395
19483
  setHtmlAnchorObj(svgNodeId(n, job), labelTextOf2(n.info.label), job.obj ?? void 0);
19396
19484
  setHtmlObjImgscale(nodeAttr(n, n.root, "imagescale"));
@@ -19406,6 +19494,7 @@ function renderNode(n, renderer, job, done) {
19406
19494
  if (done.has(n)) return;
19407
19495
  done.add(n);
19408
19496
  if (!nodeInBox(n, job)) return;
19497
+ emitNodeComments(n, renderer, job);
19409
19498
  const nodeStyle = nodeAttr(n, n.root, "style");
19410
19499
  if (parseStyleFlags(nodeStyle).invis) return;
19411
19500
  if (!isPointNode(n) && styleHasInvisibleAlias(nodeStyle)) return;
@@ -19431,6 +19520,7 @@ function setEdgePen(e, job) {
19431
19520
  obj.rawStyle = styleTokens(e.attrs.get("style"));
19432
19521
  }
19433
19522
  function renderEdge(e, renderer, job) {
19523
+ emitEdgeComments(e, renderer, job);
19434
19524
  const edgeStyle = e.attrs.get("style");
19435
19525
  if (parseStyleFlags(edgeStyle).invis || styleHasInvisibleAlias(edgeStyle)) return;
19436
19526
  const obj = createObjState(3 /* Edge */);
@@ -19544,7 +19634,9 @@ function render(ctx, g, format, inlineImages = false) {
19544
19634
  job.bb = g.info.bb;
19545
19635
  job.pad = parseGraphPad(g.attrs.get("pad"));
19546
19636
  job.margin = parseGraphMargin(g.attrs.get("margin"));
19547
- const z = initJobViewportZoom(job.bb, parseDrawingSize(g.attrs.get("size")), job.pad);
19637
+ const drawingSize = parseDrawingSize(g.attrs.get("size"));
19638
+ const z = initJobViewportZoom(job.bb, drawingSize, job.pad);
19639
+ job.clip = setupPageClip(job.bb, drawingSize, job.pad, z);
19548
19640
  const drawingDpi = lateDouble(
19549
19641
  g.attrs.get("dpi"),
19550
19642
  lateDouble(g.attrs.get("resolution"), 0, 0),
@@ -27199,7 +27291,7 @@ function routeMultiRankEdgeFaithful(g, e) {
27199
27291
  }
27200
27292
  const segs = chainSegments(e);
27201
27293
  if (segs.length === 0 || segs[segs.length - 1].head !== e.head) return null;
27202
- return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
27294
+ return routeChainSegmented(g, segs[0], segs[segs.length - 1], segs) ?? "lost";
27203
27295
  }
27204
27296
  function entryRunSegments(e) {
27205
27297
  const segs = [e];
@@ -27271,7 +27363,10 @@ function routeBackEdge(e, _tailBox, _headBox, g) {
27271
27363
  if (segs.length < 2 || segs[segs.length - 1].head !== e.tail) return;
27272
27364
  const fwdEdge = makeFwdEdge(e);
27273
27365
  const fwd = routeChainSegmented(g, segs[0], segs[segs.length - 1], segs);
27274
- if (fwd === null) return;
27366
+ if (fwd === null) {
27367
+ e.info.lost = true;
27368
+ return;
27369
+ }
27275
27370
  clipAndInstall(fwdEdge, fwdEdge.head, fwd, fwd.length, buildDotSinfo());
27276
27371
  if (swapEndsP(e)) swapEdgeSpline(e);
27277
27372
  }
@@ -27423,7 +27518,7 @@ function baseSplineForGroup(g, e0) {
27423
27518
  const orig = resolveOrigEdge(e0);
27424
27519
  const fe = isBackEdgeMember(orig) ? makeFwdEdge(orig) : orig;
27425
27520
  const pts = routeRegularEdgeFaithful(g, fe);
27426
- if (pts === "lost") return null;
27521
+ if (pts === "lost") return "lost";
27427
27522
  return pts ?? routeMultiRankEdgeFaithful(g, fe);
27428
27523
  }
27429
27524
  function isBackEdgeMember(e) {
@@ -27452,6 +27547,10 @@ function routeParallelEdgeGroup(g, edges, multisep) {
27452
27547
  return o.info.head_port?.defined || o.info.tail_port?.defined;
27453
27548
  }) ?? edges[0];
27454
27549
  const base = baseSplineForGroup(g, baseEdge);
27550
+ if (base === "lost") {
27551
+ for (const e of edges) resolveOrigEdge(e).info.lost = true;
27552
+ return;
27553
+ }
27455
27554
  if (base === null) return;
27456
27555
  if (cnt === 1) {
27457
27556
  installShiftedEdge(edges[0], base);
@@ -30357,6 +30456,10 @@ function routeOneEdge(e, g) {
30357
30456
  function routeFaithfulMultiRank(e, g) {
30358
30457
  const pts = routeMultiRankEdgeFaithful(g, e);
30359
30458
  if (pts === null) return false;
30459
+ if (pts === "lost") {
30460
+ e.info.lost = true;
30461
+ return true;
30462
+ }
30360
30463
  clipAndInstall(e, e.head, pts, pts.length, buildDotSinfo());
30361
30464
  return true;
30362
30465
  }
@@ -30865,24 +30968,28 @@ function addSegment(segnum, seg2, tr, qs) {
30865
30968
  swapSegEndpoints(s);
30866
30969
  isSwapped = true;
30867
30970
  }
30868
- let tfirst;
30869
- if (!inserted(segnum, seg2, isSwapped ? LASTPT : FIRSTPT)) {
30870
- tfirst = insertV0(s, seg2, tr, qs, segnum);
30871
- } else {
30872
- tfirst = locateEndpoint(s.v0, s.v1, s.root0, seg2, qs);
30971
+ const ctx = { s, seg: seg2, tr, qs, segnum, tribot: false, isSwapped };
30972
+ const tfirst = firstTrap(ctx);
30973
+ const tlast = lastTrap(ctx);
30974
+ if (threadSegment(ctx, tfirst, tlast) !== 0) return -1;
30975
+ seg2[segnum].isInserted = true;
30976
+ return 0;
30977
+ }
30978
+ function firstTrap(c) {
30979
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? LASTPT : FIRSTPT)) {
30980
+ return insertV0(c.s, c.seg, c.tr, c.qs, c.segnum);
30873
30981
  }
30874
- let tlast;
30875
- let tribot = false;
30876
- if (!inserted(segnum, seg2, isSwapped ? FIRSTPT : LASTPT)) {
30877
- tlast = insertV1(s, seg2, tr, qs, segnum);
30878
- } else {
30879
- tlast = locateEndpoint(s.v1, s.v0, s.root1, seg2, qs);
30880
- tribot = true;
30982
+ return locateEndpoint(c.s.v0, c.s.v1, c.s.root0, c.seg, c.qs);
30983
+ }
30984
+ function lastTrap(c) {
30985
+ if (!inserted(c.segnum, c.seg, c.isSwapped ? FIRSTPT : LASTPT)) {
30986
+ return insertV1(c.s, c.seg, c.tr, c.qs, c.segnum);
30881
30987
  }
30882
- threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped);
30883
- seg2[segnum].isInserted = true;
30988
+ c.tribot = true;
30989
+ return locateEndpoint(c.s.v1, c.s.v0, c.s.root1, c.seg, c.qs);
30884
30990
  }
30885
- function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped) {
30991
+ function threadSegment(c, tfirst, tlast) {
30992
+ const { s, seg: seg2, tr, qs, segnum, tribot, isSwapped } = c;
30886
30993
  let tfirstr = INVALID_TRAP;
30887
30994
  let tlastr = INVALID_TRAP;
30888
30995
  let t = tfirst;
@@ -30909,17 +31016,20 @@ function threadSegment(s, seg2, tr, qs, segnum, tfirst, tlast, tribot, isSwapped
30909
31016
  if (equalTo(tr[t].lo, tr[tlast].lo)) tlastr = tn;
30910
31017
  const tSav = t;
30911
31018
  const tnSav = tn;
31019
+ if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
31020
+ console.error("trapezoid segment construction failed");
31021
+ return -1;
31022
+ }
30912
31023
  t = advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
30913
31024
  tr[tSav].rseg = segnum;
30914
31025
  tr[tnSav].lseg = segnum;
30915
31026
  }
30916
31027
  mergeTrapezoids(segnum, tfirst, tlast, S_LEFT, tr, qs);
30917
31028
  mergeTrapezoids(segnum, tfirstr, tlastr, S_RIGHT, tr, qs);
31029
+ return 0;
30918
31030
  }
30919
31031
  function advanceT(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot) {
30920
- if (!isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
30921
- return INVALID_TRAP;
30922
- } else if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
31032
+ if (isValidTrap(tr[t].d0) && !isValidTrap(tr[t].d1)) {
30923
31033
  handleD0Only(s, seg2, tr, t, tn, tlast, segnum, isSwapped, tribot);
30924
31034
  return tr[t].d0;
30925
31035
  } else if (!isValidTrap(tr[t].d0) && isValidTrap(tr[t].d1)) {
@@ -30939,33 +31049,16 @@ function findNewRoots(segnum, seg2, tr, qs) {
30939
31049
  // src/ortho/trapezoid.ts
30940
31050
  function constructTrapezoids(nseg, seg2, permute) {
30941
31051
  const qs = [];
30942
- const tr = [];
30943
- tr.push({
30944
- lseg: 0,
30945
- rseg: 0,
30946
- hi: { x: 0, y: 0 },
30947
- lo: { x: 0, y: 0 },
30948
- u0: 0,
30949
- u1: 0,
30950
- d0: 0,
30951
- d1: 0,
30952
- sink: 0,
30953
- usave: 0,
30954
- uside: 0,
30955
- isValid: false
30956
- });
31052
+ const tr = [sentinelTrap()];
30957
31053
  let segi = 0;
30958
31054
  const root = initQueryStructure(permute[segi++], seg2, tr, qs);
30959
- for (let i = 1; i <= nseg; i++) {
30960
- seg2[i].root0 = root;
30961
- seg2[i].root1 = root;
30962
- }
31055
+ seedRoots(nseg, seg2, root);
30963
31056
  const logstar = mathLogstarN(nseg);
30964
31057
  for (let h = 1; h <= logstar; h++) {
30965
31058
  const lo = mathN(nseg, h - 1) + 1;
30966
31059
  const hi = mathN(nseg, h);
30967
31060
  for (let i = lo; i <= hi; i++) {
30968
- addSegment(permute[segi++], seg2, tr, qs);
31061
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
30969
31062
  }
30970
31063
  for (let i = 1; i <= nseg; i++) {
30971
31064
  findNewRoots(i, seg2, tr, qs);
@@ -30973,10 +31066,32 @@ function constructTrapezoids(nseg, seg2, permute) {
30973
31066
  }
30974
31067
  const remaining = mathN(nseg, logstar) + 1;
30975
31068
  for (let i = remaining; i <= nseg; i++) {
30976
- addSegment(permute[segi++], seg2, tr, qs);
31069
+ if (addSegment(permute[segi++], seg2, tr, qs) !== 0) return [];
30977
31070
  }
30978
31071
  return tr;
30979
31072
  }
31073
+ function sentinelTrap() {
31074
+ return {
31075
+ lseg: 0,
31076
+ rseg: 0,
31077
+ hi: { x: 0, y: 0 },
31078
+ lo: { x: 0, y: 0 },
31079
+ u0: 0,
31080
+ u1: 0,
31081
+ d0: 0,
31082
+ d1: 0,
31083
+ sink: 0,
31084
+ usave: 0,
31085
+ uside: 0,
31086
+ isValid: false
31087
+ };
31088
+ }
31089
+ function seedRoots(nseg, seg2, root) {
31090
+ for (let i = 1; i <= nseg; i++) {
31091
+ seg2[i].root0 = root;
31092
+ seg2[i].root1 = root;
31093
+ }
31094
+ }
30980
31095
  function initQueryStructure(segnum, seg2, tr, qs) {
30981
31096
  const s = seg2[segnum];
30982
31097
  const i1 = newQNode(qs);
@@ -31280,10 +31395,18 @@ function partition(cells, bb) {
31280
31395
  const hSeg = h.genSegments(cells, bb, false);
31281
31396
  const hPerm = h.generateRandomOrdering(nsegs);
31282
31397
  const hTr = constructTrapezoids(nsegs, hSeg, hPerm);
31398
+ if (hTr.length === 0) {
31399
+ console.error("horizontal trapezoid construction failed");
31400
+ return null;
31401
+ }
31283
31402
  const hDecomp = h.monotonateTrapezoids(hTr, hSeg, false);
31284
31403
  const vSeg = h.genSegments(cells, bb, true);
31285
31404
  const vPerm = h.generateRandomOrdering(nsegs);
31286
31405
  const vTr = constructTrapezoids(nsegs, vSeg, vPerm);
31406
+ if (vTr.length === 0) {
31407
+ console.error("vertical trapezoid construction failed");
31408
+ return null;
31409
+ }
31287
31410
  const vDecomp = h.monotonateTrapezoids(vTr, vSeg, true);
31288
31411
  const result = [];
31289
31412
  for (const v of vDecomp) {
@@ -31292,7 +31415,7 @@ function partition(cells, bb) {
31292
31415
  if (isect) result.push(isect);
31293
31416
  }
31294
31417
  }
31295
- return result;
31418
+ return result.length === 0 ? null : result;
31296
31419
  }
31297
31420
 
31298
31421
  // src/ortho/rawgraph.ts
@@ -32140,6 +32263,7 @@ function mkMaze(g) {
32140
32263
  UR: { x: BB.UR.x + MARGIN, y: BB.UR.y + MARGIN }
32141
32264
  };
32142
32265
  const rects = partition(gcells, BB);
32266
+ if (rects === null) return null;
32143
32267
  const cells = rects.map((bb) => ({
32144
32268
  flags: 0,
32145
32269
  nedges: 0,
@@ -32621,6 +32745,24 @@ function buildSpline(e, rte, mp) {
32621
32745
  pts.push({ ...p });
32622
32746
  return pts;
32623
32747
  }
32748
+ function ensureDummyNodes(sg, gstart) {
32749
+ while (sg.nodes.length < gstart + 2) {
32750
+ sg.nodes.push({
32751
+ nVal: 0,
32752
+ nIdx: 0,
32753
+ nDad: null,
32754
+ nEdge: null,
32755
+ nAdj: 0,
32756
+ saveNAdj: 0,
32757
+ cells: [null, null],
32758
+ adjEdgeList: [],
32759
+ index: sg.nodes.length,
32760
+ isVert: false,
32761
+ x: 0,
32762
+ y: 0
32763
+ });
32764
+ }
32765
+ }
32624
32766
  function orthoEdges(g, useLbls, clipAndInstall2) {
32625
32767
  if (useLbls) {
32626
32768
  console.warn(
@@ -32630,6 +32772,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32630
32772
  }
32631
32773
  void useLbls;
32632
32774
  const mp = mkMaze(g);
32775
+ if (mp === null) return -1;
32633
32776
  const sg = mp.sg;
32634
32777
  const es = g.edges.map((e) => ({ e, d: edgeLen(e) }));
32635
32778
  gvQsort(es, edgeCmp);
@@ -32639,22 +32782,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32639
32782
  const pq = pqGenForGraph(sg);
32640
32783
  const sn = sg.nodes[gstart];
32641
32784
  const dn = sg.nodes[gstart + 1];
32642
- while (sg.nodes.length < gstart + 2) {
32643
- sg.nodes.push({
32644
- nVal: 0,
32645
- nIdx: 0,
32646
- nDad: null,
32647
- nEdge: null,
32648
- nAdj: 0,
32649
- saveNAdj: 0,
32650
- cells: [null, null],
32651
- adjEdgeList: [],
32652
- index: sg.nodes.length,
32653
- isVert: false,
32654
- x: 0,
32655
- y: 0
32656
- });
32657
- }
32785
+ ensureDummyNodes(sg, gstart);
32658
32786
  for (let i = 0; i < nEdges; i++) {
32659
32787
  const e = es[i].e;
32660
32788
  const start = mp.gcells[g.nodes.indexOf(e.tail)];
@@ -32668,7 +32796,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32668
32796
  if (shortPath(pq, sg, dn, sn) !== 0) {
32669
32797
  pqFree(pq);
32670
32798
  freeMaze(mp);
32671
- return;
32799
+ return 0;
32672
32800
  }
32673
32801
  routeList[i] = convertSPtoRoute(sg, sn, dn);
32674
32802
  reset(sg);
@@ -32679,7 +32807,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32679
32807
  assignSegs(routeList, mp);
32680
32808
  if (assignTracks(mp) !== 0) {
32681
32809
  freeMaze(mp);
32682
- return;
32810
+ return 0;
32683
32811
  }
32684
32812
  if (clipAndInstall2) {
32685
32813
  for (let i = 0; i < nEdges; i++) {
@@ -32690,6 +32818,7 @@ function orthoEdges(g, useLbls, clipAndInstall2) {
32690
32818
  }
32691
32819
  }
32692
32820
  freeMaze(mp);
32821
+ return 0;
32693
32822
  }
32694
32823
 
32695
32824
  // src/layout/dot/ortho-adapter.ts
@@ -32760,7 +32889,7 @@ function installOrthoResult(oe, pts) {
32760
32889
  clipAndInstall(origEdge, origEdge.head, pts, pts.length, ORTHO_SINFO);
32761
32890
  }
32762
32891
  function dispatchOrthoEdges(g, useLbls) {
32763
- orthoEdges(
32892
+ return orthoEdges(
32764
32893
  buildOrthoGraph(g),
32765
32894
  useLbls,
32766
32895
  (_og, oe, pts) => installOrthoResult(oe, pts)
@@ -33297,12 +33426,12 @@ function resetRW(g) {
33297
33426
  }
33298
33427
  function orthoDispatch(g) {
33299
33428
  resetRW(g);
33429
+ let rc;
33300
33430
  if (((g.root.info.has_labels ?? 0) & EDGE_LABEL) !== 0) {
33301
33431
  setEdgeLabelPos(g);
33302
- dispatchOrthoEdges(g, true);
33303
- } else {
33304
- dispatchOrthoEdges(g, false);
33305
- }
33432
+ rc = dispatchOrthoEdges(g, true);
33433
+ } else rc = dispatchOrthoEdges(g, false);
33434
+ if (rc !== 0) return rc;
33306
33435
  placePortLabels(g);
33307
33436
  g.info.edgeLabelsDone = true;
33308
33437
  return 0;
@@ -33958,7 +34087,7 @@ function computeStep2(bbs, margin) {
33958
34087
  c -= W * H;
33959
34088
  }
33960
34089
  const r = Math.sqrt(b * b - 4 * a * c);
33961
- const root = Math.trunc((-b + r) / (2 * a));
34090
+ const root = d2i((-b + r) / (2 * a));
33962
34091
  return root === 0 ? 1 : root;
33963
34092
  }
33964
34093
  function lineXDominant(st, ps) {
@@ -34104,7 +34233,7 @@ function fits2(x, y, info, ctx) {
34104
34233
  }
34105
34234
  const bb = ctx.bbs[info.index];
34106
34235
  const LL = { x: cround(bb.ll.x), y: cround(bb.ll.y) };
34107
- ctx.places[info.index] = { x: ctx.step * x - LL.x, y: ctx.step * y - LL.y };
34236
+ ctx.places[info.index] = { x: Math.imul(ctx.step, x) - LL.x, y: Math.imul(ctx.step, y) - LL.y };
34108
34237
  for (const c of info.cells) ctx.ps.add(c.x + x, c.y + y);
34109
34238
  return true;
34110
34239
  }
@@ -34590,7 +34719,7 @@ function dotLayoutComponent(sg, root) {
34590
34719
  dotRank(sg);
34591
34720
  dotMincross(sg);
34592
34721
  dotPosition(sg);
34593
- dotPhasePostNoFinish(sg);
34722
+ return dotPhasePostNoFinish(sg);
34594
34723
  }
34595
34724
  function mapClust(clone, origOf) {
34596
34725
  const orig = origOf.get(clone);
@@ -34676,7 +34805,9 @@ function packComponentsClusterAware(root, comps, pinfo) {
34676
34805
  }
34677
34806
  function layoutAndPack(root, comps, pinfo, origOf) {
34678
34807
  dotGraphInit(root);
34679
- for (const sg of comps) dotLayoutComponent(sg, root);
34808
+ for (const sg of comps) {
34809
+ if (dotLayoutComponent(sg, root) !== 0) return;
34810
+ }
34680
34811
  packComponentsClusterAware(root, comps, pinfo);
34681
34812
  copyClusterInfo(comps, root, origOf);
34682
34813
  expandRootBbForClusters(root);
@@ -34708,11 +34839,13 @@ function dotPhaseInit(g) {
34708
34839
  function dotPhasePostNoFinish(g) {
34709
34840
  removeFill(g);
34710
34841
  dotSameports(g);
34711
- dotSplines(g);
34842
+ const r = dotSplines(g);
34843
+ if (r !== 0) return r;
34712
34844
  if (mapbool2(g.attrs.get("compound") ?? g.root.attrs.get("compound"))) dotCompoundEdges(g);
34845
+ return 0;
34713
34846
  }
34714
34847
  function dotPhasePost(g) {
34715
- dotPhasePostNoFinish(g);
34848
+ if (dotPhasePostNoFinish(g) !== 0) return;
34716
34849
  gvPostprocess(g);
34717
34850
  }
34718
34851
  function graphPhase(g) {
@@ -37598,10 +37731,10 @@ function raySegIntersect(v, w, a, b) {
37598
37731
  const mv = { x: w.x - v.x, y: w.y - v.y };
37599
37732
  const lv = { x: b.x - a.x, y: b.y - a.y };
37600
37733
  const ln = { x: -lv.y, y: lv.x };
37601
- const lc = -(ln.x * a.x + ln.y * a.y);
37602
- const dt = ln.x * mv.x + ln.y * mv.y;
37734
+ const lc = -fma(ln.x, a.x, ln.y * a.y);
37735
+ const dt = fma(ln.x, mv.x, ln.y * mv.y);
37603
37736
  if (Math.abs(dt) < SMALL3) return null;
37604
- const s = (ln.x * v.x + ln.y * v.y + lc) / dt;
37737
+ const s = (fma(ln.x, v.x, ln.y * v.y) + lc) / dt;
37605
37738
  return { x: v.x - s * mv.x, y: v.y - s * mv.y };
37606
37739
  }
37607
37740
  function triPoint(trip, vx, v, w) {
@@ -37619,36 +37752,44 @@ function ctrlPtIdx(v, ps) {
37619
37752
  return -1;
37620
37753
  }
37621
37754
  var SEP = 15;
37755
+ function bisectorTarget(v, cosTheta, sinTheta) {
37756
+ return { x: fma(cosTheta, 100, v.x), y: fma(sinTheta, 100, v.y) };
37757
+ }
37758
+ function distFused(p, q) {
37759
+ const dx = p.x - q.x;
37760
+ const dy = p.y - q.y;
37761
+ return Math.sqrt(fma(dx, dx, dy * dy));
37762
+ }
37622
37763
  function mkCtrlPts(s, mult, prev, v, nxt, trip) {
37623
37764
  const idx = ctrlPtIdx(v, trip.ps);
37624
37765
  if (idx < 0) return null;
37625
37766
  const theta = bisect(prev, v, nxt);
37626
37767
  let sinTheta = Math.sin(theta);
37627
37768
  let cosTheta = Math.cos(theta);
37628
- let w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37769
+ let w = bisectorTarget(v, cosTheta, sinTheta);
37629
37770
  if (idx > s) {
37630
37771
  if (wind(prev, v, w) !== 1) {
37631
37772
  sinTheta *= -1;
37632
37773
  cosTheta *= -1;
37633
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37774
+ w = bisectorTarget(v, cosTheta, sinTheta);
37634
37775
  }
37635
37776
  } else if (wind(prev, v, w) !== -1) {
37636
37777
  sinTheta *= -1;
37637
37778
  cosTheta *= -1;
37638
- w = { x: v.x + 100 * cosTheta, y: v.y + 100 * sinTheta };
37779
+ w = bisectorTarget(v, cosTheta, sinTheta);
37639
37780
  }
37640
37781
  const q = triPoint(trip, idx, v, w);
37641
37782
  if (q === null) return null;
37642
- const d = Math.hypot(q.x - v.x, q.y - v.y);
37783
+ const d = distFused(q, v);
37643
37784
  const sep = d >= mult * SEP ? SEP : d / mult;
37644
37785
  const ps = new Array(mult);
37645
37786
  if (idx < s) {
37646
37787
  for (let i = 0; i < mult; i++) {
37647
- ps[i] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
37788
+ ps[i] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
37648
37789
  }
37649
37790
  } else {
37650
37791
  for (let i = 0; i < mult; i++) {
37651
- ps[mult - i - 1] = { x: v.x + i * sep * cosTheta, y: v.y + i * sep * sinTheta };
37792
+ ps[mult - i - 1] = { x: fma(i * sep, cosTheta, v.x), y: fma(i * sep, sinTheta, v.y) };
37652
37793
  }
37653
37794
  }
37654
37795
  return ps;
@@ -38082,7 +38223,7 @@ var ObstacleHelper = class {
38082
38223
  };
38083
38224
  function ellipseTangentSlope(a, b, p) {
38084
38225
  const signY = p.y >= 0 ? 1 : -1;
38085
- return -signY * (b * p.x) / (a * Math.sqrt(a * a - p.x * p.x));
38226
+ return -signY * (b * p.x) / (a * Math.sqrt(fma(a, a, -(p.x * p.x))));
38086
38227
  }
38087
38228
  function circumscribedCorner(a, b, i, nsides) {
38088
38229
  const angle0 = 2 * Math.PI * (i - 0.5) / nsides;
@@ -38091,8 +38232,8 @@ function circumscribedCorner(a, b, i, nsides) {
38091
38232
  const p1 = { x: a * Math.cos(angle1), y: b * Math.sin(angle1) };
38092
38233
  const m0 = ellipseTangentSlope(a, b, p0);
38093
38234
  const m1 = ellipseTangentSlope(a, b, p1);
38094
- const x = (m0 * p0.x - p0.y - m1 * p1.x + p1.y) / (m0 - m1);
38095
- const y = p0.y + m0 * (x - p0.x);
38235
+ const x = (fms(p1.x, m1, fma(m0, p0.x, -p0.y)) + p1.y) / (m0 - m1);
38236
+ const y = fma(m0, x - p0.x, p0.y);
38096
38237
  return { x, y };
38097
38238
  }
38098
38239
  function boxCornerMargin(j, m) {
@@ -42169,8 +42310,8 @@ function initItem(n, margin) {
42169
42310
  let w2;
42170
42311
  let h2;
42171
42312
  if (margin.doAdd) {
42172
- w2 = Math.trunc(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
42173
- h2 = Math.trunc(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
42313
+ w2 = d2i(SCALE * (cround(width / 2 * POINTS_PER_INCH6) + margin.x));
42314
+ h2 = d2i(SCALE * (cround(height / 2 * POINTS_PER_INCH6) + margin.y));
42174
42315
  } else {
42175
42316
  w2 = cround(margin.x * SCALE2 * width * POINTS_PER_INCH6);
42176
42317
  h2 = cround(margin.y * SCALE2 * height * POINTS_PER_INCH6);
@@ -46178,6 +46319,20 @@ function powerLawGraph(A3) {
46178
46319
  }
46179
46320
  return mask[1] > 0.8 * max && mask[1] > 0.3 * m;
46180
46321
  }
46322
+ var PCP_COVARIANCE_LANES = 4;
46323
+ function pcpCovariance(n, dim, x, y) {
46324
+ const nUnfused = n - n % PCP_COVARIANCE_LANES;
46325
+ for (let i = 0; i < n; i++) {
46326
+ for (let k = 0; k < dim; k++) {
46327
+ for (let l = 0; l < dim; l++) {
46328
+ const a = x[i * dim + k];
46329
+ const b = x[i * dim + l];
46330
+ const acc = y[dim * k + l];
46331
+ y[dim * k + l] = i < nUnfused ? acc + a * b : fma(a, b, acc);
46332
+ }
46333
+ }
46334
+ }
46335
+ }
46181
46336
  function pcpRotate(n, dim, x) {
46182
46337
  const y = [0, 0, 0, 0];
46183
46338
  const center = [0, 0];
@@ -46188,24 +46343,23 @@ function pcpRotate(n, dim, x) {
46188
46343
  for (let i = 0; i < n; i++) {
46189
46344
  for (let k = 0; k < dim; k++) x[dim * i + k] -= center[k];
46190
46345
  }
46191
- for (let i = 0; i < n; i++) {
46192
- for (let k = 0; k < dim; k++) {
46193
- for (let l = 0; l < dim; l++) {
46194
- y[dim * k + l] = fma(x[i * dim + k], x[i * dim + l], y[dim * k + l]);
46195
- }
46196
- }
46197
- }
46346
+ pcpCovariance(n, dim, x, y);
46198
46347
  const axis = [0, 1];
46199
46348
  if (y[1] !== 0) {
46200
- axis[0] = -(-y[0] + y[3] - Math.sqrt(y[0] * y[0] + 4 * y[1] * y[1] - 2 * y[0] * y[3] + y[3] * y[3])) / (2 * y[1]);
46349
+ const radicand = fma(
46350
+ y[3],
46351
+ y[3],
46352
+ fma(-2 * y[0], y[3], fma(y[0], y[0], 4 * y[1] * y[1]))
46353
+ );
46354
+ axis[0] = -(-y[0] + y[3] - Math.sqrt(radicand)) / (2 * y[1]);
46201
46355
  axis[1] = 1;
46202
46356
  }
46203
- const dist4 = Math.sqrt(1 + axis[0] * axis[0]);
46357
+ const dist4 = Math.sqrt(fma(axis[0], axis[0], 1));
46204
46358
  axis[0] = axis[0] / dist4;
46205
46359
  axis[1] = axis[1] / dist4;
46206
46360
  for (let i = 0; i < n; i++) {
46207
- const x0 = x[dim * i] * axis[0] + x[dim * i + 1] * axis[1];
46208
- const x1 = -x[dim * i] * axis[1] + x[dim * i + 1] * axis[0];
46361
+ const x0 = fma(x[dim * i], axis[0], x[dim * i + 1] * axis[1]);
46362
+ const x1 = fma(-x[dim * i], axis[1], x[dim * i + 1] * axis[0]);
46209
46363
  x[dim * i] = x0;
46210
46364
  x[dim * i + 1] = x1;
46211
46365
  }
@@ -46468,16 +46622,7 @@ function makeCData(dn) {
46468
46622
  };
46469
46623
  }
46470
46624
 
46471
- // src/layout/circo/blockpath.ts
46472
- function blockGraph(allEdges3, sn) {
46473
- const ns = new Set(sn.subGraph.nodes);
46474
- for (const n of sn.subGraph.nodes) {
46475
- for (const e of allEdges3) {
46476
- if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
46477
- sn.subGraph.edges.push(e);
46478
- }
46479
- }
46480
- }
46625
+ // src/layout/circo/crossings.ts
46481
46626
  function derivedOf(n) {
46482
46627
  return n.info.alg?.derivedNode ?? null;
46483
46628
  }
@@ -46488,27 +46633,51 @@ function closeOpenEdge(e, d, opened) {
46488
46633
  }
46489
46634
  return cross2;
46490
46635
  }
46491
- function openEdgesAt(d, edges, opened, order) {
46636
+ function agfstedgeLists(edges) {
46637
+ const seq2 = /* @__PURE__ */ new Map();
46638
+ edges.forEach((e, i) => seq2.set(e, i));
46639
+ const by = (end) => (a, b) => end(a).orig.id - end(b).orig.id || seq2.get(a) - seq2.get(b);
46640
+ const out = /* @__PURE__ */ new Map();
46641
+ const inn = /* @__PURE__ */ new Map();
46492
46642
  for (const e of edges) {
46493
- if (e.order === 0 && (e.tail === d || e.head === d)) {
46494
- e.order = order;
46495
- opened.push(e);
46496
- }
46643
+ out.set(e.tail, [...out.get(e.tail) ?? [], e]);
46644
+ inn.set(e.head, [...inn.get(e.head) ?? [], e]);
46497
46645
  }
46646
+ const lists = /* @__PURE__ */ new Map();
46647
+ for (const d of /* @__PURE__ */ new Set([...out.keys(), ...inn.keys()])) {
46648
+ const o = (out.get(d) ?? []).sort(by((e) => e.head));
46649
+ const i = (inn.get(d) ?? []).sort(by((e) => e.tail));
46650
+ lists.set(d, [...o, ...i]);
46651
+ }
46652
+ return lists;
46498
46653
  }
46499
46654
  function countCrossings(list, edges) {
46500
46655
  for (const e of edges) e.order = 0;
46501
- const opened = [];
46656
+ const incident = agfstedgeLists(edges);
46657
+ const opened = /* @__PURE__ */ new Map();
46502
46658
  let crossings = 0;
46503
46659
  let order = 1;
46504
46660
  for (const n of list) {
46505
46661
  const d = derivedOf(n);
46506
46662
  if (!d) continue;
46507
- for (const e of edges) {
46508
- if (e.order > 0 && (e.tail === d || e.head === d))
46509
- crossings += closeOpenEdge(e, d, opened);
46663
+ const es = incident.get(d) ?? [];
46664
+ crossings += closeEdgesAt(d, es, opened);
46665
+ for (const e of es) {
46666
+ if (e.order === 0) {
46667
+ e.order = order;
46668
+ opened.set(e, d);
46669
+ }
46510
46670
  }
46511
- openEdgesAt(d, edges, opened, order++);
46671
+ order++;
46672
+ }
46673
+ return crossings;
46674
+ }
46675
+ function closeEdgesAt(d, es, opened) {
46676
+ let crossings = 0;
46677
+ for (const e of es) {
46678
+ if (e.order === 0) continue;
46679
+ crossings += closeOpenEdge(e, d, opened.keys());
46680
+ if (opened.get(e) === d) opened.delete(e);
46512
46681
  }
46513
46682
  return crossings;
46514
46683
  }
@@ -46561,6 +46730,17 @@ function spanIncident(dn, edges, ord, seq2) {
46561
46730
  const inn = edges.filter((e) => e.head === dn).sort((a, b) => (ord.get(a.tail) ?? 0) - (ord.get(b.tail) ?? 0) || (seq2.get(a) ?? 0) - (seq2.get(b) ?? 0));
46562
46731
  return [...out, ...inn];
46563
46732
  }
46733
+
46734
+ // src/layout/circo/blockpath.ts
46735
+ function blockGraph(allEdges3, sn) {
46736
+ const ns = new Set(sn.subGraph.nodes);
46737
+ for (const n of sn.subGraph.nodes) {
46738
+ for (const e of allEdges3) {
46739
+ if (e.tail === n && ns.has(e.head) && !sn.subGraph.edges.includes(e))
46740
+ sn.subGraph.edges.push(e);
46741
+ }
46742
+ }
46743
+ }
46564
46744
  function dfsSpan(sn, map, edges, ord, seq2) {
46565
46745
  sn.visited = true;
46566
46746
  for (const e of spanIncident(sn.dn, edges, ord, seq2)) {
@@ -48039,17 +48219,30 @@ function renderEdgeLabels(e, renderer, job) {
48039
48219
  }
48040
48220
  function emitEdgeLabel(lp, id, hs, renderer, job, spl, emitState) {
48041
48221
  if (!lp?.set) return;
48042
- const open = hs.url !== null || hs.explicit;
48043
- if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
48044
- const savedOverride = job.labelEmitOverride;
48045
- if (emitState !== void 0) job.labelEmitOverride = emitState;
48046
- try {
48047
- renderOneLabel(lp, renderer, job);
48048
- } finally {
48049
- job.labelEmitOverride = savedOverride;
48222
+ withObjEmitState(job, emitState ?? 11 /* ELabel */, () => {
48223
+ const open = hs.url !== null || hs.explicit;
48224
+ if (open) openAnchorWith(renderer, job, hs.url, hs.tooltip, hs.target, id);
48225
+ const savedOverride = job.labelEmitOverride;
48226
+ if (emitState !== void 0) job.labelEmitOverride = emitState;
48227
+ try {
48228
+ renderOneLabel(lp, renderer, job);
48229
+ } finally {
48230
+ job.labelEmitOverride = savedOverride;
48231
+ }
48232
+ if (spl) emitAttachment(lp, spl, renderer, job);
48233
+ if (open) renderer.endAnchor?.(job);
48234
+ });
48235
+ }
48236
+ function withObjEmitState(job, lkind, fn) {
48237
+ const obj = job.obj;
48238
+ if (obj === null) {
48239
+ fn();
48240
+ return;
48050
48241
  }
48051
- if (spl) emitAttachment(lp, spl, renderer, job);
48052
- if (open) renderer.endAnchor?.(job);
48242
+ const oldEmitState = obj.emitState;
48243
+ obj.emitState = lkind;
48244
+ fn();
48245
+ obj.emitState = oldEmitState;
48053
48246
  }
48054
48247
  function emitAttachment(lp, spl, renderer, job) {
48055
48248
  if (!lp?.set) return;
@@ -49635,6 +49828,7 @@ var DotWriterBase = class {
49635
49828
 
49636
49829
  // src/render/dot/edge-draw.ts
49637
49830
  var DEFAULT_COLOR5 = "black";
49831
+ var DEFAULT_LINE_STYLE = ["solid", "setlinewidth(1)"];
49638
49832
  function emitArrowOp(buf, op, pen) {
49639
49833
  switch (op.kind) {
49640
49834
  case "polygon":
@@ -49658,6 +49852,25 @@ function emitArrowOp(buf, op, pen) {
49658
49852
  var EdgeDrawBase = class extends DotWriterBase {
49659
49853
  /** setlinewidth state per emit_state. @see gvrender_core_dot.c penwidth[] */
49660
49854
  penwidth = new Array(12).fill(1);
49855
+ /**
49856
+ * emit_attachment's draw calls (decorate=true): gvrender_set_style with the
49857
+ * default line style sets the obj's rawstyle/pen/penwidth (setlinewidth 1),
49858
+ * gvrender_set_pencolor sets the pen to the label fontcolor (first entry of
49859
+ * a color list), then gvrender_polyline → xdot_polyline emits the style ops
49860
+ * (`S 5 -solid`; setlinewidth is filtered), the pen color and `L 3`.
49861
+ * @see lib/common/emit.c:emit_attachment (1886-1893)
49862
+ * @see lib/gvc/gvrender.c:gvrender_set_style / gvrender_set_pencolor
49863
+ */
49864
+ attachmentPolyline(pts, pencolor, job) {
49865
+ const obj = job.obj;
49866
+ if (obj !== null) {
49867
+ obj.rawStyle = [...DEFAULT_LINE_STYLE];
49868
+ obj.pen = 3 /* Solid */;
49869
+ obj.penWidth = 1;
49870
+ obj.penColor = resolveRenderColor(pencolor.split(":")[0]);
49871
+ }
49872
+ this.polyline(pts, job);
49873
+ }
49661
49874
  /**
49662
49875
  * The plain single-colour spline branch of beginEdge — lifted verbatim so the
49663
49876
  * four-way spline-kind chain above stays readable; no branch was reordered or
@@ -50191,19 +50404,6 @@ function emitMulticolorArrows(e, job, headColor, tailColor) {
50191
50404
  emitArrowOps(headOps, headColor, job, pw, colorOpacity(resolveRenderColor(headColor)));
50192
50405
  }
50193
50406
  }
50194
- function overlapLabel(lp, b) {
50195
- const sx = lp.dimen.x / 2;
50196
- const sy = lp.dimen.y / 2;
50197
- const bb = {
50198
- ll: { x: lp.pos.x - sx, y: lp.pos.y - sy },
50199
- ur: { x: lp.pos.x + sx, y: lp.pos.y + sy }
50200
- };
50201
- return boxOverlap(b, bb);
50202
- }
50203
- function edgeHasDrawableContent(e, clip) {
50204
- const i = e.info;
50205
- return i.spl !== void 0 || i.label !== void 0 && i.label.set && overlapLabel(i.label, clip) || i.xlabel !== void 0 || i.head_label !== void 0 || i.tail_label !== void 0;
50206
- }
50207
50407
  var SvgRenderer = class {
50208
50408
  type = "svg";
50209
50409
  /** @see plugin/core/gvplugin_core.c registration table */
@@ -50468,9 +50668,9 @@ function peg$parse(input, options) {
50468
50668
  const peg$c0 = "{";
50469
50669
  const peg$c1 = "}";
50470
50670
  const peg$c2 = ";";
50471
- const peg$c3 = "[";
50472
- const peg$c4 = "]";
50473
- const peg$c5 = "=";
50671
+ const peg$c3 = "=";
50672
+ const peg$c4 = "[";
50673
+ const peg$c5 = "]";
50474
50674
  const peg$c6 = ":";
50475
50675
  const peg$c7 = "->";
50476
50676
  const peg$c8 = "--";
@@ -50494,32 +50694,30 @@ function peg$parse(input, options) {
50494
50694
  const peg$r3 = /^[A-Za-z_\x80-\uFFFF]/;
50495
50695
  const peg$r4 = /^[A-Za-z_0-9\x80-\uFFFF]/;
50496
50696
  const peg$r5 = /^[0-9]/;
50497
- const peg$r6 = /^[eE]/;
50498
- const peg$r7 = /^[+\-]/;
50499
- const peg$r8 = /^[Ss]/;
50500
- const peg$r9 = /^[Tt]/;
50501
- const peg$r10 = /^[Rr]/;
50502
- const peg$r11 = /^[Ii]/;
50503
- const peg$r12 = /^[Cc]/;
50504
- const peg$r13 = /^[Gg]/;
50505
- const peg$r14 = /^[Aa]/;
50506
- const peg$r15 = /^[Pp]/;
50507
- const peg$r16 = /^[Hh]/;
50508
- const peg$r17 = /^[Dd]/;
50509
- const peg$r18 = /^[Nn]/;
50510
- const peg$r19 = /^[Oo]/;
50511
- const peg$r20 = /^[Ee]/;
50512
- const peg$r21 = /^[Uu]/;
50513
- const peg$r22 = /^[Bb]/;
50514
- const peg$r23 = /^[ \t\r\n]/;
50515
- const peg$r24 = /^[^\n]/;
50697
+ const peg$r6 = /^[Ss]/;
50698
+ const peg$r7 = /^[Tt]/;
50699
+ const peg$r8 = /^[Rr]/;
50700
+ const peg$r9 = /^[Ii]/;
50701
+ const peg$r10 = /^[Cc]/;
50702
+ const peg$r11 = /^[Gg]/;
50703
+ const peg$r12 = /^[Aa]/;
50704
+ const peg$r13 = /^[Pp]/;
50705
+ const peg$r14 = /^[Hh]/;
50706
+ const peg$r15 = /^[Dd]/;
50707
+ const peg$r16 = /^[Nn]/;
50708
+ const peg$r17 = /^[Oo]/;
50709
+ const peg$r18 = /^[Ee]/;
50710
+ const peg$r19 = /^[Uu]/;
50711
+ const peg$r20 = /^[Bb]/;
50712
+ const peg$r21 = /^[ \t\r\n]/;
50713
+ const peg$r22 = /^[^\n]/;
50516
50714
  const peg$e0 = peg$literalExpectation("{", false);
50517
50715
  const peg$e1 = peg$literalExpectation("}", false);
50518
50716
  const peg$e2 = peg$literalExpectation(";", false);
50519
- const peg$e3 = peg$literalExpectation("[", false);
50520
- const peg$e4 = peg$literalExpectation("]", false);
50521
- const peg$e5 = peg$classExpectation([";", ","], false, false, false);
50522
- const peg$e6 = peg$literalExpectation("=", false);
50717
+ const peg$e3 = peg$literalExpectation("=", false);
50718
+ const peg$e4 = peg$literalExpectation("[", false);
50719
+ const peg$e5 = peg$literalExpectation("]", false);
50720
+ const peg$e6 = peg$classExpectation([";", ","], false, false, false);
50523
50721
  const peg$e7 = peg$literalExpectation(":", false);
50524
50722
  const peg$e8 = peg$otherExpectation("edge operator");
50525
50723
  const peg$e9 = peg$literalExpectation("->", false);
@@ -50539,30 +50737,28 @@ function peg$parse(input, options) {
50539
50737
  const peg$e23 = peg$literalExpectation("-", false);
50540
50738
  const peg$e24 = peg$classExpectation([["0", "9"]], false, false, false);
50541
50739
  const peg$e25 = peg$literalExpectation(".", false);
50542
- const peg$e26 = peg$classExpectation(["e", "E"], false, false, false);
50543
- const peg$e27 = peg$classExpectation(["+", "-"], false, false, false);
50544
- const peg$e28 = peg$classExpectation(["S", "s"], false, false, false);
50545
- const peg$e29 = peg$classExpectation(["T", "t"], false, false, false);
50546
- const peg$e30 = peg$classExpectation(["R", "r"], false, false, false);
50547
- const peg$e31 = peg$classExpectation(["I", "i"], false, false, false);
50548
- const peg$e32 = peg$classExpectation(["C", "c"], false, false, false);
50549
- const peg$e33 = peg$classExpectation(["G", "g"], false, false, false);
50550
- const peg$e34 = peg$classExpectation(["A", "a"], false, false, false);
50551
- const peg$e35 = peg$classExpectation(["P", "p"], false, false, false);
50552
- const peg$e36 = peg$classExpectation(["H", "h"], false, false, false);
50553
- const peg$e37 = peg$classExpectation(["D", "d"], false, false, false);
50554
- const peg$e38 = peg$classExpectation(["N", "n"], false, false, false);
50555
- const peg$e39 = peg$classExpectation(["O", "o"], false, false, false);
50556
- const peg$e40 = peg$classExpectation(["E", "e"], false, false, false);
50557
- const peg$e41 = peg$classExpectation(["U", "u"], false, false, false);
50558
- const peg$e42 = peg$classExpectation(["B", "b"], false, false, false);
50559
- const peg$e43 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
50560
- const peg$e44 = peg$literalExpectation("/*", false);
50561
- const peg$e45 = peg$literalExpectation("*/", false);
50562
- const peg$e46 = peg$literalExpectation("//", false);
50563
- const peg$e47 = peg$classExpectation(["\n"], true, false, false);
50564
- const peg$e48 = peg$literalExpectation("\n", false);
50565
- const peg$e49 = peg$literalExpectation("#", false);
50740
+ const peg$e26 = peg$classExpectation(["S", "s"], false, false, false);
50741
+ const peg$e27 = peg$classExpectation(["T", "t"], false, false, false);
50742
+ const peg$e28 = peg$classExpectation(["R", "r"], false, false, false);
50743
+ const peg$e29 = peg$classExpectation(["I", "i"], false, false, false);
50744
+ const peg$e30 = peg$classExpectation(["C", "c"], false, false, false);
50745
+ const peg$e31 = peg$classExpectation(["G", "g"], false, false, false);
50746
+ const peg$e32 = peg$classExpectation(["A", "a"], false, false, false);
50747
+ const peg$e33 = peg$classExpectation(["P", "p"], false, false, false);
50748
+ const peg$e34 = peg$classExpectation(["H", "h"], false, false, false);
50749
+ const peg$e35 = peg$classExpectation(["D", "d"], false, false, false);
50750
+ const peg$e36 = peg$classExpectation(["N", "n"], false, false, false);
50751
+ const peg$e37 = peg$classExpectation(["O", "o"], false, false, false);
50752
+ const peg$e38 = peg$classExpectation(["E", "e"], false, false, false);
50753
+ const peg$e39 = peg$classExpectation(["U", "u"], false, false, false);
50754
+ const peg$e40 = peg$classExpectation(["B", "b"], false, false, false);
50755
+ const peg$e41 = peg$classExpectation([" ", " ", "\r", "\n"], false, false, false);
50756
+ const peg$e42 = peg$literalExpectation("/*", false);
50757
+ const peg$e43 = peg$literalExpectation("*/", false);
50758
+ const peg$e44 = peg$literalExpectation("//", false);
50759
+ const peg$e45 = peg$classExpectation(["\n"], true, false, false);
50760
+ const peg$e46 = peg$literalExpectation("\n", false);
50761
+ const peg$e47 = peg$literalExpectation("#", false);
50566
50762
  function peg$f0(s, t, id, stmts) {
50567
50763
  return {
50568
50764
  type: "graph",
@@ -50605,37 +50801,44 @@ function peg$parse(input, options) {
50605
50801
  function peg$f11(s) {
50606
50802
  return s;
50607
50803
  }
50608
- function peg$f12(t, attrs) {
50804
+ function peg$f12(t, m, attrs) {
50805
+ if (m) console.error("Warning: attribute macros not implemented");
50609
50806
  return { type: "attr", target: t, attrs };
50610
50807
  }
50611
50808
  function peg$f13(a) {
50612
50809
  return { type: "assign", key: a.key, value: a.value };
50613
50810
  }
50614
50811
  function peg$f14() {
50615
- return "graph";
50812
+ return true;
50616
50813
  }
50617
50814
  function peg$f15() {
50618
- return "node";
50815
+ return false;
50619
50816
  }
50620
50817
  function peg$f16() {
50818
+ return "graph";
50819
+ }
50820
+ function peg$f17() {
50821
+ return "node";
50822
+ }
50823
+ function peg$f18() {
50621
50824
  return "edge";
50622
50825
  }
50623
- function peg$f17(defs, rest) {
50826
+ function peg$f19(defs, rest) {
50624
50827
  return defs.concat(rest);
50625
50828
  }
50626
- function peg$f18() {
50829
+ function peg$f20() {
50627
50830
  return [];
50628
50831
  }
50629
- function peg$f19(a) {
50832
+ function peg$f21(a) {
50630
50833
  return a;
50631
50834
  }
50632
- function peg$f20(pairs) {
50835
+ function peg$f22(pairs) {
50633
50836
  return pairs;
50634
50837
  }
50635
- function peg$f21(k, v) {
50838
+ function peg$f23(k, v) {
50636
50839
  return { key: k, value: v };
50637
50840
  }
50638
- function peg$f22(head, chain, attrs) {
50841
+ function peg$f24(head, chain, attrs) {
50639
50842
  if (chain.length > 0) {
50640
50843
  const nodes = [head].concat(chain);
50641
50844
  return { type: "edge", nodes, attrs };
@@ -50646,70 +50849,70 @@ function peg$parse(input, options) {
50646
50849
  return { type: "node", id: head, attrs };
50647
50850
  }
50648
50851
  }
50649
- function peg$f23(s) {
50852
+ function peg$f25(s) {
50650
50853
  return s;
50651
50854
  }
50652
- function peg$f24(n) {
50855
+ function peg$f26(n) {
50653
50856
  return n;
50654
50857
  }
50655
- function peg$f25(id, port, compass) {
50858
+ function peg$f27(id, port, compass) {
50656
50859
  return { id, port, compass };
50657
50860
  }
50658
- function peg$f26(id, port) {
50861
+ function peg$f28(id, port) {
50659
50862
  return { id, port, compass: null };
50660
50863
  }
50661
- function peg$f27(id) {
50864
+ function peg$f29(id) {
50662
50865
  return { id, port: null, compass: null };
50663
50866
  }
50664
- function peg$f28(s, rest) {
50867
+ function peg$f30(s, rest) {
50665
50868
  return [s].concat(rest);
50666
50869
  }
50667
- function peg$f29() {
50870
+ function peg$f31() {
50668
50871
  return [];
50669
50872
  }
50670
- function peg$f30(id, stmts) {
50873
+ function peg$f32(id, stmts) {
50671
50874
  return { type: "subgraph", id, stmts };
50672
50875
  }
50673
- function peg$f31(stmts) {
50876
+ function peg$f33(stmts) {
50674
50877
  return { type: "subgraph", id: null, stmts };
50675
50878
  }
50676
- function peg$f32(stmts) {
50879
+ function peg$f34(stmts) {
50677
50880
  return { type: "subgraph", id: null, stmts };
50678
50881
  }
50679
- function peg$f33(first, s) {
50882
+ function peg$f35(first, s) {
50680
50883
  return s;
50681
50884
  }
50682
- function peg$f34(first, rest) {
50885
+ function peg$f36(first, rest) {
50683
50886
  return rest.length > 0 ? first + rest.join("") : first;
50684
50887
  }
50685
- function peg$f35(chars) {
50888
+ function peg$f37(chars) {
50686
50889
  return chars.join("");
50687
50890
  }
50688
- function peg$f36() {
50891
+ function peg$f38() {
50689
50892
  return '"';
50690
50893
  }
50691
- function peg$f37() {
50894
+ function peg$f39() {
50692
50895
  return "";
50693
50896
  }
50694
- function peg$f38(c) {
50897
+ function peg$f40(c) {
50695
50898
  return "\\" + c;
50696
50899
  }
50697
- function peg$f39(content) {
50900
+ function peg$f41(content) {
50698
50901
  return "" + content;
50699
50902
  }
50700
- function peg$f40(chars) {
50903
+ function peg$f42(chars) {
50701
50904
  return chars.join("");
50702
50905
  }
50703
- function peg$f41(nested2, content) {
50906
+ function peg$f43(nested2, content) {
50704
50907
  return "<" + content + ">";
50705
50908
  }
50706
- function peg$f42(n) {
50909
+ function peg$f44(n) {
50707
50910
  return n;
50708
50911
  }
50709
- function peg$f43(first, rest) {
50912
+ function peg$f45(first, rest) {
50710
50913
  return first + rest.join("");
50711
50914
  }
50712
- function peg$f44(s) {
50915
+ function peg$f46(s) {
50713
50916
  return Array.isArray(s) ? s.flat(Infinity).filter((x) => x !== null && x !== void 0).join("") : String(s);
50714
50917
  }
50715
50918
  let peg$currPos = options.peg$currPos | 0;
@@ -51080,15 +51283,21 @@ function peg$parse(input, options) {
51080
51283
  return s0;
51081
51284
  }
51082
51285
  function peg$parseAttrStmt() {
51083
- let s0, s12, s2, s3;
51286
+ let s0, s12, s2, s3, s4;
51084
51287
  s0 = peg$currPos;
51085
51288
  s12 = peg$parseAttrType();
51086
51289
  if (s12 !== peg$FAILED) {
51087
51290
  s2 = peg$parse_();
51088
- s3 = peg$parseAttrListReq();
51291
+ s3 = peg$parseOptMacroName();
51089
51292
  if (s3 !== peg$FAILED) {
51090
- peg$savedPos = s0;
51091
- s0 = peg$f12(s12, s3);
51293
+ s4 = peg$parseAttrListReq();
51294
+ if (s4 !== peg$FAILED) {
51295
+ peg$savedPos = s0;
51296
+ s0 = peg$f12(s12, s3, s4);
51297
+ } else {
51298
+ peg$currPos = s0;
51299
+ s0 = peg$FAILED;
51300
+ }
51092
51301
  } else {
51093
51302
  peg$currPos = s0;
51094
51303
  s0 = peg$FAILED;
@@ -51108,13 +51317,49 @@ function peg$parse(input, options) {
51108
51317
  }
51109
51318
  return s0;
51110
51319
  }
51320
+ function peg$parseOptMacroName() {
51321
+ let s0, s12, s2, s3, s4;
51322
+ s0 = peg$currPos;
51323
+ s12 = peg$parseAtom();
51324
+ if (s12 !== peg$FAILED) {
51325
+ s2 = peg$parse_();
51326
+ if (input.charCodeAt(peg$currPos) === 61) {
51327
+ s3 = peg$c3;
51328
+ peg$currPos++;
51329
+ } else {
51330
+ s3 = peg$FAILED;
51331
+ if (peg$silentFails === 0) {
51332
+ peg$fail(peg$e3);
51333
+ }
51334
+ }
51335
+ if (s3 !== peg$FAILED) {
51336
+ s4 = peg$parse_();
51337
+ peg$savedPos = s0;
51338
+ s0 = peg$f14();
51339
+ } else {
51340
+ peg$currPos = s0;
51341
+ s0 = peg$FAILED;
51342
+ }
51343
+ } else {
51344
+ peg$currPos = s0;
51345
+ s0 = peg$FAILED;
51346
+ }
51347
+ if (s0 === peg$FAILED) {
51348
+ s0 = peg$currPos;
51349
+ s12 = "";
51350
+ peg$savedPos = s0;
51351
+ s12 = peg$f15();
51352
+ s0 = s12;
51353
+ }
51354
+ return s0;
51355
+ }
51111
51356
  function peg$parseAttrType() {
51112
51357
  let s0, s12;
51113
51358
  s0 = peg$currPos;
51114
51359
  s12 = peg$parseGraphKw();
51115
51360
  if (s12 !== peg$FAILED) {
51116
51361
  peg$savedPos = s0;
51117
- s12 = peg$f14();
51362
+ s12 = peg$f16();
51118
51363
  }
51119
51364
  s0 = s12;
51120
51365
  if (s0 === peg$FAILED) {
@@ -51122,7 +51367,7 @@ function peg$parse(input, options) {
51122
51367
  s12 = peg$parseNodeKw();
51123
51368
  if (s12 !== peg$FAILED) {
51124
51369
  peg$savedPos = s0;
51125
- s12 = peg$f15();
51370
+ s12 = peg$f17();
51126
51371
  }
51127
51372
  s0 = s12;
51128
51373
  if (s0 === peg$FAILED) {
@@ -51130,7 +51375,7 @@ function peg$parse(input, options) {
51130
51375
  s12 = peg$parseEdgeKw();
51131
51376
  if (s12 !== peg$FAILED) {
51132
51377
  peg$savedPos = s0;
51133
- s12 = peg$f16();
51378
+ s12 = peg$f18();
51134
51379
  }
51135
51380
  s0 = s12;
51136
51381
  }
@@ -51142,12 +51387,12 @@ function peg$parse(input, options) {
51142
51387
  s0 = peg$currPos;
51143
51388
  s12 = peg$parse_();
51144
51389
  if (input.charCodeAt(peg$currPos) === 91) {
51145
- s2 = peg$c3;
51390
+ s2 = peg$c4;
51146
51391
  peg$currPos++;
51147
51392
  } else {
51148
51393
  s2 = peg$FAILED;
51149
51394
  if (peg$silentFails === 0) {
51150
- peg$fail(peg$e3);
51395
+ peg$fail(peg$e4);
51151
51396
  }
51152
51397
  }
51153
51398
  if (s2 !== peg$FAILED) {
@@ -51155,19 +51400,19 @@ function peg$parse(input, options) {
51155
51400
  s4 = peg$parseAttrDefs();
51156
51401
  s5 = peg$parse_();
51157
51402
  if (input.charCodeAt(peg$currPos) === 93) {
51158
- s6 = peg$c4;
51403
+ s6 = peg$c5;
51159
51404
  peg$currPos++;
51160
51405
  } else {
51161
51406
  s6 = peg$FAILED;
51162
51407
  if (peg$silentFails === 0) {
51163
- peg$fail(peg$e4);
51408
+ peg$fail(peg$e5);
51164
51409
  }
51165
51410
  }
51166
51411
  if (s6 !== peg$FAILED) {
51167
51412
  s7 = peg$parseAttrList();
51168
51413
  if (s7 !== peg$FAILED) {
51169
51414
  peg$savedPos = s0;
51170
- s0 = peg$f17(s4, s7);
51415
+ s0 = peg$f19(s4, s7);
51171
51416
  } else {
51172
51417
  peg$currPos = s0;
51173
51418
  s0 = peg$FAILED;
@@ -51189,7 +51434,7 @@ function peg$parse(input, options) {
51189
51434
  s0 = peg$currPos;
51190
51435
  s12 = "";
51191
51436
  peg$savedPos = s0;
51192
- s12 = peg$f18();
51437
+ s12 = peg$f20();
51193
51438
  s0 = s12;
51194
51439
  }
51195
51440
  return s0;
@@ -51209,7 +51454,7 @@ function peg$parse(input, options) {
51209
51454
  } else {
51210
51455
  s6 = peg$FAILED;
51211
51456
  if (peg$silentFails === 0) {
51212
- peg$fail(peg$e5);
51457
+ peg$fail(peg$e6);
51213
51458
  }
51214
51459
  }
51215
51460
  if (s6 !== peg$FAILED) {
@@ -51224,7 +51469,7 @@ function peg$parse(input, options) {
51224
51469
  s5 = null;
51225
51470
  }
51226
51471
  peg$savedPos = s2;
51227
- s2 = peg$f19(s3);
51472
+ s2 = peg$f21(s3);
51228
51473
  } else {
51229
51474
  peg$currPos = s2;
51230
51475
  s2 = peg$FAILED;
@@ -51242,7 +51487,7 @@ function peg$parse(input, options) {
51242
51487
  } else {
51243
51488
  s6 = peg$FAILED;
51244
51489
  if (peg$silentFails === 0) {
51245
- peg$fail(peg$e5);
51490
+ peg$fail(peg$e6);
51246
51491
  }
51247
51492
  }
51248
51493
  if (s6 !== peg$FAILED) {
@@ -51257,14 +51502,14 @@ function peg$parse(input, options) {
51257
51502
  s5 = null;
51258
51503
  }
51259
51504
  peg$savedPos = s2;
51260
- s2 = peg$f19(s3);
51505
+ s2 = peg$f21(s3);
51261
51506
  } else {
51262
51507
  peg$currPos = s2;
51263
51508
  s2 = peg$FAILED;
51264
51509
  }
51265
51510
  }
51266
51511
  peg$savedPos = s0;
51267
- s12 = peg$f20(s12);
51512
+ s12 = peg$f22(s12);
51268
51513
  s0 = s12;
51269
51514
  return s0;
51270
51515
  }
@@ -51275,12 +51520,12 @@ function peg$parse(input, options) {
51275
51520
  if (s12 !== peg$FAILED) {
51276
51521
  s2 = peg$parse_();
51277
51522
  if (input.charCodeAt(peg$currPos) === 61) {
51278
- s3 = peg$c5;
51523
+ s3 = peg$c3;
51279
51524
  peg$currPos++;
51280
51525
  } else {
51281
51526
  s3 = peg$FAILED;
51282
51527
  if (peg$silentFails === 0) {
51283
- peg$fail(peg$e6);
51528
+ peg$fail(peg$e3);
51284
51529
  }
51285
51530
  }
51286
51531
  if (s3 !== peg$FAILED) {
@@ -51288,7 +51533,7 @@ function peg$parse(input, options) {
51288
51533
  s5 = peg$parseAtom();
51289
51534
  if (s5 !== peg$FAILED) {
51290
51535
  peg$savedPos = s0;
51291
- s0 = peg$f21(s12, s5);
51536
+ s0 = peg$f23(s12, s5);
51292
51537
  } else {
51293
51538
  peg$currPos = s0;
51294
51539
  s0 = peg$FAILED;
@@ -51315,7 +51560,7 @@ function peg$parse(input, options) {
51315
51560
  s5 = peg$parseAttrList();
51316
51561
  if (s5 !== peg$FAILED) {
51317
51562
  peg$savedPos = s0;
51318
- s0 = peg$f22(s12, s3, s5);
51563
+ s0 = peg$f24(s12, s3, s5);
51319
51564
  } else {
51320
51565
  peg$currPos = s0;
51321
51566
  s0 = peg$FAILED;
@@ -51336,7 +51581,7 @@ function peg$parse(input, options) {
51336
51581
  s12 = peg$parseSubgraph();
51337
51582
  if (s12 !== peg$FAILED) {
51338
51583
  peg$savedPos = s0;
51339
- s12 = peg$f23(s12);
51584
+ s12 = peg$f25(s12);
51340
51585
  }
51341
51586
  s0 = s12;
51342
51587
  if (s0 === peg$FAILED) {
@@ -51344,7 +51589,7 @@ function peg$parse(input, options) {
51344
51589
  s12 = peg$parseNode();
51345
51590
  if (s12 !== peg$FAILED) {
51346
51591
  peg$savedPos = s0;
51347
- s12 = peg$f24(s12);
51592
+ s12 = peg$f26(s12);
51348
51593
  }
51349
51594
  s0 = s12;
51350
51595
  }
@@ -51384,7 +51629,7 @@ function peg$parse(input, options) {
51384
51629
  s9 = peg$parseAtom();
51385
51630
  if (s9 !== peg$FAILED) {
51386
51631
  peg$savedPos = s0;
51387
- s0 = peg$f25(s12, s5, s9);
51632
+ s0 = peg$f27(s12, s5, s9);
51388
51633
  } else {
51389
51634
  peg$currPos = s0;
51390
51635
  s0 = peg$FAILED;
@@ -51424,7 +51669,7 @@ function peg$parse(input, options) {
51424
51669
  s5 = peg$parseAtom();
51425
51670
  if (s5 !== peg$FAILED) {
51426
51671
  peg$savedPos = s0;
51427
- s0 = peg$f26(s12, s5);
51672
+ s0 = peg$f28(s12, s5);
51428
51673
  } else {
51429
51674
  peg$currPos = s0;
51430
51675
  s0 = peg$FAILED;
@@ -51442,7 +51687,7 @@ function peg$parse(input, options) {
51442
51687
  s12 = peg$parseAtom();
51443
51688
  if (s12 !== peg$FAILED) {
51444
51689
  peg$savedPos = s0;
51445
- s12 = peg$f27(s12);
51690
+ s12 = peg$f29(s12);
51446
51691
  }
51447
51692
  s0 = s12;
51448
51693
  }
@@ -51461,7 +51706,7 @@ function peg$parse(input, options) {
51461
51706
  s5 = peg$parseEdgeChain();
51462
51707
  if (s5 !== peg$FAILED) {
51463
51708
  peg$savedPos = s0;
51464
- s0 = peg$f28(s3, s5);
51709
+ s0 = peg$f30(s3, s5);
51465
51710
  } else {
51466
51711
  peg$currPos = s0;
51467
51712
  s0 = peg$FAILED;
@@ -51478,7 +51723,7 @@ function peg$parse(input, options) {
51478
51723
  s0 = peg$currPos;
51479
51724
  s12 = "";
51480
51725
  peg$savedPos = s0;
51481
- s12 = peg$f29();
51726
+ s12 = peg$f31();
51482
51727
  s0 = s12;
51483
51728
  }
51484
51729
  return s0;
@@ -51549,7 +51794,7 @@ function peg$parse(input, options) {
51549
51794
  }
51550
51795
  if (s9 !== peg$FAILED) {
51551
51796
  peg$savedPos = s0;
51552
- s0 = peg$f30(s3, s7);
51797
+ s0 = peg$f32(s3, s7);
51553
51798
  } else {
51554
51799
  peg$currPos = s0;
51555
51800
  s0 = peg$FAILED;
@@ -51600,7 +51845,7 @@ function peg$parse(input, options) {
51600
51845
  }
51601
51846
  if (s7 !== peg$FAILED) {
51602
51847
  peg$savedPos = s0;
51603
- s0 = peg$f31(s5);
51848
+ s0 = peg$f33(s5);
51604
51849
  } else {
51605
51850
  peg$currPos = s0;
51606
51851
  s0 = peg$FAILED;
@@ -51644,7 +51889,7 @@ function peg$parse(input, options) {
51644
51889
  }
51645
51890
  if (s5 !== peg$FAILED) {
51646
51891
  peg$savedPos = s0;
51647
- s0 = peg$f32(s3);
51892
+ s0 = peg$f34(s3);
51648
51893
  } else {
51649
51894
  peg$currPos = s0;
51650
51895
  s0 = peg$FAILED;
@@ -51683,7 +51928,7 @@ function peg$parse(input, options) {
51683
51928
  s7 = peg$parseQAtom();
51684
51929
  if (s7 !== peg$FAILED) {
51685
51930
  peg$savedPos = s3;
51686
- s3 = peg$f33(s12, s7);
51931
+ s3 = peg$f35(s12, s7);
51687
51932
  } else {
51688
51933
  peg$currPos = s3;
51689
51934
  s3 = peg$FAILED;
@@ -51710,7 +51955,7 @@ function peg$parse(input, options) {
51710
51955
  s7 = peg$parseQAtom();
51711
51956
  if (s7 !== peg$FAILED) {
51712
51957
  peg$savedPos = s3;
51713
- s3 = peg$f33(s12, s7);
51958
+ s3 = peg$f35(s12, s7);
51714
51959
  } else {
51715
51960
  peg$currPos = s3;
51716
51961
  s3 = peg$FAILED;
@@ -51721,7 +51966,7 @@ function peg$parse(input, options) {
51721
51966
  }
51722
51967
  }
51723
51968
  peg$savedPos = s0;
51724
- s0 = peg$f34(s12, s2);
51969
+ s0 = peg$f36(s12, s2);
51725
51970
  } else {
51726
51971
  peg$currPos = s0;
51727
51972
  s0 = peg$FAILED;
@@ -51769,7 +52014,7 @@ function peg$parse(input, options) {
51769
52014
  }
51770
52015
  if (s3 !== peg$FAILED) {
51771
52016
  peg$savedPos = s0;
51772
- s0 = peg$f35(s2);
52017
+ s0 = peg$f37(s2);
51773
52018
  } else {
51774
52019
  peg$currPos = s0;
51775
52020
  s0 = peg$FAILED;
@@ -51794,7 +52039,7 @@ function peg$parse(input, options) {
51794
52039
  }
51795
52040
  if (s12 !== peg$FAILED) {
51796
52041
  peg$savedPos = s0;
51797
- s12 = peg$f36();
52042
+ s12 = peg$f38();
51798
52043
  }
51799
52044
  s0 = s12;
51800
52045
  if (s0 === peg$FAILED) {
@@ -51810,7 +52055,7 @@ function peg$parse(input, options) {
51810
52055
  }
51811
52056
  if (s12 !== peg$FAILED) {
51812
52057
  peg$savedPos = s0;
51813
- s12 = peg$f37();
52058
+ s12 = peg$f39();
51814
52059
  }
51815
52060
  s0 = s12;
51816
52061
  if (s0 === peg$FAILED) {
@@ -51836,7 +52081,7 @@ function peg$parse(input, options) {
51836
52081
  }
51837
52082
  if (s2 !== peg$FAILED) {
51838
52083
  peg$savedPos = s0;
51839
- s0 = peg$f38(s2);
52084
+ s0 = peg$f40(s2);
51840
52085
  } else {
51841
52086
  peg$currPos = s0;
51842
52087
  s0 = peg$FAILED;
@@ -51885,7 +52130,7 @@ function peg$parse(input, options) {
51885
52130
  }
51886
52131
  if (s3 !== peg$FAILED) {
51887
52132
  peg$savedPos = s0;
51888
- s0 = peg$f39(s2);
52133
+ s0 = peg$f41(s2);
51889
52134
  } else {
51890
52135
  peg$currPos = s0;
51891
52136
  s0 = peg$FAILED;
@@ -51906,7 +52151,7 @@ function peg$parse(input, options) {
51906
52151
  s2 = peg$parseHtmlChar();
51907
52152
  }
51908
52153
  peg$savedPos = s0;
51909
- s12 = peg$f40(s12);
52154
+ s12 = peg$f42(s12);
51910
52155
  s0 = s12;
51911
52156
  return s0;
51912
52157
  }
@@ -51936,7 +52181,7 @@ function peg$parse(input, options) {
51936
52181
  }
51937
52182
  if (s3 !== peg$FAILED) {
51938
52183
  peg$savedPos = s0;
51939
- s0 = peg$f41(s12, s2);
52184
+ s0 = peg$f43(s12, s2);
51940
52185
  } else {
51941
52186
  peg$currPos = s0;
51942
52187
  s0 = peg$FAILED;
@@ -51981,7 +52226,7 @@ function peg$parse(input, options) {
51981
52226
  s2 = peg$parseName();
51982
52227
  if (s2 !== peg$FAILED) {
51983
52228
  peg$savedPos = s0;
51984
- s0 = peg$f42(s2);
52229
+ s0 = peg$f44(s2);
51985
52230
  } else {
51986
52231
  peg$currPos = s0;
51987
52232
  s0 = peg$FAILED;
@@ -52029,7 +52274,7 @@ function peg$parse(input, options) {
52029
52274
  }
52030
52275
  }
52031
52276
  peg$savedPos = s0;
52032
- s0 = peg$f43(s12, s2);
52277
+ s0 = peg$f45(s12, s2);
52033
52278
  } else {
52034
52279
  peg$currPos = s0;
52035
52280
  s0 = peg$FAILED;
@@ -52179,70 +52424,7 @@ function peg$parse(input, options) {
52179
52424
  }
52180
52425
  }
52181
52426
  if (s3 !== peg$FAILED) {
52182
- s4 = peg$currPos;
52183
- s5 = input.charAt(peg$currPos);
52184
- if (peg$r6.test(s5)) {
52185
- peg$currPos++;
52186
- } else {
52187
- s5 = peg$FAILED;
52188
- if (peg$silentFails === 0) {
52189
- peg$fail(peg$e26);
52190
- }
52191
- }
52192
- if (s5 !== peg$FAILED) {
52193
- s6 = input.charAt(peg$currPos);
52194
- if (peg$r7.test(s6)) {
52195
- peg$currPos++;
52196
- } else {
52197
- s6 = peg$FAILED;
52198
- if (peg$silentFails === 0) {
52199
- peg$fail(peg$e27);
52200
- }
52201
- }
52202
- if (s6 === peg$FAILED) {
52203
- s6 = null;
52204
- }
52205
- s7 = [];
52206
- s8 = input.charAt(peg$currPos);
52207
- if (peg$r5.test(s8)) {
52208
- peg$currPos++;
52209
- } else {
52210
- s8 = peg$FAILED;
52211
- if (peg$silentFails === 0) {
52212
- peg$fail(peg$e24);
52213
- }
52214
- }
52215
- if (s8 !== peg$FAILED) {
52216
- while (s8 !== peg$FAILED) {
52217
- s7.push(s8);
52218
- s8 = input.charAt(peg$currPos);
52219
- if (peg$r5.test(s8)) {
52220
- peg$currPos++;
52221
- } else {
52222
- s8 = peg$FAILED;
52223
- if (peg$silentFails === 0) {
52224
- peg$fail(peg$e24);
52225
- }
52226
- }
52227
- }
52228
- } else {
52229
- s7 = peg$FAILED;
52230
- }
52231
- if (s7 !== peg$FAILED) {
52232
- s5 = [s5, s6, s7];
52233
- s4 = s5;
52234
- } else {
52235
- peg$currPos = s4;
52236
- s4 = peg$FAILED;
52237
- }
52238
- } else {
52239
- peg$currPos = s4;
52240
- s4 = peg$FAILED;
52241
- }
52242
- if (s4 === peg$FAILED) {
52243
- s4 = null;
52244
- }
52245
- s2 = [s2, s3, s4];
52427
+ s2 = [s2, s3];
52246
52428
  s12 = s2;
52247
52429
  } else {
52248
52430
  peg$currPos = s12;
@@ -52250,7 +52432,7 @@ function peg$parse(input, options) {
52250
52432
  }
52251
52433
  if (s12 !== peg$FAILED) {
52252
52434
  peg$savedPos = s0;
52253
- s12 = peg$f44(s12);
52435
+ s12 = peg$f46(s12);
52254
52436
  }
52255
52437
  s0 = s12;
52256
52438
  return s0;
@@ -52259,62 +52441,62 @@ function peg$parse(input, options) {
52259
52441
  let s0, s12, s2, s3, s4, s5, s6, s7, s8;
52260
52442
  s0 = peg$currPos;
52261
52443
  s12 = input.charAt(peg$currPos);
52262
- if (peg$r8.test(s12)) {
52444
+ if (peg$r6.test(s12)) {
52263
52445
  peg$currPos++;
52264
52446
  } else {
52265
52447
  s12 = peg$FAILED;
52266
52448
  if (peg$silentFails === 0) {
52267
- peg$fail(peg$e28);
52449
+ peg$fail(peg$e26);
52268
52450
  }
52269
52451
  }
52270
52452
  if (s12 !== peg$FAILED) {
52271
52453
  s2 = input.charAt(peg$currPos);
52272
- if (peg$r9.test(s2)) {
52454
+ if (peg$r7.test(s2)) {
52273
52455
  peg$currPos++;
52274
52456
  } else {
52275
52457
  s2 = peg$FAILED;
52276
52458
  if (peg$silentFails === 0) {
52277
- peg$fail(peg$e29);
52459
+ peg$fail(peg$e27);
52278
52460
  }
52279
52461
  }
52280
52462
  if (s2 !== peg$FAILED) {
52281
52463
  s3 = input.charAt(peg$currPos);
52282
- if (peg$r10.test(s3)) {
52464
+ if (peg$r8.test(s3)) {
52283
52465
  peg$currPos++;
52284
52466
  } else {
52285
52467
  s3 = peg$FAILED;
52286
52468
  if (peg$silentFails === 0) {
52287
- peg$fail(peg$e30);
52469
+ peg$fail(peg$e28);
52288
52470
  }
52289
52471
  }
52290
52472
  if (s3 !== peg$FAILED) {
52291
52473
  s4 = input.charAt(peg$currPos);
52292
- if (peg$r11.test(s4)) {
52474
+ if (peg$r9.test(s4)) {
52293
52475
  peg$currPos++;
52294
52476
  } else {
52295
52477
  s4 = peg$FAILED;
52296
52478
  if (peg$silentFails === 0) {
52297
- peg$fail(peg$e31);
52479
+ peg$fail(peg$e29);
52298
52480
  }
52299
52481
  }
52300
52482
  if (s4 !== peg$FAILED) {
52301
52483
  s5 = input.charAt(peg$currPos);
52302
- if (peg$r12.test(s5)) {
52484
+ if (peg$r10.test(s5)) {
52303
52485
  peg$currPos++;
52304
52486
  } else {
52305
52487
  s5 = peg$FAILED;
52306
52488
  if (peg$silentFails === 0) {
52307
- peg$fail(peg$e32);
52489
+ peg$fail(peg$e30);
52308
52490
  }
52309
52491
  }
52310
52492
  if (s5 !== peg$FAILED) {
52311
52493
  s6 = input.charAt(peg$currPos);
52312
- if (peg$r9.test(s6)) {
52494
+ if (peg$r7.test(s6)) {
52313
52495
  peg$currPos++;
52314
52496
  } else {
52315
52497
  s6 = peg$FAILED;
52316
52498
  if (peg$silentFails === 0) {
52317
- peg$fail(peg$e29);
52499
+ peg$fail(peg$e27);
52318
52500
  }
52319
52501
  }
52320
52502
  if (s6 !== peg$FAILED) {
@@ -52365,52 +52547,52 @@ function peg$parse(input, options) {
52365
52547
  let s0, s12, s2, s3, s4, s5, s6, s7;
52366
52548
  s0 = peg$currPos;
52367
52549
  s12 = input.charAt(peg$currPos);
52368
- if (peg$r13.test(s12)) {
52550
+ if (peg$r11.test(s12)) {
52369
52551
  peg$currPos++;
52370
52552
  } else {
52371
52553
  s12 = peg$FAILED;
52372
52554
  if (peg$silentFails === 0) {
52373
- peg$fail(peg$e33);
52555
+ peg$fail(peg$e31);
52374
52556
  }
52375
52557
  }
52376
52558
  if (s12 !== peg$FAILED) {
52377
52559
  s2 = input.charAt(peg$currPos);
52378
- if (peg$r10.test(s2)) {
52560
+ if (peg$r8.test(s2)) {
52379
52561
  peg$currPos++;
52380
52562
  } else {
52381
52563
  s2 = peg$FAILED;
52382
52564
  if (peg$silentFails === 0) {
52383
- peg$fail(peg$e30);
52565
+ peg$fail(peg$e28);
52384
52566
  }
52385
52567
  }
52386
52568
  if (s2 !== peg$FAILED) {
52387
52569
  s3 = input.charAt(peg$currPos);
52388
- if (peg$r14.test(s3)) {
52570
+ if (peg$r12.test(s3)) {
52389
52571
  peg$currPos++;
52390
52572
  } else {
52391
52573
  s3 = peg$FAILED;
52392
52574
  if (peg$silentFails === 0) {
52393
- peg$fail(peg$e34);
52575
+ peg$fail(peg$e32);
52394
52576
  }
52395
52577
  }
52396
52578
  if (s3 !== peg$FAILED) {
52397
52579
  s4 = input.charAt(peg$currPos);
52398
- if (peg$r15.test(s4)) {
52580
+ if (peg$r13.test(s4)) {
52399
52581
  peg$currPos++;
52400
52582
  } else {
52401
52583
  s4 = peg$FAILED;
52402
52584
  if (peg$silentFails === 0) {
52403
- peg$fail(peg$e35);
52585
+ peg$fail(peg$e33);
52404
52586
  }
52405
52587
  }
52406
52588
  if (s4 !== peg$FAILED) {
52407
52589
  s5 = input.charAt(peg$currPos);
52408
- if (peg$r16.test(s5)) {
52590
+ if (peg$r14.test(s5)) {
52409
52591
  peg$currPos++;
52410
52592
  } else {
52411
52593
  s5 = peg$FAILED;
52412
52594
  if (peg$silentFails === 0) {
52413
- peg$fail(peg$e36);
52595
+ peg$fail(peg$e34);
52414
52596
  }
52415
52597
  }
52416
52598
  if (s5 !== peg$FAILED) {
@@ -52457,72 +52639,72 @@ function peg$parse(input, options) {
52457
52639
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9;
52458
52640
  s0 = peg$currPos;
52459
52641
  s12 = input.charAt(peg$currPos);
52460
- if (peg$r17.test(s12)) {
52642
+ if (peg$r15.test(s12)) {
52461
52643
  peg$currPos++;
52462
52644
  } else {
52463
52645
  s12 = peg$FAILED;
52464
52646
  if (peg$silentFails === 0) {
52465
- peg$fail(peg$e37);
52647
+ peg$fail(peg$e35);
52466
52648
  }
52467
52649
  }
52468
52650
  if (s12 !== peg$FAILED) {
52469
52651
  s2 = input.charAt(peg$currPos);
52470
- if (peg$r11.test(s2)) {
52652
+ if (peg$r9.test(s2)) {
52471
52653
  peg$currPos++;
52472
52654
  } else {
52473
52655
  s2 = peg$FAILED;
52474
52656
  if (peg$silentFails === 0) {
52475
- peg$fail(peg$e31);
52657
+ peg$fail(peg$e29);
52476
52658
  }
52477
52659
  }
52478
52660
  if (s2 !== peg$FAILED) {
52479
52661
  s3 = input.charAt(peg$currPos);
52480
- if (peg$r13.test(s3)) {
52662
+ if (peg$r11.test(s3)) {
52481
52663
  peg$currPos++;
52482
52664
  } else {
52483
52665
  s3 = peg$FAILED;
52484
52666
  if (peg$silentFails === 0) {
52485
- peg$fail(peg$e33);
52667
+ peg$fail(peg$e31);
52486
52668
  }
52487
52669
  }
52488
52670
  if (s3 !== peg$FAILED) {
52489
52671
  s4 = input.charAt(peg$currPos);
52490
- if (peg$r10.test(s4)) {
52672
+ if (peg$r8.test(s4)) {
52491
52673
  peg$currPos++;
52492
52674
  } else {
52493
52675
  s4 = peg$FAILED;
52494
52676
  if (peg$silentFails === 0) {
52495
- peg$fail(peg$e30);
52677
+ peg$fail(peg$e28);
52496
52678
  }
52497
52679
  }
52498
52680
  if (s4 !== peg$FAILED) {
52499
52681
  s5 = input.charAt(peg$currPos);
52500
- if (peg$r14.test(s5)) {
52682
+ if (peg$r12.test(s5)) {
52501
52683
  peg$currPos++;
52502
52684
  } else {
52503
52685
  s5 = peg$FAILED;
52504
52686
  if (peg$silentFails === 0) {
52505
- peg$fail(peg$e34);
52687
+ peg$fail(peg$e32);
52506
52688
  }
52507
52689
  }
52508
52690
  if (s5 !== peg$FAILED) {
52509
52691
  s6 = input.charAt(peg$currPos);
52510
- if (peg$r15.test(s6)) {
52692
+ if (peg$r13.test(s6)) {
52511
52693
  peg$currPos++;
52512
52694
  } else {
52513
52695
  s6 = peg$FAILED;
52514
52696
  if (peg$silentFails === 0) {
52515
- peg$fail(peg$e35);
52697
+ peg$fail(peg$e33);
52516
52698
  }
52517
52699
  }
52518
52700
  if (s6 !== peg$FAILED) {
52519
52701
  s7 = input.charAt(peg$currPos);
52520
- if (peg$r16.test(s7)) {
52702
+ if (peg$r14.test(s7)) {
52521
52703
  peg$currPos++;
52522
52704
  } else {
52523
52705
  s7 = peg$FAILED;
52524
52706
  if (peg$silentFails === 0) {
52525
- peg$fail(peg$e36);
52707
+ peg$fail(peg$e34);
52526
52708
  }
52527
52709
  }
52528
52710
  if (s7 !== peg$FAILED) {
@@ -52577,42 +52759,42 @@ function peg$parse(input, options) {
52577
52759
  let s0, s12, s2, s3, s4, s5, s6;
52578
52760
  s0 = peg$currPos;
52579
52761
  s12 = input.charAt(peg$currPos);
52580
- if (peg$r18.test(s12)) {
52762
+ if (peg$r16.test(s12)) {
52581
52763
  peg$currPos++;
52582
52764
  } else {
52583
52765
  s12 = peg$FAILED;
52584
52766
  if (peg$silentFails === 0) {
52585
- peg$fail(peg$e38);
52767
+ peg$fail(peg$e36);
52586
52768
  }
52587
52769
  }
52588
52770
  if (s12 !== peg$FAILED) {
52589
52771
  s2 = input.charAt(peg$currPos);
52590
- if (peg$r19.test(s2)) {
52772
+ if (peg$r17.test(s2)) {
52591
52773
  peg$currPos++;
52592
52774
  } else {
52593
52775
  s2 = peg$FAILED;
52594
52776
  if (peg$silentFails === 0) {
52595
- peg$fail(peg$e39);
52777
+ peg$fail(peg$e37);
52596
52778
  }
52597
52779
  }
52598
52780
  if (s2 !== peg$FAILED) {
52599
52781
  s3 = input.charAt(peg$currPos);
52600
- if (peg$r17.test(s3)) {
52782
+ if (peg$r15.test(s3)) {
52601
52783
  peg$currPos++;
52602
52784
  } else {
52603
52785
  s3 = peg$FAILED;
52604
52786
  if (peg$silentFails === 0) {
52605
- peg$fail(peg$e37);
52787
+ peg$fail(peg$e35);
52606
52788
  }
52607
52789
  }
52608
52790
  if (s3 !== peg$FAILED) {
52609
52791
  s4 = input.charAt(peg$currPos);
52610
- if (peg$r20.test(s4)) {
52792
+ if (peg$r18.test(s4)) {
52611
52793
  peg$currPos++;
52612
52794
  } else {
52613
52795
  s4 = peg$FAILED;
52614
52796
  if (peg$silentFails === 0) {
52615
- peg$fail(peg$e40);
52797
+ peg$fail(peg$e38);
52616
52798
  }
52617
52799
  }
52618
52800
  if (s4 !== peg$FAILED) {
@@ -52655,42 +52837,42 @@ function peg$parse(input, options) {
52655
52837
  let s0, s12, s2, s3, s4, s5, s6;
52656
52838
  s0 = peg$currPos;
52657
52839
  s12 = input.charAt(peg$currPos);
52658
- if (peg$r20.test(s12)) {
52840
+ if (peg$r18.test(s12)) {
52659
52841
  peg$currPos++;
52660
52842
  } else {
52661
52843
  s12 = peg$FAILED;
52662
52844
  if (peg$silentFails === 0) {
52663
- peg$fail(peg$e40);
52845
+ peg$fail(peg$e38);
52664
52846
  }
52665
52847
  }
52666
52848
  if (s12 !== peg$FAILED) {
52667
52849
  s2 = input.charAt(peg$currPos);
52668
- if (peg$r17.test(s2)) {
52850
+ if (peg$r15.test(s2)) {
52669
52851
  peg$currPos++;
52670
52852
  } else {
52671
52853
  s2 = peg$FAILED;
52672
52854
  if (peg$silentFails === 0) {
52673
- peg$fail(peg$e37);
52855
+ peg$fail(peg$e35);
52674
52856
  }
52675
52857
  }
52676
52858
  if (s2 !== peg$FAILED) {
52677
52859
  s3 = input.charAt(peg$currPos);
52678
- if (peg$r13.test(s3)) {
52860
+ if (peg$r11.test(s3)) {
52679
52861
  peg$currPos++;
52680
52862
  } else {
52681
52863
  s3 = peg$FAILED;
52682
52864
  if (peg$silentFails === 0) {
52683
- peg$fail(peg$e33);
52865
+ peg$fail(peg$e31);
52684
52866
  }
52685
52867
  }
52686
52868
  if (s3 !== peg$FAILED) {
52687
52869
  s4 = input.charAt(peg$currPos);
52688
- if (peg$r20.test(s4)) {
52870
+ if (peg$r18.test(s4)) {
52689
52871
  peg$currPos++;
52690
52872
  } else {
52691
52873
  s4 = peg$FAILED;
52692
52874
  if (peg$silentFails === 0) {
52693
- peg$fail(peg$e40);
52875
+ peg$fail(peg$e38);
52694
52876
  }
52695
52877
  }
52696
52878
  if (s4 !== peg$FAILED) {
@@ -52733,82 +52915,82 @@ function peg$parse(input, options) {
52733
52915
  let s0, s12, s2, s3, s4, s5, s6, s7, s8, s9, s10;
52734
52916
  s0 = peg$currPos;
52735
52917
  s12 = input.charAt(peg$currPos);
52736
- if (peg$r8.test(s12)) {
52918
+ if (peg$r6.test(s12)) {
52737
52919
  peg$currPos++;
52738
52920
  } else {
52739
52921
  s12 = peg$FAILED;
52740
52922
  if (peg$silentFails === 0) {
52741
- peg$fail(peg$e28);
52923
+ peg$fail(peg$e26);
52742
52924
  }
52743
52925
  }
52744
52926
  if (s12 !== peg$FAILED) {
52745
52927
  s2 = input.charAt(peg$currPos);
52746
- if (peg$r21.test(s2)) {
52928
+ if (peg$r19.test(s2)) {
52747
52929
  peg$currPos++;
52748
52930
  } else {
52749
52931
  s2 = peg$FAILED;
52750
52932
  if (peg$silentFails === 0) {
52751
- peg$fail(peg$e41);
52933
+ peg$fail(peg$e39);
52752
52934
  }
52753
52935
  }
52754
52936
  if (s2 !== peg$FAILED) {
52755
52937
  s3 = input.charAt(peg$currPos);
52756
- if (peg$r22.test(s3)) {
52938
+ if (peg$r20.test(s3)) {
52757
52939
  peg$currPos++;
52758
52940
  } else {
52759
52941
  s3 = peg$FAILED;
52760
52942
  if (peg$silentFails === 0) {
52761
- peg$fail(peg$e42);
52943
+ peg$fail(peg$e40);
52762
52944
  }
52763
52945
  }
52764
52946
  if (s3 !== peg$FAILED) {
52765
52947
  s4 = input.charAt(peg$currPos);
52766
- if (peg$r13.test(s4)) {
52948
+ if (peg$r11.test(s4)) {
52767
52949
  peg$currPos++;
52768
52950
  } else {
52769
52951
  s4 = peg$FAILED;
52770
52952
  if (peg$silentFails === 0) {
52771
- peg$fail(peg$e33);
52953
+ peg$fail(peg$e31);
52772
52954
  }
52773
52955
  }
52774
52956
  if (s4 !== peg$FAILED) {
52775
52957
  s5 = input.charAt(peg$currPos);
52776
- if (peg$r10.test(s5)) {
52958
+ if (peg$r8.test(s5)) {
52777
52959
  peg$currPos++;
52778
52960
  } else {
52779
52961
  s5 = peg$FAILED;
52780
52962
  if (peg$silentFails === 0) {
52781
- peg$fail(peg$e30);
52963
+ peg$fail(peg$e28);
52782
52964
  }
52783
52965
  }
52784
52966
  if (s5 !== peg$FAILED) {
52785
52967
  s6 = input.charAt(peg$currPos);
52786
- if (peg$r14.test(s6)) {
52968
+ if (peg$r12.test(s6)) {
52787
52969
  peg$currPos++;
52788
52970
  } else {
52789
52971
  s6 = peg$FAILED;
52790
52972
  if (peg$silentFails === 0) {
52791
- peg$fail(peg$e34);
52973
+ peg$fail(peg$e32);
52792
52974
  }
52793
52975
  }
52794
52976
  if (s6 !== peg$FAILED) {
52795
52977
  s7 = input.charAt(peg$currPos);
52796
- if (peg$r15.test(s7)) {
52978
+ if (peg$r13.test(s7)) {
52797
52979
  peg$currPos++;
52798
52980
  } else {
52799
52981
  s7 = peg$FAILED;
52800
52982
  if (peg$silentFails === 0) {
52801
- peg$fail(peg$e35);
52983
+ peg$fail(peg$e33);
52802
52984
  }
52803
52985
  }
52804
52986
  if (s7 !== peg$FAILED) {
52805
52987
  s8 = input.charAt(peg$currPos);
52806
- if (peg$r16.test(s8)) {
52988
+ if (peg$r14.test(s8)) {
52807
52989
  peg$currPos++;
52808
52990
  } else {
52809
52991
  s8 = peg$FAILED;
52810
52992
  if (peg$silentFails === 0) {
52811
- peg$fail(peg$e36);
52993
+ peg$fail(peg$e34);
52812
52994
  }
52813
52995
  }
52814
52996
  if (s8 !== peg$FAILED) {
@@ -52881,62 +53063,62 @@ function peg$parse(input, options) {
52881
53063
  s0 = peg$currPos;
52882
53064
  s12 = peg$currPos;
52883
53065
  s2 = input.charAt(peg$currPos);
52884
- if (peg$r8.test(s2)) {
53066
+ if (peg$r6.test(s2)) {
52885
53067
  peg$currPos++;
52886
53068
  } else {
52887
53069
  s2 = peg$FAILED;
52888
53070
  if (peg$silentFails === 0) {
52889
- peg$fail(peg$e28);
53071
+ peg$fail(peg$e26);
52890
53072
  }
52891
53073
  }
52892
53074
  if (s2 !== peg$FAILED) {
52893
53075
  s3 = input.charAt(peg$currPos);
52894
- if (peg$r9.test(s3)) {
53076
+ if (peg$r7.test(s3)) {
52895
53077
  peg$currPos++;
52896
53078
  } else {
52897
53079
  s3 = peg$FAILED;
52898
53080
  if (peg$silentFails === 0) {
52899
- peg$fail(peg$e29);
53081
+ peg$fail(peg$e27);
52900
53082
  }
52901
53083
  }
52902
53084
  if (s3 !== peg$FAILED) {
52903
53085
  s4 = input.charAt(peg$currPos);
52904
- if (peg$r10.test(s4)) {
53086
+ if (peg$r8.test(s4)) {
52905
53087
  peg$currPos++;
52906
53088
  } else {
52907
53089
  s4 = peg$FAILED;
52908
53090
  if (peg$silentFails === 0) {
52909
- peg$fail(peg$e30);
53091
+ peg$fail(peg$e28);
52910
53092
  }
52911
53093
  }
52912
53094
  if (s4 !== peg$FAILED) {
52913
53095
  s5 = input.charAt(peg$currPos);
52914
- if (peg$r11.test(s5)) {
53096
+ if (peg$r9.test(s5)) {
52915
53097
  peg$currPos++;
52916
53098
  } else {
52917
53099
  s5 = peg$FAILED;
52918
53100
  if (peg$silentFails === 0) {
52919
- peg$fail(peg$e31);
53101
+ peg$fail(peg$e29);
52920
53102
  }
52921
53103
  }
52922
53104
  if (s5 !== peg$FAILED) {
52923
53105
  s6 = input.charAt(peg$currPos);
52924
- if (peg$r12.test(s6)) {
53106
+ if (peg$r10.test(s6)) {
52925
53107
  peg$currPos++;
52926
53108
  } else {
52927
53109
  s6 = peg$FAILED;
52928
53110
  if (peg$silentFails === 0) {
52929
- peg$fail(peg$e32);
53111
+ peg$fail(peg$e30);
52930
53112
  }
52931
53113
  }
52932
53114
  if (s6 !== peg$FAILED) {
52933
53115
  s7 = input.charAt(peg$currPos);
52934
- if (peg$r9.test(s7)) {
53116
+ if (peg$r7.test(s7)) {
52935
53117
  peg$currPos++;
52936
53118
  } else {
52937
53119
  s7 = peg$FAILED;
52938
53120
  if (peg$silentFails === 0) {
52939
- peg$fail(peg$e29);
53121
+ peg$fail(peg$e27);
52940
53122
  }
52941
53123
  }
52942
53124
  if (s7 !== peg$FAILED) {
@@ -52969,72 +53151,72 @@ function peg$parse(input, options) {
52969
53151
  if (s12 === peg$FAILED) {
52970
53152
  s12 = peg$currPos;
52971
53153
  s2 = input.charAt(peg$currPos);
52972
- if (peg$r17.test(s2)) {
53154
+ if (peg$r15.test(s2)) {
52973
53155
  peg$currPos++;
52974
53156
  } else {
52975
53157
  s2 = peg$FAILED;
52976
53158
  if (peg$silentFails === 0) {
52977
- peg$fail(peg$e37);
53159
+ peg$fail(peg$e35);
52978
53160
  }
52979
53161
  }
52980
53162
  if (s2 !== peg$FAILED) {
52981
53163
  s3 = input.charAt(peg$currPos);
52982
- if (peg$r11.test(s3)) {
53164
+ if (peg$r9.test(s3)) {
52983
53165
  peg$currPos++;
52984
53166
  } else {
52985
53167
  s3 = peg$FAILED;
52986
53168
  if (peg$silentFails === 0) {
52987
- peg$fail(peg$e31);
53169
+ peg$fail(peg$e29);
52988
53170
  }
52989
53171
  }
52990
53172
  if (s3 !== peg$FAILED) {
52991
53173
  s4 = input.charAt(peg$currPos);
52992
- if (peg$r13.test(s4)) {
53174
+ if (peg$r11.test(s4)) {
52993
53175
  peg$currPos++;
52994
53176
  } else {
52995
53177
  s4 = peg$FAILED;
52996
53178
  if (peg$silentFails === 0) {
52997
- peg$fail(peg$e33);
53179
+ peg$fail(peg$e31);
52998
53180
  }
52999
53181
  }
53000
53182
  if (s4 !== peg$FAILED) {
53001
53183
  s5 = input.charAt(peg$currPos);
53002
- if (peg$r10.test(s5)) {
53184
+ if (peg$r8.test(s5)) {
53003
53185
  peg$currPos++;
53004
53186
  } else {
53005
53187
  s5 = peg$FAILED;
53006
53188
  if (peg$silentFails === 0) {
53007
- peg$fail(peg$e30);
53189
+ peg$fail(peg$e28);
53008
53190
  }
53009
53191
  }
53010
53192
  if (s5 !== peg$FAILED) {
53011
53193
  s6 = input.charAt(peg$currPos);
53012
- if (peg$r14.test(s6)) {
53194
+ if (peg$r12.test(s6)) {
53013
53195
  peg$currPos++;
53014
53196
  } else {
53015
53197
  s6 = peg$FAILED;
53016
53198
  if (peg$silentFails === 0) {
53017
- peg$fail(peg$e34);
53199
+ peg$fail(peg$e32);
53018
53200
  }
53019
53201
  }
53020
53202
  if (s6 !== peg$FAILED) {
53021
53203
  s7 = input.charAt(peg$currPos);
53022
- if (peg$r15.test(s7)) {
53204
+ if (peg$r13.test(s7)) {
53023
53205
  peg$currPos++;
53024
53206
  } else {
53025
53207
  s7 = peg$FAILED;
53026
53208
  if (peg$silentFails === 0) {
53027
- peg$fail(peg$e35);
53209
+ peg$fail(peg$e33);
53028
53210
  }
53029
53211
  }
53030
53212
  if (s7 !== peg$FAILED) {
53031
53213
  s8 = input.charAt(peg$currPos);
53032
- if (peg$r16.test(s8)) {
53214
+ if (peg$r14.test(s8)) {
53033
53215
  peg$currPos++;
53034
53216
  } else {
53035
53217
  s8 = peg$FAILED;
53036
53218
  if (peg$silentFails === 0) {
53037
- peg$fail(peg$e36);
53219
+ peg$fail(peg$e34);
53038
53220
  }
53039
53221
  }
53040
53222
  if (s8 !== peg$FAILED) {
@@ -53071,52 +53253,52 @@ function peg$parse(input, options) {
53071
53253
  if (s12 === peg$FAILED) {
53072
53254
  s12 = peg$currPos;
53073
53255
  s2 = input.charAt(peg$currPos);
53074
- if (peg$r13.test(s2)) {
53256
+ if (peg$r11.test(s2)) {
53075
53257
  peg$currPos++;
53076
53258
  } else {
53077
53259
  s2 = peg$FAILED;
53078
53260
  if (peg$silentFails === 0) {
53079
- peg$fail(peg$e33);
53261
+ peg$fail(peg$e31);
53080
53262
  }
53081
53263
  }
53082
53264
  if (s2 !== peg$FAILED) {
53083
53265
  s3 = input.charAt(peg$currPos);
53084
- if (peg$r10.test(s3)) {
53266
+ if (peg$r8.test(s3)) {
53085
53267
  peg$currPos++;
53086
53268
  } else {
53087
53269
  s3 = peg$FAILED;
53088
53270
  if (peg$silentFails === 0) {
53089
- peg$fail(peg$e30);
53271
+ peg$fail(peg$e28);
53090
53272
  }
53091
53273
  }
53092
53274
  if (s3 !== peg$FAILED) {
53093
53275
  s4 = input.charAt(peg$currPos);
53094
- if (peg$r14.test(s4)) {
53276
+ if (peg$r12.test(s4)) {
53095
53277
  peg$currPos++;
53096
53278
  } else {
53097
53279
  s4 = peg$FAILED;
53098
53280
  if (peg$silentFails === 0) {
53099
- peg$fail(peg$e34);
53281
+ peg$fail(peg$e32);
53100
53282
  }
53101
53283
  }
53102
53284
  if (s4 !== peg$FAILED) {
53103
53285
  s5 = input.charAt(peg$currPos);
53104
- if (peg$r15.test(s5)) {
53286
+ if (peg$r13.test(s5)) {
53105
53287
  peg$currPos++;
53106
53288
  } else {
53107
53289
  s5 = peg$FAILED;
53108
53290
  if (peg$silentFails === 0) {
53109
- peg$fail(peg$e35);
53291
+ peg$fail(peg$e33);
53110
53292
  }
53111
53293
  }
53112
53294
  if (s5 !== peg$FAILED) {
53113
53295
  s6 = input.charAt(peg$currPos);
53114
- if (peg$r16.test(s6)) {
53296
+ if (peg$r14.test(s6)) {
53115
53297
  peg$currPos++;
53116
53298
  } else {
53117
53299
  s6 = peg$FAILED;
53118
53300
  if (peg$silentFails === 0) {
53119
- peg$fail(peg$e36);
53301
+ peg$fail(peg$e34);
53120
53302
  }
53121
53303
  }
53122
53304
  if (s6 !== peg$FAILED) {
@@ -53145,42 +53327,42 @@ function peg$parse(input, options) {
53145
53327
  if (s12 === peg$FAILED) {
53146
53328
  s12 = peg$currPos;
53147
53329
  s2 = input.charAt(peg$currPos);
53148
- if (peg$r18.test(s2)) {
53330
+ if (peg$r16.test(s2)) {
53149
53331
  peg$currPos++;
53150
53332
  } else {
53151
53333
  s2 = peg$FAILED;
53152
53334
  if (peg$silentFails === 0) {
53153
- peg$fail(peg$e38);
53335
+ peg$fail(peg$e36);
53154
53336
  }
53155
53337
  }
53156
53338
  if (s2 !== peg$FAILED) {
53157
53339
  s3 = input.charAt(peg$currPos);
53158
- if (peg$r19.test(s3)) {
53340
+ if (peg$r17.test(s3)) {
53159
53341
  peg$currPos++;
53160
53342
  } else {
53161
53343
  s3 = peg$FAILED;
53162
53344
  if (peg$silentFails === 0) {
53163
- peg$fail(peg$e39);
53345
+ peg$fail(peg$e37);
53164
53346
  }
53165
53347
  }
53166
53348
  if (s3 !== peg$FAILED) {
53167
53349
  s4 = input.charAt(peg$currPos);
53168
- if (peg$r17.test(s4)) {
53350
+ if (peg$r15.test(s4)) {
53169
53351
  peg$currPos++;
53170
53352
  } else {
53171
53353
  s4 = peg$FAILED;
53172
53354
  if (peg$silentFails === 0) {
53173
- peg$fail(peg$e37);
53355
+ peg$fail(peg$e35);
53174
53356
  }
53175
53357
  }
53176
53358
  if (s4 !== peg$FAILED) {
53177
53359
  s5 = input.charAt(peg$currPos);
53178
- if (peg$r20.test(s5)) {
53360
+ if (peg$r18.test(s5)) {
53179
53361
  peg$currPos++;
53180
53362
  } else {
53181
53363
  s5 = peg$FAILED;
53182
53364
  if (peg$silentFails === 0) {
53183
- peg$fail(peg$e40);
53365
+ peg$fail(peg$e38);
53184
53366
  }
53185
53367
  }
53186
53368
  if (s5 !== peg$FAILED) {
@@ -53205,42 +53387,42 @@ function peg$parse(input, options) {
53205
53387
  if (s12 === peg$FAILED) {
53206
53388
  s12 = peg$currPos;
53207
53389
  s2 = input.charAt(peg$currPos);
53208
- if (peg$r20.test(s2)) {
53390
+ if (peg$r18.test(s2)) {
53209
53391
  peg$currPos++;
53210
53392
  } else {
53211
53393
  s2 = peg$FAILED;
53212
53394
  if (peg$silentFails === 0) {
53213
- peg$fail(peg$e40);
53395
+ peg$fail(peg$e38);
53214
53396
  }
53215
53397
  }
53216
53398
  if (s2 !== peg$FAILED) {
53217
53399
  s3 = input.charAt(peg$currPos);
53218
- if (peg$r17.test(s3)) {
53400
+ if (peg$r15.test(s3)) {
53219
53401
  peg$currPos++;
53220
53402
  } else {
53221
53403
  s3 = peg$FAILED;
53222
53404
  if (peg$silentFails === 0) {
53223
- peg$fail(peg$e37);
53405
+ peg$fail(peg$e35);
53224
53406
  }
53225
53407
  }
53226
53408
  if (s3 !== peg$FAILED) {
53227
53409
  s4 = input.charAt(peg$currPos);
53228
- if (peg$r13.test(s4)) {
53410
+ if (peg$r11.test(s4)) {
53229
53411
  peg$currPos++;
53230
53412
  } else {
53231
53413
  s4 = peg$FAILED;
53232
53414
  if (peg$silentFails === 0) {
53233
- peg$fail(peg$e33);
53415
+ peg$fail(peg$e31);
53234
53416
  }
53235
53417
  }
53236
53418
  if (s4 !== peg$FAILED) {
53237
53419
  s5 = input.charAt(peg$currPos);
53238
- if (peg$r20.test(s5)) {
53420
+ if (peg$r18.test(s5)) {
53239
53421
  peg$currPos++;
53240
53422
  } else {
53241
53423
  s5 = peg$FAILED;
53242
53424
  if (peg$silentFails === 0) {
53243
- peg$fail(peg$e40);
53425
+ peg$fail(peg$e38);
53244
53426
  }
53245
53427
  }
53246
53428
  if (s5 !== peg$FAILED) {
@@ -53265,82 +53447,82 @@ function peg$parse(input, options) {
53265
53447
  if (s12 === peg$FAILED) {
53266
53448
  s12 = peg$currPos;
53267
53449
  s2 = input.charAt(peg$currPos);
53268
- if (peg$r8.test(s2)) {
53450
+ if (peg$r6.test(s2)) {
53269
53451
  peg$currPos++;
53270
53452
  } else {
53271
53453
  s2 = peg$FAILED;
53272
53454
  if (peg$silentFails === 0) {
53273
- peg$fail(peg$e28);
53455
+ peg$fail(peg$e26);
53274
53456
  }
53275
53457
  }
53276
53458
  if (s2 !== peg$FAILED) {
53277
53459
  s3 = input.charAt(peg$currPos);
53278
- if (peg$r21.test(s3)) {
53460
+ if (peg$r19.test(s3)) {
53279
53461
  peg$currPos++;
53280
53462
  } else {
53281
53463
  s3 = peg$FAILED;
53282
53464
  if (peg$silentFails === 0) {
53283
- peg$fail(peg$e41);
53465
+ peg$fail(peg$e39);
53284
53466
  }
53285
53467
  }
53286
53468
  if (s3 !== peg$FAILED) {
53287
53469
  s4 = input.charAt(peg$currPos);
53288
- if (peg$r22.test(s4)) {
53470
+ if (peg$r20.test(s4)) {
53289
53471
  peg$currPos++;
53290
53472
  } else {
53291
53473
  s4 = peg$FAILED;
53292
53474
  if (peg$silentFails === 0) {
53293
- peg$fail(peg$e42);
53475
+ peg$fail(peg$e40);
53294
53476
  }
53295
53477
  }
53296
53478
  if (s4 !== peg$FAILED) {
53297
53479
  s5 = input.charAt(peg$currPos);
53298
- if (peg$r13.test(s5)) {
53480
+ if (peg$r11.test(s5)) {
53299
53481
  peg$currPos++;
53300
53482
  } else {
53301
53483
  s5 = peg$FAILED;
53302
53484
  if (peg$silentFails === 0) {
53303
- peg$fail(peg$e33);
53485
+ peg$fail(peg$e31);
53304
53486
  }
53305
53487
  }
53306
53488
  if (s5 !== peg$FAILED) {
53307
53489
  s6 = input.charAt(peg$currPos);
53308
- if (peg$r10.test(s6)) {
53490
+ if (peg$r8.test(s6)) {
53309
53491
  peg$currPos++;
53310
53492
  } else {
53311
53493
  s6 = peg$FAILED;
53312
53494
  if (peg$silentFails === 0) {
53313
- peg$fail(peg$e30);
53495
+ peg$fail(peg$e28);
53314
53496
  }
53315
53497
  }
53316
53498
  if (s6 !== peg$FAILED) {
53317
53499
  s7 = input.charAt(peg$currPos);
53318
- if (peg$r14.test(s7)) {
53500
+ if (peg$r12.test(s7)) {
53319
53501
  peg$currPos++;
53320
53502
  } else {
53321
53503
  s7 = peg$FAILED;
53322
53504
  if (peg$silentFails === 0) {
53323
- peg$fail(peg$e34);
53505
+ peg$fail(peg$e32);
53324
53506
  }
53325
53507
  }
53326
53508
  if (s7 !== peg$FAILED) {
53327
53509
  s8 = input.charAt(peg$currPos);
53328
- if (peg$r15.test(s8)) {
53510
+ if (peg$r13.test(s8)) {
53329
53511
  peg$currPos++;
53330
53512
  } else {
53331
53513
  s8 = peg$FAILED;
53332
53514
  if (peg$silentFails === 0) {
53333
- peg$fail(peg$e35);
53515
+ peg$fail(peg$e33);
53334
53516
  }
53335
53517
  }
53336
53518
  if (s8 !== peg$FAILED) {
53337
53519
  s9 = input.charAt(peg$currPos);
53338
- if (peg$r16.test(s9)) {
53520
+ if (peg$r14.test(s9)) {
53339
53521
  peg$currPos++;
53340
53522
  } else {
53341
53523
  s9 = peg$FAILED;
53342
53524
  if (peg$silentFails === 0) {
53343
- peg$fail(peg$e36);
53525
+ peg$fail(peg$e34);
53344
53526
  }
53345
53527
  }
53346
53528
  if (s9 !== peg$FAILED) {
@@ -53412,24 +53594,24 @@ function peg$parse(input, options) {
53412
53594
  s0 = [];
53413
53595
  s12 = [];
53414
53596
  s2 = input.charAt(peg$currPos);
53415
- if (peg$r23.test(s2)) {
53597
+ if (peg$r21.test(s2)) {
53416
53598
  peg$currPos++;
53417
53599
  } else {
53418
53600
  s2 = peg$FAILED;
53419
53601
  if (peg$silentFails === 0) {
53420
- peg$fail(peg$e43);
53602
+ peg$fail(peg$e41);
53421
53603
  }
53422
53604
  }
53423
53605
  if (s2 !== peg$FAILED) {
53424
53606
  while (s2 !== peg$FAILED) {
53425
53607
  s12.push(s2);
53426
53608
  s2 = input.charAt(peg$currPos);
53427
- if (peg$r23.test(s2)) {
53609
+ if (peg$r21.test(s2)) {
53428
53610
  peg$currPos++;
53429
53611
  } else {
53430
53612
  s2 = peg$FAILED;
53431
53613
  if (peg$silentFails === 0) {
53432
- peg$fail(peg$e43);
53614
+ peg$fail(peg$e41);
53433
53615
  }
53434
53616
  }
53435
53617
  }
@@ -53449,24 +53631,24 @@ function peg$parse(input, options) {
53449
53631
  s0.push(s12);
53450
53632
  s12 = [];
53451
53633
  s2 = input.charAt(peg$currPos);
53452
- if (peg$r23.test(s2)) {
53634
+ if (peg$r21.test(s2)) {
53453
53635
  peg$currPos++;
53454
53636
  } else {
53455
53637
  s2 = peg$FAILED;
53456
53638
  if (peg$silentFails === 0) {
53457
- peg$fail(peg$e43);
53639
+ peg$fail(peg$e41);
53458
53640
  }
53459
53641
  }
53460
53642
  if (s2 !== peg$FAILED) {
53461
53643
  while (s2 !== peg$FAILED) {
53462
53644
  s12.push(s2);
53463
53645
  s2 = input.charAt(peg$currPos);
53464
- if (peg$r23.test(s2)) {
53646
+ if (peg$r21.test(s2)) {
53465
53647
  peg$currPos++;
53466
53648
  } else {
53467
53649
  s2 = peg$FAILED;
53468
53650
  if (peg$silentFails === 0) {
53469
- peg$fail(peg$e43);
53651
+ peg$fail(peg$e41);
53470
53652
  }
53471
53653
  }
53472
53654
  }
@@ -53494,7 +53676,7 @@ function peg$parse(input, options) {
53494
53676
  } else {
53495
53677
  s12 = peg$FAILED;
53496
53678
  if (peg$silentFails === 0) {
53497
- peg$fail(peg$e44);
53679
+ peg$fail(peg$e42);
53498
53680
  }
53499
53681
  }
53500
53682
  if (s12 !== peg$FAILED) {
@@ -53508,7 +53690,7 @@ function peg$parse(input, options) {
53508
53690
  } else {
53509
53691
  s5 = peg$FAILED;
53510
53692
  if (peg$silentFails === 0) {
53511
- peg$fail(peg$e45);
53693
+ peg$fail(peg$e43);
53512
53694
  }
53513
53695
  }
53514
53696
  peg$silentFails--;
@@ -53550,7 +53732,7 @@ function peg$parse(input, options) {
53550
53732
  } else {
53551
53733
  s5 = peg$FAILED;
53552
53734
  if (peg$silentFails === 0) {
53553
- peg$fail(peg$e45);
53735
+ peg$fail(peg$e43);
53554
53736
  }
53555
53737
  }
53556
53738
  peg$silentFails--;
@@ -53588,7 +53770,7 @@ function peg$parse(input, options) {
53588
53770
  } else {
53589
53771
  s3 = peg$FAILED;
53590
53772
  if (peg$silentFails === 0) {
53591
- peg$fail(peg$e45);
53773
+ peg$fail(peg$e43);
53592
53774
  }
53593
53775
  }
53594
53776
  if (s3 !== peg$FAILED) {
@@ -53613,29 +53795,29 @@ function peg$parse(input, options) {
53613
53795
  } else {
53614
53796
  s12 = peg$FAILED;
53615
53797
  if (peg$silentFails === 0) {
53616
- peg$fail(peg$e46);
53798
+ peg$fail(peg$e44);
53617
53799
  }
53618
53800
  }
53619
53801
  if (s12 !== peg$FAILED) {
53620
53802
  s2 = [];
53621
53803
  s3 = input.charAt(peg$currPos);
53622
- if (peg$r24.test(s3)) {
53804
+ if (peg$r22.test(s3)) {
53623
53805
  peg$currPos++;
53624
53806
  } else {
53625
53807
  s3 = peg$FAILED;
53626
53808
  if (peg$silentFails === 0) {
53627
- peg$fail(peg$e47);
53809
+ peg$fail(peg$e45);
53628
53810
  }
53629
53811
  }
53630
53812
  while (s3 !== peg$FAILED) {
53631
53813
  s2.push(s3);
53632
53814
  s3 = input.charAt(peg$currPos);
53633
- if (peg$r24.test(s3)) {
53815
+ if (peg$r22.test(s3)) {
53634
53816
  peg$currPos++;
53635
53817
  } else {
53636
53818
  s3 = peg$FAILED;
53637
53819
  if (peg$silentFails === 0) {
53638
- peg$fail(peg$e47);
53820
+ peg$fail(peg$e45);
53639
53821
  }
53640
53822
  }
53641
53823
  }
@@ -53645,7 +53827,7 @@ function peg$parse(input, options) {
53645
53827
  } else {
53646
53828
  s3 = peg$FAILED;
53647
53829
  if (peg$silentFails === 0) {
53648
- peg$fail(peg$e48);
53830
+ peg$fail(peg$e46);
53649
53831
  }
53650
53832
  }
53651
53833
  if (s3 === peg$FAILED) {
@@ -53690,29 +53872,29 @@ function peg$parse(input, options) {
53690
53872
  } else {
53691
53873
  s12 = peg$FAILED;
53692
53874
  if (peg$silentFails === 0) {
53693
- peg$fail(peg$e49);
53875
+ peg$fail(peg$e47);
53694
53876
  }
53695
53877
  }
53696
53878
  if (s12 !== peg$FAILED) {
53697
53879
  s2 = [];
53698
53880
  s3 = input.charAt(peg$currPos);
53699
- if (peg$r24.test(s3)) {
53881
+ if (peg$r22.test(s3)) {
53700
53882
  peg$currPos++;
53701
53883
  } else {
53702
53884
  s3 = peg$FAILED;
53703
53885
  if (peg$silentFails === 0) {
53704
- peg$fail(peg$e47);
53886
+ peg$fail(peg$e45);
53705
53887
  }
53706
53888
  }
53707
53889
  while (s3 !== peg$FAILED) {
53708
53890
  s2.push(s3);
53709
53891
  s3 = input.charAt(peg$currPos);
53710
- if (peg$r24.test(s3)) {
53892
+ if (peg$r22.test(s3)) {
53711
53893
  peg$currPos++;
53712
53894
  } else {
53713
53895
  s3 = peg$FAILED;
53714
53896
  if (peg$silentFails === 0) {
53715
- peg$fail(peg$e47);
53897
+ peg$fail(peg$e45);
53716
53898
  }
53717
53899
  }
53718
53900
  }
@@ -53722,7 +53904,7 @@ function peg$parse(input, options) {
53722
53904
  } else {
53723
53905
  s3 = peg$FAILED;
53724
53906
  if (peg$silentFails === 0) {
53725
- peg$fail(peg$e48);
53907
+ peg$fail(peg$e46);
53726
53908
  }
53727
53909
  }
53728
53910
  if (s3 === peg$FAILED) {
@@ -54085,6 +54267,75 @@ function buildFromAst(ast) {
54085
54267
  return graph;
54086
54268
  }
54087
54269
 
54270
+ // src/parser/number-scan.ts
54271
+ var ASCII_DEL = 127;
54272
+ function isLetter(c) {
54273
+ if (c === void 0) return false;
54274
+ return c >= "A" && c <= "Z" || c >= "a" && c <= "z" || c === "_" || c.charCodeAt(0) > ASCII_DEL;
54275
+ }
54276
+ function isDigit(c) {
54277
+ return c !== void 0 && c >= "0" && c <= "9";
54278
+ }
54279
+ function startsNumber(s, i) {
54280
+ const c = s[i];
54281
+ if (isDigit(c)) return true;
54282
+ if (c === ".") return isDigit(s[i + 1]);
54283
+ if (c !== "-") return false;
54284
+ return isDigit(s[i + 1]) || s[i + 1] === "." && isDigit(s[i + 2]);
54285
+ }
54286
+ function matchNumber(s, i) {
54287
+ let j = s[i] === "-" ? i + 1 : i;
54288
+ if (s[j] === ".") {
54289
+ j++;
54290
+ while (isDigit(s[j])) j++;
54291
+ } else {
54292
+ while (isDigit(s[j])) j++;
54293
+ if (s[j] === ".") {
54294
+ j++;
54295
+ while (isDigit(s[j])) j++;
54296
+ }
54297
+ }
54298
+ if (s[j] === "." || isLetter(s[j])) j++;
54299
+ return j;
54300
+ }
54301
+ function twoDots(text) {
54302
+ const dot = text.indexOf(".");
54303
+ return dot !== -1 && dot !== text.length - 1;
54304
+ }
54305
+ function chkNum(text) {
54306
+ const c = text[text.length - 1];
54307
+ return !isDigit(c) && c !== "." || c === "." && twoDots(text);
54308
+ }
54309
+ function lexToken(s, i) {
54310
+ if (isLetter(s[i])) {
54311
+ let j2 = i + 1;
54312
+ while (isLetter(s[j2]) || isDigit(s[j2])) j2++;
54313
+ return { next: j2, bad: null };
54314
+ }
54315
+ if (s[i] === "-" && (s[i + 1] === "-" || s[i + 1] === ">")) return { next: i + 2, bad: null };
54316
+ if (!startsNumber(s, i)) return { next: i + 1, bad: null };
54317
+ const j = matchNumber(s, i);
54318
+ const text = s.slice(i, j);
54319
+ return chkNum(text) ? { next: j - 1, bad: text } : { next: j, bad: null };
54320
+ }
54321
+ function scanNumberAmbiguities(src, stripped) {
54322
+ const out = [];
54323
+ let line = 1;
54324
+ let lineAt = 0;
54325
+ for (let i = 0; i < stripped.length; ) {
54326
+ const { next, bad } = lexToken(stripped, i);
54327
+ if (bad !== null) {
54328
+ for (; lineAt < i; lineAt++) if (src[lineAt] === "\n") line++;
54329
+ out.push({ text: bad, line, offset: i });
54330
+ }
54331
+ i = next;
54332
+ }
54333
+ return out;
54334
+ }
54335
+ function numberAmbiguityMessage(a) {
54336
+ return `Warning: syntax ambiguity - badly delimited number '${a.text}' in line ${a.line} of input splits into two tokens`;
54337
+ }
54338
+
54088
54339
  // src/parser/index.ts
54089
54340
  var ParseError = class extends DotEngineError {
54090
54341
  type = "syntax";
@@ -54244,6 +54495,12 @@ function isPeggyError(err) {
54244
54495
  if (typeof e["location"] !== "object" || e["location"] === null) return false;
54245
54496
  return "start" in e["location"];
54246
54497
  }
54498
+ function warnNumberAmbiguities(src, upTo) {
54499
+ for (const a of scanNumberAmbiguities(src, Stripper.strip(src))) {
54500
+ if (a.offset > upTo) break;
54501
+ console.error(numberAmbiguityMessage(a));
54502
+ }
54503
+ }
54247
54504
  function parse(src) {
54248
54505
  if (typeof src !== "string") {
54249
54506
  throw invalidArgType("dotSource", "string", src);
@@ -54254,6 +54511,7 @@ function parse(src) {
54254
54511
  } catch (err) {
54255
54512
  if (isPeggyError(err)) {
54256
54513
  const start = err.location.start;
54514
+ warnNumberAmbiguities(src, start.offset);
54257
54515
  const code = err.found === null ? "SYNTAX_UNEXPECTED_EOF" : "SYNTAX_ERROR";
54258
54516
  throw new ParseError(
54259
54517
  err instanceof Error ? err.message : String(err),
@@ -54271,6 +54529,7 @@ function parse(src) {
54271
54529
  }
54272
54530
  throw err;
54273
54531
  }
54532
+ warnNumberAmbiguities(src, src.length);
54274
54533
  validateEdgeOperators(src, ast.directed);
54275
54534
  return buildFromAst(ast);
54276
54535
  }
@@ -54279,6 +54538,7 @@ function parse(src) {
54279
54538
  var XDOT_PARSE_ERROR = 1;
54280
54539
 
54281
54540
  // src/xdot/parse.ts
54541
+ var ULONG_MAX = 0xffffffffffffffffn;
54282
54542
  var XdotParser = class _XdotParser {
54283
54543
  static isWs(c) {
54284
54544
  return c === " " || c === " " || c === "\n" || c === "\r";
@@ -54322,12 +54582,23 @@ var XdotParser = class _XdotParser {
54322
54582
  if (i === digStart) return null;
54323
54583
  return { val: parseInt(s.slice(start, i), 10), pos: i };
54324
54584
  }
54585
+ /**
54586
+ * strtoul(s, &endp, 10) cast to unsigned int: optional sign, a leading "-"
54587
+ * negates modulo 2^64, magnitude overflow saturates to ULONG_MAX, and the
54588
+ * result keeps the low 32 bits.
54589
+ * @see lib/xdot/xdot.c:parseUInt
54590
+ */
54325
54591
  static parseUInt_(s, pos) {
54326
54592
  const i = _XdotParser.skipWs(s, pos);
54327
- const start = i;
54328
- const end = _XdotParser.consumeDigits(s, i);
54593
+ let start = i;
54594
+ const negative = i < s.length && s[i] === "-";
54595
+ if (i < s.length && (s[i] === "-" || s[i] === "+")) start++;
54596
+ const end = _XdotParser.consumeDigits(s, start);
54329
54597
  if (end === start) return null;
54330
- return { val: parseInt(s.slice(start, end), 10), pos: end };
54598
+ const mag = BigInt(s.slice(start, end));
54599
+ const clamped = mag > ULONG_MAX ? ULONG_MAX : mag;
54600
+ const wrapped = negative && mag <= ULONG_MAX ? BigInt.asUintN(64, -clamped) : clamped;
54601
+ return { val: Number(BigInt.asUintN(32, wrapped)), pos: end };
54331
54602
  }
54332
54603
  static parseRect(s, pos) {
54333
54604
  const rx = _XdotParser.parseReal(s, pos);
@@ -54424,7 +54695,7 @@ var XdotParser = class _XdotParser {
54424
54695
  if (!rx1) return null;
54425
54696
  const ry1 = _XdotParser.parseReal(s, rx1.pos);
54426
54697
  if (!ry1) return null;
54427
- const rn = _XdotParser.parseInt_(s, ry1.pos);
54698
+ const rn = _XdotParser.parseUInt_(s, ry1.pos);
54428
54699
  if (!rn) return null;
54429
54700
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54430
54701
  if (!rs) return null;
@@ -54443,7 +54714,7 @@ var XdotParser = class _XdotParser {
54443
54714
  if (!ry1) return null;
54444
54715
  const rr1 = _XdotParser.parseReal(s, ry1.pos);
54445
54716
  if (!rr1) return null;
54446
- const rn = _XdotParser.parseInt_(s, rr1.pos);
54717
+ const rn = _XdotParser.parseUInt_(s, rr1.pos);
54447
54718
  if (!rn) return null;
54448
54719
  const rs = _XdotParser.parseStops(s, rn.pos, rn.val);
54449
54720
  if (!rs) return null;