polytypo 1.6.2 → 1.7.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 (77) hide show
  1. package/README.md +27 -0
  2. package/dist/{chunk-CW3GAIYQ.js → chunk-25XZKUNP.js} +1 -1
  3. package/dist/{chunk-CW3GAIYQ.js.map → chunk-25XZKUNP.js.map} +1 -1
  4. package/dist/chunk-33SLJJSZ.cjs +33 -0
  5. package/dist/{chunk-7SX4K4MI.cjs.map → chunk-33SLJJSZ.cjs.map} +1 -1
  6. package/dist/{chunk-J32K2ENU.cjs → chunk-54TSHDNC.cjs} +68 -20
  7. package/dist/chunk-54TSHDNC.cjs.map +1 -0
  8. package/dist/chunk-74I62TZ2.js +35 -0
  9. package/dist/chunk-74I62TZ2.js.map +1 -0
  10. package/dist/{chunk-HBAWMBV7.js → chunk-DAIPI5CX.js} +2 -2
  11. package/dist/{chunk-T6DOGDDS.cjs → chunk-FMU74VA6.cjs} +1 -1
  12. package/dist/{chunk-T6DOGDDS.cjs.map → chunk-FMU74VA6.cjs.map} +1 -1
  13. package/dist/{chunk-TIYWNQJT.js → chunk-GUTUSN4K.js} +4 -4
  14. package/dist/{chunk-V5MA5FVX.js → chunk-HBIIWBB5.js} +23 -27
  15. package/dist/chunk-HBIIWBB5.js.map +1 -0
  16. package/dist/chunk-HTCGXDEG.cjs +31 -0
  17. package/dist/{chunk-F2TYEIR6.cjs.map → chunk-HTCGXDEG.cjs.map} +1 -1
  18. package/dist/{chunk-XRBVOVKA.cjs → chunk-I2QPXPHX.cjs} +3 -3
  19. package/dist/{chunk-XRBVOVKA.cjs.map → chunk-I2QPXPHX.cjs.map} +1 -1
  20. package/dist/{chunk-XO74OCDD.cjs → chunk-IQHYZG2K.cjs} +23 -27
  21. package/dist/chunk-IQHYZG2K.cjs.map +1 -0
  22. package/dist/{chunk-YF4HZDOF.js → chunk-ITDTGCLJ.js} +2 -2
  23. package/dist/{chunk-XSQWMQXM.js → chunk-JE2MK4CC.js} +59 -11
  24. package/dist/chunk-JE2MK4CC.js.map +1 -0
  25. package/dist/{chunk-EU6OXPQ4.js → chunk-JVBK3LG3.js} +2 -2
  26. package/dist/{chunk-XKLNVHLQ.cjs → chunk-MMXKQUAS.cjs} +4 -4
  27. package/dist/{chunk-XKLNVHLQ.cjs.map → chunk-MMXKQUAS.cjs.map} +1 -1
  28. package/dist/{chunk-UNG66DF3.js → chunk-U5Y7C2L4.js} +21 -8
  29. package/dist/{chunk-UNG66DF3.js.map → chunk-U5Y7C2L4.js.map} +1 -1
  30. package/dist/{chunk-XEWXDNYN.cjs → chunk-VDLHT5CW.cjs} +35 -22
  31. package/dist/chunk-VDLHT5CW.cjs.map +1 -0
  32. package/dist/chunk-X6CI7GWV.cjs +35 -0
  33. package/dist/chunk-X6CI7GWV.cjs.map +1 -0
  34. package/dist/{errors-C1_sHGgx.d.cts → errors-DeHxbXRn.d.cts} +8 -0
  35. package/dist/{errors-C1_sHGgx.d.ts → errors-DeHxbXRn.d.ts} +8 -0
  36. package/dist/html.cjs +10 -10
  37. package/dist/html.cjs.map +1 -1
  38. package/dist/html.d.cts +3 -3
  39. package/dist/html.d.ts +3 -3
  40. package/dist/html.js +5 -5
  41. package/dist/html.js.map +1 -1
  42. package/dist/index.cjs +18 -17
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +2 -2
  45. package/dist/index.d.ts +2 -2
  46. package/dist/index.js +8 -7
  47. package/dist/index.js.map +1 -1
  48. package/dist/markdown.cjs +11 -10
  49. package/dist/markdown.cjs.map +1 -1
  50. package/dist/markdown.d.cts +2 -2
  51. package/dist/markdown.d.ts +2 -2
  52. package/dist/markdown.js +6 -5
  53. package/dist/markdown.js.map +1 -1
  54. package/dist/text.cjs +8 -8
  55. package/dist/text.cjs.map +1 -1
  56. package/dist/text.d.cts +3 -3
  57. package/dist/text.d.ts +3 -3
  58. package/dist/text.js +3 -3
  59. package/dist/text.js.map +1 -1
  60. package/dist/yaml.cjs +10 -9
  61. package/dist/yaml.cjs.map +1 -1
  62. package/dist/yaml.d.cts +3 -3
  63. package/dist/yaml.d.ts +3 -3
  64. package/dist/yaml.js +5 -4
  65. package/dist/yaml.js.map +1 -1
  66. package/package.json +1 -1
  67. package/dist/chunk-7SX4K4MI.cjs +0 -33
  68. package/dist/chunk-F2TYEIR6.cjs +0 -31
  69. package/dist/chunk-J32K2ENU.cjs.map +0 -1
  70. package/dist/chunk-V5MA5FVX.js.map +0 -1
  71. package/dist/chunk-XEWXDNYN.cjs.map +0 -1
  72. package/dist/chunk-XO74OCDD.cjs.map +0 -1
  73. package/dist/chunk-XSQWMQXM.js.map +0 -1
  74. /package/dist/{chunk-HBAWMBV7.js.map → chunk-DAIPI5CX.js.map} +0 -0
  75. /package/dist/{chunk-TIYWNQJT.js.map → chunk-GUTUSN4K.js.map} +0 -0
  76. /package/dist/{chunk-YF4HZDOF.js.map → chunk-ITDTGCLJ.js.map} +0 -0
  77. /package/dist/{chunk-EU6OXPQ4.js.map → chunk-JVBK3LG3.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/polytypo-js/polytypo-js/dist/chunk-T6DOGDDS.cjs","../src/errors.ts","../src/engine/codepoints.ts","../src/generated/locales.ts","../src/engine/locale.ts","../src/engine/narrow-target.ts","../src/engine/letter-ranges.json","../src/engine/unicode.ts","../src/engine/sentinels.ts","../src/rules/apostrophe.ts","../src/rules/dash-shared.ts","../src/rules/dashes.ts","../src/rules/ellipsis.ts","../src/rules/hyphen.ts","../src/rules/nbsp.ts","../src/rules/quote-ambiguity.ts","../src/rules/quotes.ts","../src/rules/ranges.ts","../src/rules/spaces.ts","../src/rules/symbols.ts","../src/rules/registry.ts","../src/engine/edits.ts","../src/engine/origin.ts","../src/engine/rule-runner.ts"],"names":["HYPHEN","DIGIT_ZERO","DIGIT_NINE","isDigit","bind","at","HYPHEN_MINUS","scan","a","SPACE","FULL_STOP","EN_DASH","EM_DASH","isAlnum","isBreak","SQ","INLINE_SPACE","SPACELIKE","OPENISH","CLOSEISH","COMMA","SEMICOLON","EXCLAMATION","QUESTION","ELLIPSIS","PAREN_OPEN","PAREN_CLOSE","SQUARE_OPEN","SQUARE_CLOSE","SOLIDUS","isDotlike","isOpenBracket","NBSP","NNBSP","isSpaceLike","matchesAt"],"mappings":"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EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EACxF,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EACtF,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACtF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AAClD,CAAA;AN0jDA;AACA;AO5oDO,IAAM,cAAA,EAAmC,qBAAA;AAGzC,SAAS,QAAA,CAAS,EAAA,EAAqB;AAC5C,EAAA,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA;AACnB,EAAA,GAAA,CAAI,GAAA,EAAK,GAAA,EAAM,OAAQ,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA,GAAU,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA;AACzE,EAAA,IAAI,GAAA,EAAK,CAAA;AACT,EAAA,IAAI,GAAA,EAAK,aAAA,CAAc,OAAA,EAAS,EAAA,EAAI,CAAA;AACpC,EAAA,MAAA,CAAO,GAAA,GAAM,EAAA,EAAI;AACf,IAAA,MAAM,IAAA,EAAO,GAAA,EAAK,GAAA,GAAO,CAAA;AACzB,IAAA,MAAM,MAAA,EAAQ,aAAA,CAAc,IAAA,EAAM,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,EAAM,aAAA,CAAc,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KAAA,GAAA,CAClB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KACzB,OAAO,IAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA;AACT;AAWO,IAAM,aAAA,EAAkC;AAAA,EAC7C,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC5F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAQ,IAAA;AAAA,EACrF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAC1F,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS;AAC1E,CAAA;AAGO,SAAS,OAAA,CAAQ,EAAA,EAAqB;AAC3C,EAAA,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA;AACnB,EAAA,GAAA,CAAI,GAAA,EAAK,GAAA,EAAM,OAAO,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,EAAA;AAC1C,EAAA,IAAI,GAAA,EAAK,CAAA;AACT,EAAA,IAAI,GAAA,EAAK,YAAA,CAAa,OAAA,EAAS,EAAA,EAAI,CAAA;AACnC,EAAA,MAAA,CAAO,GAAA,GAAM,EAAA,EAAI;AACf,IAAA,MAAM,IAAA,EAAO,GAAA,EAAK,GAAA,GAAO,CAAA;AACzB,IAAA,MAAM,MAAA,EAAQ,YAAA,CAAa,IAAA,EAAM,CAAC,CAAA;AAClC,IAAA,MAAM,IAAA,EAAM,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AACpC,IAAA,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KAAA,GAAA,CAClB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KACzB,OAAO,IAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA;AACT;AAcO,IAAM,iBAAA,EAAsC;AAAA,EACjD,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAG,CAAA,EAAA;AAAA,EAAK,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAG,GAAA;AAAA,EAAK,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAG,CAAA,EAAA;AAAA,EAAK,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAAG,CAAA,EAAA;AAAA,EAAK,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,CAAA;AAAA,EAC5F,GAAA;AAAA,EAAK,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,GAAA;AAAA,EAAK,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAC9F,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,GAAA;AAAA,EACxF,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,GAAA;AAAA,EAAK,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,GAAA;AAAA,EAAK,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAChG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EACxF,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAC9F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,EAAA;AAAA,EAAK,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAC5F,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,CAAA;AAAA,EAAI,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAC1F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACxF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACxF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA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A,IAAA;AACF,EAAA;AACF;AnB4wKU;AACA;AoB//KG;AACX,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAOa;AACH,EAAA;AACR,EAAA;AACQ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACR,EAAA;AACA,EAAA;AACM,EAAA;AACR;AAGa;AACH,EAAA;AACR,EAAA;AACQ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACR,EAAA;AACA,EAAA;AACM,EAAA;AACR;AAEgB;AACN,EAAA;AACV;ApBw/KU;AACA;AqB/jLD;AACD,EAAA;AACR;AAMgB;AACV,EAAA;AACI,EAAA;AACR,EAAA;AACO,IAAA;AACC,IAAA;AAED,IAAA;AACH,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAGgB;AAKd,EAAA;AACI,EAAA;AAEE,EAAA;AACF,EAAA;AACJ,EAAA;AACE,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACA,EAAA;AACO,EAAA;AACT;ArBojLU;AACA;AsBtmLG;AAQG;AACd,EAAA;AACQ,IAAA;AACF,IAAA;AACN,EAAA;AACO,EAAA;AACT;AAQgB;AACV,EAAA;AACE,EAAA;AACF,EAAA;AACJ,EAAA;AACE,IAAA;AACA,IAAA;AACE,MAAA;AACI,MAAA;AACN,IAAA;AACA,IAAA;AACF,EAAA;AACA,EAAA;AACO,EAAA;AACT;AAiBgB;AAOP,EAAA;AACL,IAAA;AACA,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,EAAA;AACJ;AtBokLU;AACA;AuBloLM;AACR,EAAA;AACF,EAAA;AACF,IAAA;AACM,MAAA;AACF,QAAA;AACE,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAMgB;AAOV,EAAA;AACJ,EAAA;AACQ,IAAA;AACF,IAAA;AACJ,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAQgB;AAUV,EAAA;AACA,EAAA;AACE,EAAA;AACN,EAAA;AACQ,IAAA;AACF,IAAA;AACE,IAAA;AACA,IAAA;AACF,IAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACO,EAAA;AACT;AvBymLU;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/polytypo-js/polytypo-js/dist/chunk-T6DOGDDS.cjs","sourcesContent":[null,"export type PolytypoErrorCode =\n | \"POLYTYPO_UNKNOWN_LOCALE\"\n | \"POLYTYPO_INVALID_MODE\"\n | \"POLYTYPO_INVALID_DIALECT\"\n | \"POLYTYPO_UNKNOWN_RULE\"\n | \"POLYTYPO_MALFORMED_LOCALE_DATA\"\n | \"POLYTYPO_RULE_CONTRACT\"\n | \"POLYTYPO_MALFORMED_INPUT\"\n | \"POLYTYPO_INVALID_OPTION\";\n\n/** Codes are the contract across all five runtimes; messages are English and are not (ARCHITECTURE.md 4.6). */\nexport class PolytypoError extends Error {\n readonly code: PolytypoErrorCode;\n\n constructor(code: PolytypoErrorCode, message: string) {\n super(message);\n this.name = \"PolytypoError\";\n this.code = code;\n }\n}\n","/**\n * The engine indexes Unicode code points, never UTF-16 units: a JS string, a Go string and a\n * PHP string disagree about \"characters\" outside the BMP (ARCHITECTURE.md 4.2). Conversion\n * happens once on entry and once on exit.\n *\n * Unpaired surrogates are carried through as their own code point, so text that is not\n * well-formed UTF-16 still round-trips byte-for-byte instead of being silently repaired.\n */\nexport function toCodePoints(input: string): number[] {\n const out: number[] = [];\n const len = input.length;\n let i = 0;\n while (i < len) {\n const unit = input.charCodeAt(i);\n if (unit >= 0xd800 && unit <= 0xdbff && i + 1 < len) {\n const next = input.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n out.push((unit - 0xd800) * 0x400 + (next - 0xdc00) + 0x10000);\n i += 2;\n continue;\n }\n }\n out.push(unit);\n i += 1;\n }\n return out;\n}\n\nconst CHUNK = 4096;\n\nexport function fromCodePoints(cp: readonly number[]): string {\n if (cp.length === 0) return \"\";\n if (cp.length <= CHUNK) return String.fromCodePoint(...cp);\n let out = \"\";\n for (let i = 0; i < cp.length; i += CHUNK) {\n out += String.fromCodePoint(...cp.slice(i, i + CHUNK));\n }\n return out;\n}\n\nexport function isValidCodePoint(value: number): boolean {\n return Number.isInteger(value) && value >= 0 && value <= 0x10ffff;\n}\n","// Generated by scripts/gen-locales.mjs — do not edit. Run `npm run gen`.\n// Source: spec/locales/*.json + spec/locales/registry.json\n\nimport type { LocaleData } from \"../types.js\";\n\nexport const SPEC_VERSION = \"1.6.2\";\n\nexport const KNOWN_LOCALES: readonly string[] = [\n \"cs\",\n \"de-CH\",\n \"de-DE\",\n \"el\",\n \"en-GB\",\n \"en-US\",\n \"es\",\n \"fi\",\n \"fr\",\n \"fr-CA\",\n \"it\",\n \"nl\",\n \"pl\",\n \"pt-BR\",\n \"pt-PT\",\n \"ru\",\n \"sv\",\n \"tr\",\n \"uk\",\n];\n\nexport const ALIASES: Readonly<Record<string, string>> = {\n de: \"de-DE\",\n en: \"en-US\",\n pt: \"pt-PT\",\n};\n\nexport const LOCALES: Readonly<Record<string, LocaleData>> = {\n cs: { locale: \"cs\", name: \"Czech\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"k\", \"o\", \"s\", \"u\", \"v\", \"z\"], abbreviations: [\"a. s.\", \"s. r. o.\"], beforeUnits: [\"%\", \"\\u00B0C\", \"ha\", \"kg\", \"km\", \"cm\", \"mm\", \"m\\u00B2\", \"kWh\", \"km/h\", \"str.\", \"hod.\"], beforeNumber: [], beforeWord: [\"tj.\", \"tzv.\", \"tzn.\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n \"de-CH\": { locale: \"de-CH\", name: \"German (Switzerland)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u2039\", close: \"\\u203A\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. U.\", \"m. a. W.\", \"m. w. H.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Art.\", \"Abs.\", \"Ziff.\", \"Kap.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" } },\n \"de-DE\": { locale: \"de-DE\", name: \"German (Germany)\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. \\u00C4.\", \"z. T.\", \"i. d. R.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Nr.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" } },\n el: { locale: \"el\", name: \"Greek\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"en-GB\": { locale: \"en-GB\", name: \"English (United Kingdom)\", quotes: { primary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"en-US\": { locale: \"en-US\", name: \"English (United States)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [{ left: \"rock\", elided: \"n\", right: \"roll\" }], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"em-tight\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"chain\" } },\n es: { locale: \"es\", name: \"Spanish\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ej.\", \"a. C.\", \"d. C.\", \"EE. UU.\", \"FF. AA.\", \"N. del T.\", \"q. e. p. d.\", \"et al.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"mg\", \"mL\", \"min\", \"dB\", \"kW\", \"kWh\"], beforeNumber: [\"art.\", \"cap.\", \"n\\u00FAm.\", \"nro.\", \"p\\u00E1g.\", \"p\\u00E1gs.\"], beforeWord: [\"Sr.\", \"Sra.\", \"Srta.\"], afterSymbols: [], initialBinding: \"chain\" } },\n fi: { locale: \"fi\", name: \"Finnish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"fil. maist.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00A7\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n fr: { locale: \"fr\", name: \"French\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [\";\", \"!\", \"?\"], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n \"fr-CA\": { locale: \"fr-CA\", name: \"French (Canada)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n it: { locale: \"it\", name: \"Italian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"un\", \"d\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"n.\", \"pag.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n nl: { locale: \"nl\", name: \"Dutch\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\", \"t\", \"ns\", \"k\", \"m\", \"em\", \"r\", \"et\"] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"prof. dr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u20AC\", \"$\"], initialBinding: \"none\" } },\n pl: { locale: \"pl\", name: \"Polish\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u00BB\", close: \"\\u00AB\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"o\", \"u\", \"w\", \"z\"], abbreviations: [\"lek. med.\", \"in\\u017C. g\\u00F3rn.\", \"bp sufr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n \"pt-BR\": { locale: \"pt-BR\", name: \"Portuguese (Brazil)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"pt-PT\": { locale: \"pt-PT\", name: \"Portuguese (Portugal)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n ru: { locale: \"ru\", name: \"Russian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u043A\\u043E\\u0435-\", \"\\u043A\\u043E\\u0439-\"], suffixes: [\"-\\u0442\\u043E\", \"-\\u043B\\u0438\\u0431\\u043E\", \"-\\u043D\\u0438\\u0431\\u0443\\u0434\\u044C\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u043A\\u0430\"], compounds: [\"\\u0438\\u0437-\\u0437\\u0430\", \"\\u0438\\u0437-\\u043F\\u043E\\u0434\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"\\u0430\", \"\\u0432\", \"\\u0438\", \"\\u043A\", \"\\u043E\", \"\\u0441\", \"\\u0443\", \"\\u0432\\u043E\", \"\\u0434\\u043E\", \"\\u0437\\u0430\", \"\\u0438\\u0437\", \"\\u043A\\u043E\", \"\\u043D\\u0430\", \"\\u043E\\u0431\", \"\\u043E\\u0442\", \"\\u043F\\u043E\", \"\\u0441\\u043E\"], abbreviations: [\"\\u0438 \\u0442. \\u0434.\", \"\\u0438 \\u0442. \\u043F.\", \"\\u0442. \\u0435.\", \"\\u0438 \\u0434\\u0440.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20BD\", \"\\u00B0C\", \"\\u043A\\u043C\", \"\\u0441\\u043C\", \"\\u043C\\u043C\", \"\\u043A\\u0433\", \"\\u0433.\", \"\\u0433\\u0433.\", \"\\u0432.\", \"\\u0432\\u0432.\", \"\\u0442\\u044B\\u0441.\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\"], beforeNumber: [], beforeWord: [\"\\u0443\\u043B.\", \"\\u043F\\u043B.\"], afterSymbols: [\"\\u2116\", \"\\u00A7\"], initialBinding: \"chain\" } },\n sv: { locale: \"sv\", name: \"Swedish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"kr\", \"\\u20AC\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"kW\", \"kWh\", \"min\", \"sek\", \"tim\", \"h\", \"\\u00B0C\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n tr: { locale: \"tr\", name: \"Turkish\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"nin\", \"n\\u0131n\", \"de\", \"da\", \"te\", \"ye\", \"yle\", \"n\\u0131\", \"dan\", \"den\", \"lik\", \"nci\", \"\\u00FCm\"] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"Kur. B\\u015Fk.\", \"N\\u00F6. Sb.\"], beforeUnits: [\"mm\", \"cm\", \"km\", \"kg\", \"mg\", \"hl\", \"m\\u00B2\", \"cm\\u00B2\", \"\\u00B0C\", \"ton\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n uk: { locale: \"uk\", name: \"Ukrainian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u0431\\u0443\\u0434\\u044C-\", \"\\u043A\\u0430\\u0437\\u043D\\u0430-\", \"\\u0445\\u0442\\u043E\\u0437\\u043D\\u0430-\", \"\\u0431\\u043E\\u0437\\u043D\\u0430-\"], suffixes: [\"-\\u0431\\u043E\", \"-\\u043D\\u043E\", \"-\\u043E\\u0442\", \"-\\u0442\\u043E\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u0431\\u0443\\u0434\\u044C\", \"-\\u043D\\u0435\\u0431\\u0443\\u0434\\u044C\"], compounds: [\"\\u0432\\u0438\\u0434-\\u0432\\u043E\", \"\\u0433\\u0440-\\u043D\", \"\\u0456\\u043D-\\u0442\", \"\\u0440-\\u043D\", \"\\u0443\\u043D-\\u0442\", \"\\u0444-\\u043A\\u0430\", \"\\u0442-\\u0432\\u043E\", \"\\u0437-\\u0437\\u0430\", \"\\u0456\\u0437-\\u0437\\u0430\", \"\\u0437-\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0456\\u0434\", \"\\u0456\\u0437-\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0437\\u0430\", \"\\u0437-\\u043F\\u043E\\u043C\\u0456\\u0436\", \"\\u0437-\\u043F\\u043E\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u043E\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0440\\u043E\\u043C\\u0456\\u0436\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"\\u0456 \\u0442. \\u0434.\", \"\\u0456 \\u0442. \\u0456\\u043D.\", \"\\u0442\\u0430 \\u0456\\u043D.\", \"\\u043A\\u0443\\u0431. \\u0441\\u043C\"], beforeUnits: [\"%\", \"\\u0433\\u0430\", \"\\u0433\\u043E\\u0434\", \"\\u0434\\u043C\", \"\\u043A\\u0411\", \"\\u043A\\u0412\\u0442\", \"\\u043A\\u0433\", \"\\u043A\\u043C\", \"\\u043C\\u043C\", \"\\u0441\\u043C\", \"\\u0445\\u0432\", \"\\u0412\\u0442\", \"\\u043A\\u043C/\\u0433\\u043E\\u0434\", \"\\u043C/\\u0441\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\", \"\\u0442\\u0440\\u043B\\u043D\", \"\\u0433\\u0440\\u043D\", \"\\u0440.\"], beforeNumber: [], beforeWord: [\"\\u0430\\u043A\\u0430\\u0434.\", \"\\u0434\\u043E\\u0446.\", \"\\u043F\\u0440\\u043E\\u0444.\"], afterSymbols: [], initialBinding: \"chain\" } },\n};\n","import { ALIASES, KNOWN_LOCALES, LOCALES } from \"../generated/locales.js\";\nimport { fromCodePoints, toCodePoints } from \"./codepoints.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { LocaleData } from \"../types.js\";\n\nconst HYPHEN = 0x2d;\nconst UNDERSCORE = 0x5f;\nconst UPPER_A = 0x41;\nconst UPPER_Z = 0x5a;\nconst LOWER_A = 0x61;\nconst LOWER_Z = 0x7a;\nconst CASE_GAP = 0x20;\n\n/** Names the offending value without interpolating an object that may throw in `toString`. */\nfunction describe(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n return typeof value;\n}\n\nfunction isLowerAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= LOWER_A && cp <= LOWER_Z;\n}\n\nfunction isUpperAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= UPPER_A && cp <= UPPER_Z;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.2. ASCII arithmetic only: no toLowerCase, no toUpperCase,\n * no ICU, no host locale, so a Turkish process resolves `EN-us` exactly as a Finnish one does\n * (ARCHITECTURE.md 4.4).\n */\nfunction canonicalize(tag: string): number[] {\n const c = toCodePoints(tag).map((cp) => (cp === UNDERSCORE ? HYPHEN : cp));\n const m = c.length;\n if (m >= 2) {\n for (const j of [0, 1]) {\n if (isUpperAscii(c[j])) c[j] = (c[j] as number) + CASE_GAP;\n }\n }\n if (m === 5 && c[2] === HYPHEN) {\n for (const j of [3, 4]) {\n if (isLowerAscii(c[j])) c[j] = (c[j] as number) - CASE_GAP;\n }\n }\n return c;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.3. Exactly two accepted shapes, tested by index rather\n * than by pattern (ARCHITECTURE.md 4.1). Everything else — `eng`, `sr-Latn`, `es-419`,\n * `de-`, `en-US-POSIX`, `und` — is malformed and throws like any unknown tag.\n */\nfunction hasAcceptedShape(c: readonly number[]): boolean {\n if (c.length === 2) return isLowerAscii(c[0]) && isLowerAscii(c[1]);\n if (c.length === 5) {\n return (\n isLowerAscii(c[0]) &&\n isLowerAscii(c[1]) &&\n c[2] === HYPHEN &&\n isUpperAscii(c[3]) &&\n isUpperAscii(c[4])\n );\n }\n return false;\n}\n\n/** Alias values are concrete locales by registry invariant (locale-resolution.md 2). */\nfunction aliasTarget(tag: string): string | undefined {\n const target = Object.prototype.hasOwnProperty.call(ALIASES, tag) ? ALIASES[tag] : undefined;\n if (target === undefined) return undefined;\n if (!KNOWN_LOCALES.includes(target)) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Registry alias \"${tag}\" points at \"${target}\", which is not a declared locale.`,\n );\n }\n return target;\n}\n\nfunction lookup(tag: string): string | undefined {\n // Exact before alias, so a registry that wrongly lists a tag in both cannot make lookup\n // order observable (locale-resolution.md 3.4).\n if (KNOWN_LOCALES.includes(tag)) return tag;\n return aliasTarget(tag);\n}\n\n/**\n * Exact match, then the registry alias table, then the language subtag alone — once, with no\n * chain. Never Intl, never a platform locale negotiator: those disagree across runtimes and\n * several of them return a best-effort match for a language they have never heard of\n * (ARCHITECTURE.md 4.7, locale-resolution.md 1).\n */\n/** `tag` is typed `unknown`: it comes straight from the caller and is validated here, at the boundary. */\nexport function resolveLocaleTag(tag: unknown): string {\n // locale-resolution.md 3.1 step 1: absent, null or empty throws the coded error like any\n // other unresolvable tag. `locale: string` is a compile-time claim; a plain-JS caller can\n // pass anything, and a native TypeError is not in the error taxonomy (ARCHITECTURE.md 4.6),\n // so a port following 3.1 would fail differently on the same input.\n // An empty string needs no branch here: it has no accepted shape and falls through below.\n if (typeof tag !== \"string\") {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `The \\`locale\\` option is required and must be a string; received ${describe(tag)}.`,\n );\n }\n const c = canonicalize(tag);\n if (hasAcceptedShape(c)) {\n const canonical = fromCodePoints(c);\n const direct = lookup(canonical);\n if (direct !== undefined) return direct;\n if (c.length === 5) {\n const base = lookup(fromCodePoints(c.slice(0, 2)));\n if (base !== undefined) return base;\n }\n }\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `Unknown locale \"${tag}\". Known locales: ${KNOWN_LOCALES.join(\", \")}.`,\n );\n}\n\nexport function getLocaleData(tag: unknown): LocaleData {\n const resolved = resolveLocaleTag(tag);\n const data = Object.prototype.hasOwnProperty.call(LOCALES, resolved)\n ? LOCALES[resolved]\n : undefined;\n if (data === undefined) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Locale \"${resolved}\" is declared in the registry but no locale data was generated. Run \\`npm run gen\\`.`,\n );\n }\n return data;\n}\n\nexport { KNOWN_LOCALES };\n","import { PolytypoError } from \"../errors.js\";\nimport type { NarrowNbsp } from \"../types.js\";\n\n/** U+202F, the narrow no-break space — nbsp.md §3.1a's default NARROW-TARGET. */\nexport const NARROW_NO_BREAK_SPACE = 0x202f;\n/** U+00A0, what `narrowNbsp: \"nbsp\"` substitutes for it. */\nexport const NO_BREAK_SPACE = 0x00a0;\n\n/**\n * nbsp.md §3.1a: resolve the `narrowNbsp` option to the code point the rule writes. Done once,\n * at the call boundary, so no rule ever sees the option's string.\n *\n * Checked immediately after `mode` and before `rules` — the two checks that read nothing but the\n * call itself come first (nbsp.md §3.1a). It runs whether or not `nbsp` is enabled, so a\n * misspelled value still raises rather than being silently ignored.\n */\nexport function resolveNarrowTarget(value: NarrowNbsp | undefined): number {\n if (value === undefined || value === \"narrow\") return NARROW_NO_BREAK_SPACE;\n if (value === \"nbsp\") return NO_BREAK_SPACE;\n throw new PolytypoError(\n \"POLYTYPO_INVALID_OPTION\",\n `Unknown narrowNbsp ${JSON.stringify(value)}. Expected \"narrow\" or \"nbsp\".`,\n );\n}\n","[\n 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740,\n 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910,\n 929, 931, 1013, 1015, 1153, 1155, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471,\n 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1631, 1646,\n 1747, 1749, 1756, 1759, 1768, 1770, 1775, 1786, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1994,\n 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2160, 2183, 2185, 2191, 2199,\n 2273, 2275, 2403, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486,\n 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2544, 2545, 2556,\n 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654,\n 2654, 2672, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741,\n 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2809, 2815, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891,\n 2893, 2901, 2903, 2908, 2909, 2911, 2915, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962,\n 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014,\n 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3132,\n 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3164, 3165, 3168, 3171, 3200, 3203, 3205,\n 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3292, 3294, 3296, 3299, 3313, 3315, 3328, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402,\n 3406, 3412, 3415, 3423, 3427, 3450, 3455, 3457, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517,\n 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648,\n 3662, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782,\n 3782, 3784, 3790, 3804, 3807, 3840, 3840, 3864, 3865, 3893, 3893, 3895, 3895, 3897, 3897, 3902,\n 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4159, 4176, 4239, 4250,\n 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802,\n 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5109, 5112,\n 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5873, 5880, 5888, 5909, 5919, 5940, 5952,\n 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6155, 6157, 6159,\n 6159, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6480, 6509, 6512,\n 6516, 6528, 6571, 6576, 6601, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6783, 6823, 6823, 6832,\n 6877, 6880, 6891, 6912, 6988, 7019, 7027, 7040, 7087, 7098, 7155, 7168, 7223, 7245, 7247, 7258,\n 7293, 7296, 7306, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7957, 7960, 7965, 7968,\n 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118,\n 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182,\n 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8579, 8580, 11264, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565,\n 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704,\n 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293,\n 12294, 12330, 12335, 12337, 12341, 12347, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968,\n 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42610, 42612, 42621, 42623,\n 42725, 42736, 42737, 42775, 42783, 42786, 42888, 42891, 42972, 42993, 43047, 43052, 43052, 43072,\n 43123, 43136, 43205, 43232, 43255, 43259, 43259, 43261, 43263, 43274, 43309, 43312, 43347, 43360,\n 43388, 43392, 43456, 43471, 43471, 43488, 43503, 43514, 43518, 43520, 43574, 43584, 43597, 43616,\n 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793,\n 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44010, 44012, 44013, 44032,\n 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285,\n 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467,\n 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65136, 65140, 65142,\n 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498,\n 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664,\n 65786, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66368, 66370,\n 66377, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66560, 66717, 66736, 66771, 66776,\n 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967,\n 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67008, 67059, 67072, 67382, 67392, 67413, 67424,\n 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639,\n 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840,\n 67861, 67872, 67897, 67904, 67929, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108,\n 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288,\n 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736,\n 68786, 68800, 68850, 68864, 68903, 68938, 68965, 68969, 68973, 68975, 68997, 69248, 69289, 69291,\n 69292, 69296, 69297, 69314, 69319, 69370, 69404, 69415, 69415, 69424, 69456, 69488, 69509, 69552,\n 69572, 69600, 69622, 69632, 69702, 69744, 69749, 69759, 69818, 69826, 69826, 69840, 69864, 69888,\n 69940, 69956, 69959, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70094, 70095, 70106,\n 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70209, 70272, 70278, 70280, 70280, 70282,\n 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70400, 70403, 70405, 70412, 70415, 70416, 70419,\n 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480,\n 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70528, 70537, 70539, 70539, 70542,\n 70542, 70544, 70581, 70583, 70592, 70594, 70594, 70597, 70597, 70599, 70602, 70604, 70611, 70625,\n 70626, 70656, 70730, 70750, 70753, 70784, 70853, 70855, 70855, 71040, 71093, 71096, 71104, 71128,\n 71133, 71168, 71232, 71236, 71236, 71296, 71352, 71424, 71450, 71453, 71467, 71488, 71494, 71680,\n 71738, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71989, 71991,\n 71992, 71995, 72003, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263,\n 72263, 72272, 72345, 72349, 72349, 72368, 72440, 72544, 72551, 72640, 72672, 72704, 72712, 72714,\n 72758, 72760, 72768, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971,\n 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73056, 73061, 73063, 73064, 73066, 73102, 73104,\n 73105, 73107, 73112, 73136, 73179, 73440, 73462, 73472, 73488, 73490, 73530, 73534, 73538, 73562,\n 73562, 73648, 73648, 73728, 74649, 74880, 75075, 77712, 77808, 77824, 78895, 78912, 78933, 78944,\n 82938, 82944, 83526, 90368, 90415, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92912,\n 92916, 92928, 92982, 92992, 92995, 93027, 93047, 93053, 93071, 93504, 93548, 93760, 93823, 93856,\n 93880, 93883, 93907, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94180, 94192,\n 94195, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589,\n 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960,\n 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 118528,\n 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210,\n 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973,\n 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071,\n 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134,\n 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572,\n 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746,\n 120770, 120772, 120779, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499,\n 121503, 121505, 121519, 122624, 122654, 122661, 122666, 122880, 122886, 122888, 122904, 122907,\n 122913, 122915, 122916, 122918, 122922, 122928, 122989, 123023, 123023, 123136, 123180, 123184,\n 123197, 123214, 123214, 123536, 123566, 123584, 123631, 124112, 124143, 124368, 124400, 124608,\n 124638, 124640, 124661, 124670, 124671, 124896, 124902, 124904, 124907, 124909, 124910, 124912,\n 124926, 124928, 125124, 125136, 125142, 125184, 125259, 126464, 126467, 126469, 126495, 126497,\n 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523,\n 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545,\n 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559,\n 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585,\n 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635,\n 126651, 131072, 173791, 173824, 178205, 178208, 183981, 183984, 191456, 191472, 192093, 194560,\n 195101, 196608, 201546, 201552, 210041, 917760, 917999\n]\n","// Shared Unicode general-category data for the rule engine.\n//\n// Unicode version: the table below is a DERIVED artifact, generated from the V8 UCD of the\n// machine that produced it (Node 22.23.2 / Unicode 17.0, confirmed by\n// tests/engine/unicode.test.ts, which re-checks every range boundary against the host\n// runtime). The spec does not yet pin a UCD version — spec/UNICODE does not exist and\n// spec/rules/apostrophe.md 7 and nbsp.md 7 both record the gap — so two runtimes built\n// against different UCD releases can still disagree on newly assigned code points. The test\n// turns that from a silent output change into a red build; the pin itself is a spec change.\n//\n// A table rather than `\\p{L}`: RE2 (Go) has no Unicode property parity with PCRE, so a rule\n// may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n//\n// The table itself lives in ./letter-ranges.json, not inline, so that build tooling outside\n// src/ (scripts/validate-spec.mjs, scripts/gen-locales.mjs — plain .mjs, run without a TS\n// build step, so they cannot import this file directly) can read the identical data by\n// re-parsing the same JSON rather than maintaining a second copy that could drift from this\n// one. Both sides implement the same binary search independently; only the data is shared.\n\nimport letterRanges from \"./letter-ranges.json\" with { type: \"json\" };\n\n/**\n * Unicode general categories Lu, Ll, Lt, Lm, Lo, Mn, Mc and Me as inclusive code-point\n * ranges, flattened to [start, end, start, end, ...] and sorted ascending.\n */\nexport const LETTER_RANGES: readonly number[] = letterRanges;\n\n/** True for a code point in Lu, Ll, Lt, Lm, Lo, Mn, Mc or Me. Binary search over LETTER_RANGES. */\nexport function isLetter(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return (cp >= 0x41 && cp <= 0x5a) || (cp >= 0x61 && cp <= 0x7a);\n let lo = 0;\n let hi = LETTER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = LETTER_RANGES[mid * 2] as number;\n const end = LETTER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode general categories Lu and Lt as inclusive code-point ranges, flattened to\n * [start, end, …] and sorted ascending — spec 3.1 `UPPER`, read by N7.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/nbsp.test.ts re-checks every range\n * boundary against the host runtime. A table rather than `\\p{Lu}`: RE2 has no Unicode\n * property parity, so a rule may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n * */\nexport const UPPER_RANGES: readonly number[] = [\n 0x41, 0x5a, 0xc0, 0xd6, 0xd8, 0xde, 0x100, 0x100, 0x102, 0x102, 0x104, 0x104, 0x106, 0x106, 0x108,\n 0x108, 0x10a, 0x10a, 0x10c, 0x10c, 0x10e, 0x10e, 0x110, 0x110, 0x112, 0x112, 0x114, 0x114, 0x116,\n 0x116, 0x118, 0x118, 0x11a, 0x11a, 0x11c, 0x11c, 0x11e, 0x11e, 0x120, 0x120, 0x122, 0x122, 0x124,\n 0x124, 0x126, 0x126, 0x128, 0x128, 0x12a, 0x12a, 0x12c, 0x12c, 0x12e, 0x12e, 0x130, 0x130, 0x132,\n 0x132, 0x134, 0x134, 0x136, 0x136, 0x139, 0x139, 0x13b, 0x13b, 0x13d, 0x13d, 0x13f, 0x13f, 0x141,\n 0x141, 0x143, 0x143, 0x145, 0x145, 0x147, 0x147, 0x14a, 0x14a, 0x14c, 0x14c, 0x14e, 0x14e, 0x150,\n 0x150, 0x152, 0x152, 0x154, 0x154, 0x156, 0x156, 0x158, 0x158, 0x15a, 0x15a, 0x15c, 0x15c, 0x15e,\n 0x15e, 0x160, 0x160, 0x162, 0x162, 0x164, 0x164, 0x166, 0x166, 0x168, 0x168, 0x16a, 0x16a, 0x16c,\n 0x16c, 0x16e, 0x16e, 0x170, 0x170, 0x172, 0x172, 0x174, 0x174, 0x176, 0x176, 0x178, 0x179, 0x17b,\n 0x17b, 0x17d, 0x17d, 0x181, 0x182, 0x184, 0x184, 0x186, 0x187, 0x189, 0x18b, 0x18e, 0x191, 0x193,\n 0x194, 0x196, 0x198, 0x19c, 0x19d, 0x19f, 0x1a0, 0x1a2, 0x1a2, 0x1a4, 0x1a4, 0x1a6, 0x1a7, 0x1a9,\n 0x1a9, 0x1ac, 0x1ac, 0x1ae, 0x1af, 0x1b1, 0x1b3, 0x1b5, 0x1b5, 0x1b7, 0x1b8, 0x1bc, 0x1bc, 0x1c4,\n 0x1c5, 0x1c7, 0x1c8, 0x1ca, 0x1cb, 0x1cd, 0x1cd, 0x1cf, 0x1cf, 0x1d1, 0x1d1, 0x1d3, 0x1d3, 0x1d5,\n 0x1d5, 0x1d7, 0x1d7, 0x1d9, 0x1d9, 0x1db, 0x1db, 0x1de, 0x1de, 0x1e0, 0x1e0, 0x1e2, 0x1e2, 0x1e4,\n 0x1e4, 0x1e6, 0x1e6, 0x1e8, 0x1e8, 0x1ea, 0x1ea, 0x1ec, 0x1ec, 0x1ee, 0x1ee, 0x1f1, 0x1f2, 0x1f4,\n 0x1f4, 0x1f6, 0x1f8, 0x1fa, 0x1fa, 0x1fc, 0x1fc, 0x1fe, 0x1fe, 0x200, 0x200, 0x202, 0x202, 0x204,\n 0x204, 0x206, 0x206, 0x208, 0x208, 0x20a, 0x20a, 0x20c, 0x20c, 0x20e, 0x20e, 0x210, 0x210, 0x212,\n 0x212, 0x214, 0x214, 0x216, 0x216, 0x218, 0x218, 0x21a, 0x21a, 0x21c, 0x21c, 0x21e, 0x21e, 0x220,\n 0x220, 0x222, 0x222, 0x224, 0x224, 0x226, 0x226, 0x228, 0x228, 0x22a, 0x22a, 0x22c, 0x22c, 0x22e,\n 0x22e, 0x230, 0x230, 0x232, 0x232, 0x23a, 0x23b, 0x23d, 0x23e, 0x241, 0x241, 0x243, 0x246, 0x248,\n 0x248, 0x24a, 0x24a, 0x24c, 0x24c, 0x24e, 0x24e, 0x370, 0x370, 0x372, 0x372, 0x376, 0x376, 0x37f,\n 0x37f, 0x386, 0x386, 0x388, 0x38a, 0x38c, 0x38c, 0x38e, 0x38f, 0x391, 0x3a1, 0x3a3, 0x3ab, 0x3cf,\n 0x3cf, 0x3d2, 0x3d4, 0x3d8, 0x3d8, 0x3da, 0x3da, 0x3dc, 0x3dc, 0x3de, 0x3de, 0x3e0, 0x3e0, 0x3e2,\n 0x3e2, 0x3e4, 0x3e4, 0x3e6, 0x3e6, 0x3e8, 0x3e8, 0x3ea, 0x3ea, 0x3ec, 0x3ec, 0x3ee, 0x3ee, 0x3f4,\n 0x3f4, 0x3f7, 0x3f7, 0x3f9, 0x3fa, 0x3fd, 0x42f, 0x460, 0x460, 0x462, 0x462, 0x464, 0x464, 0x466,\n 0x466, 0x468, 0x468, 0x46a, 0x46a, 0x46c, 0x46c, 0x46e, 0x46e, 0x470, 0x470, 0x472, 0x472, 0x474,\n 0x474, 0x476, 0x476, 0x478, 0x478, 0x47a, 0x47a, 0x47c, 0x47c, 0x47e, 0x47e, 0x480, 0x480, 0x48a,\n 0x48a, 0x48c, 0x48c, 0x48e, 0x48e, 0x490, 0x490, 0x492, 0x492, 0x494, 0x494, 0x496, 0x496, 0x498,\n 0x498, 0x49a, 0x49a, 0x49c, 0x49c, 0x49e, 0x49e, 0x4a0, 0x4a0, 0x4a2, 0x4a2, 0x4a4, 0x4a4, 0x4a6,\n 0x4a6, 0x4a8, 0x4a8, 0x4aa, 0x4aa, 0x4ac, 0x4ac, 0x4ae, 0x4ae, 0x4b0, 0x4b0, 0x4b2, 0x4b2, 0x4b4,\n 0x4b4, 0x4b6, 0x4b6, 0x4b8, 0x4b8, 0x4ba, 0x4ba, 0x4bc, 0x4bc, 0x4be, 0x4be, 0x4c0, 0x4c1, 0x4c3,\n 0x4c3, 0x4c5, 0x4c5, 0x4c7, 0x4c7, 0x4c9, 0x4c9, 0x4cb, 0x4cb, 0x4cd, 0x4cd, 0x4d0, 0x4d0, 0x4d2,\n 0x4d2, 0x4d4, 0x4d4, 0x4d6, 0x4d6, 0x4d8, 0x4d8, 0x4da, 0x4da, 0x4dc, 0x4dc, 0x4de, 0x4de, 0x4e0,\n 0x4e0, 0x4e2, 0x4e2, 0x4e4, 0x4e4, 0x4e6, 0x4e6, 0x4e8, 0x4e8, 0x4ea, 0x4ea, 0x4ec, 0x4ec, 0x4ee,\n 0x4ee, 0x4f0, 0x4f0, 0x4f2, 0x4f2, 0x4f4, 0x4f4, 0x4f6, 0x4f6, 0x4f8, 0x4f8, 0x4fa, 0x4fa, 0x4fc,\n 0x4fc, 0x4fe, 0x4fe, 0x500, 0x500, 0x502, 0x502, 0x504, 0x504, 0x506, 0x506, 0x508, 0x508, 0x50a,\n 0x50a, 0x50c, 0x50c, 0x50e, 0x50e, 0x510, 0x510, 0x512, 0x512, 0x514, 0x514, 0x516, 0x516, 0x518,\n 0x518, 0x51a, 0x51a, 0x51c, 0x51c, 0x51e, 0x51e, 0x520, 0x520, 0x522, 0x522, 0x524, 0x524, 0x526,\n 0x526, 0x528, 0x528, 0x52a, 0x52a, 0x52c, 0x52c, 0x52e, 0x52e, 0x531, 0x556, 0x10a0, 0x10c5,\n 0x10c7, 0x10c7, 0x10cd, 0x10cd, 0x13a0, 0x13f5, 0x1c89, 0x1c89, 0x1c90, 0x1cba, 0x1cbd, 0x1cbf,\n 0x1e00, 0x1e00, 0x1e02, 0x1e02, 0x1e04, 0x1e04, 0x1e06, 0x1e06, 0x1e08, 0x1e08, 0x1e0a, 0x1e0a,\n 0x1e0c, 0x1e0c, 0x1e0e, 0x1e0e, 0x1e10, 0x1e10, 0x1e12, 0x1e12, 0x1e14, 0x1e14, 0x1e16, 0x1e16,\n 0x1e18, 0x1e18, 0x1e1a, 0x1e1a, 0x1e1c, 0x1e1c, 0x1e1e, 0x1e1e, 0x1e20, 0x1e20, 0x1e22, 0x1e22,\n 0x1e24, 0x1e24, 0x1e26, 0x1e26, 0x1e28, 0x1e28, 0x1e2a, 0x1e2a, 0x1e2c, 0x1e2c, 0x1e2e, 0x1e2e,\n 0x1e30, 0x1e30, 0x1e32, 0x1e32, 0x1e34, 0x1e34, 0x1e36, 0x1e36, 0x1e38, 0x1e38, 0x1e3a, 0x1e3a,\n 0x1e3c, 0x1e3c, 0x1e3e, 0x1e3e, 0x1e40, 0x1e40, 0x1e42, 0x1e42, 0x1e44, 0x1e44, 0x1e46, 0x1e46,\n 0x1e48, 0x1e48, 0x1e4a, 0x1e4a, 0x1e4c, 0x1e4c, 0x1e4e, 0x1e4e, 0x1e50, 0x1e50, 0x1e52, 0x1e52,\n 0x1e54, 0x1e54, 0x1e56, 0x1e56, 0x1e58, 0x1e58, 0x1e5a, 0x1e5a, 0x1e5c, 0x1e5c, 0x1e5e, 0x1e5e,\n 0x1e60, 0x1e60, 0x1e62, 0x1e62, 0x1e64, 0x1e64, 0x1e66, 0x1e66, 0x1e68, 0x1e68, 0x1e6a, 0x1e6a,\n 0x1e6c, 0x1e6c, 0x1e6e, 0x1e6e, 0x1e70, 0x1e70, 0x1e72, 0x1e72, 0x1e74, 0x1e74, 0x1e76, 0x1e76,\n 0x1e78, 0x1e78, 0x1e7a, 0x1e7a, 0x1e7c, 0x1e7c, 0x1e7e, 0x1e7e, 0x1e80, 0x1e80, 0x1e82, 0x1e82,\n 0x1e84, 0x1e84, 0x1e86, 0x1e86, 0x1e88, 0x1e88, 0x1e8a, 0x1e8a, 0x1e8c, 0x1e8c, 0x1e8e, 0x1e8e,\n 0x1e90, 0x1e90, 0x1e92, 0x1e92, 0x1e94, 0x1e94, 0x1e9e, 0x1e9e, 0x1ea0, 0x1ea0, 0x1ea2, 0x1ea2,\n 0x1ea4, 0x1ea4, 0x1ea6, 0x1ea6, 0x1ea8, 0x1ea8, 0x1eaa, 0x1eaa, 0x1eac, 0x1eac, 0x1eae, 0x1eae,\n 0x1eb0, 0x1eb0, 0x1eb2, 0x1eb2, 0x1eb4, 0x1eb4, 0x1eb6, 0x1eb6, 0x1eb8, 0x1eb8, 0x1eba, 0x1eba,\n 0x1ebc, 0x1ebc, 0x1ebe, 0x1ebe, 0x1ec0, 0x1ec0, 0x1ec2, 0x1ec2, 0x1ec4, 0x1ec4, 0x1ec6, 0x1ec6,\n 0x1ec8, 0x1ec8, 0x1eca, 0x1eca, 0x1ecc, 0x1ecc, 0x1ece, 0x1ece, 0x1ed0, 0x1ed0, 0x1ed2, 0x1ed2,\n 0x1ed4, 0x1ed4, 0x1ed6, 0x1ed6, 0x1ed8, 0x1ed8, 0x1eda, 0x1eda, 0x1edc, 0x1edc, 0x1ede, 0x1ede,\n 0x1ee0, 0x1ee0, 0x1ee2, 0x1ee2, 0x1ee4, 0x1ee4, 0x1ee6, 0x1ee6, 0x1ee8, 0x1ee8, 0x1eea, 0x1eea,\n 0x1eec, 0x1eec, 0x1eee, 0x1eee, 0x1ef0, 0x1ef0, 0x1ef2, 0x1ef2, 0x1ef4, 0x1ef4, 0x1ef6, 0x1ef6,\n 0x1ef8, 0x1ef8, 0x1efa, 0x1efa, 0x1efc, 0x1efc, 0x1efe, 0x1efe, 0x1f08, 0x1f0f, 0x1f18, 0x1f1d,\n 0x1f28, 0x1f2f, 0x1f38, 0x1f3f, 0x1f48, 0x1f4d, 0x1f59, 0x1f59, 0x1f5b, 0x1f5b, 0x1f5d, 0x1f5d,\n 0x1f5f, 0x1f5f, 0x1f68, 0x1f6f, 0x1f88, 0x1f8f, 0x1f98, 0x1f9f, 0x1fa8, 0x1faf, 0x1fb8, 0x1fbc,\n 0x1fc8, 0x1fcc, 0x1fd8, 0x1fdb, 0x1fe8, 0x1fec, 0x1ff8, 0x1ffc, 0x2102, 0x2102, 0x2107, 0x2107,\n 0x210b, 0x210d, 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211d, 0x2124, 0x2124, 0x2126, 0x2126,\n 0x2128, 0x2128, 0x212a, 0x212d, 0x2130, 0x2133, 0x213e, 0x213f, 0x2145, 0x2145, 0x2183, 0x2183,\n 0x2c00, 0x2c2f, 0x2c60, 0x2c60, 0x2c62, 0x2c64, 0x2c67, 0x2c67, 0x2c69, 0x2c69, 0x2c6b, 0x2c6b,\n 0x2c6d, 0x2c70, 0x2c72, 0x2c72, 0x2c75, 0x2c75, 0x2c7e, 0x2c80, 0x2c82, 0x2c82, 0x2c84, 0x2c84,\n 0x2c86, 0x2c86, 0x2c88, 0x2c88, 0x2c8a, 0x2c8a, 0x2c8c, 0x2c8c, 0x2c8e, 0x2c8e, 0x2c90, 0x2c90,\n 0x2c92, 0x2c92, 0x2c94, 0x2c94, 0x2c96, 0x2c96, 0x2c98, 0x2c98, 0x2c9a, 0x2c9a, 0x2c9c, 0x2c9c,\n 0x2c9e, 0x2c9e, 0x2ca0, 0x2ca0, 0x2ca2, 0x2ca2, 0x2ca4, 0x2ca4, 0x2ca6, 0x2ca6, 0x2ca8, 0x2ca8,\n 0x2caa, 0x2caa, 0x2cac, 0x2cac, 0x2cae, 0x2cae, 0x2cb0, 0x2cb0, 0x2cb2, 0x2cb2, 0x2cb4, 0x2cb4,\n 0x2cb6, 0x2cb6, 0x2cb8, 0x2cb8, 0x2cba, 0x2cba, 0x2cbc, 0x2cbc, 0x2cbe, 0x2cbe, 0x2cc0, 0x2cc0,\n 0x2cc2, 0x2cc2, 0x2cc4, 0x2cc4, 0x2cc6, 0x2cc6, 0x2cc8, 0x2cc8, 0x2cca, 0x2cca, 0x2ccc, 0x2ccc,\n 0x2cce, 0x2cce, 0x2cd0, 0x2cd0, 0x2cd2, 0x2cd2, 0x2cd4, 0x2cd4, 0x2cd6, 0x2cd6, 0x2cd8, 0x2cd8,\n 0x2cda, 0x2cda, 0x2cdc, 0x2cdc, 0x2cde, 0x2cde, 0x2ce0, 0x2ce0, 0x2ce2, 0x2ce2, 0x2ceb, 0x2ceb,\n 0x2ced, 0x2ced, 0x2cf2, 0x2cf2, 0xa640, 0xa640, 0xa642, 0xa642, 0xa644, 0xa644, 0xa646, 0xa646,\n 0xa648, 0xa648, 0xa64a, 0xa64a, 0xa64c, 0xa64c, 0xa64e, 0xa64e, 0xa650, 0xa650, 0xa652, 0xa652,\n 0xa654, 0xa654, 0xa656, 0xa656, 0xa658, 0xa658, 0xa65a, 0xa65a, 0xa65c, 0xa65c, 0xa65e, 0xa65e,\n 0xa660, 0xa660, 0xa662, 0xa662, 0xa664, 0xa664, 0xa666, 0xa666, 0xa668, 0xa668, 0xa66a, 0xa66a,\n 0xa66c, 0xa66c, 0xa680, 0xa680, 0xa682, 0xa682, 0xa684, 0xa684, 0xa686, 0xa686, 0xa688, 0xa688,\n 0xa68a, 0xa68a, 0xa68c, 0xa68c, 0xa68e, 0xa68e, 0xa690, 0xa690, 0xa692, 0xa692, 0xa694, 0xa694,\n 0xa696, 0xa696, 0xa698, 0xa698, 0xa69a, 0xa69a, 0xa722, 0xa722, 0xa724, 0xa724, 0xa726, 0xa726,\n 0xa728, 0xa728, 0xa72a, 0xa72a, 0xa72c, 0xa72c, 0xa72e, 0xa72e, 0xa732, 0xa732, 0xa734, 0xa734,\n 0xa736, 0xa736, 0xa738, 0xa738, 0xa73a, 0xa73a, 0xa73c, 0xa73c, 0xa73e, 0xa73e, 0xa740, 0xa740,\n 0xa742, 0xa742, 0xa744, 0xa744, 0xa746, 0xa746, 0xa748, 0xa748, 0xa74a, 0xa74a, 0xa74c, 0xa74c,\n 0xa74e, 0xa74e, 0xa750, 0xa750, 0xa752, 0xa752, 0xa754, 0xa754, 0xa756, 0xa756, 0xa758, 0xa758,\n 0xa75a, 0xa75a, 0xa75c, 0xa75c, 0xa75e, 0xa75e, 0xa760, 0xa760, 0xa762, 0xa762, 0xa764, 0xa764,\n 0xa766, 0xa766, 0xa768, 0xa768, 0xa76a, 0xa76a, 0xa76c, 0xa76c, 0xa76e, 0xa76e, 0xa779, 0xa779,\n 0xa77b, 0xa77b, 0xa77d, 0xa77e, 0xa780, 0xa780, 0xa782, 0xa782, 0xa784, 0xa784, 0xa786, 0xa786,\n 0xa78b, 0xa78b, 0xa78d, 0xa78d, 0xa790, 0xa790, 0xa792, 0xa792, 0xa796, 0xa796, 0xa798, 0xa798,\n 0xa79a, 0xa79a, 0xa79c, 0xa79c, 0xa79e, 0xa79e, 0xa7a0, 0xa7a0, 0xa7a2, 0xa7a2, 0xa7a4, 0xa7a4,\n 0xa7a6, 0xa7a6, 0xa7a8, 0xa7a8, 0xa7aa, 0xa7ae, 0xa7b0, 0xa7b4, 0xa7b6, 0xa7b6, 0xa7b8, 0xa7b8,\n 0xa7ba, 0xa7ba, 0xa7bc, 0xa7bc, 0xa7be, 0xa7be, 0xa7c0, 0xa7c0, 0xa7c2, 0xa7c2, 0xa7c4, 0xa7c7,\n 0xa7c9, 0xa7c9, 0xa7cb, 0xa7cc, 0xa7ce, 0xa7ce, 0xa7d0, 0xa7d0, 0xa7d2, 0xa7d2, 0xa7d4, 0xa7d4,\n 0xa7d6, 0xa7d6, 0xa7d8, 0xa7d8, 0xa7da, 0xa7da, 0xa7dc, 0xa7dc, 0xa7f5, 0xa7f5, 0xff21, 0xff3a,\n 0x10400, 0x10427, 0x104b0, 0x104d3, 0x10570, 0x1057a, 0x1057c, 0x1058a, 0x1058c, 0x10592, 0x10594,\n 0x10595, 0x10c80, 0x10cb2, 0x10d50, 0x10d65, 0x118a0, 0x118bf, 0x16e40, 0x16e5f, 0x16ea0, 0x16eb8,\n 0x1d400, 0x1d419, 0x1d434, 0x1d44d, 0x1d468, 0x1d481, 0x1d49c, 0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2,\n 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4a9, 0x1d4ac, 0x1d4ae, 0x1d4b5, 0x1d4d0, 0x1d4e9, 0x1d504, 0x1d505,\n 0x1d507, 0x1d50a, 0x1d50d, 0x1d514, 0x1d516, 0x1d51c, 0x1d538, 0x1d539, 0x1d53b, 0x1d53e, 0x1d540,\n 0x1d544, 0x1d546, 0x1d546, 0x1d54a, 0x1d550, 0x1d56c, 0x1d585, 0x1d5a0, 0x1d5b9, 0x1d5d4, 0x1d5ed,\n 0x1d608, 0x1d621, 0x1d63c, 0x1d655, 0x1d670, 0x1d689, 0x1d6a8, 0x1d6c0, 0x1d6e2, 0x1d6fa, 0x1d71c,\n 0x1d734, 0x1d756, 0x1d76e, 0x1d790, 0x1d7a8, 0x1d7ca, 0x1d7ca, 0x1e900, 0x1e921,\n];\n\n/** True for a code point in Lu or Lt. Binary search over UPPER_RANGES. */\nexport function isUpper(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return cp >= 0x41 && cp <= 0x5a;\n let lo = 0;\n let hi = UPPER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = UPPER_RANGES[mid * 2] as number;\n const end = UPPER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode simple uppercase mapping, as [start, end, step, delta] quadruples flattened into\n * one array. `hyphen` 3.3 and `nbsp` 3.5 both need it, applied to the *pattern*, never to the\n * input, and never via `toUpperCase()` — that is the host-locale call ARCHITECTURE.md 4.4\n * forbids. `nbsp` and `hyphen` both read it.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/hyphen.test.ts re-checks every entry\n * against the host runtime, so a UCD drift is a red build rather than a silent output change.\n * Entries whose full uppercase mapping expands to more than one code point (U+00DF, U+FB00,\n * …) are absent, which is exactly what the simple mapping says: they map to themselves.\n */\nexport const SIMPLE_UPPERCASE: readonly number[] = [\n 0x61, 0x7a, 1, -32, 0xb5, 0xb5, 1, 743, 0xe0, 0xf6, 1, -32, 0xf8, 0xfe, 1, -32, 0xff, 0xff, 1,\n 121, 0x101, 0x12f, 2, -1, 0x131, 0x131, 1, -232, 0x133, 0x137, 2, -1, 0x13a, 0x148, 2, -1, 0x14b,\n 0x177, 2, -1, 0x17a, 0x17e, 2, -1, 0x17f, 0x17f, 1, -300, 0x180, 0x180, 1, 195, 0x183, 0x185, 2,\n -1, 0x188, 0x188, 1, -1, 0x18c, 0x18c, 1, -1, 0x192, 0x192, 1, -1, 0x195, 0x195, 1, 97, 0x199,\n 0x199, 1, -1, 0x19a, 0x19a, 1, 163, 0x19b, 0x19b, 1, 42561, 0x19e, 0x19e, 1, 130, 0x1a1, 0x1a5, 2,\n -1, 0x1a8, 0x1a8, 1, -1, 0x1ad, 0x1ad, 1, -1, 0x1b0, 0x1b0, 1, -1, 0x1b4, 0x1b6, 2, -1, 0x1b9,\n 0x1b9, 1, -1, 0x1bd, 0x1bd, 1, -1, 0x1bf, 0x1bf, 1, 56, 0x1c5, 0x1c5, 1, -1, 0x1c6, 0x1c6, 1, -2,\n 0x1c8, 0x1c8, 1, -1, 0x1c9, 0x1c9, 1, -2, 0x1cb, 0x1cb, 1, -1, 0x1cc, 0x1cc, 1, -2, 0x1ce, 0x1dc,\n 2, -1, 0x1dd, 0x1dd, 1, -79, 0x1df, 0x1ef, 2, -1, 0x1f2, 0x1f2, 1, -1, 0x1f3, 0x1f3, 1, -2, 0x1f5,\n 0x1f5, 1, -1, 0x1f9, 0x21f, 2, -1, 0x223, 0x233, 2, -1, 0x23c, 0x23c, 1, -1, 0x23f, 0x240, 1,\n 10815, 0x242, 0x242, 1, -1, 0x247, 0x24f, 2, -1, 0x250, 0x250, 1, 10783, 0x251, 0x251, 1, 10780,\n 0x252, 0x252, 1, 10782, 0x253, 0x253, 1, -210, 0x254, 0x254, 1, -206, 0x256, 0x257, 1, -205,\n 0x259, 0x259, 1, -202, 0x25b, 0x25b, 1, -203, 0x25c, 0x25c, 1, 42319, 0x260, 0x260, 1, -205,\n 0x261, 0x261, 1, 42315, 0x263, 0x263, 1, -207, 0x264, 0x264, 1, 42343, 0x265, 0x265, 1, 42280,\n 0x266, 0x266, 1, 42308, 0x268, 0x268, 1, -209, 0x269, 0x269, 1, -211, 0x26a, 0x26a, 1, 42308,\n 0x26b, 0x26b, 1, 10743, 0x26c, 0x26c, 1, 42305, 0x26f, 0x26f, 1, -211, 0x271, 0x271, 1, 10749,\n 0x272, 0x272, 1, -213, 0x275, 0x275, 1, -214, 0x27d, 0x27d, 1, 10727, 0x280, 0x280, 1, -218,\n 0x282, 0x282, 1, 42307, 0x283, 0x283, 1, -218, 0x287, 0x287, 1, 42282, 0x288, 0x288, 1, -218,\n 0x289, 0x289, 1, -69, 0x28a, 0x28b, 1, -217, 0x28c, 0x28c, 1, -71, 0x292, 0x292, 1, -219, 0x29d,\n 0x29d, 1, 42261, 0x29e, 0x29e, 1, 42258, 0x345, 0x345, 1, 84, 0x371, 0x373, 2, -1, 0x377, 0x377,\n 1, -1, 0x37b, 0x37d, 1, 130, 0x3ac, 0x3ac, 1, -38, 0x3ad, 0x3af, 1, -37, 0x3b1, 0x3c1, 1, -32,\n 0x3c2, 0x3c2, 1, -31, 0x3c3, 0x3cb, 1, -32, 0x3cc, 0x3cc, 1, -64, 0x3cd, 0x3ce, 1, -63, 0x3d0,\n 0x3d0, 1, -62, 0x3d1, 0x3d1, 1, -57, 0x3d5, 0x3d5, 1, -47, 0x3d6, 0x3d6, 1, -54, 0x3d7, 0x3d7, 1,\n -8, 0x3d9, 0x3ef, 2, -1, 0x3f0, 0x3f0, 1, -86, 0x3f1, 0x3f1, 1, -80, 0x3f2, 0x3f2, 1, 7, 0x3f3,\n 0x3f3, 1, -116, 0x3f5, 0x3f5, 1, -96, 0x3f8, 0x3f8, 1, -1, 0x3fb, 0x3fb, 1, -1, 0x430, 0x44f, 1,\n -32, 0x450, 0x45f, 1, -80, 0x461, 0x481, 2, -1, 0x48b, 0x4bf, 2, -1, 0x4c2, 0x4ce, 2, -1, 0x4cf,\n 0x4cf, 1, -15, 0x4d1, 0x52f, 2, -1, 0x561, 0x586, 1, -48, 0x10d0, 0x10fa, 1, 3008, 0x10fd, 0x10ff,\n 1, 3008, 0x13f8, 0x13fd, 1, -8, 0x1c80, 0x1c80, 1, -6254, 0x1c81, 0x1c81, 1, -6253, 0x1c82,\n 0x1c82, 1, -6244, 0x1c83, 0x1c84, 1, -6242, 0x1c85, 0x1c85, 1, -6243, 0x1c86, 0x1c86, 1, -6236,\n 0x1c87, 0x1c87, 1, -6181, 0x1c88, 0x1c88, 1, 35266, 0x1c8a, 0x1c8a, 1, -1, 0x1d79, 0x1d79, 1,\n 35332, 0x1d7d, 0x1d7d, 1, 3814, 0x1d8e, 0x1d8e, 1, 35384, 0x1e01, 0x1e95, 2, -1, 0x1e9b, 0x1e9b,\n 1, -59, 0x1ea1, 0x1eff, 2, -1, 0x1f00, 0x1f07, 1, 8, 0x1f10, 0x1f15, 1, 8, 0x1f20, 0x1f27, 1, 8,\n 0x1f30, 0x1f37, 1, 8, 0x1f40, 0x1f45, 1, 8, 0x1f51, 0x1f57, 2, 8, 0x1f60, 0x1f67, 1, 8, 0x1f70,\n 0x1f71, 1, 74, 0x1f72, 0x1f75, 1, 86, 0x1f76, 0x1f77, 1, 100, 0x1f78, 0x1f79, 1, 128, 0x1f7a,\n 0x1f7b, 1, 112, 0x1f7c, 0x1f7d, 1, 126, 0x1fb0, 0x1fb1, 1, 8, 0x1fbe, 0x1fbe, 1, -7205, 0x1fd0,\n 0x1fd1, 1, 8, 0x1fe0, 0x1fe1, 1, 8, 0x1fe5, 0x1fe5, 1, 7, 0x214e, 0x214e, 1, -28, 0x2170, 0x217f,\n 1, -16, 0x2184, 0x2184, 1, -1, 0x24d0, 0x24e9, 1, -26, 0x2c30, 0x2c5f, 1, -48, 0x2c61, 0x2c61, 1,\n -1, 0x2c65, 0x2c65, 1, -10795, 0x2c66, 0x2c66, 1, -10792, 0x2c68, 0x2c6c, 2, -1, 0x2c73, 0x2c73,\n 1, -1, 0x2c76, 0x2c76, 1, -1, 0x2c81, 0x2ce3, 2, -1, 0x2cec, 0x2cee, 2, -1, 0x2cf3, 0x2cf3, 1, -1,\n 0x2d00, 0x2d25, 1, -7264, 0x2d27, 0x2d27, 1, -7264, 0x2d2d, 0x2d2d, 1, -7264, 0xa641, 0xa66d, 2,\n -1, 0xa681, 0xa69b, 2, -1, 0xa723, 0xa72f, 2, -1, 0xa733, 0xa76f, 2, -1, 0xa77a, 0xa77c, 2, -1,\n 0xa77f, 0xa787, 2, -1, 0xa78c, 0xa78c, 1, -1, 0xa791, 0xa793, 2, -1, 0xa794, 0xa794, 1, 48,\n 0xa797, 0xa7a9, 2, -1, 0xa7b5, 0xa7c3, 2, -1, 0xa7c8, 0xa7ca, 2, -1, 0xa7cd, 0xa7db, 2, -1,\n 0xa7f6, 0xa7f6, 1, -1, 0xab53, 0xab53, 1, -928, 0xab70, 0xabbf, 1, -38864, 0xff41, 0xff5a, 1, -32,\n 0x10428, 0x1044f, 1, -40, 0x104d8, 0x104fb, 1, -40, 0x10597, 0x105bb, 2, -39, 0x10598, 0x105a0, 2,\n -39, 0x105a4, 0x105b0, 2, -39, 0x105b4, 0x105b8, 2, -39, 0x105bc, 0x105bc, 1, -39, 0x10cc0,\n 0x10cf2, 1, -64, 0x10d70, 0x10d85, 1, -32, 0x118c0, 0x118df, 1, -32, 0x16e60, 0x16e7f, 1, -32,\n 0x16ebb, 0x16ed3, 1, -27, 0x1e922, 0x1e943, 1, -34,\n];\n\n/** Simple uppercase mapping of one code point, or the code point itself when it has none. */\nexport function simpleUppercase(cp: number): number {\n for (let i = 0; i < SIMPLE_UPPERCASE.length; i += 4) {\n const start = SIMPLE_UPPERCASE[i] as number;\n if (cp < start) return cp;\n const end = SIMPLE_UPPERCASE[i + 1] as number;\n const step = SIMPLE_UPPERCASE[i + 2] as number;\n if (cp <= end && (cp - start) % step === 0) return cp + (SIMPLE_UPPERCASE[i + 3] as number);\n }\n return cp;\n}\n","/**\n * The three non-code-point values a rule can meet in the array it scans. **They live in the\n * engine, together, and must stay pairwise disjoint.**\n *\n * Disjointness is not tidiness. Each value answers a different question, and a rule that\n * cannot tell them apart answers the wrong one:\n *\n * - `NONE` — there is nothing at that index; the array ends here.\n * - `MARKER` — a span boundary whose skipped region has no line terminator. Per modes.md 3.3\n * it is opaque content everywhere except `OPENISH`/`CLOSEISH`, where it is a member of both.\n * It is explicitly **not** `NONE` and **not** `SPACELIKE`.\n * - `LINE_MARKER` — a span boundary whose skipped region contains a line terminator. A member\n * of `BREAK` for every rule, everywhere, so a mode's output on hard-wrapped prose is\n * identical to `text` mode's on the same characters (modes.md 3.2, 7.4).\n *\n * Two of these were previously equal by accident, in two different pairings, and both cost a\n * defect: rules whose `NONE` was `-1` could not distinguish \"end of array\" from an inline\n * boundary, and `quotes`/`apostrophe` moved their `NONE` to `-2` and collided with the line\n * marker instead. The collisions were invisible only because the two verdicts happened to\n * coincide in the branches those rules had — a coincidence, not a property.\n *\n * **A new sentinel goes here and nowhere else**, takes the next free negative integer, and is\n * classified in modes.md before any rule reads it.\n *\n * These are L1 values: the rules (L1) read them, the mode adapters (L2) write them. Defining\n * them here keeps the dependency pointing downward (ARCHITECTURE.md 2).\n */\nexport const MARKER = -1;\nexport const LINE_MARKER = -2;\nexport const NONE = -3;\n\n/** True for either span boundary. `NONE` is deliberately not a marker: it is not in the array. */\nexport function isMarker(value: number): boolean {\n return value === MARKER || value === LINE_MARKER;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\n\n// spec/rules/apostrophe.md 3.1. The apostrophe is U+2019 in every v1 locale and the case ladder\n// below is structural, not lexical. As of spec 1.1.0 this rule reads no locale data at all and\n// skips no position: 0.5.0's preserve set (apostrophe.md 3.4) existed to stop the ladder from\n// converting the marks `quotes` (order 40) had vetoed, and conversion is now the specified\n// outcome for every position `quotes` vetoes — the ladder's own cases 4 and 3 are exactly what\n// turns `rock 'n' roll` into `rock ’n’ roll`, in every locale.\nconst SQ = 0x27;\nconst RIGHT_SINGLE = 0x2019;\n\n/**\n * Not −1: that is the span boundary marker (spec/rules/modes.md 3.2), and §3.3 forbids a\n * marker inside the array from being indistinguishable from the absence of a neighbour.\n *\n * The verdicts happen to be identical under either reading — verified exhaustively over the\n * whole two-neighbour decision space — because the only two branches the marker can reach\n * (case 3's right-test, case 4's left-test) are disjunctions that already accept `NONE`, and\n * §3.3 puts the marker in exactly the class each of those disjunctions also accepts. That\n * alignment is a coincidence of the class assignment, not a structural guarantee: a future\n * branch accepting `NONE` but not `CLOSEISH`/`OPENISH` would silently diverge. Conforming\n * here makes the agreement a property rather than luck.\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst SPACELIKE: ReadonlySet<number> = new Set([\n 0x20,\n 0x09,\n 0xa0,\n 0x202f,\n 0x2007,\n 0x2009,\n 0x200a,\n // BREAK, including the line-boundary marker: modes.md 3.2 makes it a member for every rule.\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\n// Unlike `quotes`, U+0027 is a member of neither class here and U+2019 is in `CLOSEISH` only;\n// spec 5 turns exactly that asymmetry into the idempotency argument. U+2011 sits beside\n// U+002D because `hyphen` (order 35) converts one to the other. `MARKER` is in both classes\n// per modes.md 3.3, whose table names this rule.\nconst OPENISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x28,\n 0x5b,\n 0x7b,\n 0xab,\n 0x2018,\n 0x201a,\n 0x201b,\n 0x201c,\n 0x201e,\n 0x201f,\n 0x2039,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0xbb,\n 0x2019,\n 0x201d,\n 0x203a,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\n// spec 1.2.0: the quotation glyphs of `OPENISH`, without its brackets and dashes, for case 3a.\n// Brackets stay out so a prime on a function name, `f'(x)`, is left alone. No `MARKER`: case 3\n// already accepts it through `CLOSEISH`.\nconst OPENQUOTE: ReadonlySet<number> = new Set([\n 0xab, 0x2018, 0x201a, 0x201b, 0x201c, 0x201e, 0x201f, 0x2039,\n]);\n\n// spec 1.5.0: the bracket and quotation members of `CLOSEISH`, without its sentence punctuation\n// and without the dashes `OPENISH` already carries, for case 2a. These are exactly the closing\n// delimiters case 3 has always accepted on the mark's RIGHT; before 1.5.0 the left side accepted\n// none of them. No `MARKER` (modes.md 3.3): it is in `OPENISH`, so a mark against a span boundary\n// already reaches case 4 and emits the same U+2019.\nconst CLOSEDELIM: ReadonlySet<number> = new Set([\n 0x29, 0x5d, 0x7d, 0xbb, 0x2019, 0x201d, 0x203a,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/**\n * The case ladder of spec 3.3, first match wins. Every verdict is a pure function of exactly\n * two neighbouring code points; there is no lookahead and no state between candidates.\n */\nfunction isApostrophe(left: number, right: number): boolean {\n // 1 — prime guard, first so it wins over case 3: `6' 2\"`, `55° 40' N`, `6'2\"`.\n if (isDigit(left) && !isLetter(right)) return false;\n // 2 — medial: `don't`, `l'été`, `O'Brien`, `1990's`.\n if (isAlnum(left) && isAlnum(right)) return true;\n // 2a — suffix or possessive after a closing delimiter (spec 1.5.0): `(order 35)'s`,\n // `` `nbsp` (R₈)'s ``, `”word”'s`, `{price}'den`. Disjoint from every other case, so its\n // position in the ladder carries no behaviour.\n if (CLOSEDELIM.has(left) && isAlnum(right)) return true;\n // 3 — trailing elision or possessive: `the dogs' bowls`, `Jesus'`.\n if (isLetter(left) && (right === NONE || SPACELIKE.has(right) || CLOSEISH.has(right)))\n return true;\n // 3a — elision before a quotation (spec 1.2.0): `d'« urine »`, `l'“idea”`, and `„Hans'“`,\n // whose de-DE closing glyph U+201C is not in `CLOSEISH`.\n if (isLetter(left) && OPENQUOTE.has(right)) return true;\n // 4 — leading elision: `’90s`, `’tis`, `’em`. The replacement is U+2019, never U+2018 —\n // a leading elision is a raised comma, not an opening quotation mark, and `quotes` has\n // already had its chance to claim the mark as a quotation and declined (spec 3.2, 5).\n if ((left === NONE || SPACELIKE.has(left) || OPENISH.has(left)) && isAlnum(right)) return true;\n // 5 — nothing inferable: `a ' b`, `''`.\n return false;\n}\n\nexport const apostropheRule: Rule = {\n id: \"apostrophe\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n\n for (let i = 0; i < n; i += 1) {\n if (at(cp, i) !== SQ) continue;\n const left = i > 0 ? at(cp, i - 1) : NONE;\n const right = i + 1 < n ? at(cp, i + 1) : NONE;\n if (isApostrophe(left, right)) {\n edits.push({ start: i, end: i + 1, replacement: [RIGHT_SINGLE], ruleId: \"apostrophe\" });\n }\n }\n\n return edits;\n },\n};\n","import { LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { LocaleData } from \"../types.js\";\n\n/**\n * Structural primitives shared by `dashes` (spec/rules/dashes.md) and `ranges`\n * (spec/rules/ranges.md), spec 0.5.0. Both rules scan the same DASH-token shape and share the\n * same symmetry/isolation/cluster/joiner guards (dashes.md 3.2, 3.2a, 3.2b) — this module is the\n * single source of truth for that shared machinery, so the two rules cannot drift apart the way\n * two independent re-derivations could. Each rule adds only its own branch-specific guards\n * (P1/P4 for `dashes`; G1-G5 for `ranges`) and its own locale style (`dash.parenthetical` vs\n * `dash.range`) on top of what `findDashTokens` returns.\n *\n * Not a `Rule` itself and not registered in `registry.ts` — an internal engine module, exactly\n * like `spans.ts` is to the mode adapters.\n */\n\nexport const HYPHEN_MINUS = 0x2d;\nexport const HYPHEN = 0x2010;\nconst FIGURE_DASH = 0x2012;\nexport const EN_DASH = 0x2013;\nexport const EM_DASH = 0x2014;\nconst HORIZONTAL_BAR = 0x2015;\nexport const MINUS_SIGN = 0x2212;\nconst SMALL_EM_DASH = 0xfe58;\nconst SMALL_HYPHEN_MINUS = 0xfe63;\nconst FULLWIDTH_HYPHEN_MINUS = 0xff0d;\nexport const SPACE = 0x20;\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n/** dashes.md 3.1 JOINER — U+2060, emitted only around a tight range dash (ranges.md 3.3.1). */\nexport const WORD_JOINER = 0x2060;\n\n/** dashes.md 3.1 DASH. See dashes.ts's historical note; unchanged by the ranges split. */\nexport function isDash(cp: number): boolean {\n return (\n cp === HYPHEN_MINUS || cp === HYPHEN || cp === EN_DASH || cp === EM_DASH || cp === MINUS_SIGN\n );\n}\n\n/** dashes.md 3.1 INERT-DASH: never a candidate, never produced, by either rule. */\nexport function isInertDash(cp: number): boolean {\n return (\n cp === 0x00ad ||\n cp === FIGURE_DASH ||\n cp === 0x2011 ||\n cp === HORIZONTAL_BAR ||\n cp === SMALL_EM_DASH ||\n cp === SMALL_HYPHEN_MINUS ||\n cp === FULLWIDTH_HYPHEN_MINUS\n );\n}\n\n/** dashes.md 3.1 DIGIT: ASCII only, deliberately — see dashes.md 7.1. */\nexport function isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nexport function isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nexport function isNoBreakSpace(cp: number): boolean {\n return cp === 0x00a0 || cp === 0x202f;\n}\n\nexport type DashStyle = LocaleData[\"dash\"][\"parenthetical\"];\n\nexport function dashCodePoint(style: DashStyle): number {\n return style === \"em-tight\" || style === \"em-spaced\" ? EM_DASH : EN_DASH;\n}\n\nexport function isSpaced(style: DashStyle): boolean {\n return style === \"em-spaced\" || style === \"en-spaced\";\n}\n\nexport function sameContent(\n cp: readonly number[],\n start: number,\n end: number,\n next: readonly number[],\n): boolean {\n if (end - start !== next.length) return false;\n for (let i = 0; i < next.length; i += 1) {\n if (cp[start + i] !== next[i]) return false;\n }\n return true;\n}\n\n/**\n * dashes.md 3.6: every replacement is built from U+0020 alone. `bind` is meaningful only for\n * `ranges` (dashes.md 3.6 / ranges.md 3.3.1) — `dashes`' parenthetical branch always calls this\n * with `bind = false`, since a parenthetical dash never binds (an interrupting dash is exactly\n * where a line may break).\n */\nexport function buildReplacement(style: DashStyle, bind: boolean): number[] {\n if (!isSpaced(style)) {\n return bind ? [WORD_JOINER, dashCodePoint(style), WORD_JOINER] : [dashCodePoint(style)];\n }\n return [SPACE, dashCodePoint(style), SPACE];\n}\n\n/** dashes.md 3.2 step 9 (T2) — the positions `spaces` (order 10) deletes a U+0020 from. */\nexport function isStripBeforeOrCloseBracket(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === 0x3b ||\n cp === 0x3a ||\n cp === 0x21 ||\n cp === 0x3f ||\n cp === 0x2026 ||\n cp === 0x29 ||\n cp === 0x5d ||\n cp === 0x7d\n );\n}\n\nexport function isOpenBracket(cp: number): boolean {\n return cp === 0x28 || cp === 0x5b || cp === 0x7b;\n}\n\n/**\n * dashes.md 3.2 step 7: the cluster alphabet is DASH ∪ INERT-DASH ∪ DIGIT ∪ JOINER ∪\n * CLOSED-SYMBOL. Shared between `dashes` and `ranges` because a cluster like `2026-08-15` or\n * `known-5-10` can contain runs that belong to either rule, and the whole cluster must be inert\n * to both if it holds two or more dash runs (dashes.md 3.2 step 7).\n *\n * CLOSED-SYMBOL joined the alphabet in spec 1.3.0, when ranges.md 3.2a made a symbol adjacent to\n * a digit run part of a range token's own territory. Without it `a—$15-$20` is two clusters where\n * `a—15-20` is one, so `dashes` converts the em dash, that edit moves the range's `before` from a\n * dash to a space, and the range converts on the NEXT pass — a transform idempotency defect in\n * every locale whose parenthetical form is spaced.\n */\nfunction isClusterMember(cp: number): boolean {\n return isDash(cp) || isInertDash(cp) || isDigit(cp) || cp === WORD_JOINER;\n}\n\nexport function isDashUnion(cp: number): boolean {\n return isDash(cp) || isInertDash(cp);\n}\n\n/** dashes.md 3.2 step 7 — cluster guard. */\nfunction isClusterInert(cp: readonly number[], s: number, e: number): boolean {\n const n = cp.length;\n let start = s;\n while (start > 0 && isClusterMember(cp[start - 1] as number)) start -= 1;\n let end = e;\n while (end < n && isClusterMember(cp[end] as number)) end += 1;\n\n let runs = 0;\n let i = start;\n while (i < end) {\n if (!isDashUnion(cp[i] as number)) {\n i += 1;\n continue;\n }\n runs += 1;\n if (runs >= 2) return true;\n while (i < end && isDashUnion(cp[i] as number)) i += 1;\n }\n return false;\n}\n\n/**\n * dashes.md 3.2b — effective neighbour. Step outward across a maximal run of JOINER and return\n * the index of the first code point that is not one, or -1 if the walk leaves the array. Every\n * guard in either rule that inspects a code point outside its own token's dash run must read one\n * of these — see dashes.md 3.2b for why this is forced rather than chosen (CO-S,\n * pipeline-idempotency.md 5.1a).\n */\nexport function effectiveIndex(cp: readonly number[], from: number, step: number): number {\n let i = from;\n while (i >= 0 && i < cp.length && cp[i] === WORD_JOINER) i += step;\n return i >= 0 && i < cp.length ? i : -1;\n}\n\nexport function effectiveNeighbour(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n return i < 0 ? NONE : (cp[i] as number);\n}\n\n/**\n * ranges.md 3.2a CLOSED-SYMBOL (spec 1.3.0) — the symbols conventionally written closed up to a\n * number, as a literal code-point set. Not a Unicode category test: a category makes the verdict\n * depend on which Unicode version a runtime was built against, and the five runtimes must agree\n * (the same argument ranges.md 7.1 makes for DIGIT being ASCII-only). The Currency Symbols block\n * is enumerated by its bounds, which never move.\n */\nexport function isClosedUpSymbol(cp: number): boolean {\n return (\n cp === 0x0024 || // DOLLAR SIGN\n (cp >= 0x00a2 && cp <= 0x00a5) || // CENT, POUND, CURRENCY, YEN\n (cp >= 0x20a0 && cp <= 0x20bf) || // Currency Symbols block\n cp === 0x0025 || // PERCENT SIGN\n cp === 0x2030 || // PER MILLE SIGN\n cp === 0x2031 || // PER TEN THOUSAND SIGN\n cp === 0x00b0 // DEGREE SIGN\n );\n}\n\n/** ranges.md 3.2a — a token's flanks after the closed-up-symbol walk, with the digit runs the\n * guards and the replacement then read. */\nexport interface RangeFlanks {\n /** Index of the DIGIT on each flank: `L\\u2032`/`R\\u2032` in ranges.md 3.2a. */\n readonly left: number;\n readonly right: number;\n /** First index of Lrun and last index of Rrun. */\n readonly a: number;\n readonly b: number;\n /** Index of the matched outer symbol on each side, or -1. `before`/`after` read past these\n * (ranges.md 3.2a), so that G1-G3 judge the text in front of the whole member. */\n readonly outerLeft: number;\n readonly outerRight: number;\n}\n\n/**\n * ranges.md 3.2 and 3.2a — is this token a range candidate, and where are its digit runs?\n * Returns undefined when it is not one, which is the signal that the token belongs to `dashes`.\n *\n * A side consumes a closed-up symbol only when the opposite member repeats the same code point\n * (`$15-$20`, `35%-50%`). An unmatched symbol leaves the flank a non-DIGIT, so `$15-\\u20ac20` and\n * `15-$20` are not candidates and do not change hands.\n */\nexport function rangeFlanks(\n cp: readonly number[],\n left: number,\n right: number,\n): RangeFlanks | undefined {\n const n = cp.length;\n const innerRight =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? (cp[right] as number)\n : undefined;\n const innerLeft =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? (cp[left] as number)\n : undefined;\n\n const l = innerLeft === undefined ? left : left - 1;\n const r = innerRight === undefined ? right : right + 1;\n if (!isDigit(cp[l] as number) || !isDigit(cp[r] as number)) return undefined;\n\n let a = l;\n while (a > 0 && isDigit(cp[a - 1] as number)) a -= 1;\n let b = r;\n while (b + 1 < n && isDigit(cp[b + 1] as number)) b += 1;\n\n let outerLeft = -1;\n if (innerRight !== undefined) {\n outerLeft = effectiveIndex(cp, a - 1, -1);\n if (outerLeft < 0 || cp[outerLeft] !== innerRight) return undefined;\n }\n let outerRight = -1;\n if (innerLeft !== undefined) {\n outerRight = effectiveIndex(cp, b + 1, 1);\n if (outerRight < 0 || cp[outerRight] !== innerLeft) return undefined;\n }\n\n return { left: l, right: r, a, b, outerLeft, outerRight };\n}\n\n/**\n * dashes.md 3.2 step 8 (T1) — spacing-transition guard. Shared because a `dashes` token\n * becoming spaced can insert a space next to a `ranges` token's digit run (or vice versa is\n * structurally impossible, since `ranges` styles are never `-spaced` in any v1 locale, but the\n * guard is implemented for both regardless of what the current locale data happens to contain —\n * dashes.md 7.11 item 7 notes `dash.range` carries the same five-value enum as\n * `dash.parenthetical`).\n */\n/**\n * T1's reach is transparent to one CLOSED-SYMBOL on either end of a digit run (spec 1.3.0). The\n * digit run this guard protects may be a range member carrying an outer symbol — `$1 - $1--a`,\n * `a--15% - 20%` — and reading the symbol as the neighbour would stop the walk one code point\n * short of the dash it exists to find.\n */\nfunction skipClosedUpSymbol(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n if (i < 0 || !isClosedUpSymbol(cp[i] as number)) return from;\n return i + step;\n}\n\nexport function isSpacingTransitionBlocked(\n cp: readonly number[],\n left: number,\n right: number,\n): boolean {\n const n = cp.length;\n\n // Spec 1.3.0: the reach steps over a CLOSED-SYMBOL that sits between the token and a digit\n // run, because ranges.md 3.2a made that shape a range token — the digit run whose verdict this\n // guard protects is one code point further out than it used to be.\n const l =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? left - 1\n : left;\n const r =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? right + 1\n : right;\n\n if (isDigit(cp[l] as number)) {\n let d = l;\n while (d > 0 && isDigit(cp[d - 1] as number)) d -= 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d - 1, -1), -1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 - 1, -1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n if (isDigit(cp[r] as number)) {\n let d = r;\n while (d + 1 < n && isDigit(cp[d + 1] as number)) d += 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d + 1, 1), 1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 + 1, 1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n return false;\n}\n\nexport interface DashToken {\n /** Start/end (exclusive) of the DASH run itself, in input-array indices. */\n readonly s: number;\n readonly e: number;\n readonly lsp: 0 | 1;\n readonly rsp: 0 | 1;\n /** Index of the code point immediately left/right of the token's content, after walking\n * across any adjacent JOINER run (dashes.md 3.2a). */\n readonly left: number;\n readonly right: number;\n readonly leftCp: number;\n readonly rightCp: number;\n /** Start/end of the full edit span, including outer spacing and any joiner this token is\n * re-entering across (dashes.md 3.2a) — meaningful only when `crossedJoiner` is true, which\n * for a non-digit-flanked token always means \"decline\" (see `findDashTokens`'s own doc). */\n readonly spanStart: number;\n readonly spanEnd: number;\n readonly crossedJoiner: boolean;\n}\n\n/**\n * dashes.md 3.2 steps 1-7 and 3.2a, exactly as they read before the `ranges` split — the common\n * prefix every DASH-run token must pass before either rule's own branch-specific guards run.\n * Returns every token that survives symmetry, content, joiner-crossing, isolation and cluster\n * guards; each rule then filters to the tokens it owns:\n *\n * - `ranges` only ever processes a token whose `leftCp`/`rightCp` are both DIGIT.\n * - `dashes` must decline every such token unconditionally (operator decision, spec 0.5.0) —\n * never reinterpreting a digit-flanked stroke as a parenthetical dash, regardless of whether\n * `ranges` is enabled.\n *\n * A token with `crossedJoiner = true` and non-digit flanks is **not** returned at all (declined\n * inline, exactly as dashes.md 3.2a specifies: \"if a joiner was crossed in any other\n * configuration, emit nothing\") — a joiner is `ranges`' own emission alphabet, and an author who\n * types one next to a dash meant it, exactly as with INERT-DASH.\n */\nexport function findDashTokens(cp: readonly number[]): DashToken[] {\n const n = cp.length;\n const tokens: DashToken[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDash(cp[i] as number)) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && isDash(cp[e] as number)) e += 1;\n i = e;\n\n // dashes.md 3.2 step 2 — a run longer than three is decoration, not a dash.\n if (e - s > 3) continue;\n\n const lsp = s > 0 && cp[s - 1] === SPACE ? 1 : 0;\n const rsp = e < n && cp[e] === SPACE ? 1 : 0;\n\n // dashes.md 3.2 step 4 — symmetry guard.\n if (lsp !== rsp) continue;\n\n // dashes.md 3.2 step 5 — content on both sides, on the same line.\n let left = s - 1 - lsp;\n let right = e + rsp;\n if (left < 0 || right >= n) continue;\n\n // dashes.md 3.2a — joiner neighbours.\n let joinStart = left + 1;\n let joinEnd = right;\n while (left >= 0 && cp[left] === WORD_JOINER) left -= 1;\n while (right < n && cp[right] === WORD_JOINER) right += 1;\n if (left < 0 || right >= n) continue;\n const crossedJoiner = left + 1 !== joinStart || right !== joinEnd;\n joinStart = left + 1;\n joinEnd = right;\n\n const leftCp = cp[left] as number;\n const rightCp = cp[right] as number;\n // dashes.md 3.2a — re-entry across a joiner is only ever a bound range `ranges` produced on\n // an earlier pass. As of spec 1.3.0 that shape includes a matched closed-up symbol on a\n // flank (ranges.md 3.2a), so `$15<J>-<J>$20` re-enters the same way `1914<J>-<J>1918` does;\n // without this a second pass would add a second joiner.\n if (crossedJoiner && rangeFlanks(cp, left, right) === undefined) continue;\n if (isBreak(leftCp) || isBreak(rightCp)) continue;\n\n // dashes.md 3.2 step 6 — isolation guard.\n if (isInertDash(leftCp) || isInertDash(rightCp)) continue;\n if (isDash(leftCp) || isDash(rightCp)) continue;\n if (leftCp === SPACE || isNoBreakSpace(leftCp)) continue;\n if (rightCp === SPACE || isNoBreakSpace(rightCp)) continue;\n\n // dashes.md 3.2 step 7 — cluster guard.\n if (isClusterInert(cp, s, e)) continue;\n\n const spanStart = Math.min(s - lsp, joinStart);\n const spanEnd = Math.max(e + rsp, joinEnd);\n\n tokens.push({\n s,\n e,\n lsp: lsp as 0 | 1,\n rsp: rsp as 0 | 1,\n left,\n right,\n leftCp,\n rightCp,\n spanStart,\n spanEnd,\n crossedJoiner,\n });\n }\n\n return tokens;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n HYPHEN_MINUS,\n HYPHEN,\n MINUS_SIGN,\n EN_DASH,\n buildReplacement,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n findDashTokens,\n rangeFlanks,\n sameContent,\n type DashStyle,\n} from \"./dash-shared.js\";\n\n/**\n * `dashes` — spec/rules/dashes.md (spec 0.5.0), order 30. Parenthetical-dash processing only,\n * as of spec 0.5.0: numeric/date-range recognition moved to the `ranges` rule (order 25,\n * off by default), which owns `dash.range` and shares this rule's token-scanning and guard\n * machinery via `dash-shared.js`. See dashes.md 1 and 7.11, and ranges.md 1, for why the split\n * happened and why range detection is opt-in rather than fixed structurally.\n *\n * A range candidate is declined here **unconditionally** — never reinterpreted as a\n * parenthetical dash — regardless of whether `ranges` is enabled (operator decision, spec\n * 0.5.0). That was already true of every prior spec version: the range/parenthetical branches\n * have always been mutually exclusive per token, on the same test that now decides which rule a\n * token belongs to rather than which branch of one rule it takes. Spec 1.3.0 widened that test\n * from \"both flanks DIGIT\" to `rangeFlanks` (ranges.md 3.2a), so a token whose members repeat a\n * closed-up symbol — `$15 - $20` — moved from this rule to `ranges`, and therefore from\n * converting by default to converting only when the caller enables `ranges`.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\n/** dashes.md 3.1 ROMAN: the seven uppercase Roman-numeral letters only. Lower-case is not a member. */\nfunction isRoman(cp: number): boolean {\n return (\n cp === 0x49 || // I\n cp === 0x56 || // V\n cp === 0x58 || // X\n cp === 0x4c || // L\n cp === 0x43 || // C\n cp === 0x44 || // D\n cp === 0x4d // M\n );\n}\n\n/**\n * dashes.md 3.4 P4 — Roman-numeral veto. A tight dash between two word-bounded ROMAN runs is a\n * range already in its correct Russian form (`в XV—XVII веках`); `ranges` cannot see it, because\n * ranges.md 3.3 needs a DIGIT on each side, so without this the parenthetical branch would space\n * out input that was already right.\n *\n * A veto only: it never converts. Admitting ROMAN runs as range candidates would also fix\n * `XV-XVII`, but it fires on all-caps words built from the same letters (`MIX`, `CIVIL`), and\n * converting is the direction that damages. The miss is recorded in dashes.md 7.10.\n */\nfunction isRomanFlanked(cp: readonly number[], left: number, right: number): boolean {\n const n = cp.length;\n\n if (!isRoman(cp[left] as number) || !isRoman(cp[right] as number)) return false;\n\n let a = left;\n while (a > 0 && isRoman(cp[a - 1] as number)) a -= 1;\n if (a > 0 && isLetter(cp[a - 1] as number)) return false;\n\n let b = right;\n while (b + 1 < n && isRoman(cp[b + 1] as number)) b += 1;\n if (b + 1 < n && isLetter(cp[b + 1] as number)) return false;\n\n return true;\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.parenthetical;\n\n for (const token of findDashTokens(cp)) {\n const { s, e, leftCp, rightCp, left, right, lsp, rsp } = token;\n\n // A range candidate is `ranges`' territory, never `dashes`' — declined unconditionally,\n // whether or not `ranges` is enabled (operator decision, spec 0.5.0). Since spec 1.3.0 a\n // candidate may carry a matched closed-up symbol on a flank (ranges.md 3.2a), which is why\n // this is `rangeFlanks` rather than a digit test on both flanks.\n if (rangeFlanks(cp, left, right) !== undefined) continue;\n\n // dashes.md 3.4 P5 — authored en-dash mark-identity veto (spec 0.6.0). A run consisting of\n // exactly one U+2013 is declined unconditionally: every locale, tight or spaced, regardless\n // of `dash.parenthetical`'s target glyph. Unlike P1/P4 this is not conditioned on the\n // replacement that would be chosen — an en-spaced locale's own tight-authored en-dash is\n // just as protected as an em-target locale's, because the failure this guards against\n // (an authored en-dash silently re-spaced into ordinary parenthetical punctuation) can\n // corrupt a range or joint-name reading in an en-spaced locale exactly as it can in an\n // em-target one; only the glyph substitution differs, not the risk. See §8.8 for the\n // fresh-evidence argument this guard rests on and why it does not reopen the pre-0.2.0\n // guards §8.1 retired.\n if (e - s === 1 && cp[s] === EN_DASH) continue;\n\n // dashes.md 3.4 P1 — a bare hyphen-shaped stroke must be spaced (the compound-word guard).\n if (\n e - s === 1 &&\n (cp[s] === HYPHEN_MINUS || cp[s] === HYPHEN || cp[s] === MINUS_SIGN) &&\n lsp === 0\n ) {\n continue;\n }\n // dashes.md 3.4 P4 — Roman-numeral veto.\n if (lsp === 0 && rsp === 0 && isRomanFlanked(cp, left, right)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, left, right)) continue;\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(rightCp)) continue;\n if (isOpenBracket(leftCp)) continue;\n }\n\n // `dashes` never binds: an interrupting dash is exactly where a line may break\n // (dashes.md 3.3.1's binding is `ranges`-only).\n const replacement = buildReplacement(style, false);\n const spanStart = s - lsp;\n const spanEnd = e + rsp;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"dashes\" });\n }\n\n return edits;\n}\n\nexport const dashesRule: Rule = {\n id: \"dashes\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/ellipsis.md 3.1.\nconst DOT = 0x2e;\nconst ELL = 0x2026;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === DOT || cp === ELL;\n}\n\nfunction isTerminal(cp: number): boolean {\n return cp === EXCLAMATION || cp === QUESTION;\n}\n\nfunction isSameRun(\n cp: readonly number[],\n s: number,\n e: number,\n target: readonly number[],\n): boolean {\n if (e - s !== target.length) return false;\n for (let j = 0; j < target.length; j += 1) {\n if (at(cp, s + j) !== target[j]) return false;\n }\n return true;\n}\n\nexport const ellipsisRule: Rule = {\n id: \"ellipsis\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const abbreviated = ctx.locale.ellipsis.abbreviatedAfterTerminal;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDotlike(at(cp, i))) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n let q = 0;\n while (e < n && isDotlike(at(cp, e))) {\n if (at(cp, e) === ELL) q += 1;\n e += 1;\n }\n const k = e - s;\n const left = at(cp, s - 1);\n\n // One decision per run, one edit per run (spec/rules/ellipsis.md 3.3 step 6).\n const target = runTarget(k, q, left, abbreviated);\n if (target !== null && !isSameRun(cp, s, e, target)) {\n edits.push({ start: s, end: e, replacement: target, ruleId: \"ellipsis\" });\n }\n i = e;\n }\n\n return edits;\n },\n};\n\n/** `null` means \"emit nothing\"; otherwise the final form of the whole run. */\nfunction runTarget(\n k: number,\n q: number,\n left: number,\n abbreviated: boolean,\n): readonly number[] | null {\n if (k === 2 && q === 0) {\n // The two-dot run is unconditionally inert where `?..` is the correct output form; that\n // is what stops `?..` ⇄ `?…` from oscillating (spec/rules/ellipsis.md 5).\n if (abbreviated) return null;\n if (isTerminal(left)) return [ELL];\n return null;\n }\n if (k === 1 && q === 0) return null;\n // k = 1 with an existing U+2026, or any run of 2+ containing one: normalise, then decide\n // the abbreviated form on the same span.\n if (abbreviated && isTerminal(left)) return [DOT, DOT];\n return [ELL];\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n/**\n * `hyphen` — spec/rules/hyphen.md (spec 0.1.0), order 35.\n *\n * Replaces U+002D with U+2011 inside listed morphological forms. Explicit index-based\n * scanning over the code-point array only: no regex, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst HYPHEN_MINUS = 0x2d;\nconst NON_BREAKING_HYPHEN = 0x2011;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** 3.1 `HYPHENISH`. U+2010, U+00AD, U+2012, U+2013, U+2014 are deliberately absent. */\nfunction isHyphenish(cp: number): boolean {\n return cp === HYPHEN_MINUS || cp === NON_BREAKING_HYPHEN;\n}\n\n/**\n * 3.1 `WORDISH` = ALNUM ∪ HYPHENISH. U+2011 is a member on purpose: without it a converted\n * hyphen would flip a neighbouring form's boundary verdict between runs (5).\n */\nfunction isWordish(cp: number): boolean {\n return isDigit(cp) || isLetter(cp) || isHyphenish(cp);\n}\n\n/** 3.4: the three lists, in the order that breaks a length tie. */\ntype ListKind = 0 | 1 | 2;\nconst COMPOUND: ListKind = 0;\nconst PREFIX: ListKind = 1;\nconst SUFFIX: ListKind = 2;\n\ninterface Pattern {\n readonly cps: readonly number[];\n readonly kind: ListKind;\n}\n\nfunction preparePatterns(\n entries: readonly string[],\n field: string,\n kind: ListKind,\n out: Pattern[],\n): void {\n for (const entry of entries) {\n const cps = toCodePoints(entry);\n let hasHyphen = false;\n for (const cp of cps) {\n if (cp === HYPHEN_MINUS) hasHyphen = true;\n }\n if (!hasHyphen) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `hyphen.${field} entry \"${entry}\" contains no U+002D; there is nothing for the rule to convert (spec/rules/hyphen.md §2).`,\n );\n }\n out.push({ cps, kind });\n }\n}\n\n/**\n * 3.3 — hyphen-lenient, first-character-lenient literal matching. The hyphen leniency covers\n * `j = 0` too, because a suffix entry begins with its own hyphen and must keep matching after\n * it has been converted.\n */\nfunction matchesAt(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (p === HYPHEN_MINUS) {\n if (!isHyphenish(c)) return false;\n continue;\n }\n if (c === p) continue;\n if (j === 0 && isLetter(p) && c === simpleUppercase(p)) continue;\n return false;\n }\n return true;\n}\n\nfunction bind(index: number): Edit {\n return { start: index, end: index + 1, replacement: [NON_BREAKING_HYPHEN], ruleId: \"hyphen\" };\n}\n\n/** 3.4 C — a compound is a whole word. */\nfunction guardCompound(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\n/** 3.4 P — a prefix starts a word and must actually prefix something. */\nfunction guardPrefix(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n return isLetter(at(cp, a + k));\n}\n\n/** 3.4 S — a suffix must actually suffix something and must end the word. */\nfunction guardSuffix(cp: readonly number[], a: number, k: number): boolean {\n if (!isLetter(at(cp, a - 1))) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const { hyphen } = ctx.locale;\n // 2: with all three lists empty the rule emits nothing for any input.\n if (\n hyphen.prefixes.length === 0 &&\n hyphen.suffixes.length === 0 &&\n hyphen.compounds.length === 0\n ) {\n return [];\n }\n\n // 3.4: one candidate per index — the longest entry that matches, ties broken compounds,\n // prefixes, suffixes. Sorting once makes the selection a first-hit linear search.\n const patterns: Pattern[] = [];\n preparePatterns(hyphen.compounds, \"compounds\", COMPOUND, patterns);\n preparePatterns(hyphen.prefixes, \"prefixes\", PREFIX, patterns);\n preparePatterns(hyphen.suffixes, \"suffixes\", SUFFIX, patterns);\n patterns.sort((a, b) => b.cps.length - a.cps.length || a.kind - b.kind);\n\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let a = 0;\n while (a < n) {\n let selected: Pattern | undefined;\n for (const pattern of patterns) {\n if (matchesAt(cp, a, pattern.cps)) {\n selected = pattern;\n break;\n }\n }\n if (selected === undefined) {\n a += 1;\n continue;\n }\n\n // 3.4: matching and guarding are separate steps, and there is no backtracking. A guard\n // failure ends the position; no shorter entry is tried at `a`.\n const w = selected.cps;\n const k = w.length;\n if (selected.kind === COMPOUND) {\n if (!guardCompound(cp, a, k)) {\n a += 1;\n continue;\n }\n for (let j = 0; j < k; j += 1) {\n if (w[j] === HYPHEN_MINUS && cp[a + j] === HYPHEN_MINUS) edits.push(bind(a + j));\n }\n } else if (selected.kind === PREFIX) {\n if (!guardPrefix(cp, a, k)) {\n a += 1;\n continue;\n }\n // The entry's own last code point is the hyphen.\n if (w[k - 1] === HYPHEN_MINUS && cp[a + k - 1] === HYPHEN_MINUS) edits.push(bind(a + k - 1));\n } else {\n if (!guardSuffix(cp, a, k)) {\n a += 1;\n continue;\n }\n // A suffix is matched at its own hyphen.\n if (w[0] === HYPHEN_MINUS && cp[a] === HYPHEN_MINUS) edits.push(bind(a));\n }\n a += k;\n }\n return edits;\n}\n\nexport const hyphenRule: Rule = {\n id: \"hyphen\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, isUpper, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, InitialBinding, LocaleData, Rule, RuleContext } from \"../types.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\n\n/**\n * `nbsp` — spec/rules/nbsp.md (spec 0.1.0), order 70 (last).\n *\n * Ten sub-rules, N1…N10, evaluated in that fixed order; each claims indices, and the first\n * claim at an index wins (spec 3.2). The claim table is a positional array, never a map:\n * a map-iteration implementation would resolve conflicts differently in Go\n * (ARCHITECTURE.md 4.5). No regex, no native-string indexing (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst SPACE = 0x20;\nconst TAB = 0x09;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\nconst FULL_STOP = 0x2e;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PAREN_OPEN = 0x28;\nconst SQUARE_OPEN = 0x5b;\nconst BRACE_OPEN = 0x7b;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\nconst BRACE_CLOSE = 0x7d;\n\nconst SEMICOLON = 0x3b;\nconst AMPERSAND = 0x26;\nconst HASH = 0x23;\n/** The longest HTML named reference is 31 code points (`CounterClockwiseContourIntegral`). */\nconst MAX_CHARACTER_REFERENCE_NAME = 32;\n\nconst EN_DASH = 0x2013;\nconst EM_DASH = 0x2014;\nconst ELLIPSIS = 0x2026;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nexport function at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** 3.1 `BREAK`. */\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nfunction isNoBreak(cp: number): boolean {\n return cp === NBSP || cp === NNBSP;\n}\n\n/**\n * 3.1 `OTHER-SPACE`: the fixed-width spaces. In `SPACELIKE`, so they read as a boundary, but\n * never converted and never an \"already correct\" state — §4 promises a thin or figure space\n * the author placed is left exactly where it is.\n */\nfunction isOtherSpace(cp: number): boolean {\n return (cp >= 0x2000 && cp <= 0x200a) || cp === 0x205f || cp === 0x3000;\n}\n\n/**\n * 3.1 `SPACELIKE` — and `NOBREAK ⊂ SPACELIKE`. Every boundary test in this rule uses this\n * predicate and never U+0020 alone; that single decision is what makes the rule idempotent.\n */\nexport function isSpaceLike(cp: number): boolean {\n return cp === SPACE || isNoBreak(cp) || cp === TAB || isOtherSpace(cp) || isBreak(cp);\n}\n\n/**\n * 3.1 `SENTENCE-DASH` — U+2013 and U+2014 only, the left boundary of N3, N9 and N10.\n *\n * A hyphen is deliberately excluded, U+002D and U+2011 alike: it marks an *intra-word*\n * position, so the token after it is not a free-standing word. With U+2011 accepted, `из-за\n * дождя` bound twice — `hyphen` produced `из‑за` and N3 then read the compound's tail `за` as\n * the listed preposition (3.5 step 2). An em or en dash does open a phrase, so `— в Москве`\n * still binds.\n */\nfunction isSentenceDash(cp: number): boolean {\n return cp === EN_DASH || cp === EM_DASH;\n}\n\ninterface QuoteTarget {\n readonly open: number;\n readonly close: number;\n readonly target: number;\n}\n\n/** Locale data, resolved to code points once per call. No module-level state (ARCHITECTURE.md 7). */\nexport interface Prepared {\n readonly beforePunctuation: readonly number[];\n readonly narrowBeforePunctuation: readonly number[];\n readonly shortWords: readonly (readonly number[])[];\n readonly abbreviations: readonly (readonly number[])[];\n readonly units: readonly (readonly number[])[];\n readonly beforeNumber: readonly (readonly number[])[];\n readonly beforeWord: readonly (readonly number[])[];\n readonly symbols: readonly (readonly number[])[];\n readonly initialBinding: InitialBinding;\n readonly opens: readonly number[];\n readonly closes: readonly number[];\n readonly quotePairs: readonly QuoteTarget[];\n /** nbsp.md §3.1a NARROW-TARGET: what N2 writes, and what N8 writes for a `narrow-nbsp` pair. */\n readonly narrowTarget: number;\n}\n\nfunction malformed(message: string): never {\n throw new PolytypoError(\"POLYTYPO_MALFORMED_LOCALE_DATA\", message);\n}\n\nfunction singleCodePoint(entry: string, field: string): number {\n const cps = toCodePoints(entry);\n const first = cps[0];\n if (cps.length !== 1 || first === undefined) {\n malformed(`nbsp.${field} entry \"${entry}\" is not exactly one code point.`);\n }\n return first;\n}\n\nfunction contains(list: readonly number[], cp: number): boolean {\n for (const value of list) {\n if (value === cp) return true;\n }\n return false;\n}\n\n/** Longest first, so each sub-rule's \"longest match wins at a given `a`\" is a linear search. */\nfunction prepareList(entries: readonly string[]): (readonly number[])[] {\n const out = entries.map((entry) => toCodePoints(entry));\n out.sort((a, b) => b.length - a.length);\n return out;\n}\n\n/**\n * nbsp.md §3.1a: `narrowTarget` is NARROW-TARGET, already resolved by the caller — U+202F by\n * default, U+00A0 when `narrowNbsp: \"nbsp\"`. It is threaded into `prepare` so N2's and N8's\n * targets move together; nothing else in this rule changes, and §5's idempotency argument carries\n * over because every sub-rule's \"already correct\" branch recognises its own target.\n */\nexport function prepare(locale: LocaleData, narrowTarget: number = NNBSP): Prepared {\n const data = locale.nbsp;\n const beforePunctuation = data.beforePunctuation.map((entry) =>\n singleCodePoint(entry, \"beforePunctuation\"),\n );\n const narrowBeforePunctuation = data.narrowBeforePunctuation.map((entry) =>\n singleCodePoint(entry, \"narrowBeforePunctuation\"),\n );\n // 2: the two arrays must be disjoint. The schema does not enforce it, and picking a winner\n // silently would make N1's precedence load-bearing where the spec says it must not be.\n for (const cp of beforePunctuation) {\n if (contains(narrowBeforePunctuation, cp)) {\n malformed(\n `nbsp.beforePunctuation and nbsp.narrowBeforePunctuation both list U+${cp.toString(16).toUpperCase().padStart(4, \"0\")}; they must be disjoint (spec/rules/nbsp.md §2).`,\n );\n }\n }\n\n const primary = locale.quotes.primary;\n const secondary = locale.quotes.secondary;\n const opens = [\n PAREN_OPEN,\n SQUARE_OPEN,\n BRACE_OPEN,\n singleCodePoint(primary.open, \"quotes.primary.open\"),\n singleCodePoint(secondary.open, \"quotes.secondary.open\"),\n ];\n const closes = [\n PAREN_CLOSE,\n SQUARE_CLOSE,\n BRACE_CLOSE,\n singleCodePoint(primary.close, \"quotes.primary.close\"),\n singleCodePoint(secondary.close, \"quotes.secondary.close\"),\n ];\n\n const quotePairs: QuoteTarget[] = [];\n for (const pair of [primary, secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = singleCodePoint(pair.open, \"quotes.open\");\n const close = singleCodePoint(pair.close, \"quotes.close\");\n // 3.10 sidedness precondition: an open glyph equal to its close glyph cannot be told\n // apart without the pairing information only `quotes` has. Documented no-op (§7.5).\n if (open === close) continue;\n quotePairs.push({ open, close, target: pair.innerSpace === \"nbsp\" ? NBSP : narrowTarget });\n }\n\n return {\n beforePunctuation,\n narrowBeforePunctuation,\n shortWords: prepareList(data.afterShortWords),\n abbreviations: prepareList(data.abbreviations),\n units: prepareList(data.beforeUnits),\n beforeNumber: prepareList(data.beforeNumber),\n beforeWord: prepareList(data.beforeWord),\n symbols: prepareList(data.afterSymbols),\n initialBinding: data.initialBinding,\n opens,\n closes,\n quotePairs,\n narrowTarget,\n };\n}\n\n/**\n * 3.1 `OPENISH` / `CLOSEISH`: the ASCII brackets plus every locale quote glyph.\n *\n * The inline span boundary `MARKER` is in `CLOSEISH` and not in `OPENISH` (spec 1.2.0, nbsp.md\n * §7 item 12, modes.md 3.3). `CLOSEISH` is read only by N1/N2's right-context guard, where the\n * marker lets the no-break space come back after `spaces` deleted the typed one in\n * `<strong>gel :</strong>`. In `OPENISH` it would make the quote-glyph guard decline\n * `<em>non</em> !`.\n */\nexport function isOpenish(prep: Prepared, cp: number): boolean {\n return contains(prep.opens, cp);\n}\n\nfunction isCloseish(prep: Prepared, cp: number): boolean {\n return cp === MARKER || contains(prep.closes, cp);\n}\n\nfunction isMark(prep: Prepared, cp: number): boolean {\n return contains(prep.beforePunctuation, cp) || contains(prep.narrowBeforePunctuation, cp);\n}\n\ntype Claims = (Edit | undefined)[];\n\n/** 3.2: the first sub-rule to claim an index wins; every later edit at that index is discarded. */\nfunction claimConversion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index + 1, replacement: [target], ruleId: \"nbsp\" };\n}\n\nfunction claimInsertion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index, replacement: [target], ruleId: \"nbsp\" };\n}\n\ntype Matcher = (cp: readonly number[], a: number, w: readonly number[]) => boolean;\n\nfunction matchExact(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.5 step 1: exact except that the first code point may be its simple uppercase mapping. */\nfunction matchFirstCharLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n const first = w[0];\n if (first === undefined) return false;\n const head = cp[a];\n if (head !== first && head !== simpleUppercase(first)) return false;\n for (let j = 1; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.6 step 1: exact except that a pattern U+0020 also matches U+00A0 or U+202F. */\nfunction matchSpaceLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (c === p) continue;\n if (p === SPACE && isNoBreak(c)) continue;\n return false;\n }\n return true;\n}\n\n/**\n * 3.5, normative for N3, N4, N5, N6, N9 and N10: the longest entry that matches at `a` is\n * selected, the sub-rule's guards are applied to *that* entry, and there is no backtracking —\n * a shorter entry is never retried when the longest one fails a guard.\n */\nfunction longestMatch(\n patterns: readonly (readonly number[])[],\n cp: readonly number[],\n a: number,\n matcher: Matcher,\n): readonly number[] | undefined {\n for (const w of patterns) {\n if (matcher(cp, a, w)) return w;\n }\n return undefined;\n}\n\n/** N1 (3.3) and N2 (3.4) differ only in which no-break space is the target. */\nfunction punctuationSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n marks: readonly number[],\n target: number,\n other: number,\n): void {\n if (marks.length === 0) return;\n for (let i = 0; i < cp.length; i += 1) {\n if (!contains(marks, cp[i] as number)) continue;\n const left = at(cp, i - 1);\n // Step 1 — run guard: only the first mark of `?!` or `!!!` takes the space.\n if (left !== NONE && isMark(prep, left)) continue;\n // Step 2 — right-context guard: this is what protects `http://` and `12:30`.\n const after = at(cp, i + 1);\n // U+2026 is accepted: the guard exists to catch punctuation *inside a token*, and an\n // ellipsis after a question mark is not that. `Vraiment?…` must take the same space\n // `Vraiment ?` does, whether or not `ellipsis` (order 20) has already run.\n if (\n after !== NONE &&\n !isSpaceLike(after) &&\n !isCloseish(prep, after) &&\n after !== ELLIPSIS &&\n !isMark(prep, after)\n ) {\n continue;\n }\n // Step 3 — quote-glyph guard. The space beside an opening quotation glyph is\n // `quotes.innerSpace` and belongs to N8 alone. Without this, N2 and N8 want different\n // code points at one index, and \"already correct\" claims nothing, so the two alternate\n // for ever on the French input `«?` (3.2, 3.10.1).\n if (isOpenish(prep, left)) continue;\n if (left !== NONE && isSpaceLike(left) && isOpenish(prep, at(cp, i - 2))) continue;\n // Step 4 (spec 1.3.0) — character-reference guard. In text mode there is no markup concept\n // at all, so `fr`, whose narrowBeforePunctuation lists `;`, used to insert U+202F before the\n // `;` that *ends* a reference: `Bonjour&#160;: oui` and `Tom &amp; Jerry` stopped being what\n // they were. Shape, not the named-reference table: declining on `&notaname;` costs nothing,\n // and five runtimes are not going to carry thousands of identical entries for it.\n if (cp[i] === SEMICOLON && endsCharacterReference(cp, i)) continue;\n // Step 5.\n if (left === target) continue;\n if (left === SPACE || left === other) {\n claimConversion(claims, i - 1, target);\n continue;\n }\n // A fixed-width space stays as typed, and nothing is inserted beside it.\n if (isOtherSpace(left)) continue;\n if (left === NONE || isBreak(left) || left === TAB) continue;\n claimInsertion(claims, i, target);\n }\n}\n\n/**\n * 3.3 step 4: do the code points left of this `;` have the shape of a character reference?\n * A bounded left walk over ASCII alphanumerics, optionally one `#`, then `&`. The bound is the\n * longest named reference (31) plus one, so the walk cannot run away down a long token.\n */\nfunction endsCharacterReference(cp: readonly number[], i: number): boolean {\n let j = i - 1;\n while (j >= 0 && isAsciiAlphanumeric(cp[j] as number)) j -= 1;\n const len = i - 1 - j;\n if (len < 1 || len > MAX_CHARACTER_REFERENCE_NAME) return false;\n if (j >= 0 && cp[j] === HASH) j -= 1;\n return j >= 0 && cp[j] === AMPERSAND;\n}\n\nfunction isAsciiAlphanumeric(c: number): boolean {\n return (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\n}\n\n/** N3 — 3.5 `afterShortWords`. */\nfunction shortWordsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.shortWords.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.shortWords, cp, a, matchFirstCharLenient);\n if (w === undefined) continue;\n const k = w.length;\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (!isAlnum(next) && !isOpenish(prep, next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** N4 — 3.6 `abbreviations`. */\nfunction abbreviationsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.abbreviations.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.abbreviations, cp, a, matchSpaceLenient);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n if (isAlnum(at(cp, a + k))) continue;\n for (let j = 0; j < k; j += 1) {\n if (w[j] !== SPACE) continue;\n if (cp[a + j] === NBSP) continue;\n claimConversion(claims, a + j, NBSP);\n }\n }\n}\n\n/** N5 — 3.7 `beforeUnits`. Converts an existing space; never inserts one (§7.2). */\nfunction unitsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.units.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.units, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a + k))) continue;\n const left = at(cp, a - 1);\n if (left === NBSP) continue;\n if (left !== SPACE) continue;\n if (!isDigit(at(cp, a - 2))) continue;\n let b = a - 2;\n while (b - 1 >= 0 && isDigit(cp[b - 1] as number)) b -= 1;\n // The letter guard: `H2 O`, `A4`, `MP3` are not measurements.\n if (isLetter(at(cp, b - 1))) continue;\n claimConversion(claims, a - 1, NBSP);\n }\n}\n\n/** N6 — 3.8 `afterSymbols`. Conversion only. */\nfunction symbolsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.symbols.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.symbols, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n if (!isDigit(at(cp, a + k + 1))) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** 3.9: one uppercase letter, one full stop, at a token start. */\nexport function isInitialAt(cp: readonly number[], prep: Prepared, p: number): boolean {\n if (p < 0) return false;\n if (!isUpper(at(cp, p))) return false;\n if (at(cp, p + 1) !== FULL_STOP) return false;\n const before = at(cp, p - 1);\n return before === NONE || isSpaceLike(before) || isOpenish(prep, before);\n}\n\n/**\n * 3.9 guard C1-a: an uppercase letter plus a dot that is itself preceded by a *lower-case*\n * letter plus a dot is the second token of an abbreviation, not an initial. Without it the\n * shipped `de-DE` data turns `z. B. Berlin` into `z.⍽B.⍽Berlin` — a false positive on\n * ordinary prose. `А. С. Пушкин` is unaffected: `cp[p-3]` there is uppercase.\n */\nexport function isAbbreviationTail(cp: readonly number[], p: number): boolean {\n if (!isSpaceLike(at(cp, p - 1))) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n const head = at(cp, p - 3);\n return isLetter(head) && !isUpper(head);\n}\n\n/**\n * 3.9 chain confirmation: is the initial whose letter sits at `p` itself immediately preceded by\n * another initial (`cp[p-1]` space-like, `cp[p-2]` a full stop, and `isInitialAt(p-3)`)? Used only\n * by `\"chain\"` mode's C1, to require Chicago's own \"two or more initials\" before the space\n * leading into a following non-initial word (a candidate surname) is bound — see nbsp.md §3.9.\n */\nexport function hasPrecedingInitial(cp: readonly number[], prep: Prepared, p: number): boolean {\n const gap = at(cp, p - 1);\n if (gap !== SPACE && gap !== NBSP) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n return isInitialAt(cp, prep, p - 3);\n}\n\n/** N7 — 3.9 `initialBinding`. */\nfunction initialsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n const mode: InitialBinding = prep.initialBinding;\n if (mode === \"none\") return;\n for (let q = 0; q < cp.length; q += 1) {\n const here = cp[q] as number;\n if (here !== SPACE && here !== NBSP) continue;\n // C1 — an initial on the left and an uppercase letter on the right, unless C1-a declines.\n const leftInitialP = q - 2;\n const c1Shape =\n at(cp, q - 1) === FULL_STOP &&\n isInitialAt(cp, prep, leftInitialP) &&\n isUpper(at(cp, q + 1)) &&\n !isAbbreviationTail(cp, leftInitialP);\n // `\"chain\"` mode additionally requires either that the right side is itself an initial (the\n // between-initials case, e.g. `E.|B.`, always safe) or that the left initial is itself\n // preceded by another initial (a confirmed chain of two or more, e.g. `E. B.|White`) before\n // binding to a plain following word. `\"single\"` mode keeps the unconditional shape check —\n // that is the behaviour `fr`/`fr-CA` need for `N. Bourbaki`/`M. Dupont` (nbsp.md §3.9,\n // Jacques André) and cannot structurally distinguish from a sentence-boundary collision.\n const c1 =\n c1Shape &&\n (mode === \"single\" ||\n isInitialAt(cp, prep, q + 1) ||\n hasPrecedingInitial(cp, prep, leftInitialP));\n // C2 — a word on the left and two consecutive initials on the right (`Пушкин А. С.`). Already\n // requires two initials by construction, so it is unaffected by `\"chain\"` vs `\"single\"`.\n const rightSpace = at(cp, q + 3);\n const c2 =\n isLetter(at(cp, q - 1)) &&\n isInitialAt(cp, prep, q + 1) &&\n (rightSpace === SPACE || rightSpace === NBSP) &&\n isInitialAt(cp, prep, q + 4);\n if (!c1 && !c2) continue;\n if (here === NBSP) continue;\n claimConversion(claims, q, NBSP);\n }\n}\n\n/** N8 — 3.10 `quotes.innerSpace`. The only sub-rule besides N1/N2 that may insert. */\nfunction quotesSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n for (const pair of prep.quotePairs) {\n for (let i = 0; i < cp.length; i += 1) {\n const here = cp[i] as number;\n if (here === pair.open) {\n const right = at(cp, i + 1);\n if (right === pair.target) continue;\n if (right === SPACE || isNoBreak(right)) {\n claimConversion(claims, i + 1, pair.target);\n continue;\n }\n if (right === NONE || isBreak(right)) continue;\n claimInsertion(claims, i + 1, pair.target);\n continue;\n }\n if (here !== pair.close) continue;\n const left = at(cp, i - 1);\n if (left === pair.target) continue;\n if (left === SPACE || isNoBreak(left)) {\n claimConversion(claims, i - 1, pair.target);\n continue;\n }\n if (left === NONE || isBreak(left)) continue;\n claimInsertion(claims, i, pair.target);\n }\n }\n}\n\n/**\n * N9 (3.12 `beforeNumber`) and N10 (3.13 `beforeWord`) share every guard except what must\n * follow the separator: a digit for N9, a letter for N10.\n */\nfunction forwardBindingSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n patterns: readonly (readonly number[])[],\n wantsDigit: boolean,\n): void {\n if (patterns.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(patterns, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n // G-D (3.13 step 5): in a locale where N7 is active, an *uppercase* letter plus a dot is\n // structurally an initial, and N7 owns that shape with better evidence. The UPPER test is\n // load-bearing: without it Russian `г.` would be inert, contradicting §6 case 13a.\n if (\n !wantsDigit &&\n prep.initialBinding !== \"none\" &&\n k === 2 &&\n isUpper(w[0] as number) &&\n w[1] === FULL_STOP\n ) {\n continue;\n }\n // G-L — stronger than \"not ALNUM\": it is what stops `S.` matching inside `Fig.S. 3`.\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n // G-S — exactly one separator, and it must already be a space.\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (isSpaceLike(next)) continue;\n // G-W / \"a following number\": one code point, tested for membership. `NONE` fails both,\n // which is also the line-boundary guard G-B.\n if (wantsDigit ? !isDigit(next) : !isLetter(next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const prep = prepare(ctx.locale, ctx.narrowTarget);\n const cp = ctx.cp;\n const claims: Claims = new Array<Edit | undefined>(cp.length + 1);\n\n // 3.2 — N1 … N10, in this order, first claim wins. The order is positional and total, not\n // an artefact of iterating a map.\n //\n // First claim wins only settles a conflict when both sub-rules emit; an \"already correct\"\n // branch claims nothing and yields the index. So sub-rules wanting *different* code points\n // must be disjoint by construction. They are: N3…N7, N9 and N10 all target U+00A0, so any\n // yield between them is a common fixed point. The only cross-target pairs are N1 against N2\n // — kept disjoint by the §2 precondition, which fails loudly — and N1/N2 against N8, which\n // is what the quote-glyph guard above repairs.\n punctuationSubRule(cp, prep, claims, prep.beforePunctuation, NBSP, NNBSP);\n // N2's target is NARROW-TARGET (§3.1a); `other` is the NOBREAK member that is not the target,\n // which is what the sub-rule converts. With the substitution on, N2 and N1 want the same\n // character — never different ones, which is why §5's clause 0 needs no new case.\n punctuationSubRule(\n cp,\n prep,\n claims,\n prep.narrowBeforePunctuation,\n prep.narrowTarget,\n prep.narrowTarget === NBSP ? NNBSP : NBSP,\n );\n shortWordsSubRule(cp, prep, claims);\n abbreviationsSubRule(cp, prep, claims);\n unitsSubRule(cp, prep, claims);\n symbolsSubRule(cp, prep, claims);\n initialsSubRule(cp, prep, claims);\n quotesSubRule(cp, prep, claims);\n forwardBindingSubRule(cp, prep, claims, prep.beforeNumber, true);\n forwardBindingSubRule(cp, prep, claims, prep.beforeWord, false);\n\n const edits: Edit[] = [];\n for (let i = 0; i <= cp.length; i += 1) {\n const claim = claims[i];\n if (claim !== undefined) edits.push(claim);\n }\n return edits;\n}\n\nexport const nbspRule: Rule = {\n id: \"nbsp\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { ElisionClitics, ElisionIdiom } from \"../types.js\";\n\n/**\n * The structural predicates `quotes` (order 40) reads to decline a pairing — quotes.md 3.2.\n *\n * Two mechanisms, both decline-only, both with the same outcome: the marks survive pass 2\n * unmatched and `apostrophe` (order 50) converts each by its own case ladder (apostrophe.md 3.3\n * cases 4 then 3), giving `rock ’n’ roll`.\n *\n * {@link computeIdiomMatchedIndices} is the locale-cited mechanism (spec 0.4.0): an exact\n * `left`/`elided`/`right` context match against `quotes.elisionIdioms`.\n *\n * {@link computeAmbiguousShapeIndices} is the universal medial-`n` veto (spec 1.1.0): a pair of\n * `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with at least one\n * `INLINE-SPACE` code point immediately outside each mark. It needs no citation because the\n * operator ruled the idiom international (quotes.md 3.2, 2026-09-09), and it vetoes a superset of\n * what the cited en-US entry does.\n *\n * {@link computeSpanBoundaryVetoIndices} is the span-boundary elision veto (spec 1.4.0): a\n * `NARROW` mark whose literal left or right neighbour IS modes.md 3.2's inline boundary marker,\n * with a cited `quotes.elisionClitics` fragment attaching on its other side. It exists because\n * the two mechanisms above both need a real code point on each side, so a possessive or elision\n * written flush against a span (`` `x`'s ``, `l'<em>idée</em>`) escaped both and was paired as a\n * quotation, inverting the enclosing pair (canonical issue #53).\n *\n * Only `quotes` consumes this module. Spec 0.5.0 had `apostrophe` consume it too, through a\n * preserve set that stopped its case ladder from converting marks 0.5.0 wanted preserved;\n * conversion is now the specified outcome, so that set is withdrawn (apostrophe.md 3.4) and\n * `apostrophe` reads no locale data again.\n */\n\n/** quotes.md 3.2 — the one code point this veto's span may enclose, in either case. */\nconst LOWER_N = 0x6e;\nconst UPPER_N = 0x4e;\n\n/** quotes.md 3.1 NARROW — the quote-mark glyphs an elision idiom's marks may appear as across\n * pipeline passes (straight, or already curled by an earlier pass). Canonical definition, shared\n * so `quotes` and `apostrophe` cannot define two slightly different NARROW sets. */\nexport const NARROW: ReadonlySet<number> = new Set([\n 0x27, 0x2018, 0x2019, 0x201a, 0x201b, 0x2039, 0x203a,\n]);\n\n/** quotes.md 3.1 INLINE-SPACE — deliberately excludes BREAK, so this shape never crosses a\n * line/span boundary (modes.md 3.3), matching the existing elisionIdioms anchor exactly. */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Case-insensitive-first-code-point comparison, ASCII-only — the same convention\n * `nbsp.afterShortWords` and the existing idiom matcher use (quotes.ts's own `asciiLower`,\n * relocated here so both consumers share one definition).\n */\nfunction asciiLower(cp: number): number {\n return cp >= 0x41 && cp <= 0x5a ? cp + 0x20 : cp;\n}\n\nfunction isAlnum(cp: number): boolean {\n const DIGIT_ZERO = 0x30;\n const DIGIT_NINE = 0x39;\n return (cp >= DIGIT_ZERO && cp <= DIGIT_NINE) || isLetter(cp);\n}\n\nfunction wordEndsAt(arr: readonly number[], end: number, word: readonly number[]): boolean {\n const start = end - word.length;\n if (start < 0) return false;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const before = start > 0 ? at(arr, start - 1) : NONE;\n return before === NONE || !isAlnum(before);\n}\n\nfunction wordStartsAt(arr: readonly number[], start: number, word: readonly number[]): boolean {\n const n = arr.length;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const after = start + word.length < n ? at(arr, start + word.length) : NONE;\n return after === NONE || !isAlnum(after);\n}\n\ninterface CompiledIdiom {\n readonly left: readonly number[];\n readonly elided: readonly number[];\n readonly right: readonly number[];\n}\n\n/**\n * Listed elision veto (quotes.md 3.2, spec 0.4.0), locale data `quotes.elisionIdioms`. Bounded\n * literal scan for `left, NARROW, elided, NARROW, right` (`rock 'n' roll`'s `{left: \"rock\",\n * elided: \"n\", right: \"roll\"}`). Both marks of a match are returned. Matches on NARROW quote\n * marks generally (U+0027 and already-curly U+2018/U+2019), not only straight ASCII — this is\n * `quotes`' own idempotency requirement (an idiom must still veto pairing on a second pipeline\n * pass, after `apostrophe` has curled the marks) and is unchanged from spec 0.4.0/0.4.1.\n */\nexport function computeIdiomMatchedIndices(\n arr: readonly number[],\n idioms: readonly ElisionIdiom[],\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n if (idioms.length === 0) return vetoed;\n\n const n = arr.length;\n const compiled: readonly CompiledIdiom[] = idioms.map((idiom) => ({\n left: toCodePoints(idiom.left),\n elided: toCodePoints(idiom.elided),\n right: toCodePoints(idiom.right),\n }));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!NARROW.has(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n for (const idiom of compiled) {\n const k = idiom.elided.length;\n const j = i + 1 + k;\n if (j >= n) continue;\n\n let elidedMatches = true;\n for (let w = 0; w < k; w += 1) {\n if (at(arr, i + 1 + w) !== idiom.elided[w]) {\n elidedMatches = false;\n break;\n }\n }\n if (!elidedMatches) continue;\n if (!NARROW.has(at(arr, j))) continue;\n\n const rLit = j + 1 < n ? at(arr, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n if (!wordEndsAt(arr, i - 1, idiom.left)) continue;\n if (!wordStartsAt(arr, j + 2, idiom.right)) continue;\n\n vetoed.add(i);\n vetoed.add(j);\n }\n }\n\n return vetoed;\n}\n\n/**\n * The universal medial-`n` elision shape, locale-independent (spec 1.1.0, quotes.md 3.2): a pair\n * of `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with **at least\n * one** `INLINE-SPACE` code point immediately outside each mark. A longer run of inline spaces\n * (`rock 'n' roll`) still matches, since only the single adjacent code point is tested; the\n * \"exactly one\" variant would let a doubled-space `rock 'n' roll` fall through to ordinary\n * quote-pairing. Both mark positions are returned for every match.\n *\n * **`NARROW`, not `SQ`, and that is an idempotency obligation rather than a preference.** This\n * veto's marks are converted to U+2019 by `apostrophe`, so a straight-ASCII-only predicate would\n * not recognise its own output and pass 2 would pair `rock ’n’ roll` as an ordinary `NARROW`\n * quotation on the next pipeline run — measured, with a straight-only predicate, as\n * `rock «n» roll` in `ru` and `rock ”n” roll` in `fi`. Spec 0.5.0's predicate was straight-only,\n * correctly for its own preserve-then-stop outcome; inverting the outcome forces the widening.\n * `apostrophe` emits U+2019 only in place of U+0027, so a span already written with real marks is\n * matched and then left exactly as the author typed it.\n *\n * A superset of {@link computeIdiomMatchedIndices}'s output for every idiom whose `elided` field\n * is a single `n`, which is every idiom shipped so far, but computed independently rather than\n * assumed — a future idiom's `elided` field is not required to be that short.\n */\nexport function computeAmbiguousShapeIndices(cp: readonly number[]): ReadonlySet<number> {\n const ambiguous = new Set<number>();\n const n = cp.length;\n\n for (let i = 0; i < n; i += 1) {\n if (!NARROW.has(at(cp, i))) continue;\n\n const lLit = i > 0 ? at(cp, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n const enclosed = at(cp, i + 1);\n if (enclosed !== LOWER_N && enclosed !== UPPER_N) continue;\n\n const j = i + 2;\n if (!NARROW.has(at(cp, j))) continue;\n\n const rLit = j + 1 < n ? at(cp, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n ambiguous.add(i);\n ambiguous.add(j);\n }\n\n return ambiguous;\n}\n\n/**\n * Span-boundary elision veto (quotes.md 3.2, spec 1.4.0), locale data `quotes.elisionClitics`.\n *\n * Fires only where one literal neighbour is the inline `MARKER`, which is why it is inert in\n * `text` and `yaml` modes — neither produces one. The attaching side is read as a MAXIMAL\n * `LETTER` run bounded by a non-`ALNUM` code point (or `NONE`) and compared whole: a prefix test\n * would match the entry `s` inside `sure` and eat `<em>'sure'</em>`, a genuine quotation.\n *\n * The comparison folds the run's first code point, ASCII A-Z only, and is exact thereafter —\n * the same convention the idiom matcher above uses, never a platform locale function\n * (ARCHITECTURE.md 4.4). Entries are authored lowercase, enforced at the data boundary.\n */\nexport function computeSpanBoundaryVetoIndices(\n arr: readonly number[],\n clitics: ElisionClitics | undefined,\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n const before = clitics?.before ?? [];\n const after = clitics?.after ?? [];\n if (before.length === 0 && after.length === 0) return vetoed;\n\n const compiled = {\n before: before.map(toCodePoints),\n after: after.map(toCodePoints),\n };\n\n for (let i = 0; i < arr.length; i += 1) {\n if (!NARROW.has(at(arr, i))) continue;\n if (at(arr, i - 1) === MARKER && runMatches(arr, i, 1, compiled.after)) {\n vetoed.add(i);\n continue;\n }\n if (at(arr, i + 1) === MARKER && runMatches(arr, i, -1, compiled.before)) {\n vetoed.add(i);\n }\n }\n return vetoed;\n}\n\n/**\n * The maximal `LETTER` run adjacent to the mark at `i` in direction `dir`, compared against\n * `entries`. Returns false for an empty run, for a run the caller's own `ALNUM` bound continues\n * past (a digit directly beyond the letters is still a word character, so the run is not the\n * whole fragment), and for a run no entry equals.\n */\nfunction runMatches(\n arr: readonly number[],\n i: number,\n dir: 1 | -1,\n entries: readonly (readonly number[])[],\n): boolean {\n const run: number[] = [];\n let j = i + dir;\n for (; ; j += dir) {\n const cp = at(arr, j);\n if (cp === NONE || !isLetter(cp)) break;\n run.push(cp);\n }\n if (run.length === 0) return false;\n const outer = at(arr, j);\n if (outer !== NONE && isAlnum(outer)) return false;\n if (dir === -1) run.reverse();\n\n for (const entry of entries) {\n if (entry.length !== run.length) continue;\n let same = at(entry, 0) === asciiLower(at(run, 0));\n for (let k = 1; same && k < entry.length; k += 1) same = at(entry, k) === at(run, k);\n if (same) return true;\n }\n return false;\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type {\n Edit,\n ElisionClitics,\n ElisionIdiom,\n LocaleData,\n QuotePair,\n Rule,\n RuleContext,\n} from \"../types.js\";\nimport {\n NARROW,\n computeAmbiguousShapeIndices,\n computeIdiomMatchedIndices,\n computeSpanBoundaryVetoIndices,\n} from \"./quote-ambiguity.js\";\n\n/**\n * `quotes` — spec/rules/quotes.md (spec 0.4.1), order 40.\n *\n * Mandate 1 (every existing quote glyph is a re-typesetting candidate) and mandate 2 (a space\n * touching a quote mark is sloppiness, not evidence) replace 0.1.0's whole architecture, whose\n * idempotency rested on never reading this rule's own curly output. Five passes plus an emit;\n * no backtracking inside a pass, no regular expression, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/**\n * spec 3.2 `V1ID` (spec 0.4.1) — a **conservative over-approximation**, not a claim that every\n * U+0027 becomes U+2019. `apostrophe` (R₆) only ever *emits* U+2019 for a U+0027 (never any\n * other code point), but its own case ladder leaves a U+0027 unedited under the prime guard\n * (case 1: `6' 2\"`) and case 5 (`a ' b`, `''`) — `apostrophe.md` §5 names both as surviving to\n * the second run unedited. `V1ID` cannot know, from inside `quotes`, which outcome a given\n * U+0027 will get without re-deriving `apostrophe`'s verdict against `quotes`' own final output\n * — circular, since that output is what this rule is computing — so it treats every U+0027 as\n * *possibly* about to become U+2019 and every U+2019 as *possibly* a U+0027 that already did.\n *\n * **What \"conservative\" bounds, and what it does not.** At this single comparison, `V1ID` can\n * only ever *add* a veto (merge two identities that raw equality would have kept apart) — it\n * never grants `canOpen`/`canClose` to a candidate that would not otherwise have had it. It does\n * **not** follow that the rule's final output only ever declines more and converts less: pass 2\n * (`pairCandidates`) and pass 4 (`certify`) are global over the whole candidate list, and removing\n * one candidate can remove a crossing pair, a nesting conflict, or a certification-gate\n * instability that was previously making a *different, unrelated* pair fail to certify. An extra\n * local veto can therefore *indirectly* let another pair certify, reassign depth/glyphs, or\n * change what `nbsp` (order 70) later inserts — the reported counterexample is exactly this: V1ID\n * declining the crossing `NARROW` pair is what lets the `WIDE` pair certify on pass 1 instead of\n * being caught in the same gate rejection. See quotes.md §5, Lemma A / Corollary A1 and the \"V1ID\n * empirical audit\" section for the bound this actually rests on — inspection of every globally\n * changed output within a reproducible sweep, not a monotonicity claim.\n */\nconst SQ = 0x27;\nconst RIGHT_SINGLE_QUOTE = 0x2019;\nfunction v1Identity(cp: number): number {\n return cp === SQ ? RIGHT_SINGLE_QUOTE : cp;\n}\n\n/** spec 3.1 `WIDE` / `NARROW`. `WIDE ∪ NARROW = QUOTEMARK`, and the two are disjoint. `NARROW`\n * is imported from `./quote-ambiguity.js`, shared with `apostrophe` (spec 0.5.0). */\nconst WIDE: ReadonlySet<number> = new Set([\n 0x22, 0xab, 0xbb, 0x201c, 0x201d, 0x201e, 0x201f, 0x301d, 0x301e, 0x301f,\n]);\n\nfunction isQuoteMark(cp: number): boolean {\n return WIDE.has(cp) || NARROW.has(cp);\n}\n\n/**\n * spec 3.1 `INLINE-SPACE` — split out of `SPACELIKE` because §3.2's skip walks read this class\n * alone. `MARKER`/`LINE_MARKER` are deliberately absent, so no skip walk ever crosses a span\n * boundary or a line terminator (modes.md 3.3).\n */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** spec 3.1 `BREAK`, including the line-boundary marker (modes.md 3.2). */\nconst BREAK: ReadonlySet<number> = new Set([\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\nconst SPACELIKE: ReadonlySet<number> = new Set([...INLINE_SPACE, ...BREAK]);\n\n/**\n * spec 3.1 `OPENISH` / `CLOSEISH`. `QUOTEMARK` is a member of **both**, and is exempt from\n * `canOpen`'s closeish rejection — Lemma A's entire mechanism (spec 5). Do not \"simplify\" this\n * back to per-glyph lists: it is what makes a candidate's verdict independent of *which* quote\n * glyph its neighbour is.\n */\nconst OPENISH: ReadonlySet<number> = new Set([MARKER, 0x28, 0x5b, 0x7b, ...WIDE, ...NARROW]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2013,\n 0x2014,\n ...WIDE,\n ...NARROW,\n]);\n\n/** spec 3.1 `DASHISH`. U+2011 because `hyphen` (order 35) converts U+002D to it. */\nconst DASHISH: ReadonlySet<number> = new Set([0x2d, 0x2011, 0x2013, 0x2014]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** spec 3.1 `DELETE-LANDING` — the largest landing class for which every earlier-ordered rule's own classes are unaffected by a quote glyph or a U+0020 (spec 3.7, composition obligation). */\nfunction isDeleteLanding(cp: number): boolean {\n return isAlnum(cp) || isQuoteMark(cp);\n}\n\n/** The straight-line walk of spec 3.2: step outward across a maximal `INLINE-SPACE` run. */\nfunction skipLeft(arr: readonly number[], i: number): number {\n let j = i - 1;\n while (j >= 0 && INLINE_SPACE.has(arr[j] as number)) j -= 1;\n return j >= 0 ? (arr[j] as number) : NONE;\n}\n\nfunction skipRight(arr: readonly number[], i: number): number {\n const n = arr.length;\n let j = i + 1;\n while (j < n && INLINE_SPACE.has(arr[j] as number)) j += 1;\n return j < n ? (arr[j] as number) : NONE;\n}\n\ninterface Candidate {\n readonly index: number;\n readonly wide: boolean;\n readonly canOpen: boolean;\n readonly canClose: boolean;\n}\n\ninterface Pair {\n readonly open: number;\n readonly close: number;\n}\n\ninterface SkipSets {\n readonly spaceRight: ReadonlySet<number>;\n readonly spaceLeft: ReadonlySet<number>;\n}\n\nfunction glyphCodePoint(s: string): number {\n return toCodePoints(s)[0] as number;\n}\n\n/**\n * spec 3.1a — locale-derived skip sets, computed once per call. These are exactly the\n * positions at which `nbsp` N8 can insert a space (nbsp.md 3.10), which is what makes Lemma B's\n * coverage exact rather than a survey.\n */\nfunction computeSkipSets(locale: LocaleData): SkipSets {\n const spaceRight = new Set<number>();\n const spaceLeft = new Set<number>();\n for (const pair of [locale.quotes.primary, locale.quotes.secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = glyphCodePoint(pair.open);\n const close = glyphCodePoint(pair.close);\n if (open === close) continue;\n spaceRight.add(open);\n spaceLeft.add(close);\n }\n return { spaceRight, spaceLeft };\n}\n\n/**\n * Pass 1 — collect and classify candidates (spec 3.2). `canOpen` always skips right and\n * `canClose` always skips left (mandate 2's inner-side skip); the outer side skips only when\n * `nbsp` can reach it (the locale-derived `spaceRight`/`spaceLeft` sets), which is what keeps\n * every verdict inert to `nbsp` (Lemma B).\n */\nconst EMPTY_VETO: ReadonlySet<number> = new Set();\n\nfunction collectCandidates(\n arr: readonly number[],\n skip: SkipSets,\n elisionIdioms: readonly ElisionIdiom[],\n elisionClitics: ElisionClitics | undefined,\n): Candidate[] {\n const n = arr.length;\n const candidates: Candidate[] = [];\n // spec 1.1.0: the veto set is the UNION of the cited-idiom match (unchanged since 0.4.0) and\n // the universal medial-n shape (quotes.md 3.2). `quotes` declines pairing for both, and both\n // have the same intent — that `apostrophe` (order 50) convert the surviving marks by its own\n // case ladder. The union is computed rather than assumed: an idiom's `elided` field is not\n // required to be the single `n` the universal veto matches.\n // spec 1.4.0 adds a third member to the same union: the span-boundary elision veto, which\n // fires only where one literal neighbour is the inline MARKER (quotes.md 3.2).\n const sets = [\n computeIdiomMatchedIndices(arr, elisionIdioms),\n computeAmbiguousShapeIndices(arr),\n computeSpanBoundaryVetoIndices(arr, elisionClitics),\n ].filter((set) => set.size > 0);\n const elisionVetoed: ReadonlySet<number> =\n sets.length === 0\n ? EMPTY_VETO\n : sets.length === 1\n ? (sets[0] as ReadonlySet<number>)\n : new Set(sets.flatMap((set) => [...set]));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!isQuoteMark(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n const rLit = i + 1 < n ? at(arr, i + 1) : NONE;\n const lSkip = skipLeft(arr, i);\n const rSkip = skipRight(arr, i);\n\n const openLeft = skip.spaceLeft.has(g) ? lSkip : lLit;\n const closeRight = skip.spaceRight.has(g) ? rSkip : rLit;\n\n let canOpen =\n (openLeft === NONE ||\n SPACELIKE.has(openLeft) ||\n OPENISH.has(openLeft) ||\n DASHISH.has(openLeft)) &&\n rSkip !== NONE &&\n !SPACELIKE.has(rSkip) &&\n (!CLOSEISH.has(rSkip) || isQuoteMark(rSkip) || rSkip === MARKER);\n\n let canClose =\n lSkip !== NONE &&\n !SPACELIKE.has(lSkip) &&\n (closeRight === NONE ||\n SPACELIKE.has(closeRight) ||\n CLOSEISH.has(closeRight) ||\n DASHISH.has(closeRight));\n\n // Medial-elision veto (spec 3.2), `NARROW` marks only, literal reads: `don't`, `l'été`,\n // `O'Brien`, `1990's` — and, on a second pipeline pass, `don't` with U+2019, because\n // `apostrophe` has converted the mark and U+2019 is also `NARROW`.\n if (NARROW.has(g) && lLit !== NONE && rLit !== NONE && isAlnum(lLit) && isAlnum(rLit)) {\n canOpen = false;\n canClose = false;\n }\n\n // Listed elision veto (spec 3.2, spec 0.4.0): both capabilities of a mark found by the\n // pre-pass above are forced false, overriding every other test in this loop.\n if (elisionVetoed.has(i)) {\n canOpen = false;\n canClose = false;\n }\n\n // V1 — same-V1-identity adjacency veto (spec 3.2), both widths: `\"\"`, `''`, `««`, `””` —\n // literal adjacency under `v1Identity` (`v1Identity` is the identity function everywhere\n // except U+0027, see its definition above), **plus** the same shape separated by exactly one\n // INLINE-SPACE code point at a position `nbsp` can insert or remove. The second clause is\n // narrow on purpose:\n // it fires only when the space-or-not gap sits immediately after a `SPACE-RIGHT` glyph (on\n // the left) or immediately before a `SPACE-LEFT` glyph (on the right) — the two positions\n // Lemma B (spec 5) enumerates as `nbsp`'s entire insertion surface next to a quote mark.\n // Without it, a pairing the gate declines when the gap is absent can certify once `nbsp`\n // (a *later* rule) inserts the gap on a subsequent pipeline pass — a composition-obligation\n // violation, since `quotes` must be a no-op on its own already-settled output regardless of\n // whether `nbsp` has acted yet. A plain skip-based V1 (comparing `Lskip`/`Rskip` to `g`\n // unconditionally) was tried and rejected: it also vetoes two *genuinely distinct*\n // quotations separated by an ordinary word space (`'a' 'b'`), which is ordinary prose, not\n // an artefact — the veto must depend on the *locale's* `SPACE-RIGHT`/`SPACE-LEFT` sets, not\n // fire on every space-separated repeat of a glyph.\n // `g` is shared identically between a candidate and the same-glyph neighbour reached by a\n // skip, so it does not matter here which of the two sits on which side of the gap: nbsp\n // can insert there iff `g` plays *either* spaced role (it opens on its own right, or closes\n // on its own left) for this locale.\n //\n // Every comparison below reads `v1Identity`, not the raw code point (spec 3.2 `V1ID`, spec\n // 0.4.1) — a *conservative* closure, not a claim that every U+0027 becomes U+2019.\n // `apostrophe` (R₆) only ever emits U+2019 for a U+0027, but its own case ladder leaves some\n // U+0027s unedited (prime guard, case 5); `v1Identity`'s definition above explains why\n // `quotes` cannot know which without a circular re-derivation of `apostrophe`'s verdict\n // against its own output. Without this closure, a literal U+0027-vs-U+2019 comparison here\n // gives a different verdict before and after `apostrophe` edits a neighbour between two\n // pipeline passes — a composition-obligation violation against this rule's own idempotency\n // (quotes.md §5, Lemma A / Corollary A1). At *this* comparison the effect is one-directional\n // — an extra veto on a mixed U+0027/U+2019 adjacency, never a granted capability — but that is\n // a local fact about this line, not a claim about the rule's final output: declining one\n // candidate here can remove a crossing/nesting/certification conflict downstream (passes 2\n // and 4 are global over the whole candidate list) and thereby let a *different* pair certify\n // that previously could not. See the module comment on `v1Identity` above.\n const gV1 = v1Identity(g);\n const gapIsNbspInsertable = skip.spaceRight.has(g) || skip.spaceLeft.has(g);\n const leftVetoed =\n v1Identity(lLit) === gV1 ||\n (lLit !== NONE && INLINE_SPACE.has(lLit) && v1Identity(lSkip) === gV1 && gapIsNbspInsertable);\n const rightVetoed =\n v1Identity(rLit) === gV1 ||\n (rLit !== NONE && INLINE_SPACE.has(rLit) && v1Identity(rSkip) === gV1 && gapIsNbspInsertable);\n if (leftVetoed || rightVetoed) {\n canOpen = false;\n canClose = false;\n }\n\n if (canOpen || canClose) {\n candidates.push({ index: i, wide: WIDE.has(g), canOpen, canClose });\n }\n }\n\n return candidates;\n}\n\n/** spec 3.3 `vacuous(a, b)`. Vacuously true when `b = a + 1`. */\nfunction isVacuous(arr: readonly number[], a: number, b: number): boolean {\n for (let k = a + 1; k < b; k += 1) {\n if (!INLINE_SPACE.has(arr[k] as number)) return false;\n }\n return true;\n}\n\n/**\n * Pass 2 — pair the candidates, one stack per width (spec 3.3). Closing is tried before\n * opening; a candidate reaches exactly one of three outcomes (paired, pushed, unmatched), and a\n * closer that fails the vacuity condition falls through to step 2 and then step 3 rather than\n * being discarded — the exhaustive three-outcome shape the certification gate depends on.\n */\nfunction pairCandidates(arr: readonly number[], candidates: readonly Candidate[]): Pair[] {\n const wideStack: Candidate[] = [];\n const narrowStack: Candidate[] = [];\n const pairs: Pair[] = [];\n\n for (const c of candidates) {\n const stack = c.wide ? wideStack : narrowStack;\n const top = stack[stack.length - 1];\n if (c.canClose && top !== undefined && !isVacuous(arr, top.index, c.index)) {\n stack.pop();\n pairs.push({ open: top.index, close: c.index });\n continue;\n }\n if (c.canOpen) stack.push(c);\n }\n\n return pairs;\n}\n\n/**\n * Pass 3 — depth over the *accepted* set, never the raw pass-2 output (spec 3.4). On a second\n * run the accepted set is the raw set, so a depth taken over the raw set on run 1 and the\n * accepted set on run 2 would disagree whenever the gate declined anything.\n */\nfunction depthOf(pairs: readonly Pair[], p: Pair): number {\n let depth = 1;\n for (const q of pairs) {\n if (q.open < p.open && p.close < q.close) depth += 1;\n }\n return depth;\n}\n\nfunction pairFor(ctx: RuleContext, depth: number): QuotePair {\n return depth % 2 === 1 ? ctx.locale.quotes.primary : ctx.locale.quotes.secondary;\n}\n\ninterface RenderPlan {\n /** index (in `arr`) -> replacement code point, for every mark in an accepted pair. */\n readonly replace: ReadonlyMap<number, number>;\n /** indices (in `arr`) to delete: the inner-run deletions the landing guard permitted. */\n readonly deleteIndices: ReadonlySet<number>;\n}\n\n/**\n * spec 3.5 `render`'s glyph/deletion plan, shared by the certification gate's hypothetical and\n * the real emit (pass 5) — the only difference between them is whether the plan is applied to a\n * throwaway array or actually returned as edits.\n */\nfunction computeRenderPlan(\n arr: readonly number[],\n accepted: readonly Pair[],\n ctx: RuleContext,\n): RenderPlan {\n const replace = new Map<number, number>();\n const deleteIndices = new Set<number>();\n\n for (const p of accepted) {\n const glyphs = pairFor(ctx, depthOf(accepted, p));\n replace.set(p.open, glyphCodePoint(glyphs.open));\n replace.set(p.close, glyphCodePoint(glyphs.close));\n\n if (glyphs.innerSpace !== \"none\") continue;\n\n // Open-side run: the maximal INLINE-SPACE run starting at p.open + 1.\n let openEnd = p.open + 1;\n while (openEnd < arr.length && INLINE_SPACE.has(arr[openEnd] as number)) openEnd += 1;\n const openStart = p.open + 1;\n const openEmpty = openEnd === openStart;\n const openLanding = openEnd < arr.length ? (arr[openEnd] as number) : NONE;\n\n // Close-side run: the maximal INLINE-SPACE run ending at p.close - 1.\n let closeStart = p.close - 1;\n while (closeStart >= 0 && INLINE_SPACE.has(arr[closeStart] as number)) closeStart -= 1;\n closeStart += 1;\n const closeEnd = p.close;\n const closeEmpty = closeStart === closeEnd;\n const closeLanding = closeStart - 1 >= 0 ? (arr[closeStart - 1] as number) : NONE;\n\n // A run is deleted iff non-empty, its landing is in DELETE-LANDING, and it is not\n // simultaneously both of the pair's runs — a pair enclosing nothing but spaces deletes\n // neither (spec 3.5). Unreachable for an accepted pair given pass 2's vacuity condition,\n // but the guard is cheap and the spec states it unconditionally.\n const sameRun = !openEmpty && !closeEmpty && openStart === closeStart && openEnd === closeEnd;\n\n if (!openEmpty && isDeleteLanding(openLanding) && !sameRun) {\n for (let k = openStart; k < openEnd; k += 1) deleteIndices.add(k);\n }\n if (!closeEmpty && isDeleteLanding(closeLanding) && !sameRun) {\n for (let k = closeStart; k < closeEnd; k += 1) deleteIndices.add(k);\n }\n }\n\n return { replace, deleteIndices };\n}\n\n/** Applies a render plan, returning the rendered array and the order-preserving index map. */\nfunction applyRenderPlan(\n arr: readonly number[],\n plan: RenderPlan,\n): { readonly y: number[]; readonly map: readonly number[] } {\n const y: number[] = [];\n const map: number[] = new Array(arr.length).fill(-1);\n for (let i = 0; i < arr.length; i += 1) {\n if (plan.deleteIndices.has(i)) continue;\n map[i] = y.length;\n y.push(plan.replace.get(i) ?? (arr[i] as number));\n }\n return { y, map };\n}\n\nfunction pairKey(open: number, close: number): string {\n return `${open},${close}`;\n}\n\nfunction pairSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) return false;\n for (const key of a) {\n if (!b.has(key)) return false;\n }\n return true;\n}\n\n/**\n * Pass 4 — the certification gate (spec 3.5). The accepted pairing is *checked*, not proved:\n * render the hypothetical output, re-run passes 1–2 on it, and decline pairs until the re-run\n * reproduces the accepted set exactly. Declination is simultaneous per round, and when the\n * intersection fails to shrink `A`, the pair with the greatest `open` index is forced out — both\n * clauses are normative (spec 3.5), so two ports cannot disagree.\n */\nfunction certify(\n arr: readonly number[],\n initialPairs: readonly Pair[],\n ctx: RuleContext,\n skip: SkipSets,\n): Pair[] {\n let accepted: Pair[] = initialPairs.slice();\n // Each round accepts or strictly shrinks `accepted`; it is finite and ∅ accepts\n // unconditionally, so the loop runs at most |A0| + 1 times (spec 3.5). The cap is a defensive\n // safety net, not a normative bound.\n const cap = initialPairs.length + 2;\n\n for (let round = 0; round <= cap; round += 1) {\n if (accepted.length === 0) return accepted;\n\n const plan = computeRenderPlan(arr, accepted, ctx);\n const { y, map } = applyRenderPlan(arr, plan);\n const rederived = pairCandidates(\n y,\n collectCandidates(y, skip, ctx.locale.quotes.elisionIdioms, ctx.locale.quotes.elisionClitics),\n );\n const bSet = new Set(rederived.map((p) => pairKey(p.open, p.close)));\n\n const projected = accepted.map((p) => ({\n open: map[p.open] as number,\n close: map[p.close] as number,\n }));\n const projSet = new Set(projected.map((p) => pairKey(p.open, p.close)));\n\n if (pairSetsEqual(projSet, bSet)) return accepted;\n\n const survivors = accepted.filter((_, idx) => {\n const proj = projected[idx] as { open: number; close: number };\n return bSet.has(pairKey(proj.open, proj.close));\n });\n\n if (survivors.length === accepted.length) {\n let removeIdx = 0;\n for (let i = 1; i < accepted.length; i += 1) {\n if ((accepted[i] as Pair).open > (accepted[removeIdx] as Pair).open) removeIdx = i;\n }\n accepted = accepted.filter((_, i) => i !== removeIdx);\n } else {\n accepted = survivors;\n }\n }\n\n // Unreachable given the termination argument; declines everything rather than looping.\n return [];\n}\n\n/**\n * Pass 5 — emit (spec 3.6). An edit whose replacement equals the span it replaces is never\n * emitted — the invisible-edit principle, applied per mark, not per pair.\n */\nfunction emit(arr: readonly number[], accepted: readonly Pair[], ctx: RuleContext): Edit[] {\n const plan = computeRenderPlan(arr, accepted, ctx);\n const edits: Edit[] = [];\n\n for (const [index, cp] of plan.replace) {\n if (arr[index] === cp) continue;\n edits.push({ start: index, end: index + 1, replacement: [cp], ruleId: \"quotes\" });\n }\n\n const deletions = Array.from(plan.deleteIndices).sort((a, b) => a - b);\n let i = 0;\n while (i < deletions.length) {\n let j = i;\n while (\n j + 1 < deletions.length &&\n (deletions[j + 1] as number) === (deletions[j] as number) + 1\n ) {\n j += 1;\n }\n edits.push({\n start: deletions[i] as number,\n end: (deletions[j] as number) + 1,\n replacement: [],\n ruleId: \"quotes\",\n });\n i = j + 1;\n }\n\n edits.sort((a, b) => a.start - b.start);\n return edits;\n}\n\nexport const quotesRule: Rule = {\n id: \"quotes\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const skip = computeSkipSets(ctx.locale);\n\n const candidates = collectCandidates(\n cp,\n skip,\n ctx.locale.quotes.elisionIdioms,\n ctx.locale.quotes.elisionClitics,\n );\n if (candidates.length === 0) return [];\n\n const initialPairs = pairCandidates(cp, candidates);\n if (initialPairs.length === 0) return [];\n\n const accepted = certify(cp, initialPairs, ctx, skip);\n if (accepted.length === 0) return [];\n\n return emit(cp, accepted, ctx);\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n buildReplacement,\n effectiveNeighbour,\n findDashTokens,\n isDashUnion,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n rangeFlanks,\n sameContent,\n type DashStyle,\n type RangeFlanks,\n} from \"./dash-shared.js\";\n\n/**\n * `ranges` — spec/rules/ranges.md (spec 0.5.0), order 25. Explicit opt-in: off by default\n * (RULE_DEFAULTS in registry.ts). Split out of `dashes` (spec 0.5.0) — see ranges.md 1 and\n * dashes.md 7.11 for why this is opt-in rather than a bounded structural fix: separating a\n * genuine numeric range (`5-10`) from a compound label sharing the identical shape (`Figure\n * 5-10`) needs the preceding word, which is exactly the open-ended, per-locale context this\n * project's rules are built never to consult.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst SOLIDUS = 0x2f;\nconst DIGIT_ZERO = 0x30;\n\n/** ranges.md 3.3 G5: equal-length ASCII digit runs compare lexicographically, so no arithmetic. */\nfunction isNonDecreasing(\n cp: readonly number[],\n leftStart: number,\n rightStart: number,\n length: number,\n): boolean {\n for (let i = 0; i < length; i += 1) {\n const l = cp[leftStart + i] as number;\n const r = cp[rightStart + i] as number;\n if (l < r) return true;\n if (l > r) return false;\n }\n return true;\n}\n\n/**\n * ranges.md 3.2, G1-G5, over the flanks and digit runs ranges.md 3.2a's walk produced.\n *\n * `before` and `after` read past a matched outer closed-up symbol, so G1-G3 judge the text in\n * front of the whole member rather than the symbol itself — which is what declines `US$15-US$20`\n * on G1, where `before` is `S`.\n */\nfunction rangeGuardsPass(cp: readonly number[], flanks: RangeFlanks): boolean {\n const { left, right, a, b, outerLeft, outerRight } = flanks;\n\n const before = effectiveNeighbour(cp, (outerLeft < 0 ? a : outerLeft) - 1, -1);\n const after = effectiveNeighbour(cp, (outerRight < 0 ? b : outerRight) + 1, 1);\n\n // G1 — no letter adjacency.\n if (isLetter(before)) return false;\n // G2 — no chain: an ISO date, an ISBN or a phone number always trips this.\n if (isDashUnion(before)) return false;\n if (isDashUnion(after)) return false;\n // G3 — not part of a decimal or a path.\n if (before === FULL_STOP || before === COMMA || before === SOLIDUS) return false;\n if (after === SOLIDUS) return false;\n // G4 — run lengths. Equal, or the directional (1,2) branch with no leading zero on Rrun.\n const leftLength = left - a + 1;\n const rightLength = b - right + 1;\n if (leftLength === 1 && rightLength === 2 && cp[right] !== DIGIT_ZERO) {\n return true;\n }\n if (leftLength !== rightLength) return false;\n // G5 — non-decreasing.\n return isNonDecreasing(cp, a, right, leftLength);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.range;\n\n for (const token of findDashTokens(cp)) {\n const { left, right, lsp, rsp, spanStart, spanEnd } = token;\n\n // ranges.md 3.2, 3.2a — a range candidate iff both flanks are DIGIT once a matched closed-up\n // symbol has been walked over. `ranges` never processes any other token shape; that is\n // `dashes`' territory, and `dashes` declines a candidate unconditionally too (operator\n // decision, spec 0.5.0) — neither rule reinterprets the other's shape, whether or not\n // `ranges` is enabled.\n const flanks = rangeFlanks(cp, left, right);\n if (flanks === undefined) continue;\n\n if (!rangeGuardsPass(cp, flanks)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1/T2 read the walked flanks, not the raw ones: ranges.md 3.2a makes `cp[L']`/`cp[R']`\n // what every shared guard sees once a closed-up symbol has been consumed.\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, flanks.left, flanks.right)) {\n continue;\n }\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(cp[flanks.right] as number)) continue;\n if (isOpenBracket(cp[flanks.left] as number)) continue;\n }\n\n // ranges.md 3.3.1: never make an edit whose entire content is invisible. Try the unbound\n // replacement first; only add the joiner pair if the dash itself is genuinely changing.\n const unbound = buildReplacement(style, false);\n const onlyBindingWouldChange = !isSpaced(style) && sameContent(cp, spanStart, spanEnd, unbound);\n const bind = !isSpaced(style) && !onlyBindingWouldChange;\n const replacement = bind ? buildReplacement(style, true) : unbound;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"ranges\" });\n }\n\n return edits;\n}\n\nexport const rangesRule: Rule = {\n id: \"ranges\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { isMarker, LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport { isLetter } from \"../engine/unicode.js\";\n\n// spec/rules/spaces.md 3.1. Explicit code points only: no regex, no \\s (ARCHITECTURE.md 4.1).\nconst SPACE = 0x20;\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst VT = 0x0b;\nconst FF = 0x0c;\nconst NEL = 0x85;\nconst LS = 0x2028;\nconst PS = 0x2029;\n\nconst COMMA = 0x2c;\nconst FULL_STOP = 0x2e;\nconst SEMICOLON = 0x3b;\nconst COLON = 0x3a;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\nconst ELLIPSIS = 0x2026;\n\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_OPEN = 0x5b;\nconst SQUARE_CLOSE = 0x5d;\nconst CURLY_OPEN = 0x7b;\nconst CURLY_CLOSE = 0x7d;\n\nconst HYPHEN_MINUS = 0x2d;\nconst CARET = 0x5e;\nconst SOLIDUS = 0x2f;\nconst REVERSE_SOLIDUS = 0x5c;\nconst VERTICAL_LINE = 0x7c;\nconst ASTERISK = 0x2a;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\nconst LETTER_D_UPPER = 0x44;\nconst LETTER_D_LOWER = 0x64;\nconst LETTER_P_UPPER = 0x50;\nconst LETTER_P_LOWER = 0x70;\nconst LETTER_O_UPPER = 0x4f;\nconst LETTER_O_LOWER = 0x6f;\n\n/** `NONE` in the spec: the position one past either end of the array. */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === LF ||\n cp === CR ||\n cp === VT ||\n cp === FF ||\n cp === NEL ||\n cp === LS ||\n cp === PS ||\n cp === LINE_MARKER\n );\n}\n\n/**\n * Six code points. U+2026 is deliberately absent: with it, `Wait ...` would keep its space\n * here, `ellipsis` would yield `Wait …`, and a second pipeline pass would then strip that\n * space — a composition divergence (spec/rules/spaces.md 3.4).\n */\nfunction isStripBefore(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === SEMICOLON ||\n cp === COLON ||\n cp === EXCLAMATION ||\n cp === QUESTION\n );\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === FULL_STOP || cp === ELLIPSIS;\n}\n\nfunction isOpenBracket(cp: number): boolean {\n return cp === PAREN_OPEN || cp === SQUARE_OPEN || cp === CURLY_OPEN;\n}\n\nfunction isCloseBracket(cp: number): boolean {\n return cp === PAREN_CLOSE || cp === SQUARE_CLOSE || cp === CURLY_CLOSE;\n}\n\nfunction matchingCloser(open: number): number {\n if (open === PAREN_OPEN) return PAREN_CLOSE;\n if (open === SQUARE_OPEN) return SQUARE_CLOSE;\n return CURLY_CLOSE;\n}\n\n/** spec/rules/spaces.md 3.3: `- [ ] item` must not become `- [] item`. It may still collapse. */\nfunction isEmptyBracketGuarded(left: number, right: number): boolean {\n return isOpenBracket(left) && right === matchingCloser(left);\n}\n\n/**\n * The replacement length is a pure function of the two bounding code points, computed once\n * (spec/rules/spaces.md 3.2 step 5). A two-pass \"collapse then strip\" formulation would need a\n * fixed-point loop, which two runtimes would iterate differently.\n */\n/**\n * spec/rules/spaces.md 3.4. A run of dots is a different token from a terminal full stop — a\n * relative path, a truncation, a typed ellipsis — and deleting the space before it merges the\n * run with a preceding abbreviation dot (`See ../docs` → `See../docs`).\n *\n * A single dot followed directly by a letter or an ASCII digit starts a token too (`.NET`,\n * `.gitignore`, `.5` — spec 1.2.0's word-start clause), so the space before it is not deleted.\n * A span boundary marker after the dot is neither, and the dot stays terminal.\n *\n * `e` indexes `right` in the **input** array, and the run is measured there. Measuring it after\n * any edit had been applied would break the Chicago spaced ellipsis `Hello . . .`, where every\n * dot is a lone dot at decision time and all three spaces must still strip.\n */\nfunction isLoneDot(cp: readonly number[], e: number): boolean {\n if (at(cp, e) !== FULL_STOP) return true;\n const next = at(cp, e + 1);\n if (isLetter(next) || isDigitAscii(next)) return false;\n return !isDotlike(next);\n}\n\nfunction isDigitAscii(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** spec/rules/spaces.md 3.6: the recognised \"mouth\" glyphs of a Western text emoticon. */\nfunction isEmoticonMouth(cp: number): boolean {\n return (\n cp === PAREN_OPEN ||\n cp === PAREN_CLOSE ||\n cp === SQUARE_OPEN ||\n cp === SQUARE_CLOSE ||\n cp === LETTER_D_UPPER ||\n cp === LETTER_D_LOWER ||\n cp === LETTER_P_UPPER ||\n cp === LETTER_P_LOWER ||\n cp === LETTER_O_UPPER ||\n cp === LETTER_O_LOWER ||\n cp === SOLIDUS ||\n cp === REVERSE_SOLIDUS ||\n cp === VERTICAL_LINE ||\n cp === ASTERISK\n );\n}\n\n/**\n * spec/rules/spaces.md 3.6, the emoticon guard. A colon or semicolon immediately followed by\n * an optional \"nose\" and a recognised \"mouth\" is the eye of a Western text emoticon\n * (`:-)`, `:)`, `;-)`), not sentence punctuation, and the space in front of it must survive.\n *\n * The mouth must not itself run into a letter or a digit — `:Deal` is a colon before a\n * capitalised word, not a face — which is the one check needed to keep this from firing on\n * ordinary prose. `e` indexes `right`, exactly as `isLoneDot` does.\n */\nfunction isEmoticon(cp: readonly number[], e: number): boolean {\n const eye = at(cp, e);\n if (eye !== COLON && eye !== SEMICOLON) return false;\n\n let i = e + 1;\n const nose = at(cp, i);\n if (nose === HYPHEN_MINUS || nose === CARET) i += 1;\n\n if (!isEmoticonMouth(at(cp, i))) return false;\n i += 1;\n\n const after = at(cp, i);\n return !isLetter(after) && !isDigitAscii(after);\n}\n\n/**\n * spec/rules/spaces.md 3.6, the mouth side. `(` and `[` are EMOTICON-MOUTH members and\n * OPEN-BRACKET members at once, so without this the opening-bracket clause deleted the space\n * after an emoticon the eye side had just recognised: `a :( b` became `a :(b`, and then `a:(b`\n * on a second pass, because a letter after the mouth stops the eye side firing.\n *\n * The walk is the eye side's, backwards from `s`, and it needs no trailing check: the code point\n * after the mouth is the space run itself, which is neither a letter nor a digit. A nose with no\n * eye behind it is not a face — EMOTICON-NOSE and EMOTICON-EYE are disjoint, so the walk cannot\n * mistake one for the other.\n */\nfunction isEmoticonEnd(cp: readonly number[], s: number): boolean {\n if (!isEmoticonMouth(at(cp, s - 1))) return false;\n\n let j = s - 2;\n const nose = at(cp, j);\n if (nose === HYPHEN_MINUS || nose === CARET) j -= 1;\n\n const eye = at(cp, j);\n return eye === COLON || eye === SEMICOLON;\n}\n\nfunction replacementLength(\n cp: readonly number[],\n s: number,\n e: number,\n left: number,\n right: number,\n): number {\n // The guard is a clause of this decision, not a \"skip the run\" branch: `( )` collapses to\n // `( )` (spec/rules/spaces.md 3.3, normative reading).\n if (isEmptyBracketGuarded(left, right)) return 1;\n if (isOpenBracket(left) && !isEmoticonEnd(cp, s)) return 0;\n if (isCloseBracket(right)) return 0;\n if (isStripBefore(right) && isLoneDot(cp, e) && !isEmoticon(cp, e)) return 0;\n return 1;\n}\n\nexport const spacesRule: Rule = {\n id: \"spaces\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (at(cp, i) !== SPACE) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && at(cp, e) === SPACE) e += 1;\n const k = e - s;\n\n const left = at(cp, s - 1);\n const right = at(cp, e);\n\n // Boundary guard: indentation, Markdown hard breaks and text-unit edges are structural.\n // A span boundary is a text-unit edge: spaces.md 3.2 step 4 protects \"trailing spaces at\n // the end of a text unit, which in `html` mode are frequently the only separator between\n // two inline elements\", and in the concatenated array that edge is a marker rather than\n // `NONE`. Only this guard treats a marker that way; everywhere else in this rule the\n // marker is opaque content, per modes.md 3.3.\n if (\n left === NONE ||\n isMarker(left) ||\n isBreak(left) ||\n right === NONE ||\n isMarker(right) ||\n isBreak(right)\n ) {\n i = e;\n continue;\n }\n\n const length = replacementLength(cp, s, e, left, right);\n if (length !== k) {\n edits.push({\n start: s,\n end: e,\n replacement: length === 0 ? [] : [SPACE],\n ruleId: \"spaces\",\n });\n }\n i = e;\n }\n\n return edits;\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/symbols.md 3.1.\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\n\nconst COPYRIGHT = 0xa9;\nconst REGISTERED = 0xae;\nconst TRADEMARK = 0x2122;\nconst MULTIPLICATION = 0xd7;\n\nconst SPACE = 0x20;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\n\nconst LOWER_X = 0x78;\nconst UPPER_X = 0x58;\nconst CYRILLIC_LOWER_HA = 0x445;\nconst CYRILLIC_UPPER_HA = 0x425;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PLUS = 0x2b;\nconst SOLIDUS = 0x2f;\nconst HYPHEN_MINUS = 0x2d;\nconst PLUS_MINUS = 0xb1;\nconst SQUARE_OPEN = 0x5b;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Every accepted spelling is enumerated. Case folding is forbidden here: `toLowerCase` is\n * locale-dependent in the host process and `(TM)` would behave differently under a Turkish\n * locale (ARCHITECTURE.md 4.4). Longest literals first (spec/rules/symbols.md 3.2 step 1).\n */\ninterface TrademarkRow {\n readonly literal: readonly number[];\n readonly to: number;\n /** S1 applies to the `(c)` and `(r)` rows only (spec/rules/symbols.md 3.2 step 3). */\n readonly guardedByS1: boolean;\n}\n\nconst TRADEMARK_TABLE: readonly TrademarkRow[] = [\n { literal: [PAREN_OPEN, 0x74, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tm)\n { literal: [PAREN_OPEN, 0x54, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (TM)\n { literal: [PAREN_OPEN, 0x54, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (Tm)\n { literal: [PAREN_OPEN, 0x74, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tM)\n { literal: [PAREN_OPEN, 0x63, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (c)\n { literal: [PAREN_OPEN, 0x43, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (C)\n { literal: [PAREN_OPEN, 0x72, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (r)\n { literal: [PAREN_OPEN, 0x52, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (R)\n];\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\nfunction isSpaceLike(cp: number): boolean {\n return cp === SPACE || cp === NBSP || cp === NNBSP;\n}\n\n/**\n * `MUL-LETTER`, spec/rules/symbols.md 3.1: four code points, enumerated, no locale data. The\n * Cyrillic pair is unconditional — U+0445 between two ASCII digits is a Russian dimension typed\n * on a Cyrillic layout or keyboard debris, there is no third reading, and the glyphs are\n * identical to the Latin ones in every font, so no human review can catch it.\n */\nfunction isMulLetter(cp: number): boolean {\n return cp === LOWER_X || cp === UPPER_X || cp === CYRILLIC_LOWER_HA || cp === CYRILLIC_UPPER_HA;\n}\n\nfunction matchesAt(cp: readonly number[], i: number, literal: readonly number[]): boolean {\n if (i + literal.length > cp.length) return false;\n for (let j = 0; j < literal.length; j += 1) {\n if (at(cp, i + j) !== literal[j]) return false;\n }\n return true;\n}\n\n/** Returns the edit, or `null` when a guard rejects the candidate. */\nfunction trademarkAt(cp: readonly number[], i: number): Edit | null {\n for (const row of TRADEMARK_TABLE) {\n if (!matchesAt(cp, i, row.literal)) continue;\n const end = i + row.literal.length;\n const before = at(cp, i - 1);\n const after = at(cp, end);\n\n // S1 — left adjacency, for the `(c)` and `(r)` rows only: a one-letter argument list is\n // common, `(tm)` tucked against a product name is not a call. ©, ® and ™ are listed so\n // that `(c)(r)` converges in one run (spec/rules/symbols.md 5).\n if (\n row.guardedByS1 &&\n before !== NONE &&\n (isAlnum(before) ||\n before === PAREN_CLOSE ||\n before === SQUARE_CLOSE ||\n before === COPYRIGHT ||\n before === REGISTERED ||\n before === TRADEMARK)\n ) {\n return null;\n }\n // S2 — right adjacency: `(r)evolution`.\n if (after !== NONE && isAlnum(after)) return null;\n // S3 — no nesting: `((c))` is ASCII art or code.\n if (before === PAREN_OPEN) return null;\n\n return { start: i, end, replacement: [row.to], ruleId: \"symbols\" };\n }\n return null;\n}\n\ninterface ChainLink {\n readonly letterIndex: number;\n readonly leftSpace: 0 | 1;\n readonly rightSpace: 0 | 1;\n}\n\ninterface Chain {\n /** Index of the last code point read, whether or not any link was completed. */\n readonly end: number;\n readonly links: readonly ChainLink[];\n readonly firstRunEnd: number;\n}\n\n/**\n * `DIGIT+ (MUL-LETTER DIGIT+)+`, read from the start of a maximal digit run at `a`\n * (spec/rules/symbols.md 3.3 step 1). Reading the whole chain up front is what lets step 8\n * convert every link in one pass; a pairwise test cannot be made idempotent here by any amount\n * of guarding, because it converts one operator per pass (spec 5, 7.10).\n */\nfunction readChain(cp: readonly number[], a: number): Chain {\n let p = a;\n while (isDigit(at(cp, p))) p += 1;\n const firstRunEnd = p - 1;\n const links: ChainLink[] = [];\n let end = p - 1;\n\n for (;;) {\n let q = p;\n let leftSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n leftSpace = 1;\n q += 1;\n }\n if (!isMulLetter(at(cp, q))) break;\n const letterIndex = q;\n q += 1;\n let rightSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n rightSpace = 1;\n q += 1;\n }\n if (!isDigit(at(cp, q))) break;\n while (isDigit(at(cp, q))) q += 1;\n links.push({ letterIndex, leftSpace, rightSpace });\n end = q - 1;\n p = q;\n }\n\n return { end, links, firstRunEnd };\n}\n\n/** `null` when a guard declines the chain — always the whole chain, never a subset. */\nfunction chainEdits(cp: readonly number[], a: number, chain: Chain): Edit[] | null {\n const links = chain.links;\n const first = links[0];\n if (first === undefined) return null;\n\n // M1 — each link symmetric, and every link agreeing. `5x4 x 3` is ambiguous and is declined\n // whole rather than half-converted.\n const sp = first.leftSpace;\n for (const link of links) {\n if (link.leftSpace !== link.rightSpace) return null;\n if (link.leftSpace !== sp) return null;\n }\n\n // M2/M3 — the chain's OUTER boundaries, not each link. Applying them per link is what made\n // the pairwise form reject chains: the letter past the middle digit run is itself a\n // MUL-LETTER, hence a LETTER.\n const before = at(cp, a - 1);\n const after = at(cp, chain.end + 1);\n if (before !== NONE && isLetter(before)) return null;\n if (after !== NONE && isLetter(after)) return null;\n\n // M4 — hexadecimal literal. Latin-lowercase only: a hex literal is never written with\n // Cyrillic. Inspects the first link alone.\n if (\n sp === 0 &&\n at(cp, first.letterIndex) === LOWER_X &&\n chain.firstRunEnd === a &&\n at(cp, a) === DIGIT_ZERO\n ) {\n return null;\n }\n\n // There is no M5. It was removed rather than extended (spec 3.3 step 7, 7.3).\n const edits: Edit[] = [];\n for (const link of links) {\n const j = link.letterIndex;\n const replacement =\n sp === 0 ? [MULTIPLICATION] : [at(cp, j - 1), MULTIPLICATION, at(cp, j + 1)];\n edits.push({ start: j - sp, end: j + sp + 1, replacement, ruleId: \"symbols\" });\n }\n return edits;\n}\n\n/** spec/rules/symbols.md 3.4. Only the literal `+/-`; the bare `+-` is never converted. */\nfunction plusMinusAt(cp: readonly number[], i: number): Edit | null {\n if (at(cp, i + 1) !== SOLIDUS || at(cp, i + 2) !== HYPHEN_MINUS) return null;\n // F1 — `[+/-]` is a regular-expression character class.\n if (at(cp, i - 1) === SQUARE_OPEN) return null;\n // F2 — numeric context, with one optional intervening space so `+/-5` and `+/- 5` both work.\n // Without it, prose that names the characters (`lines marked +/- were edited`) is corrupted.\n let j = i + 3;\n if (at(cp, j) === SPACE) j += 1;\n if (!isDigit(at(cp, j))) return null;\n return { start: i, end: i + 3, replacement: [PLUS_MINUS], ruleId: \"symbols\" };\n}\n\nexport const symbolsRule: Rule = {\n id: \"symbols\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n const current = at(cp, i);\n\n if (current === PAREN_OPEN) {\n const edit = trademarkAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n } else if (isDigit(current) && !isDigit(at(cp, i - 1))) {\n // Keyed on the start of a maximal digit run, not on the letter.\n const chain = readChain(cp, i);\n const chainResult = chainEdits(cp, i, chain);\n if (chainResult !== null) for (const edit of chainResult) edits.push(edit);\n // Continue past the chain whether or not it converted. A declined chain has no\n // convertible sub-chain: any sub-chain starts right after a MUL-LETTER, which is a\n // LETTER, so M2 rejects it.\n i = chain.end + 1;\n continue;\n } else if (current === PLUS) {\n const edit = plusMinusAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n }\n i += 1;\n }\n\n return edits;\n },\n};\n","import type { Rule, RuleId } from \"../types.js\";\nimport { apostropheRule } from \"./apostrophe.js\";\nimport { dashesRule } from \"./dashes.js\";\nimport { ellipsisRule } from \"./ellipsis.js\";\nimport { hyphenRule } from \"./hyphen.js\";\nimport { nbspRule } from \"./nbsp.js\";\nimport { quotesRule } from \"./quotes.js\";\nimport { rangesRule } from \"./ranges.js\";\nimport { spacesRule } from \"./spaces.js\";\nimport { symbolsRule } from \"./symbols.js\";\n\n/**\n * Mirrors spec/rules/order.json, ascending by `order`. The pipeline must not depend on\n * registration order or map iteration order — Go randomizes the latter (ARCHITECTURE.md 4.5).\n * tests/engine/pipeline.test.ts asserts this list against the spec file.\n *\n * `ranges` sits at order 25, between `ellipsis` (20) and `dashes` (30) — chosen from an observed\n * behavioural difference, not for convenience (dashes.md 7.11, ranges.md 4). A dedicated\n * adjacency stress battery (a parenthetical dash directly touching a range: `a - 5-10`) found\n * that the two orders genuinely disagree: `ranges`-before-`dashes` converts both tokens\n * (`a—5⁠–⁠10`), matching what the single unified pre-0.5.0 `dashes` rule produced (its one scan\n * evaluated every token's cross-token guards — G2 in particular — against the *original*,\n * unedited input, since all edits were collected before any were applied). `dashes`-before-`ranges`\n * instead has `dashes` remove the space between the parenthetical dash and the range's digit run\n * first, which then makes `ranges`' own G2 (\"no chain\") guard see a dash immediately adjacent to\n * the range and decline it (`a—5-10`) — a regression against the pre-split rule's own behaviour,\n * introduced purely by which rule happens to run first, not by anything in either rule's own\n * guards changing. `ranges`-before-`dashes` is the order that stays faithful to what one combined\n * pass already did; see tests/rules/ranges.test.ts's \"adjacency order\" cases for the reproduction.\n */\nexport const RULE_ORDER: readonly RuleId[] = [\n \"spaces\",\n \"ellipsis\",\n \"ranges\",\n \"dashes\",\n \"hyphen\",\n \"quotes\",\n \"apostrophe\",\n \"symbols\",\n \"nbsp\",\n];\n\n/**\n * From the `default` field of spec/rules/order.json. Every rule except `ranges` defaults on;\n * `ranges` (spec 0.5.0) is the first rule to default off — see `rule-runner.ts`'s `planRules`\n * for how `Options.rules` resolves a default-off rule's explicit `true`.\n */\nexport const RULE_DEFAULTS: Readonly<Record<RuleId, boolean>> = {\n spaces: true,\n ellipsis: true,\n ranges: false,\n dashes: true,\n hyphen: true,\n quotes: true,\n apostrophe: true,\n symbols: true,\n nbsp: true,\n};\n\n/** Rule implementations, keyed by id. Partial until every rule lands. */\nexport const RULES: Readonly<Partial<Record<RuleId, Rule>>> = {\n spaces: spacesRule,\n ellipsis: ellipsisRule,\n ranges: rangesRule,\n dashes: dashesRule,\n hyphen: hyphenRule,\n quotes: quotesRule,\n apostrophe: apostropheRule,\n symbols: symbolsRule,\n nbsp: nbspRule,\n};\n\nexport function isRuleId(value: string): value is RuleId {\n return (RULE_ORDER as readonly string[]).includes(value);\n}\n","import { PolytypoError } from \"../errors.js\";\nimport type { Edit, RuleId } from \"../types.js\";\nimport { isValidCodePoint } from \"./codepoints.js\";\n\nfunction reject(message: string): never {\n throw new PolytypoError(\"POLYTYPO_RULE_CONTRACT\", message);\n}\n\n/**\n * Rules are community-contributed, so the contract is enforced rather than trusted: edits must\n * be in bounds, ascending, non-overlapping, and made of real code points.\n */\nexport function validateEdits(edits: readonly Edit[], length: number, ruleId?: RuleId): void {\n let previousEnd = 0;\n let i = -1;\n for (const edit of edits) {\n i += 1;\n const where = ruleId === undefined ? `edit ${i}` : `rule \"${ruleId}\" edit ${i}`;\n\n if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end)) {\n reject(`${where} has non-integer bounds (${edit.start}, ${edit.end})`);\n }\n if (edit.start < 0 || edit.end > length) {\n reject(`${where} is out of bounds (${edit.start}, ${edit.end}) for length ${length}`);\n }\n if (edit.end < edit.start) {\n reject(`${where} has end ${edit.end} before start ${edit.start}`);\n }\n if (edit.start < previousEnd) {\n reject(`${where} starts at ${edit.start}, which overlaps or precedes the previous edit`);\n }\n if (ruleId !== undefined && edit.ruleId !== ruleId) {\n reject(`${where} is tagged \"${edit.ruleId}\" but was produced by rule \"${ruleId}\"`);\n }\n for (const value of edit.replacement) {\n if (!isValidCodePoint(value)) {\n reject(`${where} contains an invalid code point (${value})`);\n }\n }\n previousEnd = edit.end;\n }\n}\n\n/** Applies validated edits left to right, producing a new code-point array. */\nexport function applyEdits(\n cp: readonly number[],\n edits: readonly Edit[],\n ruleId?: RuleId,\n): number[] {\n validateEdits(edits, cp.length, ruleId);\n if (edits.length === 0) return cp.slice();\n\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (const value of cp.slice(cursor, edit.start)) out.push(value);\n for (const value of edit.replacement) out.push(value);\n cursor = edit.end;\n }\n for (const value of cp.slice(cursor)) out.push(value);\n return out;\n}\n","import type { Edit, RuleId } from \"../types.js\";\nimport { fromCodePoints } from \"./codepoints.js\";\n\n/**\n * analyze.md §2: every reported offset is a code-point offset into the input the caller passed,\n * in every mode. The rules, however, run over an array that is not the input — in `text` mode\n * edits from earlier rules have already shifted it, and in `html`/`markdown` mode it is the\n * marker-joined concatenation of the processable spans (modes.md §3.5). This module carries the\n * one structure that bridges the two: an origin map, parallel to the current code-point array,\n * holding the input offset each code point came from, or NO_ORIGIN for one the pipeline itself\n * produced.\n */\nexport const NO_ORIGIN = -1;\n\n/**\n * The input offset an edit boundary at `index` addresses. Synthetic code points have no origin\n * of their own, so the scan runs forward to the first that has one — an insertion between two\n * earlier insertions still lands where the next real character is. Falling off the end means the\n * boundary is at the end of the input.\n */\nexport function originAt(origin: readonly number[], index: number, inputLength: number): number {\n for (let i = index; i < origin.length; i += 1) {\n const value = origin[i] as number;\n if (value !== NO_ORIGIN) return value;\n }\n return inputLength;\n}\n\n/**\n * The origin map for the array `applyEdits` is about to produce. A replacement of equal length\n * keeps its origins position by position, which is what makes a conversion (U+0020 → U+00A0)\n * still point at the character it converted; anything longer is synthetic beyond the positions\n * it covers.\n */\nexport function applyEditsToOrigin(origin: readonly number[], edits: readonly Edit[]): number[] {\n if (edits.length === 0) return origin.slice();\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (let i = cursor; i < edit.start; i += 1) out.push(origin[i] as number);\n for (let k = 0; k < edit.replacement.length; k += 1) {\n const source = edit.start + k;\n out.push(source < edit.end ? (origin[source] as number) : NO_ORIGIN);\n }\n cursor = edit.end;\n }\n for (let i = cursor; i < origin.length; i += 1) out.push(origin[i] as number);\n return out;\n}\n\n/** One entry of `analyze`'s result, in input coordinates (analyze.md §2). */\nexport interface Change {\n readonly ruleId: RuleId;\n readonly start: number;\n readonly end: number;\n readonly before: string;\n readonly after: string;\n}\n\n/**\n * One rule's edits, in the coordinates that rule saw, rendered as Changes in input coordinates.\n * `before` is the text this rule replaced and `after` what it replaced it with (analyze.md §2),\n * so on a text two rules have both touched, `before` is what the second rule saw rather than\n * what the caller typed — §5 says so and shows the French case where it matters.\n */\nexport function recordChanges(\n cp: readonly number[],\n edits: readonly Edit[],\n origin: readonly number[],\n inputLength: number,\n ruleId: RuleId,\n): Change[] {\n return edits.map((edit) => ({\n ruleId,\n start: originAt(origin, edit.start, inputLength),\n end: originAt(origin, edit.end, inputLength),\n before: fromCodePoints(cp.slice(edit.start, edit.end)),\n after: fromCodePoints(edit.replacement),\n }));\n}\n","import { PolytypoError } from \"../errors.js\";\nimport { isRuleId, RULES, RULE_DEFAULTS, RULE_ORDER } from \"../rules/registry.js\";\nimport type { Edit, LocaleData, Mode, Options, RuleId } from \"../types.js\";\nimport { applyEdits } from \"./edits.js\";\nimport { applyEditsToOrigin, recordChanges, type Change } from \"./origin.js\";\n\n/**\n * The rules that will run, in spec order. An explicit `false` always disables a rule and an\n * absent key always means \"use that rule's own default\" (RULE_DEFAULTS in registry.ts) —\n * unchanged since spec 0.4.1. Spec 0.5.0 adds the other half: an explicit `true` on a\n * default-off rule (`ranges`, the first one) turns it on. This is not a \"one option is now\n * opt-in, opt-out for the rest\" special case — it is the same single rule applied uniformly:\n * `override ?? RULE_DEFAULTS[id]`. For every rule but `ranges`, `RULE_DEFAULTS[id]` is already\n * `true`, so an explicit `true` there was always a no-op (tests/engine/pipeline.test.ts still\n * asserts that), and the only thing that changes is which rules *can* have a meaningful `true`.\n * Disabling a rule removes it from the sequence and never reorders the rest (ARCHITECTURE.md\n * 4.5).\n */\nexport function planRules(rules: Options[\"rules\"]): RuleId[] {\n const overrides = new Map<RuleId, boolean>();\n if (rules !== undefined) {\n for (const [key, value] of Object.entries(rules)) {\n if (!isRuleId(key)) {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_RULE\",\n `Unknown rule \"${key}\". Known rules: ${RULE_ORDER.join(\", \")}.`,\n );\n }\n overrides.set(key, value);\n }\n }\n return RULE_ORDER.filter((id) => overrides.get(id) ?? RULE_DEFAULTS[id]);\n}\n\n/**\n * Rules report edits and the pipeline applies them; no rule ever touches a string\n * (ARCHITECTURE.md 7.1). Each rule sees the output of the previous one.\n */\nexport function runRules(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n): readonly number[] {\n let current = cp;\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n current = applyEdits(current, rule.apply({ cp: current, locale, mode, narrowTarget }), id);\n }\n return current;\n}\n\n/**\n * `runRules`, keeping the edits instead of discarding them (analyze.md §1: same pipeline, same\n * order, reporting rather than applying). The origin map travels alongside the array so every\n * change comes back in input coordinates, and `filterEdits` is the hook the span runner needs\n * for modes.md §3.4's boundary filters — text mode passes nothing and gets the identity.\n */\nexport function runRulesRecording(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n origin: readonly number[],\n inputLength: number,\n filterEdits?: (current: readonly number[], edits: readonly Edit[]) => readonly Edit[],\n): Change[] {\n let current = cp;\n let currentOrigin = origin;\n const changes: Change[] = [];\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n const produced = rule.apply({ cp: current, locale, mode, narrowTarget });\n const edits = filterEdits === undefined ? produced : filterEdits(current, produced);\n if (edits.length > 0) {\n changes.push(...recordChanges(current, edits, currentOrigin, inputLength, id));\n currentOrigin = applyEditsToOrigin(currentOrigin, edits);\n }\n current = applyEdits(current, edits, id);\n }\n return changes;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/polytypo-js/polytypo-js/dist/chunk-FMU74VA6.cjs","../src/errors.ts","../src/engine/codepoints.ts","../src/generated/locales.ts","../src/engine/locale.ts","../src/engine/narrow-target.ts","../src/engine/letter-ranges.json","../src/engine/unicode.ts","../src/engine/sentinels.ts","../src/rules/apostrophe.ts","../src/rules/dash-shared.ts","../src/rules/dashes.ts","../src/rules/ellipsis.ts","../src/rules/hyphen.ts","../src/rules/nbsp.ts","../src/rules/quote-ambiguity.ts","../src/rules/quotes.ts","../src/rules/ranges.ts","../src/rules/spaces.ts","../src/rules/symbols.ts","../src/rules/registry.ts","../src/engine/edits.ts","../src/engine/origin.ts","../src/engine/rule-runner.ts"],"names":["HYPHEN","DIGIT_ZERO","DIGIT_NINE","isDigit","bind","at","HYPHEN_MINUS","scan","a","SPACE","FULL_STOP","EN_DASH","EM_DASH","isAlnum","isBreak","SQ","INLINE_SPACE","SPACELIKE","OPENISH","CLOSEISH","COMMA","SEMICOLON","EXCLAMATION","QUESTION","ELLIPSIS","PAREN_OPEN","PAREN_CLOSE","SQUARE_OPEN","SQUARE_CLOSE","SOLIDUS","isDotlike","isOpenBracket","NBSP","NNBSP","isSpaceLike","matchesAt"],"mappings":"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EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EACxF,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,GAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAC1F,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EACtF,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAC3F,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACtF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACxF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ;AAClD,CAAA;AN0jDA;AACA;AO5oDO,IAAM,cAAA,EAAmC,qBAAA;AAGzC,SAAS,QAAA,CAAS,EAAA,EAAqB;AAC5C,EAAA,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA;AACnB,EAAA,GAAA,CAAI,GAAA,EAAK,GAAA,EAAM,OAAQ,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA,GAAU,GAAA,GAAM,GAAA,GAAQ,GAAA,GAAM,GAAA;AACzE,EAAA,IAAI,GAAA,EAAK,CAAA;AACT,EAAA,IAAI,GAAA,EAAK,aAAA,CAAc,OAAA,EAAS,EAAA,EAAI,CAAA;AACpC,EAAA,MAAA,CAAO,GAAA,GAAM,EAAA,EAAI;AACf,IAAA,MAAM,IAAA,EAAO,GAAA,EAAK,GAAA,GAAO,CAAA;AACzB,IAAA,MAAM,MAAA,EAAQ,aAAA,CAAc,IAAA,EAAM,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,EAAM,aAAA,CAAc,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KAAA,GAAA,CAClB,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,CAAA;AAAA,IAAA,KACzB,OAAO,IAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA;AACT;AAWO,IAAM,aAAA,EAAkC;AAAA,EAC7C,EAAA;AAAA,EAAM,EAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC5F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAC3F,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAC3F,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAO,IAAA;AAAA,EAAQ,IAAA;AAAA,EACrF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EAAQ,IAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EAAQ,KAAA;AAAA,EACxF,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAC1F,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAAS,KAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAC1F,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAAA,EAAS,MAAA;AAA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,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACxF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EACxF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EAAM,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,KAAA;AAAA,EAAO,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA,EAAG,CAAA,GAAA;AAAA,EACvF,GAAA;AAAA,EAAO,GAAA;AAAA,EAAO,CAAA;AAAA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A,IAAA;AACF,EAAA;AACF;AnB4wKU;AACA;AoB//KG;AACX,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACF;AAOa;AACH,EAAA;AACR,EAAA;AACQ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACR,EAAA;AACA,EAAA;AACM,EAAA;AACR;AAGa;AACH,EAAA;AACR,EAAA;AACQ,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACR,EAAA;AACA,EAAA;AACM,EAAA;AACR;AAEgB;AACN,EAAA;AACV;ApBw/KU;AACA;AqB/jLD;AACD,EAAA;AACR;AAMgB;AACV,EAAA;AACI,EAAA;AACR,EAAA;AACO,IAAA;AACC,IAAA;AAED,IAAA;AACH,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACI,IAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACM,MAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAGgB;AAKd,EAAA;AACI,EAAA;AAEE,EAAA;AACF,EAAA;AACJ,EAAA;AACE,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACA,EAAA;AACO,EAAA;AACT;ArBojLU;AACA;AsBtmLG;AAQG;AACd,EAAA;AACQ,IAAA;AACF,IAAA;AACN,EAAA;AACO,EAAA;AACT;AAQgB;AACV,EAAA;AACE,EAAA;AACF,EAAA;AACJ,EAAA;AACE,IAAA;AACA,IAAA;AACE,MAAA;AACI,MAAA;AACN,IAAA;AACA,IAAA;AACF,EAAA;AACA,EAAA;AACO,EAAA;AACT;AAiBgB;AAOP,EAAA;AACL,IAAA;AACA,IAAA;AACK,IAAA;AACL,IAAA;AACA,IAAA;AACA,EAAA;AACJ;AtBokLU;AACA;AuBloLM;AACR,EAAA;AACF,EAAA;AACF,IAAA;AACM,MAAA;AACF,QAAA;AACE,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAMgB;AAOV,EAAA;AACJ,EAAA;AACQ,IAAA;AACF,IAAA;AACJ,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAQgB;AAUV,EAAA;AACA,EAAA;AACE,EAAA;AACN,EAAA;AACQ,IAAA;AACF,IAAA;AACE,IAAA;AACA,IAAA;AACF,IAAA;AACF,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AACO,EAAA;AACT;AvBymLU;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/polytypo-js/polytypo-js/dist/chunk-FMU74VA6.cjs","sourcesContent":[null,"export type PolytypoErrorCode =\n | \"POLYTYPO_UNKNOWN_LOCALE\"\n | \"POLYTYPO_INVALID_MODE\"\n | \"POLYTYPO_INVALID_DIALECT\"\n | \"POLYTYPO_UNKNOWN_RULE\"\n | \"POLYTYPO_MALFORMED_LOCALE_DATA\"\n | \"POLYTYPO_RULE_CONTRACT\"\n | \"POLYTYPO_MALFORMED_INPUT\"\n | \"POLYTYPO_INVALID_OPTION\";\n\n/** Codes are the contract across all five runtimes; messages are English and are not (ARCHITECTURE.md 4.6). */\nexport class PolytypoError extends Error {\n readonly code: PolytypoErrorCode;\n\n constructor(code: PolytypoErrorCode, message: string) {\n super(message);\n this.name = \"PolytypoError\";\n this.code = code;\n }\n}\n","/**\n * The engine indexes Unicode code points, never UTF-16 units: a JS string, a Go string and a\n * PHP string disagree about \"characters\" outside the BMP (ARCHITECTURE.md 4.2). Conversion\n * happens once on entry and once on exit.\n *\n * Unpaired surrogates are carried through as their own code point, so text that is not\n * well-formed UTF-16 still round-trips byte-for-byte instead of being silently repaired.\n */\nexport function toCodePoints(input: string): number[] {\n const out: number[] = [];\n const len = input.length;\n let i = 0;\n while (i < len) {\n const unit = input.charCodeAt(i);\n if (unit >= 0xd800 && unit <= 0xdbff && i + 1 < len) {\n const next = input.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n out.push((unit - 0xd800) * 0x400 + (next - 0xdc00) + 0x10000);\n i += 2;\n continue;\n }\n }\n out.push(unit);\n i += 1;\n }\n return out;\n}\n\nconst CHUNK = 4096;\n\nexport function fromCodePoints(cp: readonly number[]): string {\n if (cp.length === 0) return \"\";\n if (cp.length <= CHUNK) return String.fromCodePoint(...cp);\n let out = \"\";\n for (let i = 0; i < cp.length; i += CHUNK) {\n out += String.fromCodePoint(...cp.slice(i, i + CHUNK));\n }\n return out;\n}\n\nexport function isValidCodePoint(value: number): boolean {\n return Number.isInteger(value) && value >= 0 && value <= 0x10ffff;\n}\n","// Generated by scripts/gen-locales.mjs — do not edit. Run `npm run gen`.\n// Source: spec/locales/*.json + spec/locales/registry.json\n\nimport type { LocaleData } from \"../types.js\";\n\nexport const SPEC_VERSION = \"1.7.0\";\n\nexport const KNOWN_LOCALES: readonly string[] = [\n \"cs\",\n \"de-CH\",\n \"de-DE\",\n \"el\",\n \"en-GB\",\n \"en-US\",\n \"es\",\n \"fi\",\n \"fr\",\n \"fr-CA\",\n \"it\",\n \"nl\",\n \"pl\",\n \"pt-BR\",\n \"pt-PT\",\n \"ru\",\n \"sv\",\n \"tr\",\n \"uk\",\n];\n\nexport const ALIASES: Readonly<Record<string, string>> = {\n de: \"de-DE\",\n en: \"en-US\",\n pt: \"pt-PT\",\n};\n\nexport const LOCALES: Readonly<Record<string, LocaleData>> = {\n cs: { locale: \"cs\", name: \"Czech\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"k\", \"o\", \"s\", \"u\", \"v\", \"z\"], abbreviations: [\"a. s.\", \"s. r. o.\"], beforeUnits: [\"%\", \"\\u00B0C\", \"ha\", \"kg\", \"km\", \"cm\", \"mm\", \"m\\u00B2\", \"kWh\", \"km/h\", \"str.\", \"hod.\"], beforeNumber: [], beforeWord: [\"tj.\", \"tzv.\", \"tzn.\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n \"de-CH\": { locale: \"de-CH\", name: \"German (Switzerland)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u2039\", close: \"\\u203A\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. U.\", \"m. a. W.\", \"m. w. H.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Art.\", \"Abs.\", \"Ziff.\", \"Kap.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" } },\n \"de-DE\": { locale: \"de-DE\", name: \"German (Germany)\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, secondary: { open: \"\\u201A\", close: \"\\u2018\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"z. B.\", \"d. h.\", \"u. a.\", \"u. \\u00C4.\", \"z. T.\", \"i. d. R.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"Nr.\", \"S.\"], beforeWord: [\"St.\"], afterSymbols: [\"\\u00A7\", \"\\u00A7\\u00A7\"], initialBinding: \"chain\" } },\n el: { locale: \"el\", name: \"Greek\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"en-GB\": { locale: \"en-GB\", name: \"English (United Kingdom)\", quotes: { primary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"en-US\": { locale: \"en-US\", name: \"English (United States)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [{ left: \"rock\", elided: \"n\", right: \"roll\" }], elisionClitics: { before: [], after: [\"s\"] } }, dash: { parenthetical: \"em-tight\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"mi\", \"ft\", \"lb\", \"oz\", \"L\", \"mL\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"\\u00B0F\", \"kB\", \"MB\", \"GB\", \"TB\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"chain\" } },\n es: { locale: \"es\", name: \"Spanish\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ej.\", \"a. C.\", \"d. C.\", \"EE. UU.\", \"FF. AA.\", \"N. del T.\", \"q. e. p. d.\", \"et al.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"mg\", \"mL\", \"min\", \"dB\", \"kW\", \"kWh\"], beforeNumber: [\"art.\", \"cap.\", \"n\\u00FAm.\", \"nro.\", \"p\\u00E1g.\", \"p\\u00E1gs.\"], beforeWord: [\"Sr.\", \"Sra.\", \"Srta.\"], afterSymbols: [], initialBinding: \"chain\" } },\n fi: { locale: \"fi\", name: \"Finnish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"fil. maist.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00A7\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"h\", \"min\", \"s\", \"ms\", \"\\u00B0C\", \"kW\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n fr: { locale: \"fr\", name: \"French\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [\";\", \"!\", \"?\"], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n \"fr-CA\": { locale: \"fr-CA\", name: \"French (Canada)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"nbsp\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"j\", \"m\", \"t\", \"s\", \"c\", \"qu\", \"jusqu\", \"d\", \"n\", \"lorsqu\", \"puisqu\", \"quoiqu\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [\":\"], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"art.\", \"fig.\", \"n\\u00B0\", \"N\\u00B0\"], beforeWord: [\"M.\", \"MM.\", \"Mme\", \"Mmes\", \"Mlle\", \"Mlles\"], afterSymbols: [\"\\u00A7\"], initialBinding: \"single\" } },\n it: { locale: \"it\", name: \"Italian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"l\", \"un\", \"d\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"\\u20AC\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [\"n.\", \"pag.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n nl: { locale: \"nl\", name: \"Dutch\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"s\", \"t\", \"ns\", \"k\", \"m\", \"em\", \"r\", \"et\"] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"prof. dr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u20AC\", \"$\"], initialBinding: \"none\" } },\n pl: { locale: \"pl\", name: \"Polish\", quotes: { primary: { open: \"\\u201E\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u00BB\", close: \"\\u00AB\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"a\", \"i\", \"o\", \"u\", \"w\", \"z\"], abbreviations: [\"lek. med.\", \"in\\u017C. g\\u00F3rn.\", \"bp sufr.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"km/h\", \"kWh\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n \"pt-BR\": { locale: \"pt-BR\", name: \"Portuguese (Brazil)\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n \"pt-PT\": { locale: \"pt-PT\", name: \"Portuguese (Portugal)\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [\"d\", \"n\", \"pel\", \"m\", \"t\", \"lh\", \"sant\"], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"p. ex.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u00B0C\", \"km\", \"cm\", \"mm\", \"kg\", \"kW\", \"kWh\", \"Hz\"], beforeNumber: [\"p.\"], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n ru: { locale: \"ru\", name: \"Russian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201E\", close: \"\\u201C\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u043A\\u043E\\u0435-\", \"\\u043A\\u043E\\u0439-\"], suffixes: [\"-\\u0442\\u043E\", \"-\\u043B\\u0438\\u0431\\u043E\", \"-\\u043D\\u0438\\u0431\\u0443\\u0434\\u044C\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u043A\\u0430\"], compounds: [\"\\u0438\\u0437-\\u0437\\u0430\", \"\\u0438\\u0437-\\u043F\\u043E\\u0434\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [\"\\u0430\", \"\\u0432\", \"\\u0438\", \"\\u043A\", \"\\u043E\", \"\\u0441\", \"\\u0443\", \"\\u0432\\u043E\", \"\\u0434\\u043E\", \"\\u0437\\u0430\", \"\\u0438\\u0437\", \"\\u043A\\u043E\", \"\\u043D\\u0430\", \"\\u043E\\u0431\", \"\\u043E\\u0442\", \"\\u043F\\u043E\", \"\\u0441\\u043E\"], abbreviations: [\"\\u0438 \\u0442. \\u0434.\", \"\\u0438 \\u0442. \\u043F.\", \"\\u0442. \\u0435.\", \"\\u0438 \\u0434\\u0440.\"], beforeUnits: [\"%\", \"\\u2030\", \"\\u20BD\", \"\\u00B0C\", \"\\u043A\\u043C\", \"\\u0441\\u043C\", \"\\u043C\\u043C\", \"\\u043A\\u0433\", \"\\u0433.\", \"\\u0433\\u0433.\", \"\\u0432.\", \"\\u0432\\u0432.\", \"\\u0442\\u044B\\u0441.\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\"], beforeNumber: [], beforeWord: [\"\\u0443\\u043B.\", \"\\u043F\\u043B.\"], afterSymbols: [\"\\u2116\", \"\\u00A7\"], initialBinding: \"chain\" } },\n sv: { locale: \"sv\", name: \"Swedish\", quotes: { primary: { open: \"\\u201D\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2019\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"en-spaced\", range: \"en-tight\" }, ellipsis: { abbreviatedAfterTerminal: false }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [], beforeUnits: [\"%\", \"\\u2030\", \"kr\", \"\\u20AC\", \"kg\", \"g\", \"mg\", \"km\", \"m\", \"cm\", \"mm\", \"l\", \"dl\", \"cl\", \"ml\", \"kW\", \"kWh\", \"min\", \"sek\", \"tim\", \"h\", \"\\u00B0C\"], beforeNumber: [], beforeWord: [], afterSymbols: [\"\\u00A7\"], initialBinding: \"none\" } },\n tr: { locale: \"tr\", name: \"Turkish\", quotes: { primary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, secondary: { open: \"\\u2018\", close: \"\\u2019\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [\"nin\", \"n\\u0131n\", \"de\", \"da\", \"te\", \"ye\", \"yle\", \"n\\u0131\", \"dan\", \"den\", \"lik\", \"nci\", \"\\u00FCm\"] } }, dash: { parenthetical: \"none\", range: \"none\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [], suffixes: [], compounds: [] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"Kur. B\\u015Fk.\", \"N\\u00F6. Sb.\"], beforeUnits: [\"mm\", \"cm\", \"km\", \"kg\", \"mg\", \"hl\", \"m\\u00B2\", \"cm\\u00B2\", \"\\u00B0C\", \"ton\"], beforeNumber: [], beforeWord: [], afterSymbols: [], initialBinding: \"none\" } },\n uk: { locale: \"uk\", name: \"Ukrainian\", quotes: { primary: { open: \"\\u00AB\", close: \"\\u00BB\", innerSpace: \"none\" }, secondary: { open: \"\\u201C\", close: \"\\u201D\", innerSpace: \"none\" }, elisionIdioms: [], elisionClitics: { before: [], after: [] } }, dash: { parenthetical: \"em-spaced\", range: \"em-tight\" }, ellipsis: { abbreviatedAfterTerminal: true }, hyphen: { prefixes: [\"\\u0431\\u0443\\u0434\\u044C-\", \"\\u043A\\u0430\\u0437\\u043D\\u0430-\", \"\\u0445\\u0442\\u043E\\u0437\\u043D\\u0430-\", \"\\u0431\\u043E\\u0437\\u043D\\u0430-\"], suffixes: [\"-\\u0431\\u043E\", \"-\\u043D\\u043E\", \"-\\u043E\\u0442\", \"-\\u0442\\u043E\", \"-\\u0442\\u0430\\u043A\\u0438\", \"-\\u0431\\u0443\\u0434\\u044C\", \"-\\u043D\\u0435\\u0431\\u0443\\u0434\\u044C\"], compounds: [\"\\u0432\\u0438\\u0434-\\u0432\\u043E\", \"\\u0433\\u0440-\\u043D\", \"\\u0456\\u043D-\\u0442\", \"\\u0440-\\u043D\", \"\\u0443\\u043D-\\u0442\", \"\\u0444-\\u043A\\u0430\", \"\\u0442-\\u0432\\u043E\", \"\\u0437-\\u0437\\u0430\", \"\\u0456\\u0437-\\u0437\\u0430\", \"\\u0437-\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0456\\u0434\", \"\\u0456\\u0437-\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0437\\u0430\", \"\\u0437-\\u043F\\u043E\\u043C\\u0456\\u0436\", \"\\u0437-\\u043F\\u043E\\u043D\\u0430\\u0434\", \"\\u0437-\\u043F\\u043E\\u043F\\u0456\\u0434\", \"\\u0437-\\u043F\\u043E\\u0441\\u0435\\u0440\\u0435\\u0434\", \"\\u0437-\\u043F\\u0440\\u043E\\u043C\\u0456\\u0436\"] }, nbsp: { beforePunctuation: [], narrowBeforePunctuation: [], afterShortWords: [], abbreviations: [\"\\u0456 \\u0442. \\u0434.\", \"\\u0456 \\u0442. \\u0456\\u043D.\", \"\\u0442\\u0430 \\u0456\\u043D.\", \"\\u043A\\u0443\\u0431. \\u0441\\u043C\"], beforeUnits: [\"%\", \"\\u0433\\u0430\", \"\\u0433\\u043E\\u0434\", \"\\u0434\\u043C\", \"\\u043A\\u0411\", \"\\u043A\\u0412\\u0442\", \"\\u043A\\u0433\", \"\\u043A\\u043C\", \"\\u043C\\u043C\", \"\\u0441\\u043C\", \"\\u0445\\u0432\", \"\\u0412\\u0442\", \"\\u043A\\u043C/\\u0433\\u043E\\u0434\", \"\\u043C/\\u0441\", \"\\u043C\\u043B\\u043D\", \"\\u043C\\u043B\\u0440\\u0434\", \"\\u0442\\u0440\\u043B\\u043D\", \"\\u0433\\u0440\\u043D\", \"\\u0440.\"], beforeNumber: [], beforeWord: [\"\\u0430\\u043A\\u0430\\u0434.\", \"\\u0434\\u043E\\u0446.\", \"\\u043F\\u0440\\u043E\\u0444.\"], afterSymbols: [], initialBinding: \"chain\" } },\n};\n","import { ALIASES, KNOWN_LOCALES, LOCALES } from \"../generated/locales.js\";\nimport { fromCodePoints, toCodePoints } from \"./codepoints.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { LocaleData } from \"../types.js\";\n\nconst HYPHEN = 0x2d;\nconst UNDERSCORE = 0x5f;\nconst UPPER_A = 0x41;\nconst UPPER_Z = 0x5a;\nconst LOWER_A = 0x61;\nconst LOWER_Z = 0x7a;\nconst CASE_GAP = 0x20;\n\n/** Names the offending value without interpolating an object that may throw in `toString`. */\nfunction describe(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n return typeof value;\n}\n\nfunction isLowerAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= LOWER_A && cp <= LOWER_Z;\n}\n\nfunction isUpperAscii(cp: number | undefined): boolean {\n return cp !== undefined && cp >= UPPER_A && cp <= UPPER_Z;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.2. ASCII arithmetic only: no toLowerCase, no toUpperCase,\n * no ICU, no host locale, so a Turkish process resolves `EN-us` exactly as a Finnish one does\n * (ARCHITECTURE.md 4.4).\n */\nfunction canonicalize(tag: string): number[] {\n const c = toCodePoints(tag).map((cp) => (cp === UNDERSCORE ? HYPHEN : cp));\n const m = c.length;\n if (m >= 2) {\n for (const j of [0, 1]) {\n if (isUpperAscii(c[j])) c[j] = (c[j] as number) + CASE_GAP;\n }\n }\n if (m === 5 && c[2] === HYPHEN) {\n for (const j of [3, 4]) {\n if (isLowerAscii(c[j])) c[j] = (c[j] as number) - CASE_GAP;\n }\n }\n return c;\n}\n\n/**\n * spec/rules/locale-resolution.md 3.3. Exactly two accepted shapes, tested by index rather\n * than by pattern (ARCHITECTURE.md 4.1). Everything else — `eng`, `sr-Latn`, `es-419`,\n * `de-`, `en-US-POSIX`, `und` — is malformed and throws like any unknown tag.\n */\nfunction hasAcceptedShape(c: readonly number[]): boolean {\n if (c.length === 2) return isLowerAscii(c[0]) && isLowerAscii(c[1]);\n if (c.length === 5) {\n return (\n isLowerAscii(c[0]) &&\n isLowerAscii(c[1]) &&\n c[2] === HYPHEN &&\n isUpperAscii(c[3]) &&\n isUpperAscii(c[4])\n );\n }\n return false;\n}\n\n/** Alias values are concrete locales by registry invariant (locale-resolution.md 2). */\nfunction aliasTarget(tag: string): string | undefined {\n const target = Object.prototype.hasOwnProperty.call(ALIASES, tag) ? ALIASES[tag] : undefined;\n if (target === undefined) return undefined;\n if (!KNOWN_LOCALES.includes(target)) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Registry alias \"${tag}\" points at \"${target}\", which is not a declared locale.`,\n );\n }\n return target;\n}\n\nfunction lookup(tag: string): string | undefined {\n // Exact before alias, so a registry that wrongly lists a tag in both cannot make lookup\n // order observable (locale-resolution.md 3.4).\n if (KNOWN_LOCALES.includes(tag)) return tag;\n return aliasTarget(tag);\n}\n\n/**\n * Exact match, then the registry alias table, then the language subtag alone — once, with no\n * chain. Never Intl, never a platform locale negotiator: those disagree across runtimes and\n * several of them return a best-effort match for a language they have never heard of\n * (ARCHITECTURE.md 4.7, locale-resolution.md 1).\n */\n/** `tag` is typed `unknown`: it comes straight from the caller and is validated here, at the boundary. */\nexport function resolveLocaleTag(tag: unknown): string {\n // locale-resolution.md 3.1 step 1: absent, null or empty throws the coded error like any\n // other unresolvable tag. `locale: string` is a compile-time claim; a plain-JS caller can\n // pass anything, and a native TypeError is not in the error taxonomy (ARCHITECTURE.md 4.6),\n // so a port following 3.1 would fail differently on the same input.\n // An empty string needs no branch here: it has no accepted shape and falls through below.\n if (typeof tag !== \"string\") {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `The \\`locale\\` option is required and must be a string; received ${describe(tag)}.`,\n );\n }\n const c = canonicalize(tag);\n if (hasAcceptedShape(c)) {\n const canonical = fromCodePoints(c);\n const direct = lookup(canonical);\n if (direct !== undefined) return direct;\n if (c.length === 5) {\n const base = lookup(fromCodePoints(c.slice(0, 2)));\n if (base !== undefined) return base;\n }\n }\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_LOCALE\",\n `Unknown locale \"${tag}\". Known locales: ${KNOWN_LOCALES.join(\", \")}.`,\n );\n}\n\nexport function getLocaleData(tag: unknown): LocaleData {\n const resolved = resolveLocaleTag(tag);\n const data = Object.prototype.hasOwnProperty.call(LOCALES, resolved)\n ? LOCALES[resolved]\n : undefined;\n if (data === undefined) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `Locale \"${resolved}\" is declared in the registry but no locale data was generated. Run \\`npm run gen\\`.`,\n );\n }\n return data;\n}\n\nexport { KNOWN_LOCALES };\n","import { PolytypoError } from \"../errors.js\";\nimport type { NarrowNbsp } from \"../types.js\";\n\n/** U+202F, the narrow no-break space — nbsp.md §3.1a's default NARROW-TARGET. */\nexport const NARROW_NO_BREAK_SPACE = 0x202f;\n/** U+00A0, what `narrowNbsp: \"nbsp\"` substitutes for it. */\nexport const NO_BREAK_SPACE = 0x00a0;\n\n/**\n * nbsp.md §3.1a: resolve the `narrowNbsp` option to the code point the rule writes. Done once,\n * at the call boundary, so no rule ever sees the option's string.\n *\n * Checked immediately after `mode` and before `rules` — the two checks that read nothing but the\n * call itself come first (nbsp.md §3.1a). It runs whether or not `nbsp` is enabled, so a\n * misspelled value still raises rather than being silently ignored.\n */\nexport function resolveNarrowTarget(value: NarrowNbsp | undefined): number {\n if (value === undefined || value === \"narrow\") return NARROW_NO_BREAK_SPACE;\n if (value === \"nbsp\") return NO_BREAK_SPACE;\n throw new PolytypoError(\n \"POLYTYPO_INVALID_OPTION\",\n `Unknown narrowNbsp ${JSON.stringify(value)}. Expected \"narrow\" or \"nbsp\".`,\n );\n}\n","[\n 65, 90, 97, 122, 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740,\n 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 895, 895, 902, 902, 904, 906, 908, 908, 910,\n 929, 931, 1013, 1015, 1153, 1155, 1327, 1329, 1366, 1369, 1369, 1376, 1416, 1425, 1469, 1471,\n 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1519, 1522, 1552, 1562, 1568, 1631, 1646,\n 1747, 1749, 1756, 1759, 1768, 1770, 1775, 1786, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1994,\n 2037, 2042, 2042, 2045, 2045, 2048, 2093, 2112, 2139, 2144, 2154, 2160, 2183, 2185, 2191, 2199,\n 2273, 2275, 2403, 2417, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486,\n 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2544, 2545, 2556,\n 2556, 2558, 2558, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654,\n 2654, 2672, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741,\n 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2809, 2815, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891,\n 2893, 2901, 2903, 2908, 2909, 2911, 2915, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962,\n 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014,\n 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3072, 3084, 3086, 3088, 3090, 3112, 3114, 3129, 3132,\n 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3162, 3164, 3165, 3168, 3171, 3200, 3203, 3205,\n 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3292, 3294, 3296, 3299, 3313, 3315, 3328, 3340, 3342, 3344, 3346, 3396, 3398, 3400, 3402,\n 3406, 3412, 3415, 3423, 3427, 3450, 3455, 3457, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517,\n 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648,\n 3662, 3713, 3714, 3716, 3716, 3718, 3722, 3724, 3747, 3749, 3749, 3751, 3773, 3776, 3780, 3782,\n 3782, 3784, 3790, 3804, 3807, 3840, 3840, 3864, 3865, 3893, 3893, 3895, 3895, 3897, 3897, 3902,\n 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4159, 4176, 4239, 4250,\n 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802,\n 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5109, 5112,\n 5117, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5873, 5880, 5888, 5909, 5919, 5940, 5952,\n 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6155, 6157, 6159,\n 6159, 6176, 6264, 6272, 6314, 6320, 6389, 6400, 6430, 6432, 6443, 6448, 6459, 6480, 6509, 6512,\n 6516, 6528, 6571, 6576, 6601, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6783, 6823, 6823, 6832,\n 6877, 6880, 6891, 6912, 6988, 7019, 7027, 7040, 7087, 7098, 7155, 7168, 7223, 7245, 7247, 7258,\n 7293, 7296, 7306, 7312, 7354, 7357, 7359, 7376, 7378, 7380, 7418, 7424, 7957, 7960, 7965, 7968,\n 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118,\n 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182,\n 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8579, 8580, 11264, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565,\n 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704,\n 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293,\n 12294, 12330, 12335, 12337, 12341, 12347, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12591, 12593, 12686, 12704, 12735, 12784, 12799, 13312, 19903, 19968,\n 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42610, 42612, 42621, 42623,\n 42725, 42736, 42737, 42775, 42783, 42786, 42888, 42891, 42972, 42993, 43047, 43052, 43052, 43072,\n 43123, 43136, 43205, 43232, 43255, 43259, 43259, 43261, 43263, 43274, 43309, 43312, 43347, 43360,\n 43388, 43392, 43456, 43471, 43471, 43488, 43503, 43514, 43518, 43520, 43574, 43584, 43597, 43616,\n 43638, 43642, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793,\n 43798, 43808, 43814, 43816, 43822, 43824, 43866, 43868, 43881, 43888, 44010, 44012, 44013, 44032,\n 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285,\n 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467,\n 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65071, 65136, 65140, 65142,\n 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498,\n 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613, 65616, 65629, 65664,\n 65786, 66045, 66045, 66176, 66204, 66208, 66256, 66272, 66272, 66304, 66335, 66349, 66368, 66370,\n 66377, 66384, 66426, 66432, 66461, 66464, 66499, 66504, 66511, 66560, 66717, 66736, 66771, 66776,\n 66811, 66816, 66855, 66864, 66915, 66928, 66938, 66940, 66954, 66956, 66962, 66964, 66965, 66967,\n 66977, 66979, 66993, 66995, 67001, 67003, 67004, 67008, 67059, 67072, 67382, 67392, 67413, 67424,\n 67431, 67456, 67461, 67463, 67504, 67506, 67514, 67584, 67589, 67592, 67592, 67594, 67637, 67639,\n 67640, 67644, 67644, 67647, 67669, 67680, 67702, 67712, 67742, 67808, 67826, 67828, 67829, 67840,\n 67861, 67872, 67897, 67904, 67929, 67968, 68023, 68030, 68031, 68096, 68099, 68101, 68102, 68108,\n 68115, 68117, 68119, 68121, 68149, 68152, 68154, 68159, 68159, 68192, 68220, 68224, 68252, 68288,\n 68295, 68297, 68326, 68352, 68405, 68416, 68437, 68448, 68466, 68480, 68497, 68608, 68680, 68736,\n 68786, 68800, 68850, 68864, 68903, 68938, 68965, 68969, 68973, 68975, 68997, 69248, 69289, 69291,\n 69292, 69296, 69297, 69314, 69319, 69370, 69404, 69415, 69415, 69424, 69456, 69488, 69509, 69552,\n 69572, 69600, 69622, 69632, 69702, 69744, 69749, 69759, 69818, 69826, 69826, 69840, 69864, 69888,\n 69940, 69956, 69959, 69968, 70003, 70006, 70006, 70016, 70084, 70089, 70092, 70094, 70095, 70106,\n 70106, 70108, 70108, 70144, 70161, 70163, 70199, 70206, 70209, 70272, 70278, 70280, 70280, 70282,\n 70285, 70287, 70301, 70303, 70312, 70320, 70378, 70400, 70403, 70405, 70412, 70415, 70416, 70419,\n 70440, 70442, 70448, 70450, 70451, 70453, 70457, 70459, 70468, 70471, 70472, 70475, 70477, 70480,\n 70480, 70487, 70487, 70493, 70499, 70502, 70508, 70512, 70516, 70528, 70537, 70539, 70539, 70542,\n 70542, 70544, 70581, 70583, 70592, 70594, 70594, 70597, 70597, 70599, 70602, 70604, 70611, 70625,\n 70626, 70656, 70730, 70750, 70753, 70784, 70853, 70855, 70855, 71040, 71093, 71096, 71104, 71128,\n 71133, 71168, 71232, 71236, 71236, 71296, 71352, 71424, 71450, 71453, 71467, 71488, 71494, 71680,\n 71738, 71840, 71903, 71935, 71942, 71945, 71945, 71948, 71955, 71957, 71958, 71960, 71989, 71991,\n 71992, 71995, 72003, 72096, 72103, 72106, 72151, 72154, 72161, 72163, 72164, 72192, 72254, 72263,\n 72263, 72272, 72345, 72349, 72349, 72368, 72440, 72544, 72551, 72640, 72672, 72704, 72712, 72714,\n 72758, 72760, 72768, 72818, 72847, 72850, 72871, 72873, 72886, 72960, 72966, 72968, 72969, 72971,\n 73014, 73018, 73018, 73020, 73021, 73023, 73031, 73056, 73061, 73063, 73064, 73066, 73102, 73104,\n 73105, 73107, 73112, 73136, 73179, 73440, 73462, 73472, 73488, 73490, 73530, 73534, 73538, 73562,\n 73562, 73648, 73648, 73728, 74649, 74880, 75075, 77712, 77808, 77824, 78895, 78912, 78933, 78944,\n 82938, 82944, 83526, 90368, 90415, 92160, 92728, 92736, 92766, 92784, 92862, 92880, 92909, 92912,\n 92916, 92928, 92982, 92992, 92995, 93027, 93047, 93053, 93071, 93504, 93548, 93760, 93823, 93856,\n 93880, 93883, 93907, 93952, 94026, 94031, 94087, 94095, 94111, 94176, 94177, 94179, 94180, 94192,\n 94195, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589,\n 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960,\n 111355, 113664, 113770, 113776, 113788, 113792, 113800, 113808, 113817, 113821, 113822, 118528,\n 118573, 118576, 118598, 119141, 119145, 119149, 119154, 119163, 119170, 119173, 119179, 119210,\n 119213, 119362, 119364, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973,\n 119974, 119977, 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071,\n 120074, 120077, 120084, 120086, 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134,\n 120134, 120138, 120144, 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, 120572,\n 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688, 120712, 120714, 120744, 120746,\n 120770, 120772, 120779, 121344, 121398, 121403, 121452, 121461, 121461, 121476, 121476, 121499,\n 121503, 121505, 121519, 122624, 122654, 122661, 122666, 122880, 122886, 122888, 122904, 122907,\n 122913, 122915, 122916, 122918, 122922, 122928, 122989, 123023, 123023, 123136, 123180, 123184,\n 123197, 123214, 123214, 123536, 123566, 123584, 123631, 124112, 124143, 124368, 124400, 124608,\n 124638, 124640, 124661, 124670, 124671, 124896, 124902, 124904, 124907, 124909, 124910, 124912,\n 124926, 124928, 125124, 125136, 125142, 125184, 125259, 126464, 126467, 126469, 126495, 126497,\n 126498, 126500, 126500, 126503, 126503, 126505, 126514, 126516, 126519, 126521, 126521, 126523,\n 126523, 126530, 126530, 126535, 126535, 126537, 126537, 126539, 126539, 126541, 126543, 126545,\n 126546, 126548, 126548, 126551, 126551, 126553, 126553, 126555, 126555, 126557, 126557, 126559,\n 126559, 126561, 126562, 126564, 126564, 126567, 126570, 126572, 126578, 126580, 126583, 126585,\n 126588, 126590, 126590, 126592, 126601, 126603, 126619, 126625, 126627, 126629, 126633, 126635,\n 126651, 131072, 173791, 173824, 178205, 178208, 183981, 183984, 191456, 191472, 192093, 194560,\n 195101, 196608, 201546, 201552, 210041, 917760, 917999\n]\n","// Shared Unicode general-category data for the rule engine.\n//\n// Unicode version: the table below is a DERIVED artifact, generated from the V8 UCD of the\n// machine that produced it (Node 22.23.2 / Unicode 17.0, confirmed by\n// tests/engine/unicode.test.ts, which re-checks every range boundary against the host\n// runtime). The spec does not yet pin a UCD version — spec/UNICODE does not exist and\n// spec/rules/apostrophe.md 7 and nbsp.md 7 both record the gap — so two runtimes built\n// against different UCD releases can still disagree on newly assigned code points. The test\n// turns that from a silent output change into a red build; the pin itself is a spec change.\n//\n// A table rather than `\\p{L}`: RE2 (Go) has no Unicode property parity with PCRE, so a rule\n// may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n//\n// The table itself lives in ./letter-ranges.json, not inline, so that build tooling outside\n// src/ (scripts/validate-spec.mjs, scripts/gen-locales.mjs — plain .mjs, run without a TS\n// build step, so they cannot import this file directly) can read the identical data by\n// re-parsing the same JSON rather than maintaining a second copy that could drift from this\n// one. Both sides implement the same binary search independently; only the data is shared.\n\nimport letterRanges from \"./letter-ranges.json\" with { type: \"json\" };\n\n/**\n * Unicode general categories Lu, Ll, Lt, Lm, Lo, Mn, Mc and Me as inclusive code-point\n * ranges, flattened to [start, end, start, end, ...] and sorted ascending.\n */\nexport const LETTER_RANGES: readonly number[] = letterRanges;\n\n/** True for a code point in Lu, Ll, Lt, Lm, Lo, Mn, Mc or Me. Binary search over LETTER_RANGES. */\nexport function isLetter(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return (cp >= 0x41 && cp <= 0x5a) || (cp >= 0x61 && cp <= 0x7a);\n let lo = 0;\n let hi = LETTER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = LETTER_RANGES[mid * 2] as number;\n const end = LETTER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode general categories Lu and Lt as inclusive code-point ranges, flattened to\n * [start, end, …] and sorted ascending — spec 3.1 `UPPER`, read by N7.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/nbsp.test.ts re-checks every range\n * boundary against the host runtime. A table rather than `\\p{Lu}`: RE2 has no Unicode\n * property parity, so a rule may not depend on the host regex engine (ARCHITECTURE.md 4.1).\n * */\nexport const UPPER_RANGES: readonly number[] = [\n 0x41, 0x5a, 0xc0, 0xd6, 0xd8, 0xde, 0x100, 0x100, 0x102, 0x102, 0x104, 0x104, 0x106, 0x106, 0x108,\n 0x108, 0x10a, 0x10a, 0x10c, 0x10c, 0x10e, 0x10e, 0x110, 0x110, 0x112, 0x112, 0x114, 0x114, 0x116,\n 0x116, 0x118, 0x118, 0x11a, 0x11a, 0x11c, 0x11c, 0x11e, 0x11e, 0x120, 0x120, 0x122, 0x122, 0x124,\n 0x124, 0x126, 0x126, 0x128, 0x128, 0x12a, 0x12a, 0x12c, 0x12c, 0x12e, 0x12e, 0x130, 0x130, 0x132,\n 0x132, 0x134, 0x134, 0x136, 0x136, 0x139, 0x139, 0x13b, 0x13b, 0x13d, 0x13d, 0x13f, 0x13f, 0x141,\n 0x141, 0x143, 0x143, 0x145, 0x145, 0x147, 0x147, 0x14a, 0x14a, 0x14c, 0x14c, 0x14e, 0x14e, 0x150,\n 0x150, 0x152, 0x152, 0x154, 0x154, 0x156, 0x156, 0x158, 0x158, 0x15a, 0x15a, 0x15c, 0x15c, 0x15e,\n 0x15e, 0x160, 0x160, 0x162, 0x162, 0x164, 0x164, 0x166, 0x166, 0x168, 0x168, 0x16a, 0x16a, 0x16c,\n 0x16c, 0x16e, 0x16e, 0x170, 0x170, 0x172, 0x172, 0x174, 0x174, 0x176, 0x176, 0x178, 0x179, 0x17b,\n 0x17b, 0x17d, 0x17d, 0x181, 0x182, 0x184, 0x184, 0x186, 0x187, 0x189, 0x18b, 0x18e, 0x191, 0x193,\n 0x194, 0x196, 0x198, 0x19c, 0x19d, 0x19f, 0x1a0, 0x1a2, 0x1a2, 0x1a4, 0x1a4, 0x1a6, 0x1a7, 0x1a9,\n 0x1a9, 0x1ac, 0x1ac, 0x1ae, 0x1af, 0x1b1, 0x1b3, 0x1b5, 0x1b5, 0x1b7, 0x1b8, 0x1bc, 0x1bc, 0x1c4,\n 0x1c5, 0x1c7, 0x1c8, 0x1ca, 0x1cb, 0x1cd, 0x1cd, 0x1cf, 0x1cf, 0x1d1, 0x1d1, 0x1d3, 0x1d3, 0x1d5,\n 0x1d5, 0x1d7, 0x1d7, 0x1d9, 0x1d9, 0x1db, 0x1db, 0x1de, 0x1de, 0x1e0, 0x1e0, 0x1e2, 0x1e2, 0x1e4,\n 0x1e4, 0x1e6, 0x1e6, 0x1e8, 0x1e8, 0x1ea, 0x1ea, 0x1ec, 0x1ec, 0x1ee, 0x1ee, 0x1f1, 0x1f2, 0x1f4,\n 0x1f4, 0x1f6, 0x1f8, 0x1fa, 0x1fa, 0x1fc, 0x1fc, 0x1fe, 0x1fe, 0x200, 0x200, 0x202, 0x202, 0x204,\n 0x204, 0x206, 0x206, 0x208, 0x208, 0x20a, 0x20a, 0x20c, 0x20c, 0x20e, 0x20e, 0x210, 0x210, 0x212,\n 0x212, 0x214, 0x214, 0x216, 0x216, 0x218, 0x218, 0x21a, 0x21a, 0x21c, 0x21c, 0x21e, 0x21e, 0x220,\n 0x220, 0x222, 0x222, 0x224, 0x224, 0x226, 0x226, 0x228, 0x228, 0x22a, 0x22a, 0x22c, 0x22c, 0x22e,\n 0x22e, 0x230, 0x230, 0x232, 0x232, 0x23a, 0x23b, 0x23d, 0x23e, 0x241, 0x241, 0x243, 0x246, 0x248,\n 0x248, 0x24a, 0x24a, 0x24c, 0x24c, 0x24e, 0x24e, 0x370, 0x370, 0x372, 0x372, 0x376, 0x376, 0x37f,\n 0x37f, 0x386, 0x386, 0x388, 0x38a, 0x38c, 0x38c, 0x38e, 0x38f, 0x391, 0x3a1, 0x3a3, 0x3ab, 0x3cf,\n 0x3cf, 0x3d2, 0x3d4, 0x3d8, 0x3d8, 0x3da, 0x3da, 0x3dc, 0x3dc, 0x3de, 0x3de, 0x3e0, 0x3e0, 0x3e2,\n 0x3e2, 0x3e4, 0x3e4, 0x3e6, 0x3e6, 0x3e8, 0x3e8, 0x3ea, 0x3ea, 0x3ec, 0x3ec, 0x3ee, 0x3ee, 0x3f4,\n 0x3f4, 0x3f7, 0x3f7, 0x3f9, 0x3fa, 0x3fd, 0x42f, 0x460, 0x460, 0x462, 0x462, 0x464, 0x464, 0x466,\n 0x466, 0x468, 0x468, 0x46a, 0x46a, 0x46c, 0x46c, 0x46e, 0x46e, 0x470, 0x470, 0x472, 0x472, 0x474,\n 0x474, 0x476, 0x476, 0x478, 0x478, 0x47a, 0x47a, 0x47c, 0x47c, 0x47e, 0x47e, 0x480, 0x480, 0x48a,\n 0x48a, 0x48c, 0x48c, 0x48e, 0x48e, 0x490, 0x490, 0x492, 0x492, 0x494, 0x494, 0x496, 0x496, 0x498,\n 0x498, 0x49a, 0x49a, 0x49c, 0x49c, 0x49e, 0x49e, 0x4a0, 0x4a0, 0x4a2, 0x4a2, 0x4a4, 0x4a4, 0x4a6,\n 0x4a6, 0x4a8, 0x4a8, 0x4aa, 0x4aa, 0x4ac, 0x4ac, 0x4ae, 0x4ae, 0x4b0, 0x4b0, 0x4b2, 0x4b2, 0x4b4,\n 0x4b4, 0x4b6, 0x4b6, 0x4b8, 0x4b8, 0x4ba, 0x4ba, 0x4bc, 0x4bc, 0x4be, 0x4be, 0x4c0, 0x4c1, 0x4c3,\n 0x4c3, 0x4c5, 0x4c5, 0x4c7, 0x4c7, 0x4c9, 0x4c9, 0x4cb, 0x4cb, 0x4cd, 0x4cd, 0x4d0, 0x4d0, 0x4d2,\n 0x4d2, 0x4d4, 0x4d4, 0x4d6, 0x4d6, 0x4d8, 0x4d8, 0x4da, 0x4da, 0x4dc, 0x4dc, 0x4de, 0x4de, 0x4e0,\n 0x4e0, 0x4e2, 0x4e2, 0x4e4, 0x4e4, 0x4e6, 0x4e6, 0x4e8, 0x4e8, 0x4ea, 0x4ea, 0x4ec, 0x4ec, 0x4ee,\n 0x4ee, 0x4f0, 0x4f0, 0x4f2, 0x4f2, 0x4f4, 0x4f4, 0x4f6, 0x4f6, 0x4f8, 0x4f8, 0x4fa, 0x4fa, 0x4fc,\n 0x4fc, 0x4fe, 0x4fe, 0x500, 0x500, 0x502, 0x502, 0x504, 0x504, 0x506, 0x506, 0x508, 0x508, 0x50a,\n 0x50a, 0x50c, 0x50c, 0x50e, 0x50e, 0x510, 0x510, 0x512, 0x512, 0x514, 0x514, 0x516, 0x516, 0x518,\n 0x518, 0x51a, 0x51a, 0x51c, 0x51c, 0x51e, 0x51e, 0x520, 0x520, 0x522, 0x522, 0x524, 0x524, 0x526,\n 0x526, 0x528, 0x528, 0x52a, 0x52a, 0x52c, 0x52c, 0x52e, 0x52e, 0x531, 0x556, 0x10a0, 0x10c5,\n 0x10c7, 0x10c7, 0x10cd, 0x10cd, 0x13a0, 0x13f5, 0x1c89, 0x1c89, 0x1c90, 0x1cba, 0x1cbd, 0x1cbf,\n 0x1e00, 0x1e00, 0x1e02, 0x1e02, 0x1e04, 0x1e04, 0x1e06, 0x1e06, 0x1e08, 0x1e08, 0x1e0a, 0x1e0a,\n 0x1e0c, 0x1e0c, 0x1e0e, 0x1e0e, 0x1e10, 0x1e10, 0x1e12, 0x1e12, 0x1e14, 0x1e14, 0x1e16, 0x1e16,\n 0x1e18, 0x1e18, 0x1e1a, 0x1e1a, 0x1e1c, 0x1e1c, 0x1e1e, 0x1e1e, 0x1e20, 0x1e20, 0x1e22, 0x1e22,\n 0x1e24, 0x1e24, 0x1e26, 0x1e26, 0x1e28, 0x1e28, 0x1e2a, 0x1e2a, 0x1e2c, 0x1e2c, 0x1e2e, 0x1e2e,\n 0x1e30, 0x1e30, 0x1e32, 0x1e32, 0x1e34, 0x1e34, 0x1e36, 0x1e36, 0x1e38, 0x1e38, 0x1e3a, 0x1e3a,\n 0x1e3c, 0x1e3c, 0x1e3e, 0x1e3e, 0x1e40, 0x1e40, 0x1e42, 0x1e42, 0x1e44, 0x1e44, 0x1e46, 0x1e46,\n 0x1e48, 0x1e48, 0x1e4a, 0x1e4a, 0x1e4c, 0x1e4c, 0x1e4e, 0x1e4e, 0x1e50, 0x1e50, 0x1e52, 0x1e52,\n 0x1e54, 0x1e54, 0x1e56, 0x1e56, 0x1e58, 0x1e58, 0x1e5a, 0x1e5a, 0x1e5c, 0x1e5c, 0x1e5e, 0x1e5e,\n 0x1e60, 0x1e60, 0x1e62, 0x1e62, 0x1e64, 0x1e64, 0x1e66, 0x1e66, 0x1e68, 0x1e68, 0x1e6a, 0x1e6a,\n 0x1e6c, 0x1e6c, 0x1e6e, 0x1e6e, 0x1e70, 0x1e70, 0x1e72, 0x1e72, 0x1e74, 0x1e74, 0x1e76, 0x1e76,\n 0x1e78, 0x1e78, 0x1e7a, 0x1e7a, 0x1e7c, 0x1e7c, 0x1e7e, 0x1e7e, 0x1e80, 0x1e80, 0x1e82, 0x1e82,\n 0x1e84, 0x1e84, 0x1e86, 0x1e86, 0x1e88, 0x1e88, 0x1e8a, 0x1e8a, 0x1e8c, 0x1e8c, 0x1e8e, 0x1e8e,\n 0x1e90, 0x1e90, 0x1e92, 0x1e92, 0x1e94, 0x1e94, 0x1e9e, 0x1e9e, 0x1ea0, 0x1ea0, 0x1ea2, 0x1ea2,\n 0x1ea4, 0x1ea4, 0x1ea6, 0x1ea6, 0x1ea8, 0x1ea8, 0x1eaa, 0x1eaa, 0x1eac, 0x1eac, 0x1eae, 0x1eae,\n 0x1eb0, 0x1eb0, 0x1eb2, 0x1eb2, 0x1eb4, 0x1eb4, 0x1eb6, 0x1eb6, 0x1eb8, 0x1eb8, 0x1eba, 0x1eba,\n 0x1ebc, 0x1ebc, 0x1ebe, 0x1ebe, 0x1ec0, 0x1ec0, 0x1ec2, 0x1ec2, 0x1ec4, 0x1ec4, 0x1ec6, 0x1ec6,\n 0x1ec8, 0x1ec8, 0x1eca, 0x1eca, 0x1ecc, 0x1ecc, 0x1ece, 0x1ece, 0x1ed0, 0x1ed0, 0x1ed2, 0x1ed2,\n 0x1ed4, 0x1ed4, 0x1ed6, 0x1ed6, 0x1ed8, 0x1ed8, 0x1eda, 0x1eda, 0x1edc, 0x1edc, 0x1ede, 0x1ede,\n 0x1ee0, 0x1ee0, 0x1ee2, 0x1ee2, 0x1ee4, 0x1ee4, 0x1ee6, 0x1ee6, 0x1ee8, 0x1ee8, 0x1eea, 0x1eea,\n 0x1eec, 0x1eec, 0x1eee, 0x1eee, 0x1ef0, 0x1ef0, 0x1ef2, 0x1ef2, 0x1ef4, 0x1ef4, 0x1ef6, 0x1ef6,\n 0x1ef8, 0x1ef8, 0x1efa, 0x1efa, 0x1efc, 0x1efc, 0x1efe, 0x1efe, 0x1f08, 0x1f0f, 0x1f18, 0x1f1d,\n 0x1f28, 0x1f2f, 0x1f38, 0x1f3f, 0x1f48, 0x1f4d, 0x1f59, 0x1f59, 0x1f5b, 0x1f5b, 0x1f5d, 0x1f5d,\n 0x1f5f, 0x1f5f, 0x1f68, 0x1f6f, 0x1f88, 0x1f8f, 0x1f98, 0x1f9f, 0x1fa8, 0x1faf, 0x1fb8, 0x1fbc,\n 0x1fc8, 0x1fcc, 0x1fd8, 0x1fdb, 0x1fe8, 0x1fec, 0x1ff8, 0x1ffc, 0x2102, 0x2102, 0x2107, 0x2107,\n 0x210b, 0x210d, 0x2110, 0x2112, 0x2115, 0x2115, 0x2119, 0x211d, 0x2124, 0x2124, 0x2126, 0x2126,\n 0x2128, 0x2128, 0x212a, 0x212d, 0x2130, 0x2133, 0x213e, 0x213f, 0x2145, 0x2145, 0x2183, 0x2183,\n 0x2c00, 0x2c2f, 0x2c60, 0x2c60, 0x2c62, 0x2c64, 0x2c67, 0x2c67, 0x2c69, 0x2c69, 0x2c6b, 0x2c6b,\n 0x2c6d, 0x2c70, 0x2c72, 0x2c72, 0x2c75, 0x2c75, 0x2c7e, 0x2c80, 0x2c82, 0x2c82, 0x2c84, 0x2c84,\n 0x2c86, 0x2c86, 0x2c88, 0x2c88, 0x2c8a, 0x2c8a, 0x2c8c, 0x2c8c, 0x2c8e, 0x2c8e, 0x2c90, 0x2c90,\n 0x2c92, 0x2c92, 0x2c94, 0x2c94, 0x2c96, 0x2c96, 0x2c98, 0x2c98, 0x2c9a, 0x2c9a, 0x2c9c, 0x2c9c,\n 0x2c9e, 0x2c9e, 0x2ca0, 0x2ca0, 0x2ca2, 0x2ca2, 0x2ca4, 0x2ca4, 0x2ca6, 0x2ca6, 0x2ca8, 0x2ca8,\n 0x2caa, 0x2caa, 0x2cac, 0x2cac, 0x2cae, 0x2cae, 0x2cb0, 0x2cb0, 0x2cb2, 0x2cb2, 0x2cb4, 0x2cb4,\n 0x2cb6, 0x2cb6, 0x2cb8, 0x2cb8, 0x2cba, 0x2cba, 0x2cbc, 0x2cbc, 0x2cbe, 0x2cbe, 0x2cc0, 0x2cc0,\n 0x2cc2, 0x2cc2, 0x2cc4, 0x2cc4, 0x2cc6, 0x2cc6, 0x2cc8, 0x2cc8, 0x2cca, 0x2cca, 0x2ccc, 0x2ccc,\n 0x2cce, 0x2cce, 0x2cd0, 0x2cd0, 0x2cd2, 0x2cd2, 0x2cd4, 0x2cd4, 0x2cd6, 0x2cd6, 0x2cd8, 0x2cd8,\n 0x2cda, 0x2cda, 0x2cdc, 0x2cdc, 0x2cde, 0x2cde, 0x2ce0, 0x2ce0, 0x2ce2, 0x2ce2, 0x2ceb, 0x2ceb,\n 0x2ced, 0x2ced, 0x2cf2, 0x2cf2, 0xa640, 0xa640, 0xa642, 0xa642, 0xa644, 0xa644, 0xa646, 0xa646,\n 0xa648, 0xa648, 0xa64a, 0xa64a, 0xa64c, 0xa64c, 0xa64e, 0xa64e, 0xa650, 0xa650, 0xa652, 0xa652,\n 0xa654, 0xa654, 0xa656, 0xa656, 0xa658, 0xa658, 0xa65a, 0xa65a, 0xa65c, 0xa65c, 0xa65e, 0xa65e,\n 0xa660, 0xa660, 0xa662, 0xa662, 0xa664, 0xa664, 0xa666, 0xa666, 0xa668, 0xa668, 0xa66a, 0xa66a,\n 0xa66c, 0xa66c, 0xa680, 0xa680, 0xa682, 0xa682, 0xa684, 0xa684, 0xa686, 0xa686, 0xa688, 0xa688,\n 0xa68a, 0xa68a, 0xa68c, 0xa68c, 0xa68e, 0xa68e, 0xa690, 0xa690, 0xa692, 0xa692, 0xa694, 0xa694,\n 0xa696, 0xa696, 0xa698, 0xa698, 0xa69a, 0xa69a, 0xa722, 0xa722, 0xa724, 0xa724, 0xa726, 0xa726,\n 0xa728, 0xa728, 0xa72a, 0xa72a, 0xa72c, 0xa72c, 0xa72e, 0xa72e, 0xa732, 0xa732, 0xa734, 0xa734,\n 0xa736, 0xa736, 0xa738, 0xa738, 0xa73a, 0xa73a, 0xa73c, 0xa73c, 0xa73e, 0xa73e, 0xa740, 0xa740,\n 0xa742, 0xa742, 0xa744, 0xa744, 0xa746, 0xa746, 0xa748, 0xa748, 0xa74a, 0xa74a, 0xa74c, 0xa74c,\n 0xa74e, 0xa74e, 0xa750, 0xa750, 0xa752, 0xa752, 0xa754, 0xa754, 0xa756, 0xa756, 0xa758, 0xa758,\n 0xa75a, 0xa75a, 0xa75c, 0xa75c, 0xa75e, 0xa75e, 0xa760, 0xa760, 0xa762, 0xa762, 0xa764, 0xa764,\n 0xa766, 0xa766, 0xa768, 0xa768, 0xa76a, 0xa76a, 0xa76c, 0xa76c, 0xa76e, 0xa76e, 0xa779, 0xa779,\n 0xa77b, 0xa77b, 0xa77d, 0xa77e, 0xa780, 0xa780, 0xa782, 0xa782, 0xa784, 0xa784, 0xa786, 0xa786,\n 0xa78b, 0xa78b, 0xa78d, 0xa78d, 0xa790, 0xa790, 0xa792, 0xa792, 0xa796, 0xa796, 0xa798, 0xa798,\n 0xa79a, 0xa79a, 0xa79c, 0xa79c, 0xa79e, 0xa79e, 0xa7a0, 0xa7a0, 0xa7a2, 0xa7a2, 0xa7a4, 0xa7a4,\n 0xa7a6, 0xa7a6, 0xa7a8, 0xa7a8, 0xa7aa, 0xa7ae, 0xa7b0, 0xa7b4, 0xa7b6, 0xa7b6, 0xa7b8, 0xa7b8,\n 0xa7ba, 0xa7ba, 0xa7bc, 0xa7bc, 0xa7be, 0xa7be, 0xa7c0, 0xa7c0, 0xa7c2, 0xa7c2, 0xa7c4, 0xa7c7,\n 0xa7c9, 0xa7c9, 0xa7cb, 0xa7cc, 0xa7ce, 0xa7ce, 0xa7d0, 0xa7d0, 0xa7d2, 0xa7d2, 0xa7d4, 0xa7d4,\n 0xa7d6, 0xa7d6, 0xa7d8, 0xa7d8, 0xa7da, 0xa7da, 0xa7dc, 0xa7dc, 0xa7f5, 0xa7f5, 0xff21, 0xff3a,\n 0x10400, 0x10427, 0x104b0, 0x104d3, 0x10570, 0x1057a, 0x1057c, 0x1058a, 0x1058c, 0x10592, 0x10594,\n 0x10595, 0x10c80, 0x10cb2, 0x10d50, 0x10d65, 0x118a0, 0x118bf, 0x16e40, 0x16e5f, 0x16ea0, 0x16eb8,\n 0x1d400, 0x1d419, 0x1d434, 0x1d44d, 0x1d468, 0x1d481, 0x1d49c, 0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2,\n 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4a9, 0x1d4ac, 0x1d4ae, 0x1d4b5, 0x1d4d0, 0x1d4e9, 0x1d504, 0x1d505,\n 0x1d507, 0x1d50a, 0x1d50d, 0x1d514, 0x1d516, 0x1d51c, 0x1d538, 0x1d539, 0x1d53b, 0x1d53e, 0x1d540,\n 0x1d544, 0x1d546, 0x1d546, 0x1d54a, 0x1d550, 0x1d56c, 0x1d585, 0x1d5a0, 0x1d5b9, 0x1d5d4, 0x1d5ed,\n 0x1d608, 0x1d621, 0x1d63c, 0x1d655, 0x1d670, 0x1d689, 0x1d6a8, 0x1d6c0, 0x1d6e2, 0x1d6fa, 0x1d71c,\n 0x1d734, 0x1d756, 0x1d76e, 0x1d790, 0x1d7a8, 0x1d7ca, 0x1d7ca, 0x1e900, 0x1e921,\n];\n\n/** True for a code point in Lu or Lt. Binary search over UPPER_RANGES. */\nexport function isUpper(cp: number): boolean {\n if (cp < 0) return false;\n if (cp < 0x80) return cp >= 0x41 && cp <= 0x5a;\n let lo = 0;\n let hi = UPPER_RANGES.length / 2 - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const start = UPPER_RANGES[mid * 2] as number;\n const end = UPPER_RANGES[mid * 2 + 1] as number;\n if (cp < start) hi = mid - 1;\n else if (cp > end) lo = mid + 1;\n else return true;\n }\n return false;\n}\n\n/**\n * Unicode simple uppercase mapping, as [start, end, step, delta] quadruples flattened into\n * one array. `hyphen` 3.3 and `nbsp` 3.5 both need it, applied to the *pattern*, never to the\n * input, and never via `toUpperCase()` — that is the host-locale call ARCHITECTURE.md 4.4\n * forbids. `nbsp` and `hyphen` both read it.\n *\n * DERIVED artifact, generated from the host UCD (Node 22 / Unicode 17.0, matching\n * src/engine/unicode.ts and spec/UNICODE); tests/rules/hyphen.test.ts re-checks every entry\n * against the host runtime, so a UCD drift is a red build rather than a silent output change.\n * Entries whose full uppercase mapping expands to more than one code point (U+00DF, U+FB00,\n * …) are absent, which is exactly what the simple mapping says: they map to themselves.\n */\nexport const SIMPLE_UPPERCASE: readonly number[] = [\n 0x61, 0x7a, 1, -32, 0xb5, 0xb5, 1, 743, 0xe0, 0xf6, 1, -32, 0xf8, 0xfe, 1, -32, 0xff, 0xff, 1,\n 121, 0x101, 0x12f, 2, -1, 0x131, 0x131, 1, -232, 0x133, 0x137, 2, -1, 0x13a, 0x148, 2, -1, 0x14b,\n 0x177, 2, -1, 0x17a, 0x17e, 2, -1, 0x17f, 0x17f, 1, -300, 0x180, 0x180, 1, 195, 0x183, 0x185, 2,\n -1, 0x188, 0x188, 1, -1, 0x18c, 0x18c, 1, -1, 0x192, 0x192, 1, -1, 0x195, 0x195, 1, 97, 0x199,\n 0x199, 1, -1, 0x19a, 0x19a, 1, 163, 0x19b, 0x19b, 1, 42561, 0x19e, 0x19e, 1, 130, 0x1a1, 0x1a5, 2,\n -1, 0x1a8, 0x1a8, 1, -1, 0x1ad, 0x1ad, 1, -1, 0x1b0, 0x1b0, 1, -1, 0x1b4, 0x1b6, 2, -1, 0x1b9,\n 0x1b9, 1, -1, 0x1bd, 0x1bd, 1, -1, 0x1bf, 0x1bf, 1, 56, 0x1c5, 0x1c5, 1, -1, 0x1c6, 0x1c6, 1, -2,\n 0x1c8, 0x1c8, 1, -1, 0x1c9, 0x1c9, 1, -2, 0x1cb, 0x1cb, 1, -1, 0x1cc, 0x1cc, 1, -2, 0x1ce, 0x1dc,\n 2, -1, 0x1dd, 0x1dd, 1, -79, 0x1df, 0x1ef, 2, -1, 0x1f2, 0x1f2, 1, -1, 0x1f3, 0x1f3, 1, -2, 0x1f5,\n 0x1f5, 1, -1, 0x1f9, 0x21f, 2, -1, 0x223, 0x233, 2, -1, 0x23c, 0x23c, 1, -1, 0x23f, 0x240, 1,\n 10815, 0x242, 0x242, 1, -1, 0x247, 0x24f, 2, -1, 0x250, 0x250, 1, 10783, 0x251, 0x251, 1, 10780,\n 0x252, 0x252, 1, 10782, 0x253, 0x253, 1, -210, 0x254, 0x254, 1, -206, 0x256, 0x257, 1, -205,\n 0x259, 0x259, 1, -202, 0x25b, 0x25b, 1, -203, 0x25c, 0x25c, 1, 42319, 0x260, 0x260, 1, -205,\n 0x261, 0x261, 1, 42315, 0x263, 0x263, 1, -207, 0x264, 0x264, 1, 42343, 0x265, 0x265, 1, 42280,\n 0x266, 0x266, 1, 42308, 0x268, 0x268, 1, -209, 0x269, 0x269, 1, -211, 0x26a, 0x26a, 1, 42308,\n 0x26b, 0x26b, 1, 10743, 0x26c, 0x26c, 1, 42305, 0x26f, 0x26f, 1, -211, 0x271, 0x271, 1, 10749,\n 0x272, 0x272, 1, -213, 0x275, 0x275, 1, -214, 0x27d, 0x27d, 1, 10727, 0x280, 0x280, 1, -218,\n 0x282, 0x282, 1, 42307, 0x283, 0x283, 1, -218, 0x287, 0x287, 1, 42282, 0x288, 0x288, 1, -218,\n 0x289, 0x289, 1, -69, 0x28a, 0x28b, 1, -217, 0x28c, 0x28c, 1, -71, 0x292, 0x292, 1, -219, 0x29d,\n 0x29d, 1, 42261, 0x29e, 0x29e, 1, 42258, 0x345, 0x345, 1, 84, 0x371, 0x373, 2, -1, 0x377, 0x377,\n 1, -1, 0x37b, 0x37d, 1, 130, 0x3ac, 0x3ac, 1, -38, 0x3ad, 0x3af, 1, -37, 0x3b1, 0x3c1, 1, -32,\n 0x3c2, 0x3c2, 1, -31, 0x3c3, 0x3cb, 1, -32, 0x3cc, 0x3cc, 1, -64, 0x3cd, 0x3ce, 1, -63, 0x3d0,\n 0x3d0, 1, -62, 0x3d1, 0x3d1, 1, -57, 0x3d5, 0x3d5, 1, -47, 0x3d6, 0x3d6, 1, -54, 0x3d7, 0x3d7, 1,\n -8, 0x3d9, 0x3ef, 2, -1, 0x3f0, 0x3f0, 1, -86, 0x3f1, 0x3f1, 1, -80, 0x3f2, 0x3f2, 1, 7, 0x3f3,\n 0x3f3, 1, -116, 0x3f5, 0x3f5, 1, -96, 0x3f8, 0x3f8, 1, -1, 0x3fb, 0x3fb, 1, -1, 0x430, 0x44f, 1,\n -32, 0x450, 0x45f, 1, -80, 0x461, 0x481, 2, -1, 0x48b, 0x4bf, 2, -1, 0x4c2, 0x4ce, 2, -1, 0x4cf,\n 0x4cf, 1, -15, 0x4d1, 0x52f, 2, -1, 0x561, 0x586, 1, -48, 0x10d0, 0x10fa, 1, 3008, 0x10fd, 0x10ff,\n 1, 3008, 0x13f8, 0x13fd, 1, -8, 0x1c80, 0x1c80, 1, -6254, 0x1c81, 0x1c81, 1, -6253, 0x1c82,\n 0x1c82, 1, -6244, 0x1c83, 0x1c84, 1, -6242, 0x1c85, 0x1c85, 1, -6243, 0x1c86, 0x1c86, 1, -6236,\n 0x1c87, 0x1c87, 1, -6181, 0x1c88, 0x1c88, 1, 35266, 0x1c8a, 0x1c8a, 1, -1, 0x1d79, 0x1d79, 1,\n 35332, 0x1d7d, 0x1d7d, 1, 3814, 0x1d8e, 0x1d8e, 1, 35384, 0x1e01, 0x1e95, 2, -1, 0x1e9b, 0x1e9b,\n 1, -59, 0x1ea1, 0x1eff, 2, -1, 0x1f00, 0x1f07, 1, 8, 0x1f10, 0x1f15, 1, 8, 0x1f20, 0x1f27, 1, 8,\n 0x1f30, 0x1f37, 1, 8, 0x1f40, 0x1f45, 1, 8, 0x1f51, 0x1f57, 2, 8, 0x1f60, 0x1f67, 1, 8, 0x1f70,\n 0x1f71, 1, 74, 0x1f72, 0x1f75, 1, 86, 0x1f76, 0x1f77, 1, 100, 0x1f78, 0x1f79, 1, 128, 0x1f7a,\n 0x1f7b, 1, 112, 0x1f7c, 0x1f7d, 1, 126, 0x1fb0, 0x1fb1, 1, 8, 0x1fbe, 0x1fbe, 1, -7205, 0x1fd0,\n 0x1fd1, 1, 8, 0x1fe0, 0x1fe1, 1, 8, 0x1fe5, 0x1fe5, 1, 7, 0x214e, 0x214e, 1, -28, 0x2170, 0x217f,\n 1, -16, 0x2184, 0x2184, 1, -1, 0x24d0, 0x24e9, 1, -26, 0x2c30, 0x2c5f, 1, -48, 0x2c61, 0x2c61, 1,\n -1, 0x2c65, 0x2c65, 1, -10795, 0x2c66, 0x2c66, 1, -10792, 0x2c68, 0x2c6c, 2, -1, 0x2c73, 0x2c73,\n 1, -1, 0x2c76, 0x2c76, 1, -1, 0x2c81, 0x2ce3, 2, -1, 0x2cec, 0x2cee, 2, -1, 0x2cf3, 0x2cf3, 1, -1,\n 0x2d00, 0x2d25, 1, -7264, 0x2d27, 0x2d27, 1, -7264, 0x2d2d, 0x2d2d, 1, -7264, 0xa641, 0xa66d, 2,\n -1, 0xa681, 0xa69b, 2, -1, 0xa723, 0xa72f, 2, -1, 0xa733, 0xa76f, 2, -1, 0xa77a, 0xa77c, 2, -1,\n 0xa77f, 0xa787, 2, -1, 0xa78c, 0xa78c, 1, -1, 0xa791, 0xa793, 2, -1, 0xa794, 0xa794, 1, 48,\n 0xa797, 0xa7a9, 2, -1, 0xa7b5, 0xa7c3, 2, -1, 0xa7c8, 0xa7ca, 2, -1, 0xa7cd, 0xa7db, 2, -1,\n 0xa7f6, 0xa7f6, 1, -1, 0xab53, 0xab53, 1, -928, 0xab70, 0xabbf, 1, -38864, 0xff41, 0xff5a, 1, -32,\n 0x10428, 0x1044f, 1, -40, 0x104d8, 0x104fb, 1, -40, 0x10597, 0x105bb, 2, -39, 0x10598, 0x105a0, 2,\n -39, 0x105a4, 0x105b0, 2, -39, 0x105b4, 0x105b8, 2, -39, 0x105bc, 0x105bc, 1, -39, 0x10cc0,\n 0x10cf2, 1, -64, 0x10d70, 0x10d85, 1, -32, 0x118c0, 0x118df, 1, -32, 0x16e60, 0x16e7f, 1, -32,\n 0x16ebb, 0x16ed3, 1, -27, 0x1e922, 0x1e943, 1, -34,\n];\n\n/** Simple uppercase mapping of one code point, or the code point itself when it has none. */\nexport function simpleUppercase(cp: number): number {\n for (let i = 0; i < SIMPLE_UPPERCASE.length; i += 4) {\n const start = SIMPLE_UPPERCASE[i] as number;\n if (cp < start) return cp;\n const end = SIMPLE_UPPERCASE[i + 1] as number;\n const step = SIMPLE_UPPERCASE[i + 2] as number;\n if (cp <= end && (cp - start) % step === 0) return cp + (SIMPLE_UPPERCASE[i + 3] as number);\n }\n return cp;\n}\n","/**\n * The three non-code-point values a rule can meet in the array it scans. **They live in the\n * engine, together, and must stay pairwise disjoint.**\n *\n * Disjointness is not tidiness. Each value answers a different question, and a rule that\n * cannot tell them apart answers the wrong one:\n *\n * - `NONE` — there is nothing at that index; the array ends here.\n * - `MARKER` — a span boundary whose skipped region has no line terminator. Per modes.md 3.3\n * it is opaque content everywhere except `OPENISH`/`CLOSEISH`, where it is a member of both.\n * It is explicitly **not** `NONE` and **not** `SPACELIKE`.\n * - `LINE_MARKER` — a span boundary whose skipped region contains a line terminator. A member\n * of `BREAK` for every rule, everywhere, so a mode's output on hard-wrapped prose is\n * identical to `text` mode's on the same characters (modes.md 3.2, 7.4).\n *\n * Two of these were previously equal by accident, in two different pairings, and both cost a\n * defect: rules whose `NONE` was `-1` could not distinguish \"end of array\" from an inline\n * boundary, and `quotes`/`apostrophe` moved their `NONE` to `-2` and collided with the line\n * marker instead. The collisions were invisible only because the two verdicts happened to\n * coincide in the branches those rules had — a coincidence, not a property.\n *\n * **A new sentinel goes here and nowhere else**, takes the next free negative integer, and is\n * classified in modes.md before any rule reads it.\n *\n * These are L1 values: the rules (L1) read them, the mode adapters (L2) write them. Defining\n * them here keeps the dependency pointing downward (ARCHITECTURE.md 2).\n */\nexport const MARKER = -1;\nexport const LINE_MARKER = -2;\nexport const NONE = -3;\n\n/** True for either span boundary. `NONE` is deliberately not a marker: it is not in the array. */\nexport function isMarker(value: number): boolean {\n return value === MARKER || value === LINE_MARKER;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\n\n// spec/rules/apostrophe.md 3.1. The apostrophe is U+2019 in every v1 locale and the case ladder\n// below is structural, not lexical. As of spec 1.1.0 this rule reads no locale data at all and\n// skips no position: 0.5.0's preserve set (apostrophe.md 3.4) existed to stop the ladder from\n// converting the marks `quotes` (order 40) had vetoed, and conversion is now the specified\n// outcome for every position `quotes` vetoes — the ladder's own cases 4 and 3 are exactly what\n// turns `rock 'n' roll` into `rock ’n’ roll`, in every locale.\nconst SQ = 0x27;\nconst RIGHT_SINGLE = 0x2019;\n\n/**\n * Not −1: that is the span boundary marker (spec/rules/modes.md 3.2), and §3.3 forbids a\n * marker inside the array from being indistinguishable from the absence of a neighbour.\n *\n * The verdicts happen to be identical under either reading — verified exhaustively over the\n * whole two-neighbour decision space — because the only two branches the marker can reach\n * (case 3's right-test, case 4's left-test) are disjunctions that already accept `NONE`, and\n * §3.3 puts the marker in exactly the class each of those disjunctions also accepts. That\n * alignment is a coincidence of the class assignment, not a structural guarantee: a future\n * branch accepting `NONE` but not `CLOSEISH`/`OPENISH` would silently diverge. Conforming\n * here makes the agreement a property rather than luck.\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst SPACELIKE: ReadonlySet<number> = new Set([\n 0x20,\n 0x09,\n 0xa0,\n 0x202f,\n 0x2007,\n 0x2009,\n 0x200a,\n // BREAK, including the line-boundary marker: modes.md 3.2 makes it a member for every rule.\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\n// Unlike `quotes`, U+0027 is a member of neither class here and U+2019 is in `CLOSEISH` only;\n// spec 5 turns exactly that asymmetry into the idempotency argument. U+2011 sits beside\n// U+002D because `hyphen` (order 35) converts one to the other. `MARKER` is in both classes\n// per modes.md 3.3, whose table names this rule.\nconst OPENISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x28,\n 0x5b,\n 0x7b,\n 0xab,\n 0x2018,\n 0x201a,\n 0x201b,\n 0x201c,\n 0x201e,\n 0x201f,\n 0x2039,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0xbb,\n 0x2019,\n 0x201d,\n 0x203a,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2d,\n 0x2011,\n 0x2013,\n 0x2014,\n]);\n\n// spec 1.2.0: the quotation glyphs of `OPENISH`, without its brackets and dashes, for case 3a.\n// Brackets stay out so a prime on a function name, `f'(x)`, is left alone. No `MARKER`: case 3\n// already accepts it through `CLOSEISH`.\nconst OPENQUOTE: ReadonlySet<number> = new Set([\n 0xab, 0x2018, 0x201a, 0x201b, 0x201c, 0x201e, 0x201f, 0x2039,\n]);\n\n// spec 1.5.0: the bracket and quotation members of `CLOSEISH`, without its sentence punctuation\n// and without the dashes `OPENISH` already carries, for case 2a. These are exactly the closing\n// delimiters case 3 has always accepted on the mark's RIGHT; before 1.5.0 the left side accepted\n// none of them. No `MARKER` (modes.md 3.3): it is in `OPENISH`, so a mark against a span boundary\n// already reaches case 4 and emits the same U+2019.\nconst CLOSEDELIM: ReadonlySet<number> = new Set([\n 0x29, 0x5d, 0x7d, 0xbb, 0x2019, 0x201d, 0x203a,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/**\n * The case ladder of spec 3.3, first match wins. Every verdict is a pure function of exactly\n * two neighbouring code points; there is no lookahead and no state between candidates.\n */\nfunction isApostrophe(left: number, right: number): boolean {\n // 1 — prime guard, first so it wins over case 3: `6' 2\"`, `55° 40' N`, `6'2\"`.\n if (isDigit(left) && !isLetter(right)) return false;\n // 2 — medial: `don't`, `l'été`, `O'Brien`, `1990's`.\n if (isAlnum(left) && isAlnum(right)) return true;\n // 2a — suffix or possessive after a closing delimiter (spec 1.5.0): `(order 35)'s`,\n // `` `nbsp` (R₈)'s ``, `”word”'s`, `{price}'den`. Disjoint from every other case, so its\n // position in the ladder carries no behaviour.\n if (CLOSEDELIM.has(left) && isAlnum(right)) return true;\n // 3 — trailing elision or possessive: `the dogs' bowls`, `Jesus'`.\n if (isLetter(left) && (right === NONE || SPACELIKE.has(right) || CLOSEISH.has(right)))\n return true;\n // 3a — elision before a quotation (spec 1.2.0): `d'« urine »`, `l'“idea”`, and `„Hans'“`,\n // whose de-DE closing glyph U+201C is not in `CLOSEISH`.\n if (isLetter(left) && OPENQUOTE.has(right)) return true;\n // 4 — leading elision: `’90s`, `’tis`, `’em`. The replacement is U+2019, never U+2018 —\n // a leading elision is a raised comma, not an opening quotation mark, and `quotes` has\n // already had its chance to claim the mark as a quotation and declined (spec 3.2, 5).\n if ((left === NONE || SPACELIKE.has(left) || OPENISH.has(left)) && isAlnum(right)) return true;\n // 5 — nothing inferable: `a ' b`, `''`.\n return false;\n}\n\nexport const apostropheRule: Rule = {\n id: \"apostrophe\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n\n for (let i = 0; i < n; i += 1) {\n if (at(cp, i) !== SQ) continue;\n const left = i > 0 ? at(cp, i - 1) : NONE;\n const right = i + 1 < n ? at(cp, i + 1) : NONE;\n if (isApostrophe(left, right)) {\n edits.push({ start: i, end: i + 1, replacement: [RIGHT_SINGLE], ruleId: \"apostrophe\" });\n }\n }\n\n return edits;\n },\n};\n","import { LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { LocaleData } from \"../types.js\";\n\n/**\n * Structural primitives shared by `dashes` (spec/rules/dashes.md) and `ranges`\n * (spec/rules/ranges.md), spec 0.5.0. Both rules scan the same DASH-token shape and share the\n * same symmetry/isolation/cluster/joiner guards (dashes.md 3.2, 3.2a, 3.2b) — this module is the\n * single source of truth for that shared machinery, so the two rules cannot drift apart the way\n * two independent re-derivations could. Each rule adds only its own branch-specific guards\n * (P1/P4 for `dashes`; G1-G5 for `ranges`) and its own locale style (`dash.parenthetical` vs\n * `dash.range`) on top of what `findDashTokens` returns.\n *\n * Not a `Rule` itself and not registered in `registry.ts` — an internal engine module, exactly\n * like `spans.ts` is to the mode adapters.\n */\n\nexport const HYPHEN_MINUS = 0x2d;\nexport const HYPHEN = 0x2010;\nconst FIGURE_DASH = 0x2012;\nexport const EN_DASH = 0x2013;\nexport const EM_DASH = 0x2014;\nconst HORIZONTAL_BAR = 0x2015;\nexport const MINUS_SIGN = 0x2212;\nconst SMALL_EM_DASH = 0xfe58;\nconst SMALL_HYPHEN_MINUS = 0xfe63;\nconst FULLWIDTH_HYPHEN_MINUS = 0xff0d;\nexport const SPACE = 0x20;\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n/** dashes.md 3.1 JOINER — U+2060, emitted only around a tight range dash (ranges.md 3.3.1). */\nexport const WORD_JOINER = 0x2060;\n\n/** dashes.md 3.1 DASH. See dashes.ts's historical note; unchanged by the ranges split. */\nexport function isDash(cp: number): boolean {\n return (\n cp === HYPHEN_MINUS || cp === HYPHEN || cp === EN_DASH || cp === EM_DASH || cp === MINUS_SIGN\n );\n}\n\n/** dashes.md 3.1 INERT-DASH: never a candidate, never produced, by either rule. */\nexport function isInertDash(cp: number): boolean {\n return (\n cp === 0x00ad ||\n cp === FIGURE_DASH ||\n cp === 0x2011 ||\n cp === HORIZONTAL_BAR ||\n cp === SMALL_EM_DASH ||\n cp === SMALL_HYPHEN_MINUS ||\n cp === FULLWIDTH_HYPHEN_MINUS\n );\n}\n\n/** dashes.md 3.1 DIGIT: ASCII only, deliberately — see dashes.md 7.1. */\nexport function isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nexport function isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nexport function isNoBreakSpace(cp: number): boolean {\n return cp === 0x00a0 || cp === 0x202f;\n}\n\nexport type DashStyle = LocaleData[\"dash\"][\"parenthetical\"];\n\nexport function dashCodePoint(style: DashStyle): number {\n return style === \"em-tight\" || style === \"em-spaced\" ? EM_DASH : EN_DASH;\n}\n\nexport function isSpaced(style: DashStyle): boolean {\n return style === \"em-spaced\" || style === \"en-spaced\";\n}\n\nexport function sameContent(\n cp: readonly number[],\n start: number,\n end: number,\n next: readonly number[],\n): boolean {\n if (end - start !== next.length) return false;\n for (let i = 0; i < next.length; i += 1) {\n if (cp[start + i] !== next[i]) return false;\n }\n return true;\n}\n\n/**\n * dashes.md 3.6: every replacement is built from U+0020 alone. `bind` is meaningful only for\n * `ranges` (dashes.md 3.6 / ranges.md 3.3.1) — `dashes`' parenthetical branch always calls this\n * with `bind = false`, since a parenthetical dash never binds (an interrupting dash is exactly\n * where a line may break).\n */\nexport function buildReplacement(style: DashStyle, bind: boolean): number[] {\n if (!isSpaced(style)) {\n return bind ? [WORD_JOINER, dashCodePoint(style), WORD_JOINER] : [dashCodePoint(style)];\n }\n return [SPACE, dashCodePoint(style), SPACE];\n}\n\n/** dashes.md 3.2 step 9 (T2) — the positions `spaces` (order 10) deletes a U+0020 from. */\nexport function isStripBeforeOrCloseBracket(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === 0x3b ||\n cp === 0x3a ||\n cp === 0x21 ||\n cp === 0x3f ||\n cp === 0x2026 ||\n cp === 0x29 ||\n cp === 0x5d ||\n cp === 0x7d\n );\n}\n\nexport function isOpenBracket(cp: number): boolean {\n return cp === 0x28 || cp === 0x5b || cp === 0x7b;\n}\n\n/**\n * dashes.md 3.2 step 7: the cluster alphabet is DASH ∪ INERT-DASH ∪ DIGIT ∪ JOINER ∪\n * CLOSED-SYMBOL. Shared between `dashes` and `ranges` because a cluster like `2026-08-15` or\n * `known-5-10` can contain runs that belong to either rule, and the whole cluster must be inert\n * to both if it holds two or more dash runs (dashes.md 3.2 step 7).\n *\n * CLOSED-SYMBOL joined the alphabet in spec 1.3.0, when ranges.md 3.2a made a symbol adjacent to\n * a digit run part of a range token's own territory. Without it `a—$15-$20` is two clusters where\n * `a—15-20` is one, so `dashes` converts the em dash, that edit moves the range's `before` from a\n * dash to a space, and the range converts on the NEXT pass — a transform idempotency defect in\n * every locale whose parenthetical form is spaced.\n */\nfunction isClusterMember(cp: number): boolean {\n return isDash(cp) || isInertDash(cp) || isDigit(cp) || cp === WORD_JOINER;\n}\n\nexport function isDashUnion(cp: number): boolean {\n return isDash(cp) || isInertDash(cp);\n}\n\n/** dashes.md 3.2 step 7 — cluster guard. */\nfunction isClusterInert(cp: readonly number[], s: number, e: number): boolean {\n const n = cp.length;\n let start = s;\n while (start > 0 && isClusterMember(cp[start - 1] as number)) start -= 1;\n let end = e;\n while (end < n && isClusterMember(cp[end] as number)) end += 1;\n\n let runs = 0;\n let i = start;\n while (i < end) {\n if (!isDashUnion(cp[i] as number)) {\n i += 1;\n continue;\n }\n runs += 1;\n if (runs >= 2) return true;\n while (i < end && isDashUnion(cp[i] as number)) i += 1;\n }\n return false;\n}\n\n/**\n * dashes.md 3.2b — effective neighbour. Step outward across a maximal run of JOINER and return\n * the index of the first code point that is not one, or -1 if the walk leaves the array. Every\n * guard in either rule that inspects a code point outside its own token's dash run must read one\n * of these — see dashes.md 3.2b for why this is forced rather than chosen (CO-S,\n * pipeline-idempotency.md 5.1a).\n */\nexport function effectiveIndex(cp: readonly number[], from: number, step: number): number {\n let i = from;\n while (i >= 0 && i < cp.length && cp[i] === WORD_JOINER) i += step;\n return i >= 0 && i < cp.length ? i : -1;\n}\n\nexport function effectiveNeighbour(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n return i < 0 ? NONE : (cp[i] as number);\n}\n\n/**\n * ranges.md 3.2a CLOSED-SYMBOL (spec 1.3.0) — the symbols conventionally written closed up to a\n * number, as a literal code-point set. Not a Unicode category test: a category makes the verdict\n * depend on which Unicode version a runtime was built against, and the five runtimes must agree\n * (the same argument ranges.md 7.1 makes for DIGIT being ASCII-only). The Currency Symbols block\n * is enumerated by its bounds, which never move.\n */\nexport function isClosedUpSymbol(cp: number): boolean {\n return (\n cp === 0x0024 || // DOLLAR SIGN\n (cp >= 0x00a2 && cp <= 0x00a5) || // CENT, POUND, CURRENCY, YEN\n (cp >= 0x20a0 && cp <= 0x20bf) || // Currency Symbols block\n cp === 0x0025 || // PERCENT SIGN\n cp === 0x2030 || // PER MILLE SIGN\n cp === 0x2031 || // PER TEN THOUSAND SIGN\n cp === 0x00b0 // DEGREE SIGN\n );\n}\n\n/** ranges.md 3.2a — a token's flanks after the closed-up-symbol walk, with the digit runs the\n * guards and the replacement then read. */\nexport interface RangeFlanks {\n /** Index of the DIGIT on each flank: `L\\u2032`/`R\\u2032` in ranges.md 3.2a. */\n readonly left: number;\n readonly right: number;\n /** First index of Lrun and last index of Rrun. */\n readonly a: number;\n readonly b: number;\n /** Index of the matched outer symbol on each side, or -1. `before`/`after` read past these\n * (ranges.md 3.2a), so that G1-G3 judge the text in front of the whole member. */\n readonly outerLeft: number;\n readonly outerRight: number;\n}\n\n/**\n * ranges.md 3.2 and 3.2a — is this token a range candidate, and where are its digit runs?\n * Returns undefined when it is not one, which is the signal that the token belongs to `dashes`.\n *\n * A side consumes a closed-up symbol only when the opposite member repeats the same code point\n * (`$15-$20`, `35%-50%`). An unmatched symbol leaves the flank a non-DIGIT, so `$15-\\u20ac20` and\n * `15-$20` are not candidates and do not change hands.\n */\nexport function rangeFlanks(\n cp: readonly number[],\n left: number,\n right: number,\n): RangeFlanks | undefined {\n const n = cp.length;\n const innerRight =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? (cp[right] as number)\n : undefined;\n const innerLeft =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? (cp[left] as number)\n : undefined;\n\n const l = innerLeft === undefined ? left : left - 1;\n const r = innerRight === undefined ? right : right + 1;\n if (!isDigit(cp[l] as number) || !isDigit(cp[r] as number)) return undefined;\n\n let a = l;\n while (a > 0 && isDigit(cp[a - 1] as number)) a -= 1;\n let b = r;\n while (b + 1 < n && isDigit(cp[b + 1] as number)) b += 1;\n\n let outerLeft = -1;\n if (innerRight !== undefined) {\n outerLeft = effectiveIndex(cp, a - 1, -1);\n if (outerLeft < 0 || cp[outerLeft] !== innerRight) return undefined;\n }\n let outerRight = -1;\n if (innerLeft !== undefined) {\n outerRight = effectiveIndex(cp, b + 1, 1);\n if (outerRight < 0 || cp[outerRight] !== innerLeft) return undefined;\n }\n\n return { left: l, right: r, a, b, outerLeft, outerRight };\n}\n\n/**\n * dashes.md 3.2 step 8 (T1) — spacing-transition guard. Shared because a `dashes` token\n * becoming spaced can insert a space next to a `ranges` token's digit run (or vice versa is\n * structurally impossible, since `ranges` styles are never `-spaced` in any v1 locale, but the\n * guard is implemented for both regardless of what the current locale data happens to contain —\n * dashes.md 7.11 item 7 notes `dash.range` carries the same five-value enum as\n * `dash.parenthetical`).\n */\n/**\n * T1's reach is transparent to one CLOSED-SYMBOL on either end of a digit run (spec 1.3.0). The\n * digit run this guard protects may be a range member carrying an outer symbol — `$1 - $1--a`,\n * `a--15% - 20%` — and reading the symbol as the neighbour would stop the walk one code point\n * short of the dash it exists to find.\n */\nfunction skipClosedUpSymbol(cp: readonly number[], from: number, step: number): number {\n const i = effectiveIndex(cp, from, step);\n if (i < 0 || !isClosedUpSymbol(cp[i] as number)) return from;\n return i + step;\n}\n\nexport function isSpacingTransitionBlocked(\n cp: readonly number[],\n left: number,\n right: number,\n): boolean {\n const n = cp.length;\n\n // Spec 1.3.0: the reach steps over a CLOSED-SYMBOL that sits between the token and a digit\n // run, because ranges.md 3.2a made that shape a range token — the digit run whose verdict this\n // guard protects is one code point further out than it used to be.\n const l =\n isClosedUpSymbol(cp[left] as number) && left > 0 && isDigit(cp[left - 1] as number)\n ? left - 1\n : left;\n const r =\n isClosedUpSymbol(cp[right] as number) && right + 1 < n && isDigit(cp[right + 1] as number)\n ? right + 1\n : right;\n\n if (isDigit(cp[l] as number)) {\n let d = l;\n while (d > 0 && isDigit(cp[d - 1] as number)) d -= 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d - 1, -1), -1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 - 1, -1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n if (isDigit(cp[r] as number)) {\n let d = r;\n while (d + 1 < n && isDigit(cp[d + 1] as number)) d += 1;\n const i1 = effectiveIndex(cp, skipClosedUpSymbol(cp, d + 1, 1), 1);\n const one = i1 < 0 ? NONE : (cp[i1] as number);\n const two = i1 < 0 ? NONE : effectiveNeighbour(cp, i1 + 1, 1);\n if (isDashUnion(one)) return true;\n if ((one === SPACE || isNoBreakSpace(one)) && isDashUnion(two)) return true;\n }\n\n return false;\n}\n\nexport interface DashToken {\n /** Start/end (exclusive) of the DASH run itself, in input-array indices. */\n readonly s: number;\n readonly e: number;\n readonly lsp: 0 | 1;\n readonly rsp: 0 | 1;\n /** Index of the code point immediately left/right of the token's content, after walking\n * across any adjacent JOINER run (dashes.md 3.2a). */\n readonly left: number;\n readonly right: number;\n readonly leftCp: number;\n readonly rightCp: number;\n /** Start/end of the full edit span, including outer spacing and any joiner this token is\n * re-entering across (dashes.md 3.2a) — meaningful only when `crossedJoiner` is true, which\n * for a non-digit-flanked token always means \"decline\" (see `findDashTokens`'s own doc). */\n readonly spanStart: number;\n readonly spanEnd: number;\n readonly crossedJoiner: boolean;\n}\n\n/**\n * dashes.md 3.2 steps 1-7 and 3.2a, exactly as they read before the `ranges` split — the common\n * prefix every DASH-run token must pass before either rule's own branch-specific guards run.\n * Returns every token that survives symmetry, content, joiner-crossing, isolation and cluster\n * guards; each rule then filters to the tokens it owns:\n *\n * - `ranges` only ever processes a token whose `leftCp`/`rightCp` are both DIGIT.\n * - `dashes` must decline every such token unconditionally (operator decision, spec 0.5.0) —\n * never reinterpreting a digit-flanked stroke as a parenthetical dash, regardless of whether\n * `ranges` is enabled.\n *\n * A token with `crossedJoiner = true` and non-digit flanks is **not** returned at all (declined\n * inline, exactly as dashes.md 3.2a specifies: \"if a joiner was crossed in any other\n * configuration, emit nothing\") — a joiner is `ranges`' own emission alphabet, and an author who\n * types one next to a dash meant it, exactly as with INERT-DASH.\n */\nexport function findDashTokens(cp: readonly number[]): DashToken[] {\n const n = cp.length;\n const tokens: DashToken[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDash(cp[i] as number)) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && isDash(cp[e] as number)) e += 1;\n i = e;\n\n // dashes.md 3.2 step 2 — a run longer than three is decoration, not a dash.\n if (e - s > 3) continue;\n\n const lsp = s > 0 && cp[s - 1] === SPACE ? 1 : 0;\n const rsp = e < n && cp[e] === SPACE ? 1 : 0;\n\n // dashes.md 3.2 step 4 — symmetry guard.\n if (lsp !== rsp) continue;\n\n // dashes.md 3.2 step 5 — content on both sides, on the same line.\n let left = s - 1 - lsp;\n let right = e + rsp;\n if (left < 0 || right >= n) continue;\n\n // dashes.md 3.2a — joiner neighbours.\n let joinStart = left + 1;\n let joinEnd = right;\n while (left >= 0 && cp[left] === WORD_JOINER) left -= 1;\n while (right < n && cp[right] === WORD_JOINER) right += 1;\n if (left < 0 || right >= n) continue;\n const crossedJoiner = left + 1 !== joinStart || right !== joinEnd;\n joinStart = left + 1;\n joinEnd = right;\n\n const leftCp = cp[left] as number;\n const rightCp = cp[right] as number;\n // dashes.md 3.2a — re-entry across a joiner is only ever a bound range `ranges` produced on\n // an earlier pass. As of spec 1.3.0 that shape includes a matched closed-up symbol on a\n // flank (ranges.md 3.2a), so `$15<J>-<J>$20` re-enters the same way `1914<J>-<J>1918` does;\n // without this a second pass would add a second joiner.\n if (crossedJoiner && rangeFlanks(cp, left, right) === undefined) continue;\n if (isBreak(leftCp) || isBreak(rightCp)) continue;\n\n // dashes.md 3.2 step 6 — isolation guard.\n if (isInertDash(leftCp) || isInertDash(rightCp)) continue;\n if (isDash(leftCp) || isDash(rightCp)) continue;\n if (leftCp === SPACE || isNoBreakSpace(leftCp)) continue;\n if (rightCp === SPACE || isNoBreakSpace(rightCp)) continue;\n\n // dashes.md 3.2 step 7 — cluster guard.\n if (isClusterInert(cp, s, e)) continue;\n\n const spanStart = Math.min(s - lsp, joinStart);\n const spanEnd = Math.max(e + rsp, joinEnd);\n\n tokens.push({\n s,\n e,\n lsp: lsp as 0 | 1,\n rsp: rsp as 0 | 1,\n left,\n right,\n leftCp,\n rightCp,\n spanStart,\n spanEnd,\n crossedJoiner,\n });\n }\n\n return tokens;\n}\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n HYPHEN_MINUS,\n HYPHEN,\n MINUS_SIGN,\n EN_DASH,\n buildReplacement,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n findDashTokens,\n rangeFlanks,\n sameContent,\n type DashStyle,\n} from \"./dash-shared.js\";\n\n/**\n * `dashes` — spec/rules/dashes.md (spec 0.5.0), order 30. Parenthetical-dash processing only,\n * as of spec 0.5.0: numeric/date-range recognition moved to the `ranges` rule (order 25,\n * off by default), which owns `dash.range` and shares this rule's token-scanning and guard\n * machinery via `dash-shared.js`. See dashes.md 1 and 7.11, and ranges.md 1, for why the split\n * happened and why range detection is opt-in rather than fixed structurally.\n *\n * A range candidate is declined here **unconditionally** — never reinterpreted as a\n * parenthetical dash — regardless of whether `ranges` is enabled (operator decision, spec\n * 0.5.0). That was already true of every prior spec version: the range/parenthetical branches\n * have always been mutually exclusive per token, on the same test that now decides which rule a\n * token belongs to rather than which branch of one rule it takes. Spec 1.3.0 widened that test\n * from \"both flanks DIGIT\" to `rangeFlanks` (ranges.md 3.2a), so a token whose members repeat a\n * closed-up symbol — `$15 - $20` — moved from this rule to `ranges`, and therefore from\n * converting by default to converting only when the caller enables `ranges`.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\n/** dashes.md 3.1 ROMAN: the seven uppercase Roman-numeral letters only. Lower-case is not a member. */\nfunction isRoman(cp: number): boolean {\n return (\n cp === 0x49 || // I\n cp === 0x56 || // V\n cp === 0x58 || // X\n cp === 0x4c || // L\n cp === 0x43 || // C\n cp === 0x44 || // D\n cp === 0x4d // M\n );\n}\n\n/**\n * dashes.md 3.4 P4 — Roman-numeral veto. A tight dash between two word-bounded ROMAN runs is a\n * range already in its correct Russian form (`в XV—XVII веках`); `ranges` cannot see it, because\n * ranges.md 3.3 needs a DIGIT on each side, so without this the parenthetical branch would space\n * out input that was already right.\n *\n * A veto only: it never converts. Admitting ROMAN runs as range candidates would also fix\n * `XV-XVII`, but it fires on all-caps words built from the same letters (`MIX`, `CIVIL`), and\n * converting is the direction that damages. The miss is recorded in dashes.md 7.10.\n */\nfunction isRomanFlanked(cp: readonly number[], left: number, right: number): boolean {\n const n = cp.length;\n\n if (!isRoman(cp[left] as number) || !isRoman(cp[right] as number)) return false;\n\n let a = left;\n while (a > 0 && isRoman(cp[a - 1] as number)) a -= 1;\n if (a > 0 && isLetter(cp[a - 1] as number)) return false;\n\n let b = right;\n while (b + 1 < n && isRoman(cp[b + 1] as number)) b += 1;\n if (b + 1 < n && isLetter(cp[b + 1] as number)) return false;\n\n return true;\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.parenthetical;\n\n for (const token of findDashTokens(cp)) {\n const { s, e, leftCp, rightCp, left, right, lsp, rsp } = token;\n\n // A range candidate is `ranges`' territory, never `dashes`' — declined unconditionally,\n // whether or not `ranges` is enabled (operator decision, spec 0.5.0). Since spec 1.3.0 a\n // candidate may carry a matched closed-up symbol on a flank (ranges.md 3.2a), which is why\n // this is `rangeFlanks` rather than a digit test on both flanks.\n if (rangeFlanks(cp, left, right) !== undefined) continue;\n\n // dashes.md 3.4 P5 — authored en-dash mark-identity veto (spec 0.6.0). A run consisting of\n // exactly one U+2013 is declined unconditionally: every locale, tight or spaced, regardless\n // of `dash.parenthetical`'s target glyph. Unlike P1/P4 this is not conditioned on the\n // replacement that would be chosen — an en-spaced locale's own tight-authored en-dash is\n // just as protected as an em-target locale's, because the failure this guards against\n // (an authored en-dash silently re-spaced into ordinary parenthetical punctuation) can\n // corrupt a range or joint-name reading in an en-spaced locale exactly as it can in an\n // em-target one; only the glyph substitution differs, not the risk. See §8.8 for the\n // fresh-evidence argument this guard rests on and why it does not reopen the pre-0.2.0\n // guards §8.1 retired.\n if (e - s === 1 && cp[s] === EN_DASH) continue;\n\n // dashes.md 3.4 P1 — a bare hyphen-shaped stroke must be spaced (the compound-word guard).\n if (\n e - s === 1 &&\n (cp[s] === HYPHEN_MINUS || cp[s] === HYPHEN || cp[s] === MINUS_SIGN) &&\n lsp === 0\n ) {\n continue;\n }\n // dashes.md 3.4 P4 — Roman-numeral veto.\n if (lsp === 0 && rsp === 0 && isRomanFlanked(cp, left, right)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, left, right)) continue;\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(rightCp)) continue;\n if (isOpenBracket(leftCp)) continue;\n }\n\n // `dashes` never binds: an interrupting dash is exactly where a line may break\n // (dashes.md 3.3.1's binding is `ranges`-only).\n const replacement = buildReplacement(style, false);\n const spanStart = s - lsp;\n const spanEnd = e + rsp;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"dashes\" });\n }\n\n return edits;\n}\n\nexport const dashesRule: Rule = {\n id: \"dashes\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/ellipsis.md 3.1.\nconst DOT = 0x2e;\nconst ELL = 0x2026;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === DOT || cp === ELL;\n}\n\nfunction isTerminal(cp: number): boolean {\n return cp === EXCLAMATION || cp === QUESTION;\n}\n\nfunction isSameRun(\n cp: readonly number[],\n s: number,\n e: number,\n target: readonly number[],\n): boolean {\n if (e - s !== target.length) return false;\n for (let j = 0; j < target.length; j += 1) {\n if (at(cp, s + j) !== target[j]) return false;\n }\n return true;\n}\n\nexport const ellipsisRule: Rule = {\n id: \"ellipsis\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const abbreviated = ctx.locale.ellipsis.abbreviatedAfterTerminal;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (!isDotlike(at(cp, i))) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n let q = 0;\n while (e < n && isDotlike(at(cp, e))) {\n if (at(cp, e) === ELL) q += 1;\n e += 1;\n }\n const k = e - s;\n const left = at(cp, s - 1);\n\n // One decision per run, one edit per run (spec/rules/ellipsis.md 3.3 step 6).\n const target = runTarget(k, q, left, abbreviated);\n if (target !== null && !isSameRun(cp, s, e, target)) {\n edits.push({ start: s, end: e, replacement: target, ruleId: \"ellipsis\" });\n }\n i = e;\n }\n\n return edits;\n },\n};\n\n/** `null` means \"emit nothing\"; otherwise the final form of the whole run. */\nfunction runTarget(\n k: number,\n q: number,\n left: number,\n abbreviated: boolean,\n): readonly number[] | null {\n if (k === 2 && q === 0) {\n // The two-dot run is unconditionally inert where `?..` is the correct output form; that\n // is what stops `?..` ⇄ `?…` from oscillating (spec/rules/ellipsis.md 5).\n if (abbreviated) return null;\n if (isTerminal(left)) return [ELL];\n return null;\n }\n if (k === 1 && q === 0) return null;\n // k = 1 with an existing U+2026, or any run of 2+ containing one: normalise, then decide\n // the abbreviated form on the same span.\n if (abbreviated && isTerminal(left)) return [DOT, DOT];\n return [ELL];\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n/**\n * `hyphen` — spec/rules/hyphen.md (spec 0.1.0), order 35.\n *\n * Replaces U+002D with U+2011 inside listed morphological forms. Explicit index-based\n * scanning over the code-point array only: no regex, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst HYPHEN_MINUS = 0x2d;\nconst NON_BREAKING_HYPHEN = 0x2011;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** 3.1 `HYPHENISH`. U+2010, U+00AD, U+2012, U+2013, U+2014 are deliberately absent. */\nfunction isHyphenish(cp: number): boolean {\n return cp === HYPHEN_MINUS || cp === NON_BREAKING_HYPHEN;\n}\n\n/**\n * 3.1 `WORDISH` = ALNUM ∪ HYPHENISH. U+2011 is a member on purpose: without it a converted\n * hyphen would flip a neighbouring form's boundary verdict between runs (5).\n */\nfunction isWordish(cp: number): boolean {\n return isDigit(cp) || isLetter(cp) || isHyphenish(cp);\n}\n\n/** 3.4: the three lists, in the order that breaks a length tie. */\ntype ListKind = 0 | 1 | 2;\nconst COMPOUND: ListKind = 0;\nconst PREFIX: ListKind = 1;\nconst SUFFIX: ListKind = 2;\n\ninterface Pattern {\n readonly cps: readonly number[];\n readonly kind: ListKind;\n}\n\nfunction preparePatterns(\n entries: readonly string[],\n field: string,\n kind: ListKind,\n out: Pattern[],\n): void {\n for (const entry of entries) {\n const cps = toCodePoints(entry);\n let hasHyphen = false;\n for (const cp of cps) {\n if (cp === HYPHEN_MINUS) hasHyphen = true;\n }\n if (!hasHyphen) {\n throw new PolytypoError(\n \"POLYTYPO_MALFORMED_LOCALE_DATA\",\n `hyphen.${field} entry \"${entry}\" contains no U+002D; there is nothing for the rule to convert (spec/rules/hyphen.md §2).`,\n );\n }\n out.push({ cps, kind });\n }\n}\n\n/**\n * 3.3 — hyphen-lenient, first-character-lenient literal matching. The hyphen leniency covers\n * `j = 0` too, because a suffix entry begins with its own hyphen and must keep matching after\n * it has been converted.\n */\nfunction matchesAt(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (p === HYPHEN_MINUS) {\n if (!isHyphenish(c)) return false;\n continue;\n }\n if (c === p) continue;\n if (j === 0 && isLetter(p) && c === simpleUppercase(p)) continue;\n return false;\n }\n return true;\n}\n\nfunction bind(index: number): Edit {\n return { start: index, end: index + 1, replacement: [NON_BREAKING_HYPHEN], ruleId: \"hyphen\" };\n}\n\n/** 3.4 C — a compound is a whole word. */\nfunction guardCompound(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\n/** 3.4 P — a prefix starts a word and must actually prefix something. */\nfunction guardPrefix(cp: readonly number[], a: number, k: number): boolean {\n const before = at(cp, a - 1);\n if (before !== NONE && isWordish(before)) return false;\n return isLetter(at(cp, a + k));\n}\n\n/** 3.4 S — a suffix must actually suffix something and must end the word. */\nfunction guardSuffix(cp: readonly number[], a: number, k: number): boolean {\n if (!isLetter(at(cp, a - 1))) return false;\n const after = at(cp, a + k);\n return after === NONE || !isWordish(after);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const { hyphen } = ctx.locale;\n // 2: with all three lists empty the rule emits nothing for any input.\n if (\n hyphen.prefixes.length === 0 &&\n hyphen.suffixes.length === 0 &&\n hyphen.compounds.length === 0\n ) {\n return [];\n }\n\n // 3.4: one candidate per index — the longest entry that matches, ties broken compounds,\n // prefixes, suffixes. Sorting once makes the selection a first-hit linear search.\n const patterns: Pattern[] = [];\n preparePatterns(hyphen.compounds, \"compounds\", COMPOUND, patterns);\n preparePatterns(hyphen.prefixes, \"prefixes\", PREFIX, patterns);\n preparePatterns(hyphen.suffixes, \"suffixes\", SUFFIX, patterns);\n patterns.sort((a, b) => b.cps.length - a.cps.length || a.kind - b.kind);\n\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let a = 0;\n while (a < n) {\n let selected: Pattern | undefined;\n for (const pattern of patterns) {\n if (matchesAt(cp, a, pattern.cps)) {\n selected = pattern;\n break;\n }\n }\n if (selected === undefined) {\n a += 1;\n continue;\n }\n\n // 3.4: matching and guarding are separate steps, and there is no backtracking. A guard\n // failure ends the position; no shorter entry is tried at `a`.\n const w = selected.cps;\n const k = w.length;\n if (selected.kind === COMPOUND) {\n if (!guardCompound(cp, a, k)) {\n a += 1;\n continue;\n }\n for (let j = 0; j < k; j += 1) {\n if (w[j] === HYPHEN_MINUS && cp[a + j] === HYPHEN_MINUS) edits.push(bind(a + j));\n }\n } else if (selected.kind === PREFIX) {\n if (!guardPrefix(cp, a, k)) {\n a += 1;\n continue;\n }\n // The entry's own last code point is the hyphen.\n if (w[k - 1] === HYPHEN_MINUS && cp[a + k - 1] === HYPHEN_MINUS) edits.push(bind(a + k - 1));\n } else {\n if (!guardSuffix(cp, a, k)) {\n a += 1;\n continue;\n }\n // A suffix is matched at its own hyphen.\n if (w[0] === HYPHEN_MINUS && cp[a] === HYPHEN_MINUS) edits.push(bind(a));\n }\n a += k;\n }\n return edits;\n}\n\nexport const hyphenRule: Rule = {\n id: \"hyphen\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter, isUpper, simpleUppercase } from \"../engine/unicode.js\";\nimport { PolytypoError } from \"../errors.js\";\nimport type { Edit, InitialBinding, LocaleData, Rule, RuleContext } from \"../types.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\n\n/**\n * `nbsp` — spec/rules/nbsp.md (spec 0.1.0), order 70 (last).\n *\n * Ten sub-rules, N1…N10, evaluated in that fixed order; each claims indices, and the first\n * claim at an index wins (spec 3.2). The claim table is a positional array, never a map:\n * a map-iteration implementation would resolve conflicts differently in Go\n * (ARCHITECTURE.md 4.5). No regex, no native-string indexing (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst SPACE = 0x20;\nconst TAB = 0x09;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\nconst FULL_STOP = 0x2e;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PAREN_OPEN = 0x28;\nconst SQUARE_OPEN = 0x5b;\nconst BRACE_OPEN = 0x7b;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\nconst BRACE_CLOSE = 0x7d;\n\nconst SEMICOLON = 0x3b;\nconst AMPERSAND = 0x26;\nconst HASH = 0x23;\n/** The longest HTML named reference is 31 code points (`CounterClockwiseContourIntegral`). */\nconst MAX_CHARACTER_REFERENCE_NAME = 32;\n\nconst EN_DASH = 0x2013;\nconst EM_DASH = 0x2014;\nconst ELLIPSIS = 0x2026;\n\n/** Not a code point: stands for \"index out of range\" (spec 3.1 `NONE`). */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nexport function at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** 3.1 `BREAK`. */\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === 0x0a ||\n cp === 0x0d ||\n cp === 0x0b ||\n cp === 0x0c ||\n cp === 0x85 ||\n cp === 0x2028 ||\n cp === 0x2029 ||\n cp === LINE_MARKER\n );\n}\n\nfunction isNoBreak(cp: number): boolean {\n return cp === NBSP || cp === NNBSP;\n}\n\n/**\n * 3.1 `OTHER-SPACE`: the fixed-width spaces. In `SPACELIKE`, so they read as a boundary, but\n * never converted and never an \"already correct\" state — §4 promises a thin or figure space\n * the author placed is left exactly where it is.\n */\nfunction isOtherSpace(cp: number): boolean {\n return (cp >= 0x2000 && cp <= 0x200a) || cp === 0x205f || cp === 0x3000;\n}\n\n/**\n * 3.1 `SPACELIKE` — and `NOBREAK ⊂ SPACELIKE`. Every boundary test in this rule uses this\n * predicate and never U+0020 alone; that single decision is what makes the rule idempotent.\n */\nexport function isSpaceLike(cp: number): boolean {\n return cp === SPACE || isNoBreak(cp) || cp === TAB || isOtherSpace(cp) || isBreak(cp);\n}\n\n/**\n * 3.1 `SENTENCE-DASH` — U+2013 and U+2014 only, the left boundary of N3, N9 and N10.\n *\n * A hyphen is deliberately excluded, U+002D and U+2011 alike: it marks an *intra-word*\n * position, so the token after it is not a free-standing word. With U+2011 accepted, `из-за\n * дождя` bound twice — `hyphen` produced `из‑за` and N3 then read the compound's tail `за` as\n * the listed preposition (3.5 step 2). An em or en dash does open a phrase, so `— в Москве`\n * still binds.\n */\nfunction isSentenceDash(cp: number): boolean {\n return cp === EN_DASH || cp === EM_DASH;\n}\n\ninterface QuoteTarget {\n readonly open: number;\n readonly close: number;\n readonly target: number;\n}\n\n/** Locale data, resolved to code points once per call. No module-level state (ARCHITECTURE.md 7). */\nexport interface Prepared {\n readonly beforePunctuation: readonly number[];\n readonly narrowBeforePunctuation: readonly number[];\n readonly shortWords: readonly (readonly number[])[];\n readonly abbreviations: readonly (readonly number[])[];\n readonly units: readonly (readonly number[])[];\n readonly beforeNumber: readonly (readonly number[])[];\n readonly beforeWord: readonly (readonly number[])[];\n readonly symbols: readonly (readonly number[])[];\n readonly initialBinding: InitialBinding;\n readonly opens: readonly number[];\n readonly closes: readonly number[];\n readonly quotePairs: readonly QuoteTarget[];\n /** nbsp.md §3.1a NARROW-TARGET: what N2 writes, and what N8 writes for a `narrow-nbsp` pair. */\n readonly narrowTarget: number;\n}\n\nfunction malformed(message: string): never {\n throw new PolytypoError(\"POLYTYPO_MALFORMED_LOCALE_DATA\", message);\n}\n\nfunction singleCodePoint(entry: string, field: string): number {\n const cps = toCodePoints(entry);\n const first = cps[0];\n if (cps.length !== 1 || first === undefined) {\n malformed(`nbsp.${field} entry \"${entry}\" is not exactly one code point.`);\n }\n return first;\n}\n\nfunction contains(list: readonly number[], cp: number): boolean {\n for (const value of list) {\n if (value === cp) return true;\n }\n return false;\n}\n\n/** Longest first, so each sub-rule's \"longest match wins at a given `a`\" is a linear search. */\nfunction prepareList(entries: readonly string[]): (readonly number[])[] {\n const out = entries.map((entry) => toCodePoints(entry));\n out.sort((a, b) => b.length - a.length);\n return out;\n}\n\n/**\n * nbsp.md §3.1a: `narrowTarget` is NARROW-TARGET, already resolved by the caller — U+202F by\n * default, U+00A0 when `narrowNbsp: \"nbsp\"`. It is threaded into `prepare` so N2's and N8's\n * targets move together; nothing else in this rule changes, and §5's idempotency argument carries\n * over because every sub-rule's \"already correct\" branch recognises its own target.\n */\nexport function prepare(locale: LocaleData, narrowTarget: number = NNBSP): Prepared {\n const data = locale.nbsp;\n const beforePunctuation = data.beforePunctuation.map((entry) =>\n singleCodePoint(entry, \"beforePunctuation\"),\n );\n const narrowBeforePunctuation = data.narrowBeforePunctuation.map((entry) =>\n singleCodePoint(entry, \"narrowBeforePunctuation\"),\n );\n // 2: the two arrays must be disjoint. The schema does not enforce it, and picking a winner\n // silently would make N1's precedence load-bearing where the spec says it must not be.\n for (const cp of beforePunctuation) {\n if (contains(narrowBeforePunctuation, cp)) {\n malformed(\n `nbsp.beforePunctuation and nbsp.narrowBeforePunctuation both list U+${cp.toString(16).toUpperCase().padStart(4, \"0\")}; they must be disjoint (spec/rules/nbsp.md §2).`,\n );\n }\n }\n\n const primary = locale.quotes.primary;\n const secondary = locale.quotes.secondary;\n const opens = [\n PAREN_OPEN,\n SQUARE_OPEN,\n BRACE_OPEN,\n singleCodePoint(primary.open, \"quotes.primary.open\"),\n singleCodePoint(secondary.open, \"quotes.secondary.open\"),\n ];\n const closes = [\n PAREN_CLOSE,\n SQUARE_CLOSE,\n BRACE_CLOSE,\n singleCodePoint(primary.close, \"quotes.primary.close\"),\n singleCodePoint(secondary.close, \"quotes.secondary.close\"),\n ];\n\n const quotePairs: QuoteTarget[] = [];\n for (const pair of [primary, secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = singleCodePoint(pair.open, \"quotes.open\");\n const close = singleCodePoint(pair.close, \"quotes.close\");\n // 3.10 sidedness precondition: an open glyph equal to its close glyph cannot be told\n // apart without the pairing information only `quotes` has. Documented no-op (§7.5).\n if (open === close) continue;\n quotePairs.push({ open, close, target: pair.innerSpace === \"nbsp\" ? NBSP : narrowTarget });\n }\n\n return {\n beforePunctuation,\n narrowBeforePunctuation,\n shortWords: prepareList(data.afterShortWords),\n abbreviations: prepareList(data.abbreviations),\n units: prepareList(data.beforeUnits),\n beforeNumber: prepareList(data.beforeNumber),\n beforeWord: prepareList(data.beforeWord),\n symbols: prepareList(data.afterSymbols),\n initialBinding: data.initialBinding,\n opens,\n closes,\n quotePairs,\n narrowTarget,\n };\n}\n\n/**\n * 3.1 `OPENISH` / `CLOSEISH`: the ASCII brackets plus every locale quote glyph.\n *\n * The inline span boundary `MARKER` is in `CLOSEISH` and not in `OPENISH` (spec 1.2.0, nbsp.md\n * §7 item 12, modes.md 3.3). `CLOSEISH` is read only by N1/N2's right-context guard, where the\n * marker lets the no-break space come back after `spaces` deleted the typed one in\n * `<strong>gel :</strong>`. In `OPENISH` it would make the quote-glyph guard decline\n * `<em>non</em> !`.\n */\nexport function isOpenish(prep: Prepared, cp: number): boolean {\n return contains(prep.opens, cp);\n}\n\nfunction isCloseish(prep: Prepared, cp: number): boolean {\n return cp === MARKER || contains(prep.closes, cp);\n}\n\nfunction isMark(prep: Prepared, cp: number): boolean {\n return contains(prep.beforePunctuation, cp) || contains(prep.narrowBeforePunctuation, cp);\n}\n\ntype Claims = (Edit | undefined)[];\n\n/** 3.2: the first sub-rule to claim an index wins; every later edit at that index is discarded. */\nfunction claimConversion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index + 1, replacement: [target], ruleId: \"nbsp\" };\n}\n\nfunction claimInsertion(claims: Claims, index: number, target: number): void {\n if (claims[index] !== undefined) return;\n claims[index] = { start: index, end: index, replacement: [target], ruleId: \"nbsp\" };\n}\n\ntype Matcher = (cp: readonly number[], a: number, w: readonly number[]) => boolean;\n\nfunction matchExact(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.5 step 1: exact except that the first code point may be its simple uppercase mapping. */\nfunction matchFirstCharLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n const first = w[0];\n if (first === undefined) return false;\n const head = cp[a];\n if (head !== first && head !== simpleUppercase(first)) return false;\n for (let j = 1; j < w.length; j += 1) {\n if (cp[a + j] !== w[j]) return false;\n }\n return true;\n}\n\n/** 3.6 step 1: exact except that a pattern U+0020 also matches U+00A0 or U+202F. */\nfunction matchSpaceLenient(cp: readonly number[], a: number, w: readonly number[]): boolean {\n if (a + w.length > cp.length) return false;\n for (let j = 0; j < w.length; j += 1) {\n const p = w[j] as number;\n const c = cp[a + j] as number;\n if (c === p) continue;\n if (p === SPACE && isNoBreak(c)) continue;\n return false;\n }\n return true;\n}\n\n/**\n * 3.5, normative for N3, N4, N5, N6, N9 and N10: the longest entry that matches at `a` is\n * selected, the sub-rule's guards are applied to *that* entry, and there is no backtracking —\n * a shorter entry is never retried when the longest one fails a guard.\n */\nfunction longestMatch(\n patterns: readonly (readonly number[])[],\n cp: readonly number[],\n a: number,\n matcher: Matcher,\n): readonly number[] | undefined {\n for (const w of patterns) {\n if (matcher(cp, a, w)) return w;\n }\n return undefined;\n}\n\n/** N1 (3.3) and N2 (3.4) differ only in which no-break space is the target. */\nfunction punctuationSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n marks: readonly number[],\n target: number,\n other: number,\n): void {\n if (marks.length === 0) return;\n for (let i = 0; i < cp.length; i += 1) {\n if (!contains(marks, cp[i] as number)) continue;\n const left = at(cp, i - 1);\n // Step 1 — run guard: only the first mark of `?!` or `!!!` takes the space.\n if (left !== NONE && isMark(prep, left)) continue;\n // Step 2 — right-context guard: this is what protects `http://` and `12:30`.\n const after = at(cp, i + 1);\n // U+2026 is accepted: the guard exists to catch punctuation *inside a token*, and an\n // ellipsis after a question mark is not that. `Vraiment?…` must take the same space\n // `Vraiment ?` does, whether or not `ellipsis` (order 20) has already run.\n if (\n after !== NONE &&\n !isSpaceLike(after) &&\n !isCloseish(prep, after) &&\n after !== ELLIPSIS &&\n !isMark(prep, after)\n ) {\n continue;\n }\n // Step 3 — quote-glyph guard. The space beside an opening quotation glyph is\n // `quotes.innerSpace` and belongs to N8 alone. Without this, N2 and N8 want different\n // code points at one index, and \"already correct\" claims nothing, so the two alternate\n // for ever on the French input `«?` (3.2, 3.10.1).\n if (isOpenish(prep, left)) continue;\n if (left !== NONE && isSpaceLike(left) && isOpenish(prep, at(cp, i - 2))) continue;\n // Step 4 (spec 1.3.0) — character-reference guard. In text mode there is no markup concept\n // at all, so `fr`, whose narrowBeforePunctuation lists `;`, used to insert U+202F before the\n // `;` that *ends* a reference: `Bonjour&#160;: oui` and `Tom &amp; Jerry` stopped being what\n // they were. Shape, not the named-reference table: declining on `&notaname;` costs nothing,\n // and five runtimes are not going to carry thousands of identical entries for it.\n if (cp[i] === SEMICOLON && endsCharacterReference(cp, i)) continue;\n // Step 5.\n if (left === target) continue;\n if (left === SPACE || left === other) {\n claimConversion(claims, i - 1, target);\n continue;\n }\n // A fixed-width space stays as typed, and nothing is inserted beside it.\n if (isOtherSpace(left)) continue;\n if (left === NONE || isBreak(left) || left === TAB) continue;\n claimInsertion(claims, i, target);\n }\n}\n\n/**\n * 3.3 step 4: do the code points left of this `;` have the shape of a character reference?\n * A bounded left walk over ASCII alphanumerics, optionally one `#`, then `&`. The bound is the\n * longest named reference (31) plus one, so the walk cannot run away down a long token.\n */\nfunction endsCharacterReference(cp: readonly number[], i: number): boolean {\n let j = i - 1;\n while (j >= 0 && isAsciiAlphanumeric(cp[j] as number)) j -= 1;\n const len = i - 1 - j;\n if (len < 1 || len > MAX_CHARACTER_REFERENCE_NAME) return false;\n if (j >= 0 && cp[j] === HASH) j -= 1;\n return j >= 0 && cp[j] === AMPERSAND;\n}\n\nfunction isAsciiAlphanumeric(c: number): boolean {\n return (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a);\n}\n\n/** N3 — 3.5 `afterShortWords`. */\nfunction shortWordsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.shortWords.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.shortWords, cp, a, matchFirstCharLenient);\n if (w === undefined) continue;\n const k = w.length;\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (!isAlnum(next) && !isOpenish(prep, next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** N4 — 3.6 `abbreviations`. */\nfunction abbreviationsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.abbreviations.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.abbreviations, cp, a, matchSpaceLenient);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n if (isAlnum(at(cp, a + k))) continue;\n for (let j = 0; j < k; j += 1) {\n if (w[j] !== SPACE) continue;\n if (cp[a + j] === NBSP) continue;\n claimConversion(claims, a + j, NBSP);\n }\n }\n}\n\n/** N5 — 3.7 `beforeUnits`. Converts an existing space; never inserts one (§7.2). */\nfunction unitsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.units.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.units, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a + k))) continue;\n const left = at(cp, a - 1);\n if (left === NBSP) continue;\n if (left !== SPACE) continue;\n if (!isDigit(at(cp, a - 2))) continue;\n let b = a - 2;\n while (b - 1 >= 0 && isDigit(cp[b - 1] as number)) b -= 1;\n // The letter guard: `H2 O`, `A4`, `MP3` are not measurements.\n if (isLetter(at(cp, b - 1))) continue;\n claimConversion(claims, a - 1, NBSP);\n }\n}\n\n/** N6 — 3.8 `afterSymbols`. Conversion only. */\nfunction symbolsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n if (prep.symbols.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(prep.symbols, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n if (isAlnum(at(cp, a - 1))) continue;\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n if (!isDigit(at(cp, a + k + 1))) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\n/** 3.9: one uppercase letter, one full stop, at a token start. */\nexport function isInitialAt(cp: readonly number[], prep: Prepared, p: number): boolean {\n if (p < 0) return false;\n if (!isUpper(at(cp, p))) return false;\n if (at(cp, p + 1) !== FULL_STOP) return false;\n const before = at(cp, p - 1);\n return before === NONE || isSpaceLike(before) || isOpenish(prep, before);\n}\n\n/**\n * 3.9 guard C1-a: an uppercase letter plus a dot that is itself preceded by a *lower-case*\n * letter plus a dot is the second token of an abbreviation, not an initial. Without it the\n * shipped `de-DE` data turns `z. B. Berlin` into `z.⍽B.⍽Berlin` — a false positive on\n * ordinary prose. `А. С. Пушкин` is unaffected: `cp[p-3]` there is uppercase.\n */\nexport function isAbbreviationTail(cp: readonly number[], p: number): boolean {\n if (!isSpaceLike(at(cp, p - 1))) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n const head = at(cp, p - 3);\n return isLetter(head) && !isUpper(head);\n}\n\n/**\n * 3.9 chain confirmation: is the initial whose letter sits at `p` itself immediately preceded by\n * another initial (`cp[p-1]` space-like, `cp[p-2]` a full stop, and `isInitialAt(p-3)`)? Used only\n * by `\"chain\"` mode's C1, to require Chicago's own \"two or more initials\" before the space\n * leading into a following non-initial word (a candidate surname) is bound — see nbsp.md §3.9.\n */\nexport function hasPrecedingInitial(cp: readonly number[], prep: Prepared, p: number): boolean {\n const gap = at(cp, p - 1);\n if (gap !== SPACE && gap !== NBSP) return false;\n if (at(cp, p - 2) !== FULL_STOP) return false;\n return isInitialAt(cp, prep, p - 3);\n}\n\n/** N7 — 3.9 `initialBinding`. */\nfunction initialsSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n const mode: InitialBinding = prep.initialBinding;\n if (mode === \"none\") return;\n for (let q = 0; q < cp.length; q += 1) {\n const here = cp[q] as number;\n if (here !== SPACE && here !== NBSP) continue;\n // C1 — an initial on the left and an uppercase letter on the right, unless C1-a declines.\n const leftInitialP = q - 2;\n const c1Shape =\n at(cp, q - 1) === FULL_STOP &&\n isInitialAt(cp, prep, leftInitialP) &&\n isUpper(at(cp, q + 1)) &&\n !isAbbreviationTail(cp, leftInitialP);\n // `\"chain\"` mode additionally requires either that the right side is itself an initial (the\n // between-initials case, e.g. `E.|B.`, always safe) or that the left initial is itself\n // preceded by another initial (a confirmed chain of two or more, e.g. `E. B.|White`) before\n // binding to a plain following word. `\"single\"` mode keeps the unconditional shape check —\n // that is the behaviour `fr`/`fr-CA` need for `N. Bourbaki`/`M. Dupont` (nbsp.md §3.9,\n // Jacques André) and cannot structurally distinguish from a sentence-boundary collision.\n const c1 =\n c1Shape &&\n (mode === \"single\" ||\n isInitialAt(cp, prep, q + 1) ||\n hasPrecedingInitial(cp, prep, leftInitialP));\n // C2 — a word on the left and two consecutive initials on the right (`Пушкин А. С.`). Already\n // requires two initials by construction, so it is unaffected by `\"chain\"` vs `\"single\"`.\n const rightSpace = at(cp, q + 3);\n const c2 =\n isLetter(at(cp, q - 1)) &&\n isInitialAt(cp, prep, q + 1) &&\n (rightSpace === SPACE || rightSpace === NBSP) &&\n isInitialAt(cp, prep, q + 4);\n if (!c1 && !c2) continue;\n if (here === NBSP) continue;\n claimConversion(claims, q, NBSP);\n }\n}\n\n/** N8 — 3.10 `quotes.innerSpace`. The only sub-rule besides N1/N2 that may insert. */\nfunction quotesSubRule(cp: readonly number[], prep: Prepared, claims: Claims): void {\n for (const pair of prep.quotePairs) {\n for (let i = 0; i < cp.length; i += 1) {\n const here = cp[i] as number;\n if (here === pair.open) {\n const right = at(cp, i + 1);\n if (right === pair.target) continue;\n if (right === SPACE || isNoBreak(right)) {\n claimConversion(claims, i + 1, pair.target);\n continue;\n }\n if (right === NONE || isBreak(right)) continue;\n claimInsertion(claims, i + 1, pair.target);\n continue;\n }\n if (here !== pair.close) continue;\n const left = at(cp, i - 1);\n if (left === pair.target) continue;\n if (left === SPACE || isNoBreak(left)) {\n claimConversion(claims, i - 1, pair.target);\n continue;\n }\n if (left === NONE || isBreak(left)) continue;\n claimInsertion(claims, i, pair.target);\n }\n }\n}\n\n/**\n * N9 (3.12 `beforeNumber`) and N10 (3.13 `beforeWord`) share every guard except what must\n * follow the separator: a digit for N9, a letter for N10.\n */\nfunction forwardBindingSubRule(\n cp: readonly number[],\n prep: Prepared,\n claims: Claims,\n patterns: readonly (readonly number[])[],\n wantsDigit: boolean,\n): void {\n if (patterns.length === 0) return;\n for (let a = 0; a < cp.length; a += 1) {\n const w = longestMatch(patterns, cp, a, matchExact);\n if (w === undefined) continue;\n const k = w.length;\n // G-D (3.13 step 5): in a locale where N7 is active, an *uppercase* letter plus a dot is\n // structurally an initial, and N7 owns that shape with better evidence. The UPPER test is\n // load-bearing: without it Russian `г.` would be inert, contradicting §6 case 13a.\n if (\n !wantsDigit &&\n prep.initialBinding !== \"none\" &&\n k === 2 &&\n isUpper(w[0] as number) &&\n w[1] === FULL_STOP\n ) {\n continue;\n }\n // G-L — stronger than \"not ALNUM\": it is what stops `S.` matching inside `Fig.S. 3`.\n const before = at(cp, a - 1);\n if (!(\n before === NONE ||\n isSpaceLike(before) ||\n isOpenish(prep, before) ||\n isSentenceDash(before)\n )) {\n continue;\n }\n // G-S — exactly one separator, and it must already be a space.\n const separator = at(cp, a + k);\n if (separator === NBSP) continue;\n if (separator !== SPACE) continue;\n const next = at(cp, a + k + 1);\n if (isSpaceLike(next)) continue;\n // G-W / \"a following number\": one code point, tested for membership. `NONE` fails both,\n // which is also the line-boundary guard G-B.\n if (wantsDigit ? !isDigit(next) : !isLetter(next)) continue;\n claimConversion(claims, a + k, NBSP);\n }\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const prep = prepare(ctx.locale, ctx.narrowTarget);\n const cp = ctx.cp;\n const claims: Claims = new Array<Edit | undefined>(cp.length + 1);\n\n // 3.2 — N1 … N10, in this order, first claim wins. The order is positional and total, not\n // an artefact of iterating a map.\n //\n // First claim wins only settles a conflict when both sub-rules emit; an \"already correct\"\n // branch claims nothing and yields the index. So sub-rules wanting *different* code points\n // must be disjoint by construction. They are: N3…N7, N9 and N10 all target U+00A0, so any\n // yield between them is a common fixed point. The only cross-target pairs are N1 against N2\n // — kept disjoint by the §2 precondition, which fails loudly — and N1/N2 against N8, which\n // is what the quote-glyph guard above repairs.\n punctuationSubRule(cp, prep, claims, prep.beforePunctuation, NBSP, NNBSP);\n // N2's target is NARROW-TARGET (§3.1a); `other` is the NOBREAK member that is not the target,\n // which is what the sub-rule converts. With the substitution on, N2 and N1 want the same\n // character — never different ones, which is why §5's clause 0 needs no new case.\n punctuationSubRule(\n cp,\n prep,\n claims,\n prep.narrowBeforePunctuation,\n prep.narrowTarget,\n prep.narrowTarget === NBSP ? NNBSP : NBSP,\n );\n shortWordsSubRule(cp, prep, claims);\n abbreviationsSubRule(cp, prep, claims);\n unitsSubRule(cp, prep, claims);\n symbolsSubRule(cp, prep, claims);\n initialsSubRule(cp, prep, claims);\n quotesSubRule(cp, prep, claims);\n forwardBindingSubRule(cp, prep, claims, prep.beforeNumber, true);\n forwardBindingSubRule(cp, prep, claims, prep.beforeWord, false);\n\n const edits: Edit[] = [];\n for (let i = 0; i <= cp.length; i += 1) {\n const claim = claims[i];\n if (claim !== undefined) edits.push(claim);\n }\n return edits;\n}\n\nexport const nbspRule: Rule = {\n id: \"nbsp\",\n apply: scan,\n};\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { MARKER, NONE } from \"../engine/sentinels.js\";\nimport type { ElisionClitics, ElisionIdiom } from \"../types.js\";\n\n/**\n * The structural predicates `quotes` (order 40) reads to decline a pairing — quotes.md 3.2.\n *\n * Two mechanisms, both decline-only, both with the same outcome: the marks survive pass 2\n * unmatched and `apostrophe` (order 50) converts each by its own case ladder (apostrophe.md 3.3\n * cases 4 then 3), giving `rock ’n’ roll`.\n *\n * {@link computeIdiomMatchedIndices} is the locale-cited mechanism (spec 0.4.0): an exact\n * `left`/`elided`/`right` context match against `quotes.elisionIdioms`.\n *\n * {@link computeAmbiguousShapeIndices} is the universal medial-`n` veto (spec 1.1.0): a pair of\n * `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with at least one\n * `INLINE-SPACE` code point immediately outside each mark. It needs no citation because the\n * operator ruled the idiom international (quotes.md 3.2, 2026-09-09), and it vetoes a superset of\n * what the cited en-US entry does.\n *\n * {@link computeSpanBoundaryVetoIndices} is the span-boundary elision veto (spec 1.4.0): a\n * `NARROW` mark whose literal left or right neighbour IS modes.md 3.2's inline boundary marker,\n * with a cited `quotes.elisionClitics` fragment attaching on its other side. It exists because\n * the two mechanisms above both need a real code point on each side, so a possessive or elision\n * written flush against a span (`` `x`'s ``, `l'<em>idée</em>`) escaped both and was paired as a\n * quotation, inverting the enclosing pair (canonical issue #53).\n *\n * Only `quotes` consumes this module. Spec 0.5.0 had `apostrophe` consume it too, through a\n * preserve set that stopped its case ladder from converting marks 0.5.0 wanted preserved;\n * conversion is now the specified outcome, so that set is withdrawn (apostrophe.md 3.4) and\n * `apostrophe` reads no locale data again.\n */\n\n/** quotes.md 3.2 — the one code point this veto's span may enclose, in either case. */\nconst LOWER_N = 0x6e;\nconst UPPER_N = 0x4e;\n\n/** quotes.md 3.1 NARROW — the quote-mark glyphs an elision idiom's marks may appear as across\n * pipeline passes (straight, or already curled by an earlier pass). Canonical definition, shared\n * so `quotes` and `apostrophe` cannot define two slightly different NARROW sets. */\nexport const NARROW: ReadonlySet<number> = new Set([\n 0x27, 0x2018, 0x2019, 0x201a, 0x201b, 0x2039, 0x203a,\n]);\n\n/** quotes.md 3.1 INLINE-SPACE — deliberately excludes BREAK, so this shape never crosses a\n * line/span boundary (modes.md 3.3), matching the existing elisionIdioms anchor exactly. */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Case-insensitive-first-code-point comparison, ASCII-only — the same convention\n * `nbsp.afterShortWords` and the existing idiom matcher use (quotes.ts's own `asciiLower`,\n * relocated here so both consumers share one definition).\n */\nfunction asciiLower(cp: number): number {\n return cp >= 0x41 && cp <= 0x5a ? cp + 0x20 : cp;\n}\n\nfunction isAlnum(cp: number): boolean {\n const DIGIT_ZERO = 0x30;\n const DIGIT_NINE = 0x39;\n return (cp >= DIGIT_ZERO && cp <= DIGIT_NINE) || isLetter(cp);\n}\n\nfunction wordEndsAt(arr: readonly number[], end: number, word: readonly number[]): boolean {\n const start = end - word.length;\n if (start < 0) return false;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const before = start > 0 ? at(arr, start - 1) : NONE;\n return before === NONE || !isAlnum(before);\n}\n\nfunction wordStartsAt(arr: readonly number[], start: number, word: readonly number[]): boolean {\n const n = arr.length;\n for (let k = 0; k < word.length; k += 1) {\n const c = at(arr, start + k);\n const matches = k === 0 ? asciiLower(c) === asciiLower(word[k] as number) : c === word[k];\n if (!matches) return false;\n }\n const after = start + word.length < n ? at(arr, start + word.length) : NONE;\n return after === NONE || !isAlnum(after);\n}\n\ninterface CompiledIdiom {\n readonly left: readonly number[];\n readonly elided: readonly number[];\n readonly right: readonly number[];\n}\n\n/**\n * Listed elision veto (quotes.md 3.2, spec 0.4.0), locale data `quotes.elisionIdioms`. Bounded\n * literal scan for `left, NARROW, elided, NARROW, right` (`rock 'n' roll`'s `{left: \"rock\",\n * elided: \"n\", right: \"roll\"}`). Both marks of a match are returned. Matches on NARROW quote\n * marks generally (U+0027 and already-curly U+2018/U+2019), not only straight ASCII — this is\n * `quotes`' own idempotency requirement (an idiom must still veto pairing on a second pipeline\n * pass, after `apostrophe` has curled the marks) and is unchanged from spec 0.4.0/0.4.1.\n */\nexport function computeIdiomMatchedIndices(\n arr: readonly number[],\n idioms: readonly ElisionIdiom[],\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n if (idioms.length === 0) return vetoed;\n\n const n = arr.length;\n const compiled: readonly CompiledIdiom[] = idioms.map((idiom) => ({\n left: toCodePoints(idiom.left),\n elided: toCodePoints(idiom.elided),\n right: toCodePoints(idiom.right),\n }));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!NARROW.has(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n for (const idiom of compiled) {\n const k = idiom.elided.length;\n const j = i + 1 + k;\n if (j >= n) continue;\n\n let elidedMatches = true;\n for (let w = 0; w < k; w += 1) {\n if (at(arr, i + 1 + w) !== idiom.elided[w]) {\n elidedMatches = false;\n break;\n }\n }\n if (!elidedMatches) continue;\n if (!NARROW.has(at(arr, j))) continue;\n\n const rLit = j + 1 < n ? at(arr, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n if (!wordEndsAt(arr, i - 1, idiom.left)) continue;\n if (!wordStartsAt(arr, j + 2, idiom.right)) continue;\n\n vetoed.add(i);\n vetoed.add(j);\n }\n }\n\n return vetoed;\n}\n\n/**\n * The universal medial-`n` elision shape, locale-independent (spec 1.1.0, quotes.md 3.2): a pair\n * of `NARROW` marks enclosing exactly one code point, U+006E `n` or U+004E `N`, with **at least\n * one** `INLINE-SPACE` code point immediately outside each mark. A longer run of inline spaces\n * (`rock 'n' roll`) still matches, since only the single adjacent code point is tested; the\n * \"exactly one\" variant would let a doubled-space `rock 'n' roll` fall through to ordinary\n * quote-pairing. Both mark positions are returned for every match.\n *\n * **`NARROW`, not `SQ`, and that is an idempotency obligation rather than a preference.** This\n * veto's marks are converted to U+2019 by `apostrophe`, so a straight-ASCII-only predicate would\n * not recognise its own output and pass 2 would pair `rock ’n’ roll` as an ordinary `NARROW`\n * quotation on the next pipeline run — measured, with a straight-only predicate, as\n * `rock «n» roll` in `ru` and `rock ”n” roll` in `fi`. Spec 0.5.0's predicate was straight-only,\n * correctly for its own preserve-then-stop outcome; inverting the outcome forces the widening.\n * `apostrophe` emits U+2019 only in place of U+0027, so a span already written with real marks is\n * matched and then left exactly as the author typed it.\n *\n * A superset of {@link computeIdiomMatchedIndices}'s output for every idiom whose `elided` field\n * is a single `n`, which is every idiom shipped so far, but computed independently rather than\n * assumed — a future idiom's `elided` field is not required to be that short.\n */\nexport function computeAmbiguousShapeIndices(cp: readonly number[]): ReadonlySet<number> {\n const ambiguous = new Set<number>();\n const n = cp.length;\n\n for (let i = 0; i < n; i += 1) {\n if (!NARROW.has(at(cp, i))) continue;\n\n const lLit = i > 0 ? at(cp, i - 1) : NONE;\n if (lLit === NONE || !INLINE_SPACE.has(lLit)) continue;\n\n const enclosed = at(cp, i + 1);\n if (enclosed !== LOWER_N && enclosed !== UPPER_N) continue;\n\n const j = i + 2;\n if (!NARROW.has(at(cp, j))) continue;\n\n const rLit = j + 1 < n ? at(cp, j + 1) : NONE;\n if (rLit === NONE || !INLINE_SPACE.has(rLit)) continue;\n\n ambiguous.add(i);\n ambiguous.add(j);\n }\n\n return ambiguous;\n}\n\n/**\n * Span-boundary elision veto (quotes.md 3.2, spec 1.4.0), locale data `quotes.elisionClitics`.\n *\n * Fires only where one literal neighbour is the inline `MARKER`, which is why it is inert in\n * `text` and `yaml` modes — neither produces one. The attaching side is read as a MAXIMAL\n * `LETTER` run bounded by a non-`ALNUM` code point (or `NONE`) and compared whole: a prefix test\n * would match the entry `s` inside `sure` and eat `<em>'sure'</em>`, a genuine quotation.\n *\n * The comparison folds the run's first code point, ASCII A-Z only, and is exact thereafter —\n * the same convention the idiom matcher above uses, never a platform locale function\n * (ARCHITECTURE.md 4.4). Entries are authored lowercase, enforced at the data boundary.\n */\nexport function computeSpanBoundaryVetoIndices(\n arr: readonly number[],\n clitics: ElisionClitics | undefined,\n): ReadonlySet<number> {\n const vetoed = new Set<number>();\n const before = clitics?.before ?? [];\n const after = clitics?.after ?? [];\n if (before.length === 0 && after.length === 0) return vetoed;\n\n const compiled = {\n before: before.map(toCodePoints),\n after: after.map(toCodePoints),\n };\n\n for (let i = 0; i < arr.length; i += 1) {\n if (!NARROW.has(at(arr, i))) continue;\n if (at(arr, i - 1) === MARKER && runMatches(arr, i, 1, compiled.after)) {\n vetoed.add(i);\n continue;\n }\n if (at(arr, i + 1) === MARKER && runMatches(arr, i, -1, compiled.before)) {\n vetoed.add(i);\n }\n }\n return vetoed;\n}\n\n/**\n * The maximal `LETTER` run adjacent to the mark at `i` in direction `dir`, compared against\n * `entries`. Returns false for an empty run, for a run the caller's own `ALNUM` bound continues\n * past (a digit directly beyond the letters is still a word character, so the run is not the\n * whole fragment), and for a run no entry equals.\n */\nfunction runMatches(\n arr: readonly number[],\n i: number,\n dir: 1 | -1,\n entries: readonly (readonly number[])[],\n): boolean {\n const run: number[] = [];\n let j = i + dir;\n for (; ; j += dir) {\n const cp = at(arr, j);\n if (cp === NONE || !isLetter(cp)) break;\n run.push(cp);\n }\n if (run.length === 0) return false;\n const outer = at(arr, j);\n if (outer !== NONE && isAlnum(outer)) return false;\n if (dir === -1) run.reverse();\n\n for (const entry of entries) {\n if (entry.length !== run.length) continue;\n let same = at(entry, 0) === asciiLower(at(run, 0));\n for (let k = 1; same && k < entry.length; k += 1) same = at(entry, k) === at(run, k);\n if (same) return true;\n }\n return false;\n}\n","import { toCodePoints } from \"../engine/codepoints.js\";\nimport { isLetter } from \"../engine/unicode.js\";\nimport { LINE_MARKER, MARKER, NONE } from \"../engine/sentinels.js\";\nimport type {\n Edit,\n ElisionClitics,\n ElisionIdiom,\n LocaleData,\n QuotePair,\n Rule,\n RuleContext,\n} from \"../types.js\";\nimport {\n NARROW,\n computeAmbiguousShapeIndices,\n computeIdiomMatchedIndices,\n computeSpanBoundaryVetoIndices,\n} from \"./quote-ambiguity.js\";\n\n/**\n * `quotes` — spec/rules/quotes.md (spec 0.4.1), order 40.\n *\n * Mandate 1 (every existing quote glyph is a re-typesetting candidate) and mandate 2 (a space\n * touching a quote mark is sloppiness, not evidence) replace 0.1.0's whole architecture, whose\n * idempotency rested on never reading this rule's own curly output. Five passes plus an emit;\n * no backtracking inside a pass, no regular expression, no native-string indexing\n * (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\n/**\n * spec 3.2 `V1ID` (spec 0.4.1) — a **conservative over-approximation**, not a claim that every\n * U+0027 becomes U+2019. `apostrophe` (R₆) only ever *emits* U+2019 for a U+0027 (never any\n * other code point), but its own case ladder leaves a U+0027 unedited under the prime guard\n * (case 1: `6' 2\"`) and case 5 (`a ' b`, `''`) — `apostrophe.md` §5 names both as surviving to\n * the second run unedited. `V1ID` cannot know, from inside `quotes`, which outcome a given\n * U+0027 will get without re-deriving `apostrophe`'s verdict against `quotes`' own final output\n * — circular, since that output is what this rule is computing — so it treats every U+0027 as\n * *possibly* about to become U+2019 and every U+2019 as *possibly* a U+0027 that already did.\n *\n * **What \"conservative\" bounds, and what it does not.** At this single comparison, `V1ID` can\n * only ever *add* a veto (merge two identities that raw equality would have kept apart) — it\n * never grants `canOpen`/`canClose` to a candidate that would not otherwise have had it. It does\n * **not** follow that the rule's final output only ever declines more and converts less: pass 2\n * (`pairCandidates`) and pass 4 (`certify`) are global over the whole candidate list, and removing\n * one candidate can remove a crossing pair, a nesting conflict, or a certification-gate\n * instability that was previously making a *different, unrelated* pair fail to certify. An extra\n * local veto can therefore *indirectly* let another pair certify, reassign depth/glyphs, or\n * change what `nbsp` (order 70) later inserts — the reported counterexample is exactly this: V1ID\n * declining the crossing `NARROW` pair is what lets the `WIDE` pair certify on pass 1 instead of\n * being caught in the same gate rejection. See quotes.md §5, Lemma A / Corollary A1 and the \"V1ID\n * empirical audit\" section for the bound this actually rests on — inspection of every globally\n * changed output within a reproducible sweep, not a monotonicity claim.\n */\nconst SQ = 0x27;\nconst RIGHT_SINGLE_QUOTE = 0x2019;\nfunction v1Identity(cp: number): number {\n return cp === SQ ? RIGHT_SINGLE_QUOTE : cp;\n}\n\n/** spec 3.1 `WIDE` / `NARROW`. `WIDE ∪ NARROW = QUOTEMARK`, and the two are disjoint. `NARROW`\n * is imported from `./quote-ambiguity.js`, shared with `apostrophe` (spec 0.5.0). */\nconst WIDE: ReadonlySet<number> = new Set([\n 0x22, 0xab, 0xbb, 0x201c, 0x201d, 0x201e, 0x201f, 0x301d, 0x301e, 0x301f,\n]);\n\nfunction isQuoteMark(cp: number): boolean {\n return WIDE.has(cp) || NARROW.has(cp);\n}\n\n/**\n * spec 3.1 `INLINE-SPACE` — split out of `SPACELIKE` because §3.2's skip walks read this class\n * alone. `MARKER`/`LINE_MARKER` are deliberately absent, so no skip walk ever crosses a span\n * boundary or a line terminator (modes.md 3.3).\n */\nconst INLINE_SPACE: ReadonlySet<number> = new Set([\n 0x20, 0x09, 0xa0, 0x202f, 0x2007, 0x2009, 0x200a,\n]);\n\n/** spec 3.1 `BREAK`, including the line-boundary marker (modes.md 3.2). */\nconst BREAK: ReadonlySet<number> = new Set([\n 0x0a,\n 0x0d,\n 0x0b,\n 0x0c,\n 0x85,\n 0x2028,\n 0x2029,\n LINE_MARKER,\n]);\n\nconst SPACELIKE: ReadonlySet<number> = new Set([...INLINE_SPACE, ...BREAK]);\n\n/**\n * spec 3.1 `OPENISH` / `CLOSEISH`. `QUOTEMARK` is a member of **both**, and is exempt from\n * `canOpen`'s closeish rejection — Lemma A's entire mechanism (spec 5). Do not \"simplify\" this\n * back to per-glyph lists: it is what makes a candidate's verdict independent of *which* quote\n * glyph its neighbour is.\n */\nconst OPENISH: ReadonlySet<number> = new Set([MARKER, 0x28, 0x5b, 0x7b, ...WIDE, ...NARROW]);\n\nconst CLOSEISH: ReadonlySet<number> = new Set([\n MARKER,\n 0x29,\n 0x5d,\n 0x7d,\n 0x2c,\n 0x2e,\n 0x3b,\n 0x3a,\n 0x21,\n 0x3f,\n 0x2026,\n 0x2013,\n 0x2014,\n ...WIDE,\n ...NARROW,\n]);\n\n/** spec 3.1 `DASHISH`. U+2011 because `hyphen` (order 35) converts U+002D to it. */\nconst DASHISH: ReadonlySet<number> = new Set([0x2d, 0x2011, 0x2013, 0x2014]);\n\n/** Out-of-range reads yield `NONE`, the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\n/** spec 3.1 `DELETE-LANDING` — the largest landing class for which every earlier-ordered rule's own classes are unaffected by a quote glyph or a U+0020 (spec 3.7, composition obligation). */\nfunction isDeleteLanding(cp: number): boolean {\n return isAlnum(cp) || isQuoteMark(cp);\n}\n\n/** The straight-line walk of spec 3.2: step outward across a maximal `INLINE-SPACE` run. */\nfunction skipLeft(arr: readonly number[], i: number): number {\n let j = i - 1;\n while (j >= 0 && INLINE_SPACE.has(arr[j] as number)) j -= 1;\n return j >= 0 ? (arr[j] as number) : NONE;\n}\n\nfunction skipRight(arr: readonly number[], i: number): number {\n const n = arr.length;\n let j = i + 1;\n while (j < n && INLINE_SPACE.has(arr[j] as number)) j += 1;\n return j < n ? (arr[j] as number) : NONE;\n}\n\ninterface Candidate {\n readonly index: number;\n readonly wide: boolean;\n readonly canOpen: boolean;\n readonly canClose: boolean;\n}\n\ninterface Pair {\n readonly open: number;\n readonly close: number;\n}\n\ninterface SkipSets {\n readonly spaceRight: ReadonlySet<number>;\n readonly spaceLeft: ReadonlySet<number>;\n}\n\nfunction glyphCodePoint(s: string): number {\n return toCodePoints(s)[0] as number;\n}\n\n/**\n * spec 3.1a — locale-derived skip sets, computed once per call. These are exactly the\n * positions at which `nbsp` N8 can insert a space (nbsp.md 3.10), which is what makes Lemma B's\n * coverage exact rather than a survey.\n */\nfunction computeSkipSets(locale: LocaleData): SkipSets {\n const spaceRight = new Set<number>();\n const spaceLeft = new Set<number>();\n for (const pair of [locale.quotes.primary, locale.quotes.secondary]) {\n if (pair.innerSpace === \"none\") continue;\n const open = glyphCodePoint(pair.open);\n const close = glyphCodePoint(pair.close);\n if (open === close) continue;\n spaceRight.add(open);\n spaceLeft.add(close);\n }\n return { spaceRight, spaceLeft };\n}\n\n/**\n * Pass 1 — collect and classify candidates (spec 3.2). `canOpen` always skips right and\n * `canClose` always skips left (mandate 2's inner-side skip); the outer side skips only when\n * `nbsp` can reach it (the locale-derived `spaceRight`/`spaceLeft` sets), which is what keeps\n * every verdict inert to `nbsp` (Lemma B).\n */\nconst EMPTY_VETO: ReadonlySet<number> = new Set();\n\nfunction collectCandidates(\n arr: readonly number[],\n skip: SkipSets,\n elisionIdioms: readonly ElisionIdiom[],\n elisionClitics: ElisionClitics | undefined,\n): Candidate[] {\n const n = arr.length;\n const candidates: Candidate[] = [];\n // spec 1.1.0: the veto set is the UNION of the cited-idiom match (unchanged since 0.4.0) and\n // the universal medial-n shape (quotes.md 3.2). `quotes` declines pairing for both, and both\n // have the same intent — that `apostrophe` (order 50) convert the surviving marks by its own\n // case ladder. The union is computed rather than assumed: an idiom's `elided` field is not\n // required to be the single `n` the universal veto matches.\n // spec 1.4.0 adds a third member to the same union: the span-boundary elision veto, which\n // fires only where one literal neighbour is the inline MARKER (quotes.md 3.2).\n const sets = [\n computeIdiomMatchedIndices(arr, elisionIdioms),\n computeAmbiguousShapeIndices(arr),\n computeSpanBoundaryVetoIndices(arr, elisionClitics),\n ].filter((set) => set.size > 0);\n const elisionVetoed: ReadonlySet<number> =\n sets.length === 0\n ? EMPTY_VETO\n : sets.length === 1\n ? (sets[0] as ReadonlySet<number>)\n : new Set(sets.flatMap((set) => [...set]));\n\n for (let i = 0; i < n; i += 1) {\n const g = at(arr, i);\n if (!isQuoteMark(g)) continue;\n\n const lLit = i > 0 ? at(arr, i - 1) : NONE;\n const rLit = i + 1 < n ? at(arr, i + 1) : NONE;\n const lSkip = skipLeft(arr, i);\n const rSkip = skipRight(arr, i);\n\n const openLeft = skip.spaceLeft.has(g) ? lSkip : lLit;\n const closeRight = skip.spaceRight.has(g) ? rSkip : rLit;\n\n let canOpen =\n (openLeft === NONE ||\n SPACELIKE.has(openLeft) ||\n OPENISH.has(openLeft) ||\n DASHISH.has(openLeft)) &&\n rSkip !== NONE &&\n !SPACELIKE.has(rSkip) &&\n (!CLOSEISH.has(rSkip) || isQuoteMark(rSkip) || rSkip === MARKER);\n\n let canClose =\n lSkip !== NONE &&\n !SPACELIKE.has(lSkip) &&\n (closeRight === NONE ||\n SPACELIKE.has(closeRight) ||\n CLOSEISH.has(closeRight) ||\n DASHISH.has(closeRight));\n\n // Medial-elision veto (spec 3.2), `NARROW` marks only, literal reads: `don't`, `l'été`,\n // `O'Brien`, `1990's` — and, on a second pipeline pass, `don't` with U+2019, because\n // `apostrophe` has converted the mark and U+2019 is also `NARROW`.\n if (NARROW.has(g) && lLit !== NONE && rLit !== NONE && isAlnum(lLit) && isAlnum(rLit)) {\n canOpen = false;\n canClose = false;\n }\n\n // Listed elision veto (spec 3.2, spec 0.4.0): both capabilities of a mark found by the\n // pre-pass above are forced false, overriding every other test in this loop.\n if (elisionVetoed.has(i)) {\n canOpen = false;\n canClose = false;\n }\n\n // V1 — same-V1-identity adjacency veto (spec 3.2), both widths: `\"\"`, `''`, `««`, `””` —\n // literal adjacency under `v1Identity` (`v1Identity` is the identity function everywhere\n // except U+0027, see its definition above), **plus** the same shape separated by exactly one\n // INLINE-SPACE code point at a position `nbsp` can insert or remove. The second clause is\n // narrow on purpose:\n // it fires only when the space-or-not gap sits immediately after a `SPACE-RIGHT` glyph (on\n // the left) or immediately before a `SPACE-LEFT` glyph (on the right) — the two positions\n // Lemma B (spec 5) enumerates as `nbsp`'s entire insertion surface next to a quote mark.\n // Without it, a pairing the gate declines when the gap is absent can certify once `nbsp`\n // (a *later* rule) inserts the gap on a subsequent pipeline pass — a composition-obligation\n // violation, since `quotes` must be a no-op on its own already-settled output regardless of\n // whether `nbsp` has acted yet. A plain skip-based V1 (comparing `Lskip`/`Rskip` to `g`\n // unconditionally) was tried and rejected: it also vetoes two *genuinely distinct*\n // quotations separated by an ordinary word space (`'a' 'b'`), which is ordinary prose, not\n // an artefact — the veto must depend on the *locale's* `SPACE-RIGHT`/`SPACE-LEFT` sets, not\n // fire on every space-separated repeat of a glyph.\n // `g` is shared identically between a candidate and the same-glyph neighbour reached by a\n // skip, so it does not matter here which of the two sits on which side of the gap: nbsp\n // can insert there iff `g` plays *either* spaced role (it opens on its own right, or closes\n // on its own left) for this locale.\n //\n // Every comparison below reads `v1Identity`, not the raw code point (spec 3.2 `V1ID`, spec\n // 0.4.1) — a *conservative* closure, not a claim that every U+0027 becomes U+2019.\n // `apostrophe` (R₆) only ever emits U+2019 for a U+0027, but its own case ladder leaves some\n // U+0027s unedited (prime guard, case 5); `v1Identity`'s definition above explains why\n // `quotes` cannot know which without a circular re-derivation of `apostrophe`'s verdict\n // against its own output. Without this closure, a literal U+0027-vs-U+2019 comparison here\n // gives a different verdict before and after `apostrophe` edits a neighbour between two\n // pipeline passes — a composition-obligation violation against this rule's own idempotency\n // (quotes.md §5, Lemma A / Corollary A1). At *this* comparison the effect is one-directional\n // — an extra veto on a mixed U+0027/U+2019 adjacency, never a granted capability — but that is\n // a local fact about this line, not a claim about the rule's final output: declining one\n // candidate here can remove a crossing/nesting/certification conflict downstream (passes 2\n // and 4 are global over the whole candidate list) and thereby let a *different* pair certify\n // that previously could not. See the module comment on `v1Identity` above.\n const gV1 = v1Identity(g);\n const gapIsNbspInsertable = skip.spaceRight.has(g) || skip.spaceLeft.has(g);\n const leftVetoed =\n v1Identity(lLit) === gV1 ||\n (lLit !== NONE && INLINE_SPACE.has(lLit) && v1Identity(lSkip) === gV1 && gapIsNbspInsertable);\n const rightVetoed =\n v1Identity(rLit) === gV1 ||\n (rLit !== NONE && INLINE_SPACE.has(rLit) && v1Identity(rSkip) === gV1 && gapIsNbspInsertable);\n if (leftVetoed || rightVetoed) {\n canOpen = false;\n canClose = false;\n }\n\n if (canOpen || canClose) {\n candidates.push({ index: i, wide: WIDE.has(g), canOpen, canClose });\n }\n }\n\n return candidates;\n}\n\n/** spec 3.3 `vacuous(a, b)`. Vacuously true when `b = a + 1`. */\nfunction isVacuous(arr: readonly number[], a: number, b: number): boolean {\n for (let k = a + 1; k < b; k += 1) {\n if (!INLINE_SPACE.has(arr[k] as number)) return false;\n }\n return true;\n}\n\n/**\n * Pass 2 — pair the candidates, one stack per width (spec 3.3). Closing is tried before\n * opening; a candidate reaches exactly one of three outcomes (paired, pushed, unmatched), and a\n * closer that fails the vacuity condition falls through to step 2 and then step 3 rather than\n * being discarded — the exhaustive three-outcome shape the certification gate depends on.\n */\nfunction pairCandidates(arr: readonly number[], candidates: readonly Candidate[]): Pair[] {\n const wideStack: Candidate[] = [];\n const narrowStack: Candidate[] = [];\n const pairs: Pair[] = [];\n\n for (const c of candidates) {\n const stack = c.wide ? wideStack : narrowStack;\n const top = stack[stack.length - 1];\n if (c.canClose && top !== undefined && !isVacuous(arr, top.index, c.index)) {\n stack.pop();\n pairs.push({ open: top.index, close: c.index });\n continue;\n }\n if (c.canOpen) stack.push(c);\n }\n\n return pairs;\n}\n\n/**\n * Pass 3 — depth over the *accepted* set, never the raw pass-2 output (spec 3.4). On a second\n * run the accepted set is the raw set, so a depth taken over the raw set on run 1 and the\n * accepted set on run 2 would disagree whenever the gate declined anything.\n */\nfunction depthOf(pairs: readonly Pair[], p: Pair): number {\n let depth = 1;\n for (const q of pairs) {\n if (q.open < p.open && p.close < q.close) depth += 1;\n }\n return depth;\n}\n\nfunction pairFor(ctx: RuleContext, depth: number): QuotePair {\n return depth % 2 === 1 ? ctx.locale.quotes.primary : ctx.locale.quotes.secondary;\n}\n\ninterface RenderPlan {\n /** index (in `arr`) -> replacement code point, for every mark in an accepted pair. */\n readonly replace: ReadonlyMap<number, number>;\n /** indices (in `arr`) to delete: the inner-run deletions the landing guard permitted. */\n readonly deleteIndices: ReadonlySet<number>;\n}\n\n/**\n * spec 3.5 `render`'s glyph/deletion plan, shared by the certification gate's hypothetical and\n * the real emit (pass 5) — the only difference between them is whether the plan is applied to a\n * throwaway array or actually returned as edits.\n */\nfunction computeRenderPlan(\n arr: readonly number[],\n accepted: readonly Pair[],\n ctx: RuleContext,\n): RenderPlan {\n const replace = new Map<number, number>();\n const deleteIndices = new Set<number>();\n\n for (const p of accepted) {\n const glyphs = pairFor(ctx, depthOf(accepted, p));\n replace.set(p.open, glyphCodePoint(glyphs.open));\n replace.set(p.close, glyphCodePoint(glyphs.close));\n\n if (glyphs.innerSpace !== \"none\") continue;\n\n // Open-side run: the maximal INLINE-SPACE run starting at p.open + 1.\n let openEnd = p.open + 1;\n while (openEnd < arr.length && INLINE_SPACE.has(arr[openEnd] as number)) openEnd += 1;\n const openStart = p.open + 1;\n const openEmpty = openEnd === openStart;\n const openLanding = openEnd < arr.length ? (arr[openEnd] as number) : NONE;\n\n // Close-side run: the maximal INLINE-SPACE run ending at p.close - 1.\n let closeStart = p.close - 1;\n while (closeStart >= 0 && INLINE_SPACE.has(arr[closeStart] as number)) closeStart -= 1;\n closeStart += 1;\n const closeEnd = p.close;\n const closeEmpty = closeStart === closeEnd;\n const closeLanding = closeStart - 1 >= 0 ? (arr[closeStart - 1] as number) : NONE;\n\n // A run is deleted iff non-empty, its landing is in DELETE-LANDING, and it is not\n // simultaneously both of the pair's runs — a pair enclosing nothing but spaces deletes\n // neither (spec 3.5). Unreachable for an accepted pair given pass 2's vacuity condition,\n // but the guard is cheap and the spec states it unconditionally.\n const sameRun = !openEmpty && !closeEmpty && openStart === closeStart && openEnd === closeEnd;\n\n if (!openEmpty && isDeleteLanding(openLanding) && !sameRun) {\n for (let k = openStart; k < openEnd; k += 1) deleteIndices.add(k);\n }\n if (!closeEmpty && isDeleteLanding(closeLanding) && !sameRun) {\n for (let k = closeStart; k < closeEnd; k += 1) deleteIndices.add(k);\n }\n }\n\n return { replace, deleteIndices };\n}\n\n/** Applies a render plan, returning the rendered array and the order-preserving index map. */\nfunction applyRenderPlan(\n arr: readonly number[],\n plan: RenderPlan,\n): { readonly y: number[]; readonly map: readonly number[] } {\n const y: number[] = [];\n const map: number[] = new Array(arr.length).fill(-1);\n for (let i = 0; i < arr.length; i += 1) {\n if (plan.deleteIndices.has(i)) continue;\n map[i] = y.length;\n y.push(plan.replace.get(i) ?? (arr[i] as number));\n }\n return { y, map };\n}\n\nfunction pairKey(open: number, close: number): string {\n return `${open},${close}`;\n}\n\nfunction pairSetsEqual(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a.size !== b.size) return false;\n for (const key of a) {\n if (!b.has(key)) return false;\n }\n return true;\n}\n\n/**\n * Pass 4 — the certification gate (spec 3.5). The accepted pairing is *checked*, not proved:\n * render the hypothetical output, re-run passes 1–2 on it, and decline pairs until the re-run\n * reproduces the accepted set exactly. Declination is simultaneous per round, and when the\n * intersection fails to shrink `A`, the pair with the greatest `open` index is forced out — both\n * clauses are normative (spec 3.5), so two ports cannot disagree.\n */\nfunction certify(\n arr: readonly number[],\n initialPairs: readonly Pair[],\n ctx: RuleContext,\n skip: SkipSets,\n): Pair[] {\n let accepted: Pair[] = initialPairs.slice();\n // Each round accepts or strictly shrinks `accepted`; it is finite and ∅ accepts\n // unconditionally, so the loop runs at most |A0| + 1 times (spec 3.5). The cap is a defensive\n // safety net, not a normative bound.\n const cap = initialPairs.length + 2;\n\n for (let round = 0; round <= cap; round += 1) {\n if (accepted.length === 0) return accepted;\n\n const plan = computeRenderPlan(arr, accepted, ctx);\n const { y, map } = applyRenderPlan(arr, plan);\n const rederived = pairCandidates(\n y,\n collectCandidates(y, skip, ctx.locale.quotes.elisionIdioms, ctx.locale.quotes.elisionClitics),\n );\n const bSet = new Set(rederived.map((p) => pairKey(p.open, p.close)));\n\n const projected = accepted.map((p) => ({\n open: map[p.open] as number,\n close: map[p.close] as number,\n }));\n const projSet = new Set(projected.map((p) => pairKey(p.open, p.close)));\n\n if (pairSetsEqual(projSet, bSet)) return accepted;\n\n const survivors = accepted.filter((_, idx) => {\n const proj = projected[idx] as { open: number; close: number };\n return bSet.has(pairKey(proj.open, proj.close));\n });\n\n if (survivors.length === accepted.length) {\n let removeIdx = 0;\n for (let i = 1; i < accepted.length; i += 1) {\n if ((accepted[i] as Pair).open > (accepted[removeIdx] as Pair).open) removeIdx = i;\n }\n accepted = accepted.filter((_, i) => i !== removeIdx);\n } else {\n accepted = survivors;\n }\n }\n\n // Unreachable given the termination argument; declines everything rather than looping.\n return [];\n}\n\n/**\n * Pass 5 — emit (spec 3.6). An edit whose replacement equals the span it replaces is never\n * emitted — the invisible-edit principle, applied per mark, not per pair.\n */\nfunction emit(arr: readonly number[], accepted: readonly Pair[], ctx: RuleContext): Edit[] {\n const plan = computeRenderPlan(arr, accepted, ctx);\n const edits: Edit[] = [];\n\n for (const [index, cp] of plan.replace) {\n if (arr[index] === cp) continue;\n edits.push({ start: index, end: index + 1, replacement: [cp], ruleId: \"quotes\" });\n }\n\n const deletions = Array.from(plan.deleteIndices).sort((a, b) => a - b);\n let i = 0;\n while (i < deletions.length) {\n let j = i;\n while (\n j + 1 < deletions.length &&\n (deletions[j + 1] as number) === (deletions[j] as number) + 1\n ) {\n j += 1;\n }\n edits.push({\n start: deletions[i] as number,\n end: (deletions[j] as number) + 1,\n replacement: [],\n ruleId: \"quotes\",\n });\n i = j + 1;\n }\n\n edits.sort((a, b) => a.start - b.start);\n return edits;\n}\n\nexport const quotesRule: Rule = {\n id: \"quotes\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const skip = computeSkipSets(ctx.locale);\n\n const candidates = collectCandidates(\n cp,\n skip,\n ctx.locale.quotes.elisionIdioms,\n ctx.locale.quotes.elisionClitics,\n );\n if (candidates.length === 0) return [];\n\n const initialPairs = pairCandidates(cp, candidates);\n if (initialPairs.length === 0) return [];\n\n const accepted = certify(cp, initialPairs, ctx, skip);\n if (accepted.length === 0) return [];\n\n return emit(cp, accepted, ctx);\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport {\n buildReplacement,\n effectiveNeighbour,\n findDashTokens,\n isDashUnion,\n isOpenBracket,\n isSpaced,\n isSpacingTransitionBlocked,\n isStripBeforeOrCloseBracket,\n rangeFlanks,\n sameContent,\n type DashStyle,\n type RangeFlanks,\n} from \"./dash-shared.js\";\n\n/**\n * `ranges` — spec/rules/ranges.md (spec 0.5.0), order 25. Explicit opt-in: off by default\n * (RULE_DEFAULTS in registry.ts). Split out of `dashes` (spec 0.5.0) — see ranges.md 1 and\n * dashes.md 7.11 for why this is opt-in rather than a bounded structural fix: separating a\n * genuine numeric range (`5-10`) from a compound label sharing the identical shape (`Figure\n * 5-10`) needs the preceding word, which is exactly the open-ended, per-locale context this\n * project's rules are built never to consult.\n *\n * Explicit index-based scanning only: no regex anywhere, and every index addresses the\n * code-point array, never a native string (ARCHITECTURE.md 4.1, 4.2).\n */\n\nconst FULL_STOP = 0x2e;\nconst COMMA = 0x2c;\nconst SOLIDUS = 0x2f;\nconst DIGIT_ZERO = 0x30;\n\n/** ranges.md 3.3 G5: equal-length ASCII digit runs compare lexicographically, so no arithmetic. */\nfunction isNonDecreasing(\n cp: readonly number[],\n leftStart: number,\n rightStart: number,\n length: number,\n): boolean {\n for (let i = 0; i < length; i += 1) {\n const l = cp[leftStart + i] as number;\n const r = cp[rightStart + i] as number;\n if (l < r) return true;\n if (l > r) return false;\n }\n return true;\n}\n\n/**\n * ranges.md 3.2, G1-G5, over the flanks and digit runs ranges.md 3.2a's walk produced.\n *\n * `before` and `after` read past a matched outer closed-up symbol, so G1-G3 judge the text in\n * front of the whole member rather than the symbol itself — which is what declines `US$15-US$20`\n * on G1, where `before` is `S`.\n */\nfunction rangeGuardsPass(cp: readonly number[], flanks: RangeFlanks): boolean {\n const { left, right, a, b, outerLeft, outerRight } = flanks;\n\n const before = effectiveNeighbour(cp, (outerLeft < 0 ? a : outerLeft) - 1, -1);\n const after = effectiveNeighbour(cp, (outerRight < 0 ? b : outerRight) + 1, 1);\n\n // G1 — no letter adjacency.\n if (isLetter(before)) return false;\n // G2 — no chain: an ISO date, an ISBN or a phone number always trips this.\n if (isDashUnion(before)) return false;\n if (isDashUnion(after)) return false;\n // G3 — not part of a decimal or a path.\n if (before === FULL_STOP || before === COMMA || before === SOLIDUS) return false;\n if (after === SOLIDUS) return false;\n // G4 — run lengths. Equal, or the directional (1,2) branch with no leading zero on Rrun.\n const leftLength = left - a + 1;\n const rightLength = b - right + 1;\n if (leftLength === 1 && rightLength === 2 && cp[right] !== DIGIT_ZERO) {\n return true;\n }\n if (leftLength !== rightLength) return false;\n // G5 — non-decreasing.\n return isNonDecreasing(cp, a, right, leftLength);\n}\n\nfunction scan(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const edits: Edit[] = [];\n const style: DashStyle = ctx.locale.dash.range;\n\n for (const token of findDashTokens(cp)) {\n const { left, right, lsp, rsp, spanStart, spanEnd } = token;\n\n // ranges.md 3.2, 3.2a — a range candidate iff both flanks are DIGIT once a matched closed-up\n // symbol has been walked over. `ranges` never processes any other token shape; that is\n // `dashes`' territory, and `dashes` declines a candidate unconditionally too (operator\n // decision, spec 0.5.0) — neither rule reinterprets the other's shape, whether or not\n // `ranges` is enabled.\n const flanks = rangeFlanks(cp, left, right);\n if (flanks === undefined) continue;\n\n if (!rangeGuardsPass(cp, flanks)) continue;\n\n // `\"none\"`: the locale has no verified convention, so nothing is substituted.\n if (style === \"none\") continue;\n\n if (isSpaced(style)) {\n // T1/T2 read the walked flanks, not the raw ones: ranges.md 3.2a makes `cp[L']`/`cp[R']`\n // what every shared guard sees once a closed-up symbol has been consumed.\n // T1: a tight token may not become spaced across a digit run that has a far dash.\n if (lsp === 0 && rsp === 0 && isSpacingTransitionBlocked(cp, flanks.left, flanks.right)) {\n continue;\n }\n // T2: the emitted U+0020 must not land where `spaces` (order 10) would delete it.\n if (isStripBeforeOrCloseBracket(cp[flanks.right] as number)) continue;\n if (isOpenBracket(cp[flanks.left] as number)) continue;\n }\n\n // ranges.md 3.3.1: never make an edit whose entire content is invisible. Try the unbound\n // replacement first; only add the joiner pair if the dash itself is genuinely changing.\n const unbound = buildReplacement(style, false);\n const onlyBindingWouldChange = !isSpaced(style) && sameContent(cp, spanStart, spanEnd, unbound);\n const bind = !isSpaced(style) && !onlyBindingWouldChange;\n const replacement = bind ? buildReplacement(style, true) : unbound;\n if (sameContent(cp, spanStart, spanEnd, replacement)) continue;\n\n edits.push({ start: spanStart, end: spanEnd, replacement, ruleId: \"ranges\" });\n }\n\n return edits;\n}\n\nexport const rangesRule: Rule = {\n id: \"ranges\",\n apply: scan,\n};\n","import type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { isMarker, LINE_MARKER, NONE } from \"../engine/sentinels.js\";\nimport { isLetter } from \"../engine/unicode.js\";\n\n// spec/rules/spaces.md 3.1. Explicit code points only: no regex, no \\s (ARCHITECTURE.md 4.1).\nconst SPACE = 0x20;\n\nconst LF = 0x0a;\nconst CR = 0x0d;\nconst VT = 0x0b;\nconst FF = 0x0c;\nconst NEL = 0x85;\nconst LS = 0x2028;\nconst PS = 0x2029;\n\nconst COMMA = 0x2c;\nconst FULL_STOP = 0x2e;\nconst SEMICOLON = 0x3b;\nconst COLON = 0x3a;\nconst EXCLAMATION = 0x21;\nconst QUESTION = 0x3f;\nconst ELLIPSIS = 0x2026;\n\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_OPEN = 0x5b;\nconst SQUARE_CLOSE = 0x5d;\nconst CURLY_OPEN = 0x7b;\nconst CURLY_CLOSE = 0x7d;\n\nconst HYPHEN_MINUS = 0x2d;\nconst CARET = 0x5e;\nconst SOLIDUS = 0x2f;\nconst REVERSE_SOLIDUS = 0x5c;\nconst VERTICAL_LINE = 0x7c;\nconst ASTERISK = 0x2a;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\nconst LETTER_D_UPPER = 0x44;\nconst LETTER_D_LOWER = 0x64;\nconst LETTER_P_UPPER = 0x50;\nconst LETTER_P_LOWER = 0x70;\nconst LETTER_O_UPPER = 0x4f;\nconst LETTER_O_LOWER = 0x6f;\n\n/** `NONE` in the spec: the position one past either end of the array. */\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/** `BREAK` — including `LINE_MARKER`, a member for every rule everywhere (modes.md 3.2). */\nfunction isBreak(cp: number): boolean {\n return (\n cp === LF ||\n cp === CR ||\n cp === VT ||\n cp === FF ||\n cp === NEL ||\n cp === LS ||\n cp === PS ||\n cp === LINE_MARKER\n );\n}\n\n/**\n * Six code points. U+2026 is deliberately absent: with it, `Wait ...` would keep its space\n * here, `ellipsis` would yield `Wait …`, and a second pipeline pass would then strip that\n * space — a composition divergence (spec/rules/spaces.md 3.4).\n */\nfunction isStripBefore(cp: number): boolean {\n return (\n cp === COMMA ||\n cp === FULL_STOP ||\n cp === SEMICOLON ||\n cp === COLON ||\n cp === EXCLAMATION ||\n cp === QUESTION\n );\n}\n\nfunction isDotlike(cp: number): boolean {\n return cp === FULL_STOP || cp === ELLIPSIS;\n}\n\nfunction isOpenBracket(cp: number): boolean {\n return cp === PAREN_OPEN || cp === SQUARE_OPEN || cp === CURLY_OPEN;\n}\n\nfunction isCloseBracket(cp: number): boolean {\n return cp === PAREN_CLOSE || cp === SQUARE_CLOSE || cp === CURLY_CLOSE;\n}\n\nfunction matchingCloser(open: number): number {\n if (open === PAREN_OPEN) return PAREN_CLOSE;\n if (open === SQUARE_OPEN) return SQUARE_CLOSE;\n return CURLY_CLOSE;\n}\n\n/** spec/rules/spaces.md 3.3: `- [ ] item` must not become `- [] item`. It may still collapse. */\nfunction isEmptyBracketGuarded(left: number, right: number): boolean {\n return isOpenBracket(left) && right === matchingCloser(left);\n}\n\n/**\n * The replacement length is a pure function of the two bounding code points, computed once\n * (spec/rules/spaces.md 3.2 step 5). A two-pass \"collapse then strip\" formulation would need a\n * fixed-point loop, which two runtimes would iterate differently.\n */\n/**\n * spec/rules/spaces.md 3.4. A run of dots is a different token from a terminal full stop — a\n * relative path, a truncation, a typed ellipsis — and deleting the space before it merges the\n * run with a preceding abbreviation dot (`See ../docs` → `See../docs`).\n *\n * A single dot followed directly by a letter or an ASCII digit starts a token too (`.NET`,\n * `.gitignore`, `.5` — spec 1.2.0's word-start clause), so the space before it is not deleted.\n * A span boundary marker after the dot is neither, and the dot stays terminal.\n *\n * `e` indexes `right` in the **input** array, and the run is measured there. Measuring it after\n * any edit had been applied would break the Chicago spaced ellipsis `Hello . . .`, where every\n * dot is a lone dot at decision time and all three spaces must still strip.\n */\nfunction isLoneDot(cp: readonly number[], e: number): boolean {\n if (at(cp, e) !== FULL_STOP) return true;\n const next = at(cp, e + 1);\n if (isLetter(next) || isDigitAscii(next)) return false;\n return !isDotlike(next);\n}\n\nfunction isDigitAscii(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\n/** spec/rules/spaces.md 3.6: the recognised \"mouth\" glyphs of a Western text emoticon. */\nfunction isEmoticonMouth(cp: number): boolean {\n return (\n cp === PAREN_OPEN ||\n cp === PAREN_CLOSE ||\n cp === SQUARE_OPEN ||\n cp === SQUARE_CLOSE ||\n cp === LETTER_D_UPPER ||\n cp === LETTER_D_LOWER ||\n cp === LETTER_P_UPPER ||\n cp === LETTER_P_LOWER ||\n cp === LETTER_O_UPPER ||\n cp === LETTER_O_LOWER ||\n cp === SOLIDUS ||\n cp === REVERSE_SOLIDUS ||\n cp === VERTICAL_LINE ||\n cp === ASTERISK\n );\n}\n\n/**\n * spec/rules/spaces.md 3.6, the emoticon guard. A colon or semicolon immediately followed by\n * an optional \"nose\" and a recognised \"mouth\" is the eye of a Western text emoticon\n * (`:-)`, `:)`, `;-)`), not sentence punctuation, and the space in front of it must survive.\n *\n * The mouth must not itself run into a letter or a digit — `:Deal` is a colon before a\n * capitalised word, not a face — which is the one check needed to keep this from firing on\n * ordinary prose. `e` indexes `right`, exactly as `isLoneDot` does.\n */\nfunction isEmoticon(cp: readonly number[], e: number): boolean {\n const eye = at(cp, e);\n if (eye !== COLON && eye !== SEMICOLON) return false;\n\n let i = e + 1;\n const nose = at(cp, i);\n if (nose === HYPHEN_MINUS || nose === CARET) i += 1;\n\n if (!isEmoticonMouth(at(cp, i))) return false;\n i += 1;\n\n const after = at(cp, i);\n return !isLetter(after) && !isDigitAscii(after);\n}\n\n/**\n * spec/rules/spaces.md 3.6, the mouth side. `(` and `[` are EMOTICON-MOUTH members and\n * OPEN-BRACKET members at once, so without this the opening-bracket clause deleted the space\n * after an emoticon the eye side had just recognised: `a :( b` became `a :(b`, and then `a:(b`\n * on a second pass, because a letter after the mouth stops the eye side firing.\n *\n * The walk is the eye side's, backwards from `s`, and it needs no trailing check: the code point\n * after the mouth is the space run itself, which is neither a letter nor a digit. A nose with no\n * eye behind it is not a face — EMOTICON-NOSE and EMOTICON-EYE are disjoint, so the walk cannot\n * mistake one for the other.\n */\nfunction isEmoticonEnd(cp: readonly number[], s: number): boolean {\n if (!isEmoticonMouth(at(cp, s - 1))) return false;\n\n let j = s - 2;\n const nose = at(cp, j);\n if (nose === HYPHEN_MINUS || nose === CARET) j -= 1;\n\n const eye = at(cp, j);\n return eye === COLON || eye === SEMICOLON;\n}\n\nfunction replacementLength(\n cp: readonly number[],\n s: number,\n e: number,\n left: number,\n right: number,\n): number {\n // The guard is a clause of this decision, not a \"skip the run\" branch: `( )` collapses to\n // `( )` (spec/rules/spaces.md 3.3, normative reading).\n if (isEmptyBracketGuarded(left, right)) return 1;\n if (isOpenBracket(left) && !isEmoticonEnd(cp, s)) return 0;\n if (isCloseBracket(right)) return 0;\n if (isStripBefore(right) && isLoneDot(cp, e) && !isEmoticon(cp, e)) return 0;\n return 1;\n}\n\nexport const spacesRule: Rule = {\n id: \"spaces\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n if (at(cp, i) !== SPACE) {\n i += 1;\n continue;\n }\n\n const s = i;\n let e = s;\n while (e < n && at(cp, e) === SPACE) e += 1;\n const k = e - s;\n\n const left = at(cp, s - 1);\n const right = at(cp, e);\n\n // Boundary guard: indentation, Markdown hard breaks and text-unit edges are structural.\n // A span boundary is a text-unit edge: spaces.md 3.2 step 4 protects \"trailing spaces at\n // the end of a text unit, which in `html` mode are frequently the only separator between\n // two inline elements\", and in the concatenated array that edge is a marker rather than\n // `NONE`. Only this guard treats a marker that way; everywhere else in this rule the\n // marker is opaque content, per modes.md 3.3.\n if (\n left === NONE ||\n isMarker(left) ||\n isBreak(left) ||\n right === NONE ||\n isMarker(right) ||\n isBreak(right)\n ) {\n i = e;\n continue;\n }\n\n const length = replacementLength(cp, s, e, left, right);\n if (length !== k) {\n edits.push({\n start: s,\n end: e,\n replacement: length === 0 ? [] : [SPACE],\n ruleId: \"spaces\",\n });\n }\n i = e;\n }\n\n return edits;\n },\n};\n","import { isLetter } from \"../engine/unicode.js\";\nimport type { Edit, Rule, RuleContext } from \"../types.js\";\nimport { NONE } from \"../engine/sentinels.js\";\n\n// spec/rules/symbols.md 3.1.\nconst PAREN_OPEN = 0x28;\nconst PAREN_CLOSE = 0x29;\nconst SQUARE_CLOSE = 0x5d;\n\nconst COPYRIGHT = 0xa9;\nconst REGISTERED = 0xae;\nconst TRADEMARK = 0x2122;\nconst MULTIPLICATION = 0xd7;\n\nconst SPACE = 0x20;\nconst NBSP = 0xa0;\nconst NNBSP = 0x202f;\n\nconst LOWER_X = 0x78;\nconst UPPER_X = 0x58;\nconst CYRILLIC_LOWER_HA = 0x445;\nconst CYRILLIC_UPPER_HA = 0x425;\nconst DIGIT_ZERO = 0x30;\nconst DIGIT_NINE = 0x39;\n\nconst PLUS = 0x2b;\nconst SOLIDUS = 0x2f;\nconst HYPHEN_MINUS = 0x2d;\nconst PLUS_MINUS = 0xb1;\nconst SQUARE_OPEN = 0x5b;\n\n/** Out-of-range reads yield `NONE`, which is the spec's own boundary value. */\nfunction at(cp: readonly number[], i: number): number {\n const value = cp[i];\n return value === undefined ? NONE : value;\n}\n\n/**\n * Every accepted spelling is enumerated. Case folding is forbidden here: `toLowerCase` is\n * locale-dependent in the host process and `(TM)` would behave differently under a Turkish\n * locale (ARCHITECTURE.md 4.4). Longest literals first (spec/rules/symbols.md 3.2 step 1).\n */\ninterface TrademarkRow {\n readonly literal: readonly number[];\n readonly to: number;\n /** S1 applies to the `(c)` and `(r)` rows only (spec/rules/symbols.md 3.2 step 3). */\n readonly guardedByS1: boolean;\n}\n\nconst TRADEMARK_TABLE: readonly TrademarkRow[] = [\n { literal: [PAREN_OPEN, 0x74, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tm)\n { literal: [PAREN_OPEN, 0x54, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (TM)\n { literal: [PAREN_OPEN, 0x54, 0x6d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (Tm)\n { literal: [PAREN_OPEN, 0x74, 0x4d, PAREN_CLOSE], to: TRADEMARK, guardedByS1: false }, // (tM)\n { literal: [PAREN_OPEN, 0x63, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (c)\n { literal: [PAREN_OPEN, 0x43, PAREN_CLOSE], to: COPYRIGHT, guardedByS1: true }, // (C)\n { literal: [PAREN_OPEN, 0x72, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (r)\n { literal: [PAREN_OPEN, 0x52, PAREN_CLOSE], to: REGISTERED, guardedByS1: true }, // (R)\n];\n\nfunction isDigit(cp: number): boolean {\n return cp >= DIGIT_ZERO && cp <= DIGIT_NINE;\n}\n\nfunction isAlnum(cp: number): boolean {\n return isDigit(cp) || isLetter(cp);\n}\n\nfunction isSpaceLike(cp: number): boolean {\n return cp === SPACE || cp === NBSP || cp === NNBSP;\n}\n\n/**\n * `MUL-LETTER`, spec/rules/symbols.md 3.1: four code points, enumerated, no locale data. The\n * Cyrillic pair is unconditional — U+0445 between two ASCII digits is a Russian dimension typed\n * on a Cyrillic layout or keyboard debris, there is no third reading, and the glyphs are\n * identical to the Latin ones in every font, so no human review can catch it.\n */\nfunction isMulLetter(cp: number): boolean {\n return cp === LOWER_X || cp === UPPER_X || cp === CYRILLIC_LOWER_HA || cp === CYRILLIC_UPPER_HA;\n}\n\nfunction matchesAt(cp: readonly number[], i: number, literal: readonly number[]): boolean {\n if (i + literal.length > cp.length) return false;\n for (let j = 0; j < literal.length; j += 1) {\n if (at(cp, i + j) !== literal[j]) return false;\n }\n return true;\n}\n\n/** Returns the edit, or `null` when a guard rejects the candidate. */\nfunction trademarkAt(cp: readonly number[], i: number): Edit | null {\n for (const row of TRADEMARK_TABLE) {\n if (!matchesAt(cp, i, row.literal)) continue;\n const end = i + row.literal.length;\n const before = at(cp, i - 1);\n const after = at(cp, end);\n\n // S1 — left adjacency, for the `(c)` and `(r)` rows only: a one-letter argument list is\n // common, `(tm)` tucked against a product name is not a call. ©, ® and ™ are listed so\n // that `(c)(r)` converges in one run (spec/rules/symbols.md 5).\n if (\n row.guardedByS1 &&\n before !== NONE &&\n (isAlnum(before) ||\n before === PAREN_CLOSE ||\n before === SQUARE_CLOSE ||\n before === COPYRIGHT ||\n before === REGISTERED ||\n before === TRADEMARK)\n ) {\n return null;\n }\n // S2 — right adjacency: `(r)evolution`.\n if (after !== NONE && isAlnum(after)) return null;\n // S3 — no nesting: `((c))` is ASCII art or code.\n if (before === PAREN_OPEN) return null;\n\n return { start: i, end, replacement: [row.to], ruleId: \"symbols\" };\n }\n return null;\n}\n\ninterface ChainLink {\n readonly letterIndex: number;\n readonly leftSpace: 0 | 1;\n readonly rightSpace: 0 | 1;\n}\n\ninterface Chain {\n /** Index of the last code point read, whether or not any link was completed. */\n readonly end: number;\n readonly links: readonly ChainLink[];\n readonly firstRunEnd: number;\n}\n\n/**\n * `DIGIT+ (MUL-LETTER DIGIT+)+`, read from the start of a maximal digit run at `a`\n * (spec/rules/symbols.md 3.3 step 1). Reading the whole chain up front is what lets step 8\n * convert every link in one pass; a pairwise test cannot be made idempotent here by any amount\n * of guarding, because it converts one operator per pass (spec 5, 7.10).\n */\nfunction readChain(cp: readonly number[], a: number): Chain {\n let p = a;\n while (isDigit(at(cp, p))) p += 1;\n const firstRunEnd = p - 1;\n const links: ChainLink[] = [];\n let end = p - 1;\n\n for (;;) {\n let q = p;\n let leftSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n leftSpace = 1;\n q += 1;\n }\n if (!isMulLetter(at(cp, q))) break;\n const letterIndex = q;\n q += 1;\n let rightSpace: 0 | 1 = 0;\n if (isSpaceLike(at(cp, q))) {\n rightSpace = 1;\n q += 1;\n }\n if (!isDigit(at(cp, q))) break;\n while (isDigit(at(cp, q))) q += 1;\n links.push({ letterIndex, leftSpace, rightSpace });\n end = q - 1;\n p = q;\n }\n\n return { end, links, firstRunEnd };\n}\n\n/** `null` when a guard declines the chain — always the whole chain, never a subset. */\nfunction chainEdits(cp: readonly number[], a: number, chain: Chain): Edit[] | null {\n const links = chain.links;\n const first = links[0];\n if (first === undefined) return null;\n\n // M1 — each link symmetric, and every link agreeing. `5x4 x 3` is ambiguous and is declined\n // whole rather than half-converted.\n const sp = first.leftSpace;\n for (const link of links) {\n if (link.leftSpace !== link.rightSpace) return null;\n if (link.leftSpace !== sp) return null;\n }\n\n // M2/M3 — the chain's OUTER boundaries, not each link. Applying them per link is what made\n // the pairwise form reject chains: the letter past the middle digit run is itself a\n // MUL-LETTER, hence a LETTER.\n const before = at(cp, a - 1);\n const after = at(cp, chain.end + 1);\n if (before !== NONE && isLetter(before)) return null;\n if (after !== NONE && isLetter(after)) return null;\n\n // M4 — hexadecimal literal. Latin-lowercase only: a hex literal is never written with\n // Cyrillic. Inspects the first link alone.\n if (\n sp === 0 &&\n at(cp, first.letterIndex) === LOWER_X &&\n chain.firstRunEnd === a &&\n at(cp, a) === DIGIT_ZERO\n ) {\n return null;\n }\n\n // There is no M5. It was removed rather than extended (spec 3.3 step 7, 7.3).\n const edits: Edit[] = [];\n for (const link of links) {\n const j = link.letterIndex;\n const replacement =\n sp === 0 ? [MULTIPLICATION] : [at(cp, j - 1), MULTIPLICATION, at(cp, j + 1)];\n edits.push({ start: j - sp, end: j + sp + 1, replacement, ruleId: \"symbols\" });\n }\n return edits;\n}\n\n/** spec/rules/symbols.md 3.4. Only the literal `+/-`; the bare `+-` is never converted. */\nfunction plusMinusAt(cp: readonly number[], i: number): Edit | null {\n if (at(cp, i + 1) !== SOLIDUS || at(cp, i + 2) !== HYPHEN_MINUS) return null;\n // F1 — `[+/-]` is a regular-expression character class.\n if (at(cp, i - 1) === SQUARE_OPEN) return null;\n // F2 — numeric context, with one optional intervening space so `+/-5` and `+/- 5` both work.\n // Without it, prose that names the characters (`lines marked +/- were edited`) is corrupted.\n let j = i + 3;\n if (at(cp, j) === SPACE) j += 1;\n if (!isDigit(at(cp, j))) return null;\n return { start: i, end: i + 3, replacement: [PLUS_MINUS], ruleId: \"symbols\" };\n}\n\nexport const symbolsRule: Rule = {\n id: \"symbols\",\n apply(ctx: RuleContext): Edit[] {\n const cp = ctx.cp;\n const n = cp.length;\n const edits: Edit[] = [];\n let i = 0;\n\n while (i < n) {\n const current = at(cp, i);\n\n if (current === PAREN_OPEN) {\n const edit = trademarkAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n } else if (isDigit(current) && !isDigit(at(cp, i - 1))) {\n // Keyed on the start of a maximal digit run, not on the letter.\n const chain = readChain(cp, i);\n const chainResult = chainEdits(cp, i, chain);\n if (chainResult !== null) for (const edit of chainResult) edits.push(edit);\n // Continue past the chain whether or not it converted. A declined chain has no\n // convertible sub-chain: any sub-chain starts right after a MUL-LETTER, which is a\n // LETTER, so M2 rejects it.\n i = chain.end + 1;\n continue;\n } else if (current === PLUS) {\n const edit = plusMinusAt(cp, i);\n if (edit !== null) {\n edits.push(edit);\n i = edit.end;\n continue;\n }\n }\n i += 1;\n }\n\n return edits;\n },\n};\n","import type { Rule, RuleId } from \"../types.js\";\nimport { apostropheRule } from \"./apostrophe.js\";\nimport { dashesRule } from \"./dashes.js\";\nimport { ellipsisRule } from \"./ellipsis.js\";\nimport { hyphenRule } from \"./hyphen.js\";\nimport { nbspRule } from \"./nbsp.js\";\nimport { quotesRule } from \"./quotes.js\";\nimport { rangesRule } from \"./ranges.js\";\nimport { spacesRule } from \"./spaces.js\";\nimport { symbolsRule } from \"./symbols.js\";\n\n/**\n * Mirrors spec/rules/order.json, ascending by `order`. The pipeline must not depend on\n * registration order or map iteration order — Go randomizes the latter (ARCHITECTURE.md 4.5).\n * tests/engine/pipeline.test.ts asserts this list against the spec file.\n *\n * `ranges` sits at order 25, between `ellipsis` (20) and `dashes` (30) — chosen from an observed\n * behavioural difference, not for convenience (dashes.md 7.11, ranges.md 4). A dedicated\n * adjacency stress battery (a parenthetical dash directly touching a range: `a - 5-10`) found\n * that the two orders genuinely disagree: `ranges`-before-`dashes` converts both tokens\n * (`a—5⁠–⁠10`), matching what the single unified pre-0.5.0 `dashes` rule produced (its one scan\n * evaluated every token's cross-token guards — G2 in particular — against the *original*,\n * unedited input, since all edits were collected before any were applied). `dashes`-before-`ranges`\n * instead has `dashes` remove the space between the parenthetical dash and the range's digit run\n * first, which then makes `ranges`' own G2 (\"no chain\") guard see a dash immediately adjacent to\n * the range and decline it (`a—5-10`) — a regression against the pre-split rule's own behaviour,\n * introduced purely by which rule happens to run first, not by anything in either rule's own\n * guards changing. `ranges`-before-`dashes` is the order that stays faithful to what one combined\n * pass already did; see tests/rules/ranges.test.ts's \"adjacency order\" cases for the reproduction.\n */\nexport const RULE_ORDER: readonly RuleId[] = [\n \"spaces\",\n \"ellipsis\",\n \"ranges\",\n \"dashes\",\n \"hyphen\",\n \"quotes\",\n \"apostrophe\",\n \"symbols\",\n \"nbsp\",\n];\n\n/**\n * From the `default` field of spec/rules/order.json. Every rule except `ranges` defaults on;\n * `ranges` (spec 0.5.0) is the first rule to default off — see `rule-runner.ts`'s `planRules`\n * for how `Options.rules` resolves a default-off rule's explicit `true`.\n */\nexport const RULE_DEFAULTS: Readonly<Record<RuleId, boolean>> = {\n spaces: true,\n ellipsis: true,\n ranges: false,\n dashes: true,\n hyphen: true,\n quotes: true,\n apostrophe: true,\n symbols: true,\n nbsp: true,\n};\n\n/** Rule implementations, keyed by id. Partial until every rule lands. */\nexport const RULES: Readonly<Partial<Record<RuleId, Rule>>> = {\n spaces: spacesRule,\n ellipsis: ellipsisRule,\n ranges: rangesRule,\n dashes: dashesRule,\n hyphen: hyphenRule,\n quotes: quotesRule,\n apostrophe: apostropheRule,\n symbols: symbolsRule,\n nbsp: nbspRule,\n};\n\nexport function isRuleId(value: string): value is RuleId {\n return (RULE_ORDER as readonly string[]).includes(value);\n}\n","import { PolytypoError } from \"../errors.js\";\nimport type { Edit, RuleId } from \"../types.js\";\nimport { isValidCodePoint } from \"./codepoints.js\";\n\nfunction reject(message: string): never {\n throw new PolytypoError(\"POLYTYPO_RULE_CONTRACT\", message);\n}\n\n/**\n * Rules are community-contributed, so the contract is enforced rather than trusted: edits must\n * be in bounds, ascending, non-overlapping, and made of real code points.\n */\nexport function validateEdits(edits: readonly Edit[], length: number, ruleId?: RuleId): void {\n let previousEnd = 0;\n let i = -1;\n for (const edit of edits) {\n i += 1;\n const where = ruleId === undefined ? `edit ${i}` : `rule \"${ruleId}\" edit ${i}`;\n\n if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end)) {\n reject(`${where} has non-integer bounds (${edit.start}, ${edit.end})`);\n }\n if (edit.start < 0 || edit.end > length) {\n reject(`${where} is out of bounds (${edit.start}, ${edit.end}) for length ${length}`);\n }\n if (edit.end < edit.start) {\n reject(`${where} has end ${edit.end} before start ${edit.start}`);\n }\n if (edit.start < previousEnd) {\n reject(`${where} starts at ${edit.start}, which overlaps or precedes the previous edit`);\n }\n if (ruleId !== undefined && edit.ruleId !== ruleId) {\n reject(`${where} is tagged \"${edit.ruleId}\" but was produced by rule \"${ruleId}\"`);\n }\n for (const value of edit.replacement) {\n if (!isValidCodePoint(value)) {\n reject(`${where} contains an invalid code point (${value})`);\n }\n }\n previousEnd = edit.end;\n }\n}\n\n/** Applies validated edits left to right, producing a new code-point array. */\nexport function applyEdits(\n cp: readonly number[],\n edits: readonly Edit[],\n ruleId?: RuleId,\n): number[] {\n validateEdits(edits, cp.length, ruleId);\n if (edits.length === 0) return cp.slice();\n\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (const value of cp.slice(cursor, edit.start)) out.push(value);\n for (const value of edit.replacement) out.push(value);\n cursor = edit.end;\n }\n for (const value of cp.slice(cursor)) out.push(value);\n return out;\n}\n","import type { Edit, RuleId } from \"../types.js\";\nimport { fromCodePoints } from \"./codepoints.js\";\n\n/**\n * analyze.md §2: every reported offset is a code-point offset into the input the caller passed,\n * in every mode. The rules, however, run over an array that is not the input — in `text` mode\n * edits from earlier rules have already shifted it, and in `html`/`markdown` mode it is the\n * marker-joined concatenation of the processable spans (modes.md §3.5). This module carries the\n * one structure that bridges the two: an origin map, parallel to the current code-point array,\n * holding the input offset each code point came from, or NO_ORIGIN for one the pipeline itself\n * produced.\n */\nexport const NO_ORIGIN = -1;\n\n/**\n * The input offset an edit boundary at `index` addresses. Synthetic code points have no origin\n * of their own, so the scan runs forward to the first that has one — an insertion between two\n * earlier insertions still lands where the next real character is. Falling off the end means the\n * boundary is at the end of the input.\n */\nexport function originAt(origin: readonly number[], index: number, inputLength: number): number {\n for (let i = index; i < origin.length; i += 1) {\n const value = origin[i] as number;\n if (value !== NO_ORIGIN) return value;\n }\n return inputLength;\n}\n\n/**\n * The origin map for the array `applyEdits` is about to produce. A replacement of equal length\n * keeps its origins position by position, which is what makes a conversion (U+0020 → U+00A0)\n * still point at the character it converted; anything longer is synthetic beyond the positions\n * it covers.\n */\nexport function applyEditsToOrigin(origin: readonly number[], edits: readonly Edit[]): number[] {\n if (edits.length === 0) return origin.slice();\n const out: number[] = [];\n let cursor = 0;\n for (const edit of edits) {\n for (let i = cursor; i < edit.start; i += 1) out.push(origin[i] as number);\n for (let k = 0; k < edit.replacement.length; k += 1) {\n const source = edit.start + k;\n out.push(source < edit.end ? (origin[source] as number) : NO_ORIGIN);\n }\n cursor = edit.end;\n }\n for (let i = cursor; i < origin.length; i += 1) out.push(origin[i] as number);\n return out;\n}\n\n/** One entry of `analyze`'s result, in input coordinates (analyze.md §2). */\nexport interface Change {\n readonly ruleId: RuleId;\n readonly start: number;\n readonly end: number;\n readonly before: string;\n readonly after: string;\n}\n\n/**\n * One rule's edits, in the coordinates that rule saw, rendered as Changes in input coordinates.\n * `before` is the text this rule replaced and `after` what it replaced it with (analyze.md §2),\n * so on a text two rules have both touched, `before` is what the second rule saw rather than\n * what the caller typed — §5 says so and shows the French case where it matters.\n */\nexport function recordChanges(\n cp: readonly number[],\n edits: readonly Edit[],\n origin: readonly number[],\n inputLength: number,\n ruleId: RuleId,\n): Change[] {\n return edits.map((edit) => ({\n ruleId,\n start: originAt(origin, edit.start, inputLength),\n end: originAt(origin, edit.end, inputLength),\n before: fromCodePoints(cp.slice(edit.start, edit.end)),\n after: fromCodePoints(edit.replacement),\n }));\n}\n","import { PolytypoError } from \"../errors.js\";\nimport { isRuleId, RULES, RULE_DEFAULTS, RULE_ORDER } from \"../rules/registry.js\";\nimport type { Edit, LocaleData, Mode, Options, RuleId } from \"../types.js\";\nimport { applyEdits } from \"./edits.js\";\nimport { applyEditsToOrigin, recordChanges, type Change } from \"./origin.js\";\n\n/**\n * The rules that will run, in spec order. An explicit `false` always disables a rule and an\n * absent key always means \"use that rule's own default\" (RULE_DEFAULTS in registry.ts) —\n * unchanged since spec 0.4.1. Spec 0.5.0 adds the other half: an explicit `true` on a\n * default-off rule (`ranges`, the first one) turns it on. This is not a \"one option is now\n * opt-in, opt-out for the rest\" special case — it is the same single rule applied uniformly:\n * `override ?? RULE_DEFAULTS[id]`. For every rule but `ranges`, `RULE_DEFAULTS[id]` is already\n * `true`, so an explicit `true` there was always a no-op (tests/engine/pipeline.test.ts still\n * asserts that), and the only thing that changes is which rules *can* have a meaningful `true`.\n * Disabling a rule removes it from the sequence and never reorders the rest (ARCHITECTURE.md\n * 4.5).\n */\nexport function planRules(rules: Options[\"rules\"]): RuleId[] {\n const overrides = new Map<RuleId, boolean>();\n if (rules !== undefined) {\n for (const [key, value] of Object.entries(rules)) {\n if (!isRuleId(key)) {\n throw new PolytypoError(\n \"POLYTYPO_UNKNOWN_RULE\",\n `Unknown rule \"${key}\". Known rules: ${RULE_ORDER.join(\", \")}.`,\n );\n }\n overrides.set(key, value);\n }\n }\n return RULE_ORDER.filter((id) => overrides.get(id) ?? RULE_DEFAULTS[id]);\n}\n\n/**\n * Rules report edits and the pipeline applies them; no rule ever touches a string\n * (ARCHITECTURE.md 7.1). Each rule sees the output of the previous one.\n */\nexport function runRules(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n): readonly number[] {\n let current = cp;\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n current = applyEdits(current, rule.apply({ cp: current, locale, mode, narrowTarget }), id);\n }\n return current;\n}\n\n/**\n * `runRules`, keeping the edits instead of discarding them (analyze.md §1: same pipeline, same\n * order, reporting rather than applying). The origin map travels alongside the array so every\n * change comes back in input coordinates, and `filterEdits` is the hook the span runner needs\n * for modes.md §3.4's boundary filters — text mode passes nothing and gets the identity.\n */\nexport function runRulesRecording(\n cp: readonly number[],\n planned: readonly RuleId[],\n locale: LocaleData,\n mode: Mode,\n narrowTarget: number,\n origin: readonly number[],\n inputLength: number,\n filterEdits?: (current: readonly number[], edits: readonly Edit[]) => readonly Edit[],\n): Change[] {\n let current = cp;\n let currentOrigin = origin;\n const changes: Change[] = [];\n for (const id of planned) {\n const rule = RULES[id];\n if (rule === undefined) continue;\n const produced = rule.apply({ cp: current, locale, mode, narrowTarget });\n const edits = filterEdits === undefined ? produced : filterEdits(current, produced);\n if (edits.length > 0) {\n changes.push(...recordChanges(current, edits, currentOrigin, inputLength, id));\n currentOrigin = applyEditsToOrigin(currentOrigin, edits);\n }\n current = applyEdits(current, edits, id);\n }\n return changes;\n}\n"]}