diff --git a/go.mod b/go.mod index a029d9253..e455f1571 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/iancoleman/strcase v0.3.0 github.com/launchdarkly/json-patch v0.0.0-20180720210516-dd68d883319f github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 - github.com/olekukonko/tablewriter v1.1.0 + github.com/olekukonko/tablewriter v1.1.1 github.com/petar-dambovaliev/aho-corasick v0.0.0-20211021192214-5ab2d9280aa9 github.com/spf13/cobra v1.10.1 github.com/spf13/pflag v1.0.10 @@ -29,6 +29,9 @@ require ( dario.cat/mergo v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.1.6 // indirect + github.com/clipperhouse/displaywidth v0.3.1 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -45,13 +48,13 @@ require ( github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect github.com/olekukonko/errors v1.1.0 // indirect - github.com/olekukonko/ll v0.0.9 // indirect + github.com/olekukonko/ll v0.1.2 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rivo/uniseg v0.2.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/skeema/knownhosts v1.3.1 // indirect diff --git a/go.sum b/go.sum index 87614423c..c47341ae9 100644 --- a/go.sum +++ b/go.sum @@ -51,6 +51,12 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clipperhouse/displaywidth v0.3.1 h1:k07iN9gD32177o1y4O1jQMzbLdCrsGJh+blirVYybsk= +github.com/clipperhouse/displaywidth v0.3.1/go.mod h1:tgLJKKyaDOCadywag3agw4snxS5kYEuYR6Y9+qWDDYM= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY= +github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -175,16 +181,18 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= +github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= -github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI= -github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g= -github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY= -github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= +github.com/olekukonko/ll v0.1.2 h1:lkg/k/9mlsy0SxO5aC+WEpbdT5K83ddnNhAepz7TQc0= +github.com/olekukonko/ll v0.1.2/go.mod h1:b52bVQRRPObe+yyBl0TxNfhesL0nedD4Cht0/zx55Ew= +github.com/olekukonko/tablewriter v1.1.1 h1:b3reP6GCfrHwmKkYwNRFh2rxidGHcT6cgxj/sHiDDx0= +github.com/olekukonko/tablewriter v1.1.1/go.mod h1:De/bIcTF+gpBDB3Alv3fEsZA+9unTsSzAg/ZGADCtn4= github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -199,8 +207,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= diff --git a/vendor/github.com/clipperhouse/displaywidth/.gitignore b/vendor/github.com/clipperhouse/displaywidth/.gitignore new file mode 100644 index 000000000..e43b0f988 --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/vendor/github.com/clipperhouse/displaywidth/AGENTS.md b/vendor/github.com/clipperhouse/displaywidth/AGENTS.md new file mode 100644 index 000000000..853e2917d --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/AGENTS.md @@ -0,0 +1,37 @@ +The goals and overview of this package can be found in the README.md file, +start by reading that. + +The goal of this package is to determine the display (column) width of a +string, UTF-8 bytes, or runes, as would happen in a monospace font, especially +in a terminal. + +When troubleshooting, write Go unit tests instead of executing debug scripts. +The tests can return whatever logs or output you need. If those tests are +only for temporary troubleshooting, clean up the tests after the debugging is +done. + +(Separate executable debugging scripts are messy, tend to have conflicting +dependencies and are hard to cleanup.) + +If you make changes to the trie generation in internal/gen, it can be invoked +by running `go generate` from the top package directory. + +## Pull Requests and branches + +For PRs (pull requests), you can use the gh CLI tool to retrieve details, +or post comments. Then, compare the current branch with main. Reviewing a PR +and reviewing a branch are about the same, but the PR may add context. + +Look for bugs. Think like GitHub Copilot or Cursor BugBot. + +Offer to post a brief summary of the review to the PR, via the gh CLI tool. + +## Comparisons to go-runewidth + +We originally attempted to make this package compatible with go-runewidth. +However, we found that there were too many differences in the handling of +certain characters and properties. + +We believe, preliminarily, that our choices are more correct and complete, +by using more complete categories such as Unicode Cf (format) for zero-width +and Mn (Nonspacing_Mark) for combining marks. diff --git a/vendor/github.com/rivo/uniseg/LICENSE.txt b/vendor/github.com/clipperhouse/displaywidth/LICENSE similarity index 96% rename from vendor/github.com/rivo/uniseg/LICENSE.txt rename to vendor/github.com/clipperhouse/displaywidth/LICENSE index 5040f1ef8..4b8064eb3 100644 --- a/vendor/github.com/rivo/uniseg/LICENSE.txt +++ b/vendor/github.com/clipperhouse/displaywidth/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Oliver Kuederle +Copyright (c) 2025 Matt Sherman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/clipperhouse/displaywidth/README.md b/vendor/github.com/clipperhouse/displaywidth/README.md new file mode 100644 index 000000000..2a0d09a5f --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/README.md @@ -0,0 +1,115 @@ +# displaywidth + +A high-performance Go package for measuring the monospace display width of strings, UTF-8 bytes, and runes. + +[![Documentation](https://pkg.go.dev/badge/github.com/clipperhouse/displaywidth.svg)](https://pkg.go.dev/github.com/clipperhouse/displaywidth) +[![Test](https://github.com/clipperhouse/displaywidth/actions/workflows/gotest.yml/badge.svg)](https://github.com/clipperhouse/displaywidth/actions/workflows/gotest.yml) +[![Fuzz](https://github.com/clipperhouse/displaywidth/actions/workflows/gofuzz.yml/badge.svg)](https://github.com/clipperhouse/displaywidth/actions/workflows/gofuzz.yml) +## Install +```bash +go get github.com/clipperhouse/displaywidth +``` + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/clipperhouse/displaywidth" +) + +func main() { + width := displaywidth.String("Hello, ไธ–็•Œ!") + fmt.Println(width) + + width = displaywidth.Bytes([]byte("๐ŸŒ")) + fmt.Println(width) + + width = displaywidth.Rune('๐ŸŒ') + fmt.Println(width) +} +``` + +### Options + +You can specify East Asian Width and Strict Emoji Neutral settings. If +unspecified, the default is `EastAsianWidth: false, StrictEmojiNeutral: true`. + +```go +options := displaywidth.Options{ + EastAsianWidth: true, + StrictEmojiNeutral: false, +} + +width := options.String("Hello, ไธ–็•Œ!") +fmt.Println(width) +``` + +## Details + +This package implements the Unicode East Asian Width standard (UAX #11) and is +intended to be compatible with `go-runewidth`. It operates on bytes without +decoding runes for better performance. + +## Prior Art + +[mattn/go-runewidth](https://github.com/mattn/go-runewidth) + +[x/text/width](https://pkg.go.dev/golang.org/x/text/width) + +[x/text/internal/triegen](https://pkg.go.dev/golang.org/x/text/internal/triegen) + +## Benchmarks + +Part of my motivation is the insight that we can avoid decoding runes for better performance. + +```bash +go test -bench=. -benchmem +``` + +``` +goos: darwin +goarch: arm64 +pkg: github.com/clipperhouse/displaywidth +cpu: Apple M2 +BenchmarkStringDefault/displaywidth-8 10537 ns/op 160.10 MB/s 0 B/op 0 allocs/op +BenchmarkStringDefault/go-runewidth-8 14162 ns/op 119.12 MB/s 0 B/op 0 allocs/op +BenchmarkString_EAW/displaywidth-8 10776 ns/op 156.55 MB/s 0 B/op 0 allocs/op +BenchmarkString_EAW/go-runewidth-8 23987 ns/op 70.33 MB/s 0 B/op 0 allocs/op +BenchmarkString_StrictEmoji/displaywidth-8 10892 ns/op 154.88 MB/s 0 B/op 0 allocs/op +BenchmarkString_StrictEmoji/go-runewidth-8 14552 ns/op 115.93 MB/s 0 B/op 0 allocs/op +BenchmarkString_ASCII/displaywidth-8 1116 ns/op 114.72 MB/s 0 B/op 0 allocs/op +BenchmarkString_ASCII/go-runewidth-8 1178 ns/op 108.67 MB/s 0 B/op 0 allocs/op +BenchmarkString_Unicode/displaywidth-8 896.9 ns/op 148.29 MB/s 0 B/op 0 allocs/op +BenchmarkString_Unicode/go-runewidth-8 1434 ns/op 92.72 MB/s 0 B/op 0 allocs/op +BenchmarkStringWidth_Emoji/displaywidth-8 3033 ns/op 238.74 MB/s 0 B/op 0 allocs/op +BenchmarkStringWidth_Emoji/go-runewidth-8 4841 ns/op 149.56 MB/s 0 B/op 0 allocs/op +BenchmarkString_Mixed/displaywidth-8 4064 ns/op 124.74 MB/s 0 B/op 0 allocs/op +BenchmarkString_Mixed/go-runewidth-8 4696 ns/op 107.97 MB/s 0 B/op 0 allocs/op +BenchmarkString_ControlChars/displaywidth-8 320.6 ns/op 102.93 MB/s 0 B/op 0 allocs/op +BenchmarkString_ControlChars/go-runewidth-8 373.8 ns/op 88.28 MB/s 0 B/op 0 allocs/op +BenchmarkRuneDefault/displaywidth-8 335.5 ns/op 411.35 MB/s 0 B/op 0 allocs/op +BenchmarkRuneDefault/go-runewidth-8 681.2 ns/op 202.58 MB/s 0 B/op 0 allocs/op +BenchmarkRuneWidth_EAW/displaywidth-8 146.7 ns/op 374.80 MB/s 0 B/op 0 allocs/op +BenchmarkRuneWidth_EAW/go-runewidth-8 495.6 ns/op 110.98 MB/s 0 B/op 0 allocs/op +BenchmarkRuneWidth_ASCII/displaywidth-8 63.00 ns/op 460.33 MB/s 0 B/op 0 allocs/op +BenchmarkRuneWidth_ASCII/go-runewidth-8 68.90 ns/op 420.91 MB/s 0 B/op 0 allocs/op +``` + +I use a similar technique in [this grapheme cluster library](https://github.com/clipperhouse/uax29). + +## Compatibility + +`displaywidth` will mostly give the same outputs as `go-runewidth`, but there are some differences: + +- Unicode category Mn (Nonspacing Mark): `displaywidth` will return width 0, `go-runewidth` may return width 1 for some runes. +- Unicode category Cf (Format): `displaywidth` will return width 0, `go-runewidth` may return width 1 for some runes. +- Unicode category Mc (Spacing Mark): `displaywidth` will return width 1, `go-runewidth` may return width 0 for some runes. +- Unicode category Cs (Surrogate): `displaywidth` will return width 0, `go-runewidth` may return width 1 for some runes. Surrogates are not valid UTF-8; some packages may turn them into the replacement character (U+FFFD). +- Unicode category Zl (Line separator): `displaywidth` will return width 0, `go-runewidth` may return width 1. +- Unicode category Zp (Paragraph separator): `displaywidth` will return width 0, `go-runewidth` may return width 1. +- Unicode Noncharacters (U+FFFE and U+FFFF): `displaywidth` will return width 0, `go-runewidth` may return width 1. + +See `TestCompatibility` for more details. diff --git a/vendor/github.com/clipperhouse/displaywidth/gen.go b/vendor/github.com/clipperhouse/displaywidth/gen.go new file mode 100644 index 000000000..52e1085bc --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/gen.go @@ -0,0 +1,3 @@ +package displaywidth + +//go:generate go run -C internal/gen . diff --git a/vendor/github.com/clipperhouse/displaywidth/trie.go b/vendor/github.com/clipperhouse/displaywidth/trie.go new file mode 100644 index 000000000..097fb541f --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/trie.go @@ -0,0 +1,1897 @@ +// Code generated by internal/gen/main.go. DO NOT EDIT. + +package displaywidth + +import "github.com/clipperhouse/stringish" + +// property represents the properties of a character as bit flags +// The underlying type is uint8 since we only use 4 bits for flags. +type property uint8 + +const ( + // Always 2 wide + _East_Asian_Full_Wide property = 1 << iota + // Width depends on EastAsianWidth option + _East_Asian_Ambiguous + // Width depends on EastAsianWidth and StrictEmojiNeutral options + _Emoji + // Always 0 width, includes combining marks, control characters, non-printable, etc + _ZeroWidth +) + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func lookup[T stringish.Interface](s T) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return stringWidthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := stringWidthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := stringWidthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = stringWidthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := stringWidthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = stringWidthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = stringWidthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// stringWidthTrie. Total size: 18432 bytes (18.00 KiB). Checksum: dea3fa00409f1ec3. +// type stringWidthTrie struct { } + +// func newStringWidthTrie(i int) *stringWidthTrie { +// return &stringWidthTrie{} +// } + +// lookupValue determines the type of block n and looks up the value for b. +func lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(stringWidthValues[n<<6+uint32(b)]) + } +} + +// stringWidthValues: 257 blocks, 16448 entries, 16448 bytes +// The third block is the zero block. +var stringWidthValues = [16448]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0008, 0xc1: 0x0008, 0xc2: 0x0008, 0xc3: 0x0008, 0xc4: 0x0008, 0xc5: 0x0008, + 0xc6: 0x0008, 0xc7: 0x0008, 0xc8: 0x0008, 0xc9: 0x0008, 0xca: 0x0008, 0xcb: 0x0008, + 0xcc: 0x0008, 0xcd: 0x0008, 0xce: 0x0008, 0xcf: 0x0008, 0xd0: 0x0008, 0xd1: 0x0008, + 0xd2: 0x0008, 0xd3: 0x0008, 0xd4: 0x0008, 0xd5: 0x0008, 0xd6: 0x0008, 0xd7: 0x0008, + 0xd8: 0x0008, 0xd9: 0x0008, 0xda: 0x0008, 0xdb: 0x0008, 0xdc: 0x0008, 0xdd: 0x0008, + 0xde: 0x0008, 0xdf: 0x0008, 0xe1: 0x0002, + 0xe4: 0x0002, 0xe7: 0x0002, 0xe8: 0x0002, + 0xea: 0x0002, 0xed: 0x000a, 0xee: 0x0002, + 0xf0: 0x0002, 0xf1: 0x0002, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x0002, + 0xf6: 0x0002, 0xf7: 0x0002, 0xf8: 0x0002, 0xf9: 0x0002, 0xfa: 0x0002, + 0xfc: 0x0002, 0xfd: 0x0002, 0xfe: 0x0002, 0xff: 0x0002, + // Block 0x4, offset 0x100 + 0x106: 0x0002, + 0x110: 0x0002, + 0x117: 0x0002, + 0x118: 0x0002, + 0x11e: 0x0002, 0x11f: 0x0002, 0x120: 0x0002, 0x121: 0x0002, + 0x126: 0x0002, 0x128: 0x0002, 0x129: 0x0002, + 0x12a: 0x0002, 0x12c: 0x0002, 0x12d: 0x0002, + 0x130: 0x0002, 0x132: 0x0002, 0x133: 0x0002, + 0x137: 0x0002, 0x138: 0x0002, 0x139: 0x0002, 0x13a: 0x0002, + 0x13c: 0x0002, 0x13e: 0x0002, + // Block 0x5, offset 0x140 + 0x141: 0x0002, + 0x151: 0x0002, + 0x153: 0x0002, + 0x15b: 0x0002, + 0x166: 0x0002, 0x167: 0x0002, + 0x16b: 0x0002, + 0x171: 0x0002, 0x172: 0x0002, 0x173: 0x0002, + 0x178: 0x0002, + 0x17f: 0x0002, + // Block 0x6, offset 0x180 + 0x180: 0x0002, 0x181: 0x0002, 0x182: 0x0002, 0x184: 0x0002, + 0x188: 0x0002, 0x189: 0x0002, 0x18a: 0x0002, 0x18b: 0x0002, + 0x18d: 0x0002, + 0x192: 0x0002, 0x193: 0x0002, + 0x1a6: 0x0002, 0x1a7: 0x0002, + 0x1ab: 0x0002, + // Block 0x7, offset 0x1c0 + 0x1ce: 0x0002, 0x1d0: 0x0002, + 0x1d2: 0x0002, 0x1d4: 0x0002, 0x1d6: 0x0002, + 0x1d8: 0x0002, 0x1da: 0x0002, 0x1dc: 0x0002, + // Block 0x8, offset 0x200 + 0x211: 0x0002, + 0x221: 0x0002, + // Block 0x9, offset 0x240 + 0x244: 0x0002, + 0x247: 0x0002, 0x249: 0x0002, 0x24a: 0x0002, 0x24b: 0x0002, + 0x24d: 0x0002, 0x250: 0x0002, + 0x258: 0x0002, 0x259: 0x0002, 0x25a: 0x0002, 0x25b: 0x0002, 0x25d: 0x0002, + 0x25f: 0x0002, + // Block 0xa, offset 0x280 + 0x280: 0x000a, 0x281: 0x000a, 0x282: 0x000a, 0x283: 0x000a, 0x284: 0x000a, 0x285: 0x000a, + 0x286: 0x000a, 0x287: 0x000a, 0x288: 0x000a, 0x289: 0x000a, 0x28a: 0x000a, 0x28b: 0x000a, + 0x28c: 0x000a, 0x28d: 0x000a, 0x28e: 0x000a, 0x28f: 0x000a, 0x290: 0x000a, 0x291: 0x000a, + 0x292: 0x000a, 0x293: 0x000a, 0x294: 0x000a, 0x295: 0x000a, 0x296: 0x000a, 0x297: 0x000a, + 0x298: 0x000a, 0x299: 0x000a, 0x29a: 0x000a, 0x29b: 0x000a, 0x29c: 0x000a, 0x29d: 0x000a, + 0x29e: 0x000a, 0x29f: 0x000a, 0x2a0: 0x000a, 0x2a1: 0x000a, 0x2a2: 0x000a, 0x2a3: 0x000a, + 0x2a4: 0x000a, 0x2a5: 0x000a, 0x2a6: 0x000a, 0x2a7: 0x000a, 0x2a8: 0x000a, 0x2a9: 0x000a, + 0x2aa: 0x000a, 0x2ab: 0x000a, 0x2ac: 0x000a, 0x2ad: 0x000a, 0x2ae: 0x000a, 0x2af: 0x000a, + 0x2b0: 0x000a, 0x2b1: 0x000a, 0x2b2: 0x000a, 0x2b3: 0x000a, 0x2b4: 0x000a, 0x2b5: 0x000a, + 0x2b6: 0x000a, 0x2b7: 0x000a, 0x2b8: 0x000a, 0x2b9: 0x000a, 0x2ba: 0x000a, 0x2bb: 0x000a, + 0x2bc: 0x000a, 0x2bd: 0x000a, 0x2be: 0x000a, 0x2bf: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x000a, 0x2c1: 0x000a, 0x2c2: 0x000a, 0x2c3: 0x000a, 0x2c4: 0x000a, 0x2c5: 0x000a, + 0x2c6: 0x000a, 0x2c7: 0x000a, 0x2c8: 0x000a, 0x2c9: 0x000a, 0x2ca: 0x000a, 0x2cb: 0x000a, + 0x2cc: 0x000a, 0x2cd: 0x000a, 0x2ce: 0x000a, 0x2cf: 0x000a, 0x2d0: 0x000a, 0x2d1: 0x000a, + 0x2d2: 0x000a, 0x2d3: 0x000a, 0x2d4: 0x000a, 0x2d5: 0x000a, 0x2d6: 0x000a, 0x2d7: 0x000a, + 0x2d8: 0x000a, 0x2d9: 0x000a, 0x2da: 0x000a, 0x2db: 0x000a, 0x2dc: 0x000a, 0x2dd: 0x000a, + 0x2de: 0x000a, 0x2df: 0x000a, 0x2e0: 0x000a, 0x2e1: 0x000a, 0x2e2: 0x000a, 0x2e3: 0x000a, + 0x2e4: 0x000a, 0x2e5: 0x000a, 0x2e6: 0x000a, 0x2e7: 0x000a, 0x2e8: 0x000a, 0x2e9: 0x000a, + 0x2ea: 0x000a, 0x2eb: 0x000a, 0x2ec: 0x000a, 0x2ed: 0x000a, 0x2ee: 0x000a, 0x2ef: 0x000a, + // Block 0xc, offset 0x300 + 0x311: 0x0002, + 0x312: 0x0002, 0x313: 0x0002, 0x314: 0x0002, 0x315: 0x0002, 0x316: 0x0002, 0x317: 0x0002, + 0x318: 0x0002, 0x319: 0x0002, 0x31a: 0x0002, 0x31b: 0x0002, 0x31c: 0x0002, 0x31d: 0x0002, + 0x31e: 0x0002, 0x31f: 0x0002, 0x320: 0x0002, 0x321: 0x0002, 0x323: 0x0002, + 0x324: 0x0002, 0x325: 0x0002, 0x326: 0x0002, 0x327: 0x0002, 0x328: 0x0002, 0x329: 0x0002, + 0x331: 0x0002, 0x332: 0x0002, 0x333: 0x0002, 0x334: 0x0002, 0x335: 0x0002, + 0x336: 0x0002, 0x337: 0x0002, 0x338: 0x0002, 0x339: 0x0002, 0x33a: 0x0002, 0x33b: 0x0002, + 0x33c: 0x0002, 0x33d: 0x0002, 0x33e: 0x0002, 0x33f: 0x0002, + // Block 0xd, offset 0x340 + 0x340: 0x0002, 0x341: 0x0002, 0x343: 0x0002, 0x344: 0x0002, 0x345: 0x0002, + 0x346: 0x0002, 0x347: 0x0002, 0x348: 0x0002, 0x349: 0x0002, + // Block 0xe, offset 0x380 + 0x381: 0x0002, + 0x390: 0x0002, 0x391: 0x0002, + 0x392: 0x0002, 0x393: 0x0002, 0x394: 0x0002, 0x395: 0x0002, 0x396: 0x0002, 0x397: 0x0002, + 0x398: 0x0002, 0x399: 0x0002, 0x39a: 0x0002, 0x39b: 0x0002, 0x39c: 0x0002, 0x39d: 0x0002, + 0x39e: 0x0002, 0x39f: 0x0002, 0x3a0: 0x0002, 0x3a1: 0x0002, 0x3a2: 0x0002, 0x3a3: 0x0002, + 0x3a4: 0x0002, 0x3a5: 0x0002, 0x3a6: 0x0002, 0x3a7: 0x0002, 0x3a8: 0x0002, 0x3a9: 0x0002, + 0x3aa: 0x0002, 0x3ab: 0x0002, 0x3ac: 0x0002, 0x3ad: 0x0002, 0x3ae: 0x0002, 0x3af: 0x0002, + 0x3b0: 0x0002, 0x3b1: 0x0002, 0x3b2: 0x0002, 0x3b3: 0x0002, 0x3b4: 0x0002, 0x3b5: 0x0002, + 0x3b6: 0x0002, 0x3b7: 0x0002, 0x3b8: 0x0002, 0x3b9: 0x0002, 0x3ba: 0x0002, 0x3bb: 0x0002, + 0x3bc: 0x0002, 0x3bd: 0x0002, 0x3be: 0x0002, 0x3bf: 0x0002, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0002, 0x3c1: 0x0002, 0x3c2: 0x0002, 0x3c3: 0x0002, 0x3c4: 0x0002, 0x3c5: 0x0002, + 0x3c6: 0x0002, 0x3c7: 0x0002, 0x3c8: 0x0002, 0x3c9: 0x0002, 0x3ca: 0x0002, 0x3cb: 0x0002, + 0x3cc: 0x0002, 0x3cd: 0x0002, 0x3ce: 0x0002, 0x3cf: 0x0002, 0x3d1: 0x0002, + // Block 0x10, offset 0x400 + 0x403: 0x0008, 0x404: 0x0008, 0x405: 0x0008, + 0x406: 0x0008, 0x407: 0x0008, 0x408: 0x0008, 0x409: 0x0008, + // Block 0x11, offset 0x440 + 0x451: 0x0008, + 0x452: 0x0008, 0x453: 0x0008, 0x454: 0x0008, 0x455: 0x0008, 0x456: 0x0008, 0x457: 0x0008, + 0x458: 0x0008, 0x459: 0x0008, 0x45a: 0x0008, 0x45b: 0x0008, 0x45c: 0x0008, 0x45d: 0x0008, + 0x45e: 0x0008, 0x45f: 0x0008, 0x460: 0x0008, 0x461: 0x0008, 0x462: 0x0008, 0x463: 0x0008, + 0x464: 0x0008, 0x465: 0x0008, 0x466: 0x0008, 0x467: 0x0008, 0x468: 0x0008, 0x469: 0x0008, + 0x46a: 0x0008, 0x46b: 0x0008, 0x46c: 0x0008, 0x46d: 0x0008, 0x46e: 0x0008, 0x46f: 0x0008, + 0x470: 0x0008, 0x471: 0x0008, 0x472: 0x0008, 0x473: 0x0008, 0x474: 0x0008, 0x475: 0x0008, + 0x476: 0x0008, 0x477: 0x0008, 0x478: 0x0008, 0x479: 0x0008, 0x47a: 0x0008, 0x47b: 0x0008, + 0x47c: 0x0008, 0x47d: 0x0008, 0x47f: 0x0008, + // Block 0x12, offset 0x480 + 0x481: 0x0008, 0x482: 0x0008, 0x484: 0x0008, 0x485: 0x0008, + 0x487: 0x0008, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0008, 0x4c1: 0x0008, 0x4c2: 0x0008, 0x4c3: 0x0008, 0x4c4: 0x0008, 0x4c5: 0x0008, + 0x4d0: 0x0008, 0x4d1: 0x0008, + 0x4d2: 0x0008, 0x4d3: 0x0008, 0x4d4: 0x0008, 0x4d5: 0x0008, 0x4d6: 0x0008, 0x4d7: 0x0008, + 0x4d8: 0x0008, 0x4d9: 0x0008, 0x4da: 0x0008, 0x4dc: 0x0008, + // Block 0x14, offset 0x500 + 0x50b: 0x0008, + 0x50c: 0x0008, 0x50d: 0x0008, 0x50e: 0x0008, 0x50f: 0x0008, 0x510: 0x0008, 0x511: 0x0008, + 0x512: 0x0008, 0x513: 0x0008, 0x514: 0x0008, 0x515: 0x0008, 0x516: 0x0008, 0x517: 0x0008, + 0x518: 0x0008, 0x519: 0x0008, 0x51a: 0x0008, 0x51b: 0x0008, 0x51c: 0x0008, 0x51d: 0x0008, + 0x51e: 0x0008, 0x51f: 0x0008, + 0x530: 0x0008, + // Block 0x15, offset 0x540 + 0x556: 0x0008, 0x557: 0x0008, + 0x558: 0x0008, 0x559: 0x0008, 0x55a: 0x0008, 0x55b: 0x0008, 0x55c: 0x0008, 0x55d: 0x0008, + 0x55f: 0x0008, 0x560: 0x0008, 0x561: 0x0008, 0x562: 0x0008, 0x563: 0x0008, + 0x564: 0x0008, 0x567: 0x0008, 0x568: 0x0008, + 0x56a: 0x0008, 0x56b: 0x0008, 0x56c: 0x0008, 0x56d: 0x0008, + // Block 0x16, offset 0x580 + 0x58f: 0x0008, 0x591: 0x0008, + 0x5b0: 0x0008, 0x5b1: 0x0008, 0x5b2: 0x0008, 0x5b3: 0x0008, 0x5b4: 0x0008, 0x5b5: 0x0008, + 0x5b6: 0x0008, 0x5b7: 0x0008, 0x5b8: 0x0008, 0x5b9: 0x0008, 0x5ba: 0x0008, 0x5bb: 0x0008, + 0x5bc: 0x0008, 0x5bd: 0x0008, 0x5be: 0x0008, 0x5bf: 0x0008, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0008, 0x5c1: 0x0008, 0x5c2: 0x0008, 0x5c3: 0x0008, 0x5c4: 0x0008, 0x5c5: 0x0008, + 0x5c6: 0x0008, 0x5c7: 0x0008, 0x5c8: 0x0008, 0x5c9: 0x0008, 0x5ca: 0x0008, + // Block 0x18, offset 0x600 + 0x626: 0x0008, 0x627: 0x0008, 0x628: 0x0008, 0x629: 0x0008, + 0x62a: 0x0008, 0x62b: 0x0008, 0x62c: 0x0008, 0x62d: 0x0008, 0x62e: 0x0008, 0x62f: 0x0008, + 0x630: 0x0008, + // Block 0x19, offset 0x640 + 0x66b: 0x0008, 0x66c: 0x0008, 0x66d: 0x0008, 0x66e: 0x0008, 0x66f: 0x0008, + 0x670: 0x0008, 0x671: 0x0008, 0x672: 0x0008, 0x673: 0x0008, + 0x67d: 0x0008, + // Block 0x1a, offset 0x680 + 0x696: 0x0008, 0x697: 0x0008, + 0x698: 0x0008, 0x699: 0x0008, 0x69b: 0x0008, 0x69c: 0x0008, 0x69d: 0x0008, + 0x69e: 0x0008, 0x69f: 0x0008, 0x6a0: 0x0008, 0x6a1: 0x0008, 0x6a2: 0x0008, 0x6a3: 0x0008, + 0x6a5: 0x0008, 0x6a6: 0x0008, 0x6a7: 0x0008, 0x6a9: 0x0008, + 0x6aa: 0x0008, 0x6ab: 0x0008, 0x6ac: 0x0008, 0x6ad: 0x0008, + // Block 0x1b, offset 0x6c0 + 0x6d9: 0x0008, 0x6da: 0x0008, 0x6db: 0x0008, + // Block 0x1c, offset 0x700 + 0x710: 0x0008, 0x711: 0x0008, + 0x718: 0x0008, 0x719: 0x0008, 0x71a: 0x0008, 0x71b: 0x0008, 0x71c: 0x0008, 0x71d: 0x0008, + 0x71e: 0x0008, 0x71f: 0x0008, + // Block 0x1d, offset 0x740 + 0x74a: 0x0008, 0x74b: 0x0008, + 0x74c: 0x0008, 0x74d: 0x0008, 0x74e: 0x0008, 0x74f: 0x0008, 0x750: 0x0008, 0x751: 0x0008, + 0x752: 0x0008, 0x753: 0x0008, 0x754: 0x0008, 0x755: 0x0008, 0x756: 0x0008, 0x757: 0x0008, + 0x758: 0x0008, 0x759: 0x0008, 0x75a: 0x0008, 0x75b: 0x0008, 0x75c: 0x0008, 0x75d: 0x0008, + 0x75e: 0x0008, 0x75f: 0x0008, 0x760: 0x0008, 0x761: 0x0008, 0x762: 0x0008, 0x763: 0x0008, + 0x764: 0x0008, 0x765: 0x0008, 0x766: 0x0008, 0x767: 0x0008, 0x768: 0x0008, 0x769: 0x0008, + 0x76a: 0x0008, 0x76b: 0x0008, 0x76c: 0x0008, 0x76d: 0x0008, 0x76e: 0x0008, 0x76f: 0x0008, + 0x770: 0x0008, 0x771: 0x0008, 0x772: 0x0008, 0x773: 0x0008, 0x774: 0x0008, 0x775: 0x0008, + 0x776: 0x0008, 0x777: 0x0008, 0x778: 0x0008, 0x779: 0x0008, 0x77a: 0x0008, 0x77b: 0x0008, + 0x77c: 0x0008, 0x77d: 0x0008, 0x77e: 0x0008, 0x77f: 0x0008, + // Block 0x1e, offset 0x780 + 0x780: 0x0008, 0x781: 0x0008, 0x782: 0x0008, + 0x7ba: 0x0008, + 0x7bc: 0x0008, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x0008, 0x7c2: 0x0008, 0x7c3: 0x0008, 0x7c4: 0x0008, 0x7c5: 0x0008, + 0x7c6: 0x0008, 0x7c7: 0x0008, 0x7c8: 0x0008, + 0x7cd: 0x0008, 0x7d1: 0x0008, + 0x7d2: 0x0008, 0x7d3: 0x0008, 0x7d4: 0x0008, 0x7d5: 0x0008, 0x7d6: 0x0008, 0x7d7: 0x0008, + 0x7e2: 0x0008, 0x7e3: 0x0008, + // Block 0x20, offset 0x800 + 0x801: 0x0008, + 0x83c: 0x0008, + // Block 0x21, offset 0x840 + 0x841: 0x0008, 0x842: 0x0008, 0x843: 0x0008, 0x844: 0x0008, + 0x84d: 0x0008, + 0x862: 0x0008, 0x863: 0x0008, + 0x87e: 0x0008, + // Block 0x22, offset 0x880 + 0x881: 0x0008, 0x882: 0x0008, + 0x8bc: 0x0008, + // Block 0x23, offset 0x8c0 + 0x8c1: 0x0008, 0x8c2: 0x0008, + 0x8c7: 0x0008, 0x8c8: 0x0008, 0x8cb: 0x0008, + 0x8cc: 0x0008, 0x8cd: 0x0008, 0x8d1: 0x0008, + 0x8f0: 0x0008, 0x8f1: 0x0008, 0x8f5: 0x0008, + // Block 0x24, offset 0x900 + 0x901: 0x0008, 0x902: 0x0008, 0x903: 0x0008, 0x904: 0x0008, 0x905: 0x0008, + 0x907: 0x0008, 0x908: 0x0008, + 0x90d: 0x0008, + 0x922: 0x0008, 0x923: 0x0008, + 0x93a: 0x0008, 0x93b: 0x0008, + 0x93c: 0x0008, 0x93d: 0x0008, 0x93e: 0x0008, 0x93f: 0x0008, + // Block 0x25, offset 0x940 + 0x941: 0x0008, + 0x97c: 0x0008, 0x97f: 0x0008, + // Block 0x26, offset 0x980 + 0x981: 0x0008, 0x982: 0x0008, 0x983: 0x0008, 0x984: 0x0008, + 0x98d: 0x0008, + 0x995: 0x0008, 0x996: 0x0008, + 0x9a2: 0x0008, 0x9a3: 0x0008, + // Block 0x27, offset 0x9c0 + 0x9c2: 0x0008, + // Block 0x28, offset 0xa00 + 0xa00: 0x0008, + 0xa0d: 0x0008, + // Block 0x29, offset 0xa40 + 0xa40: 0x0008, 0xa44: 0x0008, + 0xa7c: 0x0008, 0xa7e: 0x0008, 0xa7f: 0x0008, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0008, + 0xa86: 0x0008, 0xa87: 0x0008, 0xa88: 0x0008, 0xa8a: 0x0008, 0xa8b: 0x0008, + 0xa8c: 0x0008, 0xa8d: 0x0008, + 0xa95: 0x0008, 0xa96: 0x0008, + 0xaa2: 0x0008, 0xaa3: 0x0008, + // Block 0x2b, offset 0xac0 + 0xac6: 0x0008, + 0xacc: 0x0008, 0xacd: 0x0008, + 0xae2: 0x0008, 0xae3: 0x0008, + // Block 0x2c, offset 0xb00 + 0xb00: 0x0008, 0xb01: 0x0008, + 0xb3b: 0x0008, + 0xb3c: 0x0008, + // Block 0x2d, offset 0xb40 + 0xb41: 0x0008, 0xb42: 0x0008, 0xb43: 0x0008, 0xb44: 0x0008, + 0xb4d: 0x0008, + 0xb62: 0x0008, 0xb63: 0x0008, + // Block 0x2e, offset 0xb80 + 0xb81: 0x0008, + // Block 0x2f, offset 0xbc0 + 0xbca: 0x0008, + 0xbd2: 0x0008, 0xbd3: 0x0008, 0xbd4: 0x0008, 0xbd6: 0x0008, + // Block 0x30, offset 0xc00 + 0xc31: 0x0008, 0xc34: 0x0008, 0xc35: 0x0008, + 0xc36: 0x0008, 0xc37: 0x0008, 0xc38: 0x0008, 0xc39: 0x0008, 0xc3a: 0x0008, + // Block 0x31, offset 0xc40 + 0xc47: 0x0008, 0xc48: 0x0008, 0xc49: 0x0008, 0xc4a: 0x0008, 0xc4b: 0x0008, + 0xc4c: 0x0008, 0xc4d: 0x0008, 0xc4e: 0x0008, + // Block 0x32, offset 0xc80 + 0xcb1: 0x0008, 0xcb4: 0x0008, 0xcb5: 0x0008, + 0xcb6: 0x0008, 0xcb7: 0x0008, 0xcb8: 0x0008, 0xcb9: 0x0008, 0xcba: 0x0008, 0xcbb: 0x0008, + 0xcbc: 0x0008, + // Block 0x33, offset 0xcc0 + 0xcc8: 0x0008, 0xcc9: 0x0008, 0xcca: 0x0008, 0xccb: 0x0008, + 0xccc: 0x0008, 0xccd: 0x0008, 0xcce: 0x0008, + // Block 0x34, offset 0xd00 + 0xd18: 0x0008, 0xd19: 0x0008, + 0xd35: 0x0008, + 0xd37: 0x0008, 0xd39: 0x0008, + // Block 0x35, offset 0xd40 + 0xd71: 0x0008, 0xd72: 0x0008, 0xd73: 0x0008, 0xd74: 0x0008, 0xd75: 0x0008, + 0xd76: 0x0008, 0xd77: 0x0008, 0xd78: 0x0008, 0xd79: 0x0008, 0xd7a: 0x0008, 0xd7b: 0x0008, + 0xd7c: 0x0008, 0xd7d: 0x0008, 0xd7e: 0x0008, + // Block 0x36, offset 0xd80 + 0xd80: 0x0008, 0xd81: 0x0008, 0xd82: 0x0008, 0xd83: 0x0008, 0xd84: 0x0008, + 0xd86: 0x0008, 0xd87: 0x0008, + 0xd8d: 0x0008, 0xd8e: 0x0008, 0xd8f: 0x0008, 0xd90: 0x0008, 0xd91: 0x0008, + 0xd92: 0x0008, 0xd93: 0x0008, 0xd94: 0x0008, 0xd95: 0x0008, 0xd96: 0x0008, 0xd97: 0x0008, + 0xd99: 0x0008, 0xd9a: 0x0008, 0xd9b: 0x0008, 0xd9c: 0x0008, 0xd9d: 0x0008, + 0xd9e: 0x0008, 0xd9f: 0x0008, 0xda0: 0x0008, 0xda1: 0x0008, 0xda2: 0x0008, 0xda3: 0x0008, + 0xda4: 0x0008, 0xda5: 0x0008, 0xda6: 0x0008, 0xda7: 0x0008, 0xda8: 0x0008, 0xda9: 0x0008, + 0xdaa: 0x0008, 0xdab: 0x0008, 0xdac: 0x0008, 0xdad: 0x0008, 0xdae: 0x0008, 0xdaf: 0x0008, + 0xdb0: 0x0008, 0xdb1: 0x0008, 0xdb2: 0x0008, 0xdb3: 0x0008, 0xdb4: 0x0008, 0xdb5: 0x0008, + 0xdb6: 0x0008, 0xdb7: 0x0008, 0xdb8: 0x0008, 0xdb9: 0x0008, 0xdba: 0x0008, 0xdbb: 0x0008, + 0xdbc: 0x0008, + // Block 0x37, offset 0xdc0 + 0xdc6: 0x0008, + // Block 0x38, offset 0xe00 + 0xe2d: 0x0008, 0xe2e: 0x0008, 0xe2f: 0x0008, + 0xe30: 0x0008, 0xe32: 0x0008, 0xe33: 0x0008, 0xe34: 0x0008, 0xe35: 0x0008, + 0xe36: 0x0008, 0xe37: 0x0008, 0xe39: 0x0008, 0xe3a: 0x0008, + 0xe3d: 0x0008, 0xe3e: 0x0008, + // Block 0x39, offset 0xe40 + 0xe58: 0x0008, 0xe59: 0x0008, + 0xe5e: 0x0008, 0xe5f: 0x0008, 0xe60: 0x0008, + 0xe71: 0x0008, 0xe72: 0x0008, 0xe73: 0x0008, 0xe74: 0x0008, + // Block 0x3a, offset 0xe80 + 0xe82: 0x0008, 0xe85: 0x0008, + 0xe86: 0x0008, + 0xe8d: 0x0008, + 0xe9d: 0x0008, + // Block 0x3b, offset 0xec0 + 0xec0: 0x0001, 0xec1: 0x0001, 0xec2: 0x0001, 0xec3: 0x0001, 0xec4: 0x0001, 0xec5: 0x0001, + 0xec6: 0x0001, 0xec7: 0x0001, 0xec8: 0x0001, 0xec9: 0x0001, 0xeca: 0x0001, 0xecb: 0x0001, + 0xecc: 0x0001, 0xecd: 0x0001, 0xece: 0x0001, 0xecf: 0x0001, 0xed0: 0x0001, 0xed1: 0x0001, + 0xed2: 0x0001, 0xed3: 0x0001, 0xed4: 0x0001, 0xed5: 0x0001, 0xed6: 0x0001, 0xed7: 0x0001, + 0xed8: 0x0001, 0xed9: 0x0001, 0xeda: 0x0001, 0xedb: 0x0001, 0xedc: 0x0001, 0xedd: 0x0001, + 0xede: 0x0001, 0xedf: 0x0001, 0xee0: 0x0001, 0xee1: 0x0001, 0xee2: 0x0001, 0xee3: 0x0001, + 0xee4: 0x0001, 0xee5: 0x0001, 0xee6: 0x0001, 0xee7: 0x0001, 0xee8: 0x0001, 0xee9: 0x0001, + 0xeea: 0x0001, 0xeeb: 0x0001, 0xeec: 0x0001, 0xeed: 0x0001, 0xeee: 0x0001, 0xeef: 0x0001, + 0xef0: 0x0001, 0xef1: 0x0001, 0xef2: 0x0001, 0xef3: 0x0001, 0xef4: 0x0001, 0xef5: 0x0001, + 0xef6: 0x0001, 0xef7: 0x0001, 0xef8: 0x0001, 0xef9: 0x0001, 0xefa: 0x0001, 0xefb: 0x0001, + 0xefc: 0x0001, 0xefd: 0x0001, 0xefe: 0x0001, 0xeff: 0x0001, + // Block 0x3c, offset 0xf00 + 0xf00: 0x0001, 0xf01: 0x0001, 0xf02: 0x0001, 0xf03: 0x0001, 0xf04: 0x0001, 0xf05: 0x0001, + 0xf06: 0x0001, 0xf07: 0x0001, 0xf08: 0x0001, 0xf09: 0x0001, 0xf0a: 0x0001, 0xf0b: 0x0001, + 0xf0c: 0x0001, 0xf0d: 0x0001, 0xf0e: 0x0001, 0xf0f: 0x0001, 0xf10: 0x0001, 0xf11: 0x0001, + 0xf12: 0x0001, 0xf13: 0x0001, 0xf14: 0x0001, 0xf15: 0x0001, 0xf16: 0x0001, 0xf17: 0x0001, + 0xf18: 0x0001, 0xf19: 0x0001, 0xf1a: 0x0001, 0xf1b: 0x0001, 0xf1c: 0x0001, 0xf1d: 0x0001, + 0xf1e: 0x0001, 0xf1f: 0x0001, + // Block 0x3d, offset 0xf40 + 0xf5d: 0x0008, + 0xf5e: 0x0008, 0xf5f: 0x0008, + // Block 0x3e, offset 0xf80 + 0xf92: 0x0008, 0xf93: 0x0008, 0xf94: 0x0008, + 0xfb2: 0x0008, 0xfb3: 0x0008, + // Block 0x3f, offset 0xfc0 + 0xfd2: 0x0008, 0xfd3: 0x0008, + 0xff2: 0x0008, 0xff3: 0x0008, + // Block 0x40, offset 0x1000 + 0x1034: 0x0008, 0x1035: 0x0008, + 0x1037: 0x0008, 0x1038: 0x0008, 0x1039: 0x0008, 0x103a: 0x0008, 0x103b: 0x0008, + 0x103c: 0x0008, 0x103d: 0x0008, + // Block 0x41, offset 0x1040 + 0x1046: 0x0008, 0x1049: 0x0008, 0x104a: 0x0008, 0x104b: 0x0008, + 0x104c: 0x0008, 0x104d: 0x0008, 0x104e: 0x0008, 0x104f: 0x0008, 0x1050: 0x0008, 0x1051: 0x0008, + 0x1052: 0x0008, 0x1053: 0x0008, + 0x105d: 0x0008, + // Block 0x42, offset 0x1080 + 0x108b: 0x0008, + 0x108c: 0x0008, 0x108d: 0x0008, 0x108e: 0x0008, 0x108f: 0x0008, + // Block 0x43, offset 0x10c0 + 0x10c5: 0x0008, + 0x10c6: 0x0008, + 0x10e9: 0x0008, + // Block 0x44, offset 0x1100 + 0x1120: 0x0008, 0x1121: 0x0008, 0x1122: 0x0008, + 0x1127: 0x0008, 0x1128: 0x0008, + 0x1132: 0x0008, + 0x1139: 0x0008, 0x113a: 0x0008, 0x113b: 0x0008, + // Block 0x45, offset 0x1140 + 0x1157: 0x0008, + 0x1158: 0x0008, 0x115b: 0x0008, + // Block 0x46, offset 0x1180 + 0x1196: 0x0008, + 0x1198: 0x0008, 0x1199: 0x0008, 0x119a: 0x0008, 0x119b: 0x0008, 0x119c: 0x0008, 0x119d: 0x0008, + 0x119e: 0x0008, 0x11a0: 0x0008, 0x11a2: 0x0008, + 0x11a5: 0x0008, 0x11a6: 0x0008, 0x11a7: 0x0008, 0x11a8: 0x0008, 0x11a9: 0x0008, + 0x11aa: 0x0008, 0x11ab: 0x0008, 0x11ac: 0x0008, + 0x11b3: 0x0008, 0x11b4: 0x0008, 0x11b5: 0x0008, + 0x11b6: 0x0008, 0x11b7: 0x0008, 0x11b8: 0x0008, 0x11b9: 0x0008, 0x11ba: 0x0008, 0x11bb: 0x0008, + 0x11bc: 0x0008, 0x11bf: 0x0008, + // Block 0x47, offset 0x11c0 + 0x11f0: 0x0008, 0x11f1: 0x0008, 0x11f2: 0x0008, 0x11f3: 0x0008, 0x11f4: 0x0008, 0x11f5: 0x0008, + 0x11f6: 0x0008, 0x11f7: 0x0008, 0x11f8: 0x0008, 0x11f9: 0x0008, 0x11fa: 0x0008, 0x11fb: 0x0008, + 0x11fc: 0x0008, 0x11fd: 0x0008, 0x11fe: 0x0008, 0x11ff: 0x0008, + // Block 0x48, offset 0x1200 + 0x1200: 0x0008, 0x1201: 0x0008, 0x1202: 0x0008, 0x1203: 0x0008, 0x1204: 0x0008, 0x1205: 0x0008, + 0x1206: 0x0008, 0x1207: 0x0008, 0x1208: 0x0008, 0x1209: 0x0008, 0x120a: 0x0008, 0x120b: 0x0008, + 0x120c: 0x0008, 0x120d: 0x0008, 0x120e: 0x0008, + // Block 0x49, offset 0x1240 + 0x1240: 0x0008, 0x1241: 0x0008, 0x1242: 0x0008, 0x1243: 0x0008, + 0x1274: 0x0008, + 0x1276: 0x0008, 0x1277: 0x0008, 0x1278: 0x0008, 0x1279: 0x0008, 0x127a: 0x0008, + 0x127c: 0x0008, + // Block 0x4a, offset 0x1280 + 0x1282: 0x0008, + 0x12ab: 0x0008, 0x12ac: 0x0008, 0x12ad: 0x0008, 0x12ae: 0x0008, 0x12af: 0x0008, + 0x12b0: 0x0008, 0x12b1: 0x0008, 0x12b2: 0x0008, 0x12b3: 0x0008, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0008, 0x12c1: 0x0008, + 0x12e2: 0x0008, 0x12e3: 0x0008, + 0x12e4: 0x0008, 0x12e5: 0x0008, 0x12e8: 0x0008, 0x12e9: 0x0008, + 0x12eb: 0x0008, 0x12ec: 0x0008, 0x12ed: 0x0008, + // Block 0x4c, offset 0x1300 + 0x1326: 0x0008, 0x1328: 0x0008, 0x1329: 0x0008, + 0x132d: 0x0008, 0x132f: 0x0008, + 0x1330: 0x0008, 0x1331: 0x0008, + // Block 0x4d, offset 0x1340 + 0x136c: 0x0008, 0x136d: 0x0008, 0x136e: 0x0008, 0x136f: 0x0008, + 0x1370: 0x0008, 0x1371: 0x0008, 0x1372: 0x0008, 0x1373: 0x0008, + 0x1376: 0x0008, 0x1377: 0x0008, + // Block 0x4e, offset 0x1380 + 0x1390: 0x0008, 0x1391: 0x0008, + 0x1392: 0x0008, 0x1394: 0x0008, 0x1395: 0x0008, 0x1396: 0x0008, 0x1397: 0x0008, + 0x1398: 0x0008, 0x1399: 0x0008, 0x139a: 0x0008, 0x139b: 0x0008, 0x139c: 0x0008, 0x139d: 0x0008, + 0x139e: 0x0008, 0x139f: 0x0008, 0x13a0: 0x0008, 0x13a2: 0x0008, 0x13a3: 0x0008, + 0x13a4: 0x0008, 0x13a5: 0x0008, 0x13a6: 0x0008, 0x13a7: 0x0008, 0x13a8: 0x0008, + 0x13ad: 0x0008, + 0x13b4: 0x0008, + 0x13b8: 0x0008, 0x13b9: 0x0008, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0008, 0x13c1: 0x0008, 0x13c2: 0x0008, 0x13c3: 0x0008, 0x13c4: 0x0008, 0x13c5: 0x0008, + 0x13c6: 0x0008, 0x13c7: 0x0008, 0x13c8: 0x0008, 0x13c9: 0x0008, 0x13ca: 0x0008, 0x13cb: 0x0008, + 0x13cc: 0x0008, 0x13cd: 0x0008, 0x13ce: 0x0008, 0x13cf: 0x0008, 0x13d0: 0x0008, 0x13d1: 0x0008, + 0x13d2: 0x0008, 0x13d3: 0x0008, 0x13d4: 0x0008, 0x13d5: 0x0008, 0x13d6: 0x0008, 0x13d7: 0x0008, + 0x13d8: 0x0008, 0x13d9: 0x0008, 0x13da: 0x0008, 0x13db: 0x0008, 0x13dc: 0x0008, 0x13dd: 0x0008, + 0x13de: 0x0008, 0x13df: 0x0008, 0x13e0: 0x0008, 0x13e1: 0x0008, 0x13e2: 0x0008, 0x13e3: 0x0008, + 0x13e4: 0x0008, 0x13e5: 0x0008, 0x13e6: 0x0008, 0x13e7: 0x0008, 0x13e8: 0x0008, 0x13e9: 0x0008, + 0x13ea: 0x0008, 0x13eb: 0x0008, 0x13ec: 0x0008, 0x13ed: 0x0008, 0x13ee: 0x0008, 0x13ef: 0x0008, + 0x13f0: 0x0008, 0x13f1: 0x0008, 0x13f2: 0x0008, 0x13f3: 0x0008, 0x13f4: 0x0008, 0x13f5: 0x0008, + 0x13f6: 0x0008, 0x13f7: 0x0008, 0x13f8: 0x0008, 0x13f9: 0x0008, 0x13fa: 0x0008, 0x13fb: 0x0008, + 0x13fc: 0x0008, 0x13fd: 0x0008, 0x13fe: 0x0008, 0x13ff: 0x0008, + // Block 0x50, offset 0x1400 + 0x140b: 0x0008, + 0x140c: 0x0008, 0x140d: 0x0008, 0x140e: 0x0008, 0x140f: 0x0008, 0x1410: 0x0002, + 0x1413: 0x0002, 0x1414: 0x0002, 0x1415: 0x0002, 0x1416: 0x0002, + 0x1418: 0x0002, 0x1419: 0x0002, 0x141c: 0x0002, 0x141d: 0x0002, + 0x1420: 0x0002, 0x1421: 0x0002, 0x1422: 0x0002, + 0x1424: 0x0002, 0x1425: 0x0002, 0x1426: 0x0002, 0x1427: 0x0002, 0x1428: 0x0008, 0x1429: 0x0008, + 0x142a: 0x0008, 0x142b: 0x0008, 0x142c: 0x0008, 0x142d: 0x0008, 0x142e: 0x0008, + 0x1430: 0x0002, 0x1432: 0x0002, 0x1433: 0x0002, 0x1435: 0x0002, + 0x143b: 0x0002, + 0x143c: 0x0004, 0x143e: 0x0002, + // Block 0x51, offset 0x1440 + 0x1449: 0x0004, + 0x1460: 0x0008, 0x1461: 0x0008, 0x1462: 0x0008, 0x1463: 0x0008, + 0x1464: 0x0008, 0x1466: 0x0008, 0x1467: 0x0008, 0x1468: 0x0008, 0x1469: 0x0008, + 0x146a: 0x0008, 0x146b: 0x0008, 0x146c: 0x0008, 0x146d: 0x0008, 0x146e: 0x0008, 0x146f: 0x0008, + 0x1474: 0x0002, + 0x147f: 0x0002, + // Block 0x52, offset 0x1480 + 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, + 0x14ac: 0x0002, + // Block 0x53, offset 0x14c0 + 0x14d0: 0x0008, 0x14d1: 0x0008, + 0x14d2: 0x0008, 0x14d3: 0x0008, 0x14d4: 0x0008, 0x14d5: 0x0008, 0x14d6: 0x0008, 0x14d7: 0x0008, + 0x14d8: 0x0008, 0x14d9: 0x0008, 0x14da: 0x0008, 0x14db: 0x0008, 0x14dc: 0x0008, 0x14dd: 0x0008, + 0x14de: 0x0008, 0x14df: 0x0008, 0x14e0: 0x0008, 0x14e1: 0x0008, 0x14e2: 0x0008, 0x14e3: 0x0008, + 0x14e4: 0x0008, 0x14e5: 0x0008, 0x14e6: 0x0008, 0x14e7: 0x0008, 0x14e8: 0x0008, 0x14e9: 0x0008, + 0x14ea: 0x0008, 0x14eb: 0x0008, 0x14ec: 0x0008, 0x14ed: 0x0008, 0x14ee: 0x0008, 0x14ef: 0x0008, + 0x14f0: 0x0008, + // Block 0x54, offset 0x1500 + 0x1503: 0x0002, 0x1505: 0x0002, + 0x1509: 0x0002, + 0x1513: 0x0002, 0x1516: 0x0002, + 0x1521: 0x0002, 0x1522: 0x0006, + 0x1526: 0x0002, + 0x152b: 0x0002, + 0x1539: 0x0004, + // Block 0x55, offset 0x1540 + 0x1553: 0x0002, 0x1554: 0x0002, + 0x155b: 0x0002, 0x155c: 0x0002, 0x155d: 0x0002, + 0x155e: 0x0002, 0x1560: 0x0002, 0x1561: 0x0002, 0x1562: 0x0002, 0x1563: 0x0002, + 0x1564: 0x0002, 0x1565: 0x0002, 0x1566: 0x0002, 0x1567: 0x0002, 0x1568: 0x0002, 0x1569: 0x0002, + 0x156a: 0x0002, 0x156b: 0x0002, + 0x1570: 0x0002, 0x1571: 0x0002, 0x1572: 0x0002, 0x1573: 0x0002, 0x1574: 0x0002, 0x1575: 0x0002, + 0x1576: 0x0002, 0x1577: 0x0002, 0x1578: 0x0002, 0x1579: 0x0002, + // Block 0x56, offset 0x1580 + 0x1589: 0x0002, + 0x1590: 0x0002, 0x1591: 0x0002, + 0x1592: 0x0002, 0x1593: 0x0002, 0x1594: 0x0006, 0x1595: 0x0006, 0x1596: 0x0006, 0x1597: 0x0006, + 0x1598: 0x0006, 0x1599: 0x0006, + 0x15a9: 0x0004, + 0x15aa: 0x0004, + 0x15b8: 0x0002, 0x15b9: 0x0002, + // Block 0x57, offset 0x15c0 + 0x15d2: 0x0002, 0x15d4: 0x0002, + 0x15e7: 0x0002, + // Block 0x58, offset 0x1600 + 0x1600: 0x0002, 0x1602: 0x0002, 0x1603: 0x0002, + 0x1607: 0x0002, 0x1608: 0x0002, 0x160b: 0x0002, + 0x160f: 0x0002, 0x1611: 0x0002, + 0x1615: 0x0002, + 0x161a: 0x0002, 0x161d: 0x0002, + 0x161e: 0x0002, 0x161f: 0x0002, 0x1620: 0x0002, 0x1623: 0x0002, + 0x1625: 0x0002, 0x1627: 0x0002, 0x1628: 0x0002, 0x1629: 0x0002, + 0x162a: 0x0002, 0x162b: 0x0002, 0x162c: 0x0002, 0x162e: 0x0002, + 0x1634: 0x0002, 0x1635: 0x0002, + 0x1636: 0x0002, 0x1637: 0x0002, + 0x163c: 0x0002, 0x163d: 0x0002, + // Block 0x59, offset 0x1640 + 0x1648: 0x0002, + 0x164c: 0x0002, + 0x1652: 0x0002, + 0x1660: 0x0002, 0x1661: 0x0002, + 0x1664: 0x0002, 0x1665: 0x0002, 0x1666: 0x0002, 0x1667: 0x0002, + 0x166a: 0x0002, 0x166b: 0x0002, 0x166e: 0x0002, 0x166f: 0x0002, + // Block 0x5a, offset 0x1680 + 0x1682: 0x0002, 0x1683: 0x0002, + 0x1686: 0x0002, 0x1687: 0x0002, + 0x1695: 0x0002, + 0x1699: 0x0002, + 0x16a5: 0x0002, + 0x16bf: 0x0002, + // Block 0x5b, offset 0x16c0 + 0x16d2: 0x0002, + 0x16da: 0x0005, 0x16db: 0x0005, + 0x16e8: 0x0004, 0x16e9: 0x0001, + 0x16ea: 0x0001, + // Block 0x5c, offset 0x1700 + 0x1708: 0x0004, + // Block 0x5d, offset 0x1740 + 0x174f: 0x0004, + 0x1769: 0x0005, + 0x176a: 0x0005, 0x176b: 0x0005, 0x176c: 0x0005, 0x176d: 0x0004, 0x176e: 0x0004, 0x176f: 0x0004, + 0x1770: 0x0005, 0x1771: 0x0004, 0x1772: 0x0004, 0x1773: 0x0005, + 0x1778: 0x0004, 0x1779: 0x0004, 0x177a: 0x0004, + // Block 0x5e, offset 0x1780 + 0x17a0: 0x0002, 0x17a1: 0x0002, 0x17a2: 0x0002, 0x17a3: 0x0002, + 0x17a4: 0x0002, 0x17a5: 0x0002, 0x17a6: 0x0002, 0x17a7: 0x0002, 0x17a8: 0x0002, 0x17a9: 0x0002, + 0x17aa: 0x0002, 0x17ab: 0x0002, 0x17ac: 0x0002, 0x17ad: 0x0002, 0x17ae: 0x0002, 0x17af: 0x0002, + 0x17b0: 0x0002, 0x17b1: 0x0002, 0x17b2: 0x0002, 0x17b3: 0x0002, 0x17b4: 0x0002, 0x17b5: 0x0002, + 0x17b6: 0x0002, 0x17b7: 0x0002, 0x17b8: 0x0002, 0x17b9: 0x0002, 0x17ba: 0x0002, 0x17bb: 0x0002, + 0x17bc: 0x0002, 0x17bd: 0x0002, 0x17be: 0x0002, 0x17bf: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x0002, 0x17c1: 0x0002, 0x17c2: 0x0002, 0x17c3: 0x0002, 0x17c4: 0x0002, 0x17c5: 0x0002, + 0x17c6: 0x0002, 0x17c7: 0x0002, 0x17c8: 0x0002, 0x17c9: 0x0002, 0x17ca: 0x0002, 0x17cb: 0x0002, + 0x17cc: 0x0002, 0x17cd: 0x0002, 0x17ce: 0x0002, 0x17cf: 0x0002, 0x17d0: 0x0002, 0x17d1: 0x0002, + 0x17d2: 0x0002, 0x17d3: 0x0002, 0x17d4: 0x0002, 0x17d5: 0x0002, 0x17d6: 0x0002, 0x17d7: 0x0002, + 0x17d8: 0x0002, 0x17d9: 0x0002, 0x17da: 0x0002, 0x17db: 0x0002, 0x17dc: 0x0002, 0x17dd: 0x0002, + 0x17de: 0x0002, 0x17df: 0x0002, 0x17e0: 0x0002, 0x17e1: 0x0002, 0x17e2: 0x0002, 0x17e3: 0x0002, + 0x17e4: 0x0002, 0x17e5: 0x0002, 0x17e6: 0x0002, 0x17e7: 0x0002, 0x17e8: 0x0002, 0x17e9: 0x0002, + 0x17ea: 0x0002, 0x17eb: 0x0002, 0x17ec: 0x0002, 0x17ed: 0x0002, 0x17ee: 0x0002, 0x17ef: 0x0002, + 0x17f0: 0x0002, 0x17f1: 0x0002, 0x17f2: 0x0002, 0x17f3: 0x0002, 0x17f4: 0x0002, 0x17f5: 0x0002, + 0x17f6: 0x0002, 0x17f7: 0x0002, 0x17f8: 0x0002, 0x17f9: 0x0002, 0x17fa: 0x0002, 0x17fb: 0x0002, + 0x17fc: 0x0002, 0x17fd: 0x0002, 0x17fe: 0x0002, 0x17ff: 0x0002, + // Block 0x60, offset 0x1800 + 0x1800: 0x0002, 0x1801: 0x0002, 0x1802: 0x0006, 0x1803: 0x0002, 0x1804: 0x0002, 0x1805: 0x0002, + 0x1806: 0x0002, 0x1807: 0x0002, 0x1808: 0x0002, 0x1809: 0x0002, 0x180a: 0x0002, 0x180b: 0x0002, + 0x180c: 0x0002, 0x180d: 0x0002, 0x180e: 0x0002, 0x180f: 0x0002, 0x1810: 0x0002, 0x1811: 0x0002, + 0x1812: 0x0002, 0x1813: 0x0002, 0x1814: 0x0002, 0x1815: 0x0002, 0x1816: 0x0002, 0x1817: 0x0002, + 0x1818: 0x0002, 0x1819: 0x0002, 0x181a: 0x0002, 0x181b: 0x0002, 0x181c: 0x0002, 0x181d: 0x0002, + 0x181e: 0x0002, 0x181f: 0x0002, 0x1820: 0x0002, 0x1821: 0x0002, 0x1822: 0x0002, 0x1823: 0x0002, + 0x1824: 0x0002, 0x1825: 0x0002, 0x1826: 0x0002, 0x1827: 0x0002, 0x1828: 0x0002, 0x1829: 0x0002, + 0x182b: 0x0002, 0x182c: 0x0002, 0x182d: 0x0002, 0x182e: 0x0002, 0x182f: 0x0002, + 0x1830: 0x0002, 0x1831: 0x0002, 0x1832: 0x0002, 0x1833: 0x0002, 0x1834: 0x0002, 0x1835: 0x0002, + 0x1836: 0x0002, 0x1837: 0x0002, 0x1838: 0x0002, 0x1839: 0x0002, 0x183a: 0x0002, 0x183b: 0x0002, + 0x183c: 0x0002, 0x183d: 0x0002, 0x183e: 0x0002, 0x183f: 0x0002, + // Block 0x61, offset 0x1840 + 0x1840: 0x0002, 0x1841: 0x0002, 0x1842: 0x0002, 0x1843: 0x0002, 0x1844: 0x0002, 0x1845: 0x0002, + 0x1846: 0x0002, 0x1847: 0x0002, 0x1848: 0x0002, 0x1849: 0x0002, 0x184a: 0x0002, 0x184b: 0x0002, + 0x1850: 0x0002, 0x1851: 0x0002, + 0x1852: 0x0002, 0x1853: 0x0002, 0x1854: 0x0002, 0x1855: 0x0002, 0x1856: 0x0002, 0x1857: 0x0002, + 0x1858: 0x0002, 0x1859: 0x0002, 0x185a: 0x0002, 0x185b: 0x0002, 0x185c: 0x0002, 0x185d: 0x0002, + 0x185e: 0x0002, 0x185f: 0x0002, 0x1860: 0x0002, 0x1861: 0x0002, 0x1862: 0x0002, 0x1863: 0x0002, + 0x1864: 0x0002, 0x1865: 0x0002, 0x1866: 0x0002, 0x1867: 0x0002, 0x1868: 0x0002, 0x1869: 0x0002, + 0x186a: 0x0002, 0x186b: 0x0002, 0x186c: 0x0002, 0x186d: 0x0002, 0x186e: 0x0002, 0x186f: 0x0002, + 0x1870: 0x0002, 0x1871: 0x0002, 0x1872: 0x0002, 0x1873: 0x0002, + // Block 0x62, offset 0x1880 + 0x1880: 0x0002, 0x1881: 0x0002, 0x1882: 0x0002, 0x1883: 0x0002, 0x1884: 0x0002, 0x1885: 0x0002, + 0x1886: 0x0002, 0x1887: 0x0002, 0x1888: 0x0002, 0x1889: 0x0002, 0x188a: 0x0002, 0x188b: 0x0002, + 0x188c: 0x0002, 0x188d: 0x0002, 0x188e: 0x0002, 0x188f: 0x0002, + 0x1892: 0x0002, 0x1893: 0x0002, 0x1894: 0x0002, 0x1895: 0x0002, + 0x18a0: 0x0002, 0x18a1: 0x0002, 0x18a3: 0x0002, + 0x18a4: 0x0002, 0x18a5: 0x0002, 0x18a6: 0x0002, 0x18a7: 0x0002, 0x18a8: 0x0002, 0x18a9: 0x0002, + 0x18aa: 0x0004, 0x18ab: 0x0004, + 0x18b2: 0x0002, 0x18b3: 0x0002, + 0x18b6: 0x0006, 0x18b7: 0x0002, + 0x18bc: 0x0002, 0x18bd: 0x0002, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0006, 0x18c1: 0x0002, + 0x18c6: 0x0002, 0x18c7: 0x0002, 0x18c8: 0x0002, 0x18cb: 0x0002, + 0x18ce: 0x0002, 0x18cf: 0x0002, 0x18d0: 0x0002, 0x18d1: 0x0002, + 0x18e2: 0x0002, 0x18e3: 0x0002, + 0x18e4: 0x0002, 0x18e5: 0x0002, + 0x18ef: 0x0002, + 0x18fb: 0x0004, + 0x18fc: 0x0004, 0x18fd: 0x0005, 0x18fe: 0x0005, + // Block 0x64, offset 0x1900 + 0x1900: 0x0004, 0x1901: 0x0004, 0x1902: 0x0004, 0x1903: 0x0004, 0x1904: 0x0004, 0x1905: 0x0006, + 0x1906: 0x0002, 0x1907: 0x0004, 0x1908: 0x0004, 0x1909: 0x0006, 0x190a: 0x0004, 0x190b: 0x0004, + 0x190c: 0x0004, 0x190d: 0x0004, 0x190e: 0x0006, 0x190f: 0x0006, 0x1910: 0x0004, 0x1911: 0x0004, + 0x1912: 0x0004, 0x1914: 0x0005, 0x1915: 0x0005, 0x1916: 0x0004, 0x1917: 0x0004, + 0x1918: 0x0004, 0x1919: 0x0004, 0x191a: 0x0004, 0x191b: 0x0004, 0x191c: 0x0006, 0x191d: 0x0004, + 0x191e: 0x0006, 0x191f: 0x0004, 0x1920: 0x0004, 0x1921: 0x0004, 0x1922: 0x0004, 0x1923: 0x0004, + 0x1924: 0x0004, 0x1925: 0x0004, 0x1926: 0x0004, 0x1927: 0x0004, 0x1928: 0x0004, 0x1929: 0x0004, + 0x192a: 0x0004, 0x192b: 0x0004, 0x192c: 0x0004, 0x192d: 0x0004, 0x192e: 0x0004, 0x192f: 0x0004, + 0x1930: 0x0004, 0x1931: 0x0004, 0x1932: 0x0004, 0x1933: 0x0004, 0x1934: 0x0004, 0x1935: 0x0004, + 0x1936: 0x0004, 0x1937: 0x0004, 0x1938: 0x0004, 0x1939: 0x0004, 0x193a: 0x0004, 0x193b: 0x0004, + 0x193c: 0x0004, 0x193d: 0x0004, 0x193e: 0x0004, 0x193f: 0x0004, + // Block 0x65, offset 0x1940 + 0x1940: 0x0006, 0x1941: 0x0004, 0x1942: 0x0006, 0x1943: 0x0004, 0x1944: 0x0004, 0x1945: 0x0004, + 0x1946: 0x0004, 0x1947: 0x0004, 0x1948: 0x0005, 0x1949: 0x0005, 0x194a: 0x0005, 0x194b: 0x0005, + 0x194c: 0x0005, 0x194d: 0x0005, 0x194e: 0x0005, 0x194f: 0x0005, 0x1950: 0x0005, 0x1951: 0x0005, + 0x1952: 0x0005, 0x1953: 0x0005, 0x1954: 0x0004, 0x1955: 0x0004, 0x1956: 0x0004, 0x1957: 0x0004, + 0x1958: 0x0004, 0x1959: 0x0004, 0x195a: 0x0004, 0x195b: 0x0004, 0x195c: 0x0004, 0x195d: 0x0004, + 0x195e: 0x0004, 0x195f: 0x0004, 0x1960: 0x0006, 0x1961: 0x0006, 0x1962: 0x0004, 0x1963: 0x0006, + 0x1964: 0x0006, 0x1965: 0x0006, 0x1966: 0x0004, 0x1967: 0x0006, 0x1968: 0x0006, 0x1969: 0x0006, + 0x196a: 0x0006, 0x196b: 0x0004, 0x196c: 0x0006, 0x196d: 0x0006, 0x196e: 0x0004, 0x196f: 0x0006, + 0x1970: 0x0004, 0x1971: 0x0004, 0x1972: 0x0004, 0x1973: 0x0004, 0x1974: 0x0004, 0x1975: 0x0004, + 0x1976: 0x0004, 0x1977: 0x0004, 0x1978: 0x0004, 0x1979: 0x0004, 0x197a: 0x0004, 0x197b: 0x0004, + 0x197c: 0x0004, 0x197d: 0x0004, 0x197e: 0x0004, 0x197f: 0x0005, + // Block 0x66, offset 0x1980 + 0x1980: 0x0004, 0x1981: 0x0004, 0x1982: 0x0004, 0x1983: 0x0004, 0x1984: 0x0004, 0x1985: 0x0004, + 0x1990: 0x0004, 0x1991: 0x0004, + 0x1992: 0x0004, 0x1993: 0x0005, 0x1994: 0x0004, 0x1995: 0x0004, 0x1996: 0x0004, 0x1997: 0x0004, + 0x1998: 0x0004, 0x1999: 0x0004, 0x199a: 0x0004, 0x199b: 0x0004, 0x199c: 0x0004, 0x199d: 0x0004, + 0x199e: 0x0006, 0x199f: 0x0006, 0x19a0: 0x0004, 0x19a1: 0x0005, 0x19a2: 0x0004, 0x19a3: 0x0004, + 0x19a4: 0x0004, 0x19a5: 0x0004, 0x19a6: 0x0004, 0x19a7: 0x0004, 0x19a8: 0x0004, 0x19a9: 0x0004, + 0x19aa: 0x0005, 0x19ab: 0x0005, 0x19ac: 0x0004, 0x19ad: 0x0004, 0x19ae: 0x0004, 0x19af: 0x0004, + 0x19b0: 0x0004, 0x19b1: 0x0004, 0x19b2: 0x0004, 0x19b3: 0x0004, 0x19b4: 0x0004, 0x19b5: 0x0004, + 0x19b6: 0x0004, 0x19b7: 0x0004, 0x19b8: 0x0004, 0x19b9: 0x0004, 0x19ba: 0x0004, 0x19bb: 0x0004, + 0x19bc: 0x0004, 0x19bd: 0x0005, 0x19be: 0x0005, 0x19bf: 0x0006, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0004, 0x19c1: 0x0004, 0x19c2: 0x0004, 0x19c3: 0x0004, 0x19c4: 0x0005, 0x19c5: 0x0005, + 0x19c6: 0x0006, 0x19c7: 0x0006, 0x19c8: 0x0006, 0x19c9: 0x0006, 0x19ca: 0x0006, 0x19cb: 0x0006, + 0x19cc: 0x0006, 0x19cd: 0x0006, 0x19ce: 0x0005, 0x19cf: 0x0006, 0x19d0: 0x0006, 0x19d1: 0x0006, + 0x19d2: 0x0006, 0x19d3: 0x0006, 0x19d4: 0x0005, 0x19d5: 0x0006, 0x19d6: 0x0006, 0x19d7: 0x0006, + 0x19d8: 0x0006, 0x19d9: 0x0006, 0x19da: 0x0006, 0x19db: 0x0006, 0x19dc: 0x0006, 0x19dd: 0x0006, + 0x19de: 0x0006, 0x19df: 0x0006, 0x19e0: 0x0006, 0x19e1: 0x0006, 0x19e2: 0x0004, 0x19e3: 0x0006, + 0x19e4: 0x0004, 0x19e5: 0x0004, 0x19e6: 0x0004, 0x19e7: 0x0004, 0x19e8: 0x0006, 0x19e9: 0x0006, + 0x19ea: 0x0005, 0x19eb: 0x0006, 0x19ec: 0x0006, 0x19ed: 0x0006, 0x19ee: 0x0006, 0x19ef: 0x0006, + 0x19f0: 0x0006, 0x19f1: 0x0006, 0x19f2: 0x0005, 0x19f3: 0x0005, 0x19f4: 0x0006, 0x19f5: 0x0005, + 0x19f6: 0x0006, 0x19f7: 0x0006, 0x19f8: 0x0006, 0x19f9: 0x0006, 0x19fa: 0x0005, 0x19fb: 0x0006, + 0x19fc: 0x0006, 0x19fd: 0x0005, 0x19fe: 0x0006, 0x19ff: 0x0006, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x0004, 0x1a01: 0x0004, 0x1a02: 0x0004, 0x1a03: 0x0004, 0x1a04: 0x0004, 0x1a05: 0x0005, + 0x1a08: 0x0004, 0x1a09: 0x0004, 0x1a0a: 0x0005, 0x1a0b: 0x0005, + 0x1a0c: 0x0004, 0x1a0d: 0x0004, 0x1a0e: 0x0004, 0x1a0f: 0x0004, 0x1a10: 0x0004, 0x1a11: 0x0004, + 0x1a12: 0x0004, 0x1a14: 0x0004, 0x1a16: 0x0004, + 0x1a1d: 0x0004, + 0x1a21: 0x0004, + 0x1a28: 0x0005, + 0x1a33: 0x0004, 0x1a34: 0x0004, + 0x1a3d: 0x0002, + // Block 0x69, offset 0x1a40 + 0x1a44: 0x0004, + 0x1a47: 0x0004, + 0x1a4c: 0x0005, 0x1a4e: 0x0005, + 0x1a53: 0x0005, 0x1a54: 0x0005, 0x1a55: 0x0005, 0x1a57: 0x0005, + 0x1a63: 0x0004, + 0x1a64: 0x0004, 0x1a65: 0x0004, 0x1a66: 0x0004, 0x1a67: 0x0004, + 0x1a76: 0x0002, 0x1a77: 0x0002, 0x1a78: 0x0002, 0x1a79: 0x0002, 0x1a7a: 0x0002, 0x1a7b: 0x0002, + 0x1a7c: 0x0002, 0x1a7d: 0x0002, 0x1a7e: 0x0002, 0x1a7f: 0x0002, + // Block 0x6a, offset 0x1a80 + 0x1a95: 0x0005, 0x1a96: 0x0005, 0x1a97: 0x0005, + 0x1aa1: 0x0004, + 0x1ab0: 0x0005, + 0x1abf: 0x0005, + // Block 0x6b, offset 0x1ac0 + 0x1af4: 0x0004, 0x1af5: 0x0004, + // Block 0x6c, offset 0x1b00 + 0x1b05: 0x0004, + 0x1b06: 0x0004, 0x1b07: 0x0004, + 0x1b1b: 0x0005, 0x1b1c: 0x0005, + // Block 0x6d, offset 0x1b40 + 0x1b50: 0x0005, + 0x1b55: 0x0005, 0x1b56: 0x0002, 0x1b57: 0x0002, + 0x1b58: 0x0002, 0x1b59: 0x0002, + // Block 0x6e, offset 0x1b80 + 0x1baf: 0x0008, + 0x1bb0: 0x0008, 0x1bb1: 0x0008, + // Block 0x6f, offset 0x1bc0 + 0x1bff: 0x0008, + // Block 0x70, offset 0x1c00 + 0x1c20: 0x0008, 0x1c21: 0x0008, 0x1c22: 0x0008, 0x1c23: 0x0008, + 0x1c24: 0x0008, 0x1c25: 0x0008, 0x1c26: 0x0008, 0x1c27: 0x0008, 0x1c28: 0x0008, 0x1c29: 0x0008, + 0x1c2a: 0x0008, 0x1c2b: 0x0008, 0x1c2c: 0x0008, 0x1c2d: 0x0008, 0x1c2e: 0x0008, 0x1c2f: 0x0008, + 0x1c30: 0x0008, 0x1c31: 0x0008, 0x1c32: 0x0008, 0x1c33: 0x0008, 0x1c34: 0x0008, 0x1c35: 0x0008, + 0x1c36: 0x0008, 0x1c37: 0x0008, 0x1c38: 0x0008, 0x1c39: 0x0008, 0x1c3a: 0x0008, 0x1c3b: 0x0008, + 0x1c3c: 0x0008, 0x1c3d: 0x0008, 0x1c3e: 0x0008, 0x1c3f: 0x0008, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0001, 0x1c41: 0x0001, 0x1c42: 0x0001, 0x1c43: 0x0001, 0x1c44: 0x0001, 0x1c45: 0x0001, + 0x1c46: 0x0001, 0x1c47: 0x0001, 0x1c48: 0x0001, 0x1c49: 0x0001, 0x1c4a: 0x0001, 0x1c4b: 0x0001, + 0x1c4c: 0x0001, 0x1c4d: 0x0001, 0x1c4e: 0x0001, 0x1c4f: 0x0001, 0x1c50: 0x0001, 0x1c51: 0x0001, + 0x1c52: 0x0001, 0x1c53: 0x0001, 0x1c54: 0x0001, 0x1c55: 0x0001, 0x1c56: 0x0001, 0x1c57: 0x0001, + 0x1c58: 0x0001, 0x1c59: 0x0001, 0x1c5b: 0x0001, 0x1c5c: 0x0001, 0x1c5d: 0x0001, + 0x1c5e: 0x0001, 0x1c5f: 0x0001, 0x1c60: 0x0001, 0x1c61: 0x0001, 0x1c62: 0x0001, 0x1c63: 0x0001, + 0x1c64: 0x0001, 0x1c65: 0x0001, 0x1c66: 0x0001, 0x1c67: 0x0001, 0x1c68: 0x0001, 0x1c69: 0x0001, + 0x1c6a: 0x0001, 0x1c6b: 0x0001, 0x1c6c: 0x0001, 0x1c6d: 0x0001, 0x1c6e: 0x0001, 0x1c6f: 0x0001, + 0x1c70: 0x0001, 0x1c71: 0x0001, 0x1c72: 0x0001, 0x1c73: 0x0001, 0x1c74: 0x0001, 0x1c75: 0x0001, + 0x1c76: 0x0001, 0x1c77: 0x0001, 0x1c78: 0x0001, 0x1c79: 0x0001, 0x1c7a: 0x0001, 0x1c7b: 0x0001, + 0x1c7c: 0x0001, 0x1c7d: 0x0001, 0x1c7e: 0x0001, 0x1c7f: 0x0001, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0001, 0x1c81: 0x0001, 0x1c82: 0x0001, 0x1c83: 0x0001, 0x1c84: 0x0001, 0x1c85: 0x0001, + 0x1c86: 0x0001, 0x1c87: 0x0001, 0x1c88: 0x0001, 0x1c89: 0x0001, 0x1c8a: 0x0001, 0x1c8b: 0x0001, + 0x1c8c: 0x0001, 0x1c8d: 0x0001, 0x1c8e: 0x0001, 0x1c8f: 0x0001, 0x1c90: 0x0001, 0x1c91: 0x0001, + 0x1c92: 0x0001, 0x1c93: 0x0001, 0x1c94: 0x0001, 0x1c95: 0x0001, 0x1c96: 0x0001, 0x1c97: 0x0001, + 0x1c98: 0x0001, 0x1c99: 0x0001, 0x1c9a: 0x0001, 0x1c9b: 0x0001, 0x1c9c: 0x0001, 0x1c9d: 0x0001, + 0x1c9e: 0x0001, 0x1c9f: 0x0001, 0x1ca0: 0x0001, 0x1ca1: 0x0001, 0x1ca2: 0x0001, 0x1ca3: 0x0001, + 0x1ca4: 0x0001, 0x1ca5: 0x0001, 0x1ca6: 0x0001, 0x1ca7: 0x0001, 0x1ca8: 0x0001, 0x1ca9: 0x0001, + 0x1caa: 0x0001, 0x1cab: 0x0001, 0x1cac: 0x0001, 0x1cad: 0x0001, 0x1cae: 0x0001, 0x1caf: 0x0001, + 0x1cb0: 0x0001, 0x1cb1: 0x0001, 0x1cb2: 0x0001, 0x1cb3: 0x0001, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0001, 0x1cc1: 0x0001, 0x1cc2: 0x0001, 0x1cc3: 0x0001, 0x1cc4: 0x0001, 0x1cc5: 0x0001, + 0x1cc6: 0x0001, 0x1cc7: 0x0001, 0x1cc8: 0x0001, 0x1cc9: 0x0001, 0x1cca: 0x0001, 0x1ccb: 0x0001, + 0x1ccc: 0x0001, 0x1ccd: 0x0001, 0x1cce: 0x0001, 0x1ccf: 0x0001, 0x1cd0: 0x0001, 0x1cd1: 0x0001, + 0x1cd2: 0x0001, 0x1cd3: 0x0001, 0x1cd4: 0x0001, 0x1cd5: 0x0001, + 0x1cf0: 0x0001, 0x1cf1: 0x0001, 0x1cf2: 0x0001, 0x1cf3: 0x0001, 0x1cf4: 0x0001, 0x1cf5: 0x0001, + 0x1cf6: 0x0001, 0x1cf7: 0x0001, 0x1cf8: 0x0001, 0x1cf9: 0x0001, 0x1cfa: 0x0001, 0x1cfb: 0x0001, + 0x1cfc: 0x0001, 0x1cfd: 0x0001, 0x1cfe: 0x0001, 0x1cff: 0x0001, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0001, 0x1d01: 0x0001, 0x1d02: 0x0001, 0x1d03: 0x0001, 0x1d04: 0x0001, 0x1d05: 0x0001, + 0x1d06: 0x0001, 0x1d07: 0x0001, 0x1d08: 0x0001, 0x1d09: 0x0001, 0x1d0a: 0x0001, 0x1d0b: 0x0001, + 0x1d0c: 0x0001, 0x1d0d: 0x0001, 0x1d0e: 0x0001, 0x1d0f: 0x0001, 0x1d10: 0x0001, 0x1d11: 0x0001, + 0x1d12: 0x0001, 0x1d13: 0x0001, 0x1d14: 0x0001, 0x1d15: 0x0001, 0x1d16: 0x0001, 0x1d17: 0x0001, + 0x1d18: 0x0001, 0x1d19: 0x0001, 0x1d1a: 0x0001, 0x1d1b: 0x0001, 0x1d1c: 0x0001, 0x1d1d: 0x0001, + 0x1d1e: 0x0001, 0x1d1f: 0x0001, 0x1d20: 0x0001, 0x1d21: 0x0001, 0x1d22: 0x0001, 0x1d23: 0x0001, + 0x1d24: 0x0001, 0x1d25: 0x0001, 0x1d26: 0x0001, 0x1d27: 0x0001, 0x1d28: 0x0001, 0x1d29: 0x0001, + 0x1d2a: 0x0009, 0x1d2b: 0x0009, 0x1d2c: 0x0009, 0x1d2d: 0x0009, 0x1d2e: 0x0001, 0x1d2f: 0x0001, + 0x1d30: 0x0005, 0x1d31: 0x0001, 0x1d32: 0x0001, 0x1d33: 0x0001, 0x1d34: 0x0001, 0x1d35: 0x0001, + 0x1d36: 0x0001, 0x1d37: 0x0001, 0x1d38: 0x0001, 0x1d39: 0x0001, 0x1d3a: 0x0001, 0x1d3b: 0x0001, + 0x1d3c: 0x0001, 0x1d3d: 0x0005, 0x1d3e: 0x0001, + // Block 0x75, offset 0x1d40 + 0x1d41: 0x0001, 0x1d42: 0x0001, 0x1d43: 0x0001, 0x1d44: 0x0001, 0x1d45: 0x0001, + 0x1d46: 0x0001, 0x1d47: 0x0001, 0x1d48: 0x0001, 0x1d49: 0x0001, 0x1d4a: 0x0001, 0x1d4b: 0x0001, + 0x1d4c: 0x0001, 0x1d4d: 0x0001, 0x1d4e: 0x0001, 0x1d4f: 0x0001, 0x1d50: 0x0001, 0x1d51: 0x0001, + 0x1d52: 0x0001, 0x1d53: 0x0001, 0x1d54: 0x0001, 0x1d55: 0x0001, 0x1d56: 0x0001, 0x1d57: 0x0001, + 0x1d58: 0x0001, 0x1d59: 0x0001, 0x1d5a: 0x0001, 0x1d5b: 0x0001, 0x1d5c: 0x0001, 0x1d5d: 0x0001, + 0x1d5e: 0x0001, 0x1d5f: 0x0001, 0x1d60: 0x0001, 0x1d61: 0x0001, 0x1d62: 0x0001, 0x1d63: 0x0001, + 0x1d64: 0x0001, 0x1d65: 0x0001, 0x1d66: 0x0001, 0x1d67: 0x0001, 0x1d68: 0x0001, 0x1d69: 0x0001, + 0x1d6a: 0x0001, 0x1d6b: 0x0001, 0x1d6c: 0x0001, 0x1d6d: 0x0001, 0x1d6e: 0x0001, 0x1d6f: 0x0001, + 0x1d70: 0x0001, 0x1d71: 0x0001, 0x1d72: 0x0001, 0x1d73: 0x0001, 0x1d74: 0x0001, 0x1d75: 0x0001, + 0x1d76: 0x0001, 0x1d77: 0x0001, 0x1d78: 0x0001, 0x1d79: 0x0001, 0x1d7a: 0x0001, 0x1d7b: 0x0001, + 0x1d7c: 0x0001, 0x1d7d: 0x0001, 0x1d7e: 0x0001, 0x1d7f: 0x0001, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x0001, 0x1d81: 0x0001, 0x1d82: 0x0001, 0x1d83: 0x0001, 0x1d84: 0x0001, 0x1d85: 0x0001, + 0x1d86: 0x0001, 0x1d87: 0x0001, 0x1d88: 0x0001, 0x1d89: 0x0001, 0x1d8a: 0x0001, 0x1d8b: 0x0001, + 0x1d8c: 0x0001, 0x1d8d: 0x0001, 0x1d8e: 0x0001, 0x1d8f: 0x0001, 0x1d90: 0x0001, 0x1d91: 0x0001, + 0x1d92: 0x0001, 0x1d93: 0x0001, 0x1d94: 0x0001, 0x1d95: 0x0001, 0x1d96: 0x0001, + 0x1d99: 0x0009, 0x1d9a: 0x0009, 0x1d9b: 0x0001, 0x1d9c: 0x0001, 0x1d9d: 0x0001, + 0x1d9e: 0x0001, 0x1d9f: 0x0001, 0x1da0: 0x0001, 0x1da1: 0x0001, 0x1da2: 0x0001, 0x1da3: 0x0001, + 0x1da4: 0x0001, 0x1da5: 0x0001, 0x1da6: 0x0001, 0x1da7: 0x0001, 0x1da8: 0x0001, 0x1da9: 0x0001, + 0x1daa: 0x0001, 0x1dab: 0x0001, 0x1dac: 0x0001, 0x1dad: 0x0001, 0x1dae: 0x0001, 0x1daf: 0x0001, + 0x1db0: 0x0001, 0x1db1: 0x0001, 0x1db2: 0x0001, 0x1db3: 0x0001, 0x1db4: 0x0001, 0x1db5: 0x0001, + 0x1db6: 0x0001, 0x1db7: 0x0001, 0x1db8: 0x0001, 0x1db9: 0x0001, 0x1dba: 0x0001, 0x1dbb: 0x0001, + 0x1dbc: 0x0001, 0x1dbd: 0x0001, 0x1dbe: 0x0001, 0x1dbf: 0x0001, + // Block 0x77, offset 0x1dc0 + 0x1dc5: 0x0001, + 0x1dc6: 0x0001, 0x1dc7: 0x0001, 0x1dc8: 0x0001, 0x1dc9: 0x0001, 0x1dca: 0x0001, 0x1dcb: 0x0001, + 0x1dcc: 0x0001, 0x1dcd: 0x0001, 0x1dce: 0x0001, 0x1dcf: 0x0001, 0x1dd0: 0x0001, 0x1dd1: 0x0001, + 0x1dd2: 0x0001, 0x1dd3: 0x0001, 0x1dd4: 0x0001, 0x1dd5: 0x0001, 0x1dd6: 0x0001, 0x1dd7: 0x0001, + 0x1dd8: 0x0001, 0x1dd9: 0x0001, 0x1dda: 0x0001, 0x1ddb: 0x0001, 0x1ddc: 0x0001, 0x1ddd: 0x0001, + 0x1dde: 0x0001, 0x1ddf: 0x0001, 0x1de0: 0x0001, 0x1de1: 0x0001, 0x1de2: 0x0001, 0x1de3: 0x0001, + 0x1de4: 0x0001, 0x1de5: 0x0001, 0x1de6: 0x0001, 0x1de7: 0x0001, 0x1de8: 0x0001, 0x1de9: 0x0001, + 0x1dea: 0x0001, 0x1deb: 0x0001, 0x1dec: 0x0001, 0x1ded: 0x0001, 0x1dee: 0x0001, 0x1def: 0x0001, + 0x1df1: 0x0001, 0x1df2: 0x0001, 0x1df3: 0x0001, 0x1df4: 0x0001, 0x1df5: 0x0001, + 0x1df6: 0x0001, 0x1df7: 0x0001, 0x1df8: 0x0001, 0x1df9: 0x0001, 0x1dfa: 0x0001, 0x1dfb: 0x0001, + 0x1dfc: 0x0001, 0x1dfd: 0x0001, 0x1dfe: 0x0001, 0x1dff: 0x0001, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x0001, 0x1e01: 0x0001, 0x1e02: 0x0001, 0x1e03: 0x0001, 0x1e04: 0x0001, 0x1e05: 0x0001, + 0x1e06: 0x0001, 0x1e07: 0x0001, 0x1e08: 0x0001, 0x1e09: 0x0001, 0x1e0a: 0x0001, 0x1e0b: 0x0001, + 0x1e0c: 0x0001, 0x1e0d: 0x0001, 0x1e0e: 0x0001, 0x1e10: 0x0001, 0x1e11: 0x0001, + 0x1e12: 0x0001, 0x1e13: 0x0001, 0x1e14: 0x0001, 0x1e15: 0x0001, 0x1e16: 0x0001, 0x1e17: 0x0001, + 0x1e18: 0x0001, 0x1e19: 0x0001, 0x1e1a: 0x0001, 0x1e1b: 0x0001, 0x1e1c: 0x0001, 0x1e1d: 0x0001, + 0x1e1e: 0x0001, 0x1e1f: 0x0001, 0x1e20: 0x0001, 0x1e21: 0x0001, 0x1e22: 0x0001, 0x1e23: 0x0001, + 0x1e24: 0x0001, 0x1e25: 0x0001, 0x1e26: 0x0001, 0x1e27: 0x0001, 0x1e28: 0x0001, 0x1e29: 0x0001, + 0x1e2a: 0x0001, 0x1e2b: 0x0001, 0x1e2c: 0x0001, 0x1e2d: 0x0001, 0x1e2e: 0x0001, 0x1e2f: 0x0001, + 0x1e30: 0x0001, 0x1e31: 0x0001, 0x1e32: 0x0001, 0x1e33: 0x0001, 0x1e34: 0x0001, 0x1e35: 0x0001, + 0x1e36: 0x0001, 0x1e37: 0x0001, 0x1e38: 0x0001, 0x1e39: 0x0001, 0x1e3a: 0x0001, 0x1e3b: 0x0001, + 0x1e3c: 0x0001, 0x1e3d: 0x0001, 0x1e3e: 0x0001, 0x1e3f: 0x0001, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x0001, 0x1e41: 0x0001, 0x1e42: 0x0001, 0x1e43: 0x0001, 0x1e44: 0x0001, 0x1e45: 0x0001, + 0x1e46: 0x0001, 0x1e47: 0x0001, 0x1e48: 0x0001, 0x1e49: 0x0001, 0x1e4a: 0x0001, 0x1e4b: 0x0001, + 0x1e4c: 0x0001, 0x1e4d: 0x0001, 0x1e4e: 0x0001, 0x1e4f: 0x0001, 0x1e50: 0x0001, 0x1e51: 0x0001, + 0x1e52: 0x0001, 0x1e53: 0x0001, 0x1e54: 0x0001, 0x1e55: 0x0001, 0x1e56: 0x0001, 0x1e57: 0x0001, + 0x1e58: 0x0001, 0x1e59: 0x0001, 0x1e5a: 0x0001, 0x1e5b: 0x0001, 0x1e5c: 0x0001, 0x1e5d: 0x0001, + 0x1e5e: 0x0001, 0x1e5f: 0x0001, 0x1e60: 0x0001, 0x1e61: 0x0001, 0x1e62: 0x0001, 0x1e63: 0x0001, + 0x1e6f: 0x0001, + 0x1e70: 0x0001, 0x1e71: 0x0001, 0x1e72: 0x0001, 0x1e73: 0x0001, 0x1e74: 0x0001, 0x1e75: 0x0001, + 0x1e76: 0x0001, 0x1e77: 0x0001, 0x1e78: 0x0001, 0x1e79: 0x0001, 0x1e7a: 0x0001, 0x1e7b: 0x0001, + 0x1e7c: 0x0001, 0x1e7d: 0x0001, 0x1e7e: 0x0001, 0x1e7f: 0x0001, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x0001, 0x1e81: 0x0001, 0x1e82: 0x0001, 0x1e83: 0x0001, 0x1e84: 0x0001, 0x1e85: 0x0001, + 0x1e86: 0x0001, 0x1e87: 0x0001, 0x1e88: 0x0001, 0x1e89: 0x0001, 0x1e8a: 0x0001, 0x1e8b: 0x0001, + 0x1e8c: 0x0001, 0x1e8d: 0x0001, 0x1e8e: 0x0001, 0x1e8f: 0x0001, 0x1e90: 0x0001, 0x1e91: 0x0001, + 0x1e92: 0x0001, 0x1e93: 0x0001, 0x1e94: 0x0001, 0x1e95: 0x0001, 0x1e96: 0x0001, 0x1e97: 0x0001, + 0x1e98: 0x0001, 0x1e99: 0x0001, 0x1e9a: 0x0001, 0x1e9b: 0x0001, 0x1e9c: 0x0001, 0x1e9d: 0x0001, + 0x1e9e: 0x0001, 0x1ea0: 0x0001, 0x1ea1: 0x0001, 0x1ea2: 0x0001, 0x1ea3: 0x0001, + 0x1ea4: 0x0001, 0x1ea5: 0x0001, 0x1ea6: 0x0001, 0x1ea7: 0x0001, 0x1ea8: 0x0001, 0x1ea9: 0x0001, + 0x1eaa: 0x0001, 0x1eab: 0x0001, 0x1eac: 0x0001, 0x1ead: 0x0001, 0x1eae: 0x0001, 0x1eaf: 0x0001, + 0x1eb0: 0x0001, 0x1eb1: 0x0001, 0x1eb2: 0x0001, 0x1eb3: 0x0001, 0x1eb4: 0x0001, 0x1eb5: 0x0001, + 0x1eb6: 0x0001, 0x1eb7: 0x0001, 0x1eb8: 0x0001, 0x1eb9: 0x0001, 0x1eba: 0x0001, 0x1ebb: 0x0001, + 0x1ebc: 0x0001, 0x1ebd: 0x0001, 0x1ebe: 0x0001, 0x1ebf: 0x0001, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x0001, 0x1ec1: 0x0001, 0x1ec2: 0x0001, 0x1ec3: 0x0001, 0x1ec4: 0x0001, 0x1ec5: 0x0001, + 0x1ec6: 0x0001, 0x1ec7: 0x0001, 0x1ec8: 0x0002, 0x1ec9: 0x0002, 0x1eca: 0x0002, 0x1ecb: 0x0002, + 0x1ecc: 0x0002, 0x1ecd: 0x0002, 0x1ece: 0x0002, 0x1ecf: 0x0002, 0x1ed0: 0x0001, 0x1ed1: 0x0001, + 0x1ed2: 0x0001, 0x1ed3: 0x0001, 0x1ed4: 0x0001, 0x1ed5: 0x0001, 0x1ed6: 0x0001, 0x1ed7: 0x0001, + 0x1ed8: 0x0001, 0x1ed9: 0x0001, 0x1eda: 0x0001, 0x1edb: 0x0001, 0x1edc: 0x0001, 0x1edd: 0x0001, + 0x1ede: 0x0001, 0x1edf: 0x0001, 0x1ee0: 0x0001, 0x1ee1: 0x0001, 0x1ee2: 0x0001, 0x1ee3: 0x0001, + 0x1ee4: 0x0001, 0x1ee5: 0x0001, 0x1ee6: 0x0001, 0x1ee7: 0x0001, 0x1ee8: 0x0001, 0x1ee9: 0x0001, + 0x1eea: 0x0001, 0x1eeb: 0x0001, 0x1eec: 0x0001, 0x1eed: 0x0001, 0x1eee: 0x0001, 0x1eef: 0x0001, + 0x1ef0: 0x0001, 0x1ef1: 0x0001, 0x1ef2: 0x0001, 0x1ef3: 0x0001, 0x1ef4: 0x0001, 0x1ef5: 0x0001, + 0x1ef6: 0x0001, 0x1ef7: 0x0001, 0x1ef8: 0x0001, 0x1ef9: 0x0001, 0x1efa: 0x0001, 0x1efb: 0x0001, + 0x1efc: 0x0001, 0x1efd: 0x0001, 0x1efe: 0x0001, 0x1eff: 0x0001, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x0001, 0x1f01: 0x0001, 0x1f02: 0x0001, 0x1f03: 0x0001, 0x1f04: 0x0001, 0x1f05: 0x0001, + 0x1f06: 0x0001, 0x1f07: 0x0001, 0x1f08: 0x0001, 0x1f09: 0x0001, 0x1f0a: 0x0001, 0x1f0b: 0x0001, + 0x1f0c: 0x0001, 0x1f0d: 0x0001, 0x1f0e: 0x0001, 0x1f0f: 0x0001, 0x1f10: 0x0001, 0x1f11: 0x0001, + 0x1f12: 0x0001, 0x1f13: 0x0001, 0x1f14: 0x0001, 0x1f15: 0x0001, 0x1f16: 0x0001, 0x1f17: 0x0005, + 0x1f18: 0x0001, 0x1f19: 0x0005, 0x1f1a: 0x0001, 0x1f1b: 0x0001, 0x1f1c: 0x0001, 0x1f1d: 0x0001, + 0x1f1e: 0x0001, 0x1f1f: 0x0001, 0x1f20: 0x0001, 0x1f21: 0x0001, 0x1f22: 0x0001, 0x1f23: 0x0001, + 0x1f24: 0x0001, 0x1f25: 0x0001, 0x1f26: 0x0001, 0x1f27: 0x0001, 0x1f28: 0x0001, 0x1f29: 0x0001, + 0x1f2a: 0x0001, 0x1f2b: 0x0001, 0x1f2c: 0x0001, 0x1f2d: 0x0001, 0x1f2e: 0x0001, 0x1f2f: 0x0001, + 0x1f30: 0x0001, 0x1f31: 0x0001, 0x1f32: 0x0001, 0x1f33: 0x0001, 0x1f34: 0x0001, 0x1f35: 0x0001, + 0x1f36: 0x0001, 0x1f37: 0x0001, 0x1f38: 0x0001, 0x1f39: 0x0001, 0x1f3a: 0x0001, 0x1f3b: 0x0001, + 0x1f3c: 0x0001, 0x1f3d: 0x0001, 0x1f3e: 0x0001, 0x1f3f: 0x0001, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x0001, 0x1f41: 0x0001, 0x1f42: 0x0001, 0x1f43: 0x0001, 0x1f44: 0x0001, 0x1f45: 0x0001, + 0x1f46: 0x0001, 0x1f47: 0x0001, 0x1f48: 0x0001, 0x1f49: 0x0001, 0x1f4a: 0x0001, 0x1f4b: 0x0001, + 0x1f4c: 0x0001, 0x1f50: 0x0001, 0x1f51: 0x0001, + 0x1f52: 0x0001, 0x1f53: 0x0001, 0x1f54: 0x0001, 0x1f55: 0x0001, 0x1f56: 0x0001, 0x1f57: 0x0001, + 0x1f58: 0x0001, 0x1f59: 0x0001, 0x1f5a: 0x0001, 0x1f5b: 0x0001, 0x1f5c: 0x0001, 0x1f5d: 0x0001, + 0x1f5e: 0x0001, 0x1f5f: 0x0001, 0x1f60: 0x0001, 0x1f61: 0x0001, 0x1f62: 0x0001, 0x1f63: 0x0001, + 0x1f64: 0x0001, 0x1f65: 0x0001, 0x1f66: 0x0001, 0x1f67: 0x0001, 0x1f68: 0x0001, 0x1f69: 0x0001, + 0x1f6a: 0x0001, 0x1f6b: 0x0001, 0x1f6c: 0x0001, 0x1f6d: 0x0001, 0x1f6e: 0x0001, 0x1f6f: 0x0001, + 0x1f70: 0x0001, 0x1f71: 0x0001, 0x1f72: 0x0001, 0x1f73: 0x0001, 0x1f74: 0x0001, 0x1f75: 0x0001, + 0x1f76: 0x0001, 0x1f77: 0x0001, 0x1f78: 0x0001, 0x1f79: 0x0001, 0x1f7a: 0x0001, 0x1f7b: 0x0001, + 0x1f7c: 0x0001, 0x1f7d: 0x0001, 0x1f7e: 0x0001, 0x1f7f: 0x0001, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x0001, 0x1f81: 0x0001, 0x1f82: 0x0001, 0x1f83: 0x0001, 0x1f84: 0x0001, 0x1f85: 0x0001, + 0x1f86: 0x0001, + // Block 0x7f, offset 0x1fc0 + 0x1fef: 0x0008, + 0x1ff0: 0x0008, 0x1ff1: 0x0008, 0x1ff2: 0x0008, 0x1ff4: 0x0008, 0x1ff5: 0x0008, + 0x1ff6: 0x0008, 0x1ff7: 0x0008, 0x1ff8: 0x0008, 0x1ff9: 0x0008, 0x1ffa: 0x0008, 0x1ffb: 0x0008, + 0x1ffc: 0x0008, 0x1ffd: 0x0008, + // Block 0x80, offset 0x2000 + 0x201e: 0x0008, 0x201f: 0x0008, + // Block 0x81, offset 0x2040 + 0x2070: 0x0008, 0x2071: 0x0008, + // Block 0x82, offset 0x2080 + 0x2082: 0x0008, + 0x2086: 0x0008, 0x208b: 0x0008, + 0x20a5: 0x0008, 0x20a6: 0x0008, + 0x20ac: 0x0008, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x0008, 0x20c5: 0x0008, + 0x20e0: 0x0008, 0x20e1: 0x0008, 0x20e2: 0x0008, 0x20e3: 0x0008, + 0x20e4: 0x0008, 0x20e5: 0x0008, 0x20e6: 0x0008, 0x20e7: 0x0008, 0x20e8: 0x0008, 0x20e9: 0x0008, + 0x20ea: 0x0008, 0x20eb: 0x0008, 0x20ec: 0x0008, 0x20ed: 0x0008, 0x20ee: 0x0008, 0x20ef: 0x0008, + 0x20f0: 0x0008, 0x20f1: 0x0008, + 0x20ff: 0x0008, + // Block 0x84, offset 0x2100 + 0x2126: 0x0008, 0x2127: 0x0008, 0x2128: 0x0008, 0x2129: 0x0008, + 0x212a: 0x0008, 0x212b: 0x0008, 0x212c: 0x0008, 0x212d: 0x0008, + // Block 0x85, offset 0x2140 + 0x2147: 0x0008, 0x2148: 0x0008, 0x2149: 0x0008, 0x214a: 0x0008, 0x214b: 0x0008, + 0x214c: 0x0008, 0x214d: 0x0008, 0x214e: 0x0008, 0x214f: 0x0008, 0x2150: 0x0008, 0x2151: 0x0008, + 0x2160: 0x0001, 0x2161: 0x0001, 0x2162: 0x0001, 0x2163: 0x0001, + 0x2164: 0x0001, 0x2165: 0x0001, 0x2166: 0x0001, 0x2167: 0x0001, 0x2168: 0x0001, 0x2169: 0x0001, + 0x216a: 0x0001, 0x216b: 0x0001, 0x216c: 0x0001, 0x216d: 0x0001, 0x216e: 0x0001, 0x216f: 0x0001, + 0x2170: 0x0001, 0x2171: 0x0001, 0x2172: 0x0001, 0x2173: 0x0001, 0x2174: 0x0001, 0x2175: 0x0001, + 0x2176: 0x0001, 0x2177: 0x0001, 0x2178: 0x0001, 0x2179: 0x0001, 0x217a: 0x0001, 0x217b: 0x0001, + 0x217c: 0x0001, + // Block 0x86, offset 0x2180 + 0x2180: 0x0008, 0x2181: 0x0008, 0x2182: 0x0008, + 0x21b3: 0x0008, + 0x21b6: 0x0008, 0x21b7: 0x0008, 0x21b8: 0x0008, 0x21b9: 0x0008, + 0x21bc: 0x0008, 0x21bd: 0x0008, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x0008, + // Block 0x88, offset 0x2200 + 0x2229: 0x0008, + 0x222a: 0x0008, 0x222b: 0x0008, 0x222c: 0x0008, 0x222d: 0x0008, 0x222e: 0x0008, + 0x2231: 0x0008, 0x2232: 0x0008, 0x2235: 0x0008, + 0x2236: 0x0008, + // Block 0x89, offset 0x2240 + 0x2243: 0x0008, + 0x224c: 0x0008, + 0x227c: 0x0008, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x0008, 0x22b2: 0x0008, 0x22b3: 0x0008, 0x22b4: 0x0008, + 0x22b7: 0x0008, 0x22b8: 0x0008, + 0x22be: 0x0008, 0x22bf: 0x0008, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x0008, + 0x22ec: 0x0008, 0x22ed: 0x0008, + 0x22f6: 0x0008, + // Block 0x8c, offset 0x2300 + 0x2325: 0x0008, 0x2328: 0x0008, + 0x232d: 0x0008, + // Block 0x8d, offset 0x2340 + 0x2340: 0x0001, 0x2341: 0x0001, 0x2342: 0x0001, 0x2343: 0x0001, 0x2344: 0x0001, 0x2345: 0x0001, + 0x2346: 0x0001, 0x2347: 0x0001, 0x2348: 0x0001, 0x2349: 0x0001, 0x234a: 0x0001, 0x234b: 0x0001, + 0x234c: 0x0001, 0x234d: 0x0001, 0x234e: 0x0001, 0x234f: 0x0001, 0x2350: 0x0001, 0x2351: 0x0001, + 0x2352: 0x0001, 0x2353: 0x0001, 0x2354: 0x0001, 0x2355: 0x0001, 0x2356: 0x0001, 0x2357: 0x0001, + 0x2358: 0x0001, 0x2359: 0x0001, 0x235a: 0x0001, 0x235b: 0x0001, 0x235c: 0x0001, 0x235d: 0x0001, + 0x235e: 0x0001, 0x235f: 0x0001, 0x2360: 0x0001, 0x2361: 0x0001, 0x2362: 0x0001, 0x2363: 0x0001, + // Block 0x8e, offset 0x2380 + 0x239e: 0x0008, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x000a, 0x23c1: 0x000a, 0x23c2: 0x000a, 0x23c3: 0x000a, 0x23c4: 0x000a, 0x23c5: 0x000a, + 0x23c6: 0x000a, 0x23c7: 0x000a, 0x23c8: 0x000a, 0x23c9: 0x000a, 0x23ca: 0x000a, 0x23cb: 0x000a, + 0x23cc: 0x000a, 0x23cd: 0x000a, 0x23ce: 0x000a, 0x23cf: 0x000a, 0x23d0: 0x0001, 0x23d1: 0x0001, + 0x23d2: 0x0001, 0x23d3: 0x0001, 0x23d4: 0x0001, 0x23d5: 0x0001, 0x23d6: 0x0001, 0x23d7: 0x0001, + 0x23d8: 0x0001, 0x23d9: 0x0001, + 0x23e0: 0x0008, 0x23e1: 0x0008, 0x23e2: 0x0008, 0x23e3: 0x0008, + 0x23e4: 0x0008, 0x23e5: 0x0008, 0x23e6: 0x0008, 0x23e7: 0x0008, 0x23e8: 0x0008, 0x23e9: 0x0008, + 0x23ea: 0x0008, 0x23eb: 0x0008, 0x23ec: 0x0008, 0x23ed: 0x0008, 0x23ee: 0x0008, 0x23ef: 0x0008, + 0x23f0: 0x0001, 0x23f1: 0x0001, 0x23f2: 0x0001, 0x23f3: 0x0001, 0x23f4: 0x0001, 0x23f5: 0x0001, + 0x23f6: 0x0001, 0x23f7: 0x0001, 0x23f8: 0x0001, 0x23f9: 0x0001, 0x23fa: 0x0001, 0x23fb: 0x0001, + 0x23fc: 0x0001, 0x23fd: 0x0001, 0x23fe: 0x0001, 0x23ff: 0x0001, + // Block 0x90, offset 0x2400 + 0x2400: 0x0001, 0x2401: 0x0001, 0x2402: 0x0001, 0x2403: 0x0001, 0x2404: 0x0001, 0x2405: 0x0001, + 0x2406: 0x0001, 0x2407: 0x0001, 0x2408: 0x0001, 0x2409: 0x0001, 0x240a: 0x0001, 0x240b: 0x0001, + 0x240c: 0x0001, 0x240d: 0x0001, 0x240e: 0x0001, 0x240f: 0x0001, 0x2410: 0x0001, 0x2411: 0x0001, + 0x2412: 0x0001, 0x2414: 0x0001, 0x2415: 0x0001, 0x2416: 0x0001, 0x2417: 0x0001, + 0x2418: 0x0001, 0x2419: 0x0001, 0x241a: 0x0001, 0x241b: 0x0001, 0x241c: 0x0001, 0x241d: 0x0001, + 0x241e: 0x0001, 0x241f: 0x0001, 0x2420: 0x0001, 0x2421: 0x0001, 0x2422: 0x0001, 0x2423: 0x0001, + 0x2424: 0x0001, 0x2425: 0x0001, 0x2426: 0x0001, 0x2428: 0x0001, 0x2429: 0x0001, + 0x242a: 0x0001, 0x242b: 0x0001, + // Block 0x91, offset 0x2440 + 0x2440: 0x0001, 0x2441: 0x0001, 0x2442: 0x0001, 0x2443: 0x0001, 0x2444: 0x0001, 0x2445: 0x0001, + 0x2446: 0x0001, 0x2447: 0x0001, 0x2448: 0x0001, 0x2449: 0x0001, 0x244a: 0x0001, 0x244b: 0x0001, + 0x244c: 0x0001, 0x244d: 0x0001, 0x244e: 0x0001, 0x244f: 0x0001, 0x2450: 0x0001, 0x2451: 0x0001, + 0x2452: 0x0001, 0x2453: 0x0001, 0x2454: 0x0001, 0x2455: 0x0001, 0x2456: 0x0001, 0x2457: 0x0001, + 0x2458: 0x0001, 0x2459: 0x0001, 0x245a: 0x0001, 0x245b: 0x0001, 0x245c: 0x0001, 0x245d: 0x0001, + 0x245e: 0x0001, 0x245f: 0x0001, 0x2460: 0x0001, + // Block 0x92, offset 0x2480 + 0x24a0: 0x0001, 0x24a1: 0x0001, 0x24a2: 0x0001, 0x24a3: 0x0001, + 0x24a4: 0x0001, 0x24a5: 0x0001, 0x24a6: 0x0001, + 0x24b9: 0x0008, 0x24ba: 0x0008, 0x24bb: 0x0008, + 0x24be: 0x0008, 0x24bf: 0x0008, + // Block 0x93, offset 0x24c0 + 0x24fd: 0x0008, + // Block 0x94, offset 0x2500 + 0x2520: 0x0008, + // Block 0x95, offset 0x2540 + 0x2576: 0x0008, 0x2577: 0x0008, 0x2578: 0x0008, 0x2579: 0x0008, 0x257a: 0x0008, + // Block 0x96, offset 0x2580 + 0x2581: 0x0008, 0x2582: 0x0008, 0x2583: 0x0008, 0x2585: 0x0008, + 0x2586: 0x0008, + 0x258c: 0x0008, 0x258d: 0x0008, 0x258e: 0x0008, 0x258f: 0x0008, + 0x25b8: 0x0008, 0x25b9: 0x0008, 0x25ba: 0x0008, + 0x25bf: 0x0008, + // Block 0x97, offset 0x25c0 + 0x25e5: 0x0008, 0x25e6: 0x0008, + // Block 0x98, offset 0x2600 + 0x2624: 0x0008, 0x2625: 0x0008, 0x2626: 0x0008, 0x2627: 0x0008, + // Block 0x99, offset 0x2640 + 0x266b: 0x0008, 0x266c: 0x0008, + // Block 0x9a, offset 0x2680 + 0x26bd: 0x0008, 0x26be: 0x0008, 0x26bf: 0x0008, + // Block 0x9b, offset 0x26c0 + 0x26c6: 0x0008, 0x26c7: 0x0008, 0x26c8: 0x0008, 0x26c9: 0x0008, 0x26ca: 0x0008, 0x26cb: 0x0008, + 0x26cc: 0x0008, 0x26cd: 0x0008, 0x26ce: 0x0008, 0x26cf: 0x0008, 0x26d0: 0x0008, + // Block 0x9c, offset 0x2700 + 0x2702: 0x0008, 0x2703: 0x0008, 0x2704: 0x0008, 0x2705: 0x0008, + // Block 0x9d, offset 0x2740 + 0x2741: 0x0008, + 0x2778: 0x0008, 0x2779: 0x0008, 0x277a: 0x0008, 0x277b: 0x0008, + 0x277c: 0x0008, 0x277d: 0x0008, 0x277e: 0x0008, 0x277f: 0x0008, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0008, 0x2781: 0x0008, 0x2782: 0x0008, 0x2783: 0x0008, 0x2784: 0x0008, 0x2785: 0x0008, + 0x2786: 0x0008, + 0x27b0: 0x0008, 0x27b3: 0x0008, 0x27b4: 0x0008, + 0x27bf: 0x0008, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0008, 0x27c1: 0x0008, + 0x27f3: 0x0008, 0x27f4: 0x0008, 0x27f5: 0x0008, + 0x27f6: 0x0008, 0x27f9: 0x0008, 0x27fa: 0x0008, + 0x27fd: 0x0008, + // Block 0xa0, offset 0x2800 + 0x2802: 0x0008, + 0x280d: 0x0008, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0008, 0x2841: 0x0008, 0x2842: 0x0008, + 0x2867: 0x0008, 0x2868: 0x0008, 0x2869: 0x0008, + 0x286a: 0x0008, 0x286b: 0x0008, 0x286d: 0x0008, 0x286e: 0x0008, 0x286f: 0x0008, + 0x2870: 0x0008, 0x2871: 0x0008, 0x2872: 0x0008, 0x2873: 0x0008, 0x2874: 0x0008, + // Block 0xa2, offset 0x2880 + 0x28b3: 0x0008, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x0008, 0x28c1: 0x0008, + 0x28f6: 0x0008, 0x28f7: 0x0008, 0x28f8: 0x0008, 0x28f9: 0x0008, 0x28fa: 0x0008, 0x28fb: 0x0008, + 0x28fc: 0x0008, 0x28fd: 0x0008, 0x28fe: 0x0008, + // Block 0xa4, offset 0x2900 + 0x2909: 0x0008, 0x290a: 0x0008, 0x290b: 0x0008, + 0x290c: 0x0008, 0x290f: 0x0008, + // Block 0xa5, offset 0x2940 + 0x296f: 0x0008, + 0x2970: 0x0008, 0x2971: 0x0008, 0x2974: 0x0008, + 0x2976: 0x0008, 0x2977: 0x0008, + 0x297e: 0x0008, + // Block 0xa6, offset 0x2980 + 0x299f: 0x0008, 0x29a3: 0x0008, + 0x29a4: 0x0008, 0x29a5: 0x0008, 0x29a6: 0x0008, 0x29a7: 0x0008, 0x29a8: 0x0008, 0x29a9: 0x0008, + 0x29aa: 0x0008, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0008, + 0x29e6: 0x0008, 0x29e7: 0x0008, 0x29e8: 0x0008, 0x29e9: 0x0008, + 0x29ea: 0x0008, 0x29eb: 0x0008, 0x29ec: 0x0008, + 0x29f0: 0x0008, 0x29f1: 0x0008, 0x29f2: 0x0008, 0x29f3: 0x0008, 0x29f4: 0x0008, + // Block 0xa8, offset 0x2a00 + 0x2a38: 0x0008, 0x2a39: 0x0008, 0x2a3a: 0x0008, 0x2a3b: 0x0008, + 0x2a3c: 0x0008, 0x2a3d: 0x0008, 0x2a3e: 0x0008, 0x2a3f: 0x0008, + // Block 0xa9, offset 0x2a40 + 0x2a42: 0x0008, 0x2a43: 0x0008, 0x2a44: 0x0008, + 0x2a46: 0x0008, + 0x2a5e: 0x0008, + // Block 0xaa, offset 0x2a80 + 0x2ab3: 0x0008, 0x2ab4: 0x0008, 0x2ab5: 0x0008, + 0x2ab6: 0x0008, 0x2ab7: 0x0008, 0x2ab8: 0x0008, 0x2aba: 0x0008, + 0x2abf: 0x0008, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x0008, 0x2ac2: 0x0008, 0x2ac3: 0x0008, + // Block 0xac, offset 0x2b00 + 0x2b32: 0x0008, 0x2b33: 0x0008, 0x2b34: 0x0008, 0x2b35: 0x0008, + 0x2b3c: 0x0008, 0x2b3d: 0x0008, 0x2b3f: 0x0008, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x0008, + 0x2b5c: 0x0008, 0x2b5d: 0x0008, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x0008, 0x2bb4: 0x0008, 0x2bb5: 0x0008, + 0x2bb6: 0x0008, 0x2bb7: 0x0008, 0x2bb8: 0x0008, 0x2bb9: 0x0008, 0x2bba: 0x0008, + 0x2bbd: 0x0008, 0x2bbf: 0x0008, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0008, + // Block 0xb0, offset 0x2c00 + 0x2c2b: 0x0008, 0x2c2d: 0x0008, + 0x2c30: 0x0008, 0x2c31: 0x0008, 0x2c32: 0x0008, 0x2c33: 0x0008, 0x2c34: 0x0008, 0x2c35: 0x0008, + 0x2c37: 0x0008, + // Block 0xb1, offset 0x2c40 + 0x2c5d: 0x0008, + 0x2c5e: 0x0008, 0x2c5f: 0x0008, 0x2c62: 0x0008, 0x2c63: 0x0008, + 0x2c64: 0x0008, 0x2c65: 0x0008, 0x2c67: 0x0008, 0x2c68: 0x0008, 0x2c69: 0x0008, + 0x2c6a: 0x0008, 0x2c6b: 0x0008, + // Block 0xb2, offset 0x2c80 + 0x2caf: 0x0008, + 0x2cb0: 0x0008, 0x2cb1: 0x0008, 0x2cb2: 0x0008, 0x2cb3: 0x0008, 0x2cb4: 0x0008, 0x2cb5: 0x0008, + 0x2cb6: 0x0008, 0x2cb7: 0x0008, 0x2cb9: 0x0008, 0x2cba: 0x0008, + // Block 0xb3, offset 0x2cc0 + 0x2cfb: 0x0008, + 0x2cfc: 0x0008, 0x2cfe: 0x0008, + // Block 0xb4, offset 0x2d00 + 0x2d03: 0x0008, + // Block 0xb5, offset 0x2d40 + 0x2d54: 0x0008, 0x2d55: 0x0008, 0x2d56: 0x0008, 0x2d57: 0x0008, + 0x2d5a: 0x0008, 0x2d5b: 0x0008, + 0x2d60: 0x0008, + // Block 0xb6, offset 0x2d80 + 0x2d81: 0x0008, 0x2d82: 0x0008, 0x2d83: 0x0008, 0x2d84: 0x0008, 0x2d85: 0x0008, + 0x2d86: 0x0008, 0x2d87: 0x0008, 0x2d88: 0x0008, 0x2d89: 0x0008, 0x2d8a: 0x0008, + 0x2db3: 0x0008, 0x2db4: 0x0008, 0x2db5: 0x0008, + 0x2db6: 0x0008, 0x2db7: 0x0008, 0x2db8: 0x0008, 0x2dbb: 0x0008, + 0x2dbc: 0x0008, 0x2dbd: 0x0008, 0x2dbe: 0x0008, + // Block 0xb7, offset 0x2dc0 + 0x2dc7: 0x0008, + 0x2dd1: 0x0008, + 0x2dd2: 0x0008, 0x2dd3: 0x0008, 0x2dd4: 0x0008, 0x2dd5: 0x0008, 0x2dd6: 0x0008, + 0x2dd9: 0x0008, 0x2dda: 0x0008, 0x2ddb: 0x0008, + // Block 0xb8, offset 0x2e00 + 0x2e0a: 0x0008, 0x2e0b: 0x0008, + 0x2e0c: 0x0008, 0x2e0d: 0x0008, 0x2e0e: 0x0008, 0x2e0f: 0x0008, 0x2e10: 0x0008, 0x2e11: 0x0008, + 0x2e12: 0x0008, 0x2e13: 0x0008, 0x2e14: 0x0008, 0x2e15: 0x0008, 0x2e16: 0x0008, + 0x2e18: 0x0008, 0x2e19: 0x0008, + // Block 0xb9, offset 0x2e40 + 0x2e70: 0x0008, 0x2e71: 0x0008, 0x2e72: 0x0008, 0x2e73: 0x0008, 0x2e74: 0x0008, 0x2e75: 0x0008, + 0x2e76: 0x0008, 0x2e78: 0x0008, 0x2e79: 0x0008, 0x2e7a: 0x0008, 0x2e7b: 0x0008, + 0x2e7c: 0x0008, 0x2e7d: 0x0008, 0x2e7f: 0x0008, + // Block 0xba, offset 0x2e80 + 0x2e92: 0x0008, 0x2e93: 0x0008, 0x2e94: 0x0008, 0x2e95: 0x0008, 0x2e96: 0x0008, 0x2e97: 0x0008, + 0x2e98: 0x0008, 0x2e99: 0x0008, 0x2e9a: 0x0008, 0x2e9b: 0x0008, 0x2e9c: 0x0008, 0x2e9d: 0x0008, + 0x2e9e: 0x0008, 0x2e9f: 0x0008, 0x2ea0: 0x0008, 0x2ea1: 0x0008, 0x2ea2: 0x0008, 0x2ea3: 0x0008, + 0x2ea4: 0x0008, 0x2ea5: 0x0008, 0x2ea6: 0x0008, 0x2ea7: 0x0008, + 0x2eaa: 0x0008, 0x2eab: 0x0008, 0x2eac: 0x0008, 0x2ead: 0x0008, 0x2eae: 0x0008, 0x2eaf: 0x0008, + 0x2eb0: 0x0008, 0x2eb2: 0x0008, 0x2eb3: 0x0008, 0x2eb5: 0x0008, + 0x2eb6: 0x0008, + // Block 0xbb, offset 0x2ec0 + 0x2ef1: 0x0008, 0x2ef2: 0x0008, 0x2ef3: 0x0008, 0x2ef4: 0x0008, 0x2ef5: 0x0008, + 0x2ef6: 0x0008, 0x2efa: 0x0008, + 0x2efc: 0x0008, 0x2efd: 0x0008, 0x2eff: 0x0008, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x0008, 0x2f01: 0x0008, 0x2f02: 0x0008, 0x2f03: 0x0008, 0x2f04: 0x0008, 0x2f05: 0x0008, + 0x2f07: 0x0008, + // Block 0xbd, offset 0x2f40 + 0x2f50: 0x0008, 0x2f51: 0x0008, + 0x2f55: 0x0008, 0x2f57: 0x0008, + // Block 0xbe, offset 0x2f80 + 0x2fb3: 0x0008, 0x2fb4: 0x0008, + // Block 0xbf, offset 0x2fc0 + 0x2fc0: 0x0008, 0x2fc1: 0x0008, + 0x2ff6: 0x0008, 0x2ff7: 0x0008, 0x2ff8: 0x0008, 0x2ff9: 0x0008, 0x2ffa: 0x0008, + // Block 0xc0, offset 0x3000 + 0x3000: 0x0008, 0x3002: 0x0008, + // Block 0xc1, offset 0x3040 + 0x3040: 0x0008, + 0x3047: 0x0008, 0x3048: 0x0008, 0x3049: 0x0008, 0x304a: 0x0008, 0x304b: 0x0008, + 0x304c: 0x0008, 0x304d: 0x0008, 0x304e: 0x0008, 0x304f: 0x0008, 0x3050: 0x0008, 0x3051: 0x0008, + 0x3052: 0x0008, 0x3053: 0x0008, 0x3054: 0x0008, 0x3055: 0x0008, + // Block 0xc2, offset 0x3080 + 0x30b0: 0x0008, 0x30b1: 0x0008, 0x30b2: 0x0008, 0x30b3: 0x0008, 0x30b4: 0x0008, + // Block 0xc3, offset 0x30c0 + 0x30f0: 0x0008, 0x30f1: 0x0008, 0x30f2: 0x0008, 0x30f3: 0x0008, 0x30f4: 0x0008, 0x30f5: 0x0008, + 0x30f6: 0x0008, + // Block 0xc4, offset 0x3100 + 0x310f: 0x0008, + // Block 0xc5, offset 0x3140 + 0x314f: 0x0008, 0x3150: 0x0008, 0x3151: 0x0008, + 0x3152: 0x0008, + // Block 0xc6, offset 0x3180 + 0x31a0: 0x0001, 0x31a1: 0x0001, 0x31a2: 0x0001, 0x31a3: 0x0001, + 0x31a4: 0x0009, + 0x31b0: 0x0001, 0x31b1: 0x0001, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x0001, 0x31c1: 0x0001, 0x31c2: 0x0001, 0x31c3: 0x0001, 0x31c4: 0x0001, 0x31c5: 0x0001, + 0x31c6: 0x0001, 0x31c7: 0x0001, 0x31c8: 0x0001, 0x31c9: 0x0001, 0x31ca: 0x0001, 0x31cb: 0x0001, + 0x31cc: 0x0001, 0x31cd: 0x0001, 0x31ce: 0x0001, 0x31cf: 0x0001, 0x31d0: 0x0001, 0x31d1: 0x0001, + 0x31d2: 0x0001, 0x31d3: 0x0001, 0x31d4: 0x0001, 0x31d5: 0x0001, 0x31d6: 0x0001, 0x31d7: 0x0001, + 0x31d8: 0x0001, 0x31d9: 0x0001, 0x31da: 0x0001, 0x31db: 0x0001, 0x31dc: 0x0001, 0x31dd: 0x0001, + 0x31de: 0x0001, 0x31df: 0x0001, 0x31e0: 0x0001, 0x31e1: 0x0001, 0x31e2: 0x0001, 0x31e3: 0x0001, + 0x31e4: 0x0001, 0x31e5: 0x0001, 0x31e6: 0x0001, 0x31e7: 0x0001, 0x31e8: 0x0001, 0x31e9: 0x0001, + 0x31ea: 0x0001, 0x31eb: 0x0001, 0x31ec: 0x0001, 0x31ed: 0x0001, 0x31ee: 0x0001, 0x31ef: 0x0001, + 0x31f0: 0x0001, 0x31f1: 0x0001, 0x31f2: 0x0001, 0x31f3: 0x0001, 0x31f4: 0x0001, 0x31f5: 0x0001, + 0x31f6: 0x0001, 0x31f7: 0x0001, + // Block 0xc8, offset 0x3200 + 0x3200: 0x0001, 0x3201: 0x0001, 0x3202: 0x0001, 0x3203: 0x0001, 0x3204: 0x0001, 0x3205: 0x0001, + 0x3206: 0x0001, 0x3207: 0x0001, 0x3208: 0x0001, 0x3209: 0x0001, 0x320a: 0x0001, 0x320b: 0x0001, + 0x320c: 0x0001, 0x320d: 0x0001, 0x320e: 0x0001, 0x320f: 0x0001, 0x3210: 0x0001, 0x3211: 0x0001, + 0x3212: 0x0001, 0x3213: 0x0001, 0x3214: 0x0001, 0x3215: 0x0001, + // Block 0xc9, offset 0x3240 + 0x3240: 0x0001, 0x3241: 0x0001, 0x3242: 0x0001, 0x3243: 0x0001, 0x3244: 0x0001, 0x3245: 0x0001, + 0x3246: 0x0001, 0x3247: 0x0001, 0x3248: 0x0001, + // Block 0xca, offset 0x3280 + 0x32b0: 0x0001, 0x32b1: 0x0001, 0x32b2: 0x0001, 0x32b3: 0x0001, 0x32b5: 0x0001, + 0x32b6: 0x0001, 0x32b7: 0x0001, 0x32b8: 0x0001, 0x32b9: 0x0001, 0x32ba: 0x0001, 0x32bb: 0x0001, + 0x32bd: 0x0001, 0x32be: 0x0001, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x0001, 0x32c1: 0x0001, 0x32c2: 0x0001, 0x32c3: 0x0001, 0x32c4: 0x0001, 0x32c5: 0x0001, + 0x32c6: 0x0001, 0x32c7: 0x0001, 0x32c8: 0x0001, 0x32c9: 0x0001, 0x32ca: 0x0001, 0x32cb: 0x0001, + 0x32cc: 0x0001, 0x32cd: 0x0001, 0x32ce: 0x0001, 0x32cf: 0x0001, 0x32d0: 0x0001, 0x32d1: 0x0001, + 0x32d2: 0x0001, 0x32d3: 0x0001, 0x32d4: 0x0001, 0x32d5: 0x0001, 0x32d6: 0x0001, 0x32d7: 0x0001, + 0x32d8: 0x0001, 0x32d9: 0x0001, 0x32da: 0x0001, 0x32db: 0x0001, 0x32dc: 0x0001, 0x32dd: 0x0001, + 0x32de: 0x0001, 0x32df: 0x0001, 0x32e0: 0x0001, 0x32e1: 0x0001, 0x32e2: 0x0001, + 0x32f2: 0x0001, + // Block 0xcc, offset 0x3300 + 0x3310: 0x0001, 0x3311: 0x0001, + 0x3312: 0x0001, 0x3315: 0x0001, + 0x3324: 0x0001, 0x3325: 0x0001, 0x3326: 0x0001, 0x3327: 0x0001, + 0x3330: 0x0001, 0x3331: 0x0001, 0x3332: 0x0001, 0x3333: 0x0001, 0x3334: 0x0001, 0x3335: 0x0001, + 0x3336: 0x0001, 0x3337: 0x0001, 0x3338: 0x0001, 0x3339: 0x0001, 0x333a: 0x0001, 0x333b: 0x0001, + 0x333c: 0x0001, 0x333d: 0x0001, 0x333e: 0x0001, 0x333f: 0x0001, + // Block 0xcd, offset 0x3340 + 0x3340: 0x0001, 0x3341: 0x0001, 0x3342: 0x0001, 0x3343: 0x0001, 0x3344: 0x0001, 0x3345: 0x0001, + 0x3346: 0x0001, 0x3347: 0x0001, 0x3348: 0x0001, 0x3349: 0x0001, 0x334a: 0x0001, 0x334b: 0x0001, + 0x334c: 0x0001, 0x334d: 0x0001, 0x334e: 0x0001, 0x334f: 0x0001, 0x3350: 0x0001, 0x3351: 0x0001, + 0x3352: 0x0001, 0x3353: 0x0001, 0x3354: 0x0001, 0x3355: 0x0001, 0x3356: 0x0001, 0x3357: 0x0001, + 0x3358: 0x0001, 0x3359: 0x0001, 0x335a: 0x0001, 0x335b: 0x0001, 0x335c: 0x0001, 0x335d: 0x0001, + 0x335e: 0x0001, 0x335f: 0x0001, 0x3360: 0x0001, 0x3361: 0x0001, 0x3362: 0x0001, 0x3363: 0x0001, + 0x3364: 0x0001, 0x3365: 0x0001, 0x3366: 0x0001, 0x3367: 0x0001, 0x3368: 0x0001, 0x3369: 0x0001, + 0x336a: 0x0001, 0x336b: 0x0001, 0x336c: 0x0001, 0x336d: 0x0001, 0x336e: 0x0001, 0x336f: 0x0001, + 0x3370: 0x0001, 0x3371: 0x0001, 0x3372: 0x0001, 0x3373: 0x0001, 0x3374: 0x0001, 0x3375: 0x0001, + 0x3376: 0x0001, 0x3377: 0x0001, 0x3378: 0x0001, 0x3379: 0x0001, 0x337a: 0x0001, 0x337b: 0x0001, + // Block 0xce, offset 0x3380 + 0x339d: 0x0008, + 0x339e: 0x0008, 0x33a0: 0x0008, 0x33a1: 0x0008, 0x33a2: 0x0008, 0x33a3: 0x0008, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x0008, 0x33c1: 0x0008, 0x33c2: 0x0008, 0x33c3: 0x0008, 0x33c4: 0x0008, 0x33c5: 0x0008, + 0x33c6: 0x0008, 0x33c7: 0x0008, 0x33c8: 0x0008, 0x33c9: 0x0008, 0x33ca: 0x0008, 0x33cb: 0x0008, + 0x33cc: 0x0008, 0x33cd: 0x0008, 0x33ce: 0x0008, 0x33cf: 0x0008, 0x33d0: 0x0008, 0x33d1: 0x0008, + 0x33d2: 0x0008, 0x33d3: 0x0008, 0x33d4: 0x0008, 0x33d5: 0x0008, 0x33d6: 0x0008, 0x33d7: 0x0008, + 0x33d8: 0x0008, 0x33d9: 0x0008, 0x33da: 0x0008, 0x33db: 0x0008, 0x33dc: 0x0008, 0x33dd: 0x0008, + 0x33de: 0x0008, 0x33df: 0x0008, 0x33e0: 0x0008, 0x33e1: 0x0008, 0x33e2: 0x0008, 0x33e3: 0x0008, + 0x33e4: 0x0008, 0x33e5: 0x0008, 0x33e6: 0x0008, 0x33e7: 0x0008, 0x33e8: 0x0008, 0x33e9: 0x0008, + 0x33ea: 0x0008, 0x33eb: 0x0008, 0x33ec: 0x0008, 0x33ed: 0x0008, + 0x33f0: 0x0008, 0x33f1: 0x0008, 0x33f2: 0x0008, 0x33f3: 0x0008, 0x33f4: 0x0008, 0x33f5: 0x0008, + 0x33f6: 0x0008, 0x33f7: 0x0008, 0x33f8: 0x0008, 0x33f9: 0x0008, 0x33fa: 0x0008, 0x33fb: 0x0008, + 0x33fc: 0x0008, 0x33fd: 0x0008, 0x33fe: 0x0008, 0x33ff: 0x0008, + // Block 0xd0, offset 0x3400 + 0x3400: 0x0008, 0x3401: 0x0008, 0x3402: 0x0008, 0x3403: 0x0008, 0x3404: 0x0008, 0x3405: 0x0008, + 0x3406: 0x0008, + // Block 0xd1, offset 0x3440 + 0x3467: 0x0008, 0x3468: 0x0008, 0x3469: 0x0008, + 0x3473: 0x0008, 0x3474: 0x0008, 0x3475: 0x0008, + 0x3476: 0x0008, 0x3477: 0x0008, 0x3478: 0x0008, 0x3479: 0x0008, 0x347a: 0x0008, 0x347b: 0x0008, + 0x347c: 0x0008, 0x347d: 0x0008, 0x347e: 0x0008, 0x347f: 0x0008, + // Block 0xd2, offset 0x3480 + 0x3480: 0x0008, 0x3481: 0x0008, 0x3482: 0x0008, 0x3485: 0x0008, + 0x3486: 0x0008, 0x3487: 0x0008, 0x3488: 0x0008, 0x3489: 0x0008, 0x348a: 0x0008, 0x348b: 0x0008, + 0x34aa: 0x0008, 0x34ab: 0x0008, 0x34ac: 0x0008, 0x34ad: 0x0008, + // Block 0xd3, offset 0x34c0 + 0x34c2: 0x0008, 0x34c3: 0x0008, 0x34c4: 0x0008, + // Block 0xd4, offset 0x3500 + 0x3500: 0x0008, 0x3501: 0x0008, 0x3502: 0x0008, 0x3503: 0x0008, 0x3504: 0x0008, 0x3505: 0x0008, + 0x3506: 0x0008, 0x3507: 0x0008, 0x3508: 0x0008, 0x3509: 0x0008, 0x350a: 0x0008, 0x350b: 0x0008, + 0x350c: 0x0008, 0x350d: 0x0008, 0x350e: 0x0008, 0x350f: 0x0008, 0x3510: 0x0008, 0x3511: 0x0008, + 0x3512: 0x0008, 0x3513: 0x0008, 0x3514: 0x0008, 0x3515: 0x0008, 0x3516: 0x0008, 0x3517: 0x0008, + 0x3518: 0x0008, 0x3519: 0x0008, 0x351a: 0x0008, 0x351b: 0x0008, 0x351c: 0x0008, 0x351d: 0x0008, + 0x351e: 0x0008, 0x351f: 0x0008, 0x3520: 0x0008, 0x3521: 0x0008, 0x3522: 0x0008, 0x3523: 0x0008, + 0x3524: 0x0008, 0x3525: 0x0008, 0x3526: 0x0008, 0x3527: 0x0008, 0x3528: 0x0008, 0x3529: 0x0008, + 0x352a: 0x0008, 0x352b: 0x0008, 0x352c: 0x0008, 0x352d: 0x0008, 0x352e: 0x0008, 0x352f: 0x0008, + 0x3530: 0x0008, 0x3531: 0x0008, 0x3532: 0x0008, 0x3533: 0x0008, 0x3534: 0x0008, 0x3535: 0x0008, + 0x3536: 0x0008, 0x353b: 0x0008, + 0x353c: 0x0008, 0x353d: 0x0008, 0x353e: 0x0008, 0x353f: 0x0008, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0008, 0x3541: 0x0008, 0x3542: 0x0008, 0x3543: 0x0008, 0x3544: 0x0008, 0x3545: 0x0008, + 0x3546: 0x0008, 0x3547: 0x0008, 0x3548: 0x0008, 0x3549: 0x0008, 0x354a: 0x0008, 0x354b: 0x0008, + 0x354c: 0x0008, 0x354d: 0x0008, 0x354e: 0x0008, 0x354f: 0x0008, 0x3550: 0x0008, 0x3551: 0x0008, + 0x3552: 0x0008, 0x3553: 0x0008, 0x3554: 0x0008, 0x3555: 0x0008, 0x3556: 0x0008, 0x3557: 0x0008, + 0x3558: 0x0008, 0x3559: 0x0008, 0x355a: 0x0008, 0x355b: 0x0008, 0x355c: 0x0008, 0x355d: 0x0008, + 0x355e: 0x0008, 0x355f: 0x0008, 0x3560: 0x0008, 0x3561: 0x0008, 0x3562: 0x0008, 0x3563: 0x0008, + 0x3564: 0x0008, 0x3565: 0x0008, 0x3566: 0x0008, 0x3567: 0x0008, 0x3568: 0x0008, 0x3569: 0x0008, + 0x356a: 0x0008, 0x356b: 0x0008, 0x356c: 0x0008, + 0x3575: 0x0008, + // Block 0xd6, offset 0x3580 + 0x3584: 0x0008, + 0x359b: 0x0008, 0x359c: 0x0008, 0x359d: 0x0008, + 0x359e: 0x0008, 0x359f: 0x0008, 0x35a1: 0x0008, 0x35a2: 0x0008, 0x35a3: 0x0008, + 0x35a4: 0x0008, 0x35a5: 0x0008, 0x35a6: 0x0008, 0x35a7: 0x0008, 0x35a8: 0x0008, 0x35a9: 0x0008, + 0x35aa: 0x0008, 0x35ab: 0x0008, 0x35ac: 0x0008, 0x35ad: 0x0008, 0x35ae: 0x0008, 0x35af: 0x0008, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x0008, 0x35c1: 0x0008, 0x35c2: 0x0008, 0x35c3: 0x0008, 0x35c4: 0x0008, 0x35c5: 0x0008, + 0x35c6: 0x0008, 0x35c8: 0x0008, 0x35c9: 0x0008, 0x35ca: 0x0008, 0x35cb: 0x0008, + 0x35cc: 0x0008, 0x35cd: 0x0008, 0x35ce: 0x0008, 0x35cf: 0x0008, 0x35d0: 0x0008, 0x35d1: 0x0008, + 0x35d2: 0x0008, 0x35d3: 0x0008, 0x35d4: 0x0008, 0x35d5: 0x0008, 0x35d6: 0x0008, 0x35d7: 0x0008, + 0x35d8: 0x0008, 0x35db: 0x0008, 0x35dc: 0x0008, 0x35dd: 0x0008, + 0x35de: 0x0008, 0x35df: 0x0008, 0x35e0: 0x0008, 0x35e1: 0x0008, 0x35e3: 0x0008, + 0x35e4: 0x0008, 0x35e6: 0x0008, 0x35e7: 0x0008, 0x35e8: 0x0008, 0x35e9: 0x0008, + 0x35ea: 0x0008, + // Block 0xd8, offset 0x3600 + 0x362e: 0x0008, + // Block 0xd9, offset 0x3640 + 0x366c: 0x0008, 0x366d: 0x0008, 0x366e: 0x0008, 0x366f: 0x0008, + // Block 0xda, offset 0x3680 + 0x3690: 0x0008, 0x3691: 0x0008, + 0x3692: 0x0008, 0x3693: 0x0008, 0x3694: 0x0008, 0x3695: 0x0008, 0x3696: 0x0008, + // Block 0xdb, offset 0x36c0 + 0x36c4: 0x0008, 0x36c5: 0x0008, + 0x36c6: 0x0008, 0x36c7: 0x0008, 0x36c8: 0x0008, 0x36c9: 0x0008, 0x36ca: 0x0008, + // Block 0xdc, offset 0x3700 + 0x3700: 0x0004, 0x3701: 0x0004, 0x3702: 0x0004, 0x3703: 0x0004, 0x3704: 0x0005, 0x3705: 0x0004, + 0x3706: 0x0004, 0x3707: 0x0004, 0x3708: 0x0004, 0x3709: 0x0004, 0x370a: 0x0004, 0x370b: 0x0004, + 0x370c: 0x0004, 0x370d: 0x0004, 0x370e: 0x0004, 0x370f: 0x0004, 0x3710: 0x0004, 0x3711: 0x0004, + 0x3712: 0x0004, 0x3713: 0x0004, 0x3714: 0x0004, 0x3715: 0x0004, 0x3716: 0x0004, 0x3717: 0x0004, + 0x3718: 0x0004, 0x3719: 0x0004, 0x371a: 0x0004, 0x371b: 0x0004, 0x371c: 0x0004, 0x371d: 0x0004, + 0x371e: 0x0004, 0x371f: 0x0004, 0x3720: 0x0004, 0x3721: 0x0004, 0x3722: 0x0004, 0x3723: 0x0004, + 0x3724: 0x0004, 0x3725: 0x0004, 0x3726: 0x0004, 0x3727: 0x0004, 0x3728: 0x0004, 0x3729: 0x0004, + 0x372a: 0x0004, 0x372b: 0x0004, 0x372c: 0x0004, 0x372d: 0x0004, 0x372e: 0x0004, 0x372f: 0x0004, + 0x3730: 0x0004, 0x3731: 0x0004, 0x3732: 0x0004, 0x3733: 0x0004, 0x3734: 0x0004, 0x3735: 0x0004, + 0x3736: 0x0004, 0x3737: 0x0004, 0x3738: 0x0004, 0x3739: 0x0004, 0x373a: 0x0004, 0x373b: 0x0004, + 0x373c: 0x0004, 0x373d: 0x0004, 0x373e: 0x0004, 0x373f: 0x0004, + // Block 0xdd, offset 0x3740 + 0x3740: 0x0004, 0x3741: 0x0004, 0x3742: 0x0004, 0x3743: 0x0004, 0x3744: 0x0004, 0x3745: 0x0004, + 0x3746: 0x0004, 0x3747: 0x0004, 0x3748: 0x0004, 0x3749: 0x0004, 0x374a: 0x0004, 0x374b: 0x0004, + 0x374c: 0x0004, 0x374d: 0x0004, 0x374e: 0x0004, 0x374f: 0x0004, 0x3750: 0x0004, 0x3751: 0x0004, + 0x3752: 0x0004, 0x3753: 0x0004, 0x3754: 0x0004, 0x3755: 0x0004, 0x3756: 0x0004, 0x3757: 0x0004, + 0x3758: 0x0004, 0x3759: 0x0004, 0x375a: 0x0004, 0x375b: 0x0004, 0x375c: 0x0004, 0x375d: 0x0004, + 0x375e: 0x0004, 0x375f: 0x0004, 0x3760: 0x0004, 0x3761: 0x0004, 0x3762: 0x0004, 0x3763: 0x0004, + 0x3764: 0x0004, 0x3765: 0x0004, 0x3766: 0x0004, 0x3767: 0x0004, 0x3768: 0x0004, 0x3769: 0x0004, + 0x376a: 0x0004, 0x376b: 0x0004, 0x376c: 0x0004, 0x376d: 0x0004, 0x376e: 0x0004, 0x376f: 0x0004, + 0x3770: 0x0004, 0x3771: 0x0004, 0x3772: 0x0004, 0x3773: 0x0004, 0x3774: 0x0004, 0x3775: 0x0004, + 0x3776: 0x0004, 0x3777: 0x0004, 0x3778: 0x0004, 0x3779: 0x0004, 0x377a: 0x0004, 0x377b: 0x0004, + 0x377c: 0x0004, 0x377d: 0x0004, 0x377e: 0x0004, 0x377f: 0x0004, + // Block 0xde, offset 0x3780 + 0x3780: 0x0004, 0x3781: 0x0004, 0x3782: 0x0004, 0x3783: 0x0004, 0x3784: 0x0004, 0x3785: 0x0004, + 0x3786: 0x0004, 0x3787: 0x0004, 0x3788: 0x0004, 0x3789: 0x0004, 0x378a: 0x0004, 0x378b: 0x0004, + 0x378c: 0x0004, 0x378d: 0x0004, 0x378e: 0x0004, 0x378f: 0x0005, 0x3790: 0x0004, 0x3791: 0x0004, + 0x3792: 0x0004, 0x3793: 0x0004, 0x3794: 0x0004, 0x3795: 0x0004, 0x3796: 0x0004, 0x3797: 0x0004, + 0x3798: 0x0004, 0x3799: 0x0004, 0x379a: 0x0004, 0x379b: 0x0004, 0x379c: 0x0004, 0x379d: 0x0004, + 0x379e: 0x0004, 0x379f: 0x0004, 0x37a0: 0x0004, 0x37a1: 0x0004, 0x37a2: 0x0004, 0x37a3: 0x0004, + 0x37a4: 0x0004, 0x37a5: 0x0004, 0x37a6: 0x0004, 0x37a7: 0x0004, 0x37a8: 0x0004, 0x37a9: 0x0004, + 0x37aa: 0x0004, 0x37ab: 0x0004, 0x37ac: 0x0004, 0x37ad: 0x0004, 0x37ae: 0x0004, 0x37af: 0x0004, + 0x37b0: 0x0004, 0x37b1: 0x0004, 0x37b2: 0x0004, 0x37b3: 0x0004, 0x37b4: 0x0004, 0x37b5: 0x0004, + 0x37b6: 0x0004, 0x37b7: 0x0004, 0x37b8: 0x0004, 0x37b9: 0x0004, 0x37ba: 0x0004, 0x37bb: 0x0004, + 0x37bc: 0x0004, 0x37bd: 0x0004, 0x37be: 0x0004, 0x37bf: 0x0004, + // Block 0xdf, offset 0x37c0 + 0x37c0: 0x0002, 0x37c1: 0x0002, 0x37c2: 0x0002, 0x37c3: 0x0002, 0x37c4: 0x0002, 0x37c5: 0x0002, + 0x37c6: 0x0002, 0x37c7: 0x0002, 0x37c8: 0x0002, 0x37c9: 0x0002, 0x37ca: 0x0002, + 0x37cd: 0x0004, 0x37ce: 0x0004, 0x37cf: 0x0004, 0x37d0: 0x0002, 0x37d1: 0x0002, + 0x37d2: 0x0002, 0x37d3: 0x0002, 0x37d4: 0x0002, 0x37d5: 0x0002, 0x37d6: 0x0002, 0x37d7: 0x0002, + 0x37d8: 0x0002, 0x37d9: 0x0002, 0x37da: 0x0002, 0x37db: 0x0002, 0x37dc: 0x0002, 0x37dd: 0x0002, + 0x37de: 0x0002, 0x37df: 0x0002, 0x37e0: 0x0002, 0x37e1: 0x0002, 0x37e2: 0x0002, 0x37e3: 0x0002, + 0x37e4: 0x0002, 0x37e5: 0x0002, 0x37e6: 0x0002, 0x37e7: 0x0002, 0x37e8: 0x0002, 0x37e9: 0x0002, + 0x37ea: 0x0002, 0x37eb: 0x0002, 0x37ec: 0x0002, 0x37ed: 0x0002, 0x37ef: 0x0004, + 0x37f0: 0x0002, 0x37f1: 0x0002, 0x37f2: 0x0002, 0x37f3: 0x0002, 0x37f4: 0x0002, 0x37f5: 0x0002, + 0x37f6: 0x0002, 0x37f7: 0x0002, 0x37f8: 0x0002, 0x37f9: 0x0002, 0x37fa: 0x0002, 0x37fb: 0x0002, + 0x37fc: 0x0002, 0x37fd: 0x0002, 0x37fe: 0x0002, 0x37ff: 0x0002, + // Block 0xe0, offset 0x3800 + 0x3800: 0x0002, 0x3801: 0x0002, 0x3802: 0x0002, 0x3803: 0x0002, 0x3804: 0x0002, 0x3805: 0x0002, + 0x3806: 0x0002, 0x3807: 0x0002, 0x3808: 0x0002, 0x3809: 0x0002, 0x380a: 0x0002, 0x380b: 0x0002, + 0x380c: 0x0002, 0x380d: 0x0002, 0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002, + 0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002, + 0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002, + 0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, + 0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002, + 0x382c: 0x0004, 0x382d: 0x0004, 0x382e: 0x0004, 0x382f: 0x0004, + 0x3830: 0x0006, 0x3831: 0x0006, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002, + 0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002, + 0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0006, 0x383f: 0x0006, + // Block 0xe1, offset 0x3840 + 0x3840: 0x0002, 0x3841: 0x0002, 0x3842: 0x0002, 0x3843: 0x0002, 0x3844: 0x0002, 0x3845: 0x0002, + 0x3846: 0x0002, 0x3847: 0x0002, 0x3848: 0x0002, 0x3849: 0x0002, 0x384a: 0x0002, 0x384b: 0x0002, + 0x384c: 0x0002, 0x384d: 0x0002, 0x384e: 0x0005, 0x384f: 0x0002, 0x3850: 0x0002, 0x3851: 0x0005, + 0x3852: 0x0005, 0x3853: 0x0005, 0x3854: 0x0005, 0x3855: 0x0005, 0x3856: 0x0005, 0x3857: 0x0005, + 0x3858: 0x0005, 0x3859: 0x0005, 0x385a: 0x0005, 0x385b: 0x0002, 0x385c: 0x0002, 0x385d: 0x0002, + 0x385e: 0x0002, 0x385f: 0x0002, 0x3860: 0x0002, 0x3861: 0x0002, 0x3862: 0x0002, 0x3863: 0x0002, + 0x3864: 0x0002, 0x3865: 0x0002, 0x3866: 0x0002, 0x3867: 0x0002, 0x3868: 0x0002, 0x3869: 0x0002, + 0x386a: 0x0002, 0x386b: 0x0002, 0x386c: 0x0002, 0x386d: 0x0004, 0x386e: 0x0004, 0x386f: 0x0004, + 0x3870: 0x0004, 0x3871: 0x0004, 0x3872: 0x0004, 0x3873: 0x0004, 0x3874: 0x0004, 0x3875: 0x0004, + 0x3876: 0x0004, 0x3877: 0x0004, 0x3878: 0x0004, 0x3879: 0x0004, 0x387a: 0x0004, 0x387b: 0x0004, + 0x387c: 0x0004, 0x387d: 0x0004, 0x387e: 0x0004, 0x387f: 0x0004, + // Block 0xe2, offset 0x3880 + 0x3880: 0x0004, 0x3881: 0x0004, 0x3882: 0x0004, 0x3883: 0x0004, 0x3884: 0x0004, 0x3885: 0x0004, + 0x3886: 0x0004, 0x3887: 0x0004, 0x3888: 0x0004, 0x3889: 0x0004, 0x388a: 0x0004, 0x388b: 0x0004, + 0x388c: 0x0004, 0x388d: 0x0004, 0x388e: 0x0004, 0x388f: 0x0004, 0x3890: 0x0004, 0x3891: 0x0004, + 0x3892: 0x0004, 0x3893: 0x0004, 0x3894: 0x0004, 0x3895: 0x0004, 0x3896: 0x0004, 0x3897: 0x0004, + 0x3898: 0x0004, 0x3899: 0x0004, 0x389a: 0x0004, 0x389b: 0x0004, 0x389c: 0x0004, 0x389d: 0x0004, + 0x389e: 0x0004, 0x389f: 0x0004, 0x38a0: 0x0004, 0x38a1: 0x0004, 0x38a2: 0x0004, 0x38a3: 0x0004, + 0x38a4: 0x0004, 0x38a5: 0x0004, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x0001, 0x38c1: 0x0005, 0x38c2: 0x0005, 0x38c3: 0x0004, 0x38c4: 0x0004, 0x38c5: 0x0004, + 0x38c6: 0x0004, 0x38c7: 0x0004, 0x38c8: 0x0004, 0x38c9: 0x0004, 0x38ca: 0x0004, 0x38cb: 0x0004, + 0x38cc: 0x0004, 0x38cd: 0x0004, 0x38ce: 0x0004, 0x38cf: 0x0004, 0x38d0: 0x0001, 0x38d1: 0x0001, + 0x38d2: 0x0001, 0x38d3: 0x0001, 0x38d4: 0x0001, 0x38d5: 0x0001, 0x38d6: 0x0001, 0x38d7: 0x0001, + 0x38d8: 0x0001, 0x38d9: 0x0001, 0x38da: 0x0005, 0x38db: 0x0001, 0x38dc: 0x0001, 0x38dd: 0x0001, + 0x38de: 0x0001, 0x38df: 0x0001, 0x38e0: 0x0001, 0x38e1: 0x0001, 0x38e2: 0x0001, 0x38e3: 0x0001, + 0x38e4: 0x0001, 0x38e5: 0x0001, 0x38e6: 0x0001, 0x38e7: 0x0001, 0x38e8: 0x0001, 0x38e9: 0x0001, + 0x38ea: 0x0001, 0x38eb: 0x0001, 0x38ec: 0x0001, 0x38ed: 0x0001, 0x38ee: 0x0001, 0x38ef: 0x0005, + 0x38f0: 0x0001, 0x38f1: 0x0001, 0x38f2: 0x0005, 0x38f3: 0x0005, 0x38f4: 0x0005, 0x38f5: 0x0005, + 0x38f6: 0x0005, 0x38f7: 0x0005, 0x38f8: 0x0005, 0x38f9: 0x0005, 0x38fa: 0x0005, 0x38fb: 0x0001, + 0x38fc: 0x0004, 0x38fd: 0x0004, 0x38fe: 0x0004, 0x38ff: 0x0004, + // Block 0xe4, offset 0x3900 + 0x3900: 0x0001, 0x3901: 0x0001, 0x3902: 0x0001, 0x3903: 0x0001, 0x3904: 0x0001, 0x3905: 0x0001, + 0x3906: 0x0001, 0x3907: 0x0001, 0x3908: 0x0001, 0x3909: 0x0004, 0x390a: 0x0004, 0x390b: 0x0004, + 0x390c: 0x0004, 0x390d: 0x0004, 0x390e: 0x0004, 0x390f: 0x0004, 0x3910: 0x0005, 0x3911: 0x0005, + 0x3912: 0x0004, 0x3913: 0x0004, 0x3914: 0x0004, 0x3915: 0x0004, 0x3916: 0x0004, 0x3917: 0x0004, + 0x3918: 0x0004, 0x3919: 0x0004, 0x391a: 0x0004, 0x391b: 0x0004, 0x391c: 0x0004, 0x391d: 0x0004, + 0x391e: 0x0004, 0x391f: 0x0004, 0x3920: 0x0005, 0x3921: 0x0005, 0x3922: 0x0005, 0x3923: 0x0005, + 0x3924: 0x0005, 0x3925: 0x0005, 0x3926: 0x0004, 0x3927: 0x0004, 0x3928: 0x0004, 0x3929: 0x0004, + 0x392a: 0x0004, 0x392b: 0x0004, 0x392c: 0x0004, 0x392d: 0x0004, 0x392e: 0x0004, 0x392f: 0x0004, + 0x3930: 0x0004, 0x3931: 0x0004, 0x3932: 0x0004, 0x3933: 0x0004, 0x3934: 0x0004, 0x3935: 0x0004, + 0x3936: 0x0004, 0x3937: 0x0004, 0x3938: 0x0004, 0x3939: 0x0004, 0x393a: 0x0004, 0x393b: 0x0004, + 0x393c: 0x0004, 0x393d: 0x0004, 0x393e: 0x0004, 0x393f: 0x0004, + // Block 0xe5, offset 0x3940 + 0x3940: 0x0005, 0x3941: 0x0005, 0x3942: 0x0005, 0x3943: 0x0005, 0x3944: 0x0005, 0x3945: 0x0005, + 0x3946: 0x0005, 0x3947: 0x0005, 0x3948: 0x0005, 0x3949: 0x0005, 0x394a: 0x0005, 0x394b: 0x0005, + 0x394c: 0x0005, 0x394d: 0x0005, 0x394e: 0x0005, 0x394f: 0x0005, 0x3950: 0x0005, 0x3951: 0x0005, + 0x3952: 0x0005, 0x3953: 0x0005, 0x3954: 0x0005, 0x3955: 0x0005, 0x3956: 0x0005, 0x3957: 0x0005, + 0x3958: 0x0005, 0x3959: 0x0005, 0x395a: 0x0005, 0x395b: 0x0005, 0x395c: 0x0005, 0x395d: 0x0005, + 0x395e: 0x0005, 0x395f: 0x0005, 0x3960: 0x0005, 0x3961: 0x0004, 0x3962: 0x0004, 0x3963: 0x0004, + 0x3964: 0x0004, 0x3965: 0x0004, 0x3966: 0x0004, 0x3967: 0x0004, 0x3968: 0x0004, 0x3969: 0x0004, + 0x396a: 0x0004, 0x396b: 0x0004, 0x396c: 0x0004, 0x396d: 0x0005, 0x396e: 0x0005, 0x396f: 0x0005, + 0x3970: 0x0005, 0x3971: 0x0005, 0x3972: 0x0005, 0x3973: 0x0005, 0x3974: 0x0005, 0x3975: 0x0005, + 0x3976: 0x0004, 0x3977: 0x0005, 0x3978: 0x0005, 0x3979: 0x0005, 0x397a: 0x0005, 0x397b: 0x0005, + 0x397c: 0x0005, 0x397d: 0x0005, 0x397e: 0x0005, 0x397f: 0x0005, + // Block 0xe6, offset 0x3980 + 0x3980: 0x0005, 0x3981: 0x0005, 0x3982: 0x0005, 0x3983: 0x0005, 0x3984: 0x0005, 0x3985: 0x0005, + 0x3986: 0x0005, 0x3987: 0x0005, 0x3988: 0x0005, 0x3989: 0x0005, 0x398a: 0x0005, 0x398b: 0x0005, + 0x398c: 0x0005, 0x398d: 0x0005, 0x398e: 0x0005, 0x398f: 0x0005, 0x3990: 0x0005, 0x3991: 0x0005, + 0x3992: 0x0005, 0x3993: 0x0005, 0x3994: 0x0005, 0x3995: 0x0005, 0x3996: 0x0005, 0x3997: 0x0005, + 0x3998: 0x0005, 0x3999: 0x0005, 0x399a: 0x0005, 0x399b: 0x0005, 0x399c: 0x0005, 0x399d: 0x0005, + 0x399e: 0x0005, 0x399f: 0x0005, 0x39a0: 0x0005, 0x39a1: 0x0005, 0x39a2: 0x0005, 0x39a3: 0x0005, + 0x39a4: 0x0005, 0x39a5: 0x0005, 0x39a6: 0x0005, 0x39a7: 0x0005, 0x39a8: 0x0005, 0x39a9: 0x0005, + 0x39aa: 0x0005, 0x39ab: 0x0005, 0x39ac: 0x0005, 0x39ad: 0x0005, 0x39ae: 0x0005, 0x39af: 0x0005, + 0x39b0: 0x0005, 0x39b1: 0x0005, 0x39b2: 0x0005, 0x39b3: 0x0005, 0x39b4: 0x0005, 0x39b5: 0x0005, + 0x39b6: 0x0005, 0x39b7: 0x0005, 0x39b8: 0x0005, 0x39b9: 0x0005, 0x39ba: 0x0005, 0x39bb: 0x0005, + 0x39bc: 0x0005, 0x39bd: 0x0004, 0x39be: 0x0005, 0x39bf: 0x0005, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x0005, 0x39c1: 0x0005, 0x39c2: 0x0005, 0x39c3: 0x0005, 0x39c4: 0x0005, 0x39c5: 0x0005, + 0x39c6: 0x0005, 0x39c7: 0x0005, 0x39c8: 0x0005, 0x39c9: 0x0005, 0x39ca: 0x0005, 0x39cb: 0x0005, + 0x39cc: 0x0005, 0x39cd: 0x0005, 0x39ce: 0x0005, 0x39cf: 0x0005, 0x39d0: 0x0005, 0x39d1: 0x0005, + 0x39d2: 0x0005, 0x39d3: 0x0005, 0x39d4: 0x0004, 0x39d5: 0x0004, 0x39d6: 0x0004, 0x39d7: 0x0004, + 0x39d8: 0x0004, 0x39d9: 0x0004, 0x39da: 0x0004, 0x39db: 0x0004, 0x39dc: 0x0004, 0x39dd: 0x0004, + 0x39de: 0x0004, 0x39df: 0x0004, 0x39e0: 0x0005, 0x39e1: 0x0005, 0x39e2: 0x0005, 0x39e3: 0x0005, + 0x39e4: 0x0005, 0x39e5: 0x0005, 0x39e6: 0x0005, 0x39e7: 0x0005, 0x39e8: 0x0005, 0x39e9: 0x0005, + 0x39ea: 0x0005, 0x39eb: 0x0005, 0x39ec: 0x0005, 0x39ed: 0x0005, 0x39ee: 0x0005, 0x39ef: 0x0005, + 0x39f0: 0x0005, 0x39f1: 0x0005, 0x39f2: 0x0005, 0x39f3: 0x0005, 0x39f4: 0x0005, 0x39f5: 0x0005, + 0x39f6: 0x0005, 0x39f7: 0x0005, 0x39f8: 0x0005, 0x39f9: 0x0005, 0x39fa: 0x0005, 0x39fb: 0x0005, + 0x39fc: 0x0005, 0x39fd: 0x0005, 0x39fe: 0x0005, 0x39ff: 0x0005, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0005, 0x3a01: 0x0005, 0x3a02: 0x0005, 0x3a03: 0x0005, 0x3a04: 0x0005, 0x3a05: 0x0005, + 0x3a06: 0x0005, 0x3a07: 0x0005, 0x3a08: 0x0005, 0x3a09: 0x0005, 0x3a0a: 0x0005, 0x3a0b: 0x0004, + 0x3a0c: 0x0004, 0x3a0d: 0x0004, 0x3a0e: 0x0004, 0x3a0f: 0x0005, 0x3a10: 0x0005, 0x3a11: 0x0005, + 0x3a12: 0x0005, 0x3a13: 0x0005, 0x3a14: 0x0004, 0x3a15: 0x0004, 0x3a16: 0x0004, 0x3a17: 0x0004, + 0x3a18: 0x0004, 0x3a19: 0x0004, 0x3a1a: 0x0004, 0x3a1b: 0x0004, 0x3a1c: 0x0004, 0x3a1d: 0x0004, + 0x3a1e: 0x0004, 0x3a1f: 0x0004, 0x3a20: 0x0005, 0x3a21: 0x0005, 0x3a22: 0x0005, 0x3a23: 0x0005, + 0x3a24: 0x0005, 0x3a25: 0x0005, 0x3a26: 0x0005, 0x3a27: 0x0005, 0x3a28: 0x0005, 0x3a29: 0x0005, + 0x3a2a: 0x0005, 0x3a2b: 0x0005, 0x3a2c: 0x0005, 0x3a2d: 0x0005, 0x3a2e: 0x0005, 0x3a2f: 0x0005, + 0x3a30: 0x0005, 0x3a31: 0x0004, 0x3a32: 0x0004, 0x3a33: 0x0004, 0x3a34: 0x0005, 0x3a35: 0x0004, + 0x3a36: 0x0004, 0x3a37: 0x0004, 0x3a38: 0x0005, 0x3a39: 0x0005, 0x3a3a: 0x0005, 0x3a3b: 0x0001, + 0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0005, 0x3a41: 0x0005, 0x3a42: 0x0005, 0x3a43: 0x0005, 0x3a44: 0x0005, 0x3a45: 0x0005, + 0x3a46: 0x0005, 0x3a47: 0x0005, 0x3a48: 0x0005, 0x3a49: 0x0005, 0x3a4a: 0x0005, 0x3a4b: 0x0005, + 0x3a4c: 0x0005, 0x3a4d: 0x0005, 0x3a4e: 0x0005, 0x3a4f: 0x0005, 0x3a50: 0x0005, 0x3a51: 0x0005, + 0x3a52: 0x0005, 0x3a53: 0x0005, 0x3a54: 0x0005, 0x3a55: 0x0005, 0x3a56: 0x0005, 0x3a57: 0x0005, + 0x3a58: 0x0005, 0x3a59: 0x0005, 0x3a5a: 0x0005, 0x3a5b: 0x0005, 0x3a5c: 0x0005, 0x3a5d: 0x0005, + 0x3a5e: 0x0005, 0x3a5f: 0x0005, 0x3a60: 0x0005, 0x3a61: 0x0005, 0x3a62: 0x0005, 0x3a63: 0x0005, + 0x3a64: 0x0005, 0x3a65: 0x0005, 0x3a66: 0x0005, 0x3a67: 0x0005, 0x3a68: 0x0005, 0x3a69: 0x0005, + 0x3a6a: 0x0005, 0x3a6b: 0x0005, 0x3a6c: 0x0005, 0x3a6d: 0x0005, 0x3a6e: 0x0005, 0x3a6f: 0x0005, + 0x3a70: 0x0005, 0x3a71: 0x0005, 0x3a72: 0x0005, 0x3a73: 0x0005, 0x3a74: 0x0005, 0x3a75: 0x0005, + 0x3a76: 0x0005, 0x3a77: 0x0005, 0x3a78: 0x0005, 0x3a79: 0x0005, 0x3a7a: 0x0005, 0x3a7b: 0x0005, + 0x3a7c: 0x0005, 0x3a7d: 0x0005, 0x3a7e: 0x0005, 0x3a7f: 0x0004, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0005, 0x3a81: 0x0004, 0x3a82: 0x0005, 0x3a83: 0x0005, 0x3a84: 0x0005, 0x3a85: 0x0005, + 0x3a86: 0x0005, 0x3a87: 0x0005, 0x3a88: 0x0005, 0x3a89: 0x0005, 0x3a8a: 0x0005, 0x3a8b: 0x0005, + 0x3a8c: 0x0005, 0x3a8d: 0x0005, 0x3a8e: 0x0005, 0x3a8f: 0x0005, 0x3a90: 0x0005, 0x3a91: 0x0005, + 0x3a92: 0x0005, 0x3a93: 0x0005, 0x3a94: 0x0005, 0x3a95: 0x0005, 0x3a96: 0x0005, 0x3a97: 0x0005, + 0x3a98: 0x0005, 0x3a99: 0x0005, 0x3a9a: 0x0005, 0x3a9b: 0x0005, 0x3a9c: 0x0005, 0x3a9d: 0x0005, + 0x3a9e: 0x0005, 0x3a9f: 0x0005, 0x3aa0: 0x0005, 0x3aa1: 0x0005, 0x3aa2: 0x0005, 0x3aa3: 0x0005, + 0x3aa4: 0x0005, 0x3aa5: 0x0005, 0x3aa6: 0x0005, 0x3aa7: 0x0005, 0x3aa8: 0x0005, 0x3aa9: 0x0005, + 0x3aaa: 0x0005, 0x3aab: 0x0005, 0x3aac: 0x0005, 0x3aad: 0x0005, 0x3aae: 0x0005, 0x3aaf: 0x0005, + 0x3ab0: 0x0005, 0x3ab1: 0x0005, 0x3ab2: 0x0005, 0x3ab3: 0x0005, 0x3ab4: 0x0005, 0x3ab5: 0x0005, + 0x3ab6: 0x0005, 0x3ab7: 0x0005, 0x3ab8: 0x0005, 0x3ab9: 0x0005, 0x3aba: 0x0005, 0x3abb: 0x0005, + 0x3abc: 0x0005, 0x3abd: 0x0005, 0x3abe: 0x0005, 0x3abf: 0x0005, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x0005, 0x3ac1: 0x0005, 0x3ac2: 0x0005, 0x3ac3: 0x0005, 0x3ac4: 0x0005, 0x3ac5: 0x0005, + 0x3ac6: 0x0005, 0x3ac7: 0x0005, 0x3ac8: 0x0005, 0x3ac9: 0x0005, 0x3aca: 0x0005, 0x3acb: 0x0005, + 0x3acc: 0x0005, 0x3acd: 0x0005, 0x3ace: 0x0005, 0x3acf: 0x0005, 0x3ad0: 0x0005, 0x3ad1: 0x0005, + 0x3ad2: 0x0005, 0x3ad3: 0x0005, 0x3ad4: 0x0005, 0x3ad5: 0x0005, 0x3ad6: 0x0005, 0x3ad7: 0x0005, + 0x3ad8: 0x0005, 0x3ad9: 0x0005, 0x3ada: 0x0005, 0x3adb: 0x0005, 0x3adc: 0x0005, 0x3add: 0x0005, + 0x3ade: 0x0005, 0x3adf: 0x0005, 0x3ae0: 0x0005, 0x3ae1: 0x0005, 0x3ae2: 0x0005, 0x3ae3: 0x0005, + 0x3ae4: 0x0005, 0x3ae5: 0x0005, 0x3ae6: 0x0005, 0x3ae7: 0x0005, 0x3ae8: 0x0005, 0x3ae9: 0x0005, + 0x3aea: 0x0005, 0x3aeb: 0x0005, 0x3aec: 0x0005, 0x3aed: 0x0005, 0x3aee: 0x0005, 0x3aef: 0x0005, + 0x3af0: 0x0005, 0x3af1: 0x0005, 0x3af2: 0x0005, 0x3af3: 0x0005, 0x3af4: 0x0005, 0x3af5: 0x0005, + 0x3af6: 0x0005, 0x3af7: 0x0005, 0x3af8: 0x0005, 0x3af9: 0x0005, 0x3afa: 0x0005, 0x3afb: 0x0005, + 0x3afc: 0x0005, 0x3afd: 0x0005, 0x3afe: 0x0005, 0x3aff: 0x0005, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0005, 0x3b01: 0x0005, 0x3b02: 0x0005, 0x3b03: 0x0005, 0x3b04: 0x0005, 0x3b05: 0x0005, + 0x3b06: 0x0005, 0x3b07: 0x0005, 0x3b08: 0x0005, 0x3b09: 0x0005, 0x3b0a: 0x0005, 0x3b0b: 0x0005, + 0x3b0c: 0x0005, 0x3b0d: 0x0005, 0x3b0e: 0x0005, 0x3b0f: 0x0005, 0x3b10: 0x0005, 0x3b11: 0x0005, + 0x3b12: 0x0005, 0x3b13: 0x0005, 0x3b14: 0x0005, 0x3b15: 0x0005, 0x3b16: 0x0005, 0x3b17: 0x0005, + 0x3b18: 0x0005, 0x3b19: 0x0005, 0x3b1a: 0x0005, 0x3b1b: 0x0005, 0x3b1c: 0x0005, 0x3b1d: 0x0005, + 0x3b1e: 0x0005, 0x3b1f: 0x0005, 0x3b20: 0x0005, 0x3b21: 0x0005, 0x3b22: 0x0005, 0x3b23: 0x0005, + 0x3b24: 0x0005, 0x3b25: 0x0005, 0x3b26: 0x0005, 0x3b27: 0x0005, 0x3b28: 0x0005, 0x3b29: 0x0005, + 0x3b2a: 0x0005, 0x3b2b: 0x0005, 0x3b2c: 0x0005, 0x3b2d: 0x0005, 0x3b2e: 0x0005, 0x3b2f: 0x0005, + 0x3b30: 0x0005, 0x3b31: 0x0005, 0x3b32: 0x0005, 0x3b33: 0x0005, 0x3b34: 0x0005, 0x3b35: 0x0005, + 0x3b36: 0x0005, 0x3b37: 0x0005, 0x3b38: 0x0005, 0x3b39: 0x0005, 0x3b3a: 0x0005, 0x3b3b: 0x0005, + 0x3b3c: 0x0005, 0x3b3d: 0x0004, 0x3b3e: 0x0004, 0x3b3f: 0x0005, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x0005, 0x3b41: 0x0005, 0x3b42: 0x0005, 0x3b43: 0x0005, 0x3b44: 0x0005, 0x3b45: 0x0005, + 0x3b46: 0x0005, 0x3b47: 0x0005, 0x3b48: 0x0005, 0x3b49: 0x0005, 0x3b4a: 0x0005, 0x3b4b: 0x0005, + 0x3b4c: 0x0005, 0x3b4d: 0x0005, 0x3b4e: 0x0005, 0x3b4f: 0x0005, 0x3b50: 0x0005, 0x3b51: 0x0005, + 0x3b52: 0x0005, 0x3b53: 0x0005, 0x3b54: 0x0005, 0x3b55: 0x0005, 0x3b56: 0x0005, 0x3b57: 0x0005, + 0x3b58: 0x0005, 0x3b59: 0x0005, 0x3b5a: 0x0005, 0x3b5b: 0x0005, 0x3b5c: 0x0005, 0x3b5d: 0x0005, + 0x3b5e: 0x0005, 0x3b5f: 0x0005, 0x3b60: 0x0005, 0x3b61: 0x0005, 0x3b62: 0x0005, 0x3b63: 0x0005, + 0x3b64: 0x0005, 0x3b65: 0x0005, 0x3b66: 0x0005, 0x3b67: 0x0005, 0x3b68: 0x0005, 0x3b69: 0x0005, + 0x3b6a: 0x0005, 0x3b6b: 0x0005, 0x3b6c: 0x0005, 0x3b6d: 0x0005, 0x3b6e: 0x0005, 0x3b6f: 0x0005, + 0x3b70: 0x0005, 0x3b71: 0x0005, 0x3b72: 0x0005, 0x3b73: 0x0005, 0x3b74: 0x0005, 0x3b75: 0x0005, + 0x3b76: 0x0005, 0x3b77: 0x0005, 0x3b78: 0x0005, 0x3b79: 0x0005, 0x3b7a: 0x0005, 0x3b7b: 0x0005, + 0x3b7c: 0x0005, 0x3b7d: 0x0005, + // Block 0xee, offset 0x3b80 + 0x3b86: 0x0004, 0x3b87: 0x0004, 0x3b88: 0x0004, 0x3b89: 0x0004, 0x3b8a: 0x0004, 0x3b8b: 0x0005, + 0x3b8c: 0x0005, 0x3b8d: 0x0005, 0x3b8e: 0x0005, 0x3b8f: 0x0004, 0x3b90: 0x0005, 0x3b91: 0x0005, + 0x3b92: 0x0005, 0x3b93: 0x0005, 0x3b94: 0x0005, 0x3b95: 0x0005, 0x3b96: 0x0005, 0x3b97: 0x0005, + 0x3b98: 0x0005, 0x3b99: 0x0005, 0x3b9a: 0x0005, 0x3b9b: 0x0005, 0x3b9c: 0x0005, 0x3b9d: 0x0005, + 0x3b9e: 0x0005, 0x3b9f: 0x0005, 0x3ba0: 0x0005, 0x3ba1: 0x0005, 0x3ba2: 0x0005, 0x3ba3: 0x0005, + 0x3ba4: 0x0005, 0x3ba5: 0x0005, 0x3ba6: 0x0005, 0x3ba7: 0x0005, 0x3ba8: 0x0004, 0x3ba9: 0x0004, + 0x3baa: 0x0004, 0x3bab: 0x0004, 0x3bac: 0x0004, 0x3bad: 0x0004, 0x3bae: 0x0004, 0x3baf: 0x0004, + 0x3bb0: 0x0004, 0x3bb1: 0x0004, 0x3bb2: 0x0004, 0x3bb3: 0x0004, 0x3bb4: 0x0004, 0x3bb5: 0x0004, + 0x3bb6: 0x0004, 0x3bb7: 0x0004, 0x3bb8: 0x0004, 0x3bb9: 0x0004, 0x3bba: 0x0005, 0x3bbb: 0x0004, + 0x3bbc: 0x0004, 0x3bbd: 0x0004, 0x3bbe: 0x0004, 0x3bbf: 0x0004, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x0004, 0x3bc1: 0x0004, 0x3bc2: 0x0004, 0x3bc3: 0x0004, 0x3bc4: 0x0004, 0x3bc5: 0x0004, + 0x3bc6: 0x0004, 0x3bc7: 0x0004, 0x3bc8: 0x0004, 0x3bc9: 0x0004, 0x3bca: 0x0004, 0x3bcb: 0x0004, + 0x3bcc: 0x0004, 0x3bcd: 0x0004, 0x3bce: 0x0004, 0x3bcf: 0x0004, 0x3bd0: 0x0004, 0x3bd1: 0x0004, + 0x3bd2: 0x0004, 0x3bd3: 0x0004, 0x3bd4: 0x0004, 0x3bd5: 0x0005, 0x3bd6: 0x0005, 0x3bd7: 0x0004, + 0x3bd8: 0x0004, 0x3bd9: 0x0004, 0x3bda: 0x0004, 0x3bdb: 0x0004, 0x3bdc: 0x0004, 0x3bdd: 0x0004, + 0x3bde: 0x0004, 0x3bdf: 0x0004, 0x3be0: 0x0004, 0x3be1: 0x0004, 0x3be2: 0x0004, 0x3be3: 0x0004, + 0x3be4: 0x0005, 0x3be5: 0x0004, 0x3be6: 0x0004, 0x3be7: 0x0004, 0x3be8: 0x0004, 0x3be9: 0x0004, + 0x3bea: 0x0004, 0x3beb: 0x0004, 0x3bec: 0x0004, 0x3bed: 0x0004, 0x3bee: 0x0004, 0x3bef: 0x0004, + 0x3bf0: 0x0004, 0x3bf1: 0x0004, 0x3bf2: 0x0004, 0x3bf3: 0x0004, 0x3bf4: 0x0004, 0x3bf5: 0x0004, + 0x3bf6: 0x0004, 0x3bf7: 0x0004, 0x3bf8: 0x0004, 0x3bf9: 0x0004, 0x3bfa: 0x0004, 0x3bfb: 0x0004, + 0x3bfc: 0x0004, 0x3bfd: 0x0004, 0x3bfe: 0x0004, 0x3bff: 0x0004, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x0004, 0x3c01: 0x0004, 0x3c02: 0x0004, 0x3c03: 0x0004, 0x3c04: 0x0004, 0x3c05: 0x0004, + 0x3c06: 0x0004, 0x3c07: 0x0004, 0x3c08: 0x0004, 0x3c09: 0x0004, 0x3c0a: 0x0004, 0x3c0b: 0x0004, + 0x3c0c: 0x0004, 0x3c0d: 0x0004, 0x3c0e: 0x0004, 0x3c0f: 0x0004, 0x3c10: 0x0004, 0x3c11: 0x0004, + 0x3c12: 0x0004, 0x3c13: 0x0004, 0x3c14: 0x0004, 0x3c15: 0x0004, 0x3c16: 0x0004, 0x3c17: 0x0004, + 0x3c18: 0x0004, 0x3c19: 0x0004, 0x3c1a: 0x0004, 0x3c1b: 0x0004, 0x3c1c: 0x0004, 0x3c1d: 0x0004, + 0x3c1e: 0x0004, 0x3c1f: 0x0004, 0x3c20: 0x0004, 0x3c21: 0x0004, 0x3c22: 0x0004, 0x3c23: 0x0004, + 0x3c24: 0x0004, 0x3c25: 0x0004, 0x3c26: 0x0004, 0x3c27: 0x0004, 0x3c28: 0x0004, 0x3c29: 0x0004, + 0x3c2a: 0x0004, 0x3c2b: 0x0004, 0x3c2c: 0x0004, 0x3c2d: 0x0004, 0x3c2e: 0x0004, 0x3c2f: 0x0004, + 0x3c30: 0x0004, 0x3c31: 0x0004, 0x3c32: 0x0004, 0x3c33: 0x0004, 0x3c34: 0x0004, 0x3c35: 0x0004, + 0x3c36: 0x0004, 0x3c37: 0x0004, 0x3c38: 0x0004, 0x3c39: 0x0004, 0x3c3a: 0x0004, 0x3c3b: 0x0005, + 0x3c3c: 0x0005, 0x3c3d: 0x0005, 0x3c3e: 0x0005, 0x3c3f: 0x0005, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0005, 0x3c41: 0x0005, 0x3c42: 0x0005, 0x3c43: 0x0005, 0x3c44: 0x0005, 0x3c45: 0x0005, + 0x3c46: 0x0005, 0x3c47: 0x0005, 0x3c48: 0x0005, 0x3c49: 0x0005, 0x3c4a: 0x0005, 0x3c4b: 0x0005, + 0x3c4c: 0x0005, 0x3c4d: 0x0005, 0x3c4e: 0x0005, 0x3c4f: 0x0005, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x0005, 0x3c81: 0x0005, 0x3c82: 0x0005, 0x3c83: 0x0005, 0x3c84: 0x0005, 0x3c85: 0x0005, + 0x3c86: 0x0004, 0x3c87: 0x0004, 0x3c88: 0x0004, 0x3c89: 0x0004, 0x3c8a: 0x0004, 0x3c8b: 0x0004, + 0x3c8c: 0x0005, 0x3c8d: 0x0004, 0x3c8e: 0x0004, 0x3c8f: 0x0004, 0x3c90: 0x0005, 0x3c91: 0x0005, + 0x3c92: 0x0005, 0x3c93: 0x0004, 0x3c94: 0x0004, 0x3c95: 0x0005, 0x3c96: 0x0005, 0x3c97: 0x0005, + 0x3c98: 0x0004, 0x3c99: 0x0004, 0x3c9a: 0x0004, 0x3c9b: 0x0004, 0x3c9c: 0x0005, 0x3c9d: 0x0005, + 0x3c9e: 0x0005, 0x3c9f: 0x0005, 0x3ca0: 0x0004, 0x3ca1: 0x0004, 0x3ca2: 0x0004, 0x3ca3: 0x0004, + 0x3ca4: 0x0004, 0x3ca5: 0x0004, 0x3ca6: 0x0004, 0x3ca7: 0x0004, 0x3ca8: 0x0004, 0x3ca9: 0x0004, + 0x3caa: 0x0004, 0x3cab: 0x0005, 0x3cac: 0x0005, 0x3cad: 0x0004, 0x3cae: 0x0004, 0x3caf: 0x0004, + 0x3cb0: 0x0004, 0x3cb1: 0x0004, 0x3cb2: 0x0004, 0x3cb3: 0x0004, 0x3cb4: 0x0005, 0x3cb5: 0x0005, + 0x3cb6: 0x0005, 0x3cb7: 0x0005, 0x3cb8: 0x0005, 0x3cb9: 0x0005, 0x3cba: 0x0005, 0x3cbb: 0x0005, + 0x3cbc: 0x0005, 0x3cbd: 0x0004, 0x3cbe: 0x0004, 0x3cbf: 0x0004, + // Block 0xf3, offset 0x3cc0 + 0x3cf4: 0x0004, 0x3cf5: 0x0004, + 0x3cf6: 0x0004, 0x3cf7: 0x0004, 0x3cf8: 0x0004, 0x3cf9: 0x0004, 0x3cfa: 0x0004, 0x3cfb: 0x0004, + 0x3cfc: 0x0004, 0x3cfd: 0x0004, 0x3cfe: 0x0004, 0x3cff: 0x0004, + // Block 0xf4, offset 0x3d00 + 0x3d15: 0x0004, 0x3d16: 0x0004, 0x3d17: 0x0004, + 0x3d18: 0x0004, 0x3d19: 0x0004, 0x3d1a: 0x0004, 0x3d1b: 0x0004, 0x3d1c: 0x0004, 0x3d1d: 0x0004, + 0x3d1e: 0x0004, 0x3d1f: 0x0004, 0x3d20: 0x0005, 0x3d21: 0x0005, 0x3d22: 0x0005, 0x3d23: 0x0005, + 0x3d24: 0x0005, 0x3d25: 0x0005, 0x3d26: 0x0005, 0x3d27: 0x0005, 0x3d28: 0x0005, 0x3d29: 0x0005, + 0x3d2a: 0x0005, 0x3d2b: 0x0005, 0x3d2c: 0x0004, 0x3d2d: 0x0004, 0x3d2e: 0x0004, 0x3d2f: 0x0004, + 0x3d30: 0x0005, 0x3d31: 0x0004, 0x3d32: 0x0004, 0x3d33: 0x0004, 0x3d34: 0x0004, 0x3d35: 0x0004, + 0x3d36: 0x0004, 0x3d37: 0x0004, 0x3d38: 0x0004, 0x3d39: 0x0004, 0x3d3a: 0x0004, 0x3d3b: 0x0004, + 0x3d3c: 0x0004, 0x3d3d: 0x0004, 0x3d3e: 0x0004, 0x3d3f: 0x0004, + // Block 0xf5, offset 0x3d40 + 0x3d4c: 0x0004, 0x3d4d: 0x0004, 0x3d4e: 0x0004, 0x3d4f: 0x0004, + // Block 0xf6, offset 0x3d80 + 0x3d88: 0x0004, 0x3d89: 0x0004, 0x3d8a: 0x0004, 0x3d8b: 0x0004, + 0x3d8c: 0x0004, 0x3d8d: 0x0004, 0x3d8e: 0x0004, 0x3d8f: 0x0004, + 0x3d9a: 0x0004, 0x3d9b: 0x0004, 0x3d9c: 0x0004, 0x3d9d: 0x0004, + 0x3d9e: 0x0004, 0x3d9f: 0x0004, + // Block 0xf7, offset 0x3dc0 + 0x3dc8: 0x0004, 0x3dc9: 0x0004, 0x3dca: 0x0004, 0x3dcb: 0x0004, + 0x3dcc: 0x0004, 0x3dcd: 0x0004, 0x3dce: 0x0004, 0x3dcf: 0x0004, + 0x3dee: 0x0004, 0x3def: 0x0004, + 0x3df0: 0x0004, 0x3df1: 0x0004, 0x3df2: 0x0004, 0x3df3: 0x0004, 0x3df4: 0x0004, 0x3df5: 0x0004, + 0x3df6: 0x0004, 0x3df7: 0x0004, 0x3df8: 0x0004, 0x3df9: 0x0004, 0x3dfa: 0x0004, 0x3dfb: 0x0004, + 0x3dfc: 0x0004, 0x3dfd: 0x0004, 0x3dfe: 0x0004, 0x3dff: 0x0004, + // Block 0xf8, offset 0x3e00 + 0x3e0c: 0x0005, 0x3e0d: 0x0005, 0x3e0e: 0x0005, 0x3e0f: 0x0005, 0x3e10: 0x0005, 0x3e11: 0x0005, + 0x3e12: 0x0005, 0x3e13: 0x0005, 0x3e14: 0x0005, 0x3e15: 0x0005, 0x3e16: 0x0005, 0x3e17: 0x0005, + 0x3e18: 0x0005, 0x3e19: 0x0005, 0x3e1a: 0x0005, 0x3e1b: 0x0005, 0x3e1c: 0x0005, 0x3e1d: 0x0005, + 0x3e1e: 0x0005, 0x3e1f: 0x0005, 0x3e20: 0x0005, 0x3e21: 0x0005, 0x3e22: 0x0005, 0x3e23: 0x0005, + 0x3e24: 0x0005, 0x3e25: 0x0005, 0x3e26: 0x0005, 0x3e27: 0x0005, 0x3e28: 0x0005, 0x3e29: 0x0005, + 0x3e2a: 0x0005, 0x3e2b: 0x0005, 0x3e2c: 0x0005, 0x3e2d: 0x0005, 0x3e2e: 0x0005, 0x3e2f: 0x0005, + 0x3e30: 0x0005, 0x3e31: 0x0005, 0x3e32: 0x0005, 0x3e33: 0x0005, 0x3e34: 0x0005, 0x3e35: 0x0005, + 0x3e36: 0x0005, 0x3e37: 0x0005, 0x3e38: 0x0005, 0x3e39: 0x0005, 0x3e3a: 0x0005, + 0x3e3c: 0x0005, 0x3e3d: 0x0005, 0x3e3e: 0x0005, 0x3e3f: 0x0005, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x0005, 0x3e41: 0x0005, 0x3e42: 0x0005, 0x3e43: 0x0005, 0x3e44: 0x0005, 0x3e45: 0x0005, + 0x3e47: 0x0005, 0x3e48: 0x0005, 0x3e49: 0x0005, 0x3e4a: 0x0005, 0x3e4b: 0x0005, + 0x3e4c: 0x0005, 0x3e4d: 0x0005, 0x3e4e: 0x0005, 0x3e4f: 0x0005, 0x3e50: 0x0005, 0x3e51: 0x0005, + 0x3e52: 0x0005, 0x3e53: 0x0005, 0x3e54: 0x0005, 0x3e55: 0x0005, 0x3e56: 0x0005, 0x3e57: 0x0005, + 0x3e58: 0x0005, 0x3e59: 0x0005, 0x3e5a: 0x0005, 0x3e5b: 0x0005, 0x3e5c: 0x0005, 0x3e5d: 0x0005, + 0x3e5e: 0x0005, 0x3e5f: 0x0005, 0x3e60: 0x0005, 0x3e61: 0x0005, 0x3e62: 0x0005, 0x3e63: 0x0005, + 0x3e64: 0x0005, 0x3e65: 0x0005, 0x3e66: 0x0005, 0x3e67: 0x0005, 0x3e68: 0x0005, 0x3e69: 0x0005, + 0x3e6a: 0x0005, 0x3e6b: 0x0005, 0x3e6c: 0x0005, 0x3e6d: 0x0005, 0x3e6e: 0x0005, 0x3e6f: 0x0005, + 0x3e70: 0x0005, 0x3e71: 0x0005, 0x3e72: 0x0005, 0x3e73: 0x0005, 0x3e74: 0x0005, 0x3e75: 0x0005, + 0x3e76: 0x0005, 0x3e77: 0x0005, 0x3e78: 0x0005, 0x3e79: 0x0005, 0x3e7a: 0x0005, 0x3e7b: 0x0005, + 0x3e7c: 0x0005, 0x3e7d: 0x0005, 0x3e7e: 0x0005, 0x3e7f: 0x0005, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x0004, 0x3e81: 0x0004, 0x3e82: 0x0004, 0x3e83: 0x0004, 0x3e84: 0x0004, 0x3e85: 0x0004, + 0x3e86: 0x0004, 0x3e87: 0x0004, 0x3e88: 0x0004, 0x3e89: 0x0004, 0x3e8a: 0x0004, 0x3e8b: 0x0004, + 0x3e8c: 0x0004, 0x3e8d: 0x0004, 0x3e8e: 0x0004, 0x3e8f: 0x0004, 0x3e90: 0x0004, 0x3e91: 0x0004, + 0x3e92: 0x0004, 0x3e93: 0x0004, 0x3e94: 0x0004, 0x3e95: 0x0004, 0x3e96: 0x0004, 0x3e97: 0x0004, + 0x3e98: 0x0004, 0x3e99: 0x0004, 0x3e9a: 0x0004, 0x3e9b: 0x0004, 0x3e9c: 0x0004, 0x3e9d: 0x0004, + 0x3e9e: 0x0004, 0x3e9f: 0x0004, 0x3ea0: 0x0004, 0x3ea1: 0x0004, 0x3ea2: 0x0004, 0x3ea3: 0x0004, + 0x3ea4: 0x0004, 0x3ea5: 0x0004, 0x3ea6: 0x0004, 0x3ea7: 0x0004, 0x3ea8: 0x0004, 0x3ea9: 0x0004, + 0x3eaa: 0x0004, 0x3eab: 0x0004, 0x3eac: 0x0004, 0x3ead: 0x0004, 0x3eae: 0x0004, 0x3eaf: 0x0004, + 0x3eb0: 0x0005, 0x3eb1: 0x0005, 0x3eb2: 0x0005, 0x3eb3: 0x0005, 0x3eb4: 0x0005, 0x3eb5: 0x0005, + 0x3eb6: 0x0005, 0x3eb7: 0x0005, 0x3eb8: 0x0005, 0x3eb9: 0x0005, 0x3eba: 0x0005, 0x3ebb: 0x0005, + 0x3ebc: 0x0005, 0x3ebd: 0x0004, 0x3ebe: 0x0004, 0x3ebf: 0x0004, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x0005, 0x3ec1: 0x0005, 0x3ec2: 0x0005, 0x3ec3: 0x0005, 0x3ec4: 0x0005, 0x3ec5: 0x0005, + 0x3ec6: 0x0005, 0x3ec7: 0x0005, 0x3ec8: 0x0005, 0x3ec9: 0x0004, 0x3eca: 0x0004, 0x3ecb: 0x0004, + 0x3ecc: 0x0004, 0x3ecd: 0x0004, 0x3ece: 0x0004, 0x3ecf: 0x0004, 0x3ed0: 0x0005, 0x3ed1: 0x0005, + 0x3ed2: 0x0005, 0x3ed3: 0x0005, 0x3ed4: 0x0005, 0x3ed5: 0x0005, 0x3ed6: 0x0005, 0x3ed7: 0x0005, + 0x3ed8: 0x0005, 0x3ed9: 0x0005, 0x3eda: 0x0005, 0x3edb: 0x0005, 0x3edc: 0x0005, 0x3edd: 0x0005, + 0x3ede: 0x0005, 0x3edf: 0x0005, 0x3ee0: 0x0005, 0x3ee1: 0x0005, 0x3ee2: 0x0005, 0x3ee3: 0x0005, + 0x3ee4: 0x0005, 0x3ee5: 0x0005, 0x3ee6: 0x0005, 0x3ee7: 0x0005, 0x3ee8: 0x0005, 0x3ee9: 0x0005, + 0x3eea: 0x0005, 0x3eeb: 0x0005, 0x3eec: 0x0005, 0x3eed: 0x0005, 0x3eee: 0x0005, 0x3eef: 0x0005, + 0x3ef0: 0x0005, 0x3ef1: 0x0005, 0x3ef2: 0x0005, 0x3ef3: 0x0005, 0x3ef4: 0x0005, 0x3ef5: 0x0005, + 0x3ef6: 0x0005, 0x3ef7: 0x0005, 0x3ef8: 0x0005, 0x3ef9: 0x0005, 0x3efa: 0x0005, 0x3efb: 0x0005, + 0x3efc: 0x0005, 0x3efd: 0x0005, 0x3efe: 0x0004, 0x3eff: 0x0005, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x0005, 0x3f01: 0x0005, 0x3f02: 0x0005, 0x3f03: 0x0005, 0x3f04: 0x0005, 0x3f05: 0x0005, + 0x3f06: 0x0004, 0x3f07: 0x0004, 0x3f08: 0x0004, 0x3f09: 0x0004, 0x3f0a: 0x0004, 0x3f0b: 0x0004, + 0x3f0c: 0x0004, 0x3f0d: 0x0004, 0x3f0e: 0x0005, 0x3f0f: 0x0005, 0x3f10: 0x0005, 0x3f11: 0x0005, + 0x3f12: 0x0005, 0x3f13: 0x0005, 0x3f14: 0x0005, 0x3f15: 0x0005, 0x3f16: 0x0005, 0x3f17: 0x0005, + 0x3f18: 0x0005, 0x3f19: 0x0005, 0x3f1a: 0x0005, 0x3f1b: 0x0005, 0x3f1c: 0x0004, 0x3f1d: 0x0004, + 0x3f1e: 0x0004, 0x3f1f: 0x0004, 0x3f20: 0x0005, 0x3f21: 0x0005, 0x3f22: 0x0005, 0x3f23: 0x0005, + 0x3f24: 0x0005, 0x3f25: 0x0005, 0x3f26: 0x0005, 0x3f27: 0x0005, 0x3f28: 0x0005, 0x3f29: 0x0004, + 0x3f2a: 0x0004, 0x3f2b: 0x0004, 0x3f2c: 0x0004, 0x3f2d: 0x0004, 0x3f2e: 0x0004, 0x3f2f: 0x0004, + 0x3f30: 0x0005, 0x3f31: 0x0005, 0x3f32: 0x0005, 0x3f33: 0x0005, 0x3f34: 0x0005, 0x3f35: 0x0005, + 0x3f36: 0x0005, 0x3f37: 0x0005, 0x3f38: 0x0005, 0x3f39: 0x0004, 0x3f3a: 0x0004, 0x3f3b: 0x0004, + 0x3f3c: 0x0004, 0x3f3d: 0x0004, 0x3f3e: 0x0004, 0x3f3f: 0x0004, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x0004, 0x3f41: 0x0004, 0x3f42: 0x0004, 0x3f43: 0x0004, 0x3f44: 0x0004, 0x3f45: 0x0004, + 0x3f46: 0x0004, 0x3f47: 0x0004, 0x3f48: 0x0004, 0x3f49: 0x0004, 0x3f4a: 0x0004, 0x3f4b: 0x0004, + 0x3f4c: 0x0004, 0x3f4d: 0x0004, 0x3f4e: 0x0004, 0x3f4f: 0x0004, 0x3f50: 0x0004, 0x3f51: 0x0004, + 0x3f52: 0x0004, 0x3f53: 0x0004, 0x3f54: 0x0004, 0x3f55: 0x0004, 0x3f56: 0x0004, 0x3f57: 0x0004, + 0x3f58: 0x0004, 0x3f59: 0x0004, 0x3f5a: 0x0004, 0x3f5b: 0x0004, 0x3f5c: 0x0004, 0x3f5d: 0x0004, + 0x3f5e: 0x0004, 0x3f5f: 0x0004, 0x3f60: 0x0004, 0x3f61: 0x0004, 0x3f62: 0x0004, 0x3f63: 0x0004, + 0x3f64: 0x0004, 0x3f65: 0x0004, 0x3f66: 0x0004, 0x3f67: 0x0004, 0x3f68: 0x0004, 0x3f69: 0x0004, + 0x3f6a: 0x0004, 0x3f6b: 0x0004, 0x3f6c: 0x0004, 0x3f6d: 0x0004, 0x3f6e: 0x0004, 0x3f6f: 0x0004, + 0x3f70: 0x0004, 0x3f71: 0x0004, 0x3f72: 0x0004, 0x3f73: 0x0004, 0x3f74: 0x0004, 0x3f75: 0x0004, + 0x3f76: 0x0004, 0x3f77: 0x0004, 0x3f78: 0x0004, 0x3f79: 0x0004, 0x3f7a: 0x0004, 0x3f7b: 0x0004, + 0x3f7c: 0x0004, 0x3f7d: 0x0004, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x0001, 0x3f81: 0x0001, 0x3f82: 0x0001, 0x3f83: 0x0001, 0x3f84: 0x0001, 0x3f85: 0x0001, + 0x3f86: 0x0001, 0x3f87: 0x0001, 0x3f88: 0x0001, 0x3f89: 0x0001, 0x3f8a: 0x0001, 0x3f8b: 0x0001, + 0x3f8c: 0x0001, 0x3f8d: 0x0001, 0x3f8e: 0x0001, 0x3f8f: 0x0001, 0x3f90: 0x0001, 0x3f91: 0x0001, + 0x3f92: 0x0001, 0x3f93: 0x0001, 0x3f94: 0x0001, 0x3f95: 0x0001, 0x3f96: 0x0001, 0x3f97: 0x0001, + 0x3f98: 0x0001, 0x3f99: 0x0001, 0x3f9a: 0x0001, 0x3f9b: 0x0001, 0x3f9c: 0x0001, 0x3f9d: 0x0001, + 0x3f9e: 0x0001, 0x3f9f: 0x0001, 0x3fa0: 0x0001, 0x3fa1: 0x0001, 0x3fa2: 0x0001, 0x3fa3: 0x0001, + 0x3fa4: 0x0001, 0x3fa5: 0x0001, 0x3fa6: 0x0001, 0x3fa7: 0x0001, 0x3fa8: 0x0001, 0x3fa9: 0x0001, + 0x3faa: 0x0001, 0x3fab: 0x0001, 0x3fac: 0x0001, 0x3fad: 0x0001, 0x3fae: 0x0001, 0x3faf: 0x0001, + 0x3fb0: 0x0001, 0x3fb1: 0x0001, 0x3fb2: 0x0001, 0x3fb3: 0x0001, 0x3fb4: 0x0001, 0x3fb5: 0x0001, + 0x3fb6: 0x0001, 0x3fb7: 0x0001, 0x3fb8: 0x0001, 0x3fb9: 0x0001, 0x3fba: 0x0001, 0x3fbb: 0x0001, + 0x3fbc: 0x0001, 0x3fbd: 0x0001, + // Block 0xff, offset 0x3fc0 + 0x3fc1: 0x0008, + 0x3fe0: 0x0008, 0x3fe1: 0x0008, 0x3fe2: 0x0008, 0x3fe3: 0x0008, + 0x3fe4: 0x0008, 0x3fe5: 0x0008, 0x3fe6: 0x0008, 0x3fe7: 0x0008, 0x3fe8: 0x0008, 0x3fe9: 0x0008, + 0x3fea: 0x0008, 0x3feb: 0x0008, 0x3fec: 0x0008, 0x3fed: 0x0008, 0x3fee: 0x0008, 0x3fef: 0x0008, + 0x3ff0: 0x0008, 0x3ff1: 0x0008, 0x3ff2: 0x0008, 0x3ff3: 0x0008, 0x3ff4: 0x0008, 0x3ff5: 0x0008, + 0x3ff6: 0x0008, 0x3ff7: 0x0008, 0x3ff8: 0x0008, 0x3ff9: 0x0008, 0x3ffa: 0x0008, 0x3ffb: 0x0008, + 0x3ffc: 0x0008, 0x3ffd: 0x0008, 0x3ffe: 0x0008, 0x3fff: 0x0008, + // Block 0x100, offset 0x4000 + 0x4000: 0x0002, 0x4001: 0x0002, 0x4002: 0x0002, 0x4003: 0x0002, 0x4004: 0x0002, 0x4005: 0x0002, + 0x4006: 0x0002, 0x4007: 0x0002, 0x4008: 0x0002, 0x4009: 0x0002, 0x400a: 0x0002, 0x400b: 0x0002, + 0x400c: 0x0002, 0x400d: 0x0002, 0x400e: 0x0002, 0x400f: 0x0002, 0x4010: 0x0002, 0x4011: 0x0002, + 0x4012: 0x0002, 0x4013: 0x0002, 0x4014: 0x0002, 0x4015: 0x0002, 0x4016: 0x0002, 0x4017: 0x0002, + 0x4018: 0x0002, 0x4019: 0x0002, 0x401a: 0x0002, 0x401b: 0x0002, 0x401c: 0x0002, 0x401d: 0x0002, + 0x401e: 0x0002, 0x401f: 0x0002, 0x4020: 0x0002, 0x4021: 0x0002, 0x4022: 0x0002, 0x4023: 0x0002, + 0x4024: 0x0002, 0x4025: 0x0002, 0x4026: 0x0002, 0x4027: 0x0002, 0x4028: 0x0002, 0x4029: 0x0002, + 0x402a: 0x0002, 0x402b: 0x0002, 0x402c: 0x0002, 0x402d: 0x0002, 0x402e: 0x0002, 0x402f: 0x0002, + 0x4030: 0x0002, 0x4031: 0x0002, 0x4032: 0x0002, 0x4033: 0x0002, 0x4034: 0x0002, 0x4035: 0x0002, + 0x4036: 0x0002, 0x4037: 0x0002, 0x4038: 0x0002, 0x4039: 0x0002, 0x403a: 0x0002, 0x403b: 0x0002, + 0x403c: 0x0002, 0x403d: 0x0002, +} + +// stringWidthIndex: 31 blocks, 1984 entries, 1984 bytes +// Block 0 is the zero block. +var stringWidthIndex = [1984]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, + 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x0c, 0xd1: 0x0d, 0xd2: 0x0e, 0xd6: 0x0f, 0xd7: 0x10, + 0xd8: 0x11, 0xd9: 0x12, 0xdb: 0x13, 0xdc: 0x14, 0xdd: 0x15, 0xde: 0x16, 0xdf: 0x17, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x09, 0xee: 0x0a, 0xef: 0x0b, + 0xf0: 0x18, 0xf3: 0x1b, 0xf4: 0x1c, + // Block 0x4, offset 0x100 + 0x120: 0x18, 0x121: 0x19, 0x122: 0x1a, 0x123: 0x1b, 0x124: 0x1c, 0x125: 0x1d, 0x126: 0x1e, 0x127: 0x1f, + 0x128: 0x20, 0x129: 0x21, 0x12a: 0x20, 0x12b: 0x22, 0x12c: 0x23, 0x12d: 0x24, 0x12e: 0x25, 0x12f: 0x26, + 0x130: 0x27, 0x131: 0x28, 0x132: 0x23, 0x133: 0x29, 0x134: 0x2a, 0x135: 0x2b, 0x136: 0x2c, 0x137: 0x2d, + 0x138: 0x2e, 0x139: 0x2f, 0x13a: 0x30, 0x13b: 0x31, 0x13c: 0x32, 0x13d: 0x33, 0x13e: 0x34, 0x13f: 0x35, + // Block 0x5, offset 0x140 + 0x140: 0x36, 0x141: 0x37, 0x142: 0x38, 0x144: 0x39, 0x145: 0x3a, + 0x14d: 0x3b, + 0x15c: 0x3c, 0x15d: 0x3d, 0x15e: 0x3e, 0x15f: 0x3f, + 0x160: 0x40, 0x162: 0x41, 0x164: 0x42, + 0x168: 0x43, 0x169: 0x44, 0x16a: 0x45, 0x16b: 0x46, 0x16c: 0x47, 0x16d: 0x48, 0x16e: 0x49, 0x16f: 0x4a, + 0x170: 0x4b, 0x173: 0x4c, 0x177: 0x4d, + // Block 0x6, offset 0x180 + 0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55, + 0x188: 0x56, 0x189: 0x57, 0x18a: 0x58, 0x18c: 0x59, 0x18e: 0x5a, 0x18f: 0x5b, + 0x191: 0x5c, 0x192: 0x5d, 0x193: 0x5e, 0x194: 0x5d, 0x195: 0x5f, 0x196: 0x60, 0x197: 0x61, + 0x198: 0x62, 0x199: 0x63, 0x19a: 0x64, 0x19b: 0x65, 0x19c: 0x66, 0x19d: 0x67, 0x19e: 0x68, + 0x1a4: 0x69, + 0x1ac: 0x6a, 0x1ad: 0x6b, + 0x1b3: 0x6c, 0x1b5: 0x6d, 0x1b7: 0x6e, + 0x1ba: 0x6f, 0x1bb: 0x70, 0x1bc: 0x39, 0x1bd: 0x39, 0x1be: 0x39, 0x1bf: 0x71, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x72, 0x1c1: 0x73, 0x1c2: 0x74, 0x1c3: 0x39, 0x1c4: 0x75, 0x1c5: 0x39, 0x1c6: 0x76, 0x1c7: 0x77, + 0x1c8: 0x78, 0x1c9: 0x79, 0x1ca: 0x7a, 0x1cb: 0x39, 0x1cc: 0x39, 0x1cd: 0x39, 0x1ce: 0x39, 0x1cf: 0x39, + 0x1d0: 0x39, 0x1d1: 0x39, 0x1d2: 0x39, 0x1d3: 0x39, 0x1d4: 0x39, 0x1d5: 0x39, 0x1d6: 0x39, 0x1d7: 0x39, + 0x1d8: 0x39, 0x1d9: 0x39, 0x1da: 0x39, 0x1db: 0x39, 0x1dc: 0x39, 0x1dd: 0x39, 0x1de: 0x39, 0x1df: 0x39, + 0x1e0: 0x39, 0x1e1: 0x39, 0x1e2: 0x39, 0x1e3: 0x39, 0x1e4: 0x39, 0x1e5: 0x39, 0x1e6: 0x39, 0x1e7: 0x39, + 0x1e8: 0x39, 0x1e9: 0x39, 0x1ea: 0x39, 0x1eb: 0x39, 0x1ec: 0x39, 0x1ed: 0x39, 0x1ee: 0x39, 0x1ef: 0x39, + 0x1f0: 0x39, 0x1f1: 0x39, 0x1f2: 0x39, 0x1f3: 0x39, 0x1f4: 0x39, 0x1f5: 0x39, 0x1f6: 0x39, 0x1f7: 0x39, + 0x1f8: 0x39, 0x1f9: 0x39, 0x1fa: 0x39, 0x1fb: 0x39, 0x1fc: 0x39, 0x1fd: 0x39, 0x1fe: 0x39, 0x1ff: 0x39, + // Block 0x8, offset 0x200 + 0x200: 0x39, 0x201: 0x39, 0x202: 0x39, 0x203: 0x39, 0x204: 0x39, 0x205: 0x39, 0x206: 0x39, 0x207: 0x39, + 0x208: 0x39, 0x209: 0x39, 0x20a: 0x39, 0x20b: 0x39, 0x20c: 0x39, 0x20d: 0x39, 0x20e: 0x39, 0x20f: 0x39, + 0x210: 0x39, 0x211: 0x39, 0x212: 0x39, 0x213: 0x39, 0x214: 0x39, 0x215: 0x39, 0x216: 0x39, 0x217: 0x39, + 0x218: 0x39, 0x219: 0x39, 0x21a: 0x39, 0x21b: 0x39, 0x21c: 0x39, 0x21d: 0x39, 0x21e: 0x39, 0x21f: 0x39, + 0x220: 0x39, 0x221: 0x39, 0x222: 0x39, 0x223: 0x39, 0x224: 0x39, 0x225: 0x39, 0x226: 0x39, 0x227: 0x39, + 0x228: 0x39, 0x229: 0x39, 0x22a: 0x39, 0x22b: 0x39, 0x22c: 0x39, 0x22d: 0x39, 0x22e: 0x39, 0x22f: 0x39, + 0x230: 0x39, 0x231: 0x39, 0x232: 0x39, 0x233: 0x39, 0x234: 0x39, 0x235: 0x39, 0x236: 0x39, + 0x238: 0x39, 0x239: 0x39, 0x23a: 0x39, 0x23b: 0x39, 0x23c: 0x39, 0x23d: 0x39, 0x23e: 0x39, 0x23f: 0x39, + // Block 0x9, offset 0x240 + 0x240: 0x39, 0x241: 0x39, 0x242: 0x39, 0x243: 0x39, 0x244: 0x39, 0x245: 0x39, 0x246: 0x39, 0x247: 0x39, + 0x248: 0x39, 0x249: 0x39, 0x24a: 0x39, 0x24b: 0x39, 0x24c: 0x39, 0x24d: 0x39, 0x24e: 0x39, 0x24f: 0x39, + 0x250: 0x39, 0x251: 0x39, 0x252: 0x39, 0x253: 0x39, 0x254: 0x39, 0x255: 0x39, 0x256: 0x39, 0x257: 0x39, + 0x258: 0x39, 0x259: 0x39, 0x25a: 0x39, 0x25b: 0x39, 0x25c: 0x39, 0x25d: 0x39, 0x25e: 0x39, 0x25f: 0x39, + 0x260: 0x39, 0x261: 0x39, 0x262: 0x39, 0x263: 0x39, 0x264: 0x39, 0x265: 0x39, 0x266: 0x39, 0x267: 0x39, + 0x268: 0x39, 0x269: 0x39, 0x26a: 0x39, 0x26b: 0x39, 0x26c: 0x39, 0x26d: 0x39, 0x26e: 0x39, 0x26f: 0x39, + 0x270: 0x39, 0x271: 0x39, 0x272: 0x39, 0x273: 0x39, 0x274: 0x39, 0x275: 0x39, 0x276: 0x39, 0x277: 0x39, + 0x278: 0x39, 0x279: 0x39, 0x27a: 0x39, 0x27b: 0x39, 0x27c: 0x39, 0x27d: 0x39, 0x27e: 0x39, 0x27f: 0x39, + // Block 0xa, offset 0x280 + 0x280: 0x39, 0x281: 0x39, 0x282: 0x39, 0x283: 0x39, 0x284: 0x39, 0x285: 0x39, 0x286: 0x39, 0x287: 0x39, + 0x288: 0x39, 0x289: 0x39, 0x28a: 0x39, 0x28b: 0x39, 0x28c: 0x39, 0x28d: 0x39, 0x28e: 0x39, 0x28f: 0x39, + 0x290: 0x39, 0x291: 0x39, 0x292: 0x7b, 0x293: 0x7c, + 0x299: 0x7d, 0x29a: 0x7e, 0x29b: 0x7f, + 0x2a0: 0x80, 0x2a3: 0x81, 0x2a4: 0x82, 0x2a5: 0x83, 0x2a6: 0x84, 0x2a7: 0x85, + 0x2a8: 0x86, 0x2a9: 0x87, 0x2aa: 0x88, 0x2ab: 0x89, 0x2af: 0x8a, + 0x2b0: 0x39, 0x2b1: 0x39, 0x2b2: 0x39, 0x2b3: 0x39, 0x2b4: 0x39, 0x2b5: 0x39, 0x2b6: 0x39, 0x2b7: 0x39, + 0x2b8: 0x39, 0x2b9: 0x39, 0x2ba: 0x39, 0x2bb: 0x39, 0x2bc: 0x39, 0x2bd: 0x39, 0x2be: 0x39, 0x2bf: 0x39, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x39, 0x2c1: 0x39, 0x2c2: 0x39, 0x2c3: 0x39, 0x2c4: 0x39, 0x2c5: 0x39, 0x2c6: 0x39, 0x2c7: 0x39, + 0x2c8: 0x39, 0x2c9: 0x39, 0x2ca: 0x39, 0x2cb: 0x39, 0x2cc: 0x39, 0x2cd: 0x39, 0x2ce: 0x39, 0x2cf: 0x39, + 0x2d0: 0x39, 0x2d1: 0x39, 0x2d2: 0x39, 0x2d3: 0x39, 0x2d4: 0x39, 0x2d5: 0x39, 0x2d6: 0x39, 0x2d7: 0x39, + 0x2d8: 0x39, 0x2d9: 0x39, 0x2da: 0x39, 0x2db: 0x39, 0x2dc: 0x39, 0x2dd: 0x39, 0x2de: 0x8b, + // Block 0xc, offset 0x300 + 0x300: 0x5d, 0x301: 0x5d, 0x302: 0x5d, 0x303: 0x5d, 0x304: 0x5d, 0x305: 0x5d, 0x306: 0x5d, 0x307: 0x5d, + 0x308: 0x5d, 0x309: 0x5d, 0x30a: 0x5d, 0x30b: 0x5d, 0x30c: 0x5d, 0x30d: 0x5d, 0x30e: 0x5d, 0x30f: 0x5d, + 0x310: 0x5d, 0x311: 0x5d, 0x312: 0x5d, 0x313: 0x5d, 0x314: 0x5d, 0x315: 0x5d, 0x316: 0x5d, 0x317: 0x5d, + 0x318: 0x5d, 0x319: 0x5d, 0x31a: 0x5d, 0x31b: 0x5d, 0x31c: 0x5d, 0x31d: 0x5d, 0x31e: 0x5d, 0x31f: 0x5d, + 0x320: 0x5d, 0x321: 0x5d, 0x322: 0x5d, 0x323: 0x5d, 0x324: 0x5d, 0x325: 0x5d, 0x326: 0x5d, 0x327: 0x5d, + 0x328: 0x5d, 0x329: 0x5d, 0x32a: 0x5d, 0x32b: 0x5d, 0x32c: 0x5d, 0x32d: 0x5d, 0x32e: 0x5d, 0x32f: 0x5d, + 0x330: 0x5d, 0x331: 0x5d, 0x332: 0x5d, 0x333: 0x5d, 0x334: 0x5d, 0x335: 0x5d, 0x336: 0x5d, 0x337: 0x5d, + 0x338: 0x5d, 0x339: 0x5d, 0x33a: 0x5d, 0x33b: 0x5d, 0x33c: 0x5d, 0x33d: 0x5d, 0x33e: 0x5d, 0x33f: 0x5d, + // Block 0xd, offset 0x340 + 0x340: 0x5d, 0x341: 0x5d, 0x342: 0x5d, 0x343: 0x5d, 0x344: 0x5d, 0x345: 0x5d, 0x346: 0x5d, 0x347: 0x5d, + 0x348: 0x5d, 0x349: 0x5d, 0x34a: 0x5d, 0x34b: 0x5d, 0x34c: 0x5d, 0x34d: 0x5d, 0x34e: 0x5d, 0x34f: 0x5d, + 0x350: 0x5d, 0x351: 0x5d, 0x352: 0x5d, 0x353: 0x5d, 0x354: 0x5d, 0x355: 0x5d, 0x356: 0x5d, 0x357: 0x5d, + 0x358: 0x5d, 0x359: 0x5d, 0x35a: 0x5d, 0x35b: 0x5d, 0x35c: 0x5d, 0x35d: 0x5d, 0x35e: 0x5d, 0x35f: 0x5d, + 0x360: 0x5d, 0x361: 0x5d, 0x362: 0x5d, 0x363: 0x5d, 0x364: 0x39, 0x365: 0x39, 0x366: 0x39, 0x367: 0x39, + 0x368: 0x39, 0x369: 0x39, 0x36a: 0x39, 0x36b: 0x39, 0x36c: 0x8c, + 0x378: 0x8d, 0x379: 0x8e, 0x37b: 0x6d, 0x37c: 0x73, 0x37d: 0x8f, 0x37f: 0x90, + // Block 0xe, offset 0x380 + 0x387: 0x91, + 0x38b: 0x92, 0x38d: 0x93, + 0x3a8: 0x94, 0x3ab: 0x95, + 0x3b4: 0x96, + 0x3ba: 0x97, 0x3bb: 0x98, 0x3bd: 0x99, 0x3be: 0x9a, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x9b, 0x3c1: 0x9c, 0x3c2: 0x9d, 0x3c3: 0x9e, 0x3c4: 0x9f, 0x3c5: 0xa0, 0x3c6: 0xa1, 0x3c7: 0xa2, + 0x3c8: 0xa3, 0x3c9: 0x2c, 0x3cb: 0xa4, 0x3cc: 0x2a, 0x3cd: 0xa5, + 0x3d0: 0xa6, 0x3d1: 0xa7, 0x3d2: 0xa8, 0x3d3: 0xa9, 0x3d6: 0xaa, 0x3d7: 0xab, + 0x3d8: 0xac, 0x3d9: 0xad, 0x3da: 0xae, 0x3dc: 0xaf, + 0x3e0: 0xb0, 0x3e4: 0xb1, 0x3e5: 0xb2, 0x3e7: 0xb3, + 0x3e8: 0xb4, 0x3e9: 0xb5, 0x3ea: 0xb6, + 0x3f0: 0xb7, 0x3f2: 0xb8, 0x3f4: 0xb9, 0x3f5: 0xba, 0x3f6: 0xbb, + 0x3fb: 0xbc, 0x3fc: 0xbd, 0x3fd: 0xbe, + // Block 0x10, offset 0x400 + 0x410: 0x45, 0x411: 0xbf, + // Block 0x11, offset 0x440 + 0x46b: 0xc0, 0x46c: 0xc1, + 0x47d: 0xc2, 0x47e: 0xc3, 0x47f: 0xc4, + // Block 0x12, offset 0x480 + 0x480: 0x39, 0x481: 0x39, 0x482: 0x39, 0x483: 0x39, 0x484: 0x39, 0x485: 0x39, 0x486: 0x39, 0x487: 0x39, + 0x488: 0x39, 0x489: 0x39, 0x48a: 0x39, 0x48b: 0x39, 0x48c: 0x39, 0x48d: 0x39, 0x48e: 0x39, 0x48f: 0x39, + 0x490: 0x39, 0x491: 0x39, 0x492: 0x39, 0x493: 0x39, 0x494: 0x39, 0x495: 0x39, 0x496: 0x39, 0x497: 0x39, + 0x498: 0x39, 0x499: 0x39, 0x49a: 0x39, 0x49b: 0x39, 0x49c: 0x39, 0x49d: 0x39, 0x49e: 0x39, 0x49f: 0xc5, + 0x4a0: 0x39, 0x4a1: 0x39, 0x4a2: 0x39, 0x4a3: 0x39, 0x4a4: 0x39, 0x4a5: 0x39, 0x4a6: 0x39, 0x4a7: 0x39, + 0x4a8: 0x39, 0x4a9: 0x39, 0x4aa: 0x39, 0x4ab: 0x39, 0x4ac: 0x39, 0x4ad: 0x39, 0x4ae: 0x39, 0x4af: 0x39, + 0x4b0: 0x39, 0x4b1: 0x39, 0x4b2: 0x39, 0x4b3: 0xc6, 0x4b4: 0xc7, + // Block 0x13, offset 0x4c0 + 0x4ff: 0xc8, + // Block 0x14, offset 0x500 + 0x500: 0x39, 0x501: 0x39, 0x502: 0x39, 0x503: 0x39, 0x504: 0xc9, 0x505: 0xca, 0x506: 0x39, 0x507: 0x39, + 0x508: 0x39, 0x509: 0x39, 0x50a: 0x39, 0x50b: 0xcb, + 0x532: 0xcc, + // Block 0x15, offset 0x540 + 0x57c: 0xcd, 0x57d: 0xce, + // Block 0x16, offset 0x580 + 0x585: 0xcf, 0x586: 0xd0, + 0x589: 0xd1, + 0x5a8: 0xd2, 0x5a9: 0xd3, 0x5aa: 0xd4, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xd5, 0x5c2: 0xc2, 0x5c4: 0xc1, + 0x5ca: 0xd6, 0x5cb: 0xd7, + 0x5d3: 0xd7, + 0x5e3: 0xd8, 0x5e5: 0xd9, + // Block 0x18, offset 0x600 + 0x600: 0xda, 0x601: 0xdb, 0x602: 0xdb, 0x603: 0xdc, 0x604: 0xdd, 0x605: 0xde, 0x606: 0xdf, 0x607: 0xe0, + 0x608: 0xe1, 0x609: 0xe2, 0x60a: 0xdb, 0x60b: 0xdb, 0x60c: 0xe3, 0x60d: 0xe4, 0x60e: 0xe5, 0x60f: 0xe6, + 0x610: 0xe7, 0x611: 0xe8, 0x612: 0xe9, 0x613: 0xea, 0x614: 0xeb, 0x615: 0xec, 0x616: 0xed, 0x617: 0xee, + 0x618: 0xe9, 0x619: 0xef, 0x61a: 0xe9, 0x61b: 0xf0, 0x61d: 0xf1, 0x61f: 0xf2, + 0x620: 0xf3, 0x621: 0xf4, 0x622: 0xf5, 0x623: 0xdb, 0x624: 0xf6, 0x625: 0xf7, 0x626: 0xe9, 0x627: 0xe9, + 0x628: 0xdb, 0x629: 0xf8, 0x62a: 0xf9, 0x62b: 0xfa, + 0x630: 0xdb, 0x631: 0xdb, 0x632: 0xdb, 0x633: 0xdb, 0x634: 0xdb, 0x635: 0xdb, 0x636: 0xdb, 0x637: 0xdb, + 0x638: 0xdb, 0x639: 0xdb, 0x63a: 0xdb, 0x63b: 0xdb, 0x63c: 0xdb, 0x63d: 0xdb, 0x63e: 0xdb, 0x63f: 0xfb, + // Block 0x19, offset 0x640 + 0x640: 0x39, 0x641: 0x39, 0x642: 0x39, 0x643: 0x39, 0x644: 0x39, 0x645: 0x39, 0x646: 0x39, 0x647: 0x39, + 0x648: 0x39, 0x649: 0x39, 0x64a: 0x39, 0x64b: 0x39, 0x64c: 0x39, 0x64d: 0x39, 0x64e: 0x39, 0x64f: 0x39, + 0x650: 0x39, 0x651: 0x39, 0x652: 0x39, 0x653: 0x39, 0x654: 0x39, 0x655: 0x39, 0x656: 0x39, 0x657: 0x39, + 0x658: 0x39, 0x659: 0x39, 0x65a: 0x39, 0x65b: 0x39, 0x65c: 0x39, 0x65d: 0x39, 0x65e: 0x39, 0x65f: 0x39, + 0x660: 0x39, 0x661: 0x39, 0x662: 0x39, 0x663: 0x39, 0x664: 0x39, 0x665: 0x39, 0x666: 0x39, 0x667: 0x39, + 0x668: 0x39, 0x669: 0x39, 0x66a: 0x39, 0x66b: 0x39, 0x66c: 0x39, 0x66d: 0x39, 0x66e: 0x39, 0x66f: 0x39, + 0x670: 0x39, 0x671: 0x39, 0x672: 0x39, 0x673: 0x39, 0x674: 0x39, 0x675: 0x39, 0x676: 0x39, 0x677: 0x39, + 0x678: 0x39, 0x679: 0x39, 0x67a: 0x39, 0x67b: 0x39, 0x67c: 0x39, 0x67d: 0x39, 0x67e: 0x39, 0x67f: 0xfc, + // Block 0x1a, offset 0x680 + 0x690: 0x0c, 0x691: 0x0d, 0x693: 0x0e, 0x696: 0x0f, 0x697: 0x07, + 0x698: 0x10, 0x69a: 0x11, 0x69b: 0x12, 0x69c: 0x13, 0x69d: 0x14, 0x69e: 0x15, 0x69f: 0x16, + 0x6a0: 0x07, 0x6a1: 0x07, 0x6a2: 0x07, 0x6a3: 0x07, 0x6a4: 0x07, 0x6a5: 0x07, 0x6a6: 0x07, 0x6a7: 0x07, + 0x6a8: 0x07, 0x6a9: 0x07, 0x6aa: 0x07, 0x6ab: 0x07, 0x6ac: 0x07, 0x6ad: 0x07, 0x6ae: 0x07, 0x6af: 0x17, + 0x6b0: 0x07, 0x6b1: 0x07, 0x6b2: 0x07, 0x6b3: 0x07, 0x6b4: 0x07, 0x6b5: 0x07, 0x6b6: 0x07, 0x6b7: 0x07, + 0x6b8: 0x07, 0x6b9: 0x07, 0x6ba: 0x07, 0x6bb: 0x07, 0x6bc: 0x07, 0x6bd: 0x07, 0x6be: 0x07, 0x6bf: 0x17, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0xfd, 0x6c1: 0x4d, 0x6c4: 0x08, 0x6c5: 0x08, 0x6c6: 0x08, 0x6c7: 0x09, + // Block 0x1c, offset 0x700 + 0x700: 0x5d, 0x701: 0x5d, 0x702: 0x5d, 0x703: 0x5d, 0x704: 0x5d, 0x705: 0x5d, 0x706: 0x5d, 0x707: 0x5d, + 0x708: 0x5d, 0x709: 0x5d, 0x70a: 0x5d, 0x70b: 0x5d, 0x70c: 0x5d, 0x70d: 0x5d, 0x70e: 0x5d, 0x70f: 0x5d, + 0x710: 0x5d, 0x711: 0x5d, 0x712: 0x5d, 0x713: 0x5d, 0x714: 0x5d, 0x715: 0x5d, 0x716: 0x5d, 0x717: 0x5d, + 0x718: 0x5d, 0x719: 0x5d, 0x71a: 0x5d, 0x71b: 0x5d, 0x71c: 0x5d, 0x71d: 0x5d, 0x71e: 0x5d, 0x71f: 0x5d, + 0x720: 0x5d, 0x721: 0x5d, 0x722: 0x5d, 0x723: 0x5d, 0x724: 0x5d, 0x725: 0x5d, 0x726: 0x5d, 0x727: 0x5d, + 0x728: 0x5d, 0x729: 0x5d, 0x72a: 0x5d, 0x72b: 0x5d, 0x72c: 0x5d, 0x72d: 0x5d, 0x72e: 0x5d, 0x72f: 0x5d, + 0x730: 0x5d, 0x731: 0x5d, 0x732: 0x5d, 0x733: 0x5d, 0x734: 0x5d, 0x735: 0x5d, 0x736: 0x5d, 0x737: 0x5d, + 0x738: 0x5d, 0x739: 0x5d, 0x73a: 0x5d, 0x73b: 0x5d, 0x73c: 0x5d, 0x73d: 0x5d, 0x73e: 0x5d, 0x73f: 0xfe, + // Block 0x1d, offset 0x740 + 0x760: 0x19, + 0x770: 0x0a, 0x771: 0x0a, 0x772: 0x0a, 0x773: 0x0a, 0x774: 0x0a, 0x775: 0x0a, 0x776: 0x0a, 0x777: 0x0a, + 0x778: 0x0a, 0x779: 0x0a, 0x77a: 0x0a, 0x77b: 0x0a, 0x77c: 0x0a, 0x77d: 0x0a, 0x77e: 0x0a, 0x77f: 0x1a, + // Block 0x1e, offset 0x780 + 0x780: 0x0a, 0x781: 0x0a, 0x782: 0x0a, 0x783: 0x0a, 0x784: 0x0a, 0x785: 0x0a, 0x786: 0x0a, 0x787: 0x0a, + 0x788: 0x0a, 0x789: 0x0a, 0x78a: 0x0a, 0x78b: 0x0a, 0x78c: 0x0a, 0x78d: 0x0a, 0x78e: 0x0a, 0x78f: 0x1a, +} diff --git a/vendor/github.com/clipperhouse/displaywidth/width.go b/vendor/github.com/clipperhouse/displaywidth/width.go new file mode 100644 index 000000000..055523fbc --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/width.go @@ -0,0 +1,159 @@ +package displaywidth + +import ( + "unicode/utf8" + + "github.com/clipperhouse/stringish" + "github.com/clipperhouse/uax29/v2/graphemes" +) + +// String calculates the display width of a string +// using the [DefaultOptions] +func String(s string) int { + return DefaultOptions.String(s) +} + +// Bytes calculates the display width of a []byte +// using the [DefaultOptions] +func Bytes(s []byte) int { + return DefaultOptions.Bytes(s) +} + +func Rune(r rune) int { + return DefaultOptions.Rune(r) +} + +type Options struct { + EastAsianWidth bool + StrictEmojiNeutral bool +} + +var DefaultOptions = Options{ + EastAsianWidth: false, + StrictEmojiNeutral: true, +} + +// String calculates the display width of a string +// for the given options +func (options Options) String(s string) int { + if len(s) == 0 { + return 0 + } + + total := 0 + g := graphemes.FromString(s) + for g.Next() { + // The first character in the grapheme cluster determines the width; + // modifiers and joiners do not contribute to the width. + props, _ := lookupProperties(g.Value()) + total += props.width(options) + } + return total +} + +// BytesOptions calculates the display width of a []byte +// for the given options +func (options Options) Bytes(s []byte) int { + if len(s) == 0 { + return 0 + } + + total := 0 + g := graphemes.FromBytes(s) + for g.Next() { + // The first character in the grapheme cluster determines the width; + // modifiers and joiners do not contribute to the width. + props, _ := lookupProperties(g.Value()) + total += props.width(options) + } + return total +} + +func (options Options) Rune(r rune) int { + // Fast path for ASCII + if r < utf8.RuneSelf { + if isASCIIControl(byte(r)) { + // Control (0x00-0x1F) and DEL (0x7F) + return 0 + } + // ASCII printable (0x20-0x7E) + return 1 + } + + // Surrogates (U+D800-U+DFFF) are invalid UTF-8 and have zero width + // Other packages might turn them into the replacement character (U+FFFD) + // in which case, we won't see it. + if r >= 0xD800 && r <= 0xDFFF { + return 0 + } + + // Stack-allocated to avoid heap allocation + var buf [4]byte // UTF-8 is at most 4 bytes + n := utf8.EncodeRune(buf[:], r) + // Skip the grapheme iterator and directly lookup properties + props, _ := lookupProperties(buf[:n]) + return props.width(options) +} + +func isASCIIControl(b byte) bool { + return b < 0x20 || b == 0x7F +} + +const defaultWidth = 1 + +// is returns true if the property flag is set +func (p property) is(flag property) bool { + return p&flag != 0 +} + +// lookupProperties returns the properties for the first character in a string +func lookupProperties[T stringish.Interface](s T) (property, int) { + if len(s) == 0 { + return 0, 0 + } + + // Fast path for ASCII characters (single byte) + b := s[0] + if b < utf8.RuneSelf { // Single-byte ASCII + if isASCIIControl(b) { + // Control characters (0x00-0x1F) and DEL (0x7F) - width 0 + return _ZeroWidth, 1 + } + // ASCII printable characters (0x20-0x7E) - width 1 + // Return 0 properties, width calculation will default to 1 + return 0, 1 + } + + // Use the generated trie for lookup + props, size := lookup(s) + return property(props), size +} + +// width determines the display width of a character based on its properties +// and configuration options +func (p property) width(options Options) int { + if p == 0 { + // Character not in trie, use default behavior + return defaultWidth + } + + if p.is(_ZeroWidth) { + return 0 + } + + if options.EastAsianWidth { + if p.is(_East_Asian_Ambiguous) { + return 2 + } + if p.is(_East_Asian_Ambiguous|_Emoji) && !options.StrictEmojiNeutral { + return 2 + } + } + + if p.is(_East_Asian_Full_Wide) { + return 2 + } + + // Default width for all other characters + return defaultWidth +} diff --git a/vendor/github.com/clipperhouse/stringish/.gitignore b/vendor/github.com/clipperhouse/stringish/.gitignore new file mode 100644 index 000000000..12fbfb739 --- /dev/null +++ b/vendor/github.com/clipperhouse/stringish/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +*.test diff --git a/vendor/github.com/clipperhouse/stringish/LICENSE b/vendor/github.com/clipperhouse/stringish/LICENSE new file mode 100644 index 000000000..4b8064eb3 --- /dev/null +++ b/vendor/github.com/clipperhouse/stringish/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Matt Sherman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/clipperhouse/stringish/README.md b/vendor/github.com/clipperhouse/stringish/README.md new file mode 100644 index 000000000..fa1f7cc67 --- /dev/null +++ b/vendor/github.com/clipperhouse/stringish/README.md @@ -0,0 +1,64 @@ +# stringish + +A small Go module that provides a generic type constraint for โ€œstring-likeโ€ +data, and a utf8 package that works with both strings and byte slices +without conversions. + +```go +type Interface interface { + ~[]byte | ~string +} +``` + +[![Go Reference](https://pkg.go.dev/badge/github.com/clipperhouse/stringish/utf8.svg)](https://pkg.go.dev/github.com/clipperhouse/stringish/utf8) +[![Test Status](https://github.com/clipperhouse/stringish/actions/workflows/gotest.yml/badge.svg)](https://github.com/clipperhouse/stringish/actions/workflows/gotest.yml) + +## Install + +``` +go get github.com/clipperhouse/stringish +``` + +## Examples + +```go +import ( + "github.com/clipperhouse/stringish" + "github.com/clipperhouse/stringish/utf8" +) + +s := "Hello, ไธ–็•Œ" +r, size := utf8.DecodeRune(s) // not DecodeRuneInString ๐ŸŽ‰ + +b := []byte("Hello, ไธ–็•Œ") +r, size = utf8.DecodeRune(b) // same API! + +func MyFoo[T stringish.Interface](s T) T { + // pass a string or a []byte + // iterate, slice, transform, whatever +} +``` + +## Motivation + +Sometimes we want APIs to accept `string` or `[]byte` without having to convert +between those types. That conversion usually allocates! + +By implementing with `stringish.Interface`, we can have a single API, and +single implementation for both types: one `Foo` instead of `Foo` and +`FooString`. + +We have converted the +[`unicode/utf8` package](https://github.com/clipperhouse/stringish/blob/main/utf8/utf8.go) +as an example -- note the absence of`*InString` funcs. We might look at `x/text` +next. + +## Used by + +- clipperhouse/uax29: [stringish trie](https://github.com/clipperhouse/uax29/blob/master/graphemes/trie.go#L27), [stringish iterator](https://github.com/clipperhouse/uax29/blob/master/internal/iterators/iterator.go#L9), [stringish SplitFunc](https://github.com/clipperhouse/uax29/blob/master/graphemes/splitfunc.go#L21) + +- [clipperhouse/displaywidth](https://github.com/clipperhouse/displaywidth) + +## Prior discussion + +- [Consideration of similar by the Go team](https://github.com/golang/go/issues/48643) diff --git a/vendor/github.com/clipperhouse/stringish/interface.go b/vendor/github.com/clipperhouse/stringish/interface.go new file mode 100644 index 000000000..adfeab61e --- /dev/null +++ b/vendor/github.com/clipperhouse/stringish/interface.go @@ -0,0 +1,5 @@ +package stringish + +type Interface interface { + ~[]byte | ~string +} diff --git a/vendor/github.com/clipperhouse/uax29/v2/LICENSE b/vendor/github.com/clipperhouse/uax29/v2/LICENSE new file mode 100644 index 000000000..6ae86a9a1 --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matt Sherman + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md b/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md new file mode 100644 index 000000000..4d9a6d717 --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/graphemes/README.md @@ -0,0 +1,82 @@ +An implementation of grapheme cluster boundaries from [Unicode text segmentation](https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries) (UAX 29), for Unicode version 15.0.0. + +## Quick start + +``` +go get "github.com/clipperhouse/uax29/v2/graphemes" +``` + +```go +import "github.com/clipperhouse/uax29/v2/graphemes" + +text := "Hello, ไธ–็•Œ. Nice dog! ๐Ÿ‘๐Ÿถ" + +tokens := graphemes.FromString(text) + +for tokens.Next() { // Next() returns true until end of data + fmt.Println(tokens.Value()) // Do something with the current grapheme +} +``` + +[![Documentation](https://pkg.go.dev/badge/github.com/clipperhouse/uax29/v2/graphemes.svg)](https://pkg.go.dev/github.com/clipperhouse/uax29/v2/graphemes) + +_A grapheme is a โ€œsingle visible characterโ€, which might be a simple as a single letter, or a complex emoji that consists of several Unicode code points._ + +## Conformance + +We use the Unicode [test suite](https://unicode.org/reports/tr41/tr41-26.html#Tests29). Status: + +![Go](https://github.com/clipperhouse/uax29/actions/workflows/gotest.yml/badge.svg) + +## APIs + +### If you have a `string` + +```go +text := "Hello, ไธ–็•Œ. Nice dog! ๐Ÿ‘๐Ÿถ" + +tokens := graphemes.FromString(text) + +for tokens.Next() { // Next() returns true until end of data + fmt.Println(tokens.Value()) // Do something with the current grapheme +} +``` + +### If you have an `io.Reader` + +`FromReader` embeds a [`bufio.Scanner`](https://pkg.go.dev/bufio#Scanner), so just use those methods. + +```go +r := getYourReader() // from a file or network maybe +tokens := graphemes.FromReader(r) + +for tokens.Scan() { // Scan() returns true until error or EOF + fmt.Println(tokens.Text()) // Do something with the current grapheme +} + +if tokens.Err() != nil { // Check the error + log.Fatal(tokens.Err()) +} +``` + +### If you have a `[]byte` + +```go +b := []byte("Hello, ไธ–็•Œ. Nice dog! ๐Ÿ‘๐Ÿถ") + +tokens := graphemes.FromBytes(b) + +for tokens.Next() { // Next() returns true until end of data + fmt.Println(tokens.Value()) // Do something with the current grapheme +} +``` + +### Performance + +On a Mac M2 laptop, we see around 200MB/s, or around 100 million graphemes per second. You should see ~constant memory, and no allocations. + +### Invalid inputs + +Invalid UTF-8 input is considered undefined behavior. We test to ensure that bad inputs will not cause pathological outcomes, such as a panic or infinite loop. Callers should expect โ€œgarbage-in, garbage-outโ€. + +Your pipeline should probably include a call to [`utf8.Valid()`](https://pkg.go.dev/unicode/utf8#Valid). diff --git a/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go b/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go new file mode 100644 index 000000000..14b4ea2c4 --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/graphemes/iterator.go @@ -0,0 +1,28 @@ +package graphemes + +import "github.com/clipperhouse/uax29/v2/internal/iterators" + +type Iterator[T iterators.Stringish] struct { + *iterators.Iterator[T] +} + +var ( + splitFuncString = splitFunc[string] + splitFuncBytes = splitFunc[[]byte] +) + +// FromString returns an iterator for the grapheme clusters in the input string. +// Iterate while Next() is true, and access the grapheme via Value(). +func FromString(s string) Iterator[string] { + return Iterator[string]{ + iterators.New(splitFuncString, s), + } +} + +// FromBytes returns an iterator for the grapheme clusters in the input bytes. +// Iterate while Next() is true, and access the grapheme via Value(). +func FromBytes(b []byte) Iterator[[]byte] { + return Iterator[[]byte]{ + iterators.New(splitFuncBytes, b), + } +} diff --git a/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go b/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go new file mode 100644 index 000000000..9aa006618 --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/graphemes/reader.go @@ -0,0 +1,25 @@ +// Package graphemes implements Unicode grapheme cluster boundaries: https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries +package graphemes + +import ( + "bufio" + "io" +) + +type Scanner struct { + *bufio.Scanner +} + +// FromReader returns a Scanner, to split graphemes per +// https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries. +// +// It embeds a [bufio.Scanner], so you can use its methods. +// +// Iterate through graphemes by calling Scan() until false, then check Err(). +func FromReader(r io.Reader) *Scanner { + sc := bufio.NewScanner(r) + sc.Split(SplitFunc) + return &Scanner{ + Scanner: sc, + } +} diff --git a/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go b/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go new file mode 100644 index 000000000..08987f549 --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/graphemes/splitfunc.go @@ -0,0 +1,174 @@ +package graphemes + +import ( + "bufio" + + "github.com/clipperhouse/uax29/v2/internal/iterators" +) + +// is determines if lookup intersects propert(ies) +func (lookup property) is(properties property) bool { + return (lookup & properties) != 0 +} + +const _Ignore = _Extend + +// SplitFunc is a bufio.SplitFunc implementation of Unicode grapheme cluster segmentation, for use with bufio.Scanner. +// +// See https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries. +var SplitFunc bufio.SplitFunc = splitFunc[[]byte] + +func splitFunc[T iterators.Stringish](data T, atEOF bool) (advance int, token T, err error) { + var empty T + if len(data) == 0 { + return 0, empty, nil + } + + // These vars are stateful across loop iterations + var pos int + var lastExIgnore property = 0 // "last excluding ignored categories" + var lastLastExIgnore property = 0 // "last one before that" + var regionalIndicatorCount int + + // Rules are usually of the form Cat1 ร— Cat2; "current" refers to the first property + // to the right of the ร—, from which we look back or forward + + current, w := lookup(data[pos:]) + if w == 0 { + if !atEOF { + // Rune extends past current data, request more + return 0, empty, nil + } + pos = len(data) + return pos, data[:pos], nil + } + + // https://unicode.org/reports/tr29/#GB1 + // Start of text always advances + pos += w + + for { + eot := pos == len(data) // "end of text" + + if eot { + if !atEOF { + // Token extends past current data, request more + return 0, empty, nil + } + + // https://unicode.org/reports/tr29/#GB2 + break + } + + /* + We've switched the evaluation order of GB1โ†“ and GB2โ†‘. It's ok: + because we've checked for len(data) at the top of this function, + sot and eot are mutually exclusive, order doesn't matter. + */ + + // Rules are usually of the form Cat1 ร— Cat2; "current" refers to the first property + // to the right of the ร—, from which we look back or forward + + // Remember previous properties to avoid lookups/lookbacks + last := current + if !last.is(_Ignore) { + lastLastExIgnore = lastExIgnore + lastExIgnore = last + } + + current, w = lookup(data[pos:]) + if w == 0 { + if atEOF { + // Just return the bytes, we can't do anything with them + pos = len(data) + break + } + // Rune extends past current data, request more + return 0, empty, nil + } + + // Optimization: no rule can possibly apply + if current|last == 0 { // i.e. both are zero + break + } + + // https://unicode.org/reports/tr29/#GB3 + if current.is(_LF) && last.is(_CR) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB4 + // https://unicode.org/reports/tr29/#GB5 + if (current | last).is(_Control | _CR | _LF) { + break + } + + // https://unicode.org/reports/tr29/#GB6 + if current.is(_L|_V|_LV|_LVT) && last.is(_L) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB7 + if current.is(_V|_T) && last.is(_LV|_V) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB8 + if current.is(_T) && last.is(_LVT|_T) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB9 + if current.is(_Extend | _ZWJ) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB9a + if current.is(_SpacingMark) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB9b + if last.is(_Prepend) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB9c + // TODO(clipperhouse): + // It appears to be added in Unicode 15.1.0: + // https://unicode.org/versions/Unicode15.1.0/#Migration + // This package currently supports Unicode 15.0.0, so + // out of scope for now + + // https://unicode.org/reports/tr29/#GB11 + if current.is(_ExtendedPictographic) && last.is(_ZWJ) && lastLastExIgnore.is(_ExtendedPictographic) { + pos += w + continue + } + + // https://unicode.org/reports/tr29/#GB12 + // https://unicode.org/reports/tr29/#GB13 + if (current & last).is(_RegionalIndicator) { + regionalIndicatorCount++ + + odd := regionalIndicatorCount%2 == 1 + if odd { + pos += w + continue + } + } + + // If we fall through all the above rules, it's a grapheme cluster break + break + } + + // Return token + return pos, data[:pos], nil +} diff --git a/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go b/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go new file mode 100644 index 000000000..c8c6c33bc --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/graphemes/trie.go @@ -0,0 +1,1409 @@ +package graphemes + +// generated by github.com/clipperhouse/uax29/v2 +// from https://www.unicode.org/Public/15.0.0/ucd/auxiliary/GraphemeBreakProperty.txt + +import "github.com/clipperhouse/uax29/v2/internal/iterators" + +type property uint16 + +const ( + _CR property = 1 << iota + _Control + _Extend + _ExtendedPictographic + _L + _LF + _LV + _LVT + _Prepend + _RegionalIndicator + _SpacingMark + _T + _V + _ZWJ +) + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func lookup[T iterators.Stringish](s T) (v property, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return graphemesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := graphemesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := graphemesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = graphemesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := graphemesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = graphemesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = graphemesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// graphemesTrie. Total size: 29120 bytes (28.44 KiB). Checksum: 80ad0c5ab9375f7. +// type graphemesTrie struct { } + +// func newGraphemesTrie(i int) *graphemesTrie { +// return &graphemesTrie{} +// } + +// lookupValue determines the type of block n and looks up the value for b. +func lookupValue(n uint32, b byte) property { + switch { + default: + return property(graphemesValues[n<<6+uint32(b)]) + } +} + +// graphemesValues: 215 blocks, 13760 entries, 27520 bytes +// The third block is the zero block. +var graphemesValues = [13760]property{ + // Block 0x0, offset 0x0 + 0x00: 0x0002, 0x01: 0x0002, 0x02: 0x0002, 0x03: 0x0002, 0x04: 0x0002, 0x05: 0x0002, + 0x06: 0x0002, 0x07: 0x0002, 0x08: 0x0002, 0x09: 0x0002, 0x0a: 0x0020, 0x0b: 0x0002, + 0x0c: 0x0002, 0x0d: 0x0001, 0x0e: 0x0002, 0x0f: 0x0002, 0x10: 0x0002, 0x11: 0x0002, + 0x12: 0x0002, 0x13: 0x0002, 0x14: 0x0002, 0x15: 0x0002, 0x16: 0x0002, 0x17: 0x0002, + 0x18: 0x0002, 0x19: 0x0002, 0x1a: 0x0002, 0x1b: 0x0002, 0x1c: 0x0002, 0x1d: 0x0002, + 0x1e: 0x0002, 0x1f: 0x0002, + // Block 0x1, offset 0x40 + 0x7f: 0x0002, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0002, 0xc1: 0x0002, 0xc2: 0x0002, 0xc3: 0x0002, 0xc4: 0x0002, 0xc5: 0x0002, + 0xc6: 0x0002, 0xc7: 0x0002, 0xc8: 0x0002, 0xc9: 0x0002, 0xca: 0x0002, 0xcb: 0x0002, + 0xcc: 0x0002, 0xcd: 0x0002, 0xce: 0x0002, 0xcf: 0x0002, 0xd0: 0x0002, 0xd1: 0x0002, + 0xd2: 0x0002, 0xd3: 0x0002, 0xd4: 0x0002, 0xd5: 0x0002, 0xd6: 0x0002, 0xd7: 0x0002, + 0xd8: 0x0002, 0xd9: 0x0002, 0xda: 0x0002, 0xdb: 0x0002, 0xdc: 0x0002, 0xdd: 0x0002, + 0xde: 0x0002, 0xdf: 0x0002, + 0xe9: 0x0008, + 0xed: 0x0002, 0xee: 0x0008, + // Block 0x4, offset 0x100 + 0x100: 0x0004, 0x101: 0x0004, 0x102: 0x0004, 0x103: 0x0004, 0x104: 0x0004, 0x105: 0x0004, + 0x106: 0x0004, 0x107: 0x0004, 0x108: 0x0004, 0x109: 0x0004, 0x10a: 0x0004, 0x10b: 0x0004, + 0x10c: 0x0004, 0x10d: 0x0004, 0x10e: 0x0004, 0x10f: 0x0004, 0x110: 0x0004, 0x111: 0x0004, + 0x112: 0x0004, 0x113: 0x0004, 0x114: 0x0004, 0x115: 0x0004, 0x116: 0x0004, 0x117: 0x0004, + 0x118: 0x0004, 0x119: 0x0004, 0x11a: 0x0004, 0x11b: 0x0004, 0x11c: 0x0004, 0x11d: 0x0004, + 0x11e: 0x0004, 0x11f: 0x0004, 0x120: 0x0004, 0x121: 0x0004, 0x122: 0x0004, 0x123: 0x0004, + 0x124: 0x0004, 0x125: 0x0004, 0x126: 0x0004, 0x127: 0x0004, 0x128: 0x0004, 0x129: 0x0004, + 0x12a: 0x0004, 0x12b: 0x0004, 0x12c: 0x0004, 0x12d: 0x0004, 0x12e: 0x0004, 0x12f: 0x0004, + 0x130: 0x0004, 0x131: 0x0004, 0x132: 0x0004, 0x133: 0x0004, 0x134: 0x0004, 0x135: 0x0004, + 0x136: 0x0004, 0x137: 0x0004, 0x138: 0x0004, 0x139: 0x0004, 0x13a: 0x0004, 0x13b: 0x0004, + 0x13c: 0x0004, 0x13d: 0x0004, 0x13e: 0x0004, 0x13f: 0x0004, + // Block 0x5, offset 0x140 + 0x140: 0x0004, 0x141: 0x0004, 0x142: 0x0004, 0x143: 0x0004, 0x144: 0x0004, 0x145: 0x0004, + 0x146: 0x0004, 0x147: 0x0004, 0x148: 0x0004, 0x149: 0x0004, 0x14a: 0x0004, 0x14b: 0x0004, + 0x14c: 0x0004, 0x14d: 0x0004, 0x14e: 0x0004, 0x14f: 0x0004, 0x150: 0x0004, 0x151: 0x0004, + 0x152: 0x0004, 0x153: 0x0004, 0x154: 0x0004, 0x155: 0x0004, 0x156: 0x0004, 0x157: 0x0004, + 0x158: 0x0004, 0x159: 0x0004, 0x15a: 0x0004, 0x15b: 0x0004, 0x15c: 0x0004, 0x15d: 0x0004, + 0x15e: 0x0004, 0x15f: 0x0004, 0x160: 0x0004, 0x161: 0x0004, 0x162: 0x0004, 0x163: 0x0004, + 0x164: 0x0004, 0x165: 0x0004, 0x166: 0x0004, 0x167: 0x0004, 0x168: 0x0004, 0x169: 0x0004, + 0x16a: 0x0004, 0x16b: 0x0004, 0x16c: 0x0004, 0x16d: 0x0004, 0x16e: 0x0004, 0x16f: 0x0004, + // Block 0x6, offset 0x180 + 0x183: 0x0004, 0x184: 0x0004, 0x185: 0x0004, + 0x186: 0x0004, 0x187: 0x0004, 0x188: 0x0004, 0x189: 0x0004, + // Block 0x7, offset 0x1c0 + 0x1d1: 0x0004, + 0x1d2: 0x0004, 0x1d3: 0x0004, 0x1d4: 0x0004, 0x1d5: 0x0004, 0x1d6: 0x0004, 0x1d7: 0x0004, + 0x1d8: 0x0004, 0x1d9: 0x0004, 0x1da: 0x0004, 0x1db: 0x0004, 0x1dc: 0x0004, 0x1dd: 0x0004, + 0x1de: 0x0004, 0x1df: 0x0004, 0x1e0: 0x0004, 0x1e1: 0x0004, 0x1e2: 0x0004, 0x1e3: 0x0004, + 0x1e4: 0x0004, 0x1e5: 0x0004, 0x1e6: 0x0004, 0x1e7: 0x0004, 0x1e8: 0x0004, 0x1e9: 0x0004, + 0x1ea: 0x0004, 0x1eb: 0x0004, 0x1ec: 0x0004, 0x1ed: 0x0004, 0x1ee: 0x0004, 0x1ef: 0x0004, + 0x1f0: 0x0004, 0x1f1: 0x0004, 0x1f2: 0x0004, 0x1f3: 0x0004, 0x1f4: 0x0004, 0x1f5: 0x0004, + 0x1f6: 0x0004, 0x1f7: 0x0004, 0x1f8: 0x0004, 0x1f9: 0x0004, 0x1fa: 0x0004, 0x1fb: 0x0004, + 0x1fc: 0x0004, 0x1fd: 0x0004, 0x1ff: 0x0004, + // Block 0x8, offset 0x200 + 0x201: 0x0004, 0x202: 0x0004, 0x204: 0x0004, 0x205: 0x0004, + 0x207: 0x0004, + // Block 0x9, offset 0x240 + 0x240: 0x0100, 0x241: 0x0100, 0x242: 0x0100, 0x243: 0x0100, 0x244: 0x0100, 0x245: 0x0100, + 0x250: 0x0004, 0x251: 0x0004, + 0x252: 0x0004, 0x253: 0x0004, 0x254: 0x0004, 0x255: 0x0004, 0x256: 0x0004, 0x257: 0x0004, + 0x258: 0x0004, 0x259: 0x0004, 0x25a: 0x0004, 0x25c: 0x0002, + // Block 0xa, offset 0x280 + 0x28b: 0x0004, + 0x28c: 0x0004, 0x28d: 0x0004, 0x28e: 0x0004, 0x28f: 0x0004, 0x290: 0x0004, 0x291: 0x0004, + 0x292: 0x0004, 0x293: 0x0004, 0x294: 0x0004, 0x295: 0x0004, 0x296: 0x0004, 0x297: 0x0004, + 0x298: 0x0004, 0x299: 0x0004, 0x29a: 0x0004, 0x29b: 0x0004, 0x29c: 0x0004, 0x29d: 0x0004, + 0x29e: 0x0004, 0x29f: 0x0004, + 0x2b0: 0x0004, + // Block 0xb, offset 0x2c0 + 0x2d6: 0x0004, 0x2d7: 0x0004, + 0x2d8: 0x0004, 0x2d9: 0x0004, 0x2da: 0x0004, 0x2db: 0x0004, 0x2dc: 0x0004, 0x2dd: 0x0100, + 0x2df: 0x0004, 0x2e0: 0x0004, 0x2e1: 0x0004, 0x2e2: 0x0004, 0x2e3: 0x0004, + 0x2e4: 0x0004, 0x2e7: 0x0004, 0x2e8: 0x0004, + 0x2ea: 0x0004, 0x2eb: 0x0004, 0x2ec: 0x0004, 0x2ed: 0x0004, + // Block 0xc, offset 0x300 + 0x30f: 0x0100, 0x311: 0x0004, + 0x330: 0x0004, 0x331: 0x0004, 0x332: 0x0004, 0x333: 0x0004, 0x334: 0x0004, 0x335: 0x0004, + 0x336: 0x0004, 0x337: 0x0004, 0x338: 0x0004, 0x339: 0x0004, 0x33a: 0x0004, 0x33b: 0x0004, + 0x33c: 0x0004, 0x33d: 0x0004, 0x33e: 0x0004, 0x33f: 0x0004, + // Block 0xd, offset 0x340 + 0x340: 0x0004, 0x341: 0x0004, 0x342: 0x0004, 0x343: 0x0004, 0x344: 0x0004, 0x345: 0x0004, + 0x346: 0x0004, 0x347: 0x0004, 0x348: 0x0004, 0x349: 0x0004, 0x34a: 0x0004, + // Block 0xe, offset 0x380 + 0x3a6: 0x0004, 0x3a7: 0x0004, 0x3a8: 0x0004, 0x3a9: 0x0004, + 0x3aa: 0x0004, 0x3ab: 0x0004, 0x3ac: 0x0004, 0x3ad: 0x0004, 0x3ae: 0x0004, 0x3af: 0x0004, + 0x3b0: 0x0004, + // Block 0xf, offset 0x3c0 + 0x3eb: 0x0004, 0x3ec: 0x0004, 0x3ed: 0x0004, 0x3ee: 0x0004, 0x3ef: 0x0004, + 0x3f0: 0x0004, 0x3f1: 0x0004, 0x3f2: 0x0004, 0x3f3: 0x0004, + 0x3fd: 0x0004, + // Block 0x10, offset 0x400 + 0x416: 0x0004, 0x417: 0x0004, + 0x418: 0x0004, 0x419: 0x0004, 0x41b: 0x0004, 0x41c: 0x0004, 0x41d: 0x0004, + 0x41e: 0x0004, 0x41f: 0x0004, 0x420: 0x0004, 0x421: 0x0004, 0x422: 0x0004, 0x423: 0x0004, + 0x425: 0x0004, 0x426: 0x0004, 0x427: 0x0004, 0x429: 0x0004, + 0x42a: 0x0004, 0x42b: 0x0004, 0x42c: 0x0004, 0x42d: 0x0004, + // Block 0x11, offset 0x440 + 0x459: 0x0004, 0x45a: 0x0004, 0x45b: 0x0004, + // Block 0x12, offset 0x480 + 0x490: 0x0100, 0x491: 0x0100, + 0x498: 0x0004, 0x499: 0x0004, 0x49a: 0x0004, 0x49b: 0x0004, 0x49c: 0x0004, 0x49d: 0x0004, + 0x49e: 0x0004, 0x49f: 0x0004, + // Block 0x13, offset 0x4c0 + 0x4ca: 0x0004, 0x4cb: 0x0004, + 0x4cc: 0x0004, 0x4cd: 0x0004, 0x4ce: 0x0004, 0x4cf: 0x0004, 0x4d0: 0x0004, 0x4d1: 0x0004, + 0x4d2: 0x0004, 0x4d3: 0x0004, 0x4d4: 0x0004, 0x4d5: 0x0004, 0x4d6: 0x0004, 0x4d7: 0x0004, + 0x4d8: 0x0004, 0x4d9: 0x0004, 0x4da: 0x0004, 0x4db: 0x0004, 0x4dc: 0x0004, 0x4dd: 0x0004, + 0x4de: 0x0004, 0x4df: 0x0004, 0x4e0: 0x0004, 0x4e1: 0x0004, 0x4e2: 0x0100, 0x4e3: 0x0004, + 0x4e4: 0x0004, 0x4e5: 0x0004, 0x4e6: 0x0004, 0x4e7: 0x0004, 0x4e8: 0x0004, 0x4e9: 0x0004, + 0x4ea: 0x0004, 0x4eb: 0x0004, 0x4ec: 0x0004, 0x4ed: 0x0004, 0x4ee: 0x0004, 0x4ef: 0x0004, + 0x4f0: 0x0004, 0x4f1: 0x0004, 0x4f2: 0x0004, 0x4f3: 0x0004, 0x4f4: 0x0004, 0x4f5: 0x0004, + 0x4f6: 0x0004, 0x4f7: 0x0004, 0x4f8: 0x0004, 0x4f9: 0x0004, 0x4fa: 0x0004, 0x4fb: 0x0004, + 0x4fc: 0x0004, 0x4fd: 0x0004, 0x4fe: 0x0004, 0x4ff: 0x0004, + // Block 0x14, offset 0x500 + 0x500: 0x0004, 0x501: 0x0004, 0x502: 0x0004, 0x503: 0x0400, + 0x53a: 0x0004, 0x53b: 0x0400, + 0x53c: 0x0004, 0x53e: 0x0400, 0x53f: 0x0400, + // Block 0x15, offset 0x540 + 0x540: 0x0400, 0x541: 0x0004, 0x542: 0x0004, 0x543: 0x0004, 0x544: 0x0004, 0x545: 0x0004, + 0x546: 0x0004, 0x547: 0x0004, 0x548: 0x0004, 0x549: 0x0400, 0x54a: 0x0400, 0x54b: 0x0400, + 0x54c: 0x0400, 0x54d: 0x0004, 0x54e: 0x0400, 0x54f: 0x0400, 0x551: 0x0004, + 0x552: 0x0004, 0x553: 0x0004, 0x554: 0x0004, 0x555: 0x0004, 0x556: 0x0004, 0x557: 0x0004, + 0x562: 0x0004, 0x563: 0x0004, + // Block 0x16, offset 0x580 + 0x581: 0x0004, 0x582: 0x0400, 0x583: 0x0400, + 0x5bc: 0x0004, 0x5be: 0x0004, 0x5bf: 0x0400, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0400, 0x5c1: 0x0004, 0x5c2: 0x0004, 0x5c3: 0x0004, 0x5c4: 0x0004, + 0x5c7: 0x0400, 0x5c8: 0x0400, 0x5cb: 0x0400, + 0x5cc: 0x0400, 0x5cd: 0x0004, + 0x5d7: 0x0004, + 0x5e2: 0x0004, 0x5e3: 0x0004, + 0x5fe: 0x0004, + // Block 0x18, offset 0x600 + 0x601: 0x0004, 0x602: 0x0004, 0x603: 0x0400, + 0x63c: 0x0004, 0x63e: 0x0400, 0x63f: 0x0400, + // Block 0x19, offset 0x640 + 0x640: 0x0400, 0x641: 0x0004, 0x642: 0x0004, + 0x647: 0x0004, 0x648: 0x0004, 0x64b: 0x0004, + 0x64c: 0x0004, 0x64d: 0x0004, 0x651: 0x0004, + 0x670: 0x0004, 0x671: 0x0004, 0x675: 0x0004, + // Block 0x1a, offset 0x680 + 0x680: 0x0400, 0x681: 0x0004, 0x682: 0x0004, 0x683: 0x0004, 0x684: 0x0004, 0x685: 0x0004, + 0x687: 0x0004, 0x688: 0x0004, 0x689: 0x0400, 0x68b: 0x0400, + 0x68c: 0x0400, 0x68d: 0x0004, + 0x6a2: 0x0004, 0x6a3: 0x0004, + 0x6ba: 0x0004, 0x6bb: 0x0004, + 0x6bc: 0x0004, 0x6bd: 0x0004, 0x6be: 0x0004, 0x6bf: 0x0004, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x0004, 0x6c2: 0x0400, 0x6c3: 0x0400, + 0x6fc: 0x0004, 0x6fe: 0x0004, 0x6ff: 0x0004, + // Block 0x1c, offset 0x700 + 0x700: 0x0400, 0x701: 0x0004, 0x702: 0x0004, 0x703: 0x0004, 0x704: 0x0004, + 0x707: 0x0400, 0x708: 0x0400, 0x70b: 0x0400, + 0x70c: 0x0400, 0x70d: 0x0004, + 0x715: 0x0004, 0x716: 0x0004, 0x717: 0x0004, + 0x722: 0x0004, 0x723: 0x0004, + // Block 0x1d, offset 0x740 + 0x742: 0x0004, + 0x77e: 0x0004, 0x77f: 0x0400, + // Block 0x1e, offset 0x780 + 0x780: 0x0004, 0x781: 0x0400, 0x782: 0x0400, + 0x786: 0x0400, 0x787: 0x0400, 0x788: 0x0400, 0x78a: 0x0400, 0x78b: 0x0400, + 0x78c: 0x0400, 0x78d: 0x0004, + 0x797: 0x0004, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x0004, 0x7c1: 0x0400, 0x7c2: 0x0400, 0x7c3: 0x0400, 0x7c4: 0x0004, + 0x7fc: 0x0004, 0x7fe: 0x0004, 0x7ff: 0x0004, + // Block 0x20, offset 0x800 + 0x800: 0x0004, 0x801: 0x0400, 0x802: 0x0400, 0x803: 0x0400, 0x804: 0x0400, + 0x806: 0x0004, 0x807: 0x0004, 0x808: 0x0004, 0x80a: 0x0004, 0x80b: 0x0004, + 0x80c: 0x0004, 0x80d: 0x0004, + 0x815: 0x0004, 0x816: 0x0004, + 0x822: 0x0004, 0x823: 0x0004, + // Block 0x21, offset 0x840 + 0x841: 0x0004, 0x842: 0x0400, 0x843: 0x0400, + 0x87c: 0x0004, 0x87e: 0x0400, 0x87f: 0x0004, + // Block 0x22, offset 0x880 + 0x880: 0x0400, 0x881: 0x0400, 0x882: 0x0004, 0x883: 0x0400, 0x884: 0x0400, + 0x886: 0x0004, 0x887: 0x0400, 0x888: 0x0400, 0x88a: 0x0400, 0x88b: 0x0400, + 0x88c: 0x0004, 0x88d: 0x0004, + 0x895: 0x0004, 0x896: 0x0004, + 0x8a2: 0x0004, 0x8a3: 0x0004, + 0x8b3: 0x0400, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0004, 0x8c1: 0x0004, 0x8c2: 0x0400, 0x8c3: 0x0400, + 0x8fb: 0x0004, + 0x8fc: 0x0004, 0x8fe: 0x0004, 0x8ff: 0x0400, + // Block 0x24, offset 0x900 + 0x900: 0x0400, 0x901: 0x0004, 0x902: 0x0004, 0x903: 0x0004, 0x904: 0x0004, + 0x906: 0x0400, 0x907: 0x0400, 0x908: 0x0400, 0x90a: 0x0400, 0x90b: 0x0400, + 0x90c: 0x0400, 0x90d: 0x0004, 0x90e: 0x0100, + 0x917: 0x0004, + 0x922: 0x0004, 0x923: 0x0004, + // Block 0x25, offset 0x940 + 0x941: 0x0004, 0x942: 0x0400, 0x943: 0x0400, + // Block 0x26, offset 0x980 + 0x98a: 0x0004, + 0x98f: 0x0004, 0x990: 0x0400, 0x991: 0x0400, + 0x992: 0x0004, 0x993: 0x0004, 0x994: 0x0004, 0x996: 0x0004, + 0x998: 0x0400, 0x999: 0x0400, 0x99a: 0x0400, 0x99b: 0x0400, 0x99c: 0x0400, 0x99d: 0x0400, + 0x99e: 0x0400, 0x99f: 0x0004, + 0x9b2: 0x0400, 0x9b3: 0x0400, + // Block 0x27, offset 0x9c0 + 0x9f1: 0x0004, 0x9f3: 0x0400, 0x9f4: 0x0004, 0x9f5: 0x0004, + 0x9f6: 0x0004, 0x9f7: 0x0004, 0x9f8: 0x0004, 0x9f9: 0x0004, 0x9fa: 0x0004, + // Block 0x28, offset 0xa00 + 0xa07: 0x0004, 0xa08: 0x0004, 0xa09: 0x0004, 0xa0a: 0x0004, 0xa0b: 0x0004, + 0xa0c: 0x0004, 0xa0d: 0x0004, 0xa0e: 0x0004, + // Block 0x29, offset 0xa40 + 0xa71: 0x0004, 0xa73: 0x0400, 0xa74: 0x0004, 0xa75: 0x0004, + 0xa76: 0x0004, 0xa77: 0x0004, 0xa78: 0x0004, 0xa79: 0x0004, 0xa7a: 0x0004, 0xa7b: 0x0004, + 0xa7c: 0x0004, + // Block 0x2a, offset 0xa80 + 0xa88: 0x0004, 0xa89: 0x0004, 0xa8a: 0x0004, 0xa8b: 0x0004, + 0xa8c: 0x0004, 0xa8d: 0x0004, 0xa8e: 0x0004, + // Block 0x2b, offset 0xac0 + 0xad8: 0x0004, 0xad9: 0x0004, + 0xaf5: 0x0004, + 0xaf7: 0x0004, 0xaf9: 0x0004, + 0xafe: 0x0400, 0xaff: 0x0400, + // Block 0x2c, offset 0xb00 + 0xb31: 0x0004, 0xb32: 0x0004, 0xb33: 0x0004, 0xb34: 0x0004, 0xb35: 0x0004, + 0xb36: 0x0004, 0xb37: 0x0004, 0xb38: 0x0004, 0xb39: 0x0004, 0xb3a: 0x0004, 0xb3b: 0x0004, + 0xb3c: 0x0004, 0xb3d: 0x0004, 0xb3e: 0x0004, 0xb3f: 0x0400, + // Block 0x2d, offset 0xb40 + 0xb40: 0x0004, 0xb41: 0x0004, 0xb42: 0x0004, 0xb43: 0x0004, 0xb44: 0x0004, + 0xb46: 0x0004, 0xb47: 0x0004, + 0xb4d: 0x0004, 0xb4e: 0x0004, 0xb4f: 0x0004, 0xb50: 0x0004, 0xb51: 0x0004, + 0xb52: 0x0004, 0xb53: 0x0004, 0xb54: 0x0004, 0xb55: 0x0004, 0xb56: 0x0004, 0xb57: 0x0004, + 0xb59: 0x0004, 0xb5a: 0x0004, 0xb5b: 0x0004, 0xb5c: 0x0004, 0xb5d: 0x0004, + 0xb5e: 0x0004, 0xb5f: 0x0004, 0xb60: 0x0004, 0xb61: 0x0004, 0xb62: 0x0004, 0xb63: 0x0004, + 0xb64: 0x0004, 0xb65: 0x0004, 0xb66: 0x0004, 0xb67: 0x0004, 0xb68: 0x0004, 0xb69: 0x0004, + 0xb6a: 0x0004, 0xb6b: 0x0004, 0xb6c: 0x0004, 0xb6d: 0x0004, 0xb6e: 0x0004, 0xb6f: 0x0004, + 0xb70: 0x0004, 0xb71: 0x0004, 0xb72: 0x0004, 0xb73: 0x0004, 0xb74: 0x0004, 0xb75: 0x0004, + 0xb76: 0x0004, 0xb77: 0x0004, 0xb78: 0x0004, 0xb79: 0x0004, 0xb7a: 0x0004, 0xb7b: 0x0004, + 0xb7c: 0x0004, + // Block 0x2e, offset 0xb80 + 0xb86: 0x0004, + // Block 0x2f, offset 0xbc0 + 0xbed: 0x0004, 0xbee: 0x0004, 0xbef: 0x0004, + 0xbf0: 0x0004, 0xbf1: 0x0400, 0xbf2: 0x0004, 0xbf3: 0x0004, 0xbf4: 0x0004, 0xbf5: 0x0004, + 0xbf6: 0x0004, 0xbf7: 0x0004, 0xbf9: 0x0004, 0xbfa: 0x0004, 0xbfb: 0x0400, + 0xbfc: 0x0400, 0xbfd: 0x0004, 0xbfe: 0x0004, + // Block 0x30, offset 0xc00 + 0xc16: 0x0400, 0xc17: 0x0400, + 0xc18: 0x0004, 0xc19: 0x0004, + 0xc1e: 0x0004, 0xc1f: 0x0004, 0xc20: 0x0004, + 0xc31: 0x0004, 0xc32: 0x0004, 0xc33: 0x0004, 0xc34: 0x0004, + // Block 0x31, offset 0xc40 + 0xc42: 0x0004, 0xc44: 0x0400, 0xc45: 0x0004, + 0xc46: 0x0004, + 0xc4d: 0x0004, + 0xc5d: 0x0004, + // Block 0x32, offset 0xc80 + 0xc80: 0x0010, 0xc81: 0x0010, 0xc82: 0x0010, 0xc83: 0x0010, 0xc84: 0x0010, 0xc85: 0x0010, + 0xc86: 0x0010, 0xc87: 0x0010, 0xc88: 0x0010, 0xc89: 0x0010, 0xc8a: 0x0010, 0xc8b: 0x0010, + 0xc8c: 0x0010, 0xc8d: 0x0010, 0xc8e: 0x0010, 0xc8f: 0x0010, 0xc90: 0x0010, 0xc91: 0x0010, + 0xc92: 0x0010, 0xc93: 0x0010, 0xc94: 0x0010, 0xc95: 0x0010, 0xc96: 0x0010, 0xc97: 0x0010, + 0xc98: 0x0010, 0xc99: 0x0010, 0xc9a: 0x0010, 0xc9b: 0x0010, 0xc9c: 0x0010, 0xc9d: 0x0010, + 0xc9e: 0x0010, 0xc9f: 0x0010, 0xca0: 0x0010, 0xca1: 0x0010, 0xca2: 0x0010, 0xca3: 0x0010, + 0xca4: 0x0010, 0xca5: 0x0010, 0xca6: 0x0010, 0xca7: 0x0010, 0xca8: 0x0010, 0xca9: 0x0010, + 0xcaa: 0x0010, 0xcab: 0x0010, 0xcac: 0x0010, 0xcad: 0x0010, 0xcae: 0x0010, 0xcaf: 0x0010, + 0xcb0: 0x0010, 0xcb1: 0x0010, 0xcb2: 0x0010, 0xcb3: 0x0010, 0xcb4: 0x0010, 0xcb5: 0x0010, + 0xcb6: 0x0010, 0xcb7: 0x0010, 0xcb8: 0x0010, 0xcb9: 0x0010, 0xcba: 0x0010, 0xcbb: 0x0010, + 0xcbc: 0x0010, 0xcbd: 0x0010, 0xcbe: 0x0010, 0xcbf: 0x0010, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x0010, 0xcc1: 0x0010, 0xcc2: 0x0010, 0xcc3: 0x0010, 0xcc4: 0x0010, 0xcc5: 0x0010, + 0xcc6: 0x0010, 0xcc7: 0x0010, 0xcc8: 0x0010, 0xcc9: 0x0010, 0xcca: 0x0010, 0xccb: 0x0010, + 0xccc: 0x0010, 0xccd: 0x0010, 0xcce: 0x0010, 0xccf: 0x0010, 0xcd0: 0x0010, 0xcd1: 0x0010, + 0xcd2: 0x0010, 0xcd3: 0x0010, 0xcd4: 0x0010, 0xcd5: 0x0010, 0xcd6: 0x0010, 0xcd7: 0x0010, + 0xcd8: 0x0010, 0xcd9: 0x0010, 0xcda: 0x0010, 0xcdb: 0x0010, 0xcdc: 0x0010, 0xcdd: 0x0010, + 0xcde: 0x0010, 0xcdf: 0x0010, 0xce0: 0x1000, 0xce1: 0x1000, 0xce2: 0x1000, 0xce3: 0x1000, + 0xce4: 0x1000, 0xce5: 0x1000, 0xce6: 0x1000, 0xce7: 0x1000, 0xce8: 0x1000, 0xce9: 0x1000, + 0xcea: 0x1000, 0xceb: 0x1000, 0xcec: 0x1000, 0xced: 0x1000, 0xcee: 0x1000, 0xcef: 0x1000, + 0xcf0: 0x1000, 0xcf1: 0x1000, 0xcf2: 0x1000, 0xcf3: 0x1000, 0xcf4: 0x1000, 0xcf5: 0x1000, + 0xcf6: 0x1000, 0xcf7: 0x1000, 0xcf8: 0x1000, 0xcf9: 0x1000, 0xcfa: 0x1000, 0xcfb: 0x1000, + 0xcfc: 0x1000, 0xcfd: 0x1000, 0xcfe: 0x1000, 0xcff: 0x1000, + // Block 0x34, offset 0xd00 + 0xd00: 0x1000, 0xd01: 0x1000, 0xd02: 0x1000, 0xd03: 0x1000, 0xd04: 0x1000, 0xd05: 0x1000, + 0xd06: 0x1000, 0xd07: 0x1000, 0xd08: 0x1000, 0xd09: 0x1000, 0xd0a: 0x1000, 0xd0b: 0x1000, + 0xd0c: 0x1000, 0xd0d: 0x1000, 0xd0e: 0x1000, 0xd0f: 0x1000, 0xd10: 0x1000, 0xd11: 0x1000, + 0xd12: 0x1000, 0xd13: 0x1000, 0xd14: 0x1000, 0xd15: 0x1000, 0xd16: 0x1000, 0xd17: 0x1000, + 0xd18: 0x1000, 0xd19: 0x1000, 0xd1a: 0x1000, 0xd1b: 0x1000, 0xd1c: 0x1000, 0xd1d: 0x1000, + 0xd1e: 0x1000, 0xd1f: 0x1000, 0xd20: 0x1000, 0xd21: 0x1000, 0xd22: 0x1000, 0xd23: 0x1000, + 0xd24: 0x1000, 0xd25: 0x1000, 0xd26: 0x1000, 0xd27: 0x1000, 0xd28: 0x0800, 0xd29: 0x0800, + 0xd2a: 0x0800, 0xd2b: 0x0800, 0xd2c: 0x0800, 0xd2d: 0x0800, 0xd2e: 0x0800, 0xd2f: 0x0800, + 0xd30: 0x0800, 0xd31: 0x0800, 0xd32: 0x0800, 0xd33: 0x0800, 0xd34: 0x0800, 0xd35: 0x0800, + 0xd36: 0x0800, 0xd37: 0x0800, 0xd38: 0x0800, 0xd39: 0x0800, 0xd3a: 0x0800, 0xd3b: 0x0800, + 0xd3c: 0x0800, 0xd3d: 0x0800, 0xd3e: 0x0800, 0xd3f: 0x0800, + // Block 0x35, offset 0xd40 + 0xd40: 0x0800, 0xd41: 0x0800, 0xd42: 0x0800, 0xd43: 0x0800, 0xd44: 0x0800, 0xd45: 0x0800, + 0xd46: 0x0800, 0xd47: 0x0800, 0xd48: 0x0800, 0xd49: 0x0800, 0xd4a: 0x0800, 0xd4b: 0x0800, + 0xd4c: 0x0800, 0xd4d: 0x0800, 0xd4e: 0x0800, 0xd4f: 0x0800, 0xd50: 0x0800, 0xd51: 0x0800, + 0xd52: 0x0800, 0xd53: 0x0800, 0xd54: 0x0800, 0xd55: 0x0800, 0xd56: 0x0800, 0xd57: 0x0800, + 0xd58: 0x0800, 0xd59: 0x0800, 0xd5a: 0x0800, 0xd5b: 0x0800, 0xd5c: 0x0800, 0xd5d: 0x0800, + 0xd5e: 0x0800, 0xd5f: 0x0800, 0xd60: 0x0800, 0xd61: 0x0800, 0xd62: 0x0800, 0xd63: 0x0800, + 0xd64: 0x0800, 0xd65: 0x0800, 0xd66: 0x0800, 0xd67: 0x0800, 0xd68: 0x0800, 0xd69: 0x0800, + 0xd6a: 0x0800, 0xd6b: 0x0800, 0xd6c: 0x0800, 0xd6d: 0x0800, 0xd6e: 0x0800, 0xd6f: 0x0800, + 0xd70: 0x0800, 0xd71: 0x0800, 0xd72: 0x0800, 0xd73: 0x0800, 0xd74: 0x0800, 0xd75: 0x0800, + 0xd76: 0x0800, 0xd77: 0x0800, 0xd78: 0x0800, 0xd79: 0x0800, 0xd7a: 0x0800, 0xd7b: 0x0800, + 0xd7c: 0x0800, 0xd7d: 0x0800, 0xd7e: 0x0800, 0xd7f: 0x0800, + // Block 0x36, offset 0xd80 + 0xd9d: 0x0004, + 0xd9e: 0x0004, 0xd9f: 0x0004, + // Block 0x37, offset 0xdc0 + 0xdd2: 0x0004, 0xdd3: 0x0004, 0xdd4: 0x0004, 0xdd5: 0x0400, + 0xdf2: 0x0004, 0xdf3: 0x0004, 0xdf4: 0x0400, + // Block 0x38, offset 0xe00 + 0xe12: 0x0004, 0xe13: 0x0004, + 0xe32: 0x0004, 0xe33: 0x0004, + // Block 0x39, offset 0xe40 + 0xe74: 0x0004, 0xe75: 0x0004, + 0xe76: 0x0400, 0xe77: 0x0004, 0xe78: 0x0004, 0xe79: 0x0004, 0xe7a: 0x0004, 0xe7b: 0x0004, + 0xe7c: 0x0004, 0xe7d: 0x0004, 0xe7e: 0x0400, 0xe7f: 0x0400, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0400, 0xe81: 0x0400, 0xe82: 0x0400, 0xe83: 0x0400, 0xe84: 0x0400, 0xe85: 0x0400, + 0xe86: 0x0004, 0xe87: 0x0400, 0xe88: 0x0400, 0xe89: 0x0004, 0xe8a: 0x0004, 0xe8b: 0x0004, + 0xe8c: 0x0004, 0xe8d: 0x0004, 0xe8e: 0x0004, 0xe8f: 0x0004, 0xe90: 0x0004, 0xe91: 0x0004, + 0xe92: 0x0004, 0xe93: 0x0004, + 0xe9d: 0x0004, + // Block 0x3b, offset 0xec0 + 0xecb: 0x0004, + 0xecc: 0x0004, 0xecd: 0x0004, 0xece: 0x0002, 0xecf: 0x0004, + // Block 0x3c, offset 0xf00 + 0xf05: 0x0004, + 0xf06: 0x0004, + 0xf29: 0x0004, + // Block 0x3d, offset 0xf40 + 0xf60: 0x0004, 0xf61: 0x0004, 0xf62: 0x0004, 0xf63: 0x0400, + 0xf64: 0x0400, 0xf65: 0x0400, 0xf66: 0x0400, 0xf67: 0x0004, 0xf68: 0x0004, 0xf69: 0x0400, + 0xf6a: 0x0400, 0xf6b: 0x0400, + 0xf70: 0x0400, 0xf71: 0x0400, 0xf72: 0x0004, 0xf73: 0x0400, 0xf74: 0x0400, 0xf75: 0x0400, + 0xf76: 0x0400, 0xf77: 0x0400, 0xf78: 0x0400, 0xf79: 0x0004, 0xf7a: 0x0004, 0xf7b: 0x0004, + // Block 0x3e, offset 0xf80 + 0xf97: 0x0004, + 0xf98: 0x0004, 0xf99: 0x0400, 0xf9a: 0x0400, 0xf9b: 0x0004, + // Block 0x3f, offset 0xfc0 + 0xfd5: 0x0400, 0xfd6: 0x0004, 0xfd7: 0x0400, + 0xfd8: 0x0004, 0xfd9: 0x0004, 0xfda: 0x0004, 0xfdb: 0x0004, 0xfdc: 0x0004, 0xfdd: 0x0004, + 0xfde: 0x0004, 0xfe0: 0x0004, 0xfe2: 0x0004, + 0xfe5: 0x0004, 0xfe6: 0x0004, 0xfe7: 0x0004, 0xfe8: 0x0004, 0xfe9: 0x0004, + 0xfea: 0x0004, 0xfeb: 0x0004, 0xfec: 0x0004, 0xfed: 0x0400, 0xfee: 0x0400, 0xfef: 0x0400, + 0xff0: 0x0400, 0xff1: 0x0400, 0xff2: 0x0400, 0xff3: 0x0004, 0xff4: 0x0004, 0xff5: 0x0004, + 0xff6: 0x0004, 0xff7: 0x0004, 0xff8: 0x0004, 0xff9: 0x0004, 0xffa: 0x0004, 0xffb: 0x0004, + 0xffc: 0x0004, 0xfff: 0x0004, + // Block 0x40, offset 0x1000 + 0x1030: 0x0004, 0x1031: 0x0004, 0x1032: 0x0004, 0x1033: 0x0004, 0x1034: 0x0004, 0x1035: 0x0004, + 0x1036: 0x0004, 0x1037: 0x0004, 0x1038: 0x0004, 0x1039: 0x0004, 0x103a: 0x0004, 0x103b: 0x0004, + 0x103c: 0x0004, 0x103d: 0x0004, 0x103e: 0x0004, 0x103f: 0x0004, + // Block 0x41, offset 0x1040 + 0x1040: 0x0004, 0x1041: 0x0004, 0x1042: 0x0004, 0x1043: 0x0004, 0x1044: 0x0004, 0x1045: 0x0004, + 0x1046: 0x0004, 0x1047: 0x0004, 0x1048: 0x0004, 0x1049: 0x0004, 0x104a: 0x0004, 0x104b: 0x0004, + 0x104c: 0x0004, 0x104d: 0x0004, 0x104e: 0x0004, + // Block 0x42, offset 0x1080 + 0x1080: 0x0004, 0x1081: 0x0004, 0x1082: 0x0004, 0x1083: 0x0004, 0x1084: 0x0400, + 0x10b4: 0x0004, 0x10b5: 0x0004, + 0x10b6: 0x0004, 0x10b7: 0x0004, 0x10b8: 0x0004, 0x10b9: 0x0004, 0x10ba: 0x0004, 0x10bb: 0x0400, + 0x10bc: 0x0004, 0x10bd: 0x0400, 0x10be: 0x0400, 0x10bf: 0x0400, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x0400, 0x10c1: 0x0400, 0x10c2: 0x0004, 0x10c3: 0x0400, 0x10c4: 0x0400, + 0x10eb: 0x0004, 0x10ec: 0x0004, 0x10ed: 0x0004, 0x10ee: 0x0004, 0x10ef: 0x0004, + 0x10f0: 0x0004, 0x10f1: 0x0004, 0x10f2: 0x0004, 0x10f3: 0x0004, + // Block 0x44, offset 0x1100 + 0x1100: 0x0004, 0x1101: 0x0004, 0x1102: 0x0400, + 0x1121: 0x0400, 0x1122: 0x0004, 0x1123: 0x0004, + 0x1124: 0x0004, 0x1125: 0x0004, 0x1126: 0x0400, 0x1127: 0x0400, 0x1128: 0x0004, 0x1129: 0x0004, + 0x112a: 0x0400, 0x112b: 0x0004, 0x112c: 0x0004, 0x112d: 0x0004, + // Block 0x45, offset 0x1140 + 0x1166: 0x0004, 0x1167: 0x0400, 0x1168: 0x0004, 0x1169: 0x0004, + 0x116a: 0x0400, 0x116b: 0x0400, 0x116c: 0x0400, 0x116d: 0x0004, 0x116e: 0x0400, 0x116f: 0x0004, + 0x1170: 0x0004, 0x1171: 0x0004, 0x1172: 0x0400, 0x1173: 0x0400, + // Block 0x46, offset 0x1180 + 0x11a4: 0x0400, 0x11a5: 0x0400, 0x11a6: 0x0400, 0x11a7: 0x0400, 0x11a8: 0x0400, 0x11a9: 0x0400, + 0x11aa: 0x0400, 0x11ab: 0x0400, 0x11ac: 0x0004, 0x11ad: 0x0004, 0x11ae: 0x0004, 0x11af: 0x0004, + 0x11b0: 0x0004, 0x11b1: 0x0004, 0x11b2: 0x0004, 0x11b3: 0x0004, 0x11b4: 0x0400, 0x11b5: 0x0400, + 0x11b6: 0x0004, 0x11b7: 0x0004, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0004, 0x11d1: 0x0004, + 0x11d2: 0x0004, 0x11d4: 0x0004, 0x11d5: 0x0004, 0x11d6: 0x0004, 0x11d7: 0x0004, + 0x11d8: 0x0004, 0x11d9: 0x0004, 0x11da: 0x0004, 0x11db: 0x0004, 0x11dc: 0x0004, 0x11dd: 0x0004, + 0x11de: 0x0004, 0x11df: 0x0004, 0x11e0: 0x0004, 0x11e1: 0x0400, 0x11e2: 0x0004, 0x11e3: 0x0004, + 0x11e4: 0x0004, 0x11e5: 0x0004, 0x11e6: 0x0004, 0x11e7: 0x0004, 0x11e8: 0x0004, + 0x11ed: 0x0004, + 0x11f4: 0x0004, + 0x11f7: 0x0400, 0x11f8: 0x0004, 0x11f9: 0x0004, + // Block 0x48, offset 0x1200 + 0x120b: 0x0002, + 0x120c: 0x0004, 0x120d: 0x2000, 0x120e: 0x0002, 0x120f: 0x0002, + 0x1228: 0x0002, 0x1229: 0x0002, + 0x122a: 0x0002, 0x122b: 0x0002, 0x122c: 0x0002, 0x122d: 0x0002, 0x122e: 0x0002, + 0x123c: 0x0008, + // Block 0x49, offset 0x1240 + 0x1249: 0x0008, + 0x1260: 0x0002, 0x1261: 0x0002, 0x1262: 0x0002, 0x1263: 0x0002, + 0x1264: 0x0002, 0x1265: 0x0002, 0x1266: 0x0002, 0x1267: 0x0002, 0x1268: 0x0002, 0x1269: 0x0002, + 0x126a: 0x0002, 0x126b: 0x0002, 0x126c: 0x0002, 0x126d: 0x0002, 0x126e: 0x0002, 0x126f: 0x0002, + // Block 0x4a, offset 0x1280 + 0x1290: 0x0004, 0x1291: 0x0004, + 0x1292: 0x0004, 0x1293: 0x0004, 0x1294: 0x0004, 0x1295: 0x0004, 0x1296: 0x0004, 0x1297: 0x0004, + 0x1298: 0x0004, 0x1299: 0x0004, 0x129a: 0x0004, 0x129b: 0x0004, 0x129c: 0x0004, 0x129d: 0x0004, + 0x129e: 0x0004, 0x129f: 0x0004, 0x12a0: 0x0004, 0x12a1: 0x0004, 0x12a2: 0x0004, 0x12a3: 0x0004, + 0x12a4: 0x0004, 0x12a5: 0x0004, 0x12a6: 0x0004, 0x12a7: 0x0004, 0x12a8: 0x0004, 0x12a9: 0x0004, + 0x12aa: 0x0004, 0x12ab: 0x0004, 0x12ac: 0x0004, 0x12ad: 0x0004, 0x12ae: 0x0004, 0x12af: 0x0004, + 0x12b0: 0x0004, + // Block 0x4b, offset 0x12c0 + 0x12e2: 0x0008, + 0x12f9: 0x0008, + // Block 0x4c, offset 0x1300 + 0x1314: 0x0008, 0x1315: 0x0008, 0x1316: 0x0008, 0x1317: 0x0008, + 0x1318: 0x0008, 0x1319: 0x0008, + 0x1329: 0x0008, + 0x132a: 0x0008, + // Block 0x4d, offset 0x1340 + 0x135a: 0x0008, 0x135b: 0x0008, + 0x1368: 0x0008, + // Block 0x4e, offset 0x1380 + 0x1388: 0x0008, + // Block 0x4f, offset 0x13c0 + 0x13cf: 0x0008, + 0x13e9: 0x0008, + 0x13ea: 0x0008, 0x13eb: 0x0008, 0x13ec: 0x0008, 0x13ed: 0x0008, 0x13ee: 0x0008, 0x13ef: 0x0008, + 0x13f0: 0x0008, 0x13f1: 0x0008, 0x13f2: 0x0008, 0x13f3: 0x0008, + 0x13f8: 0x0008, 0x13f9: 0x0008, 0x13fa: 0x0008, + // Block 0x50, offset 0x1400 + 0x1402: 0x0008, + // Block 0x51, offset 0x1440 + 0x146a: 0x0008, 0x146b: 0x0008, + 0x1476: 0x0008, + // Block 0x52, offset 0x1480 + 0x1480: 0x0008, + 0x14bb: 0x0008, + 0x14bc: 0x0008, 0x14bd: 0x0008, 0x14be: 0x0008, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0008, 0x14c1: 0x0008, 0x14c2: 0x0008, 0x14c3: 0x0008, 0x14c4: 0x0008, 0x14c5: 0x0008, + 0x14c7: 0x0008, 0x14c8: 0x0008, 0x14c9: 0x0008, 0x14ca: 0x0008, 0x14cb: 0x0008, + 0x14cc: 0x0008, 0x14cd: 0x0008, 0x14ce: 0x0008, 0x14cf: 0x0008, 0x14d0: 0x0008, 0x14d1: 0x0008, + 0x14d2: 0x0008, 0x14d4: 0x0008, 0x14d5: 0x0008, 0x14d6: 0x0008, 0x14d7: 0x0008, + 0x14d8: 0x0008, 0x14d9: 0x0008, 0x14da: 0x0008, 0x14db: 0x0008, 0x14dc: 0x0008, 0x14dd: 0x0008, + 0x14de: 0x0008, 0x14df: 0x0008, 0x14e0: 0x0008, 0x14e1: 0x0008, 0x14e2: 0x0008, 0x14e3: 0x0008, + 0x14e4: 0x0008, 0x14e5: 0x0008, 0x14e6: 0x0008, 0x14e7: 0x0008, 0x14e8: 0x0008, 0x14e9: 0x0008, + 0x14ea: 0x0008, 0x14eb: 0x0008, 0x14ec: 0x0008, 0x14ed: 0x0008, 0x14ee: 0x0008, 0x14ef: 0x0008, + 0x14f0: 0x0008, 0x14f1: 0x0008, 0x14f2: 0x0008, 0x14f3: 0x0008, 0x14f4: 0x0008, 0x14f5: 0x0008, + 0x14f6: 0x0008, 0x14f7: 0x0008, 0x14f8: 0x0008, 0x14f9: 0x0008, 0x14fa: 0x0008, 0x14fb: 0x0008, + 0x14fc: 0x0008, 0x14fd: 0x0008, 0x14fe: 0x0008, 0x14ff: 0x0008, + // Block 0x54, offset 0x1500 + 0x1500: 0x0008, 0x1501: 0x0008, 0x1502: 0x0008, 0x1503: 0x0008, 0x1504: 0x0008, 0x1505: 0x0008, + 0x1506: 0x0008, 0x1507: 0x0008, 0x1508: 0x0008, 0x1509: 0x0008, 0x150a: 0x0008, 0x150b: 0x0008, + 0x150c: 0x0008, 0x150d: 0x0008, 0x150e: 0x0008, 0x150f: 0x0008, 0x1510: 0x0008, 0x1511: 0x0008, + 0x1512: 0x0008, 0x1513: 0x0008, 0x1514: 0x0008, 0x1515: 0x0008, 0x1516: 0x0008, 0x1517: 0x0008, + 0x1518: 0x0008, 0x1519: 0x0008, 0x151a: 0x0008, 0x151b: 0x0008, 0x151c: 0x0008, 0x151d: 0x0008, + 0x151e: 0x0008, 0x151f: 0x0008, 0x1520: 0x0008, 0x1521: 0x0008, 0x1522: 0x0008, 0x1523: 0x0008, + 0x1524: 0x0008, 0x1525: 0x0008, 0x1526: 0x0008, 0x1527: 0x0008, 0x1528: 0x0008, 0x1529: 0x0008, + 0x152a: 0x0008, 0x152b: 0x0008, 0x152c: 0x0008, 0x152d: 0x0008, 0x152e: 0x0008, 0x152f: 0x0008, + 0x1530: 0x0008, 0x1531: 0x0008, 0x1532: 0x0008, 0x1533: 0x0008, 0x1534: 0x0008, 0x1535: 0x0008, + 0x1536: 0x0008, 0x1537: 0x0008, 0x1538: 0x0008, 0x1539: 0x0008, 0x153a: 0x0008, 0x153b: 0x0008, + 0x153c: 0x0008, 0x153d: 0x0008, 0x153e: 0x0008, 0x153f: 0x0008, + // Block 0x55, offset 0x1540 + 0x1540: 0x0008, 0x1541: 0x0008, 0x1542: 0x0008, 0x1543: 0x0008, 0x1544: 0x0008, 0x1545: 0x0008, + 0x1550: 0x0008, 0x1551: 0x0008, + 0x1552: 0x0008, 0x1553: 0x0008, 0x1554: 0x0008, 0x1555: 0x0008, 0x1556: 0x0008, 0x1557: 0x0008, + 0x1558: 0x0008, 0x1559: 0x0008, 0x155a: 0x0008, 0x155b: 0x0008, 0x155c: 0x0008, 0x155d: 0x0008, + 0x155e: 0x0008, 0x155f: 0x0008, 0x1560: 0x0008, 0x1561: 0x0008, 0x1562: 0x0008, 0x1563: 0x0008, + 0x1564: 0x0008, 0x1565: 0x0008, 0x1566: 0x0008, 0x1567: 0x0008, 0x1568: 0x0008, 0x1569: 0x0008, + 0x156a: 0x0008, 0x156b: 0x0008, 0x156c: 0x0008, 0x156d: 0x0008, 0x156e: 0x0008, 0x156f: 0x0008, + 0x1570: 0x0008, 0x1571: 0x0008, 0x1572: 0x0008, 0x1573: 0x0008, 0x1574: 0x0008, 0x1575: 0x0008, + 0x1576: 0x0008, 0x1577: 0x0008, 0x1578: 0x0008, 0x1579: 0x0008, 0x157a: 0x0008, 0x157b: 0x0008, + 0x157c: 0x0008, 0x157d: 0x0008, 0x157e: 0x0008, 0x157f: 0x0008, + // Block 0x56, offset 0x1580 + 0x1580: 0x0008, 0x1581: 0x0008, 0x1582: 0x0008, 0x1583: 0x0008, 0x1584: 0x0008, 0x1585: 0x0008, + 0x1588: 0x0008, 0x1589: 0x0008, 0x158a: 0x0008, 0x158b: 0x0008, + 0x158c: 0x0008, 0x158d: 0x0008, 0x158e: 0x0008, 0x158f: 0x0008, 0x1590: 0x0008, 0x1591: 0x0008, + 0x1592: 0x0008, 0x1594: 0x0008, 0x1596: 0x0008, + 0x159d: 0x0008, + 0x15a1: 0x0008, + 0x15a8: 0x0008, + 0x15b3: 0x0008, 0x15b4: 0x0008, + // Block 0x57, offset 0x15c0 + 0x15c4: 0x0008, + 0x15c7: 0x0008, + 0x15cc: 0x0008, 0x15ce: 0x0008, + 0x15d3: 0x0008, 0x15d4: 0x0008, 0x15d5: 0x0008, 0x15d7: 0x0008, + 0x15e3: 0x0008, + 0x15e4: 0x0008, 0x15e5: 0x0008, 0x15e6: 0x0008, 0x15e7: 0x0008, + // Block 0x58, offset 0x1600 + 0x1615: 0x0008, 0x1616: 0x0008, 0x1617: 0x0008, + 0x1621: 0x0008, + 0x1630: 0x0008, + 0x163f: 0x0008, + // Block 0x59, offset 0x1640 + 0x1674: 0x0008, 0x1675: 0x0008, + // Block 0x5a, offset 0x1680 + 0x1685: 0x0008, + 0x1686: 0x0008, 0x1687: 0x0008, + 0x169b: 0x0008, 0x169c: 0x0008, + // Block 0x5b, offset 0x16c0 + 0x16d0: 0x0008, + 0x16d5: 0x0008, + // Block 0x5c, offset 0x1700 + 0x172f: 0x0004, + 0x1730: 0x0004, 0x1731: 0x0004, + // Block 0x5d, offset 0x1740 + 0x177f: 0x0004, + // Block 0x5e, offset 0x1780 + 0x17a0: 0x0004, 0x17a1: 0x0004, 0x17a2: 0x0004, 0x17a3: 0x0004, + 0x17a4: 0x0004, 0x17a5: 0x0004, 0x17a6: 0x0004, 0x17a7: 0x0004, 0x17a8: 0x0004, 0x17a9: 0x0004, + 0x17aa: 0x0004, 0x17ab: 0x0004, 0x17ac: 0x0004, 0x17ad: 0x0004, 0x17ae: 0x0004, 0x17af: 0x0004, + 0x17b0: 0x0004, 0x17b1: 0x0004, 0x17b2: 0x0004, 0x17b3: 0x0004, 0x17b4: 0x0004, 0x17b5: 0x0004, + 0x17b6: 0x0004, 0x17b7: 0x0004, 0x17b8: 0x0004, 0x17b9: 0x0004, 0x17ba: 0x0004, 0x17bb: 0x0004, + 0x17bc: 0x0004, 0x17bd: 0x0004, 0x17be: 0x0004, 0x17bf: 0x0004, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x0004, 0x17eb: 0x0004, 0x17ec: 0x0004, 0x17ed: 0x0004, 0x17ee: 0x0004, 0x17ef: 0x0004, + 0x17f0: 0x0008, + 0x17fd: 0x0008, + // Block 0x60, offset 0x1800 + 0x1819: 0x0004, 0x181a: 0x0004, + // Block 0x61, offset 0x1840 + 0x1857: 0x0008, + 0x1859: 0x0008, + // Block 0x62, offset 0x1880 + 0x18af: 0x0004, + 0x18b0: 0x0004, 0x18b1: 0x0004, 0x18b2: 0x0004, 0x18b4: 0x0004, 0x18b5: 0x0004, + 0x18b6: 0x0004, 0x18b7: 0x0004, 0x18b8: 0x0004, 0x18b9: 0x0004, 0x18ba: 0x0004, 0x18bb: 0x0004, + 0x18bc: 0x0004, 0x18bd: 0x0004, + // Block 0x63, offset 0x18c0 + 0x18de: 0x0004, 0x18df: 0x0004, + // Block 0x64, offset 0x1900 + 0x1930: 0x0004, 0x1931: 0x0004, + // Block 0x65, offset 0x1940 + 0x1942: 0x0004, + 0x1946: 0x0004, 0x194b: 0x0004, + 0x1963: 0x0400, + 0x1964: 0x0400, 0x1965: 0x0004, 0x1966: 0x0004, 0x1967: 0x0400, + 0x196c: 0x0004, + // Block 0x66, offset 0x1980 + 0x1980: 0x0400, 0x1981: 0x0400, + 0x19b4: 0x0400, 0x19b5: 0x0400, + 0x19b6: 0x0400, 0x19b7: 0x0400, 0x19b8: 0x0400, 0x19b9: 0x0400, 0x19ba: 0x0400, 0x19bb: 0x0400, + 0x19bc: 0x0400, 0x19bd: 0x0400, 0x19be: 0x0400, 0x19bf: 0x0400, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x0400, 0x19c1: 0x0400, 0x19c2: 0x0400, 0x19c3: 0x0400, 0x19c4: 0x0004, 0x19c5: 0x0004, + 0x19e0: 0x0004, 0x19e1: 0x0004, 0x19e2: 0x0004, 0x19e3: 0x0004, + 0x19e4: 0x0004, 0x19e5: 0x0004, 0x19e6: 0x0004, 0x19e7: 0x0004, 0x19e8: 0x0004, 0x19e9: 0x0004, + 0x19ea: 0x0004, 0x19eb: 0x0004, 0x19ec: 0x0004, 0x19ed: 0x0004, 0x19ee: 0x0004, 0x19ef: 0x0004, + 0x19f0: 0x0004, 0x19f1: 0x0004, + 0x19ff: 0x0004, + // Block 0x68, offset 0x1a00 + 0x1a26: 0x0004, 0x1a27: 0x0004, 0x1a28: 0x0004, 0x1a29: 0x0004, + 0x1a2a: 0x0004, 0x1a2b: 0x0004, 0x1a2c: 0x0004, 0x1a2d: 0x0004, + // Block 0x69, offset 0x1a40 + 0x1a47: 0x0004, 0x1a48: 0x0004, 0x1a49: 0x0004, 0x1a4a: 0x0004, 0x1a4b: 0x0004, + 0x1a4c: 0x0004, 0x1a4d: 0x0004, 0x1a4e: 0x0004, 0x1a4f: 0x0004, 0x1a50: 0x0004, 0x1a51: 0x0004, + 0x1a52: 0x0400, 0x1a53: 0x0400, + 0x1a60: 0x0010, 0x1a61: 0x0010, 0x1a62: 0x0010, 0x1a63: 0x0010, + 0x1a64: 0x0010, 0x1a65: 0x0010, 0x1a66: 0x0010, 0x1a67: 0x0010, 0x1a68: 0x0010, 0x1a69: 0x0010, + 0x1a6a: 0x0010, 0x1a6b: 0x0010, 0x1a6c: 0x0010, 0x1a6d: 0x0010, 0x1a6e: 0x0010, 0x1a6f: 0x0010, + 0x1a70: 0x0010, 0x1a71: 0x0010, 0x1a72: 0x0010, 0x1a73: 0x0010, 0x1a74: 0x0010, 0x1a75: 0x0010, + 0x1a76: 0x0010, 0x1a77: 0x0010, 0x1a78: 0x0010, 0x1a79: 0x0010, 0x1a7a: 0x0010, 0x1a7b: 0x0010, + 0x1a7c: 0x0010, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x0004, 0x1a81: 0x0004, 0x1a82: 0x0004, 0x1a83: 0x0400, + 0x1ab3: 0x0004, 0x1ab4: 0x0400, 0x1ab5: 0x0400, + 0x1ab6: 0x0004, 0x1ab7: 0x0004, 0x1ab8: 0x0004, 0x1ab9: 0x0004, 0x1aba: 0x0400, 0x1abb: 0x0400, + 0x1abc: 0x0004, 0x1abd: 0x0004, 0x1abe: 0x0400, 0x1abf: 0x0400, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0400, + 0x1ae5: 0x0004, + // Block 0x6c, offset 0x1b00 + 0x1b29: 0x0004, + 0x1b2a: 0x0004, 0x1b2b: 0x0004, 0x1b2c: 0x0004, 0x1b2d: 0x0004, 0x1b2e: 0x0004, 0x1b2f: 0x0400, + 0x1b30: 0x0400, 0x1b31: 0x0004, 0x1b32: 0x0004, 0x1b33: 0x0400, 0x1b34: 0x0400, 0x1b35: 0x0004, + 0x1b36: 0x0004, + // Block 0x6d, offset 0x1b40 + 0x1b43: 0x0004, + 0x1b4c: 0x0004, 0x1b4d: 0x0400, + 0x1b7c: 0x0004, + // Block 0x6e, offset 0x1b80 + 0x1bb0: 0x0004, 0x1bb2: 0x0004, 0x1bb3: 0x0004, 0x1bb4: 0x0004, + 0x1bb7: 0x0004, 0x1bb8: 0x0004, + 0x1bbe: 0x0004, 0x1bbf: 0x0004, + // Block 0x6f, offset 0x1bc0 + 0x1bc1: 0x0004, + 0x1beb: 0x0400, 0x1bec: 0x0004, 0x1bed: 0x0004, 0x1bee: 0x0400, 0x1bef: 0x0400, + 0x1bf5: 0x0400, + 0x1bf6: 0x0004, + // Block 0x70, offset 0x1c00 + 0x1c23: 0x0400, + 0x1c24: 0x0400, 0x1c25: 0x0004, 0x1c26: 0x0400, 0x1c27: 0x0400, 0x1c28: 0x0004, 0x1c29: 0x0400, + 0x1c2a: 0x0400, 0x1c2c: 0x0400, 0x1c2d: 0x0004, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0040, 0x1c41: 0x0080, 0x1c42: 0x0080, 0x1c43: 0x0080, 0x1c44: 0x0080, 0x1c45: 0x0080, + 0x1c46: 0x0080, 0x1c47: 0x0080, 0x1c48: 0x0080, 0x1c49: 0x0080, 0x1c4a: 0x0080, 0x1c4b: 0x0080, + 0x1c4c: 0x0080, 0x1c4d: 0x0080, 0x1c4e: 0x0080, 0x1c4f: 0x0080, 0x1c50: 0x0080, 0x1c51: 0x0080, + 0x1c52: 0x0080, 0x1c53: 0x0080, 0x1c54: 0x0080, 0x1c55: 0x0080, 0x1c56: 0x0080, 0x1c57: 0x0080, + 0x1c58: 0x0080, 0x1c59: 0x0080, 0x1c5a: 0x0080, 0x1c5b: 0x0080, 0x1c5c: 0x0040, 0x1c5d: 0x0080, + 0x1c5e: 0x0080, 0x1c5f: 0x0080, 0x1c60: 0x0080, 0x1c61: 0x0080, 0x1c62: 0x0080, 0x1c63: 0x0080, + 0x1c64: 0x0080, 0x1c65: 0x0080, 0x1c66: 0x0080, 0x1c67: 0x0080, 0x1c68: 0x0080, 0x1c69: 0x0080, + 0x1c6a: 0x0080, 0x1c6b: 0x0080, 0x1c6c: 0x0080, 0x1c6d: 0x0080, 0x1c6e: 0x0080, 0x1c6f: 0x0080, + 0x1c70: 0x0080, 0x1c71: 0x0080, 0x1c72: 0x0080, 0x1c73: 0x0080, 0x1c74: 0x0080, 0x1c75: 0x0080, + 0x1c76: 0x0080, 0x1c77: 0x0080, 0x1c78: 0x0040, 0x1c79: 0x0080, 0x1c7a: 0x0080, 0x1c7b: 0x0080, + 0x1c7c: 0x0080, 0x1c7d: 0x0080, 0x1c7e: 0x0080, 0x1c7f: 0x0080, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0080, 0x1c81: 0x0080, 0x1c82: 0x0080, 0x1c83: 0x0080, 0x1c84: 0x0080, 0x1c85: 0x0080, + 0x1c86: 0x0080, 0x1c87: 0x0080, 0x1c88: 0x0080, 0x1c89: 0x0080, 0x1c8a: 0x0080, 0x1c8b: 0x0080, + 0x1c8c: 0x0080, 0x1c8d: 0x0080, 0x1c8e: 0x0080, 0x1c8f: 0x0080, 0x1c90: 0x0080, 0x1c91: 0x0080, + 0x1c92: 0x0080, 0x1c93: 0x0080, 0x1c94: 0x0040, 0x1c95: 0x0080, 0x1c96: 0x0080, 0x1c97: 0x0080, + 0x1c98: 0x0080, 0x1c99: 0x0080, 0x1c9a: 0x0080, 0x1c9b: 0x0080, 0x1c9c: 0x0080, 0x1c9d: 0x0080, + 0x1c9e: 0x0080, 0x1c9f: 0x0080, 0x1ca0: 0x0080, 0x1ca1: 0x0080, 0x1ca2: 0x0080, 0x1ca3: 0x0080, + 0x1ca4: 0x0080, 0x1ca5: 0x0080, 0x1ca6: 0x0080, 0x1ca7: 0x0080, 0x1ca8: 0x0080, 0x1ca9: 0x0080, + 0x1caa: 0x0080, 0x1cab: 0x0080, 0x1cac: 0x0080, 0x1cad: 0x0080, 0x1cae: 0x0080, 0x1caf: 0x0080, + 0x1cb0: 0x0040, 0x1cb1: 0x0080, 0x1cb2: 0x0080, 0x1cb3: 0x0080, 0x1cb4: 0x0080, 0x1cb5: 0x0080, + 0x1cb6: 0x0080, 0x1cb7: 0x0080, 0x1cb8: 0x0080, 0x1cb9: 0x0080, 0x1cba: 0x0080, 0x1cbb: 0x0080, + 0x1cbc: 0x0080, 0x1cbd: 0x0080, 0x1cbe: 0x0080, 0x1cbf: 0x0080, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0080, 0x1cc1: 0x0080, 0x1cc2: 0x0080, 0x1cc3: 0x0080, 0x1cc4: 0x0080, 0x1cc5: 0x0080, + 0x1cc6: 0x0080, 0x1cc7: 0x0080, 0x1cc8: 0x0080, 0x1cc9: 0x0080, 0x1cca: 0x0080, 0x1ccb: 0x0080, + 0x1ccc: 0x0040, 0x1ccd: 0x0080, 0x1cce: 0x0080, 0x1ccf: 0x0080, 0x1cd0: 0x0080, 0x1cd1: 0x0080, + 0x1cd2: 0x0080, 0x1cd3: 0x0080, 0x1cd4: 0x0080, 0x1cd5: 0x0080, 0x1cd6: 0x0080, 0x1cd7: 0x0080, + 0x1cd8: 0x0080, 0x1cd9: 0x0080, 0x1cda: 0x0080, 0x1cdb: 0x0080, 0x1cdc: 0x0080, 0x1cdd: 0x0080, + 0x1cde: 0x0080, 0x1cdf: 0x0080, 0x1ce0: 0x0080, 0x1ce1: 0x0080, 0x1ce2: 0x0080, 0x1ce3: 0x0080, + 0x1ce4: 0x0080, 0x1ce5: 0x0080, 0x1ce6: 0x0080, 0x1ce7: 0x0080, 0x1ce8: 0x0040, 0x1ce9: 0x0080, + 0x1cea: 0x0080, 0x1ceb: 0x0080, 0x1cec: 0x0080, 0x1ced: 0x0080, 0x1cee: 0x0080, 0x1cef: 0x0080, + 0x1cf0: 0x0080, 0x1cf1: 0x0080, 0x1cf2: 0x0080, 0x1cf3: 0x0080, 0x1cf4: 0x0080, 0x1cf5: 0x0080, + 0x1cf6: 0x0080, 0x1cf7: 0x0080, 0x1cf8: 0x0080, 0x1cf9: 0x0080, 0x1cfa: 0x0080, 0x1cfb: 0x0080, + 0x1cfc: 0x0080, 0x1cfd: 0x0080, 0x1cfe: 0x0080, 0x1cff: 0x0080, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0080, 0x1d01: 0x0080, 0x1d02: 0x0080, 0x1d03: 0x0080, 0x1d04: 0x0040, 0x1d05: 0x0080, + 0x1d06: 0x0080, 0x1d07: 0x0080, 0x1d08: 0x0080, 0x1d09: 0x0080, 0x1d0a: 0x0080, 0x1d0b: 0x0080, + 0x1d0c: 0x0080, 0x1d0d: 0x0080, 0x1d0e: 0x0080, 0x1d0f: 0x0080, 0x1d10: 0x0080, 0x1d11: 0x0080, + 0x1d12: 0x0080, 0x1d13: 0x0080, 0x1d14: 0x0080, 0x1d15: 0x0080, 0x1d16: 0x0080, 0x1d17: 0x0080, + 0x1d18: 0x0080, 0x1d19: 0x0080, 0x1d1a: 0x0080, 0x1d1b: 0x0080, 0x1d1c: 0x0080, 0x1d1d: 0x0080, + 0x1d1e: 0x0080, 0x1d1f: 0x0080, 0x1d20: 0x0040, 0x1d21: 0x0080, 0x1d22: 0x0080, 0x1d23: 0x0080, + 0x1d24: 0x0080, 0x1d25: 0x0080, 0x1d26: 0x0080, 0x1d27: 0x0080, 0x1d28: 0x0080, 0x1d29: 0x0080, + 0x1d2a: 0x0080, 0x1d2b: 0x0080, 0x1d2c: 0x0080, 0x1d2d: 0x0080, 0x1d2e: 0x0080, 0x1d2f: 0x0080, + 0x1d30: 0x0080, 0x1d31: 0x0080, 0x1d32: 0x0080, 0x1d33: 0x0080, 0x1d34: 0x0080, 0x1d35: 0x0080, + 0x1d36: 0x0080, 0x1d37: 0x0080, 0x1d38: 0x0080, 0x1d39: 0x0080, 0x1d3a: 0x0080, 0x1d3b: 0x0080, + 0x1d3c: 0x0040, 0x1d3d: 0x0080, 0x1d3e: 0x0080, 0x1d3f: 0x0080, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0080, 0x1d41: 0x0080, 0x1d42: 0x0080, 0x1d43: 0x0080, 0x1d44: 0x0080, 0x1d45: 0x0080, + 0x1d46: 0x0080, 0x1d47: 0x0080, 0x1d48: 0x0080, 0x1d49: 0x0080, 0x1d4a: 0x0080, 0x1d4b: 0x0080, + 0x1d4c: 0x0080, 0x1d4d: 0x0080, 0x1d4e: 0x0080, 0x1d4f: 0x0080, 0x1d50: 0x0080, 0x1d51: 0x0080, + 0x1d52: 0x0080, 0x1d53: 0x0080, 0x1d54: 0x0080, 0x1d55: 0x0080, 0x1d56: 0x0080, 0x1d57: 0x0080, + 0x1d58: 0x0040, 0x1d59: 0x0080, 0x1d5a: 0x0080, 0x1d5b: 0x0080, 0x1d5c: 0x0080, 0x1d5d: 0x0080, + 0x1d5e: 0x0080, 0x1d5f: 0x0080, 0x1d60: 0x0080, 0x1d61: 0x0080, 0x1d62: 0x0080, 0x1d63: 0x0080, + 0x1d64: 0x0080, 0x1d65: 0x0080, 0x1d66: 0x0080, 0x1d67: 0x0080, 0x1d68: 0x0080, 0x1d69: 0x0080, + 0x1d6a: 0x0080, 0x1d6b: 0x0080, 0x1d6c: 0x0080, 0x1d6d: 0x0080, 0x1d6e: 0x0080, 0x1d6f: 0x0080, + 0x1d70: 0x0080, 0x1d71: 0x0080, 0x1d72: 0x0080, 0x1d73: 0x0080, 0x1d74: 0x0040, 0x1d75: 0x0080, + 0x1d76: 0x0080, 0x1d77: 0x0080, 0x1d78: 0x0080, 0x1d79: 0x0080, 0x1d7a: 0x0080, 0x1d7b: 0x0080, + 0x1d7c: 0x0080, 0x1d7d: 0x0080, 0x1d7e: 0x0080, 0x1d7f: 0x0080, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x0080, 0x1d81: 0x0080, 0x1d82: 0x0080, 0x1d83: 0x0080, 0x1d84: 0x0080, 0x1d85: 0x0080, + 0x1d86: 0x0080, 0x1d87: 0x0080, 0x1d88: 0x0080, 0x1d89: 0x0080, 0x1d8a: 0x0080, 0x1d8b: 0x0080, + 0x1d8c: 0x0080, 0x1d8d: 0x0080, 0x1d8e: 0x0080, 0x1d8f: 0x0080, 0x1d90: 0x0040, 0x1d91: 0x0080, + 0x1d92: 0x0080, 0x1d93: 0x0080, 0x1d94: 0x0080, 0x1d95: 0x0080, 0x1d96: 0x0080, 0x1d97: 0x0080, + 0x1d98: 0x0080, 0x1d99: 0x0080, 0x1d9a: 0x0080, 0x1d9b: 0x0080, 0x1d9c: 0x0080, 0x1d9d: 0x0080, + 0x1d9e: 0x0080, 0x1d9f: 0x0080, 0x1da0: 0x0080, 0x1da1: 0x0080, 0x1da2: 0x0080, 0x1da3: 0x0080, + 0x1da4: 0x0080, 0x1da5: 0x0080, 0x1da6: 0x0080, 0x1da7: 0x0080, 0x1da8: 0x0080, 0x1da9: 0x0080, + 0x1daa: 0x0080, 0x1dab: 0x0080, 0x1dac: 0x0040, 0x1dad: 0x0080, 0x1dae: 0x0080, 0x1daf: 0x0080, + 0x1db0: 0x0080, 0x1db1: 0x0080, 0x1db2: 0x0080, 0x1db3: 0x0080, 0x1db4: 0x0080, 0x1db5: 0x0080, + 0x1db6: 0x0080, 0x1db7: 0x0080, 0x1db8: 0x0080, 0x1db9: 0x0080, 0x1dba: 0x0080, 0x1dbb: 0x0080, + 0x1dbc: 0x0080, 0x1dbd: 0x0080, 0x1dbe: 0x0080, 0x1dbf: 0x0080, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0x0080, 0x1dc1: 0x0080, 0x1dc2: 0x0080, 0x1dc3: 0x0080, 0x1dc4: 0x0080, 0x1dc5: 0x0080, + 0x1dc6: 0x0080, 0x1dc7: 0x0080, 0x1dc8: 0x0040, 0x1dc9: 0x0080, 0x1dca: 0x0080, 0x1dcb: 0x0080, + 0x1dcc: 0x0080, 0x1dcd: 0x0080, 0x1dce: 0x0080, 0x1dcf: 0x0080, 0x1dd0: 0x0080, 0x1dd1: 0x0080, + 0x1dd2: 0x0080, 0x1dd3: 0x0080, 0x1dd4: 0x0080, 0x1dd5: 0x0080, 0x1dd6: 0x0080, 0x1dd7: 0x0080, + 0x1dd8: 0x0080, 0x1dd9: 0x0080, 0x1dda: 0x0080, 0x1ddb: 0x0080, 0x1ddc: 0x0080, 0x1ddd: 0x0080, + 0x1dde: 0x0080, 0x1ddf: 0x0080, 0x1de0: 0x0080, 0x1de1: 0x0080, 0x1de2: 0x0080, 0x1de3: 0x0080, + 0x1de4: 0x0040, 0x1de5: 0x0080, 0x1de6: 0x0080, 0x1de7: 0x0080, 0x1de8: 0x0080, 0x1de9: 0x0080, + 0x1dea: 0x0080, 0x1deb: 0x0080, 0x1dec: 0x0080, 0x1ded: 0x0080, 0x1dee: 0x0080, 0x1def: 0x0080, + 0x1df0: 0x0080, 0x1df1: 0x0080, 0x1df2: 0x0080, 0x1df3: 0x0080, 0x1df4: 0x0080, 0x1df5: 0x0080, + 0x1df6: 0x0080, 0x1df7: 0x0080, 0x1df8: 0x0080, 0x1df9: 0x0080, 0x1dfa: 0x0080, 0x1dfb: 0x0080, + 0x1dfc: 0x0080, 0x1dfd: 0x0080, 0x1dfe: 0x0080, 0x1dff: 0x0080, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x0080, 0x1e01: 0x0080, 0x1e02: 0x0080, 0x1e03: 0x0080, 0x1e04: 0x0080, 0x1e05: 0x0080, + 0x1e06: 0x0080, 0x1e07: 0x0080, 0x1e08: 0x0040, 0x1e09: 0x0080, 0x1e0a: 0x0080, 0x1e0b: 0x0080, + 0x1e0c: 0x0080, 0x1e0d: 0x0080, 0x1e0e: 0x0080, 0x1e0f: 0x0080, 0x1e10: 0x0080, 0x1e11: 0x0080, + 0x1e12: 0x0080, 0x1e13: 0x0080, 0x1e14: 0x0080, 0x1e15: 0x0080, 0x1e16: 0x0080, 0x1e17: 0x0080, + 0x1e18: 0x0080, 0x1e19: 0x0080, 0x1e1a: 0x0080, 0x1e1b: 0x0080, 0x1e1c: 0x0080, 0x1e1d: 0x0080, + 0x1e1e: 0x0080, 0x1e1f: 0x0080, 0x1e20: 0x0080, 0x1e21: 0x0080, 0x1e22: 0x0080, 0x1e23: 0x0080, + 0x1e30: 0x1000, 0x1e31: 0x1000, 0x1e32: 0x1000, 0x1e33: 0x1000, 0x1e34: 0x1000, 0x1e35: 0x1000, + 0x1e36: 0x1000, 0x1e37: 0x1000, 0x1e38: 0x1000, 0x1e39: 0x1000, 0x1e3a: 0x1000, 0x1e3b: 0x1000, + 0x1e3c: 0x1000, 0x1e3d: 0x1000, 0x1e3e: 0x1000, 0x1e3f: 0x1000, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x1000, 0x1e41: 0x1000, 0x1e42: 0x1000, 0x1e43: 0x1000, 0x1e44: 0x1000, 0x1e45: 0x1000, + 0x1e46: 0x1000, 0x1e4b: 0x0800, + 0x1e4c: 0x0800, 0x1e4d: 0x0800, 0x1e4e: 0x0800, 0x1e4f: 0x0800, 0x1e50: 0x0800, 0x1e51: 0x0800, + 0x1e52: 0x0800, 0x1e53: 0x0800, 0x1e54: 0x0800, 0x1e55: 0x0800, 0x1e56: 0x0800, 0x1e57: 0x0800, + 0x1e58: 0x0800, 0x1e59: 0x0800, 0x1e5a: 0x0800, 0x1e5b: 0x0800, 0x1e5c: 0x0800, 0x1e5d: 0x0800, + 0x1e5e: 0x0800, 0x1e5f: 0x0800, 0x1e60: 0x0800, 0x1e61: 0x0800, 0x1e62: 0x0800, 0x1e63: 0x0800, + 0x1e64: 0x0800, 0x1e65: 0x0800, 0x1e66: 0x0800, 0x1e67: 0x0800, 0x1e68: 0x0800, 0x1e69: 0x0800, + 0x1e6a: 0x0800, 0x1e6b: 0x0800, 0x1e6c: 0x0800, 0x1e6d: 0x0800, 0x1e6e: 0x0800, 0x1e6f: 0x0800, + 0x1e70: 0x0800, 0x1e71: 0x0800, 0x1e72: 0x0800, 0x1e73: 0x0800, 0x1e74: 0x0800, 0x1e75: 0x0800, + 0x1e76: 0x0800, 0x1e77: 0x0800, 0x1e78: 0x0800, 0x1e79: 0x0800, 0x1e7a: 0x0800, 0x1e7b: 0x0800, + // Block 0x7a, offset 0x1e80 + 0x1e9e: 0x0004, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x0004, 0x1ec1: 0x0004, 0x1ec2: 0x0004, 0x1ec3: 0x0004, 0x1ec4: 0x0004, 0x1ec5: 0x0004, + 0x1ec6: 0x0004, 0x1ec7: 0x0004, 0x1ec8: 0x0004, 0x1ec9: 0x0004, 0x1eca: 0x0004, 0x1ecb: 0x0004, + 0x1ecc: 0x0004, 0x1ecd: 0x0004, 0x1ece: 0x0004, 0x1ecf: 0x0004, + 0x1ee0: 0x0004, 0x1ee1: 0x0004, 0x1ee2: 0x0004, 0x1ee3: 0x0004, + 0x1ee4: 0x0004, 0x1ee5: 0x0004, 0x1ee6: 0x0004, 0x1ee7: 0x0004, 0x1ee8: 0x0004, 0x1ee9: 0x0004, + 0x1eea: 0x0004, 0x1eeb: 0x0004, 0x1eec: 0x0004, 0x1eed: 0x0004, 0x1eee: 0x0004, 0x1eef: 0x0004, + // Block 0x7c, offset 0x1f00 + 0x1f3f: 0x0002, + // Block 0x7d, offset 0x1f40 + 0x1f70: 0x0002, 0x1f71: 0x0002, 0x1f72: 0x0002, 0x1f73: 0x0002, 0x1f74: 0x0002, 0x1f75: 0x0002, + 0x1f76: 0x0002, 0x1f77: 0x0002, 0x1f78: 0x0002, 0x1f79: 0x0002, 0x1f7a: 0x0002, 0x1f7b: 0x0002, + // Block 0x7e, offset 0x1f80 + 0x1fbd: 0x0004, + // Block 0x7f, offset 0x1fc0 + 0x1fe0: 0x0004, + // Block 0x80, offset 0x2000 + 0x2036: 0x0004, 0x2037: 0x0004, 0x2038: 0x0004, 0x2039: 0x0004, 0x203a: 0x0004, + // Block 0x81, offset 0x2040 + 0x2041: 0x0004, 0x2042: 0x0004, 0x2043: 0x0004, 0x2045: 0x0004, + 0x2046: 0x0004, + 0x204c: 0x0004, 0x204d: 0x0004, 0x204e: 0x0004, 0x204f: 0x0004, + 0x2078: 0x0004, 0x2079: 0x0004, 0x207a: 0x0004, + 0x207f: 0x0004, + // Block 0x82, offset 0x2080 + 0x20a5: 0x0004, 0x20a6: 0x0004, + // Block 0x83, offset 0x20c0 + 0x20e4: 0x0004, 0x20e5: 0x0004, 0x20e6: 0x0004, 0x20e7: 0x0004, + // Block 0x84, offset 0x2100 + 0x212b: 0x0004, 0x212c: 0x0004, + // Block 0x85, offset 0x2140 + 0x217d: 0x0004, 0x217e: 0x0004, 0x217f: 0x0004, + // Block 0x86, offset 0x2180 + 0x2186: 0x0004, 0x2187: 0x0004, 0x2188: 0x0004, 0x2189: 0x0004, 0x218a: 0x0004, 0x218b: 0x0004, + 0x218c: 0x0004, 0x218d: 0x0004, 0x218e: 0x0004, 0x218f: 0x0004, 0x2190: 0x0004, + // Block 0x87, offset 0x21c0 + 0x21c2: 0x0004, 0x21c3: 0x0004, 0x21c4: 0x0004, 0x21c5: 0x0004, + // Block 0x88, offset 0x2200 + 0x2200: 0x0400, 0x2201: 0x0004, 0x2202: 0x0400, + 0x2238: 0x0004, 0x2239: 0x0004, 0x223a: 0x0004, 0x223b: 0x0004, + 0x223c: 0x0004, 0x223d: 0x0004, 0x223e: 0x0004, 0x223f: 0x0004, + // Block 0x89, offset 0x2240 + 0x2240: 0x0004, 0x2241: 0x0004, 0x2242: 0x0004, 0x2243: 0x0004, 0x2244: 0x0004, 0x2245: 0x0004, + 0x2246: 0x0004, + 0x2270: 0x0004, 0x2273: 0x0004, 0x2274: 0x0004, + 0x227f: 0x0004, + // Block 0x8a, offset 0x2280 + 0x2280: 0x0004, 0x2281: 0x0004, 0x2282: 0x0400, + 0x22b0: 0x0400, 0x22b1: 0x0400, 0x22b2: 0x0400, 0x22b3: 0x0004, 0x22b4: 0x0004, 0x22b5: 0x0004, + 0x22b6: 0x0004, 0x22b7: 0x0400, 0x22b8: 0x0400, 0x22b9: 0x0004, 0x22ba: 0x0004, + 0x22bd: 0x0100, + // Block 0x8b, offset 0x22c0 + 0x22c2: 0x0004, + 0x22cd: 0x0100, + // Block 0x8c, offset 0x2300 + 0x2300: 0x0004, 0x2301: 0x0004, 0x2302: 0x0004, + 0x2327: 0x0004, 0x2328: 0x0004, 0x2329: 0x0004, + 0x232a: 0x0004, 0x232b: 0x0004, 0x232c: 0x0400, 0x232d: 0x0004, 0x232e: 0x0004, 0x232f: 0x0004, + 0x2330: 0x0004, 0x2331: 0x0004, 0x2332: 0x0004, 0x2333: 0x0004, 0x2334: 0x0004, + // Block 0x8d, offset 0x2340 + 0x2345: 0x0400, + 0x2346: 0x0400, + 0x2373: 0x0004, + // Block 0x8e, offset 0x2380 + 0x2380: 0x0004, 0x2381: 0x0004, 0x2382: 0x0400, + 0x23b3: 0x0400, 0x23b4: 0x0400, 0x23b5: 0x0400, + 0x23b6: 0x0004, 0x23b7: 0x0004, 0x23b8: 0x0004, 0x23b9: 0x0004, 0x23ba: 0x0004, 0x23bb: 0x0004, + 0x23bc: 0x0004, 0x23bd: 0x0004, 0x23be: 0x0004, 0x23bf: 0x0400, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0400, 0x23c2: 0x0100, 0x23c3: 0x0100, + 0x23c9: 0x0004, 0x23ca: 0x0004, 0x23cb: 0x0004, + 0x23cc: 0x0004, 0x23ce: 0x0400, 0x23cf: 0x0004, + // Block 0x90, offset 0x2400 + 0x242c: 0x0400, 0x242d: 0x0400, 0x242e: 0x0400, 0x242f: 0x0004, + 0x2430: 0x0004, 0x2431: 0x0004, 0x2432: 0x0400, 0x2433: 0x0400, 0x2434: 0x0004, 0x2435: 0x0400, + 0x2436: 0x0004, 0x2437: 0x0004, + 0x243e: 0x0004, + // Block 0x91, offset 0x2440 + 0x2441: 0x0004, + // Block 0x92, offset 0x2480 + 0x249f: 0x0004, 0x24a0: 0x0400, 0x24a1: 0x0400, 0x24a2: 0x0400, 0x24a3: 0x0004, + 0x24a4: 0x0004, 0x24a5: 0x0004, 0x24a6: 0x0004, 0x24a7: 0x0004, 0x24a8: 0x0004, 0x24a9: 0x0004, + 0x24aa: 0x0004, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x0004, 0x24c1: 0x0400, 0x24c2: 0x0400, 0x24c3: 0x0400, 0x24c4: 0x0400, + 0x24c7: 0x0400, 0x24c8: 0x0400, 0x24cb: 0x0400, + 0x24cc: 0x0400, 0x24cd: 0x0400, + 0x24d7: 0x0004, + 0x24e2: 0x0400, 0x24e3: 0x0400, + 0x24e6: 0x0004, 0x24e7: 0x0004, 0x24e8: 0x0004, 0x24e9: 0x0004, + 0x24ea: 0x0004, 0x24eb: 0x0004, 0x24ec: 0x0004, + 0x24f0: 0x0004, 0x24f1: 0x0004, 0x24f2: 0x0004, 0x24f3: 0x0004, 0x24f4: 0x0004, + // Block 0x94, offset 0x2500 + 0x2535: 0x0400, + 0x2536: 0x0400, 0x2537: 0x0400, 0x2538: 0x0004, 0x2539: 0x0004, 0x253a: 0x0004, 0x253b: 0x0004, + 0x253c: 0x0004, 0x253d: 0x0004, 0x253e: 0x0004, 0x253f: 0x0004, + // Block 0x95, offset 0x2540 + 0x2540: 0x0400, 0x2541: 0x0400, 0x2542: 0x0004, 0x2543: 0x0004, 0x2544: 0x0004, 0x2545: 0x0400, + 0x2546: 0x0004, + 0x255e: 0x0004, + // Block 0x96, offset 0x2580 + 0x25b0: 0x0004, 0x25b1: 0x0400, 0x25b2: 0x0400, 0x25b3: 0x0004, 0x25b4: 0x0004, 0x25b5: 0x0004, + 0x25b6: 0x0004, 0x25b7: 0x0004, 0x25b8: 0x0004, 0x25b9: 0x0400, 0x25ba: 0x0004, 0x25bb: 0x0400, + 0x25bc: 0x0400, 0x25bd: 0x0004, 0x25be: 0x0400, 0x25bf: 0x0004, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x0004, 0x25c1: 0x0400, 0x25c2: 0x0004, 0x25c3: 0x0004, + // Block 0x98, offset 0x2600 + 0x262f: 0x0004, + 0x2630: 0x0400, 0x2631: 0x0400, 0x2632: 0x0004, 0x2633: 0x0004, 0x2634: 0x0004, 0x2635: 0x0004, + 0x2638: 0x0400, 0x2639: 0x0400, 0x263a: 0x0400, 0x263b: 0x0400, + 0x263c: 0x0004, 0x263d: 0x0004, 0x263e: 0x0400, 0x263f: 0x0004, + // Block 0x99, offset 0x2640 + 0x2640: 0x0004, + 0x265c: 0x0004, 0x265d: 0x0004, + // Block 0x9a, offset 0x2680 + 0x26b0: 0x0400, 0x26b1: 0x0400, 0x26b2: 0x0400, 0x26b3: 0x0004, 0x26b4: 0x0004, 0x26b5: 0x0004, + 0x26b6: 0x0004, 0x26b7: 0x0004, 0x26b8: 0x0004, 0x26b9: 0x0004, 0x26ba: 0x0004, 0x26bb: 0x0400, + 0x26bc: 0x0400, 0x26bd: 0x0004, 0x26be: 0x0400, 0x26bf: 0x0004, + // Block 0x9b, offset 0x26c0 + 0x26c0: 0x0004, + // Block 0x9c, offset 0x2700 + 0x272b: 0x0004, 0x272c: 0x0400, 0x272d: 0x0004, 0x272e: 0x0400, 0x272f: 0x0400, + 0x2730: 0x0004, 0x2731: 0x0004, 0x2732: 0x0004, 0x2733: 0x0004, 0x2734: 0x0004, 0x2735: 0x0004, + 0x2736: 0x0400, 0x2737: 0x0004, + // Block 0x9d, offset 0x2740 + 0x275d: 0x0004, + 0x275e: 0x0004, 0x275f: 0x0004, 0x2762: 0x0004, 0x2763: 0x0004, + 0x2764: 0x0004, 0x2765: 0x0004, 0x2766: 0x0400, 0x2767: 0x0004, 0x2768: 0x0004, 0x2769: 0x0004, + 0x276a: 0x0004, 0x276b: 0x0004, + // Block 0x9e, offset 0x2780 + 0x27ac: 0x0400, 0x27ad: 0x0400, 0x27ae: 0x0400, 0x27af: 0x0004, + 0x27b0: 0x0004, 0x27b1: 0x0004, 0x27b2: 0x0004, 0x27b3: 0x0004, 0x27b4: 0x0004, 0x27b5: 0x0004, + 0x27b6: 0x0004, 0x27b7: 0x0004, 0x27b8: 0x0400, 0x27b9: 0x0004, 0x27ba: 0x0004, + // Block 0x9f, offset 0x27c0 + 0x27f0: 0x0004, 0x27f1: 0x0400, 0x27f2: 0x0400, 0x27f3: 0x0400, 0x27f4: 0x0400, 0x27f5: 0x0400, + 0x27f7: 0x0400, 0x27f8: 0x0400, 0x27fb: 0x0004, + 0x27fc: 0x0004, 0x27fd: 0x0400, 0x27fe: 0x0004, 0x27ff: 0x0100, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0400, 0x2801: 0x0100, 0x2802: 0x0400, 0x2803: 0x0004, + // Block 0xa1, offset 0x2840 + 0x2851: 0x0400, + 0x2852: 0x0400, 0x2853: 0x0400, 0x2854: 0x0004, 0x2855: 0x0004, 0x2856: 0x0004, 0x2857: 0x0004, + 0x285a: 0x0004, 0x285b: 0x0004, 0x285c: 0x0400, 0x285d: 0x0400, + 0x285e: 0x0400, 0x285f: 0x0400, 0x2860: 0x0004, + 0x2864: 0x0400, + // Block 0xa2, offset 0x2880 + 0x2881: 0x0004, 0x2882: 0x0004, 0x2883: 0x0004, 0x2884: 0x0004, 0x2885: 0x0004, + 0x2886: 0x0004, 0x2887: 0x0004, 0x2888: 0x0004, 0x2889: 0x0004, 0x288a: 0x0004, + 0x28b3: 0x0004, 0x28b4: 0x0004, 0x28b5: 0x0004, + 0x28b6: 0x0004, 0x28b7: 0x0004, 0x28b8: 0x0004, 0x28b9: 0x0400, 0x28ba: 0x0100, 0x28bb: 0x0004, + 0x28bc: 0x0004, 0x28bd: 0x0004, 0x28be: 0x0004, + // Block 0xa3, offset 0x28c0 + 0x28c7: 0x0004, + 0x28d1: 0x0004, + 0x28d2: 0x0004, 0x28d3: 0x0004, 0x28d4: 0x0004, 0x28d5: 0x0004, 0x28d6: 0x0004, 0x28d7: 0x0400, + 0x28d8: 0x0400, 0x28d9: 0x0004, 0x28da: 0x0004, 0x28db: 0x0004, + // Block 0xa4, offset 0x2900 + 0x2904: 0x0100, 0x2905: 0x0100, + 0x2906: 0x0100, 0x2907: 0x0100, 0x2908: 0x0100, 0x2909: 0x0100, 0x290a: 0x0004, 0x290b: 0x0004, + 0x290c: 0x0004, 0x290d: 0x0004, 0x290e: 0x0004, 0x290f: 0x0004, 0x2910: 0x0004, 0x2911: 0x0004, + 0x2912: 0x0004, 0x2913: 0x0004, 0x2914: 0x0004, 0x2915: 0x0004, 0x2916: 0x0004, 0x2917: 0x0400, + 0x2918: 0x0004, 0x2919: 0x0004, + // Block 0xa5, offset 0x2940 + 0x296f: 0x0400, + 0x2970: 0x0004, 0x2971: 0x0004, 0x2972: 0x0004, 0x2973: 0x0004, 0x2974: 0x0004, 0x2975: 0x0004, + 0x2976: 0x0004, 0x2978: 0x0004, 0x2979: 0x0004, 0x297a: 0x0004, 0x297b: 0x0004, + 0x297c: 0x0004, 0x297d: 0x0004, 0x297e: 0x0400, 0x297f: 0x0004, + // Block 0xa6, offset 0x2980 + 0x2992: 0x0004, 0x2993: 0x0004, 0x2994: 0x0004, 0x2995: 0x0004, 0x2996: 0x0004, 0x2997: 0x0004, + 0x2998: 0x0004, 0x2999: 0x0004, 0x299a: 0x0004, 0x299b: 0x0004, 0x299c: 0x0004, 0x299d: 0x0004, + 0x299e: 0x0004, 0x299f: 0x0004, 0x29a0: 0x0004, 0x29a1: 0x0004, 0x29a2: 0x0004, 0x29a3: 0x0004, + 0x29a4: 0x0004, 0x29a5: 0x0004, 0x29a6: 0x0004, 0x29a7: 0x0004, 0x29a9: 0x0400, + 0x29aa: 0x0004, 0x29ab: 0x0004, 0x29ac: 0x0004, 0x29ad: 0x0004, 0x29ae: 0x0004, 0x29af: 0x0004, + 0x29b0: 0x0004, 0x29b1: 0x0400, 0x29b2: 0x0004, 0x29b3: 0x0004, 0x29b4: 0x0400, 0x29b5: 0x0004, + 0x29b6: 0x0004, + // Block 0xa7, offset 0x29c0 + 0x29f1: 0x0004, 0x29f2: 0x0004, 0x29f3: 0x0004, 0x29f4: 0x0004, 0x29f5: 0x0004, + 0x29f6: 0x0004, 0x29fa: 0x0004, + 0x29fc: 0x0004, 0x29fd: 0x0004, 0x29ff: 0x0004, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x0004, 0x2a01: 0x0004, 0x2a02: 0x0004, 0x2a03: 0x0004, 0x2a04: 0x0004, 0x2a05: 0x0004, + 0x2a06: 0x0100, 0x2a07: 0x0004, + // Block 0xa9, offset 0x2a40 + 0x2a4a: 0x0400, 0x2a4b: 0x0400, + 0x2a4c: 0x0400, 0x2a4d: 0x0400, 0x2a4e: 0x0400, 0x2a50: 0x0004, 0x2a51: 0x0004, + 0x2a53: 0x0400, 0x2a54: 0x0400, 0x2a55: 0x0004, 0x2a56: 0x0400, 0x2a57: 0x0004, + // Block 0xaa, offset 0x2a80 + 0x2ab3: 0x0004, 0x2ab4: 0x0004, 0x2ab5: 0x0400, + 0x2ab6: 0x0400, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x0004, 0x2ac1: 0x0004, 0x2ac2: 0x0100, 0x2ac3: 0x0400, + 0x2af4: 0x0400, 0x2af5: 0x0400, + 0x2af6: 0x0004, 0x2af7: 0x0004, 0x2af8: 0x0004, 0x2af9: 0x0004, 0x2afa: 0x0004, + 0x2afe: 0x0400, 0x2aff: 0x0400, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x0004, 0x2b01: 0x0400, 0x2b02: 0x0004, + // Block 0xad, offset 0x2b40 + 0x2b70: 0x0002, 0x2b71: 0x0002, 0x2b72: 0x0002, 0x2b73: 0x0002, 0x2b74: 0x0002, 0x2b75: 0x0002, + 0x2b76: 0x0002, 0x2b77: 0x0002, 0x2b78: 0x0002, 0x2b79: 0x0002, 0x2b7a: 0x0002, 0x2b7b: 0x0002, + 0x2b7c: 0x0002, 0x2b7d: 0x0002, 0x2b7e: 0x0002, 0x2b7f: 0x0002, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x0004, + 0x2b87: 0x0004, 0x2b88: 0x0004, 0x2b89: 0x0004, 0x2b8a: 0x0004, 0x2b8b: 0x0004, + 0x2b8c: 0x0004, 0x2b8d: 0x0004, 0x2b8e: 0x0004, 0x2b8f: 0x0004, 0x2b90: 0x0004, 0x2b91: 0x0004, + 0x2b92: 0x0004, 0x2b93: 0x0004, 0x2b94: 0x0004, 0x2b95: 0x0004, + // Block 0xaf, offset 0x2bc0 + 0x2bf0: 0x0004, 0x2bf1: 0x0004, 0x2bf2: 0x0004, 0x2bf3: 0x0004, 0x2bf4: 0x0004, + // Block 0xb0, offset 0x2c00 + 0x2c30: 0x0004, 0x2c31: 0x0004, 0x2c32: 0x0004, 0x2c33: 0x0004, 0x2c34: 0x0004, 0x2c35: 0x0004, + 0x2c36: 0x0004, + // Block 0xb1, offset 0x2c40 + 0x2c4f: 0x0004, 0x2c51: 0x0400, + 0x2c52: 0x0400, 0x2c53: 0x0400, 0x2c54: 0x0400, 0x2c55: 0x0400, 0x2c56: 0x0400, 0x2c57: 0x0400, + 0x2c58: 0x0400, 0x2c59: 0x0400, 0x2c5a: 0x0400, 0x2c5b: 0x0400, 0x2c5c: 0x0400, 0x2c5d: 0x0400, + 0x2c5e: 0x0400, 0x2c5f: 0x0400, 0x2c60: 0x0400, 0x2c61: 0x0400, 0x2c62: 0x0400, 0x2c63: 0x0400, + 0x2c64: 0x0400, 0x2c65: 0x0400, 0x2c66: 0x0400, 0x2c67: 0x0400, 0x2c68: 0x0400, 0x2c69: 0x0400, + 0x2c6a: 0x0400, 0x2c6b: 0x0400, 0x2c6c: 0x0400, 0x2c6d: 0x0400, 0x2c6e: 0x0400, 0x2c6f: 0x0400, + 0x2c70: 0x0400, 0x2c71: 0x0400, 0x2c72: 0x0400, 0x2c73: 0x0400, 0x2c74: 0x0400, 0x2c75: 0x0400, + 0x2c76: 0x0400, 0x2c77: 0x0400, 0x2c78: 0x0400, 0x2c79: 0x0400, 0x2c7a: 0x0400, 0x2c7b: 0x0400, + 0x2c7c: 0x0400, 0x2c7d: 0x0400, 0x2c7e: 0x0400, 0x2c7f: 0x0400, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x0400, 0x2c81: 0x0400, 0x2c82: 0x0400, 0x2c83: 0x0400, 0x2c84: 0x0400, 0x2c85: 0x0400, + 0x2c86: 0x0400, 0x2c87: 0x0400, + 0x2c8f: 0x0004, 0x2c90: 0x0004, 0x2c91: 0x0004, + 0x2c92: 0x0004, + // Block 0xb3, offset 0x2cc0 + 0x2ce4: 0x0004, + 0x2cf0: 0x0400, 0x2cf1: 0x0400, + // Block 0xb4, offset 0x2d00 + 0x2d1d: 0x0004, + 0x2d1e: 0x0004, 0x2d20: 0x0002, 0x2d21: 0x0002, 0x2d22: 0x0002, 0x2d23: 0x0002, + // Block 0xb5, offset 0x2d40 + 0x2d40: 0x0004, 0x2d41: 0x0004, 0x2d42: 0x0004, 0x2d43: 0x0004, 0x2d44: 0x0004, 0x2d45: 0x0004, + 0x2d46: 0x0004, 0x2d47: 0x0004, 0x2d48: 0x0004, 0x2d49: 0x0004, 0x2d4a: 0x0004, 0x2d4b: 0x0004, + 0x2d4c: 0x0004, 0x2d4d: 0x0004, 0x2d4e: 0x0004, 0x2d4f: 0x0004, 0x2d50: 0x0004, 0x2d51: 0x0004, + 0x2d52: 0x0004, 0x2d53: 0x0004, 0x2d54: 0x0004, 0x2d55: 0x0004, 0x2d56: 0x0004, 0x2d57: 0x0004, + 0x2d58: 0x0004, 0x2d59: 0x0004, 0x2d5a: 0x0004, 0x2d5b: 0x0004, 0x2d5c: 0x0004, 0x2d5d: 0x0004, + 0x2d5e: 0x0004, 0x2d5f: 0x0004, 0x2d60: 0x0004, 0x2d61: 0x0004, 0x2d62: 0x0004, 0x2d63: 0x0004, + 0x2d64: 0x0004, 0x2d65: 0x0004, 0x2d66: 0x0004, 0x2d67: 0x0004, 0x2d68: 0x0004, 0x2d69: 0x0004, + 0x2d6a: 0x0004, 0x2d6b: 0x0004, 0x2d6c: 0x0004, 0x2d6d: 0x0004, + 0x2d70: 0x0004, 0x2d71: 0x0004, 0x2d72: 0x0004, 0x2d73: 0x0004, 0x2d74: 0x0004, 0x2d75: 0x0004, + 0x2d76: 0x0004, 0x2d77: 0x0004, 0x2d78: 0x0004, 0x2d79: 0x0004, 0x2d7a: 0x0004, 0x2d7b: 0x0004, + 0x2d7c: 0x0004, 0x2d7d: 0x0004, 0x2d7e: 0x0004, 0x2d7f: 0x0004, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x0004, 0x2d81: 0x0004, 0x2d82: 0x0004, 0x2d83: 0x0004, 0x2d84: 0x0004, 0x2d85: 0x0004, + 0x2d86: 0x0004, + // Block 0xb7, offset 0x2dc0 + 0x2de5: 0x0004, 0x2de6: 0x0400, 0x2de7: 0x0004, 0x2de8: 0x0004, 0x2de9: 0x0004, + 0x2ded: 0x0400, 0x2dee: 0x0004, 0x2def: 0x0004, + 0x2df0: 0x0004, 0x2df1: 0x0004, 0x2df2: 0x0004, 0x2df3: 0x0002, 0x2df4: 0x0002, 0x2df5: 0x0002, + 0x2df6: 0x0002, 0x2df7: 0x0002, 0x2df8: 0x0002, 0x2df9: 0x0002, 0x2dfa: 0x0002, 0x2dfb: 0x0004, + 0x2dfc: 0x0004, 0x2dfd: 0x0004, 0x2dfe: 0x0004, 0x2dff: 0x0004, + // Block 0xb8, offset 0x2e00 + 0x2e00: 0x0004, 0x2e01: 0x0004, 0x2e02: 0x0004, 0x2e05: 0x0004, + 0x2e06: 0x0004, 0x2e07: 0x0004, 0x2e08: 0x0004, 0x2e09: 0x0004, 0x2e0a: 0x0004, 0x2e0b: 0x0004, + 0x2e2a: 0x0004, 0x2e2b: 0x0004, 0x2e2c: 0x0004, 0x2e2d: 0x0004, + // Block 0xb9, offset 0x2e40 + 0x2e42: 0x0004, 0x2e43: 0x0004, 0x2e44: 0x0004, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x0004, 0x2e81: 0x0004, 0x2e82: 0x0004, 0x2e83: 0x0004, 0x2e84: 0x0004, 0x2e85: 0x0004, + 0x2e86: 0x0004, 0x2e87: 0x0004, 0x2e88: 0x0004, 0x2e89: 0x0004, 0x2e8a: 0x0004, 0x2e8b: 0x0004, + 0x2e8c: 0x0004, 0x2e8d: 0x0004, 0x2e8e: 0x0004, 0x2e8f: 0x0004, 0x2e90: 0x0004, 0x2e91: 0x0004, + 0x2e92: 0x0004, 0x2e93: 0x0004, 0x2e94: 0x0004, 0x2e95: 0x0004, 0x2e96: 0x0004, 0x2e97: 0x0004, + 0x2e98: 0x0004, 0x2e99: 0x0004, 0x2e9a: 0x0004, 0x2e9b: 0x0004, 0x2e9c: 0x0004, 0x2e9d: 0x0004, + 0x2e9e: 0x0004, 0x2e9f: 0x0004, 0x2ea0: 0x0004, 0x2ea1: 0x0004, 0x2ea2: 0x0004, 0x2ea3: 0x0004, + 0x2ea4: 0x0004, 0x2ea5: 0x0004, 0x2ea6: 0x0004, 0x2ea7: 0x0004, 0x2ea8: 0x0004, 0x2ea9: 0x0004, + 0x2eaa: 0x0004, 0x2eab: 0x0004, 0x2eac: 0x0004, 0x2ead: 0x0004, 0x2eae: 0x0004, 0x2eaf: 0x0004, + 0x2eb0: 0x0004, 0x2eb1: 0x0004, 0x2eb2: 0x0004, 0x2eb3: 0x0004, 0x2eb4: 0x0004, 0x2eb5: 0x0004, + 0x2eb6: 0x0004, 0x2ebb: 0x0004, + 0x2ebc: 0x0004, 0x2ebd: 0x0004, 0x2ebe: 0x0004, 0x2ebf: 0x0004, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x0004, 0x2ec1: 0x0004, 0x2ec2: 0x0004, 0x2ec3: 0x0004, 0x2ec4: 0x0004, 0x2ec5: 0x0004, + 0x2ec6: 0x0004, 0x2ec7: 0x0004, 0x2ec8: 0x0004, 0x2ec9: 0x0004, 0x2eca: 0x0004, 0x2ecb: 0x0004, + 0x2ecc: 0x0004, 0x2ecd: 0x0004, 0x2ece: 0x0004, 0x2ecf: 0x0004, 0x2ed0: 0x0004, 0x2ed1: 0x0004, + 0x2ed2: 0x0004, 0x2ed3: 0x0004, 0x2ed4: 0x0004, 0x2ed5: 0x0004, 0x2ed6: 0x0004, 0x2ed7: 0x0004, + 0x2ed8: 0x0004, 0x2ed9: 0x0004, 0x2eda: 0x0004, 0x2edb: 0x0004, 0x2edc: 0x0004, 0x2edd: 0x0004, + 0x2ede: 0x0004, 0x2edf: 0x0004, 0x2ee0: 0x0004, 0x2ee1: 0x0004, 0x2ee2: 0x0004, 0x2ee3: 0x0004, + 0x2ee4: 0x0004, 0x2ee5: 0x0004, 0x2ee6: 0x0004, 0x2ee7: 0x0004, 0x2ee8: 0x0004, 0x2ee9: 0x0004, + 0x2eea: 0x0004, 0x2eeb: 0x0004, 0x2eec: 0x0004, + 0x2ef5: 0x0004, + // Block 0xbc, offset 0x2f00 + 0x2f04: 0x0004, + 0x2f1b: 0x0004, 0x2f1c: 0x0004, 0x2f1d: 0x0004, + 0x2f1e: 0x0004, 0x2f1f: 0x0004, 0x2f21: 0x0004, 0x2f22: 0x0004, 0x2f23: 0x0004, + 0x2f24: 0x0004, 0x2f25: 0x0004, 0x2f26: 0x0004, 0x2f27: 0x0004, 0x2f28: 0x0004, 0x2f29: 0x0004, + 0x2f2a: 0x0004, 0x2f2b: 0x0004, 0x2f2c: 0x0004, 0x2f2d: 0x0004, 0x2f2e: 0x0004, 0x2f2f: 0x0004, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x0004, 0x2f41: 0x0004, 0x2f42: 0x0004, 0x2f43: 0x0004, 0x2f44: 0x0004, 0x2f45: 0x0004, + 0x2f46: 0x0004, 0x2f48: 0x0004, 0x2f49: 0x0004, 0x2f4a: 0x0004, 0x2f4b: 0x0004, + 0x2f4c: 0x0004, 0x2f4d: 0x0004, 0x2f4e: 0x0004, 0x2f4f: 0x0004, 0x2f50: 0x0004, 0x2f51: 0x0004, + 0x2f52: 0x0004, 0x2f53: 0x0004, 0x2f54: 0x0004, 0x2f55: 0x0004, 0x2f56: 0x0004, 0x2f57: 0x0004, + 0x2f58: 0x0004, 0x2f5b: 0x0004, 0x2f5c: 0x0004, 0x2f5d: 0x0004, + 0x2f5e: 0x0004, 0x2f5f: 0x0004, 0x2f60: 0x0004, 0x2f61: 0x0004, 0x2f63: 0x0004, + 0x2f64: 0x0004, 0x2f66: 0x0004, 0x2f67: 0x0004, 0x2f68: 0x0004, 0x2f69: 0x0004, + 0x2f6a: 0x0004, + // Block 0xbe, offset 0x2f80 + 0x2f8f: 0x0004, + // Block 0xbf, offset 0x2fc0 + 0x2fee: 0x0004, + // Block 0xc0, offset 0x3000 + 0x302c: 0x0004, 0x302d: 0x0004, 0x302e: 0x0004, 0x302f: 0x0004, + // Block 0xc1, offset 0x3040 + 0x3050: 0x0004, 0x3051: 0x0004, + 0x3052: 0x0004, 0x3053: 0x0004, 0x3054: 0x0004, 0x3055: 0x0004, 0x3056: 0x0004, + // Block 0xc2, offset 0x3080 + 0x3084: 0x0004, 0x3085: 0x0004, + 0x3086: 0x0004, 0x3087: 0x0004, 0x3088: 0x0004, 0x3089: 0x0004, 0x308a: 0x0004, + // Block 0xc3, offset 0x30c0 + 0x30cd: 0x0008, 0x30ce: 0x0008, 0x30cf: 0x0008, + 0x30ef: 0x0008, + // Block 0xc4, offset 0x3100 + 0x312c: 0x0008, 0x312d: 0x0008, 0x312e: 0x0008, 0x312f: 0x0008, + 0x3130: 0x0008, 0x3131: 0x0008, + 0x313e: 0x0008, 0x313f: 0x0008, + // Block 0xc5, offset 0x3140 + 0x314e: 0x0008, 0x3151: 0x0008, + 0x3152: 0x0008, 0x3153: 0x0008, 0x3154: 0x0008, 0x3155: 0x0008, 0x3156: 0x0008, 0x3157: 0x0008, + 0x3158: 0x0008, 0x3159: 0x0008, 0x315a: 0x0008, + 0x316d: 0x0008, 0x316e: 0x0008, 0x316f: 0x0008, + 0x3170: 0x0008, 0x3171: 0x0008, 0x3172: 0x0008, 0x3173: 0x0008, 0x3174: 0x0008, 0x3175: 0x0008, + 0x3176: 0x0008, 0x3177: 0x0008, 0x3178: 0x0008, 0x3179: 0x0008, 0x317a: 0x0008, 0x317b: 0x0008, + 0x317c: 0x0008, 0x317d: 0x0008, 0x317e: 0x0008, 0x317f: 0x0008, + // Block 0xc6, offset 0x3180 + 0x3180: 0x0008, 0x3181: 0x0008, 0x3182: 0x0008, 0x3183: 0x0008, 0x3184: 0x0008, 0x3185: 0x0008, + 0x3186: 0x0008, 0x3187: 0x0008, 0x3188: 0x0008, 0x3189: 0x0008, 0x318a: 0x0008, 0x318b: 0x0008, + 0x318c: 0x0008, 0x318d: 0x0008, 0x318e: 0x0008, 0x318f: 0x0008, 0x3190: 0x0008, 0x3191: 0x0008, + 0x3192: 0x0008, 0x3193: 0x0008, 0x3194: 0x0008, 0x3195: 0x0008, 0x3196: 0x0008, 0x3197: 0x0008, + 0x3198: 0x0008, 0x3199: 0x0008, 0x319a: 0x0008, 0x319b: 0x0008, 0x319c: 0x0008, 0x319d: 0x0008, + 0x319e: 0x0008, 0x319f: 0x0008, 0x31a0: 0x0008, 0x31a1: 0x0008, 0x31a2: 0x0008, 0x31a3: 0x0008, + 0x31a4: 0x0008, 0x31a5: 0x0008, 0x31a6: 0x0200, 0x31a7: 0x0200, 0x31a8: 0x0200, 0x31a9: 0x0200, + 0x31aa: 0x0200, 0x31ab: 0x0200, 0x31ac: 0x0200, 0x31ad: 0x0200, 0x31ae: 0x0200, 0x31af: 0x0200, + 0x31b0: 0x0200, 0x31b1: 0x0200, 0x31b2: 0x0200, 0x31b3: 0x0200, 0x31b4: 0x0200, 0x31b5: 0x0200, + 0x31b6: 0x0200, 0x31b7: 0x0200, 0x31b8: 0x0200, 0x31b9: 0x0200, 0x31ba: 0x0200, 0x31bb: 0x0200, + 0x31bc: 0x0200, 0x31bd: 0x0200, 0x31be: 0x0200, 0x31bf: 0x0200, + // Block 0xc7, offset 0x31c0 + 0x31c1: 0x0008, 0x31c2: 0x0008, 0x31c3: 0x0008, 0x31c4: 0x0008, 0x31c5: 0x0008, + 0x31c6: 0x0008, 0x31c7: 0x0008, 0x31c8: 0x0008, 0x31c9: 0x0008, 0x31ca: 0x0008, 0x31cb: 0x0008, + 0x31cc: 0x0008, 0x31cd: 0x0008, 0x31ce: 0x0008, 0x31cf: 0x0008, + 0x31da: 0x0008, + 0x31ef: 0x0008, + 0x31f2: 0x0008, 0x31f3: 0x0008, 0x31f4: 0x0008, 0x31f5: 0x0008, + 0x31f6: 0x0008, 0x31f7: 0x0008, 0x31f8: 0x0008, 0x31f9: 0x0008, 0x31fa: 0x0008, + 0x31fc: 0x0008, 0x31fd: 0x0008, 0x31fe: 0x0008, 0x31ff: 0x0008, + // Block 0xc8, offset 0x3200 + 0x3209: 0x0008, 0x320a: 0x0008, 0x320b: 0x0008, + 0x320c: 0x0008, 0x320d: 0x0008, 0x320e: 0x0008, 0x320f: 0x0008, 0x3210: 0x0008, 0x3211: 0x0008, + 0x3212: 0x0008, 0x3213: 0x0008, 0x3214: 0x0008, 0x3215: 0x0008, 0x3216: 0x0008, 0x3217: 0x0008, + 0x3218: 0x0008, 0x3219: 0x0008, 0x321a: 0x0008, 0x321b: 0x0008, 0x321c: 0x0008, 0x321d: 0x0008, + 0x321e: 0x0008, 0x321f: 0x0008, 0x3220: 0x0008, 0x3221: 0x0008, 0x3222: 0x0008, 0x3223: 0x0008, + 0x3224: 0x0008, 0x3225: 0x0008, 0x3226: 0x0008, 0x3227: 0x0008, 0x3228: 0x0008, 0x3229: 0x0008, + 0x322a: 0x0008, 0x322b: 0x0008, 0x322c: 0x0008, 0x322d: 0x0008, 0x322e: 0x0008, 0x322f: 0x0008, + 0x3230: 0x0008, 0x3231: 0x0008, 0x3232: 0x0008, 0x3233: 0x0008, 0x3234: 0x0008, 0x3235: 0x0008, + 0x3236: 0x0008, 0x3237: 0x0008, 0x3238: 0x0008, 0x3239: 0x0008, 0x323a: 0x0008, 0x323b: 0x0008, + 0x323c: 0x0008, 0x323d: 0x0008, 0x323e: 0x0008, 0x323f: 0x0008, + // Block 0xc9, offset 0x3240 + 0x3240: 0x0008, 0x3241: 0x0008, 0x3242: 0x0008, 0x3243: 0x0008, 0x3244: 0x0008, 0x3245: 0x0008, + 0x3246: 0x0008, 0x3247: 0x0008, 0x3248: 0x0008, 0x3249: 0x0008, 0x324a: 0x0008, 0x324b: 0x0008, + 0x324c: 0x0008, 0x324d: 0x0008, 0x324e: 0x0008, 0x324f: 0x0008, 0x3250: 0x0008, 0x3251: 0x0008, + 0x3252: 0x0008, 0x3253: 0x0008, 0x3254: 0x0008, 0x3255: 0x0008, 0x3256: 0x0008, 0x3257: 0x0008, + 0x3258: 0x0008, 0x3259: 0x0008, 0x325a: 0x0008, 0x325b: 0x0008, 0x325c: 0x0008, 0x325d: 0x0008, + 0x325e: 0x0008, 0x325f: 0x0008, 0x3260: 0x0008, 0x3261: 0x0008, 0x3262: 0x0008, 0x3263: 0x0008, + 0x3264: 0x0008, 0x3265: 0x0008, 0x3266: 0x0008, 0x3267: 0x0008, 0x3268: 0x0008, 0x3269: 0x0008, + 0x326a: 0x0008, 0x326b: 0x0008, 0x326c: 0x0008, 0x326d: 0x0008, 0x326e: 0x0008, 0x326f: 0x0008, + 0x3270: 0x0008, 0x3271: 0x0008, 0x3272: 0x0008, 0x3273: 0x0008, 0x3274: 0x0008, 0x3275: 0x0008, + 0x3276: 0x0008, 0x3277: 0x0008, 0x3278: 0x0008, 0x3279: 0x0008, 0x327a: 0x0008, 0x327b: 0x0004, + 0x327c: 0x0004, 0x327d: 0x0004, 0x327e: 0x0004, 0x327f: 0x0004, + // Block 0xca, offset 0x3280 + 0x3280: 0x0008, 0x3281: 0x0008, 0x3282: 0x0008, 0x3283: 0x0008, 0x3284: 0x0008, 0x3285: 0x0008, + 0x3286: 0x0008, 0x3287: 0x0008, 0x3288: 0x0008, 0x3289: 0x0008, 0x328a: 0x0008, 0x328b: 0x0008, + 0x328c: 0x0008, 0x328d: 0x0008, 0x328e: 0x0008, 0x328f: 0x0008, 0x3290: 0x0008, 0x3291: 0x0008, + 0x3292: 0x0008, 0x3293: 0x0008, 0x3294: 0x0008, 0x3295: 0x0008, 0x3296: 0x0008, 0x3297: 0x0008, + 0x3298: 0x0008, 0x3299: 0x0008, 0x329a: 0x0008, 0x329b: 0x0008, 0x329c: 0x0008, 0x329d: 0x0008, + 0x329e: 0x0008, 0x329f: 0x0008, 0x32a0: 0x0008, 0x32a1: 0x0008, 0x32a2: 0x0008, 0x32a3: 0x0008, + 0x32a4: 0x0008, 0x32a5: 0x0008, 0x32a6: 0x0008, 0x32a7: 0x0008, 0x32a8: 0x0008, 0x32a9: 0x0008, + 0x32aa: 0x0008, 0x32ab: 0x0008, 0x32ac: 0x0008, 0x32ad: 0x0008, 0x32ae: 0x0008, 0x32af: 0x0008, + 0x32b0: 0x0008, 0x32b1: 0x0008, 0x32b2: 0x0008, 0x32b3: 0x0008, 0x32b4: 0x0008, 0x32b5: 0x0008, + 0x32b6: 0x0008, 0x32b7: 0x0008, 0x32b8: 0x0008, 0x32b9: 0x0008, 0x32ba: 0x0008, 0x32bb: 0x0008, + 0x32bc: 0x0008, 0x32bd: 0x0008, + // Block 0xcb, offset 0x32c0 + 0x32c6: 0x0008, 0x32c7: 0x0008, 0x32c8: 0x0008, 0x32c9: 0x0008, 0x32ca: 0x0008, 0x32cb: 0x0008, + 0x32cc: 0x0008, 0x32cd: 0x0008, 0x32ce: 0x0008, 0x32cf: 0x0008, 0x32d0: 0x0008, 0x32d1: 0x0008, + 0x32d2: 0x0008, 0x32d3: 0x0008, 0x32d4: 0x0008, 0x32d5: 0x0008, 0x32d6: 0x0008, 0x32d7: 0x0008, + 0x32d8: 0x0008, 0x32d9: 0x0008, 0x32da: 0x0008, 0x32db: 0x0008, 0x32dc: 0x0008, 0x32dd: 0x0008, + 0x32de: 0x0008, 0x32df: 0x0008, 0x32e0: 0x0008, 0x32e1: 0x0008, 0x32e2: 0x0008, 0x32e3: 0x0008, + 0x32e4: 0x0008, 0x32e5: 0x0008, 0x32e6: 0x0008, 0x32e7: 0x0008, 0x32e8: 0x0008, 0x32e9: 0x0008, + 0x32ea: 0x0008, 0x32eb: 0x0008, 0x32ec: 0x0008, 0x32ed: 0x0008, 0x32ee: 0x0008, 0x32ef: 0x0008, + 0x32f0: 0x0008, 0x32f1: 0x0008, 0x32f2: 0x0008, 0x32f3: 0x0008, 0x32f4: 0x0008, 0x32f5: 0x0008, + 0x32f6: 0x0008, 0x32f7: 0x0008, 0x32f8: 0x0008, 0x32f9: 0x0008, 0x32fa: 0x0008, 0x32fb: 0x0008, + 0x32fc: 0x0008, 0x32fd: 0x0008, 0x32fe: 0x0008, 0x32ff: 0x0008, + // Block 0xcc, offset 0x3300 + 0x3300: 0x0008, 0x3301: 0x0008, 0x3302: 0x0008, 0x3303: 0x0008, 0x3304: 0x0008, 0x3305: 0x0008, + 0x3306: 0x0008, 0x3307: 0x0008, 0x3308: 0x0008, 0x3309: 0x0008, 0x330a: 0x0008, 0x330b: 0x0008, + 0x330c: 0x0008, 0x330d: 0x0008, 0x330e: 0x0008, 0x330f: 0x0008, + // Block 0xcd, offset 0x3340 + 0x3374: 0x0008, 0x3375: 0x0008, + 0x3376: 0x0008, 0x3377: 0x0008, 0x3378: 0x0008, 0x3379: 0x0008, 0x337a: 0x0008, 0x337b: 0x0008, + 0x337c: 0x0008, 0x337d: 0x0008, 0x337e: 0x0008, 0x337f: 0x0008, + // Block 0xce, offset 0x3380 + 0x3395: 0x0008, 0x3396: 0x0008, 0x3397: 0x0008, + 0x3398: 0x0008, 0x3399: 0x0008, 0x339a: 0x0008, 0x339b: 0x0008, 0x339c: 0x0008, 0x339d: 0x0008, + 0x339e: 0x0008, 0x339f: 0x0008, 0x33a0: 0x0008, 0x33a1: 0x0008, 0x33a2: 0x0008, 0x33a3: 0x0008, + 0x33a4: 0x0008, 0x33a5: 0x0008, 0x33a6: 0x0008, 0x33a7: 0x0008, 0x33a8: 0x0008, 0x33a9: 0x0008, + 0x33aa: 0x0008, 0x33ab: 0x0008, 0x33ac: 0x0008, 0x33ad: 0x0008, 0x33ae: 0x0008, 0x33af: 0x0008, + 0x33b0: 0x0008, 0x33b1: 0x0008, 0x33b2: 0x0008, 0x33b3: 0x0008, 0x33b4: 0x0008, 0x33b5: 0x0008, + 0x33b6: 0x0008, 0x33b7: 0x0008, 0x33b8: 0x0008, 0x33b9: 0x0008, 0x33ba: 0x0008, 0x33bb: 0x0008, + 0x33bc: 0x0008, 0x33bd: 0x0008, 0x33be: 0x0008, 0x33bf: 0x0008, + // Block 0xcf, offset 0x33c0 + 0x33cc: 0x0008, 0x33cd: 0x0008, 0x33ce: 0x0008, 0x33cf: 0x0008, + // Block 0xd0, offset 0x3400 + 0x3408: 0x0008, 0x3409: 0x0008, 0x340a: 0x0008, 0x340b: 0x0008, + 0x340c: 0x0008, 0x340d: 0x0008, 0x340e: 0x0008, 0x340f: 0x0008, + 0x341a: 0x0008, 0x341b: 0x0008, 0x341c: 0x0008, 0x341d: 0x0008, + 0x341e: 0x0008, 0x341f: 0x0008, + // Block 0xd1, offset 0x3440 + 0x3448: 0x0008, 0x3449: 0x0008, 0x344a: 0x0008, 0x344b: 0x0008, + 0x344c: 0x0008, 0x344d: 0x0008, 0x344e: 0x0008, 0x344f: 0x0008, + 0x346e: 0x0008, 0x346f: 0x0008, + 0x3470: 0x0008, 0x3471: 0x0008, 0x3472: 0x0008, 0x3473: 0x0008, 0x3474: 0x0008, 0x3475: 0x0008, + 0x3476: 0x0008, 0x3477: 0x0008, 0x3478: 0x0008, 0x3479: 0x0008, 0x347a: 0x0008, 0x347b: 0x0008, + 0x347c: 0x0008, 0x347d: 0x0008, 0x347e: 0x0008, 0x347f: 0x0008, + // Block 0xd2, offset 0x3480 + 0x348c: 0x0008, 0x348d: 0x0008, 0x348e: 0x0008, 0x348f: 0x0008, 0x3490: 0x0008, 0x3491: 0x0008, + 0x3492: 0x0008, 0x3493: 0x0008, 0x3494: 0x0008, 0x3495: 0x0008, 0x3496: 0x0008, 0x3497: 0x0008, + 0x3498: 0x0008, 0x3499: 0x0008, 0x349a: 0x0008, 0x349b: 0x0008, 0x349c: 0x0008, 0x349d: 0x0008, + 0x349e: 0x0008, 0x349f: 0x0008, 0x34a0: 0x0008, 0x34a1: 0x0008, 0x34a2: 0x0008, 0x34a3: 0x0008, + 0x34a4: 0x0008, 0x34a5: 0x0008, 0x34a6: 0x0008, 0x34a7: 0x0008, 0x34a8: 0x0008, 0x34a9: 0x0008, + 0x34aa: 0x0008, 0x34ab: 0x0008, 0x34ac: 0x0008, 0x34ad: 0x0008, 0x34ae: 0x0008, 0x34af: 0x0008, + 0x34b0: 0x0008, 0x34b1: 0x0008, 0x34b2: 0x0008, 0x34b3: 0x0008, 0x34b4: 0x0008, 0x34b5: 0x0008, + 0x34b6: 0x0008, 0x34b7: 0x0008, 0x34b8: 0x0008, 0x34b9: 0x0008, 0x34ba: 0x0008, + 0x34bc: 0x0008, 0x34bd: 0x0008, 0x34be: 0x0008, 0x34bf: 0x0008, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x0008, 0x34c1: 0x0008, 0x34c2: 0x0008, 0x34c3: 0x0008, 0x34c4: 0x0008, 0x34c5: 0x0008, + 0x34c7: 0x0008, 0x34c8: 0x0008, 0x34c9: 0x0008, 0x34ca: 0x0008, 0x34cb: 0x0008, + 0x34cc: 0x0008, 0x34cd: 0x0008, 0x34ce: 0x0008, 0x34cf: 0x0008, 0x34d0: 0x0008, 0x34d1: 0x0008, + 0x34d2: 0x0008, 0x34d3: 0x0008, 0x34d4: 0x0008, 0x34d5: 0x0008, 0x34d6: 0x0008, 0x34d7: 0x0008, + 0x34d8: 0x0008, 0x34d9: 0x0008, 0x34da: 0x0008, 0x34db: 0x0008, 0x34dc: 0x0008, 0x34dd: 0x0008, + 0x34de: 0x0008, 0x34df: 0x0008, 0x34e0: 0x0008, 0x34e1: 0x0008, 0x34e2: 0x0008, 0x34e3: 0x0008, + 0x34e4: 0x0008, 0x34e5: 0x0008, 0x34e6: 0x0008, 0x34e7: 0x0008, 0x34e8: 0x0008, 0x34e9: 0x0008, + 0x34ea: 0x0008, 0x34eb: 0x0008, 0x34ec: 0x0008, 0x34ed: 0x0008, 0x34ee: 0x0008, 0x34ef: 0x0008, + 0x34f0: 0x0008, 0x34f1: 0x0008, 0x34f2: 0x0008, 0x34f3: 0x0008, 0x34f4: 0x0008, 0x34f5: 0x0008, + 0x34f6: 0x0008, 0x34f7: 0x0008, 0x34f8: 0x0008, 0x34f9: 0x0008, 0x34fa: 0x0008, 0x34fb: 0x0008, + 0x34fc: 0x0008, 0x34fd: 0x0008, 0x34fe: 0x0008, 0x34ff: 0x0008, + // Block 0xd4, offset 0x3500 + 0x3500: 0x0002, 0x3501: 0x0002, 0x3502: 0x0002, 0x3503: 0x0002, 0x3504: 0x0002, 0x3505: 0x0002, + 0x3506: 0x0002, 0x3507: 0x0002, 0x3508: 0x0002, 0x3509: 0x0002, 0x350a: 0x0002, 0x350b: 0x0002, + 0x350c: 0x0002, 0x350d: 0x0002, 0x350e: 0x0002, 0x350f: 0x0002, 0x3510: 0x0002, 0x3511: 0x0002, + 0x3512: 0x0002, 0x3513: 0x0002, 0x3514: 0x0002, 0x3515: 0x0002, 0x3516: 0x0002, 0x3517: 0x0002, + 0x3518: 0x0002, 0x3519: 0x0002, 0x351a: 0x0002, 0x351b: 0x0002, 0x351c: 0x0002, 0x351d: 0x0002, + 0x351e: 0x0002, 0x351f: 0x0002, 0x3520: 0x0004, 0x3521: 0x0004, 0x3522: 0x0004, 0x3523: 0x0004, + 0x3524: 0x0004, 0x3525: 0x0004, 0x3526: 0x0004, 0x3527: 0x0004, 0x3528: 0x0004, 0x3529: 0x0004, + 0x352a: 0x0004, 0x352b: 0x0004, 0x352c: 0x0004, 0x352d: 0x0004, 0x352e: 0x0004, 0x352f: 0x0004, + 0x3530: 0x0004, 0x3531: 0x0004, 0x3532: 0x0004, 0x3533: 0x0004, 0x3534: 0x0004, 0x3535: 0x0004, + 0x3536: 0x0004, 0x3537: 0x0004, 0x3538: 0x0004, 0x3539: 0x0004, 0x353a: 0x0004, 0x353b: 0x0004, + 0x353c: 0x0004, 0x353d: 0x0004, 0x353e: 0x0004, 0x353f: 0x0004, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0002, 0x3541: 0x0002, 0x3542: 0x0002, 0x3543: 0x0002, 0x3544: 0x0002, 0x3545: 0x0002, + 0x3546: 0x0002, 0x3547: 0x0002, 0x3548: 0x0002, 0x3549: 0x0002, 0x354a: 0x0002, 0x354b: 0x0002, + 0x354c: 0x0002, 0x354d: 0x0002, 0x354e: 0x0002, 0x354f: 0x0002, 0x3550: 0x0002, 0x3551: 0x0002, + 0x3552: 0x0002, 0x3553: 0x0002, 0x3554: 0x0002, 0x3555: 0x0002, 0x3556: 0x0002, 0x3557: 0x0002, + 0x3558: 0x0002, 0x3559: 0x0002, 0x355a: 0x0002, 0x355b: 0x0002, 0x355c: 0x0002, 0x355d: 0x0002, + 0x355e: 0x0002, 0x355f: 0x0002, 0x3560: 0x0002, 0x3561: 0x0002, 0x3562: 0x0002, 0x3563: 0x0002, + 0x3564: 0x0002, 0x3565: 0x0002, 0x3566: 0x0002, 0x3567: 0x0002, 0x3568: 0x0002, 0x3569: 0x0002, + 0x356a: 0x0002, 0x356b: 0x0002, 0x356c: 0x0002, 0x356d: 0x0002, 0x356e: 0x0002, 0x356f: 0x0002, + 0x3570: 0x0002, 0x3571: 0x0002, 0x3572: 0x0002, 0x3573: 0x0002, 0x3574: 0x0002, 0x3575: 0x0002, + 0x3576: 0x0002, 0x3577: 0x0002, 0x3578: 0x0002, 0x3579: 0x0002, 0x357a: 0x0002, 0x357b: 0x0002, + 0x357c: 0x0002, 0x357d: 0x0002, 0x357e: 0x0002, 0x357f: 0x0002, + // Block 0xd6, offset 0x3580 + 0x3580: 0x0004, 0x3581: 0x0004, 0x3582: 0x0004, 0x3583: 0x0004, 0x3584: 0x0004, 0x3585: 0x0004, + 0x3586: 0x0004, 0x3587: 0x0004, 0x3588: 0x0004, 0x3589: 0x0004, 0x358a: 0x0004, 0x358b: 0x0004, + 0x358c: 0x0004, 0x358d: 0x0004, 0x358e: 0x0004, 0x358f: 0x0004, 0x3590: 0x0004, 0x3591: 0x0004, + 0x3592: 0x0004, 0x3593: 0x0004, 0x3594: 0x0004, 0x3595: 0x0004, 0x3596: 0x0004, 0x3597: 0x0004, + 0x3598: 0x0004, 0x3599: 0x0004, 0x359a: 0x0004, 0x359b: 0x0004, 0x359c: 0x0004, 0x359d: 0x0004, + 0x359e: 0x0004, 0x359f: 0x0004, 0x35a0: 0x0004, 0x35a1: 0x0004, 0x35a2: 0x0004, 0x35a3: 0x0004, + 0x35a4: 0x0004, 0x35a5: 0x0004, 0x35a6: 0x0004, 0x35a7: 0x0004, 0x35a8: 0x0004, 0x35a9: 0x0004, + 0x35aa: 0x0004, 0x35ab: 0x0004, 0x35ac: 0x0004, 0x35ad: 0x0004, 0x35ae: 0x0004, 0x35af: 0x0004, + 0x35b0: 0x0002, 0x35b1: 0x0002, 0x35b2: 0x0002, 0x35b3: 0x0002, 0x35b4: 0x0002, 0x35b5: 0x0002, + 0x35b6: 0x0002, 0x35b7: 0x0002, 0x35b8: 0x0002, 0x35b9: 0x0002, 0x35ba: 0x0002, 0x35bb: 0x0002, + 0x35bc: 0x0002, 0x35bd: 0x0002, 0x35be: 0x0002, 0x35bf: 0x0002, +} + +// graphemesIndex: 25 blocks, 1600 entries, 1600 bytes +// Block 0 is the zero block. +var graphemesIndex = [1600]property{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, + 0xcc: 0x02, 0xcd: 0x03, + 0xd2: 0x04, 0xd6: 0x05, 0xd7: 0x06, + 0xd8: 0x07, 0xd9: 0x08, 0xdb: 0x09, 0xdc: 0x0a, 0xdd: 0x0b, 0xde: 0x0c, 0xdf: 0x0d, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x14, 0xf3: 0x16, + // Block 0x4, offset 0x100 + 0x120: 0x0e, 0x121: 0x0f, 0x122: 0x10, 0x123: 0x11, 0x124: 0x12, 0x125: 0x13, 0x126: 0x14, 0x127: 0x15, + 0x128: 0x16, 0x129: 0x17, 0x12a: 0x16, 0x12b: 0x18, 0x12c: 0x19, 0x12d: 0x1a, 0x12e: 0x1b, 0x12f: 0x1c, + 0x130: 0x1d, 0x131: 0x1e, 0x132: 0x1f, 0x133: 0x20, 0x134: 0x21, 0x135: 0x22, 0x136: 0x23, 0x137: 0x24, + 0x138: 0x25, 0x139: 0x26, 0x13a: 0x27, 0x13b: 0x28, 0x13c: 0x29, 0x13d: 0x2a, 0x13e: 0x2b, 0x13f: 0x2c, + // Block 0x5, offset 0x140 + 0x140: 0x2d, 0x141: 0x2e, 0x142: 0x2f, 0x144: 0x30, 0x145: 0x31, 0x146: 0x32, 0x147: 0x33, + 0x14d: 0x34, + 0x15c: 0x35, 0x15d: 0x36, 0x15e: 0x37, 0x15f: 0x38, + 0x160: 0x39, 0x162: 0x3a, 0x164: 0x3b, + 0x168: 0x3c, 0x169: 0x3d, 0x16a: 0x3e, 0x16b: 0x3f, 0x16c: 0x40, 0x16d: 0x41, 0x16e: 0x42, 0x16f: 0x43, + 0x170: 0x44, 0x173: 0x45, 0x177: 0x02, + // Block 0x6, offset 0x180 + 0x180: 0x46, 0x181: 0x47, 0x183: 0x48, 0x184: 0x49, 0x186: 0x4a, + 0x18c: 0x4b, 0x18e: 0x4c, 0x18f: 0x4d, + 0x193: 0x4e, 0x196: 0x4f, 0x197: 0x50, + 0x198: 0x51, 0x199: 0x52, 0x19a: 0x53, 0x19b: 0x52, 0x19c: 0x54, 0x19d: 0x55, 0x19e: 0x56, + 0x1a4: 0x57, + 0x1ac: 0x58, 0x1ad: 0x59, + 0x1b3: 0x5a, 0x1b5: 0x5b, 0x1b7: 0x5c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x5d, 0x1c2: 0x5e, + 0x1ca: 0x5f, + // Block 0x8, offset 0x200 + 0x219: 0x60, 0x21a: 0x61, 0x21b: 0x62, + 0x220: 0x63, 0x222: 0x64, 0x223: 0x65, 0x224: 0x66, 0x225: 0x67, 0x226: 0x68, 0x227: 0x69, + 0x228: 0x6a, 0x229: 0x6b, 0x22a: 0x6c, 0x22b: 0x6d, 0x22f: 0x6e, + 0x230: 0x6f, 0x231: 0x70, 0x232: 0x71, 0x233: 0x72, 0x234: 0x73, 0x235: 0x74, 0x236: 0x75, 0x237: 0x6f, + 0x238: 0x70, 0x239: 0x71, 0x23a: 0x72, 0x23b: 0x73, 0x23c: 0x74, 0x23d: 0x75, 0x23e: 0x6f, 0x23f: 0x70, + // Block 0x9, offset 0x240 + 0x240: 0x71, 0x241: 0x72, 0x242: 0x73, 0x243: 0x74, 0x244: 0x75, 0x245: 0x6f, 0x246: 0x70, 0x247: 0x71, + 0x248: 0x72, 0x249: 0x73, 0x24a: 0x74, 0x24b: 0x75, 0x24c: 0x6f, 0x24d: 0x70, 0x24e: 0x71, 0x24f: 0x72, + 0x250: 0x73, 0x251: 0x74, 0x252: 0x75, 0x253: 0x6f, 0x254: 0x70, 0x255: 0x71, 0x256: 0x72, 0x257: 0x73, + 0x258: 0x74, 0x259: 0x75, 0x25a: 0x6f, 0x25b: 0x70, 0x25c: 0x71, 0x25d: 0x72, 0x25e: 0x73, 0x25f: 0x74, + 0x260: 0x75, 0x261: 0x6f, 0x262: 0x70, 0x263: 0x71, 0x264: 0x72, 0x265: 0x73, 0x266: 0x74, 0x267: 0x75, + 0x268: 0x6f, 0x269: 0x70, 0x26a: 0x71, 0x26b: 0x72, 0x26c: 0x73, 0x26d: 0x74, 0x26e: 0x75, 0x26f: 0x6f, + 0x270: 0x70, 0x271: 0x71, 0x272: 0x72, 0x273: 0x73, 0x274: 0x74, 0x275: 0x75, 0x276: 0x6f, 0x277: 0x70, + 0x278: 0x71, 0x279: 0x72, 0x27a: 0x73, 0x27b: 0x74, 0x27c: 0x75, 0x27d: 0x6f, 0x27e: 0x70, 0x27f: 0x71, + // Block 0xa, offset 0x280 + 0x280: 0x72, 0x281: 0x73, 0x282: 0x74, 0x283: 0x75, 0x284: 0x6f, 0x285: 0x70, 0x286: 0x71, 0x287: 0x72, + 0x288: 0x73, 0x289: 0x74, 0x28a: 0x75, 0x28b: 0x6f, 0x28c: 0x70, 0x28d: 0x71, 0x28e: 0x72, 0x28f: 0x73, + 0x290: 0x74, 0x291: 0x75, 0x292: 0x6f, 0x293: 0x70, 0x294: 0x71, 0x295: 0x72, 0x296: 0x73, 0x297: 0x74, + 0x298: 0x75, 0x299: 0x6f, 0x29a: 0x70, 0x29b: 0x71, 0x29c: 0x72, 0x29d: 0x73, 0x29e: 0x74, 0x29f: 0x75, + 0x2a0: 0x6f, 0x2a1: 0x70, 0x2a2: 0x71, 0x2a3: 0x72, 0x2a4: 0x73, 0x2a5: 0x74, 0x2a6: 0x75, 0x2a7: 0x6f, + 0x2a8: 0x70, 0x2a9: 0x71, 0x2aa: 0x72, 0x2ab: 0x73, 0x2ac: 0x74, 0x2ad: 0x75, 0x2ae: 0x6f, 0x2af: 0x70, + 0x2b0: 0x71, 0x2b1: 0x72, 0x2b2: 0x73, 0x2b3: 0x74, 0x2b4: 0x75, 0x2b5: 0x6f, 0x2b6: 0x70, 0x2b7: 0x71, + 0x2b8: 0x72, 0x2b9: 0x73, 0x2ba: 0x74, 0x2bb: 0x75, 0x2bc: 0x6f, 0x2bd: 0x70, 0x2be: 0x71, 0x2bf: 0x72, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x73, 0x2c1: 0x74, 0x2c2: 0x75, 0x2c3: 0x6f, 0x2c4: 0x70, 0x2c5: 0x71, 0x2c6: 0x72, 0x2c7: 0x73, + 0x2c8: 0x74, 0x2c9: 0x75, 0x2ca: 0x6f, 0x2cb: 0x70, 0x2cc: 0x71, 0x2cd: 0x72, 0x2ce: 0x73, 0x2cf: 0x74, + 0x2d0: 0x75, 0x2d1: 0x6f, 0x2d2: 0x70, 0x2d3: 0x71, 0x2d4: 0x72, 0x2d5: 0x73, 0x2d6: 0x74, 0x2d7: 0x75, + 0x2d8: 0x6f, 0x2d9: 0x70, 0x2da: 0x71, 0x2db: 0x72, 0x2dc: 0x73, 0x2dd: 0x74, 0x2de: 0x76, 0x2df: 0x77, + // Block 0xc, offset 0x300 + 0x32c: 0x78, + 0x338: 0x79, 0x33b: 0x7a, 0x33e: 0x61, 0x33f: 0x7b, + // Block 0xd, offset 0x340 + 0x347: 0x7c, + 0x34b: 0x7d, 0x34d: 0x7e, + 0x368: 0x7f, 0x36b: 0x80, + 0x374: 0x81, + 0x37a: 0x82, 0x37b: 0x83, 0x37d: 0x84, 0x37e: 0x85, + // Block 0xe, offset 0x380 + 0x380: 0x86, 0x381: 0x87, 0x382: 0x88, 0x383: 0x89, 0x384: 0x8a, 0x385: 0x8b, 0x386: 0x8c, 0x387: 0x8d, + 0x388: 0x8e, 0x389: 0x8f, 0x38b: 0x90, 0x38c: 0x21, 0x38d: 0x91, + 0x390: 0x92, 0x391: 0x93, 0x392: 0x94, 0x393: 0x95, 0x396: 0x96, 0x397: 0x97, + 0x398: 0x98, 0x399: 0x99, 0x39a: 0x9a, 0x39c: 0x9b, + 0x3a0: 0x9c, 0x3a4: 0x9d, 0x3a5: 0x9e, 0x3a7: 0x9f, + 0x3a8: 0xa0, 0x3a9: 0xa1, 0x3aa: 0xa2, + 0x3b0: 0xa3, 0x3b2: 0xa4, 0x3b4: 0xa5, 0x3b5: 0xa6, 0x3b6: 0xa7, + 0x3bb: 0xa8, 0x3bc: 0xa9, 0x3bd: 0xaa, + // Block 0xf, offset 0x3c0 + 0x3d0: 0xab, 0x3d1: 0xac, + // Block 0x10, offset 0x400 + 0x42b: 0xad, 0x42c: 0xae, + 0x43d: 0xaf, 0x43e: 0xb0, 0x43f: 0xb1, + // Block 0x11, offset 0x440 + 0x472: 0xb2, + // Block 0x12, offset 0x480 + 0x4bc: 0xb3, 0x4bd: 0xb4, + // Block 0x13, offset 0x4c0 + 0x4c5: 0xb5, 0x4c6: 0xb6, + 0x4c9: 0xb7, + 0x4e8: 0xb8, 0x4e9: 0xb9, 0x4ea: 0xba, + // Block 0x14, offset 0x500 + 0x500: 0xbb, 0x502: 0xbc, 0x504: 0xae, + 0x50a: 0xbd, 0x50b: 0xbe, + 0x513: 0xbe, + 0x523: 0xbf, 0x525: 0xc0, + // Block 0x15, offset 0x540 + 0x540: 0x52, 0x541: 0x52, 0x542: 0x52, 0x543: 0x52, 0x544: 0xc1, 0x545: 0xc2, 0x546: 0xc3, 0x547: 0xc4, + 0x548: 0xc5, 0x549: 0xc6, 0x54a: 0x52, 0x54b: 0x52, 0x54c: 0x52, 0x54d: 0x52, 0x54e: 0x52, 0x54f: 0xc7, + 0x550: 0x52, 0x551: 0x52, 0x552: 0x52, 0x553: 0x52, 0x554: 0xc8, 0x555: 0xc9, 0x556: 0x52, 0x557: 0x52, + 0x558: 0x52, 0x559: 0xca, 0x55a: 0x52, 0x55b: 0x52, 0x55d: 0xcb, 0x55f: 0xcc, + 0x560: 0xcd, 0x561: 0xce, 0x562: 0xcf, 0x563: 0x52, 0x564: 0xd0, 0x565: 0xd1, 0x566: 0x52, 0x567: 0x52, + 0x568: 0x52, 0x569: 0x52, 0x56a: 0x52, 0x56b: 0x52, + 0x570: 0x52, 0x571: 0x52, 0x572: 0x52, 0x573: 0x52, 0x574: 0x52, 0x575: 0x52, 0x576: 0x52, 0x577: 0x52, + 0x578: 0x52, 0x579: 0x52, 0x57a: 0x52, 0x57b: 0x52, 0x57c: 0x52, 0x57d: 0x52, 0x57e: 0x52, 0x57f: 0xc8, + // Block 0x16, offset 0x580 + 0x590: 0x0b, 0x591: 0x0c, 0x593: 0x0d, 0x596: 0x0e, + 0x59b: 0x0f, 0x59c: 0x10, 0x59d: 0x11, 0x59e: 0x12, 0x59f: 0x13, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xd2, 0x5c1: 0x02, 0x5c2: 0xd3, 0x5c3: 0xd3, 0x5c4: 0x02, 0x5c5: 0x02, 0x5c6: 0x02, 0x5c7: 0xd4, + 0x5c8: 0xd3, 0x5c9: 0xd3, 0x5ca: 0xd3, 0x5cb: 0xd3, 0x5cc: 0xd3, 0x5cd: 0xd3, 0x5ce: 0xd3, 0x5cf: 0xd3, + 0x5d0: 0xd3, 0x5d1: 0xd3, 0x5d2: 0xd3, 0x5d3: 0xd3, 0x5d4: 0xd3, 0x5d5: 0xd3, 0x5d6: 0xd3, 0x5d7: 0xd3, + 0x5d8: 0xd3, 0x5d9: 0xd3, 0x5da: 0xd3, 0x5db: 0xd3, 0x5dc: 0xd3, 0x5dd: 0xd3, 0x5de: 0xd3, 0x5df: 0xd3, + 0x5e0: 0xd3, 0x5e1: 0xd3, 0x5e2: 0xd3, 0x5e3: 0xd3, 0x5e4: 0xd3, 0x5e5: 0xd3, 0x5e6: 0xd3, 0x5e7: 0xd3, + 0x5e8: 0xd3, 0x5e9: 0xd3, 0x5ea: 0xd3, 0x5eb: 0xd3, 0x5ec: 0xd3, 0x5ed: 0xd3, 0x5ee: 0xd3, 0x5ef: 0xd3, + 0x5f0: 0xd3, 0x5f1: 0xd3, 0x5f2: 0xd3, 0x5f3: 0xd3, 0x5f4: 0xd3, 0x5f5: 0xd3, 0x5f6: 0xd3, 0x5f7: 0xd3, + 0x5f8: 0xd3, 0x5f9: 0xd3, 0x5fa: 0xd3, 0x5fb: 0xd3, 0x5fc: 0xd3, 0x5fd: 0xd3, 0x5fe: 0xd3, 0x5ff: 0xd3, + // Block 0x18, offset 0x600 + 0x620: 0x15, +} diff --git a/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go b/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go new file mode 100644 index 000000000..17e9b550b --- /dev/null +++ b/vendor/github.com/clipperhouse/uax29/v2/internal/iterators/iterator.go @@ -0,0 +1,85 @@ +package iterators + +type Stringish interface { + []byte | string +} + +type SplitFunc[T Stringish] func(T, bool) (int, T, error) + +// Iterator is a generic iterator for words that are either []byte or string. +// Iterate while Next() is true, and access the word via Value(). +type Iterator[T Stringish] struct { + split SplitFunc[T] + data T + start int + pos int +} + +// New creates a new Iterator for the given data and SplitFunc. +func New[T Stringish](split SplitFunc[T], data T) *Iterator[T] { + return &Iterator[T]{ + split: split, + data: data, + } +} + +// SetText sets the text for the iterator to operate on, and resets all state. +func (iter *Iterator[T]) SetText(data T) { + iter.data = data + iter.start = 0 + iter.pos = 0 +} + +// Split sets the SplitFunc for the Iterator. +func (iter *Iterator[T]) Split(split SplitFunc[T]) { + iter.split = split +} + +// Next advances the iterator to the next token. It returns false when there +// are no remaining tokens or an error occurred. +func (iter *Iterator[T]) Next() bool { + if iter.pos == len(iter.data) { + return false + } + if iter.pos > len(iter.data) { + panic("SplitFunc advanced beyond the end of the data") + } + + iter.start = iter.pos + + advance, _, err := iter.split(iter.data[iter.pos:], true) + if err != nil { + panic(err) + } + if advance <= 0 { + panic("SplitFunc returned a zero or negative advance") + } + + iter.pos += advance + if iter.pos > len(iter.data) { + panic("SplitFunc advanced beyond the end of the data") + } + + return true +} + +// Value returns the current token. +func (iter *Iterator[T]) Value() T { + return iter.data[iter.start:iter.pos] +} + +// Start returns the byte position of the current token in the original data. +func (iter *Iterator[T]) Start() int { + return iter.start +} + +// End returns the byte position after the current token in the original data. +func (iter *Iterator[T]) End() int { + return iter.pos +} + +// Reset resets the iterator to the beginning of the data. +func (iter *Iterator[T]) Reset() { + iter.start = 0 + iter.pos = 0 +} diff --git a/vendor/github.com/mattn/go-runewidth/benchstat.txt b/vendor/github.com/mattn/go-runewidth/benchstat.txt new file mode 100644 index 000000000..a9efdbde3 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/benchstat.txt @@ -0,0 +1,43 @@ +goos: darwin +goarch: arm64 +pkg: github.com/mattn/go-runewidth +cpu: Apple M2 + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ sec/op โ”‚ sec/op vs base โ”‚ +String1WidthAll/regular-8 108.92m ยฑ 0% 35.09m ยฑ 3% -67.78% (p=0.002 n=6) +String1WidthAll/lut-8 93.97m ยฑ 0% 18.70m ยฑ 0% -80.10% (p=0.002 n=6) +String1Width768/regular-8 60.62ยต ยฑ 1% 11.54ยต ยฑ 0% -80.97% (p=0.002 n=6) +String1Width768/lut-8 60.66ยต ยฑ 1% 11.43ยต ยฑ 0% -81.16% (p=0.002 n=6) +String1WidthAllEastAsian/regular-8 115.13m ยฑ 1% 40.79m ยฑ 8% -64.57% (p=0.002 n=6) +String1WidthAllEastAsian/lut-8 93.65m ยฑ 0% 18.70m ยฑ 2% -80.03% (p=0.002 n=6) +String1Width768EastAsian/regular-8 75.32ยต ยฑ 0% 23.49ยต ยฑ 0% -68.82% (p=0.002 n=6) +String1Width768EastAsian/lut-8 60.76ยต ยฑ 0% 11.50ยต ยฑ 0% -81.07% (p=0.002 n=6) +geomean 2.562m 604.5ยต -76.41% + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ B/op โ”‚ B/op vs base โ”‚ +String1WidthAll/regular-8 106.3Mi ยฑ 0% 0.0Mi ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAll/lut-8 106.3Mi ยฑ 0% 0.0Mi ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768/regular-8 75.00Ki ยฑ 0% 0.00Ki ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768/lut-8 75.00Ki ยฑ 0% 0.00Ki ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAllEastAsian/regular-8 106.3Mi ยฑ 0% 0.0Mi ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAllEastAsian/lut-8 106.3Mi ยฑ 0% 0.0Mi ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768EastAsian/regular-8 75.00Ki ยฑ 0% 0.00Ki ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768EastAsian/lut-8 75.00Ki ยฑ 0% 0.00Ki ยฑ 0% -100.00% (p=0.002 n=6) +geomean 2.790Mi ? ยน ยฒ +ยน summaries must be >0 to compute geomean +ยฒ ratios must be >0 to compute geomean + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ allocs/op โ”‚ allocs/op vs base โ”‚ +String1WidthAll/regular-8 3.342M ยฑ 0% 0.000M ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAll/lut-8 3.342M ยฑ 0% 0.000M ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768/regular-8 2.304k ยฑ 0% 0.000k ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768/lut-8 2.304k ยฑ 0% 0.000k ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAllEastAsian/regular-8 3.342M ยฑ 0% 0.000M ยฑ 0% -100.00% (p=0.002 n=6) +String1WidthAllEastAsian/lut-8 3.342M ยฑ 0% 0.000M ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768EastAsian/regular-8 2.304k ยฑ 0% 0.000k ยฑ 0% -100.00% (p=0.002 n=6) +String1Width768EastAsian/lut-8 2.304k ยฑ 0% 0.000k ยฑ 0% -100.00% (p=0.002 n=6) +geomean 87.75k ? ยน ยฒ +ยน summaries must be >0 to compute geomean +ยฒ ratios must be >0 to compute geomean diff --git a/vendor/github.com/mattn/go-runewidth/new.txt b/vendor/github.com/mattn/go-runewidth/new.txt new file mode 100644 index 000000000..889071256 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/new.txt @@ -0,0 +1,54 @@ +goos: darwin +goarch: arm64 +pkg: github.com/mattn/go-runewidth +cpu: Apple M2 +BenchmarkString1WidthAll/regular-8 33 35033923 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/regular-8 33 34965112 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/regular-8 33 36307234 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/regular-8 33 35007705 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/regular-8 33 35154182 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/regular-8 34 35155400 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 63 18688500 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 63 18712474 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 63 18700211 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 62 18694179 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 62 18708392 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAll/lut-8 63 18770608 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 104137 11526 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 103986 11540 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 104079 11552 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 103963 11530 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 103714 11538 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/regular-8 104181 11537 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 105150 11420 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 104778 11423 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 105069 11422 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 105127 11475 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 104742 11433 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768/lut-8 105163 11432 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 40723347 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 40790299 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 40801338 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 40798216 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 44135253 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 28 40779546 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 62 18694165 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 62 18685047 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 62 18689273 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 62 19150346 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 63 19126154 ns/op 0 B/op 0 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 62 18712619 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 50775 23595 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 51061 23563 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 51057 23492 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 51138 23445 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 51195 23469 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/regular-8 51087 23482 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104559 11549 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104508 11483 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104296 11503 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104606 11485 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104588 11495 ns/op 0 B/op 0 allocs/op +BenchmarkString1Width768EastAsian/lut-8 104602 11518 ns/op 0 B/op 0 allocs/op +PASS +ok github.com/mattn/go-runewidth 64.455s diff --git a/vendor/github.com/mattn/go-runewidth/old.txt b/vendor/github.com/mattn/go-runewidth/old.txt new file mode 100644 index 000000000..5b9ac1646 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/old.txt @@ -0,0 +1,54 @@ +goos: darwin +goarch: arm64 +pkg: github.com/mattn/go-runewidth +cpu: Apple M2 +BenchmarkString1WidthAll/regular-8 10 108559258 ns/op 111412145 B/op 3342342 allocs/op +BenchmarkString1WidthAll/regular-8 10 108968079 ns/op 111412364 B/op 3342343 allocs/op +BenchmarkString1WidthAll/regular-8 10 108890338 ns/op 111412388 B/op 3342344 allocs/op +BenchmarkString1WidthAll/regular-8 10 108940704 ns/op 111412584 B/op 3342346 allocs/op +BenchmarkString1WidthAll/regular-8 10 108632796 ns/op 111412348 B/op 3342343 allocs/op +BenchmarkString1WidthAll/regular-8 10 109354546 ns/op 111412777 B/op 3342343 allocs/op +BenchmarkString1WidthAll/lut-8 12 93844406 ns/op 111412569 B/op 3342345 allocs/op +BenchmarkString1WidthAll/lut-8 12 93991080 ns/op 111412512 B/op 3342344 allocs/op +BenchmarkString1WidthAll/lut-8 12 93980632 ns/op 111412413 B/op 3342343 allocs/op +BenchmarkString1WidthAll/lut-8 12 94004083 ns/op 111412396 B/op 3342343 allocs/op +BenchmarkString1WidthAll/lut-8 12 93959795 ns/op 111412445 B/op 3342343 allocs/op +BenchmarkString1WidthAll/lut-8 12 93846198 ns/op 111412556 B/op 3342345 allocs/op +BenchmarkString1Width768/regular-8 19785 60696 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/regular-8 19824 60520 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/regular-8 19832 60547 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/regular-8 19778 60543 ns/op 76800 B/op 2304 allocs/op +BenchmarkString1Width768/regular-8 19842 61142 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/regular-8 19780 60696 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19598 61161 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19731 60707 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19738 60626 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19764 60670 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19797 60642 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768/lut-8 19738 60608 ns/op 76800 B/op 2304 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 115080431 ns/op 111412458 B/op 3342345 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 114908880 ns/op 111412476 B/op 3342345 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 115077134 ns/op 111412540 B/op 3342345 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 115175292 ns/op 111412467 B/op 3342345 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 115792653 ns/op 111412362 B/op 3342344 allocs/op +BenchmarkString1WidthAllEastAsian/regular-8 9 115255417 ns/op 111412572 B/op 3342346 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 93761542 ns/op 111412538 B/op 3342345 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 94089990 ns/op 111412440 B/op 3342343 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 93721410 ns/op 111412514 B/op 3342344 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 93572951 ns/op 111412329 B/op 3342342 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 93536052 ns/op 111412206 B/op 3342341 allocs/op +BenchmarkString1WidthAllEastAsian/lut-8 12 93532365 ns/op 111412412 B/op 3342343 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15904 75401 ns/op 76800 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15932 75449 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15944 75181 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15963 75311 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15879 75292 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/regular-8 15955 75334 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19692 60692 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19712 60699 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19741 60819 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19771 60653 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19737 61027 ns/op 76801 B/op 2304 allocs/op +BenchmarkString1Width768EastAsian/lut-8 19657 60820 ns/op 76801 B/op 2304 allocs/op +PASS +ok github.com/mattn/go-runewidth 76.165s diff --git a/vendor/github.com/mattn/go-runewidth/runewidth.go b/vendor/github.com/mattn/go-runewidth/runewidth.go index 7dfbb3be9..0edabac39 100644 --- a/vendor/github.com/mattn/go-runewidth/runewidth.go +++ b/vendor/github.com/mattn/go-runewidth/runewidth.go @@ -4,7 +4,7 @@ import ( "os" "strings" - "github.com/rivo/uniseg" + "github.com/clipperhouse/uax29/v2/graphemes" ) //go:generate go run script/generate.go @@ -64,6 +64,9 @@ func inTable(r rune, t table) bool { if r < t[0].first { return false } + if r > t[len(t)-1].last { + return false + } bot := 0 top := len(t) - 1 @@ -175,10 +178,10 @@ func (c *Condition) CreateLUT() { // StringWidth return width as you can see func (c *Condition) StringWidth(s string) (width int) { - g := uniseg.NewGraphemes(s) + g := graphemes.FromString(s) for g.Next() { var chWidth int - for _, r := range g.Runes() { + for _, r := range g.Value() { chWidth = c.RuneWidth(r) if chWidth > 0 { break // Our best guess at this point is to use the width of the first non-zero-width rune. @@ -197,17 +200,17 @@ func (c *Condition) Truncate(s string, w int, tail string) string { w -= c.StringWidth(tail) var width int pos := len(s) - g := uniseg.NewGraphemes(s) + g := graphemes.FromString(s) for g.Next() { var chWidth int - for _, r := range g.Runes() { + for _, r := range g.Value() { chWidth = c.RuneWidth(r) if chWidth > 0 { break // See StringWidth() for details. } } if width+chWidth > w { - pos, _ = g.Positions() + pos = g.Start() break } width += chWidth @@ -224,10 +227,10 @@ func (c *Condition) TruncateLeft(s string, w int, prefix string) string { var width int pos := len(s) - g := uniseg.NewGraphemes(s) + g := graphemes.FromString(s) for g.Next() { var chWidth int - for _, r := range g.Runes() { + for _, r := range g.Value() { chWidth = c.RuneWidth(r) if chWidth > 0 { break // See StringWidth() for details. @@ -236,10 +239,10 @@ func (c *Condition) TruncateLeft(s string, w int, prefix string) string { if width+chWidth > w { if width < w { - _, pos = g.Positions() + pos = g.End() prefix += strings.Repeat(" ", width+chWidth-w) } else { - pos, _ = g.Positions() + pos = g.Start() } break diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_windows.go b/vendor/github.com/mattn/go-runewidth/runewidth_windows.go index 5f987a310..951500a24 100644 --- a/vendor/github.com/mattn/go-runewidth/runewidth_windows.go +++ b/vendor/github.com/mattn/go-runewidth/runewidth_windows.go @@ -4,6 +4,7 @@ package runewidth import ( + "os" "syscall" ) @@ -14,6 +15,11 @@ var ( // IsEastAsian return true if the current locale is CJK func IsEastAsian() bool { + if os.Getenv("WT_SESSION") != "" { + // Windows Terminal always not use East Asian Ambiguous Width(s). + return false + } + r1, _, _ := procGetConsoleOutputCP.Call() if r1 == 0 { return false diff --git a/vendor/github.com/olekukonko/cat/.gitignore b/vendor/github.com/olekukonko/cat/.gitignore new file mode 100644 index 000000000..fbfee294e --- /dev/null +++ b/vendor/github.com/olekukonko/cat/.gitignore @@ -0,0 +1,3 @@ +.idea +.github +lab \ No newline at end of file diff --git a/vendor/github.com/olekukonko/cat/LICENSE b/vendor/github.com/olekukonko/cat/LICENSE new file mode 100644 index 000000000..ca02db8c2 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Oleku Konko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/olekukonko/cat/README.md b/vendor/github.com/olekukonko/cat/README.md new file mode 100644 index 000000000..c54e35f22 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/README.md @@ -0,0 +1,168 @@ +# ๐Ÿฑ `cat` - The Fast & Fluent String Concatenation Library for Go + +> **"Because building strings shouldn't feel like herding cats"** ๐Ÿ˜ผ + +## Why `cat`? + +Go's `strings.Builder` is great, but building complex strings often feels clunky. `cat` makes string concatenation: + +- **Faster** - Optimized paths for common types, zero-allocation conversions +- **Fluent** - Chainable methods for beautiful, readable code +- **Flexible** - Handles any type, nested structures, and custom formatting +- **Smart** - Automatic pooling, size estimation, and separator handling + +```go +// Without cat +var b strings.Builder +b.WriteString("Hello, ") +b.WriteString(user.Name) +b.WriteString("! You have ") +b.WriteString(strconv.Itoa(count)) +b.WriteString(" new messages.") +result := b.String() + +// With cat +result := cat.Concat("Hello, ", user.Name, "! You have ", count, " new messages.") +``` + +## ๐Ÿ”ฅ Hot Features + +### 1. Fluent Builder API + +Build strings like a boss with method chaining: + +```go +s := cat.New(", "). + Add("apple"). + If(user.IsVIP, "golden kiwi"). + Add("orange"). + Sep(" | "). // Change separator mid-way + Add("banana"). + String() +// "apple, golden kiwi, orange | banana" +``` + +### 2. Zero-Allocation Magic + +- **Pooled builders** (optional) reduce GC pressure +- **Unsafe byte conversions** (opt-in) avoid `[]byte`โ†’`string` copies +- **Stack buffers** for numbers instead of heap allocations + +```go +// Enable performance features +cat.Pool(true) // Builder pooling +cat.SetUnsafeBytes(true) // Zero-copy []byte conversion +``` + +### 3. Handles Any Type - Even Nested Ones! + +No more manual type conversions: + +```go +data := map[string]any{ + "id": 12345, + "tags": []string{"go", "fast", "efficient"}, +} + +fmt.Println(cat.JSONPretty(data)) +// { +// "id": 12345, +// "tags": ["go", "fast", "efficient"] +// } +``` + +### 4. Concatenation for Every Use Case + +```go +// Simple joins +cat.With(", ", "apple", "banana", "cherry") // "apple, banana, cherry" + +// File paths +cat.Path("dir", "sub", "file.txt") // "dir/sub/file.txt" + +// CSV +cat.CSV(1, 2, 3) // "1,2,3" + +// Conditional elements +cat.Start("Hello").If(user != nil, " ", user.Name) // "Hello" or "Hello Alice" + +// Repeated patterns +cat.RepeatWith("-+", "X", 3) // "X-+X-+X" +``` + +### 5. Smarter Than Your Average String Lib + +```go +// Automatic nesting handling +nested := []any{"a", []any{"b", "c"}, "d"} +cat.FlattenWith(",", nested) // "a,b,c,d" + +// Precise size estimation (minimizes allocations) +b := cat.New(", ").Grow(estimatedSize) // Preallocate exactly what you need + +// Reflection support for any type +cat.Reflect(anyComplexStruct) // "{Field1:value Field2:[1 2 3]}" +``` + +## ๐Ÿš€ Getting Started + +```bash +go get github.com/your-repo/cat +``` + +```go +import "github.com/your-repo/cat" + +func main() { + // Simple concatenation + msg := cat.Concat("User ", userID, " has ", count, " items") + + // Pooled builder (for high-performance loops) + builder := cat.New(", ") + defer builder.Release() // Return to pool + result := builder.Add(items...).String() +} +``` + +## ๐Ÿค” Why Not Just Use...? + +- `fmt.Sprintf` - Slow, many allocations +- `strings.Join` - Only works with strings +- `bytes.Buffer` - No separator support, manual type handling +- `string +` - Even worse performance, especially in loops + +## ๐Ÿ’ก Pro Tips + +1. **Enable pooling** in high-throughput scenarios +2. **Preallocate** with `.Grow()` when you know the final size +3. Use **`If()`** for conditional elements in fluent chains +4. Try **`SetUnsafeBytes(true)`** if you can guarantee byte slices won't mutate +5. **Release builders** when pooling is enabled + +## ๐Ÿฑโ€๐Ÿ‘ค Advanced Usage + +```go +// Custom value formatting +type User struct { + Name string + Age int +} + +func (u User) String() string { + return cat.With(" ", u.Name, cat.Wrap("(", u.Age, ")")) +} + +// JSON-like output +func JSONPretty(v any) string { + return cat.WrapWith(",\n ", "{\n ", "\n}", prettyFields(v)) +} +``` + +```text +/\_/\ +( o.o ) > Concatenate with purr-fection! +> ^ < + +``` + +**`cat`** - Because life's too short for ugly string building code. ๐Ÿ˜ป \ No newline at end of file diff --git a/vendor/github.com/olekukonko/cat/builder.go b/vendor/github.com/olekukonko/cat/builder.go new file mode 100644 index 000000000..6f36b4f45 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/builder.go @@ -0,0 +1,124 @@ +package cat + +import ( + "strings" +) + +// Builder is a fluent concatenation helper. It is safe for concurrent use by +// multiple goroutines only if each goroutine uses a distinct *Builder. +// If pooling is enabled via Pool(true), call Release() when done. +// The Builder uses an internal strings.Builder for efficient string concatenation +// and manages a separator that is inserted between added values. +// It supports chaining methods for a fluent API style. +type Builder struct { + buf strings.Builder + sep string + needsSep bool +} + +// New begins a new Builder with a separator. If pooling is enabled, +// the Builder is reused and MUST be released with b.Release() when done. +// If sep is empty, uses DefaultSep(). +// Optional initial arguments x are added immediately after creation. +// Pooling is controlled globally via Pool(true/false); when enabled, Builders +// are recycled to reduce allocations in high-throughput scenarios. +func New(sep string, x ...any) *Builder { + var b *Builder + if poolEnabled.Load() { + b = builderPool.Get().(*Builder) + b.buf.Reset() + b.sep = sep + b.needsSep = false + } else { + b = &Builder{sep: sep} + } + + // Process initial arguments *after* the builder is prepared. + if len(x) > 0 { + b.Add(x...) + } + return b +} + +// Start begins a new Builder with no separator (using an empty string as sep). +// It is a convenience function that wraps New(empty, x...), where empty is a constant empty string. +// This allows starting a concatenation without any separator between initial or subsequent additions. +// If pooling is enabled via Pool(true), the returned Builder MUST be released with b.Release() when done. +// Optional variadic arguments x are passed directly to New and added immediately after creation. +// Useful for fluent chains where no default separator is desired from the start. +func Start(x ...any) *Builder { + return New(empty, x...) +} + +// Grow pre-sizes the internal buffer. +// This can be used to preallocate capacity based on an estimated total size, +// reducing reallocations during subsequent Add calls. +// It chains, returning the Builder for fluent use. +func (b *Builder) Grow(n int) *Builder { b.buf.Grow(n); return b } + +// Add appends values to the builder. +// It inserts the current separator before each new value if needed (i.e., after the first addition). +// Values are converted to strings using the optimized write function, which handles +// common types efficiently without allocations where possible. +// Supports any number of arguments of any type. +// Chains, returning the Builder for fluent use. +func (b *Builder) Add(args ...any) *Builder { + for _, arg := range args { + if b.needsSep && b.sep != empty { + b.buf.WriteString(b.sep) + } + write(&b.buf, arg) + b.needsSep = true + } + return b +} + +// If appends values to the builder only if the condition is true. +// Behaves like Add when condition is true; does nothing otherwise. +// Useful for conditional concatenation in chains. +// Chains, returning the Builder for fluent use. +func (b *Builder) If(condition bool, args ...any) *Builder { + if condition { + b.Add(args...) + } + return b +} + +// Sep changes the separator for subsequent additions. +// Future Add calls will use this new separator. +// Does not affect already added content. +// If sep is empty, no separator will be added between future values. +// Chains, returning the Builder for fluent use. +func (b *Builder) Sep(sep string) *Builder { b.sep = sep; return b } + +// String returns the concatenated result. +// This does not release the Builder; if pooling is enabled, call Release separately +// if you are done with the Builder. +// Can be called multiple times; the internal buffer remains unchanged. +func (b *Builder) String() string { return b.buf.String() } + +// Output returns the concatenated result and releases the Builder if pooling is enabled. +// This is a convenience method to get the string and clean up in one call. +// After Output, the Builder should not be used further if pooled, as it may be recycled. +// If pooling is disabled, it behaves like String without release. +func (b *Builder) Output() string { + out := b.buf.String() + b.Release() // Release takes care of the poolEnabled check + return out +} + +// Release returns the Builder to the pool if pooling is enabled. +// You should call this exactly once per New() when Pool(true) is active. +// Resets the internal state (buffer, separator, needsSep) before pooling to avoid +// retaining data or large allocations. +// If pooling is disabled, this is a no-op. +// Safe to call multiple times, but typically called once at the end of use. +func (b *Builder) Release() { + if poolEnabled.Load() { + // Avoid retaining large buffers. + b.buf.Reset() + b.sep = empty + b.needsSep = false + builderPool.Put(b) + } +} diff --git a/vendor/github.com/olekukonko/cat/cat.go b/vendor/github.com/olekukonko/cat/cat.go new file mode 100644 index 000000000..03b20bea2 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/cat.go @@ -0,0 +1,117 @@ +// Package cat provides efficient and flexible string concatenation utilities. +// It includes optimized functions for concatenating various types, builders for fluent chaining, +// and configuration options for defaults, pooling, and unsafe optimizations. +// The package aims to minimize allocations and improve performance in string building scenarios. +package cat + +import ( + "sync" + "sync/atomic" +) + +// Constants used throughout the package for separators, defaults, and configuration. +// These include common string literals for separators, empty strings, and special representations, +// as well as limits like recursion depth. Defining them as constants allows for compile-time +// optimizations, readability, and consistent usage in functions like Space, Path, CSV, and reflection handlers. +// cat.go (updated constants section) +const ( + empty = "" // Empty string constant, used for checks and defaults. + space = " " // Single space, default separator. + slash = "/" // Forward slash, for paths. + dot = "." // Period, for extensions or decimals. + comma = "," // Comma, for CSV or lists. + equal = "=" // Equals, for comparisons. + newline = "\n" // Newline, for multi-line strings. + + // SQL-specific constants + and = "AND" // AND operator, for SQL conditions. + inOpen = " IN (" // Opening for SQL IN clause + inClose = ")" // Closing for SQL IN clause + asSQL = " AS " // SQL AS for aliasing + count = "COUNT(" // SQL COUNT function prefix + sum = "SUM(" // SQL SUM function prefix + avg = "AVG(" // SQL AVG function prefix + maxOpen = "MAX(" // SQL MAX function prefix + minOpen = "MIN(" // SQL MIN function prefix + caseSQL = "CASE " // SQL CASE keyword + when = "WHEN " // SQL WHEN clause + then = " THEN " // SQL THEN clause + elseSQL = " ELSE " // SQL ELSE clause + end = " END" // SQL END for CASE + countAll = "COUNT(*)" // SQL COUNT(*) for all rows + parenOpen = "(" // Opening parenthesis + parenClose = ")" // Closing parenthesis + + maxRecursionDepth = 32 // Maximum recursion depth for nested structure handling. + nilString = "" // String representation for nil values. + unexportedString = "" // Placeholder for unexported fields. +) + +// Numeric is a generic constraint interface for numeric types. +// It includes all signed/unsigned integers and floats. +// Used in generic functions like Number and NumberWith to constrain to numbers. +type Numeric interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64 +} + +// poolEnabled controls whether New() reuses Builder instances from a pool. +// Atomic.Bool for thread-safe toggle. +// When true, Builders from New must be Released to avoid leaks. +var poolEnabled atomic.Bool + +// builderPool stores reusable *Builder to reduce GC pressure on hot paths. +// Uses sync.Pool for efficient allocation/reuse. +// New func creates a fresh &Builder when pool is empty. +var builderPool = sync.Pool{ + New: func() any { return &Builder{} }, +} + +// Pool enables or disables Builder pooling for New()/Release(). +// When enabled, you MUST call b.Release() after b.String() to return it. +// Thread-safe via atomic.Store. +// Enable for high-throughput scenarios to reduce allocations. +func Pool(enable bool) { poolEnabled.Store(enable) } + +// unsafeBytesFlag controls zero-copy []byte -> string behavior via atomics. +// Int32 used for atomic operations: 1 = enabled, 0 = disabled. +// Affects bytesToString function for zero-copy conversions using unsafe. +var unsafeBytesFlag atomic.Int32 // 1 = true, 0 = false + +// SetUnsafeBytes toggles zero-copy []byte -> string conversions globally. +// When enabled, bytesToString uses unsafe.String for zero-allocation conversion. +// Thread-safe via atomic.Store. +// Use with caution: assumes the byte slice is not modified after conversion. +// Compatible with Go 1.20+; fallback to string(bts) if disabled. +func SetUnsafeBytes(enable bool) { + if enable { + unsafeBytesFlag.Store(1) + } else { + unsafeBytesFlag.Store(0) + } +} + +// IsUnsafeBytes reports whether zero-copy []byte -> string is enabled. +// Thread-safe via atomic.Load. +// Returns true if flag is 1, false otherwise. +// Useful for checking current configuration. +func IsUnsafeBytes() bool { return unsafeBytesFlag.Load() == 1 } + +// deterministicMaps controls whether map keys are sorted for deterministic output in string conversions. +// It uses atomic.Bool for thread-safe access. +var deterministicMaps atomic.Bool + +// SetDeterministicMaps controls whether map keys are sorted for deterministic output +// in reflection-based handling (e.g., in writeReflect for maps). +// When enabled, keys are sorted using a string-based comparison for consistent string representations. +// Thread-safe via atomic.Store. +// Useful for reproducible outputs in testing or logging. +func SetDeterministicMaps(enable bool) { + deterministicMaps.Store(enable) +} + +// IsDeterministicMaps returns current map sorting setting. +// Thread-safe via atomic.Load. +// Returns true if deterministic sorting is enabled, false otherwise. +func IsDeterministicMaps() bool { + return deterministicMaps.Load() +} diff --git a/vendor/github.com/olekukonko/cat/concat.go b/vendor/github.com/olekukonko/cat/concat.go new file mode 100644 index 000000000..251c49c73 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/concat.go @@ -0,0 +1,590 @@ +package cat + +import ( + "reflect" + "strings" +) + +// Append appends args to dst and returns the grown slice. +// Callers can reuse dst across calls to amortize allocs. +// It uses an internal Builder for efficient concatenation of the args (no separators), +// then appends the result to the dst byte slice. +// Preallocates based on a size estimate to minimize reallocations. +// Benefits from Builder pooling if enabled. +// Useful for building byte slices incrementally without separators. +func Append(dst []byte, args ...any) []byte { + return AppendWith(empty, dst, args...) +} + +// AppendWith appends args to dst and returns the grown slice. +// Callers can reuse dst across calls to amortize allocs. +// Similar to Append, but inserts the specified sep between each arg. +// Preallocates based on a size estimate including separators. +// Benefits from Builder pooling if enabled. +// Useful for building byte slices incrementally with custom separators. +func AppendWith(sep string, dst []byte, args ...any) []byte { + if len(args) == 0 { + return dst + } + b := New(sep) + b.Grow(estimateWith(sep, args)) + b.Add(args...) + out := b.Output() + return append(dst, out...) +} + +// AppendBytes joins byte slices without separators. +// Only for compatibility with low-level byte processing. +// Directly appends each []byte arg to dst without any conversion or separators. +// Efficient for pure byte concatenation; no allocations if dst has capacity. +// Returns the extended dst slice. +// Does not use Builder, as it's simple append operations. +func AppendBytes(dst []byte, args ...[]byte) []byte { + if len(args) == 0 { + return dst + } + for _, b := range args { + dst = append(dst, b...) + } + return dst +} + +// AppendTo writes arguments to an existing strings.Builder. +// More efficient than creating new builders. +// Appends each arg to the provided strings.Builder using the optimized write function. +// No separators are added; for direct concatenation. +// Useful when you already have a strings.Builder and want to add more values efficiently. +// Does not use cat.Builder, as it appends to an existing strings.Builder. +func AppendTo(b *strings.Builder, args ...any) { + for _, arg := range args { + write(b, arg) + } +} + +// AppendStrings writes strings to an existing strings.Builder. +// Directly writes each string arg to the provided strings.Builder. +// No type checks or conversions; assumes all args are strings. +// Efficient for appending known strings without separators. +// Does not use cat.Builder, as it appends to an existing strings.Builder. +func AppendStrings(b *strings.Builder, ss ...string) { + for _, s := range ss { + b.WriteString(s) + } +} + +// Between concatenates values wrapped between x and y (no separator between args). +// Equivalent to BetweenWith with an empty separator. +func Between(x, y any, args ...any) string { + return BetweenWith(empty, x, y, args...) +} + +// BetweenWith concatenates values wrapped between x and y, using sep between x, args, and y. +// Uses a pooled Builder if enabled; releases it after use. +// Equivalent to With(sep, x, args..., y). +func BetweenWith(sep string, x, y any, args ...any) string { + b := New(sep) + // Estimate size for all parts to avoid re-allocation. + b.Grow(estimate([]any{x, y}) + estimateWith(sep, args)) + + b.Add(x) + b.Add(args...) + b.Add(y) + + return b.Output() +} + +// CSV joins arguments with "," separators (no space). +// Convenience wrapper for With using a comma as separator. +// Useful for simple CSV string generation without spaces. +func CSV(args ...any) string { return With(comma, args...) } + +// Comma joins arguments with ", " separators. +// Convenience wrapper for With using ", " as separator. +// Useful for human-readable lists with comma and space. +func Comma(args ...any) string { return With(comma+space, args...) } + +// Concat concatenates any values (no separators). +// Usage: cat.Concat("a", 1, true) โ†’ "a1true" +// Equivalent to With with an empty separator. +func Concat(args ...any) string { + return With(empty, args...) +} + +// ConcatWith concatenates any values with separator. +// Alias for With; joins args with the provided sep. +func ConcatWith(sep string, args ...any) string { + return With(sep, args...) +} + +// Flatten joins nested values into a single concatenation using empty. +// Convenience for FlattenWith using empty. +func Flatten(args ...any) string { + return FlattenWith(empty, args...) +} + +// FlattenWith joins nested values into a single concatenation with sep, avoiding +// intermediate slice allocations where possible. +// It recursively flattens any nested []any arguments, concatenating all leaf items +// with sep between them. Skips empty nested slices to avoid extra separators. +// Leaf items (non-slices) are converted using the optimized write function. +// Uses a pooled Builder if enabled; releases it after use. +// Preallocates based on a recursive estimate for efficiency. +// Example: FlattenWith(",", 1, []any{2, []any{3,4}}, 5) โ†’ "1,2,3,4,5" +func FlattenWith(sep string, args ...any) string { + if len(args) == 0 { + return empty + } + + // Recursive estimate for preallocation. + totalSize := recursiveEstimate(sep, args) + + b := New(sep) + b.Grow(totalSize) + recursiveAdd(b, args) + return b.Output() +} + +// Group joins multiple groups with empty between groups (no intra-group separators). +// Convenience for GroupWith using empty. +func Group(groups ...[]any) string { + return GroupWith(empty, groups...) +} + +// GroupWith joins multiple groups with a separator between groups (no intra-group separators). +// Concatenates each group internally without separators, then joins non-empty groups with sep. +// Preestimates total size for allocation; uses pooled Builder if enabled. +// Optimized for single group: direct Concat. +// Useful for grouping related items with inter-group separation. +func GroupWith(sep string, groups ...[]any) string { + if len(groups) == 0 { + return empty + } + if len(groups) == 1 { + return Concat(groups[0]...) + } + + total := 0 + nonEmpty := 0 + for _, g := range groups { + if len(g) == 0 { + continue + } + if nonEmpty > 0 { + total += len(sep) + } + total += estimate(g) + nonEmpty++ + } + + b := New(empty) + b.Grow(total) + first := true + for _, g := range groups { + if len(g) == 0 { + continue + } + if !first && sep != empty { + b.buf.WriteString(sep) + } + first = false + for _, a := range g { + write(&b.buf, a) + } + } + return b.Output() +} + +// Indent prefixes the concatenation of args with depth levels of two spaces per level. +// Example: Indent(2, "hello") => " hello" +// If depth <= 0, equivalent to Concat(args...). +// Uses " " repeated depth times as prefix, followed by concatenated args (no separators). +// Benefits from pooling via Concat. +func Indent(depth int, args ...any) string { + if depth <= 0 { + return Concat(args...) + } + prefix := strings.Repeat(" ", depth) + return Prefix(prefix, args...) +} + +// Join joins strings (matches stdlib strings.Join behavior). +// Usage: cat.Join("a", "b") โ†’ "a b" (using empty) +// Joins the variadic string args with the current empty. +// Useful for compatibility with stdlib but using package default sep. +func Join(elems ...string) string { + return strings.Join(elems, empty) +} + +// JoinWith joins strings with separator (variadic version). +// Directly uses strings.Join on the variadic string args with sep. +// Efficient for known strings; no conversions needed. +func JoinWith(sep string, elems ...string) string { + return strings.Join(elems, sep) +} + +// Lines joins arguments with newline separators. +// Convenience for With using "\n" as separator. +// Useful for building multi-line strings. +func Lines(args ...any) string { return With(newline, args...) } + +// Number concatenates numeric values without separators. +// Generic over Numeric types. +// Equivalent to NumberWith with empty sep. +func Number[T Numeric](a ...T) string { + return NumberWith(empty, a...) +} + +// NumberWith concatenates numeric values with the provided separator. +// Generic over Numeric types. +// If no args, returns empty string. +// Uses pooled Builder if enabled, with rough growth estimate (8 bytes per item). +// Relies on valueToString for numeric conversion. +func NumberWith[T Numeric](sep string, a ...T) string { + if len(a) == 0 { + return empty + } + + b := New(sep) + b.Grow(len(a) * 8) + for _, v := range a { + b.Add(v) + } + return b.Output() +} + +// Path joins arguments with "/" separators. +// Convenience for With using "/" as separator. +// Useful for building file paths or URLs. +func Path(args ...any) string { return With(slash, args...) } + +// Prefix concatenates with a prefix (no separator). +// Equivalent to PrefixWith with empty sep. +func Prefix(p any, args ...any) string { + return PrefixWith(empty, p, args...) +} + +// PrefixWith concatenates with a prefix and separator. +// Adds p, then sep (if args present and sep not empty), then joins args with sep. +// Uses pooled Builder if enabled. +func PrefixWith(sep string, p any, args ...any) string { + b := New(sep) + b.Grow(estimateWith(sep, args) + estimate([]any{p})) + b.Add(p) + b.Add(args...) + return b.Output() +} + +// PrefixEach applies the same prefix to each argument and joins the pairs with sep. +// Example: PrefixEach("pre-", ",", "a","b") => "pre-a,pre-b" +// Preestimates size including prefixes and seps. +// Uses pooled Builder if enabled; manually adds sep between pairs, no sep between p and a. +// Returns empty if no args. +func PrefixEach(p any, sep string, args ...any) string { + if len(args) == 0 { + return empty + } + pSize := estimate([]any{p}) + total := len(sep)*(len(args)-1) + estimate(args) + pSize*len(args) + + b := New(empty) + b.Grow(total) + for i, a := range args { + if i > 0 && sep != empty { + b.buf.WriteString(sep) + } + write(&b.buf, p) + write(&b.buf, a) + } + return b.Output() +} + +// Pair joins exactly two values (no separator). +// Equivalent to PairWith with empty sep. +func Pair(a, b any) string { + return PairWith(empty, a, b) +} + +// PairWith joins exactly two values with a separator. +// Optimized for two args: uses With(sep, a, b). +func PairWith(sep string, a, b any) string { + return With(sep, a, b) +} + +// Quote wraps each argument in double quotes, separated by spaces. +// Equivalent to QuoteWith with '"' as quote. +func Quote(args ...any) string { + return QuoteWith('"', args...) +} + +// QuoteWith wraps each argument with the specified quote byte, separated by spaces. +// Wraps each arg with quote, writes arg, closes with quote; joins with space. +// Preestimates with quotes and spaces. +// Uses pooled Builder if enabled. +func QuoteWith(quote byte, args ...any) string { + if len(args) == 0 { + return empty + } + total := estimate(args) + 2*len(args) + len(space)*(len(args)-1) + + b := New(empty) + b.Grow(total) + need := false + for _, a := range args { + if need { + b.buf.WriteString(space) + } + b.buf.WriteByte(quote) + write(&b.buf, a) + b.buf.WriteByte(quote) + need = true + } + return b.Output() +} + +// Repeat concatenates val n times (no sep between instances). +// Equivalent to RepeatWith with empty sep. +func Repeat(val any, n int) string { + return RepeatWith(empty, val, n) +} + +// RepeatWith concatenates val n times with sep between each instance. +// If n <= 0, returns an empty string. +// Optimized to make exactly one allocation; converts val once. +// Uses pooled Builder if enabled. +func RepeatWith(sep string, val any, n int) string { + if n <= 0 { + return empty + } + if n == 1 { + return valueToString(val) + } + b := New(sep) + b.Grow(n*estimate([]any{val}) + (n-1)*len(sep)) + for i := 0; i < n; i++ { + b.Add(val) + } + return b.Output() +} + +// Reflect converts a reflect.Value to its string representation. +// It handles all kinds of reflected values including primitives, structs, slices, maps, etc. +// For nil values, it returns the nilString constant (""). +// For unexported or inaccessible fields, it returns unexportedString (""). +// The output follows Go's syntax conventions where applicable (e.g., slices as [a, b], maps as {k:v}). +func Reflect(r reflect.Value) string { + if !r.IsValid() { + return nilString + } + + var b strings.Builder + writeReflect(&b, r.Interface(), 0) + return b.String() +} + +// Space concatenates arguments with space separators. +// Convenience for With using " " as separator. +func Space(args ...any) string { return With(space, args...) } + +// Dot concatenates arguments with dot separators. +// Convenience for With using " " as separator. +func Dot(args ...any) string { return With(dot, args...) } + +// Suffix concatenates with a suffix (no separator). +// Equivalent to SuffixWith with empty sep. +func Suffix(s any, args ...any) string { + return SuffixWith(empty, s, args...) +} + +// SuffixWith concatenates with a suffix and separator. +// Joins args with sep, then adds sep (if args present and sep not empty), then s. +// Uses pooled Builder if enabled. +func SuffixWith(sep string, s any, args ...any) string { + b := New(sep) + b.Grow(estimateWith(sep, args) + estimate([]any{s})) + b.Add(args...) + b.Add(s) + return b.Output() +} + +// SuffixEach applies the same suffix to each argument and joins the pairs with sep. +// Example: SuffixEach("-suf", " | ", "a","b") => "a-suf | b-suf" +// Preestimates size including suffixes and seps. +// Uses pooled Builder if enabled; manually adds sep between pairs, no sep between a and s. +// Returns empty if no args. +func SuffixEach(s any, sep string, args ...any) string { + if len(args) == 0 { + return empty + } + sSize := estimate([]any{s}) + total := len(sep)*(len(args)-1) + estimate(args) + sSize*len(args) + + b := New(empty) + b.Grow(total) + for i, a := range args { + if i > 0 && sep != empty { + b.buf.WriteString(sep) + } + write(&b.buf, a) + write(&b.buf, s) + } + return b.Output() +} + +// Sprint concatenates any values (no separators). +// Usage: Sprint("a", 1, true) โ†’ "a1true" +// Equivalent to Concat or With with an empty separator. +func Sprint(args ...any) string { + if len(args) == 0 { + return empty + } + if len(args) == 1 { + return valueToString(args[0]) + } + + // For multiple args, use the existing Concat functionality + return Concat(args...) +} + +// Trio joins exactly three values (no separator). +// Equivalent to TrioWith with empty sep +func Trio(a, b, c any) string { + return TrioWith(empty, a, b, c) +} + +// TrioWith joins exactly three values with a separator. +// Optimized for three args: uses With(sep, a, b, c). +func TrioWith(sep string, a, b, c any) string { + return With(sep, a, b, c) +} + +// With concatenates arguments with the specified separator. +// Core concatenation function with sep. +// Optimized for zero or one arg: empty or direct valueToString. +// Fast path for all strings: exact preallocation, direct writes via raw strings.Builder (minimal branches/allocs). +// Fallback: pooled Builder with estimateWith, adds args with sep. +// Benefits from pooling if enabled for mixed types. +func With(sep string, args ...any) string { + switch len(args) { + case 0: + return empty + case 1: + return valueToString(args[0]) + } + + // Fast path for all strings: use raw strings.Builder for speed, no pooling needed. + allStrings := true + totalLen := len(sep) * (len(args) - 1) + for _, a := range args { + if s, ok := a.(string); ok { + totalLen += len(s) + } else { + allStrings = false + break + } + } + + if allStrings { + var b strings.Builder + b.Grow(totalLen) + b.WriteString(args[0].(string)) + for i := 1; i < len(args); i++ { + if sep != empty { + b.WriteString(sep) + } + b.WriteString(args[i].(string)) + } + return b.String() + } + + // Fallback for mixed types: use pooled Builder. + b := New(sep) + b.Grow(estimateWith(sep, args)) + b.Add(args...) + return b.Output() +} + +// Wrap encloses concatenated args between before and after strings (no inner separator). +// Equivalent to Concat(before, args..., after). +func Wrap(before, after string, args ...any) string { + b := Start() + b.Grow(len(before) + len(after) + estimate(args)) + + b.Add(before) + b.Add(args...) + b.Add(after) + + return b.Output() +} + +// WrapEach wraps each argument individually with before/after, concatenated without separators. +// Applies before + arg + after to each arg. +// Preestimates size; uses pooled Builder if enabled. +// Returns empty if no args. +// Useful for wrapping multiple items identically without joins. +func WrapEach(before, after string, args ...any) string { + if len(args) == 0 { + return empty + } + total := (len(before)+len(after))*len(args) + estimate(args) + + b := Start() // Use pooled builder, but we will write manually. + b.Grow(total) + for _, a := range args { + write(&b.buf, before) + write(&b.buf, a) + write(&b.buf, after) + } + // No separators were ever added, so this is safe. + b.needsSep = true // Correctly set state in case of reuse. + return b.Output() +} + +// WrapWith encloses concatenated args between before and after strings, +// joining the arguments with the provided separator. +// If no args, returns before + after. +// Builds inner with With(sep, args...), then Concat(before, inner, after). +// Benefits from pooling via With and Concat. +func WrapWith(sep, before, after string, args ...any) string { + if len(args) == 0 { + return before + after + } + // First, efficiently build the inner part. + inner := With(sep, args...) + + // Then, wrap it without allocating another slice. + b := Start() + b.Grow(len(before) + len(inner) + len(after)) + + b.Add(before) + b.Add(inner) + b.Add(after) + + return b.Output() +} + +// Pad surrounds a string with spaces on both sides. +// Ensures proper spacing for SQL operators like "=", "AND", etc. +// Example: Pad("=") returns " = " for cleaner formatting. +func Pad(s string) string { + return Concat(space, s, space) +} + +// PadWith adds a separator before the string and a space after it. +// Useful for formatting SQL parts with custom leading separators. +// Example: PadWith(",", "column") returns ",column ". +func PadWith(sep, s string) string { + return Concat(sep, s, space) +} + +// Parens wraps content in parentheses +// Useful for grouping SQL conditions or expressions +// Example: Parens("a = b AND c = d") โ†’ "(a = b AND c = d)" +func Parens(content string) string { + return Concat(parenOpen, content, parenClose) +} + +// ParensWith wraps multiple arguments in parentheses with a separator +// Example: ParensWith(" AND ", "a = b", "c = d") โ†’ "(a = b AND c = d)" +func ParensWith(sep string, args ...any) string { + return Concat(parenOpen, With(sep, args...), parenClose) +} diff --git a/vendor/github.com/olekukonko/cat/fn.go b/vendor/github.com/olekukonko/cat/fn.go new file mode 100644 index 000000000..b4f5fc878 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/fn.go @@ -0,0 +1,376 @@ +package cat + +import ( + "fmt" + "reflect" + "sort" + "strconv" + "strings" + "unsafe" +) + +// write writes a value to the given strings.Builder using fast paths to avoid temporary allocations. +// It handles common types like strings, byte slices, integers, floats, and booleans directly for efficiency. +// For other types, it falls back to fmt.Fprint, which may involve allocations. +// This function is optimized for performance in string concatenation scenarios, prioritizing +// common cases like strings and numbers at the top of the type switch for compiler optimization. +// Note: For integers and floats, it uses stack-allocated buffers and strconv.Append* functions to +// convert numbers to strings without heap allocations. +func write(b *strings.Builder, arg any) { + writeValue(b, arg, 0) +} + +// writeValue appends the string representation of arg to b, handling recursion with a depth limit. +// It serves as a recursive helper for write, directly handling primitives and delegating complex +// types to writeReflect. The depth parameter prevents excessive recursion in deeply nested structures. +func writeValue(b *strings.Builder, arg any, depth int) { + // Handle recursion depth limit + if depth > maxRecursionDepth { + b.WriteString("...") + return + } + + // Handle nil values + if arg == nil { + b.WriteString(nilString) + return + } + + // Fast path type switch for all primitive types + switch v := arg.(type) { + case string: + b.WriteString(v) + case []byte: + b.WriteString(bytesToString(v)) + case int: + var buf [20]byte + b.Write(strconv.AppendInt(buf[:0], int64(v), 10)) + case int64: + var buf [20]byte + b.Write(strconv.AppendInt(buf[:0], v, 10)) + case int32: + var buf [11]byte + b.Write(strconv.AppendInt(buf[:0], int64(v), 10)) + case int16: + var buf [6]byte + b.Write(strconv.AppendInt(buf[:0], int64(v), 10)) + case int8: + var buf [4]byte + b.Write(strconv.AppendInt(buf[:0], int64(v), 10)) + case uint: + var buf [20]byte + b.Write(strconv.AppendUint(buf[:0], uint64(v), 10)) + case uint64: + var buf [20]byte + b.Write(strconv.AppendUint(buf[:0], v, 10)) + case uint32: + var buf [10]byte + b.Write(strconv.AppendUint(buf[:0], uint64(v), 10)) + case uint16: + var buf [5]byte + b.Write(strconv.AppendUint(buf[:0], uint64(v), 10)) + case uint8: + var buf [3]byte + b.Write(strconv.AppendUint(buf[:0], uint64(v), 10)) + case float64: + var buf [24]byte + b.Write(strconv.AppendFloat(buf[:0], v, 'f', -1, 64)) + case float32: + var buf [24]byte + b.Write(strconv.AppendFloat(buf[:0], float64(v), 'f', -1, 32)) + case bool: + if v { + b.WriteString("true") + } else { + b.WriteString("false") + } + case fmt.Stringer: + b.WriteString(v.String()) + case error: + b.WriteString(v.Error()) + default: + // Fallback to reflection-based handling + writeReflect(b, arg, depth) + } +} + +// writeReflect handles all complex types safely. +func writeReflect(b *strings.Builder, arg any, depth int) { + defer func() { + if r := recover(); r != nil { + b.WriteString("[!reflect panic!]") + } + }() + + val := reflect.ValueOf(arg) + if val.Kind() == reflect.Ptr { + if val.IsNil() { + b.WriteString(nilString) + return + } + val = val.Elem() + } + + switch val.Kind() { + case reflect.Slice, reflect.Array: + b.WriteByte('[') + for i := 0; i < val.Len(); i++ { + if i > 0 { + b.WriteString(", ") // Use comma-space for readability + } + writeValue(b, val.Index(i).Interface(), depth+1) + } + b.WriteByte(']') + + case reflect.Struct: + typ := val.Type() + b.WriteByte('{') // Use {} for structs to follow Go convention + first := true + for i := 0; i < val.NumField(); i++ { + fieldValue := val.Field(i) + if !fieldValue.CanInterface() { + continue // Skip unexported fields + } + if !first { + b.WriteByte(' ') // Use space as separator + } + first = false + b.WriteString(typ.Field(i).Name) + b.WriteByte(':') + + writeValue(b, fieldValue.Interface(), depth+1) + } + b.WriteByte('}') + + case reflect.Map: + b.WriteByte('{') + keys := val.MapKeys() + sort.Slice(keys, func(i, j int) bool { + // A simple string-based sort for keys + return fmt.Sprint(keys[i].Interface()) < fmt.Sprint(keys[j].Interface()) + }) + for i, key := range keys { + if i > 0 { + b.WriteByte(' ') // Use space as separator + } + writeValue(b, key.Interface(), depth+1) + b.WriteByte(':') + writeValue(b, val.MapIndex(key).Interface(), depth+1) + } + b.WriteByte('}') + + case reflect.Interface: + if val.IsNil() { + b.WriteString(nilString) + return + } + writeValue(b, val.Elem().Interface(), depth+1) + + default: + fmt.Fprint(b, arg) + } +} + +// valueToString converts any value to a string representation. +// It uses optimized paths for common types to avoid unnecessary allocations. +// For types like integers and floats, it directly uses strconv functions. +// This function is useful for single-argument conversions or as a helper in other parts of the package. +// Unlike write, it returns a string instead of appending to a builder. +func valueToString(arg any) string { + switch v := arg.(type) { + case string: + return v + case []byte: + return bytesToString(v) + case int: + return strconv.Itoa(v) + case int64: + return strconv.FormatInt(v, 10) + case int32: + return strconv.FormatInt(int64(v), 10) + case uint: + return strconv.FormatUint(uint64(v), 10) + case uint64: + return strconv.FormatUint(v, 10) + case float64: + return strconv.FormatFloat(v, 'f', -1, 64) + case bool: + if v { + return "true" + } + return "false" + case fmt.Stringer: + return v.String() + case error: + return v.Error() + default: + return fmt.Sprint(v) + } +} + +// estimateWith calculates a conservative estimate of the total string length when concatenating +// the given arguments with a separator. This is used for preallocating capacity in strings.Builder +// to minimize reallocations during building. +// It accounts for the length of separators and estimates the length of each argument based on its type. +// If no arguments are provided, it returns 0. +func estimateWith(sep string, args []any) int { + if len(args) == 0 { + return 0 + } + size := len(sep) * (len(args) - 1) + size += estimate(args) + return size +} + +// estimate calculates a conservative estimate of the combined string length of the given arguments. +// It iterates over each argument and adds an estimated length based on its type: +// - Strings and byte slices: exact length. +// - Numbers: calculated digit count using numLen or uNumLen. +// - Floats and others: fixed conservative estimates (e.g., 16 or 24 bytes). +// This helper is used internally by estimateWith and focuses solely on the arguments without separators. +func estimate(args []any) int { + var size int + for _, a := range args { + switch v := a.(type) { + case string: + size += len(v) + case []byte: + size += len(v) + case int: + size += numLen(int64(v)) + case int8: + size += numLen(int64(v)) + case int16: + size += numLen(int64(v)) + case int32: + size += numLen(int64(v)) + case int64: + size += numLen(v) + case uint: + size += uNumLen(uint64(v)) + case uint8: + size += uNumLen(uint64(v)) + case uint16: + size += uNumLen(uint64(v)) + case uint32: + size += uNumLen(uint64(v)) + case uint64: + size += uNumLen(v) + case float32: + size += 16 + case float64: + size += 24 + case bool: + size += 5 // "false" + case fmt.Stringer, error: + size += 16 // conservative + default: + size += 16 // conservative + } + } + return size +} + +// numLen returns the number of characters required to represent the signed integer n as a string. +// It handles negative numbers by adding 1 for the '-' sign and uses a loop to count digits. +// Special handling for math.MinInt64 to avoid overflow when negating. +// Returns 1 for 0, and up to 20 for the largest values. +func numLen(n int64) int { + if n == 0 { + return 1 + } + c := 0 + if n < 0 { + c = 1 // for '-' + // NOTE: math.MinInt64 negated overflows; handle by adding one digit and returning 20. + if n == -1<<63 { + return 20 + } + n = -n + } + for n > 0 { + n /= 10 + c++ + } + return c +} + +// uNumLen returns the number of characters required to represent the unsigned integer n as a string. +// It uses a loop to count digits. +// Returns 1 for 0, and up to 20 for the largest uint64 values. +func uNumLen(n uint64) int { + if n == 0 { + return 1 + } + c := 0 + for n > 0 { + n /= 10 + c++ + } + return c +} + +// bytesToString converts a byte slice to a string efficiently. +// If the package's UnsafeBytes flag is set (via IsUnsafeBytes()), it uses unsafe operations +// to create a string backed by the same memory as the byte slice, avoiding a copy. +// This is zero-allocation when unsafe is enabled. +// Falls back to standard string(bts) conversion otherwise. +// For empty slices, it returns a constant empty string. +// Compatible with Go 1.20+ unsafe functions like unsafe.String and unsafe.SliceData. +func bytesToString(bts []byte) string { + if len(bts) == 0 { + return empty + } + if IsUnsafeBytes() { + // Go 1.20+: unsafe.String with SliceData (1.20 introduced, 1.22 added SliceData). + return unsafe.String(unsafe.SliceData(bts), len(bts)) + } + return string(bts) +} + +// recursiveEstimate calculates the estimated string length for potentially nested arguments, +// including the lengths of separators between elements. It recurses on nested []any slices, +// flattening the structure while accounting for separators only between non-empty subparts. +// This function is useful for preallocating capacity in builders for nested concatenation operations. +func recursiveEstimate(sep string, args []any) int { + if len(args) == 0 { + return 0 + } + size := 0 + needsSep := false + for _, a := range args { + switch v := a.(type) { + case []any: + subSize := recursiveEstimate(sep, v) + if subSize > 0 { + if needsSep { + size += len(sep) + } + size += subSize + needsSep = true + } + default: + if needsSep { + size += len(sep) + } + size += estimate([]any{a}) + needsSep = true + } + } + return size +} + +// recursiveAdd appends the string representations of potentially nested arguments to the builder. +// It recurses on nested []any slices, effectively flattening the structure by adding leaf values +// directly via b.Add without inserting separators (separators are handled externally if needed). +// This function is designed for efficient concatenation of nested argument lists. +func recursiveAdd(b *Builder, args []any) { + for _, a := range args { + switch v := a.(type) { + case []any: + recursiveAdd(b, v) + default: + b.Add(a) + } + } +} diff --git a/vendor/github.com/olekukonko/cat/sql.go b/vendor/github.com/olekukonko/cat/sql.go new file mode 100644 index 000000000..baa3e68c5 --- /dev/null +++ b/vendor/github.com/olekukonko/cat/sql.go @@ -0,0 +1,161 @@ +package cat + +// On builds a SQL ON clause comparing two columns across tables. +// Formats as: "table1.column1 = table2.column2" with proper spacing. +// Useful in JOIN conditions to match keys between tables. +func On(table1, column1, table2, column2 string) string { + return With(space, + With(dot, table1, column1), + Pad(equal), + With(dot, table2, column2), + ) +} + +// Using builds a SQL condition comparing two aliased columns. +// Formats as: "alias1.column1 = alias2.column2" for JOINs or filters. +// Helps when working with table aliases in complex queries. +func Using(alias1, column1, alias2, column2 string) string { + return With(space, + With(dot, alias1, column1), + Pad(equal), + With(dot, alias2, column2), + ) +} + +// And joins multiple SQL conditions with the AND operator. +// Adds spacing to ensure clean SQL output (e.g., "cond1 AND cond2"). +// Accepts variadic arguments for flexible condition chaining. +func And(conditions ...any) string { + return With(Pad(and), conditions...) +} + +// In creates a SQL IN clause with properly quoted values +// Example: In("status", "active", "pending") โ†’ "status IN ('active', 'pending')" +// Handles value quoting and comma separation automatically +func In(column string, values ...string) string { + if len(values) == 0 { + return Concat(column, inOpen, inClose) + } + + quotedValues := make([]string, len(values)) + for i, v := range values { + quotedValues[i] = "'" + v + "'" + } + return Concat(column, inOpen, JoinWith(comma+space, quotedValues...), inClose) +} + +// As creates an aliased SQL expression +// Example: As("COUNT(*)", "total_count") โ†’ "COUNT(*) AS total_count" +func As(expression, alias string) string { + return Concat(expression, asSQL, alias) +} + +// Count creates a COUNT expression with optional alias +// Example: Count("id") โ†’ "COUNT(id)" +// Example: Count("id", "total") โ†’ "COUNT(id) AS total" +// Example: Count("DISTINCT user_id", "unique_users") โ†’ "COUNT(DISTINCT user_id) AS unique_users" +func Count(column string, alias ...string) string { + expression := Concat(count, column, parenClose) + if len(alias) == 0 { + return expression + } + return As(expression, alias[0]) +} + +// CountAll creates COUNT(*) with optional alias +// Example: CountAll() โ†’ "COUNT(*)" +// Example: CountAll("total") โ†’ "COUNT(*) AS total" +func CountAll(alias ...string) string { + if len(alias) == 0 { + return countAll + } + return As(countAll, alias[0]) +} + +// Sum creates a SUM expression with optional alias +// Example: Sum("amount") โ†’ "SUM(amount)" +// Example: Sum("amount", "total") โ†’ "SUM(amount) AS total" +func Sum(column string, alias ...string) string { + expression := Concat(sum, column, parenClose) + if len(alias) == 0 { + return expression + } + return As(expression, alias[0]) +} + +// Avg creates an AVG expression with optional alias +// Example: Avg("score") โ†’ "AVG(score)" +// Example: Avg("score", "average") โ†’ "AVG(score) AS average" +func Avg(column string, alias ...string) string { + expression := Concat(avg, column, parenClose) + if len(alias) == 0 { + return expression + } + return As(expression, alias[0]) +} + +// Max creates a MAX expression with optional alias +// Example: Max("price") โ†’ "MAX(price)" +// Example: Max("price", "max_price") โ†’ "MAX(price) AS max_price" +func Max(column string, alias ...string) string { + expression := Concat(maxOpen, column, parenClose) + if len(alias) == 0 { + return expression + } + return As(expression, alias[0]) +} + +// Min creates a MIN expression with optional alias +// Example: Min("price") โ†’ "MIN(price)" +// Example: Min("price", "min_price") โ†’ "MIN(price) AS min_price" +func Min(column string, alias ...string) string { + expression := Concat(minOpen, column, parenClose) + if len(alias) == 0 { + return expression + } + return As(expression, alias[0]) +} + +// Case creates a SQL CASE expression with optional alias +// Example: Case("WHEN status = 'active' THEN 1 ELSE 0 END", "is_active") โ†’ "CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active" +func Case(expression string, alias ...string) string { + caseExpr := Concat(caseSQL, expression) + if len(alias) == 0 { + return caseExpr + } + return As(caseExpr, alias[0]) +} + +// CaseWhen creates a complete SQL CASE expression from individual parts with proper value handling +// Example: CaseWhen("status =", "'active'", "1", "0", "is_active") โ†’ "CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active" +// Example: CaseWhen("age >", "18", "'adult'", "'minor'", "age_group") โ†’ "CASE WHEN age > 18 THEN 'adult' ELSE 'minor' END AS age_group" +func CaseWhen(conditionPart string, conditionValue, thenValue, elseValue any, alias ...string) string { + condition := Concat(conditionPart, valueToString(conditionValue)) + expression := Concat( + when, condition, then, valueToString(thenValue), elseSQL, valueToString(elseValue), end, + ) + return Case(expression, alias...) +} + +// CaseWhenMulti creates a SQL CASE expression with multiple WHEN clauses +// Example: CaseWhenMulti([]string{"status =", "age >"}, []any{"'active'", 18}, []any{1, "'adult'"}, 0, "result") โ†’ "CASE WHEN status = 'active' THEN 1 WHEN age > 18 THEN 'adult' ELSE 0 END AS result" +func CaseWhenMulti(conditionParts []string, conditionValues, thenValues []any, elseValue any, alias ...string) string { + if len(conditionParts) != len(conditionValues) || len(conditionParts) != len(thenValues) { + return "" // or handle error + } + + var whenClauses []string + for i := 0; i < len(conditionParts); i++ { + condition := Concat(conditionParts[i], valueToString(conditionValues[i])) + whenClause := Concat(when, condition, then, valueToString(thenValues[i])) + whenClauses = append(whenClauses, whenClause) + } + + expression := Concat( + JoinWith(space, whenClauses...), + elseSQL, + valueToString(elseValue), + end, + ) + return Case(expression, alias...) +} diff --git a/vendor/github.com/olekukonko/ll/README.md b/vendor/github.com/olekukonko/ll/README.md index c9a020592..facb4736c 100644 --- a/vendor/github.com/olekukonko/ll/README.md +++ b/vendor/github.com/olekukonko/ll/README.md @@ -222,6 +222,13 @@ logger.Info("Slog log") // Output: level=INFO msg="Slog log" namespace=app class ll.Stack("Critical error") // Output: [app] ERROR: Critical error [stack=...] (see example/stack.png) ``` +4**General Output** + Logs a output in structured way for inspection of public & private values. + ```go + ll.Handler(lh.NewColorizedHandler(os.Stdout)) + ll.Output(&SomeStructWithPrivateValues{}) + ``` + #### Performance Tracking Measure execution time for performance analysis. ```go diff --git a/vendor/github.com/olekukonko/ll/concat.go b/vendor/github.com/olekukonko/ll/concat.go deleted file mode 100644 index 4bfb22e1f..000000000 --- a/vendor/github.com/olekukonko/ll/concat.go +++ /dev/null @@ -1,421 +0,0 @@ -package ll - -import ( - "fmt" - "github.com/olekukonko/ll/lx" - "reflect" - "strconv" - "strings" - "unsafe" -) - -const ( - maxRecursionDepth = 20 // Maximum depth for recursive type handling to prevent stack overflow - nilString = "" // String representation for nil values - unexportedString = "" // String representation for unexported fields -) - -// Concat efficiently concatenates values without a separator using the default logger. -// It converts each argument to a string and joins them directly, optimizing for performance -// in logging scenarios. Thread-safe as it does not modify shared state. -// Example: -// -// msg := ll.Concat("Hello", 42, true) // Returns "Hello42true" -func Concat(args ...any) string { - return concat(args...) -} - -// ConcatSpaced concatenates values with a space separator using the default logger. -// It converts each argument to a string and joins them with spaces, suitable for log message -// formatting. Thread-safe as it does not modify shared state. -// Example: -// -// msg := ll.ConcatSpaced("Hello", 42, true) // Returns "Hello 42 true" -func ConcatSpaced(args ...any) string { - return concatSpaced(args...) -} - -// ConcatAll concatenates elements with a separator, prefix, and suffix using the default logger. -// It combines before, main, and after arguments with the specified separator, optimizing memory -// allocation for logging. Thread-safe as it does not modify shared state. -// Example: -// -// msg := ll.ConcatAll(",", []any{"prefix"}, []any{"suffix"}, "main") -// // Returns "prefix,main,suffix" -func ConcatAll(sep string, before, after []any, args ...any) string { - return concatenate(sep, before, after, args...) -} - -// concat efficiently concatenates values without a separator. -// It converts each argument to a string and joins them directly, optimizing for performance -// in logging scenarios. Used internally by Concat and other logging functions. -// Example: -// -// msg := concat("Hello", 42, true) // Returns "Hello42true" -func concat(args ...any) string { - return concatWith("", args...) -} - -// concatSpaced concatenates values with a space separator. -// It converts each argument to a string and joins them with spaces, suitable for formatting -// log messages. Used internally by ConcatSpaced. -// Example: -// -// msg := concatSpaced("Hello", 42, true) // Returns "Hello 42 true" -func concatSpaced(args ...any) string { - return concatWith(lx.Space, args...) -} - -// concatWith concatenates values with a specified separator using optimized type handling. -// It builds a string from arguments, handling various types efficiently (strings, numbers, -// structs, etc.), and is used by concat and concatSpaced for log message construction. -// Thread-safe as it does not modify shared state. -// Example: -// -// msg := concatWith(",", "Hello", 42, true) // Returns "Hello,42,true" -func concatWith(sep string, args ...any) string { - switch len(args) { - case 0: - return "" - case 1: - return concatToString(args[0]) - } - - var b strings.Builder - b.Grow(concatEstimateArgs(sep, args)) - - for i, arg := range args { - if i > 0 { - b.WriteString(sep) - } - concatWriteValue(&b, arg, 0) - } - - return b.String() -} - -// concatenate concatenates elements with separators, prefixes, and suffixes efficiently. -// It combines before, main, and after arguments with the specified separator, optimizing -// memory allocation for complex log message formatting. Used internally by ConcatAll. -// Example: -// -// msg := concatenate(",", []any{"prefix"}, []any{"suffix"}, "main") -// // Returns "prefix,main,suffix" -func concatenate(sep string, before []any, after []any, args ...any) string { - totalLen := len(before) + len(after) + len(args) - switch totalLen { - case 0: - return "" - case 1: - switch { - case len(before) > 0: - return concatToString(before[0]) - case len(args) > 0: - return concatToString(args[0]) - default: - return concatToString(after[0]) - } - } - - var b strings.Builder - b.Grow(concatEstimateTotal(sep, before, after, args)) - - // Write before elements - concatWriteGroup(&b, sep, before) - - // Write main arguments - if len(before) > 0 && len(args) > 0 { - b.WriteString(sep) - } - concatWriteGroup(&b, sep, args) - - // Write after elements - if len(after) > 0 && (len(before) > 0 || len(args) > 0) { - b.WriteString(sep) - } - concatWriteGroup(&b, sep, after) - - return b.String() -} - -// concatWriteGroup writes a group of arguments to a strings.Builder with a separator. -// It handles each argument by converting it to a string, used internally by concatenate -// to process before, main, or after groups in log message construction. -// Example: -// -// var b strings.Builder -// concatWriteGroup(&b, ",", []any{"a", 42}) // Writes "a,42" to b -func concatWriteGroup(b *strings.Builder, sep string, group []any) { - for i, arg := range group { - if i > 0 { - b.WriteString(sep) - } - concatWriteValue(b, arg, 0) - } -} - -// concatToString converts a single argument to a string efficiently. -// It handles common types (string, []byte, fmt.Stringer) with minimal overhead and falls -// back to fmt.Sprint for other types. Used internally by concat and concatenate. -// Example: -// -// s := concatToString("Hello") // Returns "Hello" -// s := concatToString([]byte{65, 66}) // Returns "AB" -func concatToString(arg any) string { - switch v := arg.(type) { - case string: - return v - case []byte: - return *(*string)(unsafe.Pointer(&v)) - case fmt.Stringer: - return v.String() - case error: - return v.Error() - default: - return fmt.Sprint(v) - } -} - -// concatEstimateTotal estimates the total string length for concatenate. -// It calculates the expected size of the concatenated string, including before, main, and -// after arguments with separators, to preallocate the strings.Builder capacity. -// Example: -// -// size := concatEstimateTotal(",", []any{"prefix"}, []any{"suffix"}, "main") -// // Returns estimated length for "prefix,main,suffix" -func concatEstimateTotal(sep string, before, after, args []any) int { - size := 0 - if len(before) > 0 { - size += concatEstimateArgs(sep, before) - } - if len(args) > 0 { - if size > 0 { - size += len(sep) - } - size += concatEstimateArgs(sep, args) - } - if len(after) > 0 { - if size > 0 { - size += len(sep) - } - size += concatEstimateArgs(sep, after) - } - return size -} - -// concatEstimateArgs estimates the string length for a group of arguments. -// It sums the estimated sizes of each argument plus separators, used by concatEstimateTotal -// and concatWith to optimize memory allocation for log message construction. -// Example: -// -// size := concatEstimateArgs(",", []any{"hello", 42}) // Returns estimated length for "hello,42" -func concatEstimateArgs(sep string, args []any) int { - if len(args) == 0 { - return 0 - } - size := len(sep) * (len(args) - 1) - for _, arg := range args { - size += concatEstimateSize(arg) - } - return size -} - -// concatEstimateSize estimates the string length for a single argument. -// It provides size estimates for various types (strings, numbers, booleans, etc.) to -// optimize strings.Builder capacity allocation in logging functions. -// Example: -// -// size := concatEstimateSize("hello") // Returns 5 -// size := concatEstimateSize(42) // Returns ~2 -func concatEstimateSize(arg any) int { - switch v := arg.(type) { - case string: - return len(v) - case []byte: - return len(v) - case int: - return concatNumLen(int64(v)) - case int64: - return concatNumLen(v) - case int32: - return concatNumLen(int64(v)) - case int16: - return concatNumLen(int64(v)) - case int8: - return concatNumLen(int64(v)) - case uint: - return concatNumLen(uint64(v)) - case uint64: - return concatNumLen(v) - case uint32: - return concatNumLen(uint64(v)) - case uint16: - return concatNumLen(uint64(v)) - case uint8: - return concatNumLen(uint64(v)) - case float64: - return 24 // Max digits for float64 - case float32: - return 16 // Max digits for float32 - case bool: - if v { - return 4 // "true" - } - return 5 // "false" - case fmt.Stringer: - return 16 // Conservative estimate - default: - return 16 // Default estimate - } -} - -// concatNumLen estimates the string length for a signed or unsigned integer. -// It returns a conservative estimate (20 digits) for int64 or uint64 values, including -// a sign for negative numbers, used by concatEstimateSize for memory allocation. -// Example: -// -// size := concatNumLen(int64(-123)) // Returns 20 -// size := concatNumLen(uint64(123)) // Returns 20 -func concatNumLen[T int64 | uint64](v T) int { - if v < 0 { - return 20 // Max digits for int64 + sign - } - return 20 // Max digits for uint64 -} - -// concatWriteValue writes a formatted value to a strings.Builder with recursion depth tracking. -// It handles various types (strings, numbers, structs, slices, etc.) and prevents infinite -// recursion by limiting depth. Used internally by concatWith and concatWriteGroup for log -// message formatting. -// Example: -// -// var b strings.Builder -// concatWriteValue(&b, "hello", 0) // Writes "hello" to b -// concatWriteValue(&b, []int{1, 2}, 0) // Writes "[1,2]" to b -func concatWriteValue(b *strings.Builder, arg any, depth int) { - if depth > maxRecursionDepth { - b.WriteString("...") - return - } - - if arg == nil { - b.WriteString(nilString) - return - } - - if s, ok := arg.(fmt.Stringer); ok { - b.WriteString(s.String()) - return - } - - switch v := arg.(type) { - case string: - b.WriteString(v) - case []byte: - b.Write(v) - case int: - b.WriteString(strconv.FormatInt(int64(v), 10)) - case int64: - b.WriteString(strconv.FormatInt(v, 10)) - case int32: - b.WriteString(strconv.FormatInt(int64(v), 10)) - case int16: - b.WriteString(strconv.FormatInt(int64(v), 10)) - case int8: - b.WriteString(strconv.FormatInt(int64(v), 10)) - case uint: - b.WriteString(strconv.FormatUint(uint64(v), 10)) - case uint64: - b.WriteString(strconv.FormatUint(v, 10)) - case uint32: - b.WriteString(strconv.FormatUint(uint64(v), 10)) - case uint16: - b.WriteString(strconv.FormatUint(uint64(v), 10)) - case uint8: - b.WriteString(strconv.FormatUint(uint64(v), 10)) - case float64: - b.WriteString(strconv.FormatFloat(v, 'f', -1, 64)) - case float32: - b.WriteString(strconv.FormatFloat(float64(v), 'f', -1, 32)) - case bool: - if v { - b.WriteString("true") - } else { - b.WriteString("false") - } - default: - val := reflect.ValueOf(arg) - if val.Kind() == reflect.Ptr { - if val.IsNil() { - b.WriteString(nilString) - return - } - val = val.Elem() - } - - switch val.Kind() { - case reflect.Slice, reflect.Array: - concatFormatSlice(b, val, depth) - case reflect.Struct: - concatFormatStruct(b, val, depth) - default: - fmt.Fprint(b, v) - } - } -} - -// concatFormatSlice formats a slice or array for logging. -// It writes the elements in a bracketed, comma-separated format, handling nested types -// recursively with depth tracking. Used internally by concatWriteValue for log message formatting. -// Example: -// -// var b strings.Builder -// val := reflect.ValueOf([]int{1, 2}) -// concatFormatSlice(&b, val, 0) // Writes "[1,2]" to b -func concatFormatSlice(b *strings.Builder, val reflect.Value, depth int) { - b.WriteByte('[') - for i := 0; i < val.Len(); i++ { - if i > 0 { - b.WriteByte(',') - } - concatWriteValue(b, val.Index(i).Interface(), depth+1) - } - b.WriteByte(']') -} - -// concatFormatStruct formats a struct for logging. -// It writes the structโ€™s exported fields in a bracketed, name:value format, handling nested -// types recursively with depth tracking. Unexported fields are represented as "". -// Used internally by concatWriteValue for log message formatting. -// Example: -// -// var b strings.Builder -// val := reflect.ValueOf(struct{ Name string }{Name: "test"}) -// concatFormatStruct(&b, val, 0) // Writes "[Name:test]" to b -func concatFormatStruct(b *strings.Builder, val reflect.Value, depth int) { - typ := val.Type() - b.WriteByte('[') - - first := true - for i := 0; i < val.NumField(); i++ { - field := typ.Field(i) - fieldValue := val.Field(i) - - if !first { - b.WriteString("; ") - } - first = false - - b.WriteString(field.Name) - b.WriteByte(':') - - if !fieldValue.CanInterface() { - b.WriteString(unexportedString) - continue - } - - concatWriteValue(b, fieldValue.Interface(), depth+1) - } - - b.WriteByte(']') -} diff --git a/vendor/github.com/olekukonko/ll/field.go b/vendor/github.com/olekukonko/ll/field.go index 9d4ff3c6c..4162162ff 100644 --- a/vendor/github.com/olekukonko/ll/field.go +++ b/vendor/github.com/olekukonko/ll/field.go @@ -2,6 +2,7 @@ package ll import ( "fmt" + "github.com/olekukonko/cat" "github.com/olekukonko/ll/lx" "os" "strings" @@ -50,7 +51,7 @@ func (fb *FieldBuilder) Info(args ...any) { return } // Log at Info level with the builderโ€™s fields, no stack trace - fb.logger.log(lx.LevelInfo, lx.ClassText, concatSpaced(args...), fb.fields, false) + fb.logger.log(lx.LevelInfo, lx.ClassText, cat.Space(args...), fb.fields, false) } // Infof logs a message at Info level with the builderโ€™s fields. @@ -85,7 +86,7 @@ func (fb *FieldBuilder) Debug(args ...any) { return } // Log at Debug level with the builderโ€™s fields, no stack trace - fb.logger.log(lx.LevelDebug, lx.ClassText, concatSpaced(args...), fb.fields, false) + fb.logger.log(lx.LevelDebug, lx.ClassText, cat.Space(args...), fb.fields, false) } // Debugf logs a message at Debug level with the builderโ€™s fields. @@ -120,7 +121,7 @@ func (fb *FieldBuilder) Warn(args ...any) { return } // Log at Warn level with the builderโ€™s fields, no stack trace - fb.logger.log(lx.LevelWarn, lx.ClassText, concatSpaced(args...), fb.fields, false) + fb.logger.log(lx.LevelWarn, lx.ClassText, cat.Space(args...), fb.fields, false) } // Warnf logs a message at Warn level with the builderโ€™s fields. @@ -154,7 +155,7 @@ func (fb *FieldBuilder) Error(args ...any) { return } // Log at Error level with the builderโ€™s fields, no stack trace - fb.logger.log(lx.LevelError, lx.ClassText, concatSpaced(args...), fb.fields, false) + fb.logger.log(lx.LevelError, lx.ClassText, cat.Space(args...), fb.fields, false) } // Errorf logs a message at Error level with the builderโ€™s fields. @@ -188,7 +189,7 @@ func (fb *FieldBuilder) Stack(args ...any) { return } // Log at Error level with the builderโ€™s fields and a stack trace - fb.logger.log(lx.LevelError, lx.ClassText, concatSpaced(args...), fb.fields, true) + fb.logger.log(lx.LevelError, lx.ClassText, cat.Space(args...), fb.fields, true) } // Stackf logs a message at Error level with a stack trace and the builderโ€™s fields. diff --git a/vendor/github.com/olekukonko/ll/global.go b/vendor/github.com/olekukonko/ll/global.go index 2ebea73b1..f4a8489d0 100644 --- a/vendor/github.com/olekukonko/ll/global.go +++ b/vendor/github.com/olekukonko/ll/global.go @@ -1,11 +1,12 @@ package ll import ( - "github.com/olekukonko/ll/lh" - "github.com/olekukonko/ll/lx" "os" "sync/atomic" "time" + + "github.com/olekukonko/ll/lh" + "github.com/olekukonko/ll/lx" ) // defaultLogger is the global logger instance for package-level logging functions. @@ -468,13 +469,7 @@ func Len() int64 { // duration := ll.Measure(func() { time.Sleep(time.Millisecond) }) // // Output: [] INFO: function executed [duration=~1ms] func Measure(fns ...func()) time.Duration { - start := time.Now() - for _, fn := range fns { - fn() - } - duration := time.Since(start) - defaultLogger.Fields("duration", duration).Infof("function executed") - return duration + return defaultLogger.Measure(fns...) } // Benchmark logs the duration since a start time at Info level using the default logger. @@ -486,7 +481,7 @@ func Measure(fns ...func()) time.Duration { // time.Sleep(time.Millisecond) // ll.Benchmark(start) // Output: [] INFO: benchmark [start=... end=... duration=...] func Benchmark(start time.Time) { - defaultLogger.Fields("start", start, "end", time.Now(), "duration", time.Now().Sub(start)).Infof("benchmark") + defaultLogger.Benchmark(start) } // Clone returns a new logger with the same configuration as the default logger. @@ -657,3 +652,11 @@ func Mark(names ...string) { defaultLogger.mark(2, names...) } + +// Output logs data in a human-readable JSON format at Info level, including caller file and line information. +// It is similar to Dbg but formats the output as JSON for better readability. It is thread-safe and respects +// the loggerโ€™s configuration (e.g., enabled, level, suspend, handler, middleware). +func Output(values ...interface{}) { + o := NewInspector(defaultLogger) + o.Log(2, values...) +} diff --git a/vendor/github.com/olekukonko/ll/inspector.go b/vendor/github.com/olekukonko/ll/inspector.go new file mode 100644 index 000000000..f4e0fa591 --- /dev/null +++ b/vendor/github.com/olekukonko/ll/inspector.go @@ -0,0 +1,239 @@ +package ll + +import ( + "encoding/json" + "fmt" + "reflect" + "runtime" + "strings" + "unsafe" + + "github.com/olekukonko/ll/lx" +) + +// Inspector is a utility for Logger that provides advanced inspection and logging of data +// in human-readable JSON format. It uses reflection to access and represent unexported fields, +// nested structs, embedded structs, and pointers, making it useful for debugging complex data structures. +type Inspector struct { + logger *Logger +} + +// NewInspector returns a new Inspector instance associated with the provided logger. +func NewInspector(logger *Logger) *Inspector { + return &Inspector{logger: logger} +} + +// Log outputs the given values as indented JSON at the Info level, prefixed with the caller's +// file name and line number. It handles structs (including unexported fields, nested, and embedded), +// pointers, errors, and other types. The skip parameter determines how many stack frames to skip +// when identifying the caller; typically set to 2 to account for the call to Log and its wrapper. +// +// Example usage within a Logger method: +// +// o := NewInspector(l) +// o.Log(2, someStruct) // Logs JSON representation with caller info +func (o *Inspector) Log(skip int, values ...interface{}) { + // Skip if logger is suspended or Info level is disabled + if o.logger.suspend.Load() || !o.logger.shouldLog(lx.LevelInfo) { + return + } + + // Retrieve caller information for logging context + _, file, line, ok := runtime.Caller(skip) + if !ok { + o.logger.log(lx.LevelError, lx.ClassText, "Inspector: Unable to parse runtime caller", nil, false) + return + } + + // Extract short filename for concise output + shortFile := file + if idx := strings.LastIndex(file, "/"); idx >= 0 { + shortFile = file[idx+1:] + } + + // Process each value individually + for _, value := range values { + var jsonData []byte + var err error + + // Use reflection for struct types to handle unexported and nested fields + val := reflect.ValueOf(value) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + if val.Kind() == reflect.Struct { + valueMap := o.structToMap(val) + jsonData, err = json.MarshalIndent(valueMap, "", " ") + } else if errVal, ok := value.(error); ok { + // Special handling for errors to represent them as a simple map + value = map[string]string{"error": errVal.Error()} + jsonData, err = json.MarshalIndent(value, "", " ") + } else { + // Fall back to standard JSON marshaling for non-struct types + jsonData, err = json.MarshalIndent(value, "", " ") + } + + if err != nil { + o.logger.log(lx.LevelError, lx.ClassText, fmt.Sprintf("Inspector: JSON encoding error: %v", err), nil, false) + continue + } + + // Construct log message with file, line, and JSON data + msg := fmt.Sprintf("[%s:%d] DUMP: %s", shortFile, line, string(jsonData)) + o.logger.log(lx.LevelInfo, lx.ClassText, msg, nil, false) + } +} + +// structToMap recursively converts a struct's reflect.Value to a map[string]interface{}. +// It includes unexported fields (named with parentheses), prefixes pointers with '*', +// flattens anonymous embedded structs without json tags, and uses unsafe pointers to access +// unexported primitive fields when reflect.CanInterface() returns false. +func (o *Inspector) structToMap(val reflect.Value) map[string]interface{} { + result := make(map[string]interface{}) + if !val.IsValid() { + return result + } + + typ := val.Type() + for i := 0; i < val.NumField(); i++ { + field := val.Field(i) + fieldType := typ.Field(i) + + // Determine field name: prefer json tag if present and not "-", else use struct field name + baseName := fieldType.Name + jsonTag := fieldType.Tag.Get("json") + hasJsonTag := false + if jsonTag != "" { + if idx := strings.Index(jsonTag, ","); idx != -1 { + jsonTag = jsonTag[:idx] + } + if jsonTag != "-" { + baseName = jsonTag + hasJsonTag = true + } + } + + // Enclose unexported field names in parentheses + fieldName := baseName + if !fieldType.IsExported() { + fieldName = "(" + baseName + ")" + } + + // Handle pointer fields + isPtr := fieldType.Type.Kind() == reflect.Ptr + if isPtr { + fieldName = "*" + fieldName + if field.IsNil() { + result[fieldName] = nil + continue + } + field = field.Elem() + } + + // Recurse for struct fields + if field.Kind() == reflect.Struct { + subMap := o.structToMap(field) + isNested := !fieldType.Anonymous || hasJsonTag + if isNested { + result[fieldName] = subMap + } else { + // Flatten embedded struct fields into the parent map, avoiding overwrites + for k, v := range subMap { + if _, exists := result[k]; !exists { + result[k] = v + } + } + } + } else { + // Handle primitive fields + if field.CanInterface() { + result[fieldName] = field.Interface() + } else { + // Use unsafe access for unexported primitives + ptr := getDataPtr(field) + switch field.Kind() { + case reflect.String: + result[fieldName] = *(*string)(ptr) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + result[fieldName] = o.getIntFromUnexportedField(field) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + result[fieldName] = o.getUintFromUnexportedField(field) + case reflect.Float32, reflect.Float64: + result[fieldName] = o.getFloatFromUnexportedField(field) + case reflect.Bool: + result[fieldName] = *(*bool)(ptr) + default: + result[fieldName] = fmt.Sprintf("*unexported %s*", field.Type().String()) + } + } + } + } + return result +} + +// emptyInterface represents the internal structure of an empty interface{}. +// This is used for unsafe pointer manipulation to access unexported field data. +type emptyInterface struct { + typ unsafe.Pointer + word unsafe.Pointer +} + +// getDataPtr returns an unsafe.Pointer to the underlying data of a reflect.Value. +// This enables direct access to unexported fields via unsafe operations. +func getDataPtr(v reflect.Value) unsafe.Pointer { + return (*emptyInterface)(unsafe.Pointer(&v)).word +} + +// getIntFromUnexportedField extracts a signed integer value from an unexported field +// using unsafe pointer access. It supports int, int8, int16, int32, and int64 kinds, +// returning the value as int64. Returns 0 for unsupported kinds. +func (o *Inspector) getIntFromUnexportedField(field reflect.Value) int64 { + ptr := getDataPtr(field) + switch field.Kind() { + case reflect.Int: + return int64(*(*int)(ptr)) + case reflect.Int8: + return int64(*(*int8)(ptr)) + case reflect.Int16: + return int64(*(*int16)(ptr)) + case reflect.Int32: + return int64(*(*int32)(ptr)) + case reflect.Int64: + return *(*int64)(ptr) + } + return 0 +} + +// getUintFromUnexportedField extracts an unsigned integer value from an unexported field +// using unsafe pointer access. It supports uint, uint8, uint16, uint32, and uint64 kinds, +// returning the value as uint64. Returns 0 for unsupported kinds. +func (o *Inspector) getUintFromUnexportedField(field reflect.Value) uint64 { + ptr := getDataPtr(field) + switch field.Kind() { + case reflect.Uint: + return uint64(*(*uint)(ptr)) + case reflect.Uint8: + return uint64(*(*uint8)(ptr)) + case reflect.Uint16: + return uint64(*(*uint16)(ptr)) + case reflect.Uint32: + return uint64(*(*uint32)(ptr)) + case reflect.Uint64: + return *(*uint64)(ptr) + } + return 0 +} + +// getFloatFromUnexportedField extracts a floating-point value from an unexported field +// using unsafe pointer access. It supports float32 and float64 kinds, returning the value +// as float64. Returns 0 for unsupported kinds. +func (o *Inspector) getFloatFromUnexportedField(field reflect.Value) float64 { + ptr := getDataPtr(field) + switch field.Kind() { + case reflect.Float32: + return float64(*(*float32)(ptr)) + case reflect.Float64: + return *(*float64)(ptr) + } + return 0 +} diff --git a/vendor/github.com/olekukonko/ll/lh/colorized.go b/vendor/github.com/olekukonko/ll/lh/colorized.go index 8f5aa53db..e343ff381 100644 --- a/vendor/github.com/olekukonko/ll/lh/colorized.go +++ b/vendor/github.com/olekukonko/ll/lh/colorized.go @@ -2,12 +2,14 @@ package lh import ( "fmt" - "github.com/olekukonko/ll/lx" "io" "os" "sort" "strings" + "sync" "time" + + "github.com/olekukonko/ll/lx" ) // Palette defines ANSI color codes for various log components. @@ -81,6 +83,7 @@ type ColorizedHandler struct { palette Palette // Color scheme for formatting showTime bool // Whether to display timestamps timeFormat string // Format for timestamps (defaults to time.RFC3339) + mu sync.Mutex } // ColorOption defines a configuration function for ColorizedHandler. @@ -130,6 +133,10 @@ func NewColorizedHandler(w io.Writer, opts ...ColorOption) *ColorizedHandler { // // handler.Handle(&lx.Entry{Message: "test", Level: lx.LevelInfo}) // Writes colored output func (h *ColorizedHandler) Handle(e *lx.Entry) error { + + h.mu.Lock() + defer h.mu.Unlock() + switch e.Class { case lx.ClassDump: // Handle hex dump entries diff --git a/vendor/github.com/olekukonko/ll/lh/text.go b/vendor/github.com/olekukonko/ll/lh/text.go index 7423e2107..0b88cf4b8 100644 --- a/vendor/github.com/olekukonko/ll/lh/text.go +++ b/vendor/github.com/olekukonko/ll/lh/text.go @@ -2,11 +2,13 @@ package lh import ( "fmt" - "github.com/olekukonko/ll/lx" "io" "sort" "strings" + "sync" "time" + + "github.com/olekukonko/ll/lx" ) // TextHandler is a handler that outputs log entries as plain text. @@ -17,6 +19,7 @@ type TextHandler struct { w io.Writer // Destination for formatted log output showTime bool // Whether to display timestamps timeFormat string // Format for timestamps (defaults to time.RFC3339) + mu sync.Mutex } // NewTextHandler creates a new TextHandler writing to the specified writer. @@ -55,6 +58,9 @@ func (h *TextHandler) Timestamped(enable bool, format ...string) { // // handler.Handle(&lx.Entry{Message: "test", Level: lx.LevelInfo}) // Writes "INFO: test" func (h *TextHandler) Handle(e *lx.Entry) error { + h.mu.Lock() + defer h.mu.Unlock() + // Special handling for dump output if e.Class == lx.ClassDump { return h.handleDumpOutput(e) diff --git a/vendor/github.com/olekukonko/ll/ll.go b/vendor/github.com/olekukonko/ll/ll.go index 44e515126..04d200810 100644 --- a/vendor/github.com/olekukonko/ll/ll.go +++ b/vendor/github.com/olekukonko/ll/ll.go @@ -5,8 +5,6 @@ import ( "encoding/binary" "encoding/json" "fmt" - "github.com/olekukonko/ll/lh" - "github.com/olekukonko/ll/lx" "io" "math" "os" @@ -16,6 +14,10 @@ import ( "sync" "sync/atomic" "time" + + "github.com/olekukonko/cat" + "github.com/olekukonko/ll/lh" + "github.com/olekukonko/ll/lx" ) // Logger manages logging configuration and behavior, encapsulating state such as enablement, @@ -24,7 +26,7 @@ import ( type Logger struct { mu sync.RWMutex // Guards concurrent access to fields enabled bool // Determines if logging is enabled - suspend bool // uses suspend path for most actions eg. skipping namespace checks + suspend atomic.Bool // uses suspend path for most actions eg. skipping namespace checks level lx.LevelType // Minimum log level (e.g., Debug, Info, Warn, Error) namespaces *lx.Namespace // Manages namespace enable/disable states currentPath string // Current namespace path (e.g., "parent/child") @@ -97,7 +99,11 @@ func (l *Logger) AddContext(key string, value interface{}) *Logger { // logger.Benchmark(start) // Output: [app] INFO: benchmark [start=... end=... duration=...] func (l *Logger) Benchmark(start time.Time) time.Duration { duration := time.Since(start) - l.Fields("start", start, "end", time.Now(), "duration", duration).Infof("benchmark") + l.Fields( + "duration_ms", duration.Milliseconds(), + "duration", duration.String(), + ).Infof("benchmark completed") + return duration } @@ -220,7 +226,7 @@ func (l *Logger) Dbg(values ...interface{}) { // logger.Debug("Debugging") // Output: [app] DEBUG: Debugging func (l *Logger) Debug(args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -229,7 +235,7 @@ func (l *Logger) Debug(args ...any) { return } - l.log(lx.LevelDebug, lx.ClassText, concatSpaced(args...), nil, false) + l.log(lx.LevelDebug, lx.ClassText, cat.Space(args...), nil, false) } // Debugf logs a formatted message at Debug level, delegating to Debug. It is thread-safe. @@ -239,7 +245,7 @@ func (l *Logger) Debug(args ...any) { // logger.Debugf("Debug %s", "message") // Output: [app] DEBUG: Debug message func (l *Logger) Debugf(format string, args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -344,6 +350,21 @@ func (l *Logger) Dump(values ...interface{}) { } } +// Output logs data in a human-readable JSON format at Info level, including caller file and line information. +// It is similar to Dbg but formats the output as JSON for better readability. It is thread-safe and respects +// the logger's configuration (e.g., enabled, level, suspend, handler, middleware). +// Example: +// +// logger := New("app").Enable() +// x := map[string]int{"key": 42} +// logger.Output(x) // Output: [app] INFO: [file.go:123] JSON: {"key": 42} +// +// Logger method to provide access to Output functionality +func (l *Logger) Output(values ...interface{}) { + o := NewInspector(l) + o.Log(2, values...) +} + // Enable activates logging, allowing logs to be emitted if other conditions (e.g., level, // namespace) are met. It is thread-safe using a write lock and returns the logger for chaining. // Example: @@ -432,7 +453,7 @@ func (l *Logger) Err(errs ...error) { // logger.Error("Error occurred") // Output: [app] ERROR: Error occurred func (l *Logger) Error(args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -440,7 +461,7 @@ func (l *Logger) Error(args ...any) { if !l.shouldLog(lx.LevelError) { return } - l.log(lx.LevelError, lx.ClassText, concatSpaced(args...), nil, false) + l.log(lx.LevelError, lx.ClassText, cat.Space(args...), nil, false) } // Errorf logs a formatted message at Error level, delegating to Error. It is thread-safe. @@ -450,7 +471,7 @@ func (l *Logger) Error(args ...any) { // logger.Errorf("Error %s", "occurred") // Output: [app] ERROR: Error occurred func (l *Logger) Errorf(format string, args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -465,7 +486,7 @@ func (l *Logger) Errorf(format string, args ...any) { // logger.Fatal("Fatal error") // Output: [app] ERROR: Fatal error [stack=...], then exits func (l *Logger) Fatal(args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -474,7 +495,7 @@ func (l *Logger) Fatal(args ...any) { os.Exit(1) } - l.log(lx.LevelError, lx.ClassText, concatSpaced(args...), nil, true) + l.log(lx.LevelError, lx.ClassText, cat.Space(args...), nil, false) os.Exit(1) } @@ -486,7 +507,7 @@ func (l *Logger) Fatal(args ...any) { // logger.Fatalf("Fatal %s", "error") // Output: [app] ERROR: Fatal error [stack=...], then exits func (l *Logger) Fatalf(format string, args ...any) { // check if suspended - if l.suspend { + if l.suspend.Load() { return } @@ -503,7 +524,7 @@ func (l *Logger) Field(fields map[string]interface{}) *FieldBuilder { fb := &FieldBuilder{logger: l, fields: make(map[string]interface{})} // check if suspended - if l.suspend { + if l.suspend.Load() { return fb } @@ -524,7 +545,7 @@ func (l *Logger) Field(fields map[string]interface{}) *FieldBuilder { func (l *Logger) Fields(pairs ...any) *FieldBuilder { fb := &FieldBuilder{logger: l, fields: make(map[string]interface{})} - if l.suspend { + if l.suspend.Load() { return fb } @@ -650,7 +671,7 @@ func (l *Logger) Indent(depth int) *Logger { // logger := New("app").Enable().Style(lx.NestedPath) // logger.Info("Started") // Output: [app]: INFO: Started func (l *Logger) Info(args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -658,7 +679,7 @@ func (l *Logger) Info(args ...any) { return } - l.log(lx.LevelInfo, lx.ClassText, concatSpaced(args...), nil, false) + l.log(lx.LevelInfo, lx.ClassText, cat.Space(args...), nil, false) } // Infof logs a formatted message at Info level, delegating to Info. It is thread-safe. @@ -667,7 +688,7 @@ func (l *Logger) Info(args ...any) { // logger := New("app").Enable().Style(lx.NestedPath) // logger.Infof("Started %s", "now") // Output: [app]: INFO: Started now func (l *Logger) Infof(format string, args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -771,12 +792,20 @@ func (l *Logger) mark(skip int, names ...string) { // // Output: [app] INFO: function executed [duration=~1ms] func (l *Logger) Measure(fns ...func()) time.Duration { start := time.Now() - // Execute all provided functions + for _, fn := range fns { - fn() + if fn != nil { + fn() + } } + duration := time.Since(start) - l.Fields("duration", duration).Infof("function executed") + l.Fields( + "duration_ns", duration.Nanoseconds(), + "duration", duration.String(), + "duration_ms", fmt.Sprintf("%.3fms", float64(duration.Nanoseconds())/1e6), + ).Infof("execution completed") + return duration } @@ -789,7 +818,7 @@ func (l *Logger) Measure(fns ...func()) time.Duration { // child := parent.Namespace("child") // child.Info("Child log") // Output: [parent/child] INFO: Child log func (l *Logger) Namespace(name string) *Logger { - if l.suspend { + if l.suspend.Load() { return l } @@ -897,9 +926,9 @@ func (l *Logger) NamespaceEnabled(relativePath string) bool { // logger.Panic("Panic error") // Output: [app] ERROR: Panic error [stack=...], then panics func (l *Logger) Panic(args ...any) { // Build message by concatenating arguments with spaces - msg := concatSpaced(args...) + msg := cat.Space(args...) - if l.suspend { + if l.suspend.Load() { panic(msg) } @@ -942,7 +971,7 @@ func (l *Logger) Prefix(prefix string) *Logger { // logger := New("app").Enable() // logger.Print("message", "value") // Output: [app] INFO: message value func (l *Logger) Print(args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -950,7 +979,7 @@ func (l *Logger) Print(args ...any) { if !l.shouldLog(lx.LevelInfo) { return } - l.log(lx.LevelNone, lx.ClassRaw, concatSpaced(args...), nil, false) + l.log(lx.LevelNone, lx.ClassRaw, cat.Space(args...), nil, false) } // Println logs a message at Info level without format specifiers, minimizing allocations @@ -960,7 +989,7 @@ func (l *Logger) Print(args ...any) { // logger := New("app").Enable() // logger.Println("message", "value") // Output: [app] INFO: message value func (l *Logger) Println(args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -968,7 +997,7 @@ func (l *Logger) Println(args ...any) { if !l.shouldLog(lx.LevelInfo) { return } - l.log(lx.LevelNone, lx.ClassRaw, concatenate(lx.Space, nil, []any{lx.Newline}, args...), nil, false) + l.log(lx.LevelNone, lx.ClassRaw, cat.SuffixWith(lx.Space, lx.Newline, args...), nil, false) } // Printf logs a formatted message at Info level, delegating to Print. It is thread-safe. @@ -977,7 +1006,7 @@ func (l *Logger) Println(args ...any) { // logger := New("app").Enable() // logger.Printf("Message %s", "value") // Output: [app] INFO: Message value func (l *Logger) Printf(format string, args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -1004,9 +1033,7 @@ func (l *Logger) Remove(m *Middleware) { // logger.Resume() // logger.Info("Resumed") // Output: [app] INFO: Resumed func (l *Logger) Resume() *Logger { - l.mu.Lock() - defer l.mu.Unlock() - l.suspend = false // Clear suspend flag to resume logging + l.suspend.Store(false) return l } @@ -1032,9 +1059,7 @@ func (l *Logger) Separator(separator string) *Logger { // logger.Suspend() // logger.Info("Ignored") // No output func (l *Logger) Suspend() *Logger { - l.mu.Lock() - defer l.mu.Unlock() - l.suspend = true // Set suspend flag to pause logging + l.suspend.Store(true) return l } @@ -1047,9 +1072,7 @@ func (l *Logger) Suspend() *Logger { // fmt.Println("Logging is suspended") // Prints message // } func (l *Logger) Suspended() bool { - l.mu.Lock() - defer l.mu.Unlock() - return l.suspend // Return current suspend state + return l.suspend.Load() } // Stack logs messages at Error level with a stack trace for each provided argument. @@ -1059,7 +1082,7 @@ func (l *Logger) Suspended() bool { // logger := New("app").Enable() // logger.Stack("Critical error") // Output: [app] ERROR: Critical error [stack=...] func (l *Logger) Stack(args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -1069,7 +1092,7 @@ func (l *Logger) Stack(args ...any) { } for _, arg := range args { - l.log(lx.LevelError, lx.ClassText, concat(arg), nil, true) + l.log(lx.LevelError, lx.ClassText, cat.Concat(arg), nil, true) } } @@ -1080,7 +1103,7 @@ func (l *Logger) Stack(args ...any) { // logger := New("app").Enable() // logger.Stackf("Critical %s", "error") // Output: [app] ERROR: Critical error [stack=...] func (l *Logger) Stackf(format string, args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -1171,7 +1194,7 @@ func (l *Logger) Use(fn lx.Handler) *Middleware { // logger := New("app").Enable() // logger.Warn("Warning") // Output: [app] WARN: Warning func (l *Logger) Warn(args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -1180,7 +1203,7 @@ func (l *Logger) Warn(args ...any) { return } - l.log(lx.LevelWarn, lx.ClassText, concatSpaced(args...), nil, false) + l.log(lx.LevelWarn, lx.ClassText, cat.Space(args...), nil, false) } // Warnf logs a formatted message at Warn level, delegating to Warn. It is thread-safe. @@ -1189,7 +1212,7 @@ func (l *Logger) Warn(args ...any) { // logger := New("app").Enable() // logger.Warnf("Warning %s", "issued") // Output: [app] WARN: Warning issued func (l *Logger) Warnf(format string, args ...any) { - if l.suspend { + if l.suspend.Load() { return } @@ -1363,7 +1386,7 @@ func (l *Logger) shouldLog(level lx.LevelType) bool { } // check for suspend mode - if l.suspend { + if l.suspend.Load() { return false } diff --git a/vendor/github.com/olekukonko/ll/lx/lx.go b/vendor/github.com/olekukonko/ll/lx/lx.go index 646618863..d370cb2d0 100644 --- a/vendor/github.com/olekukonko/ll/lx/lx.go +++ b/vendor/github.com/olekukonko/ll/lx/lx.go @@ -1,6 +1,7 @@ package lx import ( + "strings" "time" ) @@ -31,11 +32,28 @@ const ( // These constants define the severity levels for log messages, used to filter logs based // on the loggerโ€™s minimum level. They are ordered to allow comparison (e.g., LevelDebug < LevelWarn). const ( - LevelNone LevelType = iota // Debug level for detailed diagnostic information - LevelInfo // Info level for general operational messages - LevelWarn // Warn level for warning conditions - LevelError // Error level for error conditions requiring attention - LevelDebug // None level for logs without a specific severity (e.g., raw output) + LevelNone LevelType = iota // Debug level for detailed diagnostic information + LevelInfo // Info level for general operational messages + LevelWarn // Warn level for warning conditions + LevelError // Error level for error conditions requiring attention + LevelDebug // None level for logs without a specific severity (e.g., raw output) + LevelUnknown // None level for logs without a specific severity (e.g., raw output) +) + +// String constants for each level +const ( + DebugString = "DEBUG" + InfoString = "INFO" + WarnString = "WARN" + ErrorString = "ERROR" + NoneString = "NONE" + UnknownString = "UNKNOWN" + + TextString = "TEXT" + JSONString = "JSON" + DumpString = "DUMP" + SpecialString = "SPECIAL" + RawString = "RAW" ) // Log class constants, defining the type of log entry. @@ -47,6 +65,7 @@ const ( ClassDump // Dump entries for hex/ASCII dumps ClassSpecial // Special entries for custom or non-standard logs ClassRaw // Raw entries for unformatted output + ClassUnknown // Raw entries for unformatted output ) // Namespace style constants. @@ -72,17 +91,37 @@ type LevelType int func (l LevelType) String() string { switch l { case LevelDebug: - return "DEBUG" + return DebugString case LevelInfo: - return "INFO" + return InfoString case LevelWarn: - return "WARN" + return WarnString case LevelError: - return "ERROR" + return ErrorString case LevelNone: - return "NONE" + return NoneString + default: + return UnknownString + } +} + +// LevelParse converts a string to its corresponding LevelType. +// It parses a string (case-insensitive) and returns the corresponding LevelType, defaulting to +// LevelUnknown for unrecognized strings. Supports "WARNING" as an alias for "WARN". +func LevelParse(s string) LevelType { + switch strings.ToUpper(s) { + case DebugString: + return LevelDebug + case InfoString: + return LevelInfo + case WarnString, "WARNING": // Allow both "WARN" and "WARNING" + return LevelWarn + case ErrorString: + return LevelError + case NoneString: + return LevelNone default: - return "UNKNOWN" + return LevelUnknown } } @@ -149,16 +188,36 @@ type ClassType int func (t ClassType) String() string { switch t { case ClassText: - return "TEST" // Note: Likely a typo, should be "TEXT" + return TextString case ClassJSON: - return "JSON" + return JSONString case ClassDump: - return "DUMP" + return DumpString case ClassSpecial: - return "SPECIAL" + return SpecialString case ClassRaw: - return "RAW" + return RawString + default: + return UnknownString + } +} + +// ParseClass converts a string to its corresponding ClassType. +// It parses a string (case-insensitive) and returns the corresponding ClassType, defaulting to +// ClassUnknown for unrecognized strings. +func ParseClass(s string) ClassType { + switch strings.ToUpper(s) { + case TextString: + return ClassText + case JSONString: + return ClassJSON + case DumpString: + return ClassDump + case SpecialString: + return ClassSpecial + case RawString: + return ClassRaw default: - return "UNKNOWN" + return ClassUnknown } } diff --git a/vendor/github.com/olekukonko/tablewriter/.gitignore b/vendor/github.com/olekukonko/tablewriter/.gitignore index f79a28756..bb40e4cb4 100644 --- a/vendor/github.com/olekukonko/tablewriter/.gitignore +++ b/vendor/github.com/olekukonko/tablewriter/.gitignore @@ -8,3 +8,4 @@ dev.sh *csv2table _test/ +*.test diff --git a/vendor/github.com/olekukonko/tablewriter/MIGRATION.md b/vendor/github.com/olekukonko/tablewriter/MIGRATION.md index 650a195b6..08ab3055c 100644 --- a/vendor/github.com/olekukonko/tablewriter/MIGRATION.md +++ b/vendor/github.com/olekukonko/tablewriter/MIGRATION.md @@ -206,51 +206,51 @@ func main() { The `defaultConfig()` function (`config.go:defaultConfig`) establishes baseline settings for new tables, ensuring predictable behavior unless overridden. Below is a detailed table of default parameters, organized by configuration section, to help you understand the starting point for table behavior and appearance. -| Section | Parameter | Default Value | Description | -|---------------|-------------------------------|-----------------------------------|-----------------------------------------------------------------------------| -| **Header** | `Alignment.Global` | `tw.AlignCenter` | Centers header text globally unless overridden by `PerColumn`. | -| Header | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global` unless specified. | -| Header | `Formatting.AutoFormat` | `tw.On` | Applies title case (e.g., "col_one" โ†’ "COL ONE") to header content. | -| Header | `Formatting.AutoWrap` | `tw.WrapTruncate` | Truncates long header text with "โ€ฆ" based on width constraints. | -| Header | `Formatting.MergeMode` | `tw.MergeNone` | Disables cell merging in headers by default. | -| Header | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of header cells. | -| Header | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global` unless specified. | -| Header | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for header cells unless set. | -| Header | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits unless specified. | -| Header | `Filter.Global` | `nil` | No global content transformation for header cells. | -| Header | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations unless specified. | -| **Row** | `Alignment.Global` | `tw.AlignLeft` | Left-aligns row text globally unless overridden by `PerColumn`. | -| Row | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global`. | -| Row | `Formatting.AutoFormat` | `tw.Off` | Disables auto-formatting (e.g., title case) for row content. | -| Row | `Formatting.AutoWrap` | `tw.WrapNormal` | Wraps long row text naturally at word boundaries based on width constraints.| -| Row | `Formatting.MergeMode` | `tw.MergeNone` | Disables cell merging in rows by default. | -| Row | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of row cells. | -| Row | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global`. | -| Row | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for row cells. | -| Row | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits. | -| Row | `Filter.Global` | `nil` | No global content transformation for row cells. | -| Row | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations. | -| **Footer** | `Alignment.Global` | `tw.AlignRight` | Right-aligns footer text globally unless overridden by `PerColumn`. | -| Footer | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global`. | -| Footer | `Formatting.AutoFormat` | `tw.Off` | Disables auto-formatting for footer content. | -| Footer | `Formatting.AutoWrap` | `tw.WrapNormal` | Wraps long footer text naturally. | -| Footer | `Formatting.MergeMode` | `tw.MergeNone` | Disables cell merging in footers. | -| Footer | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of footer cells. | -| Footer | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global`. | -| Footer | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for footer cells. | -| Footer | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits. | -| Footer | `Filter.Global` | `nil` | No global content transformation for footer cells. | -| Footer | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations. | -| **Global** | `MaxWidth` | `0` (unlimited) | No overall table width limit. | -| Global | `Behavior.AutoHide` | `tw.Off` | Displays empty columns (ignored in streaming). | -| Global | `Behavior.TrimSpace` | `tw.On` | Trims leading/trailing spaces from cell content. | -| Global | `Behavior.Header` | `tw.Control{Hide: tw.Off}` | Shows header if content is provided. | -| Global | `Behavior.Footer` | `tw.Control{Hide: tw.Off}` | Shows footer if content is provided. | -| Global | `Behavior.Compact` | `tw.Compact{Merge: tw.Off}` | No compact width optimization for merged cells. | -| Global | `Debug` | `false` | Disables debug logging. | -| Global | `Stream.Enable` | `false` | Disables streaming mode by default. | -| Global | `Widths.Global` | `0` (unlimited) | No fixed column width unless specified. | -| Global | `Widths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column fixed widths unless specified. | +| Section | Parameter | Default Value | Description | +|---------------|--------------------------|-----------------------------------|-----------------------------------------------------------------------------| +| **Header** | `Alignment.Global` | `tw.AlignCenter` | Centers header text globally unless overridden by `PerColumn`. | +| Header | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global` unless specified. | +| Header | `Formatting.AutoFormat` | `tw.On` | Applies title case (e.g., "col_one" โ†’ "COL ONE") to header content. | +| Header | `Formatting.AutoWrap` | `tw.WrapTruncate` | Truncates long header text with "โ€ฆ" based on width constraints. | +| Header | `Merging.Mode` | `tw.MergeNone` | Disables cell merging in headers by default. | +| Header | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of header cells. | +| Header | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global` unless specified. | +| Header | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for header cells unless set. | +| Header | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits unless specified. | +| Header | `Filter.Global` | `nil` | No global content transformation for header cells. | +| Header | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations unless specified. | +| **Row** | `Alignment.Global` | `tw.AlignLeft` | Left-aligns row text globally unless overridden by `PerColumn`. | +| Row | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global`. | +| Row | `Formatting.AutoFormat` | `tw.Off` | Disables auto-formatting (e.g., title case) for row content. | +| Row | `Formatting.AutoWrap` | `tw.WrapNormal` | Wraps long row text naturally at word boundaries based on width constraints.| +| Row | `Merging.Mode` | `tw.MergeNone` | Disables cell merging in rows by default. | +| Row | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of row cells. | +| Row | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global`. | +| Row | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for row cells. | +| Row | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits. | +| Row | `Filter.Global` | `nil` | No global content transformation for row cells. | +| Row | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations. | +| **Footer** | `Alignment.Global` | `tw.AlignRight` | Right-aligns footer text globally unless overridden by `PerColumn`. | +| Footer | `Alignment.PerColumn` | `[]tw.Align{}` | Empty; falls back to `Global`. | +| Footer | `Formatting.AutoFormat` | `tw.Off` | Disables auto-formatting for footer content. | +| Footer | `Formatting.AutoWrap` | `tw.WrapNormal` | Wraps long footer text naturally. | +| Footer | `Formatting.MergeMode` | `tw.MergeNone` | Disables cell merging in footers. | +| Footer | `Padding.Global` | `tw.PaddingDefault` (`" "`) | Adds one space on left and right of footer cells. | +| Footer | `Padding.PerColumn` | `[]tw.Padding{}` | Empty; falls back to `Global`. | +| Footer | `ColMaxWidths.Global` | `0` (unlimited) | No maximum content width for footer cells. | +| Footer | `ColMaxWidths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column content width limits. | +| Footer | `Filter.Global` | `nil` | No global content transformation for footer cells. | +| Footer | `Filter.PerColumn` | `[]func(string) string{}` | No per-column content transformations. | +| **Global** | `MaxWidth` | `0` (unlimited) | No overall table width limit. | +| Global | `Behavior.AutoHide` | `tw.Off` | Displays empty columns (ignored in streaming). | +| Global | `Behavior.TrimSpace` | `tw.On` | Trims leading/trailing spaces from cell content. | +| Global | `Behavior.Header` | `tw.Control{Hide: tw.Off}` | Shows header if content is provided. | +| Global | `Behavior.Footer` | `tw.Control{Hide: tw.Off}` | Shows footer if content is provided. | +| Global | `Behavior.Compact` | `tw.Compact{Merge: tw.Off}` | No compact width optimization for merged cells. | +| Global | `Debug` | `false` | Disables debug logging. | +| Global | `Stream.Enable` | `false` | Disables streaming mode by default. | +| Global | `Widths.Global` | `0` (unlimited) | No fixed column width unless specified. | +| Global | `Widths.PerColumn` | `tw.NewMapper[int, int]()` | Empty map; no per-column fixed widths unless specified. | **Notes**: - Defaults can be overridden using any configuration method. @@ -2210,7 +2210,7 @@ import ( func main() { // Horizontal Merging (Similar to v0.0.5) tableH := tablewriter.NewTable(os.Stdout, - tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Formatting: tw.CellFormatting{MergeMode: tw.MergeHorizontal}}}), + tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Merging: tw.CellMerging{Mode: tw.MergeHorizontal}}}), tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{Symbols: tw.NewSymbols(tw.StyleASCII)})), // Specify renderer for symbols ) tableH.Header("Category", "Item", "Item", "Notes") // Note: Two "Item" headers for demo @@ -2219,7 +2219,7 @@ func main() { // Vertical Merging tableV := tablewriter.NewTable(os.Stdout, - tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Formatting: tw.CellFormatting{MergeMode: tw.MergeVertical}}}), + tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Merging: tw.CellMerging{Mode: tw.MergeVertical}}}), tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{Symbols: tw.NewSymbols(tw.StyleASCII)})), ) tableV.Header("User", "Permission") @@ -2230,7 +2230,7 @@ func main() { // Hierarchical Merging tableHier := tablewriter.NewTable(os.Stdout, - tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Formatting: tw.CellFormatting{MergeMode: tw.MergeHierarchical}}}), + tablewriter.WithConfig(tablewriter.Config{Row: tw.CellConfig{Merging: tw.CellMerging{Mode: tw.MergeHierarchical}}}), tablewriter.WithRenderer(renderer.NewBlueprint(tw.Rendition{Symbols: tw.NewSymbols(tw.StyleASCII)})), ) tableHier.Header("Group", "SubGroup", "Item") diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md index 16d288233..f15ad7e44 100644 --- a/vendor/github.com/olekukonko/tablewriter/README.md +++ b/vendor/github.com/olekukonko/tablewriter/README.md @@ -28,7 +28,7 @@ go get github.com/olekukonko/tablewriter@v0.0.5 #### Latest Version The latest stable version ```bash -go get github.com/olekukonko/tablewriter@v1.1.0 +go get github.com/olekukonko/tablewriter@v1.1.1 ``` **Warning:** Version `v1.0.0` contains missing functionality and should not be used. @@ -62,7 +62,7 @@ func main() { data := [][]string{ {"Package", "Version", "Status"}, {"tablewriter", "v0.0.5", "legacy"}, - {"tablewriter", "v1.1.0", "latest"}, + {"tablewriter", "v1.1.1", "latest"}, } table := tablewriter.NewWriter(os.Stdout) @@ -77,7 +77,7 @@ func main() { โ”‚ PACKAGE โ”‚ VERSION โ”‚ STATUS โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ tablewriter โ”‚ v0.0.5 โ”‚ legacy โ”‚ -โ”‚ tablewriter โ”‚ v1.1.0 โ”‚ latest โ”‚ +โ”‚ tablewriter โ”‚ v1.1.1 โ”‚ latest โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` @@ -520,7 +520,7 @@ func main() { tablewriter.WithConfig(tablewriter.Config{ Header: tw.CellConfig{Alignment: tw.CellAlignment{Global: tw.AlignCenter}}, Row: tw.CellConfig{ - Formatting: tw.CellFormatting{MergeMode: tw.MergeHierarchical}, + Merging: tw.CellMerging{Mode: tw.MergeHierarchical}, Alignment: tw.CellAlignment{Global: tw.AlignLeft}, }, }), @@ -579,8 +579,8 @@ func main() { })), tablewriter.WithConfig(tablewriter.Config{ Row: tw.CellConfig{ - Formatting: tw.CellFormatting{MergeMode: tw.MergeBoth}, - Alignment: tw.CellAlignment{PerColumn: []tw.Align{tw.Skip, tw.Skip, tw.AlignRight, tw.AlignLeft}}, + Merging: tw.CellMerging{Mode: tw.MergeBoth}, + Alignment: tw.CellAlignment{PerColumn: []tw.Align{tw.Skip, tw.Skip, tw.AlignRight, tw.AlignLeft}}, }, Footer: tw.CellConfig{ @@ -806,12 +806,12 @@ func main() { tablewriter.WithRenderer(renderer.NewHTML(htmlCfg)), tablewriter.WithConfig(tablewriter.Config{ Header: tw.CellConfig{ - Formatting: tw.CellFormatting{MergeMode: tw.MergeHorizontal}, // Merge identical header cells - Alignment: tw.CellAlignment{Global: tw.AlignCenter}, + Merging: tw.CellMerging{Mode: tw.MergeHorizontal}, // Merge identical header cells + Alignment: tw.CellAlignment{Global: tw.AlignCenter}, }, Row: tw.CellConfig{ - Formatting: tw.CellFormatting{MergeMode: tw.MergeHorizontal}, // Merge identical row cells - Alignment: tw.CellAlignment{Global: tw.AlignLeft}, + Merging: tw.CellMerging{Mode: tw.MergeHorizontal}, // Merge identical row cells + Alignment: tw.CellAlignment{Global: tw.AlignLeft}, }, Footer: tw.CellConfig{Alignment: tw.CellAlignment{Global: tw.AlignRight}}, }), diff --git a/vendor/github.com/olekukonko/tablewriter/benchstat.txt b/vendor/github.com/olekukonko/tablewriter/benchstat.txt new file mode 100644 index 000000000..912c38deb --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/benchstat.txt @@ -0,0 +1,194 @@ +goos: darwin +goarch: arm64 +pkg: github.com/olekukonko/tablewriter/pkg/twwarp +cpu: Apple M2 + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ sec/op โ”‚ sec/op vs base โ”‚ +WrapString-8 112.8ยต ยฑ 1% 112.9ยต ยฑ 2% ~ (p=0.589 n=6) +WrapStringWithSpaces-8 113.4ยต ยฑ 1% 113.7ยต ยฑ 1% ~ (p=0.310 n=6) +geomean 113.1ยต 113.3ยต +0.15% + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ B/s โ”‚ B/s vs base โ”‚ +WrapString-8 84.92Mi ยฑ 1% 84.82Mi ยฑ 2% ~ (p=0.589 n=6) +WrapStringWithSpaces-8 84.43Mi ยฑ 1% 84.27Mi ยฑ 1% ~ (p=0.310 n=6) +geomean 84.68Mi 84.55Mi -0.15% + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ B/op โ”‚ B/op vs base โ”‚ +WrapString-8 47.35Ki ยฑ 0% 47.35Ki ยฑ 0% ~ (p=1.000 n=6) ยน +WrapStringWithSpaces-8 52.76Ki ยฑ 0% 52.76Ki ยฑ 0% ~ (p=1.000 n=6) ยน +geomean 49.98Ki 49.98Ki +0.00% +ยน all samples are equal + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ allocs/op โ”‚ allocs/op vs base โ”‚ +WrapString-8 33.00 ยฑ 0% 33.00 ยฑ 0% ~ (p=1.000 n=6) ยน +WrapStringWithSpaces-8 51.00 ยฑ 0% 51.00 ยฑ 0% ~ (p=1.000 n=6) ยน +geomean 41.02 41.02 +0.00% +ยน all samples are equal + +pkg: github.com/olekukonko/tablewriter/pkg/twwidth + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ sec/op โ”‚ sec/op vs base โ”‚ +WidthFunction/SimpleASCII_EAfalse_NoCache-8 387.6n ยฑ 1% 368.4n ยฑ 2% -4.97% (p=0.002 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheMiss-8 219.0n ยฑ 127% 217.5n ยฑ 119% ~ (p=0.372 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheHit-8 14.78n ยฑ 1% 14.54n ยฑ 3% ~ (p=0.061 n=6) +WidthFunction/SimpleASCII_EAtrue_NoCache-8 676.4n ยฑ 1% 366.8n ยฑ 2% -45.77% (p=0.002 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheMiss-8 216.1n ยฑ 375% 216.0n ยฑ 128% ~ (p=0.937 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheHit-8 14.71n ยฑ 0% 14.49n ยฑ 0% -1.53% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1.027ยต ยฑ 3% 1.007ยต ยฑ 1% -2.00% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 219.5n ยฑ 516% 221.4n ยฑ 502% ~ (p=0.515 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 14.81n ยฑ 1% 14.61n ยฑ 1% -1.35% (p=0.009 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1.313ยต ยฑ 2% 1.009ยต ยฑ 2% -23.15% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 653.2n ยฑ 150% 218.2n ยฑ 524% ~ (p=0.331 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 14.73n ยฑ 2% 14.50n ยฑ 0% -1.60% (p=0.002 n=6) +WidthFunction/EastAsian_EAfalse_NoCache-8 747.3n ยฑ 1% 336.2n ยฑ 1% -55.02% (p=0.002 n=6) +WidthFunction/EastAsian_EAfalse_CacheMiss-8 226.3n ยฑ 384% 227.4n ยฑ 113% ~ (p=0.937 n=6) +WidthFunction/EastAsian_EAfalse_CacheHit-8 14.74n ยฑ 1% 14.58n ยฑ 1% -1.09% (p=0.011 n=6) +WidthFunction/EastAsian_EAtrue_NoCache-8 965.4n ยฑ 2% 348.7n ยฑ 0% -63.88% (p=0.002 n=6) +WidthFunction/EastAsian_EAtrue_CacheMiss-8 225.4n ยฑ 511% 225.8n ยฑ 111% ~ (p=1.000 n=6) +WidthFunction/EastAsian_EAtrue_CacheHit-8 14.72n ยฑ 1% 14.54n ยฑ 3% ~ (p=0.056 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1376.0n ยฑ 2% 983.8n ยฑ 2% -28.50% (p=0.002 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 633.6n ยฑ 170% 222.4n ยฑ 513% ~ (p=0.974 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 15.73n ยฑ 1% 15.64n ยฑ 1% ~ (p=0.227 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1589.5n ยฑ 1% 996.9n ยฑ 2% -37.29% (p=0.002 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 484.8n ยฑ 309% 221.3n ยฑ 516% ~ (p=0.240 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 15.74n ยฑ 1% 15.73n ยฑ 1% ~ (p=0.485 n=6) +WidthFunction/LongSimpleASCII_EAfalse_NoCache-8 4.916ยต ยฑ 3% 4.512ยต ยฑ 4% -8.22% (p=0.002 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 2.430ยต ยฑ 114% 2.182ยต ยฑ 123% ~ (p=0.699 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 23.75n ยฑ 3% 23.24n ยฑ 3% ~ (p=0.065 n=6) +WidthFunction/LongSimpleASCII_EAtrue_NoCache-8 9.273ยต ยฑ 1% 4.519ยต ยฑ 1% -51.27% (p=0.002 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 4.021ยต ยฑ 131% 2.127ยต ยฑ 128% ~ (p=0.240 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 23.50n ยฑ 2% 23.48n ยฑ 1% ~ (p=0.589 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 57.36ยต ยฑ 1% 57.33ยต ยฑ 2% ~ (p=0.818 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 22.18ยต ยฑ 135% 14.55ยต ยฑ 299% ~ (p=0.589 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 44.21n ยฑ 1% 44.20n ยฑ 2% ~ (p=0.818 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 60.25ยต ยฑ 2% 57.90ยต ยฑ 2% -3.90% (p=0.002 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 16.11ยต ยฑ 263% 20.02ยต ยฑ 183% ~ (p=0.699 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 44.57n ยฑ 1% 44.18n ยฑ 2% ~ (p=0.461 n=6) +geomean 358.5n 283.9n -20.82% + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ B/s โ”‚ B/s vs base โ”‚ +WidthFunction/SimpleASCII_EAfalse_NoCache-8 86.11Mi ยฑ 1% 90.63Mi ยฑ 2% +5.24% (p=0.002 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheMiss-8 152.4Mi ยฑ 56% 153.5Mi ยฑ 54% ~ (p=0.394 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheHit-8 2.205Gi ยฑ 1% 2.242Gi ยฑ 3% ~ (p=0.065 n=6) +WidthFunction/SimpleASCII_EAtrue_NoCache-8 49.35Mi ยฑ 1% 91.00Mi ยฑ 2% +84.40% (p=0.002 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheMiss-8 154.5Mi ยฑ 79% 154.5Mi ยฑ 56% ~ (p=0.937 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheHit-8 2.215Gi ยฑ 0% 2.250Gi ยฑ 0% +1.58% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 56.66Mi ยฑ 2% 57.78Mi ยฑ 1% +1.99% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 265.1Mi ยฑ 84% 262.7Mi ยฑ 83% ~ (p=0.485 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 3.836Gi ยฑ 1% 3.888Gi ยฑ 1% +1.34% (p=0.009 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 44.30Mi ยฑ 2% 57.65Mi ยฑ 2% +30.14% (p=0.002 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 147.3Mi ยฑ 81% 266.7Mi ยฑ 84% ~ (p=0.310 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 3.856Gi ยฑ 2% 3.919Gi ยฑ 0% +1.63% (p=0.002 n=6) +WidthFunction/EastAsian_EAfalse_NoCache-8 76.58Mi ยฑ 1% 170.21Mi ยฑ 1% +122.28% (p=0.002 n=6) +WidthFunction/EastAsian_EAfalse_CacheMiss-8 252.8Mi ยฑ 79% 251.6Mi ยฑ 53% ~ (p=0.937 n=6) +WidthFunction/EastAsian_EAfalse_CacheHit-8 3.791Gi ยฑ 1% 3.832Gi ยฑ 1% +1.08% (p=0.009 n=6) +WidthFunction/EastAsian_EAtrue_NoCache-8 59.27Mi ยฑ 2% 164.10Mi ยฑ 0% +176.87% (p=0.002 n=6) +WidthFunction/EastAsian_EAtrue_CacheMiss-8 253.9Mi ยฑ 84% 253.4Mi ยฑ 53% ~ (p=1.000 n=6) +WidthFunction/EastAsian_EAtrue_CacheHit-8 3.796Gi ยฑ 1% 3.841Gi ยฑ 3% ~ (p=0.065 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 60.29Mi ยฑ 1% 84.33Mi ยฑ 2% +39.88% (p=0.002 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 227.1Mi ยฑ 79% 373.2Mi ยฑ 84% ~ (p=1.000 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 5.154Gi ยฑ 1% 5.181Gi ยฑ 1% ~ (p=0.240 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 52.19Mi ยฑ 1% 83.23Mi ยฑ 2% +59.47% (p=0.002 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 230.9Mi ยฑ 82% 374.9Mi ยฑ 84% ~ (p=0.240 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 5.147Gi ยฑ 1% 5.152Gi ยฑ 1% ~ (p=0.485 n=6) +WidthFunction/LongSimpleASCII_EAfalse_NoCache-8 104.8Mi ยฑ 3% 114.1Mi ยฑ 4% +8.95% (p=0.002 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 368.0Mi ยฑ 293% 474.3Mi ยฑ 211% ~ (p=0.699 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 21.17Gi ยฑ 3% 21.64Gi ยฑ 2% ~ (p=0.065 n=6) +WidthFunction/LongSimpleASCII_EAtrue_NoCache-8 55.54Mi ยฑ 1% 113.97Mi ยฑ 1% +105.21% (p=0.002 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 399.8Mi ยฑ 232% 577.5Mi ยฑ 149% ~ (p=0.240 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 21.40Gi ยฑ 2% 21.41Gi ยฑ 1% ~ (p=0.589 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 34.08Mi ยฑ 1% 34.10Mi ยฑ 2% ~ (p=0.784 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 101.5Mi ยฑ 1396% 643.9Mi ยฑ 320% ~ (p=0.589 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 43.18Gi ยฑ 1% 43.20Gi ยฑ 2% ~ (p=0.818 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 32.45Mi ยฑ 2% 33.76Mi ยฑ 2% +4.06% (p=0.002 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 393.0Mi ยฑ 296% 122.4Mi ยฑ 1610% ~ (p=0.699 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 42.83Gi ยฑ 1% 43.21Gi ยฑ 2% ~ (p=0.485 n=6) +geomean 456.4Mi 560.6Mi +22.83% + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ B/op โ”‚ B/op vs base โ”‚ +WidthFunction/SimpleASCII_EAfalse_NoCache-8 112.0 ยฑ 1% 113.0 ยฑ 0% ~ (p=0.061 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheMiss-8 55.00 ยฑ 200% 55.00 ยฑ 202% ~ (p=1.000 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/SimpleASCII_EAtrue_NoCache-8 113.0 ยฑ 1% 113.0 ยฑ 0% ~ (p=1.000 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheMiss-8 55.00 ยฑ 505% 55.00 ยฑ 205% ~ (p=0.697 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 185.0 ยฑ 0% 185.0 ยฑ 1% ~ (p=0.455 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 87.00 ยฑ 402% 87.00 ยฑ 401% ~ (p=1.000 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 185.0 ยฑ 0% 185.0 ยฑ 1% ~ (p=1.000 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 174.00 ยฑ 115% 87.00 ยฑ 401% ~ (p=0.621 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAfalse_NoCache-8 145.0 ยฑ 0% 146.0 ยฑ 0% +0.69% (p=0.002 n=6) +WidthFunction/EastAsian_EAfalse_CacheMiss-8 87.00 ยฑ 392% 87.00 ยฑ 167% ~ (p=0.697 n=6) +WidthFunction/EastAsian_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAtrue_NoCache-8 145.0 ยฑ 1% 146.0 ยฑ 1% +0.69% (p=0.013 n=6) +WidthFunction/EastAsian_EAtrue_CacheMiss-8 87.00 ยฑ 392% 87.00 ยฑ 164% ~ (p=0.697 n=6) +WidthFunction/EastAsian_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 193.0 ยฑ 1% 193.0 ยฑ 0% ~ (p=1.000 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 232.0 ยฑ 134% 103.0 ยฑ 485% ~ (p=0.924 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 193.0 ยฑ 0% 193.0 ยฑ 1% ~ (p=1.000 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 185.0 ยฑ 203% 103.0 ยฑ 485% ~ (p=0.621 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAfalse_NoCache-8 1.153Ki ยฑ 0% 1.150Ki ยฑ 0% ~ (p=0.126 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 1.050Ki ยฑ 72% 1.047Ki ยฑ 74% ~ (p=0.939 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAtrue_NoCache-8 1.152Ki ยฑ 0% 1.155Ki ยฑ 0% +0.30% (p=0.015 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 1.036Ki ยฑ 71% 1.039Ki ยฑ 76% ~ (p=0.981 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 1.355Ki ยฑ 0% 1.358Ki ยฑ 0% ~ (p=0.065 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 2.787Ki ยฑ 31% 2.613Ki ยฑ 43% ~ (p=0.805 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 1.358Ki ยฑ 0% 1.361Ki ยฑ 0% ~ (p=0.158 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 2.625Ki ยฑ 43% 2.741Ki ยฑ 37% ~ (p=0.987 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +geomean ยฒ -5.62% ยฒ +ยน all samples are equal +ยฒ summaries must be >0 to compute geomean + + โ”‚ old.txt โ”‚ new.txt โ”‚ + โ”‚ allocs/op โ”‚ allocs/op vs base โ”‚ +WidthFunction/SimpleASCII_EAfalse_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/SimpleASCII_EAfalse_CacheMiss-8 1.000 ยฑ 200% 1.000 ยฑ 200% ~ (p=1.000 n=6) +WidthFunction/SimpleASCII_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/SimpleASCII_EAtrue_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/SimpleASCII_EAtrue_CacheMiss-8 1.000 ยฑ 300% 1.000 ยฑ 200% ~ (p=0.697 n=6) +WidthFunction/SimpleASCII_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 6.000 ยฑ 0% 6.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 1.000 ยฑ 600% 1.000 ยฑ 600% ~ (p=1.000 n=6) +WidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 6.000 ยฑ 0% 6.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 3.500 ยฑ 100% 1.000 ยฑ 600% ~ (p=0.610 n=6) +WidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAfalse_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAfalse_CacheMiss-8 1.000 ยฑ 300% 1.000 ยฑ 200% ~ (p=0.697 n=6) +WidthFunction/EastAsian_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAtrue_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsian_EAtrue_CacheMiss-8 1.000 ยฑ 300% 1.000 ยฑ 200% ~ (p=0.697 n=6) +WidthFunction/EastAsian_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 5.000 ยฑ 0% 5.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 3.000 ยฑ 133% 1.000 ยฑ 600% ~ (p=1.000 n=6) +WidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 5.000 ยฑ 0% 5.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 2.500 ยฑ 180% 1.000 ยฑ 600% ~ (p=0.610 n=6) +WidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAfalse_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3.000 ยฑ 67% 3.000 ยฑ 67% ~ (p=1.000 n=6) +WidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAtrue_NoCache-8 3.000 ยฑ 0% 3.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3.000 ยฑ 67% 3.000 ยฑ 67% ~ (p=1.000 n=6) +WidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 9.000 ยฑ 0% 9.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 5.000 ยฑ 100% 3.500 ยฑ 186% ~ (p=0.978 n=6) +WidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 9.000 ยฑ 0% 9.000 ยฑ 0% ~ (p=1.000 n=6) ยน +WidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 4.000 ยฑ 150% 4.500 ยฑ 122% ~ (p=0.952 n=6) +WidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 0.000 ยฑ 0% 0.000 ยฑ 0% ~ (p=1.000 n=6) ยน +geomean ยฒ -9.28% ยฒ +ยน all samples are equal +ยฒ summaries must be >0 to compute geomean diff --git a/vendor/github.com/olekukonko/tablewriter/config.go b/vendor/github.com/olekukonko/tablewriter/config.go index ddad9bd18..415c9576b 100644 --- a/vendor/github.com/olekukonko/tablewriter/config.go +++ b/vendor/github.com/olekukonko/tablewriter/config.go @@ -135,12 +135,12 @@ func (b *ConfigBuilder) WithFooterMaxWidth(maxWidth int) *ConfigBuilder { return b } -// WithFooterMergeMode sets the merge behavior for footer cells (e.g., horizontal, hierarchical). -// Invalid merge modes are ignored. +// Deprecated: Use .Footer().CellMerging().WithMode(...) instead. This method will be removed in a future version. func (b *ConfigBuilder) WithFooterMergeMode(mergeMode int) *ConfigBuilder { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return b } + b.config.Footer.Merging.Mode = mergeMode b.config.Footer.Formatting.MergeMode = mergeMode return b } @@ -187,12 +187,12 @@ func (b *ConfigBuilder) WithHeaderMaxWidth(maxWidth int) *ConfigBuilder { return b } -// WithHeaderMergeMode sets the merge behavior for header cells (e.g., horizontal, vertical). -// Invalid merge modes are ignored. +// Deprecated: Use .Header().CellMerging().WithMode(...) instead. This method will be removed in a future version. func (b *ConfigBuilder) WithHeaderMergeMode(mergeMode int) *ConfigBuilder { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return b } + b.config.Header.Merging.Mode = mergeMode b.config.Header.Formatting.MergeMode = mergeMode return b } @@ -246,12 +246,12 @@ func (b *ConfigBuilder) WithRowMaxWidth(maxWidth int) *ConfigBuilder { return b } -// WithRowMergeMode sets the merge behavior for row cells (e.g., horizontal, hierarchical). -// Invalid merge modes are ignored. +// Deprecated: Use .Row().CellMerging().WithMode(...) instead. This method will be removed in a future version. func (b *ConfigBuilder) WithRowMergeMode(mergeMode int) *ConfigBuilder { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return b } + b.config.Row.Merging.Mode = mergeMode b.config.Row.Formatting.MergeMode = mergeMode return b } @@ -285,6 +285,14 @@ func (h *HeaderConfigBuilder) Formatting() *HeaderFormattingBuilder { } } +// Merging returns a HeaderMergingBuilder for configuring cell merging. +func (h *HeaderConfigBuilder) Merging() *HeaderMergingBuilder { + return &HeaderMergingBuilder{ + parent: h, + config: &h.config.Merging, + } +} + // Padding returns a HeaderPaddingBuilder for header padding func (h *HeaderConfigBuilder) Padding() *HeaderPaddingBuilder { return &HeaderPaddingBuilder{ @@ -341,6 +349,14 @@ func (r *RowConfigBuilder) Formatting() *RowFormattingBuilder { } } +// Merging returns a RowMergingBuilder for configuring cell merging. +func (r *RowConfigBuilder) Merging() *RowMergingBuilder { + return &RowMergingBuilder{ + parent: r, + config: &r.config.Merging, + } +} + // Padding returns a RowPaddingBuilder for row padding func (r *RowConfigBuilder) Padding() *RowPaddingBuilder { return &RowPaddingBuilder{ @@ -397,6 +413,14 @@ func (f *FooterConfigBuilder) Formatting() *FooterFormattingBuilder { } } +// Merging returns a FooterMergingBuilder for configuring cell merging. +func (f *FooterConfigBuilder) Merging() *FooterMergingBuilder { + return &FooterMergingBuilder{ + parent: f, + config: &f.config.Merging, + } +} + // Padding returns a FooterPaddingBuilder for footer padding func (f *FooterConfigBuilder) Padding() *FooterPaddingBuilder { return &FooterPaddingBuilder{ @@ -478,9 +502,10 @@ func (hf *HeaderFormattingBuilder) WithAutoWrap(autoWrap int) *HeaderFormattingB return hf } -// WithMergeMode sets merge mode +// Deprecated: Use .CellMerging().WithMode(...) instead. This method will be removed in a future version. func (hf *HeaderFormattingBuilder) WithMergeMode(mergeMode int) *HeaderFormattingBuilder { if mergeMode >= tw.MergeNone && mergeMode <= tw.MergeHierarchical { + hf.parent.config.Merging.Mode = mergeMode hf.config.MergeMode = mergeMode } return hf @@ -512,9 +537,10 @@ func (rf *RowFormattingBuilder) WithAutoWrap(autoWrap int) *RowFormattingBuilder return rf } -// WithMergeMode sets merge mode +// Deprecated: Use .CellMerging().WithMode(...) instead. This method will be removed in a future version. func (rf *RowFormattingBuilder) WithMergeMode(mergeMode int) *RowFormattingBuilder { if mergeMode >= tw.MergeNone && mergeMode <= tw.MergeHierarchical { + rf.parent.config.Merging.Mode = mergeMode rf.config.MergeMode = mergeMode } return rf @@ -546,14 +572,117 @@ func (ff *FooterFormattingBuilder) WithAutoWrap(autoWrap int) *FooterFormattingB return ff } -// WithMergeMode sets merge mode +// Deprecated: Use .CellMerging().WithMode(...) instead. This method will be removed in a future version. func (ff *FooterFormattingBuilder) WithMergeMode(mergeMode int) *FooterFormattingBuilder { if mergeMode >= tw.MergeNone && mergeMode <= tw.MergeHierarchical { + ff.parent.config.Merging.Mode = mergeMode ff.config.MergeMode = mergeMode } return ff } +// HeaderMergingBuilder configures header cell merging +type HeaderMergingBuilder struct { + parent *HeaderConfigBuilder + config *tw.CellMerging +} + +// Build returns the parent HeaderConfigBuilder. +func (hm *HeaderMergingBuilder) Build() *HeaderConfigBuilder { + return hm.parent +} + +// WithMode sets the merge mode (e.g., tw.MergeHorizontal). +func (hm *HeaderMergingBuilder) WithMode(mode int) *HeaderMergingBuilder { + hm.config.Mode = mode + // Also set the deprecated field for backward compatibility + hm.parent.config.Formatting.MergeMode = mode + return hm +} + +// ByColumnIndex sets specific columns to be merged by their index. +// If not called, merging applies to all columns. +func (hm *HeaderMergingBuilder) ByColumnIndex(indices []int) *HeaderMergingBuilder { + if len(indices) == 0 { + hm.config.ByColumnIndex = nil // nil means apply to all + } else { + mapper := tw.NewMapper[int, bool]() + for _, idx := range indices { + mapper.Set(idx, true) + } + hm.config.ByColumnIndex = mapper + } + return hm +} + +// RowMergingBuilder configures row cell merging +type RowMergingBuilder struct { + parent *RowConfigBuilder + config *tw.CellMerging +} + +// Build returns the parent RowConfigBuilder. +func (rm *RowMergingBuilder) Build() *RowConfigBuilder { + return rm.parent +} + +// WithMode sets the merge mode (e.g., tw.MergeVertical, tw.MergeHierarchical). +func (rm *RowMergingBuilder) WithMode(mode int) *RowMergingBuilder { + rm.config.Mode = mode + // Also set the deprecated field for backward compatibility + rm.parent.config.Formatting.MergeMode = mode + return rm +} + +// ByColumnIndex sets specific columns to be merged by their index. +// If not called, merging applies to all columns. +func (rm *RowMergingBuilder) ByColumnIndex(indices []int) *RowMergingBuilder { + if len(indices) == 0 { + rm.config.ByColumnIndex = nil // nil means apply to all + } else { + mapper := tw.NewMapper[int, bool]() + for _, idx := range indices { + mapper.Set(idx, true) + } + rm.config.ByColumnIndex = mapper + } + return rm +} + +// FooterMergingBuilder configures footer cell merging +type FooterMergingBuilder struct { + parent *FooterConfigBuilder + config *tw.CellMerging +} + +// Build returns the parent FooterConfigBuilder. +func (fm *FooterMergingBuilder) Build() *FooterConfigBuilder { + return fm.parent +} + +// WithMode sets the merge mode (e.g., tw.MergeHorizontal). +func (fm *FooterMergingBuilder) WithMode(mode int) *FooterMergingBuilder { + fm.config.Mode = mode + // Also set the deprecated field for backward compatibility + fm.parent.config.Formatting.MergeMode = mode + return fm +} + +// ByColumnIndex sets specific columns to be merged by their index. +// If not called, merging applies to all columns. +func (fm *FooterMergingBuilder) ByColumnIndex(indices []int) *FooterMergingBuilder { + if len(indices) == 0 { + fm.config.ByColumnIndex = nil // nil means apply to all + } else { + mapper := tw.NewMapper[int, bool]() + for _, idx := range indices { + mapper.Set(idx, true) + } + fm.config.ByColumnIndex = mapper + } + return fm +} + // HeaderPaddingBuilder configures header padding type HeaderPaddingBuilder struct { parent *HeaderConfigBuilder diff --git a/vendor/github.com/olekukonko/tablewriter/new.txt b/vendor/github.com/olekukonko/tablewriter/new.txt new file mode 100644 index 000000000..46791ad1a --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/new.txt @@ -0,0 +1,248 @@ +PASS +ok github.com/olekukonko/tablewriter 0.284s +? github.com/olekukonko/tablewriter/cmd/csv2table [no test files] +goos: darwin +goarch: arm64 +pkg: github.com/olekukonko/tablewriter/pkg/twwarp +cpu: Apple M2 +BenchmarkWrapString-8 10030 114909 ns/op 87.40 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112188 ns/op 89.52 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 113708 ns/op 88.32 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 113233 ns/op 88.69 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112575 ns/op 89.21 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112604 ns/op 89.19 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113731 ns/op 88.30 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113511 ns/op 88.48 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113575 ns/op 88.43 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113746 ns/op 88.29 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113473 ns/op 88.51 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 114487 ns/op 87.72 MB/s 54024 B/op 51 allocs/op +PASS +ok github.com/olekukonko/tablewriter/pkg/twwarp 14.612s +goos: darwin +goarch: arm64 +pkg: github.com/olekukonko/tablewriter/pkg/twwidth +cpu: Apple M2 +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 264374 4533 ns/op 119.12 MB/s 1178 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 265746 4514 ns/op 119.62 MB/s 1177 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 263538 4509 ns/op 119.75 MB/s 1178 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 266173 4510 ns/op 119.72 MB/s 1180 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 265224 4676 ns/op 115.48 MB/s 1180 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 265696 4508 ns/op 119.80 MB/s 1177 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 251047 4859 ns/op 111.13 MB/s 1867 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 1000000 3945 ns/op 136.89 MB/s 1584 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3504475 3729 ns/op 144.81 MB/s 1474 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3664098 635.4 ns/op 849.84 MB/s 670 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3818680 588.6 ns/op 917.47 MB/s 667 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3761966 348.7 ns/op 1548.66 MB/s 583 B/op 1 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 49524442 23.54 ns/op 22938.55 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51765230 23.25 ns/op 23221.81 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51881983 23.83 ns/op 22664.79 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51665586 23.20 ns/op 23272.39 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51782077 23.23 ns/op 23250.20 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51498277 23.21 ns/op 23267.21 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 263586 4520 ns/op 119.47 MB/s 1183 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 265484 4519 ns/op 119.49 MB/s 1182 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 265218 4514 ns/op 119.64 MB/s 1181 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 265957 4515 ns/op 119.60 MB/s 1184 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 265981 4518 ns/op 119.52 MB/s 1183 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 265028 4574 ns/op 118.06 MB/s 1184 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 251682 4853 ns/op 111.27 MB/s 1869 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 1000000 3893 ns/op 138.70 MB/s 1583 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3596130 3747 ns/op 144.13 MB/s 1499 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3671358 506.1 ns/op 1066.92 MB/s 628 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3687993 370.6 ns/op 1456.96 MB/s 594 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3672946 358.4 ns/op 1506.88 MB/s 583 B/op 1 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 49266897 23.64 ns/op 22844.78 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 50158659 23.54 ns/op 22938.83 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 50689321 23.45 ns/op 23025.77 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51113672 23.52 ns/op 22954.95 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51489162 23.21 ns/op 23269.51 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51705564 23.16 ns/op 23311.21 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20930 57159 ns/op 35.86 MB/s 1389 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20882 57502 ns/op 35.65 MB/s 1395 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 21103 57730 ns/op 35.51 MB/s 1391 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20889 56615 ns/op 36.21 MB/s 1393 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20808 58303 ns/op 35.16 MB/s 1391 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 21104 56727 ns/op 36.14 MB/s 1387 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 38569 27485 ns/op 74.59 MB/s 3041 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1000000 58061 ns/op 35.31 MB/s 3835 B/op 10 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 2124566 31025 ns/op 66.08 MB/s 3140 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1000000 1607 ns/op 1275.74 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1615826 1224 ns/op 1674.27 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1478348 722.9 ns/op 2835.84 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 23989044 44.26 ns/op 46313.25 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27268802 44.13 ns/op 46454.64 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27292006 44.51 ns/op 46054.40 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 24128786 44.99 ns/op 45569.06 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 26858004 44.09 ns/op 46497.43 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27259458 44.05 ns/op 46538.64 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20671 57887 ns/op 35.41 MB/s 1395 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20966 56795 ns/op 36.09 MB/s 1396 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20708 57092 ns/op 35.91 MB/s 1388 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20882 57917 ns/op 35.40 MB/s 1389 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 21244 58013 ns/op 35.34 MB/s 1393 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20854 58122 ns/op 35.27 MB/s 1396 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 38907 30289 ns/op 67.68 MB/s 3066 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1000000 56603 ns/op 36.22 MB/s 3835 B/op 10 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1949059 29030 ns/op 70.62 MB/s 3084 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1479127 933.7 ns/op 2195.47 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 2335996 11012 ns/op 186.17 MB/s 2548 B/op 3 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 983864 1169 ns/op 1753.75 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27291516 44.18 ns/op 46398.32 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27220657 44.18 ns/op 46402.04 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27059124 44.91 ns/op 45645.46 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 26679783 44.04 ns/op 46551.62 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27244114 44.14 ns/op 46448.19 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27221737 44.61 ns/op 45948.75 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3247359 366.1 ns/op 95.62 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3292773 370.6 ns/op 94.44 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3275070 365.3 ns/op 95.82 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3291489 365.6 ns/op 95.73 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3282121 374.9 ns/op 93.37 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3198205 375.6 ns/op 93.18 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 3092488 419.4 ns/op 83.45 MB/s 152 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6276060 476.4 ns/op 73.46 MB/s 166 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6135336 218.8 ns/op 159.98 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6175833 216.1 ns/op 161.95 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6156606 215.2 ns/op 162.63 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6160923 216.2 ns/op 161.88 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 78655855 15.02 ns/op 2330.76 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 70905223 14.59 ns/op 2398.68 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 82255629 14.49 ns/op 2415.75 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 82383864 14.48 ns/op 2417.21 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 82325931 14.49 ns/op 2415.73 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 82426311 14.66 ns/op 2386.73 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3265182 365.8 ns/op 95.68 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3275419 366.3 ns/op 95.56 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3057087 375.3 ns/op 93.26 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3239217 372.6 ns/op 93.94 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3246429 367.3 ns/op 95.29 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 3252763 365.3 ns/op 95.80 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 2986195 396.4 ns/op 88.30 MB/s 142 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6487422 493.6 ns/op 70.90 MB/s 168 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6261225 216.1 ns/op 161.99 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6154988 210.7 ns/op 166.13 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6308702 213.8 ns/op 163.69 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6120438 216.0 ns/op 162.05 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82184980 14.47 ns/op 2419.17 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 78985473 14.51 ns/op 2412.95 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82368319 14.47 ns/op 2419.30 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82366668 14.47 ns/op 2418.96 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82104614 14.53 ns/op 2409.59 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82399426 14.53 ns/op 2409.13 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1020 ns/op 59.80 MB/s 186 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1010 ns/op 60.40 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1007 ns/op 60.55 MB/s 186 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1006 ns/op 60.63 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1006 ns/op 60.65 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1006 ns/op 60.63 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 1000000 1334 ns/op 45.74 MB/s 436 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6892693 1204 ns/op 50.65 MB/s 321 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6433399 221.7 ns/op 275.14 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6323521 221.2 ns/op 275.73 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6000822 218.5 ns/op 279.15 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6329578 220.3 ns/op 276.90 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 80806719 14.65 ns/op 4163.13 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 82397774 14.63 ns/op 4169.11 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 82794307 14.76 ns/op 4134.15 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 82610730 14.59 ns/op 4180.13 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 82639170 14.58 ns/op 4183.56 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 82560049 14.45 ns/op 4222.53 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1006 ns/op 60.61 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1012 ns/op 60.29 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1030 ns/op 59.25 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1005 ns/op 60.68 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1006 ns/op 60.64 MB/s 186 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 1000000 1012 ns/op 60.26 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 1000000 1361 ns/op 44.84 MB/s 436 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6967185 1216 ns/op 50.17 MB/s 323 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6413974 219.1 ns/op 278.46 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6381684 216.9 ns/op 281.27 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6383749 216.2 ns/op 282.14 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6360810 217.3 ns/op 280.75 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 81573231 14.53 ns/op 4197.28 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82780268 14.47 ns/op 4215.84 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82845276 14.48 ns/op 4212.74 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82545850 14.51 ns/op 4203.96 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82419704 14.49 ns/op 4209.69 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82121707 14.50 ns/op 4206.82 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3552715 336.1 ns/op 178.50 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3551234 335.0 ns/op 179.09 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3588946 338.9 ns/op 177.05 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3577424 338.5 ns/op 177.25 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3554505 335.4 ns/op 178.89 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 3575703 336.2 ns/op 178.46 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 2990224 412.6 ns/op 145.42 MB/s 207 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 6066997 484.0 ns/op 123.95 MB/s 232 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5743347 224.3 ns/op 267.49 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5870154 220.6 ns/op 271.92 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5880489 228.0 ns/op 263.14 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5660132 226.8 ns/op 264.52 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 81708613 14.54 ns/op 4126.40 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 79903231 14.65 ns/op 4094.56 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 80580853 14.62 ns/op 4103.14 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 82036092 14.73 ns/op 4073.52 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 83622964 14.49 ns/op 4139.65 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 82724623 14.53 ns/op 4129.78 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3463408 349.4 ns/op 171.71 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3245782 350.0 ns/op 171.41 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3461160 348.3 ns/op 172.28 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3453544 349.1 ns/op 171.87 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3443858 347.0 ns/op 172.92 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 3469286 347.4 ns/op 172.72 MB/s 146 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 3050086 428.5 ns/op 140.04 MB/s 213 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5927800 476.0 ns/op 126.05 MB/s 230 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5852149 223.0 ns/op 269.05 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5721747 224.9 ns/op 266.80 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5751147 225.7 ns/op 265.84 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5893626 225.9 ns/op 265.55 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81984477 14.52 ns/op 4132.81 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 79537578 14.59 ns/op 4112.59 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 82339353 14.56 ns/op 4119.49 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 82286889 14.92 ns/op 4020.68 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 82166224 14.53 ns/op 4129.14 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 83084276 14.52 ns/op 4131.45 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1221180 982.5 ns/op 88.55 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1210902 983.5 ns/op 88.46 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1223528 989.3 ns/op 87.94 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1212517 984.1 ns/op 88.40 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1224182 983.5 ns/op 88.46 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 1000000 1007 ns/op 86.36 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 999058 1364 ns/op 63.76 MB/s 603 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6682279 1218 ns/op 71.40 MB/s 465 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6339568 220.6 ns/op 394.46 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6226921 222.3 ns/op 391.34 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6264051 221.1 ns/op 393.47 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6234439 222.4 ns/op 391.23 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 75337251 15.64 ns/op 5562.01 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76826634 15.76 ns/op 5521.54 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76836674 15.79 ns/op 5508.81 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76840162 15.64 ns/op 5564.05 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76694060 15.60 ns/op 5577.81 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76737175 15.62 ns/op 5571.56 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1202406 1012 ns/op 85.93 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1000000 1000 ns/op 86.99 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1208559 993.7 ns/op 87.55 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1209415 990.9 ns/op 87.80 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1206118 1020 ns/op 85.33 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 1211994 990.6 ns/op 87.82 MB/s 194 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 1000000 1363 ns/op 63.84 MB/s 603 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6504960 1214 ns/op 71.65 MB/s 465 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6349030 220.2 ns/op 395.18 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6183368 220.3 ns/op 394.99 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6240484 220.6 ns/op 394.32 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6280713 222.0 ns/op 391.95 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 69630140 15.77 ns/op 5517.31 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76043014 15.65 ns/op 5559.61 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76239080 15.63 ns/op 5567.94 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 75864739 15.88 ns/op 5479.13 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 71286422 15.74 ns/op 5527.29 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 75704404 15.71 ns/op 5536.58 MB/s 0 B/op 0 allocs/op +PASS +ok github.com/olekukonko/tablewriter/pkg/twwidth 659.150s +? github.com/olekukonko/tablewriter/renderer [no test files] +PASS +ok github.com/olekukonko/tablewriter/tests 3.025s +PASS +ok github.com/olekukonko/tablewriter/tw 0.283s diff --git a/vendor/github.com/olekukonko/tablewriter/old.txt b/vendor/github.com/olekukonko/tablewriter/old.txt new file mode 100644 index 000000000..f9916ea0f --- /dev/null +++ b/vendor/github.com/olekukonko/tablewriter/old.txt @@ -0,0 +1,248 @@ +PASS +ok github.com/olekukonko/tablewriter 0.819s +? github.com/olekukonko/tablewriter/cmd/csv2table [no test files] +goos: darwin +goarch: arm64 +pkg: github.com/olekukonko/tablewriter/pkg/twwarp +cpu: Apple M2 +BenchmarkWrapString-8 10630 111320 ns/op 90.22 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112981 ns/op 88.89 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 113419 ns/op 88.55 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112794 ns/op 89.04 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112400 ns/op 89.35 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapString-8 10000 112767 ns/op 89.06 MB/s 48488 B/op 33 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 115098 ns/op 87.26 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113343 ns/op 88.61 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113702 ns/op 88.33 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113547 ns/op 88.45 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113016 ns/op 88.86 MB/s 54024 B/op 51 allocs/op +BenchmarkWrapStringWithSpaces-8 10000 113206 ns/op 88.71 MB/s 54024 B/op 51 allocs/op +PASS +ok github.com/olekukonko/tablewriter/pkg/twwarp 15.179s +goos: darwin +goarch: arm64 +pkg: github.com/olekukonko/tablewriter/pkg/twwidth +cpu: Apple M2 +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 2953855 387.1 ns/op 90.40 MB/s 112 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3095179 387.8 ns/op 90.24 MB/s 112 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3096141 391.0 ns/op 89.51 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3090711 387.2 ns/op 90.40 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3066110 387.4 ns/op 90.35 MB/s 112 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_NoCache-8 3098689 389.2 ns/op 89.92 MB/s 112 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 3125685 440.9 ns/op 79.39 MB/s 159 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6477175 496.2 ns/op 70.53 MB/s 165 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6019939 217.7 ns/op 160.79 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6231590 219.2 ns/op 159.67 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6245622 216.2 ns/op 161.90 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheMiss-8 6109658 218.8 ns/op 159.95 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 80977806 14.73 ns/op 2375.87 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 80972566 14.76 ns/op 2371.06 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 81432532 14.90 ns/op 2348.78 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 80644483 14.85 ns/op 2357.10 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 81361905 14.79 ns/op 2365.80 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAfalse_CacheHit-8 81612987 14.78 ns/op 2368.60 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1777732 682.2 ns/op 51.30 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1778122 672.9 ns/op 52.01 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1779956 674.0 ns/op 51.93 MB/s 112 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1773282 678.7 ns/op 51.57 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1783092 680.2 ns/op 51.46 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_NoCache-8 1780448 674.0 ns/op 51.93 MB/s 113 B/op 3 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 1000000 1027 ns/op 34.08 MB/s 333 B/op 4 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6891168 958.3 ns/op 36.52 MB/s 227 B/op 4 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6165972 211.7 ns/op 165.30 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6370098 217.4 ns/op 161.02 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6193920 214.8 ns/op 162.92 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheMiss-8 6190384 209.4 ns/op 167.16 MB/s 55 B/op 1 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 79747688 14.75 ns/op 2372.71 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 79607492 14.75 ns/op 2372.90 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 81634501 14.73 ns/op 2376.30 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 81644916 14.70 ns/op 2381.26 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 82505884 14.70 ns/op 2380.77 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/SimpleASCII_EAtrue_CacheHit-8 81840265 14.70 ns/op 2380.34 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1053 ns/op 57.95 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1028 ns/op 59.34 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1029 ns/op 59.27 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1025 ns/op 59.49 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1026 ns/op 59.48 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_NoCache-8 1000000 1025 ns/op 59.54 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 1000000 1352 ns/op 45.13 MB/s 437 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6619118 1219 ns/op 50.06 MB/s 320 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6486976 221.2 ns/op 275.81 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6508150 217.8 ns/op 280.07 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6487533 217.4 ns/op 280.56 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheMiss-8 6243558 216.4 ns/op 281.93 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 80787679 14.90 ns/op 4093.19 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 81640521 14.89 ns/op 4097.92 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 81596338 14.71 ns/op 4145.47 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 81950889 14.84 ns/op 4111.86 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 79321578 14.78 ns/op 4126.88 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAfalse_CacheHit-8 81880058 14.75 ns/op 4134.44 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 906406 1313 ns/op 46.44 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 917503 1313 ns/op 46.46 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 915308 1312 ns/op 46.49 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 918404 1312 ns/op 46.51 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 892551 1338 ns/op 45.58 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_NoCache-8 915020 1333 ns/op 45.76 MB/s 185 B/op 6 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 791368 1633 ns/op 37.36 MB/s 374 B/op 7 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 2314653 1064 ns/op 57.34 MB/s 265 B/op 5 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6531552 1198 ns/op 50.94 MB/s 258 B/op 5 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6629763 242.5 ns/op 251.57 MB/s 90 B/op 2 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6388215 219.1 ns/op 278.36 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheMiss-8 6472197 218.6 ns/op 279.09 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 80704821 14.76 ns/op 4132.33 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82628028 14.70 ns/op 4149.56 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 81870517 14.70 ns/op 4148.97 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 81944124 14.99 ns/op 4068.84 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 81918950 14.70 ns/op 4150.75 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/ASCIIWithANSI_EAtrue_CacheHit-8 82547270 14.91 ns/op 4092.20 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1604370 749.9 ns/op 80.02 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1610148 749.7 ns/op 80.03 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1585026 744.8 ns/op 80.56 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1615032 749.9 ns/op 80.01 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1614980 743.3 ns/op 80.72 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_NoCache-8 1609586 741.8 ns/op 80.88 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 1000000 1095 ns/op 54.77 MB/s 428 B/op 4 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 6214893 995.6 ns/op 60.26 MB/s 316 B/op 4 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5702408 224.5 ns/op 267.21 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5712139 220.2 ns/op 272.50 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5783916 228.2 ns/op 262.91 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheMiss-8 5713358 224.0 ns/op 267.91 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 78757815 14.92 ns/op 4020.51 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 81419875 14.79 ns/op 4057.15 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 81656493 14.75 ns/op 4068.12 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 81522430 14.73 ns/op 4073.37 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 81887037 14.70 ns/op 4080.93 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAfalse_CacheHit-8 82019505 14.72 ns/op 4074.99 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1241600 965.5 ns/op 62.14 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1243646 964.8 ns/op 62.19 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1243516 968.1 ns/op 61.98 MB/s 144 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1241917 965.3 ns/op 62.16 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1242903 985.0 ns/op 60.92 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_NoCache-8 1223456 964.3 ns/op 62.22 MB/s 145 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 1000000 1378 ns/op 43.55 MB/s 428 B/op 4 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 6265657 1229 ns/op 48.84 MB/s 316 B/op 4 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5960497 224.3 ns/op 267.52 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5961004 222.6 ns/op 269.52 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5772004 226.5 ns/op 264.87 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheMiss-8 5766748 223.5 ns/op 268.51 MB/s 87 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 78664455 14.76 ns/op 4063.92 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81305858 14.71 ns/op 4079.19 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81626406 14.71 ns/op 4078.32 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81168830 14.71 ns/op 4077.52 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81860040 14.72 ns/op 4075.37 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsian_EAtrue_CacheHit-8 81093633 14.88 ns/op 4031.15 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 837949 1397 ns/op 62.29 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 869082 1380 ns/op 63.04 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 864015 1377 ns/op 63.18 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 873742 1374 ns/op 63.33 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 875703 1375 ns/op 63.27 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_NoCache-8 866865 1375 ns/op 63.26 MB/s 194 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 772100 1709 ns/op 50.91 MB/s 543 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 2127564 1046 ns/op 83.14 MB/s 361 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6476034 1274 ns/op 68.30 MB/s 381 B/op 6 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6401709 221.3 ns/op 393.18 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6368766 220.2 ns/op 395.14 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheMiss-8 6404850 220.6 ns/op 394.34 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 74606566 15.83 ns/op 5494.39 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76326774 15.72 ns/op 5536.01 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76140116 15.74 ns/op 5525.94 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76340330 15.69 ns/op 5544.89 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76240900 15.69 ns/op 5544.81 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAfalse_CacheHit-8 76301294 15.73 ns/op 5531.49 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 753624 1592 ns/op 54.64 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 757292 1599 ns/op 54.42 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 758196 1588 ns/op 54.79 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 753902 1586 ns/op 54.85 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 758770 1589 ns/op 54.74 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_NoCache-8 757748 1590 ns/op 54.71 MB/s 193 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 653979 1985 ns/op 43.82 MB/s 561 B/op 7 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 2344717 731.5 ns/op 118.93 MB/s 263 B/op 3 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6440574 1420 ns/op 61.26 MB/s 369 B/op 5 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6506366 238.2 ns/op 365.22 MB/s 107 B/op 2 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6504939 220.8 ns/op 394.05 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheMiss-8 6399746 221.0 ns/op 393.66 MB/s 103 B/op 1 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 75646941 15.95 ns/op 5453.57 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 75406885 15.73 ns/op 5532.42 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76186243 15.69 ns/op 5545.76 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76350855 15.76 ns/op 5521.29 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76240896 15.70 ns/op 5542.36 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/EastAsianWithANSI_EAtrue_CacheHit-8 76404126 15.90 ns/op 5471.17 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 241440 4945 ns/op 109.19 MB/s 1181 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 245013 5050 ns/op 106.94 MB/s 1180 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 245098 4887 ns/op 110.49 MB/s 1177 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 244785 4971 ns/op 108.62 MB/s 1179 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 245007 4880 ns/op 110.66 MB/s 1182 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_NoCache-8 245986 4878 ns/op 110.71 MB/s 1181 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 232534 5203 ns/op 103.78 MB/s 1845 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 1000000 4309 ns/op 125.31 MB/s 1613 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3491629 4013 ns/op 134.57 MB/s 1471 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3670467 847.5 ns/op 637.15 MB/s 680 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3669694 385.0 ns/op 1402.66 MB/s 583 B/op 1 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheMiss-8 3242532 356.5 ns/op 1514.63 MB/s 583 B/op 1 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 50391319 23.77 ns/op 22714.54 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51225590 23.32 ns/op 23159.25 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 51732408 23.74 ns/op 22751.21 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 46074986 24.16 ns/op 22352.67 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 43649127 24.43 ns/op 22104.61 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAfalse_CacheHit-8 49954903 23.53 ns/op 22952.45 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 127574 9378 ns/op 57.58 MB/s 1180 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 128386 9386 ns/op 57.53 MB/s 1183 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 128604 9280 ns/op 58.19 MB/s 1178 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 129218 9264 ns/op 58.29 MB/s 1179 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 129030 9261 ns/op 58.31 MB/s 1179 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_NoCache-8 129080 9266 ns/op 58.28 MB/s 1180 B/op 3 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 123823 9282 ns/op 58.18 MB/s 1817 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 1000000 8943 ns/op 60.38 MB/s 1754 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3532728 7337 ns/op 73.60 MB/s 1481 B/op 4 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3610767 705.9 ns/op 764.94 MB/s 626 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3502867 387.5 ns/op 1393.73 MB/s 583 B/op 1 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheMiss-8 3706471 680.7 ns/op 793.25 MB/s 640 B/op 2 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51185895 24.01 ns/op 22492.97 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51442992 23.44 ns/op 23041.30 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 47312392 23.56 ns/op 22917.72 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51727110 23.33 ns/op 23144.01 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51212746 23.62 ns/op 22862.18 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongSimpleASCII_EAtrue_CacheHit-8 51598200 23.23 ns/op 23247.62 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 21105 57258 ns/op 35.80 MB/s 1389 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20656 57558 ns/op 35.62 MB/s 1386 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 21045 57257 ns/op 35.80 MB/s 1386 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20884 57463 ns/op 35.68 MB/s 1391 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 20984 56898 ns/op 36.03 MB/s 1388 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_NoCache-8 21164 57796 ns/op 35.47 MB/s 1388 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 103934 31906 ns/op 64.25 MB/s 3143 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1000000 52097 ns/op 39.35 MB/s 3737 B/op 10 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1298925 14140 ns/op 144.98 MB/s 2637 B/op 4 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1000000 1288 ns/op 1592.17 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 2546826 30224 ns/op 67.83 MB/s 3071 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheMiss-8 1000000 8376 ns/op 244.74 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 25786026 44.71 ns/op 45849.62 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27173578 44.15 ns/op 46427.72 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27221428 44.54 ns/op 46030.74 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27213686 44.07 ns/op 46519.79 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27233990 44.27 ns/op 46310.26 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAfalse_CacheHit-8 27164018 44.12 ns/op 46460.92 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 19785 60051 ns/op 34.14 MB/s 1386 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 20198 60161 ns/op 34.08 MB/s 1391 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 19585 60345 ns/op 33.97 MB/s 1390 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 19956 61714 ns/op 33.22 MB/s 1391 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 19554 61682 ns/op 33.24 MB/s 1388 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_NoCache-8 19830 60050 ns/op 34.14 MB/s 1393 B/op 9 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 38818 29507 ns/op 69.48 MB/s 3059 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1000000 58539 ns/op 35.02 MB/s 3835 B/op 10 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 2186653 33757 ns/op 60.73 MB/s 3157 B/op 6 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1000000 1283 ns/op 1597.72 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 1653430 1256 ns/op 1632.67 MB/s 2311 B/op 1 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheMiss-8 2195628 2716 ns/op 754.79 MB/s 2317 B/op 2 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 26531894 44.76 ns/op 45801.05 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 26634384 44.68 ns/op 45878.57 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27184633 44.97 ns/op 45583.96 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27011893 44.46 ns/op 46104.62 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27183812 44.09 ns/op 46498.94 MB/s 0 B/op 0 allocs/op +BenchmarkWidthFunction/LongASCIIWithANSI_EAtrue_CacheHit-8 27269318 44.17 ns/op 46406.38 MB/s 0 B/op 0 allocs/op +PASS +ok github.com/olekukonko/tablewriter/pkg/twwidth 724.296s +? github.com/olekukonko/tablewriter/renderer [no test files] +PASS +ok github.com/olekukonko/tablewriter/tests 2.959s +PASS +ok github.com/olekukonko/tablewriter/tw 0.270s diff --git a/vendor/github.com/olekukonko/tablewriter/option.go b/vendor/github.com/olekukonko/tablewriter/option.go index 2c1f3a2c1..480553f94 100644 --- a/vendor/github.com/olekukonko/tablewriter/option.go +++ b/vendor/github.com/olekukonko/tablewriter/option.go @@ -122,13 +122,14 @@ func WithFooterAlignmentConfig(alignment tw.CellAlignment) Option { } } -// WithFooterMergeMode sets the merge mode for footer cells. -// Invalid merge modes are ignored, and the change is logged if debugging is enabled. +// Deprecated: Use a ConfigBuilder with .Footer().CellMerging().WithMode(...) instead. +// This option will be removed in a future version. func WithFooterMergeMode(mergeMode int) Option { return func(target *Table) { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return } + target.config.Footer.Merging.Mode = mergeMode target.config.Footer.Formatting.MergeMode = mergeMode if target.logger != nil { target.logger.Debugf("Option: WithFooterMergeMode applied to Table: %v", mergeMode) @@ -232,13 +233,14 @@ func WithHeaderAutoWrap(wrap int) Option { } } -// WithHeaderMergeMode sets the merge mode for header cells. -// Invalid merge modes are ignored, and the change is logged if debugging is enabled. +// Deprecated: Use a ConfigBuilder with .Header().CellMerging().WithMode(...) instead. +// This option will be removed in a future version. func WithHeaderMergeMode(mergeMode int) Option { return func(target *Table) { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return } + target.config.Header.Merging.Mode = mergeMode target.config.Header.Formatting.MergeMode = mergeMode if target.logger != nil { target.logger.Debugf("Option: WithHeaderMergeMode applied to Table: %v", mergeMode) @@ -321,13 +323,14 @@ func WithRowAutoWrap(wrap int) Option { } } -// WithRowMergeMode sets the merge mode for row cells. -// Invalid merge modes are ignored, and the change is logged if debugging is enabled. +// Deprecated: Use a ConfigBuilder with .Row().CellMerging().WithMode(...) instead. +// This option will be removed in a future version. func WithRowMergeMode(mergeMode int) Option { return func(target *Table) { if mergeMode < tw.MergeNone || mergeMode > tw.MergeHierarchical { return } + target.config.Row.Merging.Mode = mergeMode target.config.Row.Formatting.MergeMode = mergeMode if target.logger != nil { target.logger.Debugf("Option: WithRowMergeMode applied to Table: %v", mergeMode) @@ -644,9 +647,9 @@ func WithEastAsian(enable bool) Option { // The runewidth.Condition object allows for more fine-grained control over how rune widths // are determined, beyond just toggling EastAsianWidth. This could include settings for // ambiguous width characters or other future properties of runewidth.Condition. -func WithCondition(condition *runewidth.Condition) Option { +func WithCondition(cond *runewidth.Condition) Option { return func(target *Table) { - twwidth.SetCondition(condition) + twwidth.SetCondition(cond) } } @@ -706,6 +709,9 @@ func defaultConfig() Config { AutoFormat: tw.On, MergeMode: tw.MergeNone, }, + Merging: tw.CellMerging{ + Mode: tw.MergeNone, + }, Padding: tw.CellPadding{ Global: tw.PaddingDefault, }, @@ -720,6 +726,9 @@ func defaultConfig() Config { AutoFormat: tw.Off, MergeMode: tw.MergeNone, }, + Merging: tw.CellMerging{ + Mode: tw.MergeNone, + }, Padding: tw.CellPadding{ Global: tw.PaddingDefault, }, @@ -734,6 +743,9 @@ func defaultConfig() Config { AutoFormat: tw.Off, MergeMode: tw.MergeNone, }, + Merging: tw.CellMerging{ + Mode: tw.MergeNone, + }, Padding: tw.CellPadding{ Global: tw.PaddingDefault, }, @@ -772,10 +784,20 @@ func mergeCellConfig(dst, src tw.CellConfig) tw.CellConfig { if src.ColMaxWidths.Global != 0 { dst.ColMaxWidths.Global = src.ColMaxWidths.Global } - if src.Formatting.MergeMode != 0 { + + // Handle merging of the new CellMerging struct and the deprecated MergeMode + if src.Merging.Mode != 0 { + dst.Merging.Mode = src.Merging.Mode + dst.Formatting.MergeMode = src.Merging.Mode + } else if src.Formatting.MergeMode != 0 { + dst.Merging.Mode = src.Formatting.MergeMode dst.Formatting.MergeMode = src.Formatting.MergeMode } + if src.Merging.ByColumnIndex != nil { + dst.Merging.ByColumnIndex = src.Merging.ByColumnIndex.Clone() + } + dst.Formatting.AutoFormat = src.Formatting.AutoFormat if src.Padding.Global.Paddable() { diff --git a/vendor/github.com/olekukonko/tablewriter/pkg/twwarp/wrap.go b/vendor/github.com/olekukonko/tablewriter/pkg/twwarp/wrap.go index a577c1eb1..5977aac26 100644 --- a/vendor/github.com/olekukonko/tablewriter/pkg/twwarp/wrap.go +++ b/vendor/github.com/olekukonko/tablewriter/pkg/twwarp/wrap.go @@ -12,8 +12,8 @@ import ( "strings" "unicode" + "github.com/clipperhouse/uax29/v2/graphemes" "github.com/olekukonko/tablewriter/pkg/twwidth" // IMPORT YOUR NEW PACKAGE - "github.com/rivo/uniseg" // "github.com/mattn/go-runewidth" // This can be removed if all direct uses are gone ) @@ -153,9 +153,9 @@ func stringToDisplayWidth(s string, targetWidth int) (substring string, actualWi var currentWidth int var endIndex int // Tracks the byte index in the original string - g := uniseg.NewGraphemes(s) + g := graphemes.FromString(s) for g.Next() { - grapheme := g.Str() + grapheme := g.Value() // graphemeWidth := runewidth.StringWidth(grapheme) // OLD graphemeWidth := twwidth.Width(grapheme) // NEW: Use twdw.Width @@ -164,8 +164,7 @@ func stringToDisplayWidth(s string, targetWidth int) (substring string, actualWi } currentWidth += graphemeWidth - _, e := g.Positions() - endIndex = e + endIndex = g.End() } return s[:endIndex], currentWidth } diff --git a/vendor/github.com/olekukonko/tablewriter/pkg/twwidth/width.go b/vendor/github.com/olekukonko/tablewriter/pkg/twwidth/width.go index 3b9634b02..325b91043 100644 --- a/vendor/github.com/olekukonko/tablewriter/pkg/twwidth/width.go +++ b/vendor/github.com/olekukonko/tablewriter/pkg/twwidth/width.go @@ -6,11 +6,12 @@ import ( "strings" "sync" + "github.com/clipperhouse/displaywidth" "github.com/mattn/go-runewidth" ) -// condition holds the global runewidth configuration, including East Asian width settings. -var condition *runewidth.Condition +// globalOptions holds the global displaywidth configuration, including East Asian width settings. +var globalOptions displaywidth.Options // mu protects access to condition and widthCache for thread safety. var mu sync.Mutex @@ -19,10 +20,21 @@ var mu sync.Mutex var ansi = Filter() func init() { - condition = runewidth.NewCondition() + globalOptions = newOptions() widthCache = make(map[cacheKey]int) } +func newOptions() displaywidth.Options { + // go-runewidth has default logic based on env variables and locale, + // we want to keep that compatibility + cond := runewidth.NewCondition() + options := displaywidth.Options{ + EastAsianWidth: cond.EastAsianWidth, + StrictEmojiNeutral: cond.StrictEmojiNeutral, + } + return options +} + // cacheKey is used as a key for memoizing string width results in widthCache. type cacheKey struct { str string // Input string @@ -60,26 +72,42 @@ func Filter() *regexp.Regexp { func SetEastAsian(enable bool) { mu.Lock() defer mu.Unlock() - if condition.EastAsianWidth != enable { - condition.EastAsianWidth = enable + if globalOptions.EastAsianWidth != enable { + globalOptions.EastAsianWidth = enable widthCache = make(map[cacheKey]int) // Clear cache on setting change } } -// SetCondition updates the global runewidth.Condition used for width calculations. -// When the condition is changed, the width cache is cleared. +// IsEastAsian returns the current East Asian width setting. // This function is thread-safe. // // Example: // -// newCond := runewidth.NewCondition() -// newCond.EastAsianWidth = true -// twdw.SetCondition(newCond) -func SetCondition(newCond *runewidth.Condition) { +// if twdw.IsEastAsian() { +// // Handle East Asian width characters +// } +func IsEastAsian() bool { + mu.Lock() + defer mu.Unlock() + return globalOptions.EastAsianWidth +} + +// SetCondition updates the global runewidth.Condition used for width calculations. +// This method is kept for backward compatibility. The condition is converted to +// displaywidth.Options internally for better performance. +func SetCondition(cond *runewidth.Condition) { mu.Lock() defer mu.Unlock() - condition = newCond widthCache = make(map[cacheKey]int) // Clear cache on setting change + globalOptions = conditionToOptions(cond) +} + +// Convert runewidth.Condition to displaywidth.Options +func conditionToOptions(cond *runewidth.Condition) displaywidth.Options { + return displaywidth.Options{ + EastAsianWidth: cond.EastAsianWidth, + StrictEmojiNeutral: cond.StrictEmojiNeutral, + } } // Width calculates the visual width of a string, excluding ANSI escape sequences, @@ -92,19 +120,18 @@ func SetCondition(newCond *runewidth.Condition) { // width := twdw.Width("Hello\x1b[31mWorld") // Returns 10 func Width(str string) int { mu.Lock() - key := cacheKey{str: str, eastAsianWidth: condition.EastAsianWidth} + key := cacheKey{str: str, eastAsianWidth: globalOptions.EastAsianWidth} if w, found := widthCache[key]; found { mu.Unlock() return w } mu.Unlock() - // Use a temporary condition to avoid holding the lock during calculation - tempCond := runewidth.NewCondition() - tempCond.EastAsianWidth = key.eastAsianWidth + options := newOptions() + options.EastAsianWidth = key.eastAsianWidth stripped := ansi.ReplaceAllLiteralString(str, "") - calculatedWidth := tempCond.StringWidth(stripped) + calculatedWidth := options.String(stripped) mu.Lock() widthCache[key] = calculatedWidth @@ -122,14 +149,14 @@ func Width(str string) int { // width := twdw.WidthNoCache("Hello\x1b[31mWorld") // Returns 10 func WidthNoCache(str string) int { mu.Lock() - currentEA := condition.EastAsianWidth + currentEA := globalOptions.EastAsianWidth mu.Unlock() - tempCond := runewidth.NewCondition() - tempCond.EastAsianWidth = currentEA + options := newOptions() + options.EastAsianWidth = currentEA stripped := ansi.ReplaceAllLiteralString(str, "") - return tempCond.StringWidth(stripped) + return options.String(stripped) } // Display calculates the visual width of a string, excluding ANSI escape sequences, @@ -142,7 +169,8 @@ func WidthNoCache(str string) int { // cond := runewidth.NewCondition() // width := twdw.Display(cond, "Hello\x1b[31mWorld") // Returns 10 func Display(cond *runewidth.Condition, str string) int { - return cond.StringWidth(ansi.ReplaceAllLiteralString(str, "")) + options := conditionToOptions(cond) + return options.String(ansi.ReplaceAllLiteralString(str, "")) } // Truncate shortens a string to fit within a specified visual width, optionally @@ -205,7 +233,7 @@ func Truncate(s string, maxWidth int, suffix ...string) string { // Capture the global EastAsianWidth setting once for consistent use mu.Lock() - currentGlobalEastAsianWidth := condition.EastAsianWidth + currentGlobalEastAsianWidth := globalOptions.EastAsianWidth mu.Unlock() // Special case for EastAsian true: if only suffix fits, return suffix. @@ -243,8 +271,8 @@ func Truncate(s string, maxWidth int, suffix ...string) string { inAnsiSequence := false ansiWrittenToContent := false - localRunewidthCond := runewidth.NewCondition() - localRunewidthCond.EastAsianWidth = currentGlobalEastAsianWidth + options := newOptions() + options.EastAsianWidth = currentGlobalEastAsianWidth for _, r := range s { if r == '\x1b' { @@ -278,7 +306,7 @@ func Truncate(s string, maxWidth int, suffix ...string) string { ansiSeqBuf.Reset() } } else { // Normal character - runeDisplayWidth := localRunewidthCond.RuneWidth(r) + runeDisplayWidth := options.Rune(r) if targetContentForIteration == 0 { // No budget for content at all break } diff --git a/vendor/github.com/olekukonko/tablewriter/tablewriter.go b/vendor/github.com/olekukonko/tablewriter/tablewriter.go index b15d15034..affd449cb 100644 --- a/vendor/github.com/olekukonko/tablewriter/tablewriter.go +++ b/vendor/github.com/olekukonko/tablewriter/tablewriter.go @@ -23,7 +23,7 @@ import ( type Table struct { writer io.Writer // Destination for table output counters []tw.Counter // Counters for indices - rows [][][]string // Row data, supporting multi-line cells + rows [][]string // Row data, one slice of strings per logical row headers [][]string // Header content footers [][]string // Footer content headerWidths tw.Mapper[int, int] // Computed widths for header columns @@ -221,13 +221,12 @@ func (t *Table) Append(rows ...interface{}) error { } } - // The rest of the function proceeds as before, converting the data to string lines. - lines, err := t.toStringLines(cellsSource, t.config.Row) + cells, err := t.convertCellsToStrings(cellsSource, t.config.Row) if err != nil { t.logger.Errorf("Append (Batch) failed for cellsSource %v: %v", cellsSource, err) return err } - t.rows = append(t.rows, lines) + t.rows = append(t.rows, cells) t.logger.Debugf("Append (Batch) completed for one row, total rows in table: %d", len(t.rows)) return nil @@ -456,7 +455,7 @@ func (t *Table) Reset() { t.logger.Debug("Reset() called. Clearing table data and render state.") // Clear data slices - t.rows = nil // Or t.rows = make([][][]string, 0) + t.rows = nil // Or t.rows = make([][]string, 0) t.headers = nil // Or t.headers = make([][]string, 0) t.footers = nil // Or t.footers = make([][]string, 0) @@ -556,16 +555,14 @@ func (t *Table) appendSingle(row interface{}) error { t.logger.Debugf("appendSingle: Dispatching to streamAppendRow for row: %v", row) return t.streamAppendRow(row) // Call the streaming render function } - // Existing batch logic: + t.logger.Debugf("appendSingle: Processing for batch mode, row: %v", row) - // toStringLines now uses the new convertCellsToStrings internally, then prepareContent. - // This is fine for batch. - lines, err := t.toStringLines(row, t.config.Row) + cells, err := t.convertCellsToStrings(row, t.config.Row) if err != nil { - t.logger.Debugf("Error in toStringLines (batch mode): %v", err) + t.logger.Debugf("Error in convertCellsToStrings (batch mode): %v", err) return err } - t.rows = append(t.rows, lines) // Add to batch storage + t.rows = append(t.rows, cells) // Add to batch storage t.logger.Debugf("Row appended to batch t.rows, total batch rows: %d", len(t.rows)) return nil } @@ -775,8 +772,8 @@ func (t *Table) maxColumns() int { m = len(t.headers[0]) } for _, row := range t.rows { - if len(row) > 0 && len(row[0]) > m { - m = len(row[0]) + if len(row) > m { + m = len(row) } } if len(t.footers) > 0 && len(t.footers[0]) > m { @@ -811,7 +808,7 @@ func (t *Table) printTopBottomCaption(w io.Writer, actualTableWidth int) { t.logger.Debugf("[printCaption] Empty table, no user caption.Width: Using natural caption width %d.", captionWrapWidth) } else { captionWrapWidth = actualTableWidth - t.logger.Debugf("[printCaption] Non-empty table, no user caption.Width: Using actualTableWidth %d for wrapping.", actualTableWidth) + t.logger.Debugf("[printCaption] Non-empty table, no user caption.Width: Using actualTableWidth %d for wrapping.", captionWrapWidth) } if captionWrapWidth <= 0 { @@ -1066,13 +1063,20 @@ func (t *Table) prepareContexts() (*renderContext, *mergeContext, error) { logger: t.logger, } - isEmpty, visibleCount := t.getEmptyColumnInfo(numOriginalCols) + // Process raw rows into visual, multi-line rows + processedRowLines := make([][][]string, len(t.rows)) + for i, rawRow := range t.rows { + processedRowLines[i] = t.prepareContent(rawRow, t.config.Row) + } + ctx.rowLines = processedRowLines + + isEmpty, visibleCount := t.getEmptyColumnInfo(ctx.rowLines, numOriginalCols) ctx.emptyColumns = isEmpty ctx.visibleColCount = visibleCount mctx := &mergeContext{ headerMerges: make(map[int]tw.MergeState), - rowMerges: make([]map[int]tw.MergeState, len(t.rows)), + rowMerges: make([]map[int]tw.MergeState, len(ctx.rowLines)), footerMerges: make(map[int]tw.MergeState), horzMerges: make(map[tw.Position]map[int]bool), } @@ -1081,7 +1085,6 @@ func (t *Table) prepareContexts() (*renderContext, *mergeContext, error) { } ctx.headerLines = t.headers - ctx.rowLines = t.rows ctx.footerLines = t.footers if err := t.calculateAndNormalizeWidths(ctx); err != nil { @@ -1095,21 +1098,28 @@ func (t *Table) prepareContexts() (*renderContext, *mergeContext, error) { ctx.headerLines = preparedHeaderLines mctx.headerMerges = headerMerges - processedRowLines := make([][][]string, len(ctx.rowLines)) + // Re-process row lines for merges now that widths are known + processedRowLinesWithMerges := make([][][]string, len(ctx.rowLines)) for i, row := range ctx.rowLines { if mctx.rowMerges[i] == nil { mctx.rowMerges[i] = make(map[int]tw.MergeState) } - processedRowLines[i], mctx.rowMerges[i], _ = t.prepareWithMerges(row, t.config.Row, tw.Row) + processedRowLinesWithMerges[i], mctx.rowMerges[i], _ = t.prepareWithMerges(row, t.config.Row, tw.Row) } - ctx.rowLines = processedRowLines + ctx.rowLines = processedRowLinesWithMerges + + t.applyHorizontalMerges(tw.Header, ctx, mctx.headerMerges) - t.applyHorizontalMergeWidths(tw.Header, ctx, mctx.headerMerges) + mergeMode := t.config.Row.Merging.Mode + if mergeMode == 0 { + mergeMode = t.config.Row.Formatting.MergeMode + } - if t.config.Row.Formatting.MergeMode&tw.MergeVertical != 0 { + // Now check against the effective mode + if mergeMode&tw.MergeVertical != 0 { t.applyVerticalMerges(ctx, mctx) } - if t.config.Row.Formatting.MergeMode&tw.MergeHierarchical != 0 { + if mergeMode&tw.MergeHierarchical != 0 { t.applyHierarchicalMerges(ctx, mctx) } @@ -1166,7 +1176,7 @@ func (t *Table) prepareFooter(ctx *renderContext, mctx *mergeContext) { mctx.footerMerges = mergeStates ctx.footerLines = t.footers t.logger.Debugf("Base footer widths (normalized from rows/header): %v", ctx.widths[tw.Footer]) - t.applyHorizontalMergeWidths(tw.Footer, ctx, mctx.footerMerges) + t.applyHorizontalMerges(tw.Footer, ctx, mctx.footerMerges) ctx.footerPrepared = true t.logger.Debugf("Footer preparation completed. Final footer widths: %v", ctx.widths[tw.Footer]) } diff --git a/vendor/github.com/olekukonko/tablewriter/tw/cell.go b/vendor/github.com/olekukonko/tablewriter/tw/cell.go index 47f096241..19f677589 100644 --- a/vendor/github.com/olekukonko/tablewriter/tw/cell.go +++ b/vendor/github.com/olekukonko/tablewriter/tw/cell.go @@ -2,16 +2,31 @@ package tw // CellFormatting holds formatting options for table cells. type CellFormatting struct { - AutoWrap int // Wrapping behavior (e.g., WrapTruncate, WrapNormal) - MergeMode int // Bitmask for merge behavior (e.g., MergeHorizontal, MergeVertical) - - // Changed form bool to State - // See https://github.com/olekukonko/tablewriter/issues/261 + AutoWrap int // Wrapping behavior (e.g., WrapTruncate, WrapNormal) AutoFormat State // Enables automatic formatting (e.g., title case for headers) - // Deprecated: kept for compatibility - // will be removed soon - Alignment Align // Text alignment within the cell (e.g., Left, Right, Center) + // Deprecated: Kept for backward compatibility. Use CellConfig.CellMerging.Mode instead. + // This will be removed in a future version. + MergeMode int + + // Deprecated: Kept for backward compatibility. Use CellConfig.Alignment instead. + // This will be removed in a future version. + Alignment Align +} + +// CellMerging holds the configuration for how cells should be merged. +// This new struct replaces the deprecated MergeMode. +type CellMerging struct { + // Mode is a bitmask specifying the type of merge (e.g., MergeHorizontal, MergeVertical). + Mode int + + // ByColumnIndex specifies which column indices should be considered for merging. + // If the mapper is nil or empty, merging applies to all columns (if Mode is set). + // Otherwise, only columns with an index present as a key will be merged. + ByColumnIndex Mapper[int, bool] + + // ByRowIndex is reserved for future features to specify merging on specific rows. + ByRowIndex Mapper[int, bool] } // CellPadding defines padding settings for table cells. @@ -47,6 +62,7 @@ type CellConfig struct { Filter CellFilter // Function to filter cell content (renamed from Filter Filter) Alignment CellAlignment // Alignment configuration for cells ColMaxWidths CellWidth // Per-column maximum width overrides + Merging CellMerging // Merging holds all configuration related to cell merging. // Deprecated: use Alignment.PerColumn instead. Will be removed in a future version. // will be removed soon diff --git a/vendor/github.com/olekukonko/tablewriter/tw/mapper.go b/vendor/github.com/olekukonko/tablewriter/tw/mapper.go index 058d3589d..1eee9eb7b 100644 --- a/vendor/github.com/olekukonko/tablewriter/tw/mapper.go +++ b/vendor/github.com/olekukonko/tablewriter/tw/mapper.go @@ -210,3 +210,36 @@ func (m Mapper[K, V]) SortedKeys() []K { return keys } + +func NewBoolMapper[K comparable](keys ...K) Mapper[K, bool] { + if len(keys) == 0 { + return nil + } + mapper := NewMapper[K, bool]() + for _, key := range keys { + mapper.Set(key, true) + } + return mapper +} + +func NewIntMapper[K comparable](keys ...K) Mapper[K, int] { + if len(keys) == 0 { + return nil + } + mapper := NewMapper[K, int]() + for _, key := range keys { + mapper.Set(key, 0) + } + return mapper +} + +func NewIdentityMapper[K comparable](keys ...K) Mapper[K, K] { + if len(keys) == 0 { + return nil + } + mapper := NewMapper[K, K]() + for _, key := range keys { + mapper.Set(key, key) + } + return mapper +} diff --git a/vendor/github.com/olekukonko/tablewriter/zoo.go b/vendor/github.com/olekukonko/tablewriter/zoo.go index 4c514e9a2..7ba5ad0de 100644 --- a/vendor/github.com/olekukonko/tablewriter/zoo.go +++ b/vendor/github.com/olekukonko/tablewriter/zoo.go @@ -18,7 +18,23 @@ import ( // Parameters ctx and mctx hold rendering and merge state. // No return value. func (t *Table) applyHierarchicalMerges(ctx *renderContext, mctx *mergeContext) { - ctx.logger.Debug("Applying hierarchical merges (left-to-right vertical flow - snapshot comparison)") + // First, ensure we should even run this logic. + // Check both the new CellMerging struct and the deprecated Formatting field. + mergeMode := t.config.Row.Merging.Mode + if mergeMode == 0 { + mergeMode = t.config.Row.Formatting.MergeMode + } + if !(mergeMode&tw.MergeHierarchical != 0) { + return + } + + mergeColumnMapper := t.config.Row.Merging.ByColumnIndex + if mergeColumnMapper != nil { + ctx.logger.Debugf("Applying hierarchical merges ONLY to specified columns: %v", mergeColumnMapper.Keys()) + } else { + ctx.logger.Debug("Applying hierarchical merges (left-to-right vertical flow - snapshot comparison)") + } + if len(ctx.rowLines) <= 1 { ctx.logger.Debug("Skipping hierarchical merges - less than 2 rows") return @@ -41,6 +57,12 @@ func (t *Table) applyHierarchicalMerges(ctx *renderContext, mctx *mergeContext) leftCellContinuedHierarchical := false for c := 0; c < numCols; c++ { + // If a column map is specified, skip columns that are not in it. + if mergeColumnMapper != nil && !mergeColumnMapper.Has(c) { + leftCellContinuedHierarchical = false // Reset hierarchy tracking + continue + } + if mctx.rowMerges[r] == nil { mctx.rowMerges[r] = make(map[int]tw.MergeState) } @@ -146,15 +168,15 @@ func (t *Table) applyHierarchicalMerges(ctx *renderContext, mctx *mergeContext) ctx.logger.Debug("Hierarchical merge processing completed") } -// applyHorizontalMergeWidths adjusts column widths for horizontal merges. +// applyHorizontalMerges adjusts column widths for horizontal merges. // Parameters include position, ctx for rendering, and mergeStates for merges. // No return value. -func (t *Table) applyHorizontalMergeWidths(position tw.Position, ctx *renderContext, mergeStates map[int]tw.MergeState) { +func (t *Table) applyHorizontalMerges(position tw.Position, ctx *renderContext, mergeStates map[int]tw.MergeState) { if mergeStates == nil { - t.logger.Debugf("applyHorizontalMergeWidths: Skipping %s - no merge states", position) + t.logger.Debugf("applyHorizontalMerges: Skipping %s - no merge states", position) return } - t.logger.Debugf("applyHorizontalMergeWidths: Applying HMerge width recalc for %s", position) + t.logger.Debugf("applyHorizontalMerges: Applying HMerge width recalc for %s", position) numCols := ctx.numCols targetWidthsMap := ctx.widths[position] @@ -211,16 +233,31 @@ func (t *Table) applyHorizontalMergeWidths(position tw.Position, ctx *renderCont } } } - ctx.logger.Debugf("applyHorizontalMergeWidths: Final widths for %s: %v", position, targetWidthsMap) + ctx.logger.Debugf("applyHorizontalMerges: Final widths for %s: %v", position, targetWidthsMap) } // applyVerticalMerges applies vertical merges to row content. // Parameters ctx and mctx hold rendering and merge state. // No return value. func (t *Table) applyVerticalMerges(ctx *renderContext, mctx *mergeContext) { - ctx.logger.Debugf("Applying vertical merges across %d rows", len(ctx.rowLines)) - numCols := ctx.numCols + // First, ensure we should even run this logic. + // Check both the new CellMerging struct and the deprecated Formatting field. + mergeMode := t.config.Row.Merging.Mode + if mergeMode == 0 { + mergeMode = t.config.Row.Formatting.MergeMode + } + if !(mergeMode&tw.MergeVertical != 0) { + return + } + mergeColumnMapper := t.config.Row.Merging.ByColumnIndex + if mergeColumnMapper != nil { + ctx.logger.Debugf("Applying vertical merges ONLY to specified columns: %v", mergeColumnMapper.Keys()) + } else { + ctx.logger.Debugf("Applying vertical merges across %d rows", len(ctx.rowLines)) + } + + numCols := ctx.numCols mergeStartRow := make(map[int]int) mergeStartContent := make(map[int]string) @@ -243,6 +280,11 @@ func (t *Table) applyVerticalMerges(ctx *renderContext, mctx *mergeContext) { currentLineContent := ctx.rowLines[i] for col := 0; col < numCols; col++ { + // If a column map is specified, skip columns that are not in it. + if mergeColumnMapper != nil && !mergeColumnMapper.Has(col) { + continue + } + // Join all lines of the cell to compare full content var currentVal strings.Builder for _, line := range currentLineContent { @@ -579,11 +621,6 @@ func (t *Table) calculateAndNormalizeWidths(ctx *renderContext) error { ctx.logger.Debugf("calculateAndNormalizeWidths: Computing and normalizing widths for %d columns. Compact: %v", ctx.numCols, t.config.Behavior.Compact.Merge.Enabled()) - // Initialize width maps - // t.headerWidths = tw.NewMapper[int, int]() - // t.rowWidths = tw.NewMapper[int, int]() - // t.footerWidths = tw.NewMapper[int, int]() - // Compute content-based widths for each section for _, lines := range ctx.headerLines { t.updateWidths(lines, t.headerWidths, t.config.Header.Padding) @@ -1438,7 +1475,7 @@ func (t *Table) getColMaxWidths(position tw.Position) tw.CellWidth { // getEmptyColumnInfo identifies empty columns in row data. // Parameter numOriginalCols specifies the total column count. // Returns a boolean slice (true for empty) and visible column count. -func (t *Table) getEmptyColumnInfo(numOriginalCols int) (isEmpty []bool, visibleColCount int) { +func (t *Table) getEmptyColumnInfo(processedRows [][][]string, numOriginalCols int) (isEmpty []bool, visibleColCount int) { isEmpty = make([]bool, numOriginalCols) for i := range isEmpty { isEmpty[i] = true @@ -1453,9 +1490,9 @@ func (t *Table) getEmptyColumnInfo(numOriginalCols int) (isEmpty []bool, visible return isEmpty, visibleColCount } - t.logger.Debugf("getEmptyColumnInfo: Checking %d rows for %d columns...", len(t.rows), numOriginalCols) + t.logger.Debugf("getEmptyColumnInfo: Checking %d rows for %d columns...", len(processedRows), numOriginalCols) - for rowIdx, logicalRow := range t.rows { + for rowIdx, logicalRow := range processedRows { for lineIdx, visualLine := range logicalRow { for colIdx, cellContent := range visualLine { if colIdx >= numOriginalCols { @@ -1567,15 +1604,6 @@ func (t *Table) processVariadic(elements []any) []any { return elements } -// toStringLines converts raw cells to formatted lines for table output -func (t *Table) toStringLines(row any, config tw.CellConfig) ([][]string, error) { - cells, err := t.convertCellsToStrings(row, config) - if err != nil { - return nil, err - } - return t.prepareContent(cells, config), nil -} - // updateWidths updates the width map based on cell content and padding. // Parameters include row content, widths map, and padding configuration. // No return value. @@ -1598,10 +1626,9 @@ func (t *Table) updateWidths(row []string, widths tw.Mapper[int, int], padding t lines := strings.Split(cell, tw.NewLine) contentWidth := 0 for _, line := range lines { + // Always measure the raw line width, because the renderer + // will receive the raw line. Do not trim before measuring. lineWidth := twwidth.Width(line) - if t.config.Behavior.TrimSpace.Enabled() { - lineWidth = twwidth.Width(t.Trimmer(line)) - } if lineWidth > contentWidth { contentWidth = lineWidth } diff --git a/vendor/github.com/rivo/uniseg/README.md b/vendor/github.com/rivo/uniseg/README.md deleted file mode 100644 index f8da293e1..000000000 --- a/vendor/github.com/rivo/uniseg/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Unicode Text Segmentation for Go - -[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/rivo/uniseg) -[![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/rivo/uniseg) - -This Go package implements Unicode Text Segmentation according to [Unicode Standard Annex #29](http://unicode.org/reports/tr29/) (Unicode version 12.0.0). - -At this point, only the determination of grapheme cluster boundaries is implemented. - -## Background - -In Go, [strings are read-only slices of bytes](https://blog.golang.org/strings). They can be turned into Unicode code points using the `for` loop or by casting: `[]rune(str)`. However, multiple code points may be combined into one user-perceived character or what the Unicode specification calls "grapheme cluster". Here are some examples: - -|String|Bytes (UTF-8)|Code points (runes)|Grapheme clusters| -|-|-|-|-| -|Kaฬˆse|6 bytes: `4b 61 cc 88 73 65`|5 code points: `4b 61 308 73 65`|4 clusters: `[4b],[61 308],[73],[65]`| -|๐Ÿณ๏ธโ€๐ŸŒˆ|14 bytes: `f0 9f 8f b3 ef b8 8f e2 80 8d f0 9f 8c 88`|4 code points: `1f3f3 fe0f 200d 1f308`|1 cluster: `[1f3f3 fe0f 200d 1f308]`| -|๐Ÿ‡ฉ๐Ÿ‡ช|8 bytes: `f0 9f 87 a9 f0 9f 87 aa`|2 code points: `1f1e9 1f1ea`|1 cluster: `[1f1e9 1f1ea]`| - -This package provides a tool to iterate over these grapheme clusters. This may be used to determine the number of user-perceived characters, to split strings in their intended places, or to extract individual characters which form a unit. - -## Installation - -```bash -go get github.com/rivo/uniseg -``` - -## Basic Example - -```go -package uniseg - -import ( - "fmt" - - "github.com/rivo/uniseg" -) - -func main() { - gr := uniseg.NewGraphemes("๐Ÿ‘๐Ÿผ!") - for gr.Next() { - fmt.Printf("%x ", gr.Runes()) - } - // Output: [1f44d 1f3fc] [21] -} -``` - -## Documentation - -Refer to https://godoc.org/github.com/rivo/uniseg for the package's documentation. - -## Dependencies - -This package does not depend on any packages outside the standard library. - -## Your Feedback - -Add your issue here on GitHub. Feel free to get in touch if you have any questions. - -## Version - -Version tags will be introduced once Golang modules are official. Consider this version 0.1. diff --git a/vendor/github.com/rivo/uniseg/doc.go b/vendor/github.com/rivo/uniseg/doc.go deleted file mode 100644 index 60c737d7b..000000000 --- a/vendor/github.com/rivo/uniseg/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -/* -Package uniseg implements Unicode Text Segmentation according to Unicode -Standard Annex #29 (http://unicode.org/reports/tr29/). - -At this point, only the determination of grapheme cluster boundaries is -implemented. -*/ -package uniseg diff --git a/vendor/github.com/rivo/uniseg/grapheme.go b/vendor/github.com/rivo/uniseg/grapheme.go deleted file mode 100644 index 207157f5e..000000000 --- a/vendor/github.com/rivo/uniseg/grapheme.go +++ /dev/null @@ -1,268 +0,0 @@ -package uniseg - -import "unicode/utf8" - -// The states of the grapheme cluster parser. -const ( - grAny = iota - grCR - grControlLF - grL - grLVV - grLVTT - grPrepend - grExtendedPictographic - grExtendedPictographicZWJ - grRIOdd - grRIEven -) - -// The grapheme cluster parser's breaking instructions. -const ( - grNoBoundary = iota - grBoundary -) - -// The grapheme cluster parser's state transitions. Maps (state, property) to -// (new state, breaking instruction, rule number). The breaking instruction -// always refers to the boundary between the last and next code point. -// -// This map is queried as follows: -// -// 1. Find specific state + specific property. Stop if found. -// 2. Find specific state + any property. -// 3. Find any state + specific property. -// 4. If only (2) or (3) (but not both) was found, stop. -// 5. If both (2) and (3) were found, use state and breaking instruction from -// the transition with the lower rule number, prefer (3) if rule numbers -// are equal. Stop. -// 6. Assume grAny and grBoundary. -var grTransitions = map[[2]int][3]int{ - // GB5 - {grAny, prCR}: {grCR, grBoundary, 50}, - {grAny, prLF}: {grControlLF, grBoundary, 50}, - {grAny, prControl}: {grControlLF, grBoundary, 50}, - - // GB4 - {grCR, prAny}: {grAny, grBoundary, 40}, - {grControlLF, prAny}: {grAny, grBoundary, 40}, - - // GB3. - {grCR, prLF}: {grAny, grNoBoundary, 30}, - - // GB6. - {grAny, prL}: {grL, grBoundary, 9990}, - {grL, prL}: {grL, grNoBoundary, 60}, - {grL, prV}: {grLVV, grNoBoundary, 60}, - {grL, prLV}: {grLVV, grNoBoundary, 60}, - {grL, prLVT}: {grLVTT, grNoBoundary, 60}, - - // GB7. - {grAny, prLV}: {grLVV, grBoundary, 9990}, - {grAny, prV}: {grLVV, grBoundary, 9990}, - {grLVV, prV}: {grLVV, grNoBoundary, 70}, - {grLVV, prT}: {grLVTT, grNoBoundary, 70}, - - // GB8. - {grAny, prLVT}: {grLVTT, grBoundary, 9990}, - {grAny, prT}: {grLVTT, grBoundary, 9990}, - {grLVTT, prT}: {grLVTT, grNoBoundary, 80}, - - // GB9. - {grAny, prExtend}: {grAny, grNoBoundary, 90}, - {grAny, prZWJ}: {grAny, grNoBoundary, 90}, - - // GB9a. - {grAny, prSpacingMark}: {grAny, grNoBoundary, 91}, - - // GB9b. - {grAny, prPreprend}: {grPrepend, grBoundary, 9990}, - {grPrepend, prAny}: {grAny, grNoBoundary, 92}, - - // GB11. - {grAny, prExtendedPictographic}: {grExtendedPictographic, grBoundary, 9990}, - {grExtendedPictographic, prExtend}: {grExtendedPictographic, grNoBoundary, 110}, - {grExtendedPictographic, prZWJ}: {grExtendedPictographicZWJ, grNoBoundary, 110}, - {grExtendedPictographicZWJ, prExtendedPictographic}: {grExtendedPictographic, grNoBoundary, 110}, - - // GB12 / GB13. - {grAny, prRegionalIndicator}: {grRIOdd, grBoundary, 9990}, - {grRIOdd, prRegionalIndicator}: {grRIEven, grNoBoundary, 120}, - {grRIEven, prRegionalIndicator}: {grRIOdd, grBoundary, 120}, -} - -// Graphemes implements an iterator over Unicode extended grapheme clusters, -// specified in the Unicode Standard Annex #29. Grapheme clusters correspond to -// "user-perceived characters". These characters often consist of multiple -// code points (e.g. the "woman kissing woman" emoji consists of 8 code points: -// woman + ZWJ + heavy black heart (2 code points) + ZWJ + kiss mark + ZWJ + -// woman) and the rules described in Annex #29 must be applied to group those -// code points into clusters perceived by the user as one character. -type Graphemes struct { - // The code points over which this class iterates. - codePoints []rune - - // The (byte-based) indices of the code points into the original string plus - // len(original string). Thus, len(indices) = len(codePoints) + 1. - indices []int - - // The current grapheme cluster to be returned. These are indices into - // codePoints/indices. If start == end, we either haven't started iterating - // yet (0) or the iteration has already completed (1). - start, end int - - // The index of the next code point to be parsed. - pos int - - // The current state of the code point parser. - state int -} - -// NewGraphemes returns a new grapheme cluster iterator. -func NewGraphemes(s string) *Graphemes { - l := utf8.RuneCountInString(s) - codePoints := make([]rune, l) - indices := make([]int, l+1) - i := 0 - for pos, r := range s { - codePoints[i] = r - indices[i] = pos - i++ - } - indices[l] = len(s) - g := &Graphemes{ - codePoints: codePoints, - indices: indices, - } - g.Next() // Parse ahead. - return g -} - -// Next advances the iterator by one grapheme cluster and returns false if no -// clusters are left. This function must be called before the first cluster is -// accessed. -func (g *Graphemes) Next() bool { - g.start = g.end - - // The state transition gives us a boundary instruction BEFORE the next code - // point so we always need to stay ahead by one code point. - - // Parse the next code point. - for g.pos <= len(g.codePoints) { - // GB2. - if g.pos == len(g.codePoints) { - g.end = g.pos - g.pos++ - break - } - - // Determine the property of the next character. - nextProperty := property(g.codePoints[g.pos]) - g.pos++ - - // Find the applicable transition. - var boundary bool - transition, ok := grTransitions[[2]int{g.state, nextProperty}] - if ok { - // We have a specific transition. We'll use it. - g.state = transition[0] - boundary = transition[1] == grBoundary - } else { - // No specific transition found. Try the less specific ones. - transAnyProp, okAnyProp := grTransitions[[2]int{g.state, prAny}] - transAnyState, okAnyState := grTransitions[[2]int{grAny, nextProperty}] - if okAnyProp && okAnyState { - // Both apply. We'll use a mix (see comments for grTransitions). - g.state = transAnyState[0] - boundary = transAnyState[1] == grBoundary - if transAnyProp[2] < transAnyState[2] { - g.state = transAnyProp[0] - boundary = transAnyProp[1] == grBoundary - } - } else if okAnyProp { - // We only have a specific state. - g.state = transAnyProp[0] - boundary = transAnyProp[1] == grBoundary - // This branch will probably never be reached because okAnyState will - // always be true given the current transition map. But we keep it here - // for future modifications to the transition map where this may not be - // true anymore. - } else if okAnyState { - // We only have a specific property. - g.state = transAnyState[0] - boundary = transAnyState[1] == grBoundary - } else { - // No known transition. GB999: Any x Any. - g.state = grAny - boundary = true - } - } - - // If we found a cluster boundary, let's stop here. The current cluster will - // be the one that just ended. - if g.pos-1 == 0 /* GB1 */ || boundary { - g.end = g.pos - 1 - break - } - } - - return g.start != g.end -} - -// Runes returns a slice of runes (code points) which corresponds to the current -// grapheme cluster. If the iterator is already past the end or Next() has not -// yet been called, nil is returned. -func (g *Graphemes) Runes() []rune { - if g.start == g.end { - return nil - } - return g.codePoints[g.start:g.end] -} - -// Str returns a substring of the original string which corresponds to the -// current grapheme cluster. If the iterator is already past the end or Next() -// has not yet been called, an empty string is returned. -func (g *Graphemes) Str() string { - if g.start == g.end { - return "" - } - return string(g.codePoints[g.start:g.end]) -} - -// Bytes returns a byte slice which corresponds to the current grapheme cluster. -// If the iterator is already past the end or Next() has not yet been called, -// nil is returned. -func (g *Graphemes) Bytes() []byte { - if g.start == g.end { - return nil - } - return []byte(string(g.codePoints[g.start:g.end])) -} - -// Positions returns the interval of the current grapheme cluster as byte -// positions into the original string. The first returned value "from" indexes -// the first byte and the second returned value "to" indexes the first byte that -// is not included anymore, i.e. str[from:to] is the current grapheme cluster of -// the original string "str". If Next() has not yet been called, both values are -// 0. If the iterator is already past the end, both values are 1. -func (g *Graphemes) Positions() (int, int) { - return g.indices[g.start], g.indices[g.end] -} - -// Reset puts the iterator into its initial state such that the next call to -// Next() sets it to the first grapheme cluster again. -func (g *Graphemes) Reset() { - g.start, g.end, g.pos, g.state = 0, 0, 0, grAny - g.Next() // Parse ahead again. -} - -// GraphemeClusterCount returns the number of user-perceived characters -// (grapheme clusters) for the given string. To calculate this number, it -// iterates through the string using the Graphemes iterator. -func GraphemeClusterCount(s string) (n int) { - g := NewGraphemes(s) - for g.Next() { - n++ - } - return -} diff --git a/vendor/github.com/rivo/uniseg/properties.go b/vendor/github.com/rivo/uniseg/properties.go deleted file mode 100644 index a75ab5883..000000000 --- a/vendor/github.com/rivo/uniseg/properties.go +++ /dev/null @@ -1,1658 +0,0 @@ -package uniseg - -// The unicode properties. Only the ones needed in the context of this package -// are included. -const ( - prAny = iota - prPreprend - prCR - prLF - prControl - prExtend - prRegionalIndicator - prSpacingMark - prL - prV - prT - prLV - prLVT - prZWJ - prExtendedPictographic -) - -// Maps code point ranges to their properties. In the context of this package, -// any code point that is not contained may map to "prAny". The code point -// ranges in this slice are numerically sorted. -// -// These ranges were taken from -// http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt -// as well as -// https://unicode.org/Public/emoji/latest/emoji-data.txt -// ("Extended_Pictographic" only) on March 11, 2019. See -// https://www.unicode.org/license.html for the Unicode license agreement. -var codePoints = [][3]int{ - {0x0000, 0x0009, prControl}, // Cc [10] .. - {0x000A, 0x000A, prLF}, // Cc - {0x000B, 0x000C, prControl}, // Cc [2] .. - {0x000D, 0x000D, prCR}, // Cc - {0x000E, 0x001F, prControl}, // Cc [18] .. - {0x007F, 0x009F, prControl}, // Cc [33] .. - {0x00A9, 0x00A9, prExtendedPictographic}, // 1.1 [1] (ยฉ๏ธ) copyright - {0x00AD, 0x00AD, prControl}, // Cf SOFT HYPHEN - {0x00AE, 0x00AE, prExtendedPictographic}, // 1.1 [1] (ยฎ๏ธ) registered - {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X - {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE - {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN - {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG - {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE - {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT - {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT - {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN - {0x0600, 0x0605, prPreprend}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE - {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA - {0x061C, 0x061C, prControl}, // Cf ARABIC LETTER MARK - {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW - {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF - {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN - {0x06DD, 0x06DD, prPreprend}, // Cf ARABIC END OF AYAH - {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA - {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON - {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM - {0x070F, 0x070F, prPreprend}, // Cf SYRIAC ABBREVIATION MARK - {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH - {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH - {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN - {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE - {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN - {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH - {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A - {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U - {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA - {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK - {0x08D3, 0x08E1, prExtend}, // Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA - {0x08E2, 0x08E2, prPreprend}, // Cf ARABIC DISPUTED END OF AYAH - {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA - {0x0903, 0x0903, prSpacingMark}, // Mc DEVANAGARI SIGN VISARGA - {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE - {0x093B, 0x093B, prSpacingMark}, // Mc DEVANAGARI VOWEL SIGN OOE - {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA - {0x093E, 0x0940, prSpacingMark}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II - {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI - {0x0949, 0x094C, prSpacingMark}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU - {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA - {0x094E, 0x094F, prSpacingMark}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW - {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE - {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL - {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU - {0x0982, 0x0983, prSpacingMark}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA - {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA - {0x09BE, 0x09BE, prExtend}, // Mc BENGALI VOWEL SIGN AA - {0x09BF, 0x09C0, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II - {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR - {0x09C7, 0x09C8, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI - {0x09CB, 0x09CC, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU - {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA - {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK - {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL - {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK - {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI - {0x0A03, 0x0A03, prSpacingMark}, // Mc GURMUKHI SIGN VISARGA - {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA - {0x0A3E, 0x0A40, prSpacingMark}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II - {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU - {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI - {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA - {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT - {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK - {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH - {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA - {0x0A83, 0x0A83, prSpacingMark}, // Mc GUJARATI SIGN VISARGA - {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA - {0x0ABE, 0x0AC0, prSpacingMark}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II - {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E - {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI - {0x0AC9, 0x0AC9, prSpacingMark}, // Mc GUJARATI VOWEL SIGN CANDRA O - {0x0ACB, 0x0ACC, prSpacingMark}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU - {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA - {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL - {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE - {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU - {0x0B02, 0x0B03, prSpacingMark}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA - {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA - {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA - {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I - {0x0B40, 0x0B40, prSpacingMark}, // Mc ORIYA VOWEL SIGN II - {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR - {0x0B47, 0x0B48, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI - {0x0B4B, 0x0B4C, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU - {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA - {0x0B56, 0x0B56, prExtend}, // Mn ORIYA AI LENGTH MARK - {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK - {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL - {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA - {0x0BBE, 0x0BBE, prExtend}, // Mc TAMIL VOWEL SIGN AA - {0x0BBF, 0x0BBF, prSpacingMark}, // Mc TAMIL VOWEL SIGN I - {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II - {0x0BC1, 0x0BC2, prSpacingMark}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU - {0x0BC6, 0x0BC8, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI - {0x0BCA, 0x0BCC, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU - {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA - {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK - {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE - {0x0C01, 0x0C03, prSpacingMark}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA - {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE - {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II - {0x0C41, 0x0C44, prSpacingMark}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR - {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI - {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA - {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK - {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL - {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU - {0x0C82, 0x0C83, prSpacingMark}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA - {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA - {0x0CBE, 0x0CBE, prSpacingMark}, // Mc KANNADA VOWEL SIGN AA - {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I - {0x0CC0, 0x0CC1, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U - {0x0CC2, 0x0CC2, prExtend}, // Mc KANNADA VOWEL SIGN UU - {0x0CC3, 0x0CC4, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR - {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E - {0x0CC7, 0x0CC8, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI - {0x0CCA, 0x0CCB, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO - {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA - {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK - {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL - {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU - {0x0D02, 0x0D03, prSpacingMark}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA - {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA - {0x0D3E, 0x0D3E, prExtend}, // Mc MALAYALAM VOWEL SIGN AA - {0x0D3F, 0x0D40, prSpacingMark}, // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II - {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR - {0x0D46, 0x0D48, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI - {0x0D4A, 0x0D4C, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU - {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA - {0x0D4E, 0x0D4E, prPreprend}, // Lo MALAYALAM LETTER DOT REPH - {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK - {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL - {0x0D82, 0x0D83, prSpacingMark}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA - {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA - {0x0DCF, 0x0DCF, prExtend}, // Mc SINHALA VOWEL SIGN AELA-PILLA - {0x0DD0, 0x0DD1, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA - {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA - {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA - {0x0DD8, 0x0DDE, prSpacingMark}, // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA - {0x0DDF, 0x0DDF, prExtend}, // Mc SINHALA VOWEL SIGN GAYANUKITTA - {0x0DF2, 0x0DF3, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA - {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT - {0x0E33, 0x0E33, prSpacingMark}, // Lo THAI CHARACTER SARA AM - {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU - {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN - {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN - {0x0EB3, 0x0EB3, prSpacingMark}, // Lo LAO VOWEL SIGN AM - {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO - {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA - {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS - {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA - {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS - {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU - {0x0F3E, 0x0F3F, prSpacingMark}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES - {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO - {0x0F7F, 0x0F7F, prSpacingMark}, // Mc TIBETAN SIGN RNAM BCAD - {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA - {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS - {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA - {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA - {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN - {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU - {0x1031, 0x1031, prSpacingMark}, // Mc MYANMAR VOWEL SIGN E - {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW - {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT - {0x103B, 0x103C, prSpacingMark}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA - {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA - {0x1056, 0x1057, prSpacingMark}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR - {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL - {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA - {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE - {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA - {0x1084, 0x1084, prSpacingMark}, // Mc MYANMAR VOWEL SIGN SHAN E - {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y - {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE - {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI - {0x1100, 0x115F, prL}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER - {0x1160, 0x11A7, prV}, // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE - {0x11A8, 0x11FF, prT}, // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN - {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK - {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA - {0x1732, 0x1734, prExtend}, // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD - {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U - {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U - {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA - {0x17B6, 0x17B6, prSpacingMark}, // Mc KHMER VOWEL SIGN AA - {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA - {0x17BE, 0x17C5, prSpacingMark}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU - {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT - {0x17C7, 0x17C8, prSpacingMark}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU - {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT - {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN - {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE - {0x180E, 0x180E, prControl}, // Cf MONGOLIAN VOWEL SEPARATOR - {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA - {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA - {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U - {0x1923, 0x1926, prSpacingMark}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU - {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O - {0x1929, 0x192B, prSpacingMark}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA - {0x1930, 0x1931, prSpacingMark}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA - {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA - {0x1933, 0x1938, prSpacingMark}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA - {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I - {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U - {0x1A19, 0x1A1A, prSpacingMark}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O - {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE - {0x1A55, 0x1A55, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA - {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA - {0x1A57, 0x1A57, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI - {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA - {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT - {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT - {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW - {0x1A6D, 0x1A72, prSpacingMark}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI - {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN - {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT - {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW - {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY - {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG - {0x1B04, 0x1B04, prSpacingMark}, // Mc BALINESE SIGN BISAH - {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN - {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG - {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA - {0x1B3B, 0x1B3B, prSpacingMark}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG - {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA - {0x1B3D, 0x1B41, prSpacingMark}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG - {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET - {0x1B43, 0x1B44, prSpacingMark}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG - {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG - {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR - {0x1B82, 0x1B82, prSpacingMark}, // Mc SUNDANESE SIGN PANGWISAD - {0x1BA1, 0x1BA1, prSpacingMark}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL - {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU - {0x1BA6, 0x1BA7, prSpacingMark}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG - {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG - {0x1BAA, 0x1BAA, prSpacingMark}, // Mc SUNDANESE SIGN PAMAAEH - {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA - {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI - {0x1BE7, 0x1BE7, prSpacingMark}, // Mc BATAK VOWEL SIGN E - {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE - {0x1BEA, 0x1BEC, prSpacingMark}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O - {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O - {0x1BEE, 0x1BEE, prSpacingMark}, // Mc BATAK VOWEL SIGN U - {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H - {0x1BF2, 0x1BF3, prSpacingMark}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN - {0x1C24, 0x1C2B, prSpacingMark}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU - {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T - {0x1C34, 0x1C35, prSpacingMark}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG - {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA - {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA - {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA - {0x1CE1, 0x1CE1, prSpacingMark}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA - {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL - {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK - {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE - {0x1CF7, 0x1CF7, prSpacingMark}, // Mc VEDIC SIGN ATIKRAMA - {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE - {0x1DC0, 0x1DF9, prExtend}, // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW - {0x1DFB, 0x1DFF, prExtend}, // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW - {0x200B, 0x200B, prControl}, // Cf ZERO WIDTH SPACE - {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER - {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER - {0x200E, 0x200F, prControl}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK - {0x2028, 0x2028, prControl}, // Zl LINE SEPARATOR - {0x2029, 0x2029, prControl}, // Zp PARAGRAPH SEPARATOR - {0x202A, 0x202E, prControl}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE - {0x203C, 0x203C, prExtendedPictographic}, // 1.1 [1] (โ€ผ๏ธ) double exclamation mark - {0x2049, 0x2049, prExtendedPictographic}, // 3.0 [1] (โ‰๏ธ) exclamation question mark - {0x2060, 0x2064, prControl}, // Cf [5] WORD JOINER..INVISIBLE PLUS - {0x2065, 0x2065, prControl}, // Cn - {0x2066, 0x206F, prControl}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES - {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE - {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH - {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE - {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE - {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE - {0x2122, 0x2122, prExtendedPictographic}, // 1.1 [1] (โ„ข๏ธ) trade mark - {0x2139, 0x2139, prExtendedPictographic}, // 3.0 [1] (โ„น๏ธ) information - {0x2194, 0x2199, prExtendedPictographic}, // 1.1 [6] (โ†”๏ธ..โ†™๏ธ) left-right arrow..down-left arrow - {0x21A9, 0x21AA, prExtendedPictographic}, // 1.1 [2] (โ†ฉ๏ธ..โ†ช๏ธ) right arrow curving left..left arrow curving right - {0x231A, 0x231B, prExtendedPictographic}, // 1.1 [2] (โŒš..โŒ›) watch..hourglass done - {0x2328, 0x2328, prExtendedPictographic}, // 1.1 [1] (โŒจ๏ธ) keyboard - {0x2388, 0x2388, prExtendedPictographic}, // 3.0 [1] (โŽˆ) HELM SYMBOL - {0x23CF, 0x23CF, prExtendedPictographic}, // 4.0 [1] (โ๏ธ) eject button - {0x23E9, 0x23F3, prExtendedPictographic}, // 6.0 [11] (โฉ..โณ) fast-forward button..hourglass not done - {0x23F8, 0x23FA, prExtendedPictographic}, // 7.0 [3] (โธ๏ธ..โบ๏ธ) pause button..record button - {0x24C2, 0x24C2, prExtendedPictographic}, // 1.1 [1] (โ“‚๏ธ) circled M - {0x25AA, 0x25AB, prExtendedPictographic}, // 1.1 [2] (โ–ช๏ธ..โ–ซ๏ธ) black small square..white small square - {0x25B6, 0x25B6, prExtendedPictographic}, // 1.1 [1] (โ–ถ๏ธ) play button - {0x25C0, 0x25C0, prExtendedPictographic}, // 1.1 [1] (โ—€๏ธ) reverse button - {0x25FB, 0x25FE, prExtendedPictographic}, // 3.2 [4] (โ—ป๏ธ..โ—พ) white medium square..black medium-small square - {0x2600, 0x2605, prExtendedPictographic}, // 1.1 [6] (โ˜€๏ธ..โ˜…) sun..BLACK STAR - {0x2607, 0x2612, prExtendedPictographic}, // 1.1 [12] (โ˜‡..โ˜’) LIGHTNING..BALLOT BOX WITH X - {0x2614, 0x2615, prExtendedPictographic}, // 4.0 [2] (โ˜”..โ˜•) umbrella with rain drops..hot beverage - {0x2616, 0x2617, prExtendedPictographic}, // 3.2 [2] (โ˜–..โ˜—) WHITE SHOGI PIECE..BLACK SHOGI PIECE - {0x2618, 0x2618, prExtendedPictographic}, // 4.1 [1] (โ˜˜๏ธ) shamrock - {0x2619, 0x2619, prExtendedPictographic}, // 3.0 [1] (โ˜™) REVERSED ROTATED FLORAL HEART BULLET - {0x261A, 0x266F, prExtendedPictographic}, // 1.1 [86] (โ˜š..โ™ฏ) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN - {0x2670, 0x2671, prExtendedPictographic}, // 3.0 [2] (โ™ฐ..โ™ฑ) WEST SYRIAC CROSS..EAST SYRIAC CROSS - {0x2672, 0x267D, prExtendedPictographic}, // 3.2 [12] (โ™ฒ..โ™ฝ) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL - {0x267E, 0x267F, prExtendedPictographic}, // 4.1 [2] (โ™พ๏ธ..โ™ฟ) infinity..wheelchair symbol - {0x2680, 0x2685, prExtendedPictographic}, // 3.2 [6] (โš€..โš…) DIE FACE-1..DIE FACE-6 - {0x2690, 0x2691, prExtendedPictographic}, // 4.0 [2] (โš..โš‘) WHITE FLAG..BLACK FLAG - {0x2692, 0x269C, prExtendedPictographic}, // 4.1 [11] (โš’๏ธ..โšœ๏ธ) hammer and pick..fleur-de-lis - {0x269D, 0x269D, prExtendedPictographic}, // 5.1 [1] (โš) OUTLINED WHITE STAR - {0x269E, 0x269F, prExtendedPictographic}, // 5.2 [2] (โšž..โšŸ) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT - {0x26A0, 0x26A1, prExtendedPictographic}, // 4.0 [2] (โš ๏ธ..โšก) warning..high voltage - {0x26A2, 0x26B1, prExtendedPictographic}, // 4.1 [16] (โšข..โšฑ๏ธ) DOUBLED FEMALE SIGN..funeral urn - {0x26B2, 0x26B2, prExtendedPictographic}, // 5.0 [1] (โšฒ) NEUTER - {0x26B3, 0x26BC, prExtendedPictographic}, // 5.1 [10] (โšณ..โšผ) CERES..SESQUIQUADRATE - {0x26BD, 0x26BF, prExtendedPictographic}, // 5.2 [3] (โšฝ..โšฟ) soccer ball..SQUARED KEY - {0x26C0, 0x26C3, prExtendedPictographic}, // 5.1 [4] (โ›€..โ›ƒ) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING - {0x26C4, 0x26CD, prExtendedPictographic}, // 5.2 [10] (โ›„..โ›) snowman without snow..DISABLED CAR - {0x26CE, 0x26CE, prExtendedPictographic}, // 6.0 [1] (โ›Ž) Ophiuchus - {0x26CF, 0x26E1, prExtendedPictographic}, // 5.2 [19] (โ›๏ธ..โ›ก) pick..RESTRICTED LEFT ENTRY-2 - {0x26E2, 0x26E2, prExtendedPictographic}, // 6.0 [1] (โ›ข) ASTRONOMICAL SYMBOL FOR URANUS - {0x26E3, 0x26E3, prExtendedPictographic}, // 5.2 [1] (โ›ฃ) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE - {0x26E4, 0x26E7, prExtendedPictographic}, // 6.0 [4] (โ›ค..โ›ง) PENTAGRAM..INVERTED PENTAGRAM - {0x26E8, 0x26FF, prExtendedPictographic}, // 5.2 [24] (โ›จ..โ›ฟ) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE - {0x2700, 0x2700, prExtendedPictographic}, // 7.0 [1] (โœ€) BLACK SAFETY SCISSORS - {0x2701, 0x2704, prExtendedPictographic}, // 1.1 [4] (โœ..โœ„) UPPER BLADE SCISSORS..WHITE SCISSORS - {0x2705, 0x2705, prExtendedPictographic}, // 6.0 [1] (โœ…) check mark button - {0x2708, 0x2709, prExtendedPictographic}, // 1.1 [2] (โœˆ๏ธ..โœ‰๏ธ) airplane..envelope - {0x270A, 0x270B, prExtendedPictographic}, // 6.0 [2] (โœŠ..โœ‹) raised fist..raised hand - {0x270C, 0x2712, prExtendedPictographic}, // 1.1 [7] (โœŒ๏ธ..โœ’๏ธ) victory hand..black nib - {0x2714, 0x2714, prExtendedPictographic}, // 1.1 [1] (โœ”๏ธ) check mark - {0x2716, 0x2716, prExtendedPictographic}, // 1.1 [1] (โœ–๏ธ) multiplication sign - {0x271D, 0x271D, prExtendedPictographic}, // 1.1 [1] (โœ๏ธ) latin cross - {0x2721, 0x2721, prExtendedPictographic}, // 1.1 [1] (โœก๏ธ) star of David - {0x2728, 0x2728, prExtendedPictographic}, // 6.0 [1] (โœจ) sparkles - {0x2733, 0x2734, prExtendedPictographic}, // 1.1 [2] (โœณ๏ธ..โœด๏ธ) eight-spoked asterisk..eight-pointed star - {0x2744, 0x2744, prExtendedPictographic}, // 1.1 [1] (โ„๏ธ) snowflake - {0x2747, 0x2747, prExtendedPictographic}, // 1.1 [1] (โ‡๏ธ) sparkle - {0x274C, 0x274C, prExtendedPictographic}, // 6.0 [1] (โŒ) cross mark - {0x274E, 0x274E, prExtendedPictographic}, // 6.0 [1] (โŽ) cross mark button - {0x2753, 0x2755, prExtendedPictographic}, // 6.0 [3] (โ“..โ•) question mark..white exclamation mark - {0x2757, 0x2757, prExtendedPictographic}, // 5.2 [1] (โ—) exclamation mark - {0x2763, 0x2767, prExtendedPictographic}, // 1.1 [5] (โฃ๏ธ..โง) heart exclamation..ROTATED FLORAL HEART BULLET - {0x2795, 0x2797, prExtendedPictographic}, // 6.0 [3] (โž•..โž—) plus sign..division sign - {0x27A1, 0x27A1, prExtendedPictographic}, // 1.1 [1] (โžก๏ธ) right arrow - {0x27B0, 0x27B0, prExtendedPictographic}, // 6.0 [1] (โžฐ) curly loop - {0x27BF, 0x27BF, prExtendedPictographic}, // 6.0 [1] (โžฟ) double curly loop - {0x2934, 0x2935, prExtendedPictographic}, // 3.2 [2] (โคด๏ธ..โคต๏ธ) right arrow curving up..right arrow curving down - {0x2B05, 0x2B07, prExtendedPictographic}, // 4.0 [3] (โฌ…๏ธ..โฌ‡๏ธ) left arrow..down arrow - {0x2B1B, 0x2B1C, prExtendedPictographic}, // 5.1 [2] (โฌ›..โฌœ) black large square..white large square - {0x2B50, 0x2B50, prExtendedPictographic}, // 5.1 [1] (โญ) star - {0x2B55, 0x2B55, prExtendedPictographic}, // 5.2 [1] (โญ•) hollow red circle - {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS - {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER - {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS - {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK - {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK - {0x3030, 0x3030, prExtendedPictographic}, // 1.1 [1] (ใ€ฐ๏ธ) wavy dash - {0x303D, 0x303D, prExtendedPictographic}, // 3.2 [1] (ใ€ฝ๏ธ) part alternation mark - {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - {0x3297, 0x3297, prExtendedPictographic}, // 1.1 [1] (ใŠ—๏ธ) Japanese โ€œcongratulationsโ€ button - {0x3299, 0x3299, prExtendedPictographic}, // 1.1 [1] (ใŠ™๏ธ) Japanese โ€œsecretโ€ button - {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET - {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN - {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK - {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E - {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS - {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA - {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA - {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA - {0xA823, 0xA824, prSpacingMark}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I - {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E - {0xA827, 0xA827, prSpacingMark}, // Mc SYLOTI NAGRI VOWEL SIGN OO - {0xA880, 0xA881, prSpacingMark}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA - {0xA8B4, 0xA8C3, prSpacingMark}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU - {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU - {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA - {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY - {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU - {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R - {0xA952, 0xA953, prSpacingMark}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA - {0xA960, 0xA97C, prL}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH - {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR - {0xA983, 0xA983, prSpacingMark}, // Mc JAVANESE SIGN WIGNYAN - {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU - {0xA9B4, 0xA9B5, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG - {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT - {0xA9BA, 0xA9BB, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE - {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET - {0xA9BE, 0xA9C0, prSpacingMark}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON - {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW - {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE - {0xAA2F, 0xAA30, prSpacingMark}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI - {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE - {0xAA33, 0xAA34, prSpacingMark}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA - {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA - {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG - {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M - {0xAA4D, 0xAA4D, prSpacingMark}, // Mc CHAM CONSONANT SIGN FINAL H - {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 - {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG - {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U - {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA - {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK - {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO - {0xAAEB, 0xAAEB, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN II - {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI - {0xAAEE, 0xAAEF, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU - {0xAAF5, 0xAAF5, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA - {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA - {0xABE3, 0xABE4, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP - {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP - {0xABE6, 0xABE7, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP - {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP - {0xABE9, 0xABEA, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG - {0xABEC, 0xABEC, prSpacingMark}, // Mc MEETEI MAYEK LUM IYEK - {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK - {0xAC00, 0xAC00, prLV}, // Lo HANGUL SYLLABLE GA - {0xAC01, 0xAC1B, prLVT}, // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH - {0xAC1C, 0xAC1C, prLV}, // Lo HANGUL SYLLABLE GAE - {0xAC1D, 0xAC37, prLVT}, // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH - {0xAC38, 0xAC38, prLV}, // Lo HANGUL SYLLABLE GYA - {0xAC39, 0xAC53, prLVT}, // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH - {0xAC54, 0xAC54, prLV}, // Lo HANGUL SYLLABLE GYAE - {0xAC55, 0xAC6F, prLVT}, // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH - {0xAC70, 0xAC70, prLV}, // Lo HANGUL SYLLABLE GEO - {0xAC71, 0xAC8B, prLVT}, // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH - {0xAC8C, 0xAC8C, prLV}, // Lo HANGUL SYLLABLE GE - {0xAC8D, 0xACA7, prLVT}, // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH - {0xACA8, 0xACA8, prLV}, // Lo HANGUL SYLLABLE GYEO - {0xACA9, 0xACC3, prLVT}, // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH - {0xACC4, 0xACC4, prLV}, // Lo HANGUL SYLLABLE GYE - {0xACC5, 0xACDF, prLVT}, // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH - {0xACE0, 0xACE0, prLV}, // Lo HANGUL SYLLABLE GO - {0xACE1, 0xACFB, prLVT}, // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH - {0xACFC, 0xACFC, prLV}, // Lo HANGUL SYLLABLE GWA - {0xACFD, 0xAD17, prLVT}, // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH - {0xAD18, 0xAD18, prLV}, // Lo HANGUL SYLLABLE GWAE - {0xAD19, 0xAD33, prLVT}, // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH - {0xAD34, 0xAD34, prLV}, // Lo HANGUL SYLLABLE GOE - {0xAD35, 0xAD4F, prLVT}, // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH - {0xAD50, 0xAD50, prLV}, // Lo HANGUL SYLLABLE GYO - {0xAD51, 0xAD6B, prLVT}, // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH - {0xAD6C, 0xAD6C, prLV}, // Lo HANGUL SYLLABLE GU - {0xAD6D, 0xAD87, prLVT}, // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH - {0xAD88, 0xAD88, prLV}, // Lo HANGUL SYLLABLE GWEO - {0xAD89, 0xADA3, prLVT}, // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH - {0xADA4, 0xADA4, prLV}, // Lo HANGUL SYLLABLE GWE - {0xADA5, 0xADBF, prLVT}, // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH - {0xADC0, 0xADC0, prLV}, // Lo HANGUL SYLLABLE GWI - {0xADC1, 0xADDB, prLVT}, // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH - {0xADDC, 0xADDC, prLV}, // Lo HANGUL SYLLABLE GYU - {0xADDD, 0xADF7, prLVT}, // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH - {0xADF8, 0xADF8, prLV}, // Lo HANGUL SYLLABLE GEU - {0xADF9, 0xAE13, prLVT}, // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH - {0xAE14, 0xAE14, prLV}, // Lo HANGUL SYLLABLE GYI - {0xAE15, 0xAE2F, prLVT}, // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH - {0xAE30, 0xAE30, prLV}, // Lo HANGUL SYLLABLE GI - {0xAE31, 0xAE4B, prLVT}, // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH - {0xAE4C, 0xAE4C, prLV}, // Lo HANGUL SYLLABLE GGA - {0xAE4D, 0xAE67, prLVT}, // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH - {0xAE68, 0xAE68, prLV}, // Lo HANGUL SYLLABLE GGAE - {0xAE69, 0xAE83, prLVT}, // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH - {0xAE84, 0xAE84, prLV}, // Lo HANGUL SYLLABLE GGYA - {0xAE85, 0xAE9F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH - {0xAEA0, 0xAEA0, prLV}, // Lo HANGUL SYLLABLE GGYAE - {0xAEA1, 0xAEBB, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH - {0xAEBC, 0xAEBC, prLV}, // Lo HANGUL SYLLABLE GGEO - {0xAEBD, 0xAED7, prLVT}, // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH - {0xAED8, 0xAED8, prLV}, // Lo HANGUL SYLLABLE GGE - {0xAED9, 0xAEF3, prLVT}, // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH - {0xAEF4, 0xAEF4, prLV}, // Lo HANGUL SYLLABLE GGYEO - {0xAEF5, 0xAF0F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH - {0xAF10, 0xAF10, prLV}, // Lo HANGUL SYLLABLE GGYE - {0xAF11, 0xAF2B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH - {0xAF2C, 0xAF2C, prLV}, // Lo HANGUL SYLLABLE GGO - {0xAF2D, 0xAF47, prLVT}, // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH - {0xAF48, 0xAF48, prLV}, // Lo HANGUL SYLLABLE GGWA - {0xAF49, 0xAF63, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH - {0xAF64, 0xAF64, prLV}, // Lo HANGUL SYLLABLE GGWAE - {0xAF65, 0xAF7F, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH - {0xAF80, 0xAF80, prLV}, // Lo HANGUL SYLLABLE GGOE - {0xAF81, 0xAF9B, prLVT}, // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH - {0xAF9C, 0xAF9C, prLV}, // Lo HANGUL SYLLABLE GGYO - {0xAF9D, 0xAFB7, prLVT}, // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH - {0xAFB8, 0xAFB8, prLV}, // Lo HANGUL SYLLABLE GGU - {0xAFB9, 0xAFD3, prLVT}, // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH - {0xAFD4, 0xAFD4, prLV}, // Lo HANGUL SYLLABLE GGWEO - {0xAFD5, 0xAFEF, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH - {0xAFF0, 0xAFF0, prLV}, // Lo HANGUL SYLLABLE GGWE - {0xAFF1, 0xB00B, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH - {0xB00C, 0xB00C, prLV}, // Lo HANGUL SYLLABLE GGWI - {0xB00D, 0xB027, prLVT}, // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH - {0xB028, 0xB028, prLV}, // Lo HANGUL SYLLABLE GGYU - {0xB029, 0xB043, prLVT}, // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH - {0xB044, 0xB044, prLV}, // Lo HANGUL SYLLABLE GGEU - {0xB045, 0xB05F, prLVT}, // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH - {0xB060, 0xB060, prLV}, // Lo HANGUL SYLLABLE GGYI - {0xB061, 0xB07B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH - {0xB07C, 0xB07C, prLV}, // Lo HANGUL SYLLABLE GGI - {0xB07D, 0xB097, prLVT}, // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH - {0xB098, 0xB098, prLV}, // Lo HANGUL SYLLABLE NA - {0xB099, 0xB0B3, prLVT}, // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH - {0xB0B4, 0xB0B4, prLV}, // Lo HANGUL SYLLABLE NAE - {0xB0B5, 0xB0CF, prLVT}, // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH - {0xB0D0, 0xB0D0, prLV}, // Lo HANGUL SYLLABLE NYA - {0xB0D1, 0xB0EB, prLVT}, // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH - {0xB0EC, 0xB0EC, prLV}, // Lo HANGUL SYLLABLE NYAE - {0xB0ED, 0xB107, prLVT}, // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH - {0xB108, 0xB108, prLV}, // Lo HANGUL SYLLABLE NEO - {0xB109, 0xB123, prLVT}, // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH - {0xB124, 0xB124, prLV}, // Lo HANGUL SYLLABLE NE - {0xB125, 0xB13F, prLVT}, // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH - {0xB140, 0xB140, prLV}, // Lo HANGUL SYLLABLE NYEO - {0xB141, 0xB15B, prLVT}, // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH - {0xB15C, 0xB15C, prLV}, // Lo HANGUL SYLLABLE NYE - {0xB15D, 0xB177, prLVT}, // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH - {0xB178, 0xB178, prLV}, // Lo HANGUL SYLLABLE NO - {0xB179, 0xB193, prLVT}, // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH - {0xB194, 0xB194, prLV}, // Lo HANGUL SYLLABLE NWA - {0xB195, 0xB1AF, prLVT}, // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH - {0xB1B0, 0xB1B0, prLV}, // Lo HANGUL SYLLABLE NWAE - {0xB1B1, 0xB1CB, prLVT}, // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH - {0xB1CC, 0xB1CC, prLV}, // Lo HANGUL SYLLABLE NOE - {0xB1CD, 0xB1E7, prLVT}, // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH - {0xB1E8, 0xB1E8, prLV}, // Lo HANGUL SYLLABLE NYO - {0xB1E9, 0xB203, prLVT}, // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH - {0xB204, 0xB204, prLV}, // Lo HANGUL SYLLABLE NU - {0xB205, 0xB21F, prLVT}, // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH - {0xB220, 0xB220, prLV}, // Lo HANGUL SYLLABLE NWEO - {0xB221, 0xB23B, prLVT}, // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH - {0xB23C, 0xB23C, prLV}, // Lo HANGUL SYLLABLE NWE - {0xB23D, 0xB257, prLVT}, // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH - {0xB258, 0xB258, prLV}, // Lo HANGUL SYLLABLE NWI - {0xB259, 0xB273, prLVT}, // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH - {0xB274, 0xB274, prLV}, // Lo HANGUL SYLLABLE NYU - {0xB275, 0xB28F, prLVT}, // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH - {0xB290, 0xB290, prLV}, // Lo HANGUL SYLLABLE NEU - {0xB291, 0xB2AB, prLVT}, // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH - {0xB2AC, 0xB2AC, prLV}, // Lo HANGUL SYLLABLE NYI - {0xB2AD, 0xB2C7, prLVT}, // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH - {0xB2C8, 0xB2C8, prLV}, // Lo HANGUL SYLLABLE NI - {0xB2C9, 0xB2E3, prLVT}, // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH - {0xB2E4, 0xB2E4, prLV}, // Lo HANGUL SYLLABLE DA - {0xB2E5, 0xB2FF, prLVT}, // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH - {0xB300, 0xB300, prLV}, // Lo HANGUL SYLLABLE DAE - {0xB301, 0xB31B, prLVT}, // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH - {0xB31C, 0xB31C, prLV}, // Lo HANGUL SYLLABLE DYA - {0xB31D, 0xB337, prLVT}, // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH - {0xB338, 0xB338, prLV}, // Lo HANGUL SYLLABLE DYAE - {0xB339, 0xB353, prLVT}, // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH - {0xB354, 0xB354, prLV}, // Lo HANGUL SYLLABLE DEO - {0xB355, 0xB36F, prLVT}, // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH - {0xB370, 0xB370, prLV}, // Lo HANGUL SYLLABLE DE - {0xB371, 0xB38B, prLVT}, // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH - {0xB38C, 0xB38C, prLV}, // Lo HANGUL SYLLABLE DYEO - {0xB38D, 0xB3A7, prLVT}, // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH - {0xB3A8, 0xB3A8, prLV}, // Lo HANGUL SYLLABLE DYE - {0xB3A9, 0xB3C3, prLVT}, // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH - {0xB3C4, 0xB3C4, prLV}, // Lo HANGUL SYLLABLE DO - {0xB3C5, 0xB3DF, prLVT}, // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH - {0xB3E0, 0xB3E0, prLV}, // Lo HANGUL SYLLABLE DWA - {0xB3E1, 0xB3FB, prLVT}, // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH - {0xB3FC, 0xB3FC, prLV}, // Lo HANGUL SYLLABLE DWAE - {0xB3FD, 0xB417, prLVT}, // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH - {0xB418, 0xB418, prLV}, // Lo HANGUL SYLLABLE DOE - {0xB419, 0xB433, prLVT}, // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH - {0xB434, 0xB434, prLV}, // Lo HANGUL SYLLABLE DYO - {0xB435, 0xB44F, prLVT}, // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH - {0xB450, 0xB450, prLV}, // Lo HANGUL SYLLABLE DU - {0xB451, 0xB46B, prLVT}, // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH - {0xB46C, 0xB46C, prLV}, // Lo HANGUL SYLLABLE DWEO - {0xB46D, 0xB487, prLVT}, // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH - {0xB488, 0xB488, prLV}, // Lo HANGUL SYLLABLE DWE - {0xB489, 0xB4A3, prLVT}, // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH - {0xB4A4, 0xB4A4, prLV}, // Lo HANGUL SYLLABLE DWI - {0xB4A5, 0xB4BF, prLVT}, // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH - {0xB4C0, 0xB4C0, prLV}, // Lo HANGUL SYLLABLE DYU - {0xB4C1, 0xB4DB, prLVT}, // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH - {0xB4DC, 0xB4DC, prLV}, // Lo HANGUL SYLLABLE DEU - {0xB4DD, 0xB4F7, prLVT}, // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH - {0xB4F8, 0xB4F8, prLV}, // Lo HANGUL SYLLABLE DYI - {0xB4F9, 0xB513, prLVT}, // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH - {0xB514, 0xB514, prLV}, // Lo HANGUL SYLLABLE DI - {0xB515, 0xB52F, prLVT}, // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH - {0xB530, 0xB530, prLV}, // Lo HANGUL SYLLABLE DDA - {0xB531, 0xB54B, prLVT}, // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH - {0xB54C, 0xB54C, prLV}, // Lo HANGUL SYLLABLE DDAE - {0xB54D, 0xB567, prLVT}, // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH - {0xB568, 0xB568, prLV}, // Lo HANGUL SYLLABLE DDYA - {0xB569, 0xB583, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH - {0xB584, 0xB584, prLV}, // Lo HANGUL SYLLABLE DDYAE - {0xB585, 0xB59F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH - {0xB5A0, 0xB5A0, prLV}, // Lo HANGUL SYLLABLE DDEO - {0xB5A1, 0xB5BB, prLVT}, // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH - {0xB5BC, 0xB5BC, prLV}, // Lo HANGUL SYLLABLE DDE - {0xB5BD, 0xB5D7, prLVT}, // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH - {0xB5D8, 0xB5D8, prLV}, // Lo HANGUL SYLLABLE DDYEO - {0xB5D9, 0xB5F3, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH - {0xB5F4, 0xB5F4, prLV}, // Lo HANGUL SYLLABLE DDYE - {0xB5F5, 0xB60F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH - {0xB610, 0xB610, prLV}, // Lo HANGUL SYLLABLE DDO - {0xB611, 0xB62B, prLVT}, // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH - {0xB62C, 0xB62C, prLV}, // Lo HANGUL SYLLABLE DDWA - {0xB62D, 0xB647, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH - {0xB648, 0xB648, prLV}, // Lo HANGUL SYLLABLE DDWAE - {0xB649, 0xB663, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH - {0xB664, 0xB664, prLV}, // Lo HANGUL SYLLABLE DDOE - {0xB665, 0xB67F, prLVT}, // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH - {0xB680, 0xB680, prLV}, // Lo HANGUL SYLLABLE DDYO - {0xB681, 0xB69B, prLVT}, // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH - {0xB69C, 0xB69C, prLV}, // Lo HANGUL SYLLABLE DDU - {0xB69D, 0xB6B7, prLVT}, // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH - {0xB6B8, 0xB6B8, prLV}, // Lo HANGUL SYLLABLE DDWEO - {0xB6B9, 0xB6D3, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH - {0xB6D4, 0xB6D4, prLV}, // Lo HANGUL SYLLABLE DDWE - {0xB6D5, 0xB6EF, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH - {0xB6F0, 0xB6F0, prLV}, // Lo HANGUL SYLLABLE DDWI - {0xB6F1, 0xB70B, prLVT}, // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH - {0xB70C, 0xB70C, prLV}, // Lo HANGUL SYLLABLE DDYU - {0xB70D, 0xB727, prLVT}, // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH - {0xB728, 0xB728, prLV}, // Lo HANGUL SYLLABLE DDEU - {0xB729, 0xB743, prLVT}, // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH - {0xB744, 0xB744, prLV}, // Lo HANGUL SYLLABLE DDYI - {0xB745, 0xB75F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH - {0xB760, 0xB760, prLV}, // Lo HANGUL SYLLABLE DDI - {0xB761, 0xB77B, prLVT}, // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH - {0xB77C, 0xB77C, prLV}, // Lo HANGUL SYLLABLE RA - {0xB77D, 0xB797, prLVT}, // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH - {0xB798, 0xB798, prLV}, // Lo HANGUL SYLLABLE RAE - {0xB799, 0xB7B3, prLVT}, // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH - {0xB7B4, 0xB7B4, prLV}, // Lo HANGUL SYLLABLE RYA - {0xB7B5, 0xB7CF, prLVT}, // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH - {0xB7D0, 0xB7D0, prLV}, // Lo HANGUL SYLLABLE RYAE - {0xB7D1, 0xB7EB, prLVT}, // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH - {0xB7EC, 0xB7EC, prLV}, // Lo HANGUL SYLLABLE REO - {0xB7ED, 0xB807, prLVT}, // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH - {0xB808, 0xB808, prLV}, // Lo HANGUL SYLLABLE RE - {0xB809, 0xB823, prLVT}, // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH - {0xB824, 0xB824, prLV}, // Lo HANGUL SYLLABLE RYEO - {0xB825, 0xB83F, prLVT}, // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH - {0xB840, 0xB840, prLV}, // Lo HANGUL SYLLABLE RYE - {0xB841, 0xB85B, prLVT}, // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH - {0xB85C, 0xB85C, prLV}, // Lo HANGUL SYLLABLE RO - {0xB85D, 0xB877, prLVT}, // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH - {0xB878, 0xB878, prLV}, // Lo HANGUL SYLLABLE RWA - {0xB879, 0xB893, prLVT}, // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH - {0xB894, 0xB894, prLV}, // Lo HANGUL SYLLABLE RWAE - {0xB895, 0xB8AF, prLVT}, // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH - {0xB8B0, 0xB8B0, prLV}, // Lo HANGUL SYLLABLE ROE - {0xB8B1, 0xB8CB, prLVT}, // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH - {0xB8CC, 0xB8CC, prLV}, // Lo HANGUL SYLLABLE RYO - {0xB8CD, 0xB8E7, prLVT}, // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH - {0xB8E8, 0xB8E8, prLV}, // Lo HANGUL SYLLABLE RU - {0xB8E9, 0xB903, prLVT}, // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH - {0xB904, 0xB904, prLV}, // Lo HANGUL SYLLABLE RWEO - {0xB905, 0xB91F, prLVT}, // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH - {0xB920, 0xB920, prLV}, // Lo HANGUL SYLLABLE RWE - {0xB921, 0xB93B, prLVT}, // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH - {0xB93C, 0xB93C, prLV}, // Lo HANGUL SYLLABLE RWI - {0xB93D, 0xB957, prLVT}, // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH - {0xB958, 0xB958, prLV}, // Lo HANGUL SYLLABLE RYU - {0xB959, 0xB973, prLVT}, // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH - {0xB974, 0xB974, prLV}, // Lo HANGUL SYLLABLE REU - {0xB975, 0xB98F, prLVT}, // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH - {0xB990, 0xB990, prLV}, // Lo HANGUL SYLLABLE RYI - {0xB991, 0xB9AB, prLVT}, // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH - {0xB9AC, 0xB9AC, prLV}, // Lo HANGUL SYLLABLE RI - {0xB9AD, 0xB9C7, prLVT}, // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH - {0xB9C8, 0xB9C8, prLV}, // Lo HANGUL SYLLABLE MA - {0xB9C9, 0xB9E3, prLVT}, // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH - {0xB9E4, 0xB9E4, prLV}, // Lo HANGUL SYLLABLE MAE - {0xB9E5, 0xB9FF, prLVT}, // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH - {0xBA00, 0xBA00, prLV}, // Lo HANGUL SYLLABLE MYA - {0xBA01, 0xBA1B, prLVT}, // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH - {0xBA1C, 0xBA1C, prLV}, // Lo HANGUL SYLLABLE MYAE - {0xBA1D, 0xBA37, prLVT}, // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH - {0xBA38, 0xBA38, prLV}, // Lo HANGUL SYLLABLE MEO - {0xBA39, 0xBA53, prLVT}, // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH - {0xBA54, 0xBA54, prLV}, // Lo HANGUL SYLLABLE ME - {0xBA55, 0xBA6F, prLVT}, // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH - {0xBA70, 0xBA70, prLV}, // Lo HANGUL SYLLABLE MYEO - {0xBA71, 0xBA8B, prLVT}, // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH - {0xBA8C, 0xBA8C, prLV}, // Lo HANGUL SYLLABLE MYE - {0xBA8D, 0xBAA7, prLVT}, // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH - {0xBAA8, 0xBAA8, prLV}, // Lo HANGUL SYLLABLE MO - {0xBAA9, 0xBAC3, prLVT}, // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH - {0xBAC4, 0xBAC4, prLV}, // Lo HANGUL SYLLABLE MWA - {0xBAC5, 0xBADF, prLVT}, // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH - {0xBAE0, 0xBAE0, prLV}, // Lo HANGUL SYLLABLE MWAE - {0xBAE1, 0xBAFB, prLVT}, // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH - {0xBAFC, 0xBAFC, prLV}, // Lo HANGUL SYLLABLE MOE - {0xBAFD, 0xBB17, prLVT}, // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH - {0xBB18, 0xBB18, prLV}, // Lo HANGUL SYLLABLE MYO - {0xBB19, 0xBB33, prLVT}, // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH - {0xBB34, 0xBB34, prLV}, // Lo HANGUL SYLLABLE MU - {0xBB35, 0xBB4F, prLVT}, // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH - {0xBB50, 0xBB50, prLV}, // Lo HANGUL SYLLABLE MWEO - {0xBB51, 0xBB6B, prLVT}, // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH - {0xBB6C, 0xBB6C, prLV}, // Lo HANGUL SYLLABLE MWE - {0xBB6D, 0xBB87, prLVT}, // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH - {0xBB88, 0xBB88, prLV}, // Lo HANGUL SYLLABLE MWI - {0xBB89, 0xBBA3, prLVT}, // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH - {0xBBA4, 0xBBA4, prLV}, // Lo HANGUL SYLLABLE MYU - {0xBBA5, 0xBBBF, prLVT}, // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH - {0xBBC0, 0xBBC0, prLV}, // Lo HANGUL SYLLABLE MEU - {0xBBC1, 0xBBDB, prLVT}, // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH - {0xBBDC, 0xBBDC, prLV}, // Lo HANGUL SYLLABLE MYI - {0xBBDD, 0xBBF7, prLVT}, // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH - {0xBBF8, 0xBBF8, prLV}, // Lo HANGUL SYLLABLE MI - {0xBBF9, 0xBC13, prLVT}, // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH - {0xBC14, 0xBC14, prLV}, // Lo HANGUL SYLLABLE BA - {0xBC15, 0xBC2F, prLVT}, // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH - {0xBC30, 0xBC30, prLV}, // Lo HANGUL SYLLABLE BAE - {0xBC31, 0xBC4B, prLVT}, // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH - {0xBC4C, 0xBC4C, prLV}, // Lo HANGUL SYLLABLE BYA - {0xBC4D, 0xBC67, prLVT}, // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH - {0xBC68, 0xBC68, prLV}, // Lo HANGUL SYLLABLE BYAE - {0xBC69, 0xBC83, prLVT}, // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH - {0xBC84, 0xBC84, prLV}, // Lo HANGUL SYLLABLE BEO - {0xBC85, 0xBC9F, prLVT}, // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH - {0xBCA0, 0xBCA0, prLV}, // Lo HANGUL SYLLABLE BE - {0xBCA1, 0xBCBB, prLVT}, // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH - {0xBCBC, 0xBCBC, prLV}, // Lo HANGUL SYLLABLE BYEO - {0xBCBD, 0xBCD7, prLVT}, // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH - {0xBCD8, 0xBCD8, prLV}, // Lo HANGUL SYLLABLE BYE - {0xBCD9, 0xBCF3, prLVT}, // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH - {0xBCF4, 0xBCF4, prLV}, // Lo HANGUL SYLLABLE BO - {0xBCF5, 0xBD0F, prLVT}, // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH - {0xBD10, 0xBD10, prLV}, // Lo HANGUL SYLLABLE BWA - {0xBD11, 0xBD2B, prLVT}, // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH - {0xBD2C, 0xBD2C, prLV}, // Lo HANGUL SYLLABLE BWAE - {0xBD2D, 0xBD47, prLVT}, // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH - {0xBD48, 0xBD48, prLV}, // Lo HANGUL SYLLABLE BOE - {0xBD49, 0xBD63, prLVT}, // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH - {0xBD64, 0xBD64, prLV}, // Lo HANGUL SYLLABLE BYO - {0xBD65, 0xBD7F, prLVT}, // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH - {0xBD80, 0xBD80, prLV}, // Lo HANGUL SYLLABLE BU - {0xBD81, 0xBD9B, prLVT}, // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH - {0xBD9C, 0xBD9C, prLV}, // Lo HANGUL SYLLABLE BWEO - {0xBD9D, 0xBDB7, prLVT}, // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH - {0xBDB8, 0xBDB8, prLV}, // Lo HANGUL SYLLABLE BWE - {0xBDB9, 0xBDD3, prLVT}, // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH - {0xBDD4, 0xBDD4, prLV}, // Lo HANGUL SYLLABLE BWI - {0xBDD5, 0xBDEF, prLVT}, // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH - {0xBDF0, 0xBDF0, prLV}, // Lo HANGUL SYLLABLE BYU - {0xBDF1, 0xBE0B, prLVT}, // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH - {0xBE0C, 0xBE0C, prLV}, // Lo HANGUL SYLLABLE BEU - {0xBE0D, 0xBE27, prLVT}, // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH - {0xBE28, 0xBE28, prLV}, // Lo HANGUL SYLLABLE BYI - {0xBE29, 0xBE43, prLVT}, // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH - {0xBE44, 0xBE44, prLV}, // Lo HANGUL SYLLABLE BI - {0xBE45, 0xBE5F, prLVT}, // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH - {0xBE60, 0xBE60, prLV}, // Lo HANGUL SYLLABLE BBA - {0xBE61, 0xBE7B, prLVT}, // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH - {0xBE7C, 0xBE7C, prLV}, // Lo HANGUL SYLLABLE BBAE - {0xBE7D, 0xBE97, prLVT}, // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH - {0xBE98, 0xBE98, prLV}, // Lo HANGUL SYLLABLE BBYA - {0xBE99, 0xBEB3, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH - {0xBEB4, 0xBEB4, prLV}, // Lo HANGUL SYLLABLE BBYAE - {0xBEB5, 0xBECF, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH - {0xBED0, 0xBED0, prLV}, // Lo HANGUL SYLLABLE BBEO - {0xBED1, 0xBEEB, prLVT}, // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH - {0xBEEC, 0xBEEC, prLV}, // Lo HANGUL SYLLABLE BBE - {0xBEED, 0xBF07, prLVT}, // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH - {0xBF08, 0xBF08, prLV}, // Lo HANGUL SYLLABLE BBYEO - {0xBF09, 0xBF23, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH - {0xBF24, 0xBF24, prLV}, // Lo HANGUL SYLLABLE BBYE - {0xBF25, 0xBF3F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH - {0xBF40, 0xBF40, prLV}, // Lo HANGUL SYLLABLE BBO - {0xBF41, 0xBF5B, prLVT}, // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH - {0xBF5C, 0xBF5C, prLV}, // Lo HANGUL SYLLABLE BBWA - {0xBF5D, 0xBF77, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH - {0xBF78, 0xBF78, prLV}, // Lo HANGUL SYLLABLE BBWAE - {0xBF79, 0xBF93, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH - {0xBF94, 0xBF94, prLV}, // Lo HANGUL SYLLABLE BBOE - {0xBF95, 0xBFAF, prLVT}, // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH - {0xBFB0, 0xBFB0, prLV}, // Lo HANGUL SYLLABLE BBYO - {0xBFB1, 0xBFCB, prLVT}, // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH - {0xBFCC, 0xBFCC, prLV}, // Lo HANGUL SYLLABLE BBU - {0xBFCD, 0xBFE7, prLVT}, // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH - {0xBFE8, 0xBFE8, prLV}, // Lo HANGUL SYLLABLE BBWEO - {0xBFE9, 0xC003, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH - {0xC004, 0xC004, prLV}, // Lo HANGUL SYLLABLE BBWE - {0xC005, 0xC01F, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH - {0xC020, 0xC020, prLV}, // Lo HANGUL SYLLABLE BBWI - {0xC021, 0xC03B, prLVT}, // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH - {0xC03C, 0xC03C, prLV}, // Lo HANGUL SYLLABLE BBYU - {0xC03D, 0xC057, prLVT}, // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH - {0xC058, 0xC058, prLV}, // Lo HANGUL SYLLABLE BBEU - {0xC059, 0xC073, prLVT}, // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH - {0xC074, 0xC074, prLV}, // Lo HANGUL SYLLABLE BBYI - {0xC075, 0xC08F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH - {0xC090, 0xC090, prLV}, // Lo HANGUL SYLLABLE BBI - {0xC091, 0xC0AB, prLVT}, // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH - {0xC0AC, 0xC0AC, prLV}, // Lo HANGUL SYLLABLE SA - {0xC0AD, 0xC0C7, prLVT}, // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH - {0xC0C8, 0xC0C8, prLV}, // Lo HANGUL SYLLABLE SAE - {0xC0C9, 0xC0E3, prLVT}, // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH - {0xC0E4, 0xC0E4, prLV}, // Lo HANGUL SYLLABLE SYA - {0xC0E5, 0xC0FF, prLVT}, // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH - {0xC100, 0xC100, prLV}, // Lo HANGUL SYLLABLE SYAE - {0xC101, 0xC11B, prLVT}, // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH - {0xC11C, 0xC11C, prLV}, // Lo HANGUL SYLLABLE SEO - {0xC11D, 0xC137, prLVT}, // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH - {0xC138, 0xC138, prLV}, // Lo HANGUL SYLLABLE SE - {0xC139, 0xC153, prLVT}, // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH - {0xC154, 0xC154, prLV}, // Lo HANGUL SYLLABLE SYEO - {0xC155, 0xC16F, prLVT}, // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH - {0xC170, 0xC170, prLV}, // Lo HANGUL SYLLABLE SYE - {0xC171, 0xC18B, prLVT}, // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH - {0xC18C, 0xC18C, prLV}, // Lo HANGUL SYLLABLE SO - {0xC18D, 0xC1A7, prLVT}, // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH - {0xC1A8, 0xC1A8, prLV}, // Lo HANGUL SYLLABLE SWA - {0xC1A9, 0xC1C3, prLVT}, // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH - {0xC1C4, 0xC1C4, prLV}, // Lo HANGUL SYLLABLE SWAE - {0xC1C5, 0xC1DF, prLVT}, // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH - {0xC1E0, 0xC1E0, prLV}, // Lo HANGUL SYLLABLE SOE - {0xC1E1, 0xC1FB, prLVT}, // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH - {0xC1FC, 0xC1FC, prLV}, // Lo HANGUL SYLLABLE SYO - {0xC1FD, 0xC217, prLVT}, // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH - {0xC218, 0xC218, prLV}, // Lo HANGUL SYLLABLE SU - {0xC219, 0xC233, prLVT}, // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH - {0xC234, 0xC234, prLV}, // Lo HANGUL SYLLABLE SWEO - {0xC235, 0xC24F, prLVT}, // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH - {0xC250, 0xC250, prLV}, // Lo HANGUL SYLLABLE SWE - {0xC251, 0xC26B, prLVT}, // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH - {0xC26C, 0xC26C, prLV}, // Lo HANGUL SYLLABLE SWI - {0xC26D, 0xC287, prLVT}, // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH - {0xC288, 0xC288, prLV}, // Lo HANGUL SYLLABLE SYU - {0xC289, 0xC2A3, prLVT}, // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH - {0xC2A4, 0xC2A4, prLV}, // Lo HANGUL SYLLABLE SEU - {0xC2A5, 0xC2BF, prLVT}, // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH - {0xC2C0, 0xC2C0, prLV}, // Lo HANGUL SYLLABLE SYI - {0xC2C1, 0xC2DB, prLVT}, // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH - {0xC2DC, 0xC2DC, prLV}, // Lo HANGUL SYLLABLE SI - {0xC2DD, 0xC2F7, prLVT}, // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH - {0xC2F8, 0xC2F8, prLV}, // Lo HANGUL SYLLABLE SSA - {0xC2F9, 0xC313, prLVT}, // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH - {0xC314, 0xC314, prLV}, // Lo HANGUL SYLLABLE SSAE - {0xC315, 0xC32F, prLVT}, // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH - {0xC330, 0xC330, prLV}, // Lo HANGUL SYLLABLE SSYA - {0xC331, 0xC34B, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH - {0xC34C, 0xC34C, prLV}, // Lo HANGUL SYLLABLE SSYAE - {0xC34D, 0xC367, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH - {0xC368, 0xC368, prLV}, // Lo HANGUL SYLLABLE SSEO - {0xC369, 0xC383, prLVT}, // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH - {0xC384, 0xC384, prLV}, // Lo HANGUL SYLLABLE SSE - {0xC385, 0xC39F, prLVT}, // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH - {0xC3A0, 0xC3A0, prLV}, // Lo HANGUL SYLLABLE SSYEO - {0xC3A1, 0xC3BB, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH - {0xC3BC, 0xC3BC, prLV}, // Lo HANGUL SYLLABLE SSYE - {0xC3BD, 0xC3D7, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH - {0xC3D8, 0xC3D8, prLV}, // Lo HANGUL SYLLABLE SSO - {0xC3D9, 0xC3F3, prLVT}, // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH - {0xC3F4, 0xC3F4, prLV}, // Lo HANGUL SYLLABLE SSWA - {0xC3F5, 0xC40F, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH - {0xC410, 0xC410, prLV}, // Lo HANGUL SYLLABLE SSWAE - {0xC411, 0xC42B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH - {0xC42C, 0xC42C, prLV}, // Lo HANGUL SYLLABLE SSOE - {0xC42D, 0xC447, prLVT}, // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH - {0xC448, 0xC448, prLV}, // Lo HANGUL SYLLABLE SSYO - {0xC449, 0xC463, prLVT}, // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH - {0xC464, 0xC464, prLV}, // Lo HANGUL SYLLABLE SSU - {0xC465, 0xC47F, prLVT}, // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH - {0xC480, 0xC480, prLV}, // Lo HANGUL SYLLABLE SSWEO - {0xC481, 0xC49B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH - {0xC49C, 0xC49C, prLV}, // Lo HANGUL SYLLABLE SSWE - {0xC49D, 0xC4B7, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH - {0xC4B8, 0xC4B8, prLV}, // Lo HANGUL SYLLABLE SSWI - {0xC4B9, 0xC4D3, prLVT}, // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH - {0xC4D4, 0xC4D4, prLV}, // Lo HANGUL SYLLABLE SSYU - {0xC4D5, 0xC4EF, prLVT}, // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH - {0xC4F0, 0xC4F0, prLV}, // Lo HANGUL SYLLABLE SSEU - {0xC4F1, 0xC50B, prLVT}, // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH - {0xC50C, 0xC50C, prLV}, // Lo HANGUL SYLLABLE SSYI - {0xC50D, 0xC527, prLVT}, // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH - {0xC528, 0xC528, prLV}, // Lo HANGUL SYLLABLE SSI - {0xC529, 0xC543, prLVT}, // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH - {0xC544, 0xC544, prLV}, // Lo HANGUL SYLLABLE A - {0xC545, 0xC55F, prLVT}, // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH - {0xC560, 0xC560, prLV}, // Lo HANGUL SYLLABLE AE - {0xC561, 0xC57B, prLVT}, // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH - {0xC57C, 0xC57C, prLV}, // Lo HANGUL SYLLABLE YA - {0xC57D, 0xC597, prLVT}, // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH - {0xC598, 0xC598, prLV}, // Lo HANGUL SYLLABLE YAE - {0xC599, 0xC5B3, prLVT}, // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH - {0xC5B4, 0xC5B4, prLV}, // Lo HANGUL SYLLABLE EO - {0xC5B5, 0xC5CF, prLVT}, // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH - {0xC5D0, 0xC5D0, prLV}, // Lo HANGUL SYLLABLE E - {0xC5D1, 0xC5EB, prLVT}, // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH - {0xC5EC, 0xC5EC, prLV}, // Lo HANGUL SYLLABLE YEO - {0xC5ED, 0xC607, prLVT}, // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH - {0xC608, 0xC608, prLV}, // Lo HANGUL SYLLABLE YE - {0xC609, 0xC623, prLVT}, // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH - {0xC624, 0xC624, prLV}, // Lo HANGUL SYLLABLE O - {0xC625, 0xC63F, prLVT}, // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH - {0xC640, 0xC640, prLV}, // Lo HANGUL SYLLABLE WA - {0xC641, 0xC65B, prLVT}, // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH - {0xC65C, 0xC65C, prLV}, // Lo HANGUL SYLLABLE WAE - {0xC65D, 0xC677, prLVT}, // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH - {0xC678, 0xC678, prLV}, // Lo HANGUL SYLLABLE OE - {0xC679, 0xC693, prLVT}, // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH - {0xC694, 0xC694, prLV}, // Lo HANGUL SYLLABLE YO - {0xC695, 0xC6AF, prLVT}, // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH - {0xC6B0, 0xC6B0, prLV}, // Lo HANGUL SYLLABLE U - {0xC6B1, 0xC6CB, prLVT}, // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH - {0xC6CC, 0xC6CC, prLV}, // Lo HANGUL SYLLABLE WEO - {0xC6CD, 0xC6E7, prLVT}, // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH - {0xC6E8, 0xC6E8, prLV}, // Lo HANGUL SYLLABLE WE - {0xC6E9, 0xC703, prLVT}, // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH - {0xC704, 0xC704, prLV}, // Lo HANGUL SYLLABLE WI - {0xC705, 0xC71F, prLVT}, // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH - {0xC720, 0xC720, prLV}, // Lo HANGUL SYLLABLE YU - {0xC721, 0xC73B, prLVT}, // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH - {0xC73C, 0xC73C, prLV}, // Lo HANGUL SYLLABLE EU - {0xC73D, 0xC757, prLVT}, // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH - {0xC758, 0xC758, prLV}, // Lo HANGUL SYLLABLE YI - {0xC759, 0xC773, prLVT}, // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH - {0xC774, 0xC774, prLV}, // Lo HANGUL SYLLABLE I - {0xC775, 0xC78F, prLVT}, // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH - {0xC790, 0xC790, prLV}, // Lo HANGUL SYLLABLE JA - {0xC791, 0xC7AB, prLVT}, // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH - {0xC7AC, 0xC7AC, prLV}, // Lo HANGUL SYLLABLE JAE - {0xC7AD, 0xC7C7, prLVT}, // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH - {0xC7C8, 0xC7C8, prLV}, // Lo HANGUL SYLLABLE JYA - {0xC7C9, 0xC7E3, prLVT}, // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH - {0xC7E4, 0xC7E4, prLV}, // Lo HANGUL SYLLABLE JYAE - {0xC7E5, 0xC7FF, prLVT}, // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH - {0xC800, 0xC800, prLV}, // Lo HANGUL SYLLABLE JEO - {0xC801, 0xC81B, prLVT}, // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH - {0xC81C, 0xC81C, prLV}, // Lo HANGUL SYLLABLE JE - {0xC81D, 0xC837, prLVT}, // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH - {0xC838, 0xC838, prLV}, // Lo HANGUL SYLLABLE JYEO - {0xC839, 0xC853, prLVT}, // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH - {0xC854, 0xC854, prLV}, // Lo HANGUL SYLLABLE JYE - {0xC855, 0xC86F, prLVT}, // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH - {0xC870, 0xC870, prLV}, // Lo HANGUL SYLLABLE JO - {0xC871, 0xC88B, prLVT}, // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH - {0xC88C, 0xC88C, prLV}, // Lo HANGUL SYLLABLE JWA - {0xC88D, 0xC8A7, prLVT}, // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH - {0xC8A8, 0xC8A8, prLV}, // Lo HANGUL SYLLABLE JWAE - {0xC8A9, 0xC8C3, prLVT}, // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH - {0xC8C4, 0xC8C4, prLV}, // Lo HANGUL SYLLABLE JOE - {0xC8C5, 0xC8DF, prLVT}, // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH - {0xC8E0, 0xC8E0, prLV}, // Lo HANGUL SYLLABLE JYO - {0xC8E1, 0xC8FB, prLVT}, // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH - {0xC8FC, 0xC8FC, prLV}, // Lo HANGUL SYLLABLE JU - {0xC8FD, 0xC917, prLVT}, // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH - {0xC918, 0xC918, prLV}, // Lo HANGUL SYLLABLE JWEO - {0xC919, 0xC933, prLVT}, // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH - {0xC934, 0xC934, prLV}, // Lo HANGUL SYLLABLE JWE - {0xC935, 0xC94F, prLVT}, // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH - {0xC950, 0xC950, prLV}, // Lo HANGUL SYLLABLE JWI - {0xC951, 0xC96B, prLVT}, // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH - {0xC96C, 0xC96C, prLV}, // Lo HANGUL SYLLABLE JYU - {0xC96D, 0xC987, prLVT}, // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH - {0xC988, 0xC988, prLV}, // Lo HANGUL SYLLABLE JEU - {0xC989, 0xC9A3, prLVT}, // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH - {0xC9A4, 0xC9A4, prLV}, // Lo HANGUL SYLLABLE JYI - {0xC9A5, 0xC9BF, prLVT}, // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH - {0xC9C0, 0xC9C0, prLV}, // Lo HANGUL SYLLABLE JI - {0xC9C1, 0xC9DB, prLVT}, // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH - {0xC9DC, 0xC9DC, prLV}, // Lo HANGUL SYLLABLE JJA - {0xC9DD, 0xC9F7, prLVT}, // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH - {0xC9F8, 0xC9F8, prLV}, // Lo HANGUL SYLLABLE JJAE - {0xC9F9, 0xCA13, prLVT}, // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH - {0xCA14, 0xCA14, prLV}, // Lo HANGUL SYLLABLE JJYA - {0xCA15, 0xCA2F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH - {0xCA30, 0xCA30, prLV}, // Lo HANGUL SYLLABLE JJYAE - {0xCA31, 0xCA4B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH - {0xCA4C, 0xCA4C, prLV}, // Lo HANGUL SYLLABLE JJEO - {0xCA4D, 0xCA67, prLVT}, // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH - {0xCA68, 0xCA68, prLV}, // Lo HANGUL SYLLABLE JJE - {0xCA69, 0xCA83, prLVT}, // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH - {0xCA84, 0xCA84, prLV}, // Lo HANGUL SYLLABLE JJYEO - {0xCA85, 0xCA9F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH - {0xCAA0, 0xCAA0, prLV}, // Lo HANGUL SYLLABLE JJYE - {0xCAA1, 0xCABB, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH - {0xCABC, 0xCABC, prLV}, // Lo HANGUL SYLLABLE JJO - {0xCABD, 0xCAD7, prLVT}, // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH - {0xCAD8, 0xCAD8, prLV}, // Lo HANGUL SYLLABLE JJWA - {0xCAD9, 0xCAF3, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH - {0xCAF4, 0xCAF4, prLV}, // Lo HANGUL SYLLABLE JJWAE - {0xCAF5, 0xCB0F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH - {0xCB10, 0xCB10, prLV}, // Lo HANGUL SYLLABLE JJOE - {0xCB11, 0xCB2B, prLVT}, // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH - {0xCB2C, 0xCB2C, prLV}, // Lo HANGUL SYLLABLE JJYO - {0xCB2D, 0xCB47, prLVT}, // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH - {0xCB48, 0xCB48, prLV}, // Lo HANGUL SYLLABLE JJU - {0xCB49, 0xCB63, prLVT}, // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH - {0xCB64, 0xCB64, prLV}, // Lo HANGUL SYLLABLE JJWEO - {0xCB65, 0xCB7F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH - {0xCB80, 0xCB80, prLV}, // Lo HANGUL SYLLABLE JJWE - {0xCB81, 0xCB9B, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH - {0xCB9C, 0xCB9C, prLV}, // Lo HANGUL SYLLABLE JJWI - {0xCB9D, 0xCBB7, prLVT}, // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH - {0xCBB8, 0xCBB8, prLV}, // Lo HANGUL SYLLABLE JJYU - {0xCBB9, 0xCBD3, prLVT}, // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH - {0xCBD4, 0xCBD4, prLV}, // Lo HANGUL SYLLABLE JJEU - {0xCBD5, 0xCBEF, prLVT}, // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH - {0xCBF0, 0xCBF0, prLV}, // Lo HANGUL SYLLABLE JJYI - {0xCBF1, 0xCC0B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH - {0xCC0C, 0xCC0C, prLV}, // Lo HANGUL SYLLABLE JJI - {0xCC0D, 0xCC27, prLVT}, // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH - {0xCC28, 0xCC28, prLV}, // Lo HANGUL SYLLABLE CA - {0xCC29, 0xCC43, prLVT}, // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH - {0xCC44, 0xCC44, prLV}, // Lo HANGUL SYLLABLE CAE - {0xCC45, 0xCC5F, prLVT}, // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH - {0xCC60, 0xCC60, prLV}, // Lo HANGUL SYLLABLE CYA - {0xCC61, 0xCC7B, prLVT}, // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH - {0xCC7C, 0xCC7C, prLV}, // Lo HANGUL SYLLABLE CYAE - {0xCC7D, 0xCC97, prLVT}, // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH - {0xCC98, 0xCC98, prLV}, // Lo HANGUL SYLLABLE CEO - {0xCC99, 0xCCB3, prLVT}, // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH - {0xCCB4, 0xCCB4, prLV}, // Lo HANGUL SYLLABLE CE - {0xCCB5, 0xCCCF, prLVT}, // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH - {0xCCD0, 0xCCD0, prLV}, // Lo HANGUL SYLLABLE CYEO - {0xCCD1, 0xCCEB, prLVT}, // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH - {0xCCEC, 0xCCEC, prLV}, // Lo HANGUL SYLLABLE CYE - {0xCCED, 0xCD07, prLVT}, // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH - {0xCD08, 0xCD08, prLV}, // Lo HANGUL SYLLABLE CO - {0xCD09, 0xCD23, prLVT}, // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH - {0xCD24, 0xCD24, prLV}, // Lo HANGUL SYLLABLE CWA - {0xCD25, 0xCD3F, prLVT}, // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH - {0xCD40, 0xCD40, prLV}, // Lo HANGUL SYLLABLE CWAE - {0xCD41, 0xCD5B, prLVT}, // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH - {0xCD5C, 0xCD5C, prLV}, // Lo HANGUL SYLLABLE COE - {0xCD5D, 0xCD77, prLVT}, // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH - {0xCD78, 0xCD78, prLV}, // Lo HANGUL SYLLABLE CYO - {0xCD79, 0xCD93, prLVT}, // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH - {0xCD94, 0xCD94, prLV}, // Lo HANGUL SYLLABLE CU - {0xCD95, 0xCDAF, prLVT}, // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH - {0xCDB0, 0xCDB0, prLV}, // Lo HANGUL SYLLABLE CWEO - {0xCDB1, 0xCDCB, prLVT}, // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH - {0xCDCC, 0xCDCC, prLV}, // Lo HANGUL SYLLABLE CWE - {0xCDCD, 0xCDE7, prLVT}, // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH - {0xCDE8, 0xCDE8, prLV}, // Lo HANGUL SYLLABLE CWI - {0xCDE9, 0xCE03, prLVT}, // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH - {0xCE04, 0xCE04, prLV}, // Lo HANGUL SYLLABLE CYU - {0xCE05, 0xCE1F, prLVT}, // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH - {0xCE20, 0xCE20, prLV}, // Lo HANGUL SYLLABLE CEU - {0xCE21, 0xCE3B, prLVT}, // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH - {0xCE3C, 0xCE3C, prLV}, // Lo HANGUL SYLLABLE CYI - {0xCE3D, 0xCE57, prLVT}, // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH - {0xCE58, 0xCE58, prLV}, // Lo HANGUL SYLLABLE CI - {0xCE59, 0xCE73, prLVT}, // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH - {0xCE74, 0xCE74, prLV}, // Lo HANGUL SYLLABLE KA - {0xCE75, 0xCE8F, prLVT}, // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH - {0xCE90, 0xCE90, prLV}, // Lo HANGUL SYLLABLE KAE - {0xCE91, 0xCEAB, prLVT}, // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH - {0xCEAC, 0xCEAC, prLV}, // Lo HANGUL SYLLABLE KYA - {0xCEAD, 0xCEC7, prLVT}, // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH - {0xCEC8, 0xCEC8, prLV}, // Lo HANGUL SYLLABLE KYAE - {0xCEC9, 0xCEE3, prLVT}, // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH - {0xCEE4, 0xCEE4, prLV}, // Lo HANGUL SYLLABLE KEO - {0xCEE5, 0xCEFF, prLVT}, // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH - {0xCF00, 0xCF00, prLV}, // Lo HANGUL SYLLABLE KE - {0xCF01, 0xCF1B, prLVT}, // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH - {0xCF1C, 0xCF1C, prLV}, // Lo HANGUL SYLLABLE KYEO - {0xCF1D, 0xCF37, prLVT}, // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH - {0xCF38, 0xCF38, prLV}, // Lo HANGUL SYLLABLE KYE - {0xCF39, 0xCF53, prLVT}, // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH - {0xCF54, 0xCF54, prLV}, // Lo HANGUL SYLLABLE KO - {0xCF55, 0xCF6F, prLVT}, // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH - {0xCF70, 0xCF70, prLV}, // Lo HANGUL SYLLABLE KWA - {0xCF71, 0xCF8B, prLVT}, // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH - {0xCF8C, 0xCF8C, prLV}, // Lo HANGUL SYLLABLE KWAE - {0xCF8D, 0xCFA7, prLVT}, // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH - {0xCFA8, 0xCFA8, prLV}, // Lo HANGUL SYLLABLE KOE - {0xCFA9, 0xCFC3, prLVT}, // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH - {0xCFC4, 0xCFC4, prLV}, // Lo HANGUL SYLLABLE KYO - {0xCFC5, 0xCFDF, prLVT}, // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH - {0xCFE0, 0xCFE0, prLV}, // Lo HANGUL SYLLABLE KU - {0xCFE1, 0xCFFB, prLVT}, // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH - {0xCFFC, 0xCFFC, prLV}, // Lo HANGUL SYLLABLE KWEO - {0xCFFD, 0xD017, prLVT}, // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH - {0xD018, 0xD018, prLV}, // Lo HANGUL SYLLABLE KWE - {0xD019, 0xD033, prLVT}, // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH - {0xD034, 0xD034, prLV}, // Lo HANGUL SYLLABLE KWI - {0xD035, 0xD04F, prLVT}, // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH - {0xD050, 0xD050, prLV}, // Lo HANGUL SYLLABLE KYU - {0xD051, 0xD06B, prLVT}, // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH - {0xD06C, 0xD06C, prLV}, // Lo HANGUL SYLLABLE KEU - {0xD06D, 0xD087, prLVT}, // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH - {0xD088, 0xD088, prLV}, // Lo HANGUL SYLLABLE KYI - {0xD089, 0xD0A3, prLVT}, // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH - {0xD0A4, 0xD0A4, prLV}, // Lo HANGUL SYLLABLE KI - {0xD0A5, 0xD0BF, prLVT}, // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH - {0xD0C0, 0xD0C0, prLV}, // Lo HANGUL SYLLABLE TA - {0xD0C1, 0xD0DB, prLVT}, // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH - {0xD0DC, 0xD0DC, prLV}, // Lo HANGUL SYLLABLE TAE - {0xD0DD, 0xD0F7, prLVT}, // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH - {0xD0F8, 0xD0F8, prLV}, // Lo HANGUL SYLLABLE TYA - {0xD0F9, 0xD113, prLVT}, // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH - {0xD114, 0xD114, prLV}, // Lo HANGUL SYLLABLE TYAE - {0xD115, 0xD12F, prLVT}, // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH - {0xD130, 0xD130, prLV}, // Lo HANGUL SYLLABLE TEO - {0xD131, 0xD14B, prLVT}, // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH - {0xD14C, 0xD14C, prLV}, // Lo HANGUL SYLLABLE TE - {0xD14D, 0xD167, prLVT}, // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH - {0xD168, 0xD168, prLV}, // Lo HANGUL SYLLABLE TYEO - {0xD169, 0xD183, prLVT}, // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH - {0xD184, 0xD184, prLV}, // Lo HANGUL SYLLABLE TYE - {0xD185, 0xD19F, prLVT}, // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH - {0xD1A0, 0xD1A0, prLV}, // Lo HANGUL SYLLABLE TO - {0xD1A1, 0xD1BB, prLVT}, // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH - {0xD1BC, 0xD1BC, prLV}, // Lo HANGUL SYLLABLE TWA - {0xD1BD, 0xD1D7, prLVT}, // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH - {0xD1D8, 0xD1D8, prLV}, // Lo HANGUL SYLLABLE TWAE - {0xD1D9, 0xD1F3, prLVT}, // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH - {0xD1F4, 0xD1F4, prLV}, // Lo HANGUL SYLLABLE TOE - {0xD1F5, 0xD20F, prLVT}, // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH - {0xD210, 0xD210, prLV}, // Lo HANGUL SYLLABLE TYO - {0xD211, 0xD22B, prLVT}, // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH - {0xD22C, 0xD22C, prLV}, // Lo HANGUL SYLLABLE TU - {0xD22D, 0xD247, prLVT}, // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH - {0xD248, 0xD248, prLV}, // Lo HANGUL SYLLABLE TWEO - {0xD249, 0xD263, prLVT}, // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH - {0xD264, 0xD264, prLV}, // Lo HANGUL SYLLABLE TWE - {0xD265, 0xD27F, prLVT}, // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH - {0xD280, 0xD280, prLV}, // Lo HANGUL SYLLABLE TWI - {0xD281, 0xD29B, prLVT}, // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH - {0xD29C, 0xD29C, prLV}, // Lo HANGUL SYLLABLE TYU - {0xD29D, 0xD2B7, prLVT}, // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH - {0xD2B8, 0xD2B8, prLV}, // Lo HANGUL SYLLABLE TEU - {0xD2B9, 0xD2D3, prLVT}, // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH - {0xD2D4, 0xD2D4, prLV}, // Lo HANGUL SYLLABLE TYI - {0xD2D5, 0xD2EF, prLVT}, // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH - {0xD2F0, 0xD2F0, prLV}, // Lo HANGUL SYLLABLE TI - {0xD2F1, 0xD30B, prLVT}, // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH - {0xD30C, 0xD30C, prLV}, // Lo HANGUL SYLLABLE PA - {0xD30D, 0xD327, prLVT}, // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH - {0xD328, 0xD328, prLV}, // Lo HANGUL SYLLABLE PAE - {0xD329, 0xD343, prLVT}, // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH - {0xD344, 0xD344, prLV}, // Lo HANGUL SYLLABLE PYA - {0xD345, 0xD35F, prLVT}, // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH - {0xD360, 0xD360, prLV}, // Lo HANGUL SYLLABLE PYAE - {0xD361, 0xD37B, prLVT}, // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH - {0xD37C, 0xD37C, prLV}, // Lo HANGUL SYLLABLE PEO - {0xD37D, 0xD397, prLVT}, // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH - {0xD398, 0xD398, prLV}, // Lo HANGUL SYLLABLE PE - {0xD399, 0xD3B3, prLVT}, // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH - {0xD3B4, 0xD3B4, prLV}, // Lo HANGUL SYLLABLE PYEO - {0xD3B5, 0xD3CF, prLVT}, // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH - {0xD3D0, 0xD3D0, prLV}, // Lo HANGUL SYLLABLE PYE - {0xD3D1, 0xD3EB, prLVT}, // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH - {0xD3EC, 0xD3EC, prLV}, // Lo HANGUL SYLLABLE PO - {0xD3ED, 0xD407, prLVT}, // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH - {0xD408, 0xD408, prLV}, // Lo HANGUL SYLLABLE PWA - {0xD409, 0xD423, prLVT}, // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH - {0xD424, 0xD424, prLV}, // Lo HANGUL SYLLABLE PWAE - {0xD425, 0xD43F, prLVT}, // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH - {0xD440, 0xD440, prLV}, // Lo HANGUL SYLLABLE POE - {0xD441, 0xD45B, prLVT}, // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH - {0xD45C, 0xD45C, prLV}, // Lo HANGUL SYLLABLE PYO - {0xD45D, 0xD477, prLVT}, // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH - {0xD478, 0xD478, prLV}, // Lo HANGUL SYLLABLE PU - {0xD479, 0xD493, prLVT}, // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH - {0xD494, 0xD494, prLV}, // Lo HANGUL SYLLABLE PWEO - {0xD495, 0xD4AF, prLVT}, // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH - {0xD4B0, 0xD4B0, prLV}, // Lo HANGUL SYLLABLE PWE - {0xD4B1, 0xD4CB, prLVT}, // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH - {0xD4CC, 0xD4CC, prLV}, // Lo HANGUL SYLLABLE PWI - {0xD4CD, 0xD4E7, prLVT}, // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH - {0xD4E8, 0xD4E8, prLV}, // Lo HANGUL SYLLABLE PYU - {0xD4E9, 0xD503, prLVT}, // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH - {0xD504, 0xD504, prLV}, // Lo HANGUL SYLLABLE PEU - {0xD505, 0xD51F, prLVT}, // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH - {0xD520, 0xD520, prLV}, // Lo HANGUL SYLLABLE PYI - {0xD521, 0xD53B, prLVT}, // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH - {0xD53C, 0xD53C, prLV}, // Lo HANGUL SYLLABLE PI - {0xD53D, 0xD557, prLVT}, // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH - {0xD558, 0xD558, prLV}, // Lo HANGUL SYLLABLE HA - {0xD559, 0xD573, prLVT}, // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH - {0xD574, 0xD574, prLV}, // Lo HANGUL SYLLABLE HAE - {0xD575, 0xD58F, prLVT}, // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH - {0xD590, 0xD590, prLV}, // Lo HANGUL SYLLABLE HYA - {0xD591, 0xD5AB, prLVT}, // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH - {0xD5AC, 0xD5AC, prLV}, // Lo HANGUL SYLLABLE HYAE - {0xD5AD, 0xD5C7, prLVT}, // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH - {0xD5C8, 0xD5C8, prLV}, // Lo HANGUL SYLLABLE HEO - {0xD5C9, 0xD5E3, prLVT}, // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH - {0xD5E4, 0xD5E4, prLV}, // Lo HANGUL SYLLABLE HE - {0xD5E5, 0xD5FF, prLVT}, // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH - {0xD600, 0xD600, prLV}, // Lo HANGUL SYLLABLE HYEO - {0xD601, 0xD61B, prLVT}, // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH - {0xD61C, 0xD61C, prLV}, // Lo HANGUL SYLLABLE HYE - {0xD61D, 0xD637, prLVT}, // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH - {0xD638, 0xD638, prLV}, // Lo HANGUL SYLLABLE HO - {0xD639, 0xD653, prLVT}, // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH - {0xD654, 0xD654, prLV}, // Lo HANGUL SYLLABLE HWA - {0xD655, 0xD66F, prLVT}, // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH - {0xD670, 0xD670, prLV}, // Lo HANGUL SYLLABLE HWAE - {0xD671, 0xD68B, prLVT}, // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH - {0xD68C, 0xD68C, prLV}, // Lo HANGUL SYLLABLE HOE - {0xD68D, 0xD6A7, prLVT}, // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH - {0xD6A8, 0xD6A8, prLV}, // Lo HANGUL SYLLABLE HYO - {0xD6A9, 0xD6C3, prLVT}, // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH - {0xD6C4, 0xD6C4, prLV}, // Lo HANGUL SYLLABLE HU - {0xD6C5, 0xD6DF, prLVT}, // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH - {0xD6E0, 0xD6E0, prLV}, // Lo HANGUL SYLLABLE HWEO - {0xD6E1, 0xD6FB, prLVT}, // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH - {0xD6FC, 0xD6FC, prLV}, // Lo HANGUL SYLLABLE HWE - {0xD6FD, 0xD717, prLVT}, // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH - {0xD718, 0xD718, prLV}, // Lo HANGUL SYLLABLE HWI - {0xD719, 0xD733, prLVT}, // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH - {0xD734, 0xD734, prLV}, // Lo HANGUL SYLLABLE HYU - {0xD735, 0xD74F, prLVT}, // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH - {0xD750, 0xD750, prLV}, // Lo HANGUL SYLLABLE HEU - {0xD751, 0xD76B, prLVT}, // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH - {0xD76C, 0xD76C, prLV}, // Lo HANGUL SYLLABLE HYI - {0xD76D, 0xD787, prLVT}, // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH - {0xD788, 0xD788, prLV}, // Lo HANGUL SYLLABLE HI - {0xD789, 0xD7A3, prLVT}, // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH - {0xD7B0, 0xD7C6, prV}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E - {0xD7CB, 0xD7FB, prT}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH - {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA - {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 - {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF - {0xFEFF, 0xFEFF, prControl}, // Cf ZERO WIDTH NO-BREAK SPACE - {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK - {0xFFF0, 0xFFF8, prControl}, // Cn [9] .. - {0xFFF9, 0xFFFB, prControl}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR - {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE - {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK - {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII - {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R - {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O - {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA - {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW - {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA - {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW - {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI - {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW - {0x11000, 0x11000, prSpacingMark}, // Mc BRAHMI SIGN CANDRABINDU - {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA - {0x11002, 0x11002, prSpacingMark}, // Mc BRAHMI SIGN VISARGA - {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA - {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA - {0x11082, 0x11082, prSpacingMark}, // Mc KAITHI SIGN VISARGA - {0x110B0, 0x110B2, prSpacingMark}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II - {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI - {0x110B7, 0x110B8, prSpacingMark}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU - {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA - {0x110BD, 0x110BD, prPreprend}, // Cf KAITHI NUMBER SIGN - {0x110CD, 0x110CD, prPreprend}, // Cf KAITHI NUMBER SIGN ABOVE - {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA - {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU - {0x1112C, 0x1112C, prSpacingMark}, // Mc CHAKMA VOWEL SIGN E - {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA - {0x11145, 0x11146, prSpacingMark}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI - {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA - {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA - {0x11182, 0x11182, prSpacingMark}, // Mc SHARADA SIGN VISARGA - {0x111B3, 0x111B5, prSpacingMark}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II - {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O - {0x111BF, 0x111C0, prSpacingMark}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA - {0x111C2, 0x111C3, prPreprend}, // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA - {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK - {0x1122C, 0x1122E, prSpacingMark}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II - {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI - {0x11232, 0x11233, prSpacingMark}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU - {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA - {0x11235, 0x11235, prSpacingMark}, // Mc KHOJKI SIGN VIRAMA - {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA - {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN - {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA - {0x112E0, 0x112E2, prSpacingMark}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II - {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA - {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU - {0x11302, 0x11303, prSpacingMark}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA - {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA - {0x1133E, 0x1133E, prExtend}, // Mc GRANTHA VOWEL SIGN AA - {0x1133F, 0x1133F, prSpacingMark}, // Mc GRANTHA VOWEL SIGN I - {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II - {0x11341, 0x11344, prSpacingMark}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR - {0x11347, 0x11348, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI - {0x1134B, 0x1134D, prSpacingMark}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA - {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK - {0x11362, 0x11363, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL - {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX - {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA - {0x11435, 0x11437, prSpacingMark}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II - {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI - {0x11440, 0x11441, prSpacingMark}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU - {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA - {0x11445, 0x11445, prSpacingMark}, // Mc NEWA SIGN VISARGA - {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA - {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK - {0x114B0, 0x114B0, prExtend}, // Mc TIRHUTA VOWEL SIGN AA - {0x114B1, 0x114B2, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II - {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL - {0x114B9, 0x114B9, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN E - {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E - {0x114BB, 0x114BC, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O - {0x114BD, 0x114BD, prExtend}, // Mc TIRHUTA VOWEL SIGN SHORT O - {0x114BE, 0x114BE, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN AU - {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA - {0x114C1, 0x114C1, prSpacingMark}, // Mc TIRHUTA SIGN VISARGA - {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA - {0x115AF, 0x115AF, prExtend}, // Mc SIDDHAM VOWEL SIGN AA - {0x115B0, 0x115B1, prSpacingMark}, // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II - {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR - {0x115B8, 0x115BB, prSpacingMark}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU - {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA - {0x115BE, 0x115BE, prSpacingMark}, // Mc SIDDHAM SIGN VISARGA - {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA - {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU - {0x11630, 0x11632, prSpacingMark}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II - {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI - {0x1163B, 0x1163C, prSpacingMark}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU - {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA - {0x1163E, 0x1163E, prSpacingMark}, // Mc MODI SIGN VISARGA - {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA - {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA - {0x116AC, 0x116AC, prSpacingMark}, // Mc TAKRI SIGN VISARGA - {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA - {0x116AE, 0x116AF, prSpacingMark}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II - {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU - {0x116B6, 0x116B6, prSpacingMark}, // Mc TAKRI SIGN VIRAMA - {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA - {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA - {0x11720, 0x11721, prSpacingMark}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA - {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU - {0x11726, 0x11726, prSpacingMark}, // Mc AHOM VOWEL SIGN E - {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER - {0x1182C, 0x1182E, prSpacingMark}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II - {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA - {0x11838, 0x11838, prSpacingMark}, // Mc DOGRA SIGN VISARGA - {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA - {0x119D1, 0x119D3, prSpacingMark}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II - {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR - {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI - {0x119DC, 0x119DF, prSpacingMark}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA - {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA - {0x119E4, 0x119E4, prSpacingMark}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E - {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK - {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA - {0x11A39, 0x11A39, prSpacingMark}, // Mc ZANABAZAR SQUARE SIGN VISARGA - {0x11A3A, 0x11A3A, prPreprend}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA - {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA - {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER - {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE - {0x11A57, 0x11A58, prSpacingMark}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU - {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK - {0x11A84, 0x11A89, prPreprend}, // Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA - {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA - {0x11A97, 0x11A97, prSpacingMark}, // Mc SOYOMBO SIGN VISARGA - {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER - {0x11C2F, 0x11C2F, prSpacingMark}, // Mc BHAIKSUKI VOWEL SIGN AA - {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L - {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA - {0x11C3E, 0x11C3E, prSpacingMark}, // Mc BHAIKSUKI SIGN VISARGA - {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA - {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA - {0x11CA9, 0x11CA9, prSpacingMark}, // Mc MARCHEN SUBJOINED LETTER YA - {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA - {0x11CB1, 0x11CB1, prSpacingMark}, // Mc MARCHEN VOWEL SIGN I - {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E - {0x11CB4, 0x11CB4, prSpacingMark}, // Mc MARCHEN VOWEL SIGN O - {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU - {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R - {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E - {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O - {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA - {0x11D46, 0x11D46, prPreprend}, // Lo MASARAM GONDI REPHA - {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA - {0x11D8A, 0x11D8E, prSpacingMark}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU - {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI - {0x11D93, 0x11D94, prSpacingMark}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU - {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA - {0x11D96, 0x11D96, prSpacingMark}, // Mc GUNJALA GONDI SIGN VISARGA - {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA - {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U - {0x11EF5, 0x11EF6, prSpacingMark}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O - {0x13430, 0x13438, prControl}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT - {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE - {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM - {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR - {0x16F51, 0x16F87, prSpacingMark}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI - {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW - {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK - {0x1BCA0, 0x1BCA3, prControl}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP - {0x1D165, 0x1D165, prExtend}, // Mc MUSICAL SYMBOL COMBINING STEM - {0x1D166, 0x1D166, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM - {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 - {0x1D16D, 0x1D16D, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT - {0x1D16E, 0x1D172, prExtend}, // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 - {0x1D173, 0x1D17A, prControl}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE - {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE - {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE - {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO - {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME - {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN - {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT - {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS - {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK - {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 - {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 - {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE - {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU - {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI - {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS - {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA - {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D - {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI - {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS - {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA - {0x1F000, 0x1F02B, prExtendedPictographic}, // 5.1 [44] (๐Ÿ€€..๐Ÿ€ซ) MAHJONG TILE EAST WIND..MAHJONG TILE BACK - {0x1F02C, 0x1F02F, prExtendedPictographic}, // NA [4] (๐Ÿ€ฌ..๐Ÿ€ฏ) .. - {0x1F030, 0x1F093, prExtendedPictographic}, // 5.1[100] (๐Ÿ€ฐ..๐Ÿ‚“) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 - {0x1F094, 0x1F09F, prExtendedPictographic}, // NA [12] (๐Ÿ‚”..๐Ÿ‚Ÿ) .. - {0x1F0A0, 0x1F0AE, prExtendedPictographic}, // 6.0 [15] (๐Ÿ‚ ..๐Ÿ‚ฎ) PLAYING CARD BACK..PLAYING CARD KING OF SPADES - {0x1F0AF, 0x1F0B0, prExtendedPictographic}, // NA [2] (๐Ÿ‚ฏ..๐Ÿ‚ฐ) .. - {0x1F0B1, 0x1F0BE, prExtendedPictographic}, // 6.0 [14] (๐Ÿ‚ฑ..๐Ÿ‚พ) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS - {0x1F0BF, 0x1F0BF, prExtendedPictographic}, // 7.0 [1] (๐Ÿ‚ฟ) PLAYING CARD RED JOKER - {0x1F0C0, 0x1F0C0, prExtendedPictographic}, // NA [1] (๐Ÿƒ€) - {0x1F0C1, 0x1F0CF, prExtendedPictographic}, // 6.0 [15] (๐Ÿƒ..๐Ÿƒ) PLAYING CARD ACE OF DIAMONDS..joker - {0x1F0D0, 0x1F0D0, prExtendedPictographic}, // NA [1] (๐Ÿƒ) - {0x1F0D1, 0x1F0DF, prExtendedPictographic}, // 6.0 [15] (๐Ÿƒ‘..๐ŸƒŸ) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER - {0x1F0E0, 0x1F0F5, prExtendedPictographic}, // 7.0 [22] (๐Ÿƒ ..๐Ÿƒต) PLAYING CARD FOOL..PLAYING CARD TRUMP-21 - {0x1F0F6, 0x1F0FF, prExtendedPictographic}, // NA [10] (๐Ÿƒถ..๐Ÿƒฟ) .. - {0x1F10D, 0x1F10F, prExtendedPictographic}, // NA [3] (๐Ÿ„..๐Ÿ„) .. - {0x1F12F, 0x1F12F, prExtendedPictographic}, // 11.0 [1] (๐Ÿ„ฏ) COPYLEFT SYMBOL - {0x1F16C, 0x1F16C, prExtendedPictographic}, // 12.0 [1] (๐Ÿ…ฌ) RAISED MR SIGN - {0x1F16D, 0x1F16F, prExtendedPictographic}, // NA [3] (๐Ÿ…ญ..๐Ÿ…ฏ) .. - {0x1F170, 0x1F171, prExtendedPictographic}, // 6.0 [2] (๐Ÿ…ฐ๏ธ..๐Ÿ…ฑ๏ธ) A button (blood type)..B button (blood type) - {0x1F17E, 0x1F17E, prExtendedPictographic}, // 6.0 [1] (๐Ÿ…พ๏ธ) O button (blood type) - {0x1F17F, 0x1F17F, prExtendedPictographic}, // 5.2 [1] (๐Ÿ…ฟ๏ธ) P button - {0x1F18E, 0x1F18E, prExtendedPictographic}, // 6.0 [1] (๐Ÿ†Ž) AB button (blood type) - {0x1F191, 0x1F19A, prExtendedPictographic}, // 6.0 [10] (๐Ÿ†‘..๐Ÿ†š) CL button..VS button - {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // NA [57] (๐Ÿ†ญ..๐Ÿ‡ฅ) .. - {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z - {0x1F201, 0x1F202, prExtendedPictographic}, // 6.0 [2] (๐Ÿˆ..๐Ÿˆ‚๏ธ) Japanese โ€œhereโ€ button..Japanese โ€œservice chargeโ€ button - {0x1F203, 0x1F20F, prExtendedPictographic}, // NA [13] (๐Ÿˆƒ..๐Ÿˆ) .. - {0x1F21A, 0x1F21A, prExtendedPictographic}, // 5.2 [1] (๐Ÿˆš) Japanese โ€œfree of chargeโ€ button - {0x1F22F, 0x1F22F, prExtendedPictographic}, // 5.2 [1] (๐Ÿˆฏ) Japanese โ€œreservedโ€ button - {0x1F232, 0x1F23A, prExtendedPictographic}, // 6.0 [9] (๐Ÿˆฒ..๐Ÿˆบ) Japanese โ€œprohibitedโ€ button..Japanese โ€œopen for businessโ€ button - {0x1F23C, 0x1F23F, prExtendedPictographic}, // NA [4] (๐Ÿˆผ..๐Ÿˆฟ) .. - {0x1F249, 0x1F24F, prExtendedPictographic}, // NA [7] (๐Ÿ‰‰..๐Ÿ‰) .. - {0x1F250, 0x1F251, prExtendedPictographic}, // 6.0 [2] (๐Ÿ‰..๐Ÿ‰‘) Japanese โ€œbargainโ€ button..Japanese โ€œacceptableโ€ button - {0x1F252, 0x1F25F, prExtendedPictographic}, // NA [14] (๐Ÿ‰’..๐Ÿ‰Ÿ) .. - {0x1F260, 0x1F265, prExtendedPictographic}, // 10.0 [6] (๐Ÿ‰ ..๐Ÿ‰ฅ) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI - {0x1F266, 0x1F2FF, prExtendedPictographic}, // NA[154] (๐Ÿ‰ฆ..๐Ÿ‹ฟ) .. - {0x1F300, 0x1F320, prExtendedPictographic}, // 6.0 [33] (๐ŸŒ€..๐ŸŒ ) cyclone..shooting star - {0x1F321, 0x1F32C, prExtendedPictographic}, // 7.0 [12] (๐ŸŒก๏ธ..๐ŸŒฌ๏ธ) thermometer..wind face - {0x1F32D, 0x1F32F, prExtendedPictographic}, // 8.0 [3] (๐ŸŒญ..๐ŸŒฏ) hot dog..burrito - {0x1F330, 0x1F335, prExtendedPictographic}, // 6.0 [6] (๐ŸŒฐ..๐ŸŒต) chestnut..cactus - {0x1F336, 0x1F336, prExtendedPictographic}, // 7.0 [1] (๐ŸŒถ๏ธ) hot pepper - {0x1F337, 0x1F37C, prExtendedPictographic}, // 6.0 [70] (๐ŸŒท..๐Ÿผ) tulip..baby bottle - {0x1F37D, 0x1F37D, prExtendedPictographic}, // 7.0 [1] (๐Ÿฝ๏ธ) fork and knife with plate - {0x1F37E, 0x1F37F, prExtendedPictographic}, // 8.0 [2] (๐Ÿพ..๐Ÿฟ) bottle with popping cork..popcorn - {0x1F380, 0x1F393, prExtendedPictographic}, // 6.0 [20] (๐ŸŽ€..๐ŸŽ“) ribbon..graduation cap - {0x1F394, 0x1F39F, prExtendedPictographic}, // 7.0 [12] (๐ŸŽ”..๐ŸŽŸ๏ธ) HEART WITH TIP ON THE LEFT..admission tickets - {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // 6.0 [37] (๐ŸŽ ..๐Ÿ„) carousel horse..person surfing - {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // 7.0 [1] (๐Ÿ…) sports medal - {0x1F3C6, 0x1F3CA, prExtendedPictographic}, // 6.0 [5] (๐Ÿ†..๐ŸŠ) trophy..person swimming - {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // 7.0 [4] (๐Ÿ‹๏ธ..๐ŸŽ๏ธ) person lifting weights..racing car - {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // 8.0 [5] (๐Ÿ..๐Ÿ“) cricket game..ping pong - {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // 7.0 [12] (๐Ÿ”๏ธ..๐ŸŸ๏ธ) snow-capped mountain..stadium - {0x1F3E0, 0x1F3F0, prExtendedPictographic}, // 6.0 [17] (๐Ÿ ..๐Ÿฐ) house..castle - {0x1F3F1, 0x1F3F7, prExtendedPictographic}, // 7.0 [7] (๐Ÿฑ..๐Ÿท๏ธ) WHITE PENNANT..label - {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // 8.0 [3] (๐Ÿธ..๐Ÿบ) badminton..amphora - {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 - {0x1F400, 0x1F43E, prExtendedPictographic}, // 6.0 [63] (๐Ÿ€..๐Ÿพ) rat..paw prints - {0x1F43F, 0x1F43F, prExtendedPictographic}, // 7.0 [1] (๐Ÿฟ๏ธ) chipmunk - {0x1F440, 0x1F440, prExtendedPictographic}, // 6.0 [1] (๐Ÿ‘€) eyes - {0x1F441, 0x1F441, prExtendedPictographic}, // 7.0 [1] (๐Ÿ‘๏ธ) eye - {0x1F442, 0x1F4F7, prExtendedPictographic}, // 6.0[182] (๐Ÿ‘‚..๐Ÿ“ท) ear..camera - {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // 7.0 [1] (๐Ÿ“ธ) camera with flash - {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // 6.0 [4] (๐Ÿ“น..๐Ÿ“ผ) video camera..videocassette - {0x1F4FD, 0x1F4FE, prExtendedPictographic}, // 7.0 [2] (๐Ÿ“ฝ๏ธ..๐Ÿ“พ) film projector..PORTABLE STEREO - {0x1F4FF, 0x1F4FF, prExtendedPictographic}, // 8.0 [1] (๐Ÿ“ฟ) prayer beads - {0x1F500, 0x1F53D, prExtendedPictographic}, // 6.0 [62] (๐Ÿ”€..๐Ÿ”ฝ) shuffle tracks button..downwards button - {0x1F546, 0x1F54A, prExtendedPictographic}, // 7.0 [5] (๐Ÿ•†..๐Ÿ•Š๏ธ) WHITE LATIN CROSS..dove - {0x1F54B, 0x1F54F, prExtendedPictographic}, // 8.0 [5] (๐Ÿ•‹..๐Ÿ•) kaaba..BOWL OF HYGIEIA - {0x1F550, 0x1F567, prExtendedPictographic}, // 6.0 [24] (๐Ÿ•..๐Ÿ•ง) one oโ€™clock..twelve-thirty - {0x1F568, 0x1F579, prExtendedPictographic}, // 7.0 [18] (๐Ÿ•จ..๐Ÿ•น๏ธ) RIGHT SPEAKER..joystick - {0x1F57A, 0x1F57A, prExtendedPictographic}, // 9.0 [1] (๐Ÿ•บ) man dancing - {0x1F57B, 0x1F5A3, prExtendedPictographic}, // 7.0 [41] (๐Ÿ•ป..๐Ÿ–ฃ) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX - {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // 9.0 [1] (๐Ÿ–ค) black heart - {0x1F5A5, 0x1F5FA, prExtendedPictographic}, // 7.0 [86] (๐Ÿ–ฅ๏ธ..๐Ÿ—บ๏ธ) desktop computer..world map - {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // 6.0 [5] (๐Ÿ—ป..๐Ÿ—ฟ) mount fuji..moai - {0x1F600, 0x1F600, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜€) grinning face - {0x1F601, 0x1F610, prExtendedPictographic}, // 6.0 [16] (๐Ÿ˜..๐Ÿ˜) beaming face with smiling eyes..neutral face - {0x1F611, 0x1F611, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜‘) expressionless face - {0x1F612, 0x1F614, prExtendedPictographic}, // 6.0 [3] (๐Ÿ˜’..๐Ÿ˜”) unamused face..pensive face - {0x1F615, 0x1F615, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜•) confused face - {0x1F616, 0x1F616, prExtendedPictographic}, // 6.0 [1] (๐Ÿ˜–) confounded face - {0x1F617, 0x1F617, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜—) kissing face - {0x1F618, 0x1F618, prExtendedPictographic}, // 6.0 [1] (๐Ÿ˜˜) face blowing a kiss - {0x1F619, 0x1F619, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜™) kissing face with smiling eyes - {0x1F61A, 0x1F61A, prExtendedPictographic}, // 6.0 [1] (๐Ÿ˜š) kissing face with closed eyes - {0x1F61B, 0x1F61B, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜›) face with tongue - {0x1F61C, 0x1F61E, prExtendedPictographic}, // 6.0 [3] (๐Ÿ˜œ..๐Ÿ˜ž) winking face with tongue..disappointed face - {0x1F61F, 0x1F61F, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜Ÿ) worried face - {0x1F620, 0x1F625, prExtendedPictographic}, // 6.0 [6] (๐Ÿ˜ ..๐Ÿ˜ฅ) angry face..sad but relieved face - {0x1F626, 0x1F627, prExtendedPictographic}, // 6.1 [2] (๐Ÿ˜ฆ..๐Ÿ˜ง) frowning face with open mouth..anguished face - {0x1F628, 0x1F62B, prExtendedPictographic}, // 6.0 [4] (๐Ÿ˜จ..๐Ÿ˜ซ) fearful face..tired face - {0x1F62C, 0x1F62C, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜ฌ) grimacing face - {0x1F62D, 0x1F62D, prExtendedPictographic}, // 6.0 [1] (๐Ÿ˜ญ) loudly crying face - {0x1F62E, 0x1F62F, prExtendedPictographic}, // 6.1 [2] (๐Ÿ˜ฎ..๐Ÿ˜ฏ) face with open mouth..hushed face - {0x1F630, 0x1F633, prExtendedPictographic}, // 6.0 [4] (๐Ÿ˜ฐ..๐Ÿ˜ณ) anxious face with sweat..flushed face - {0x1F634, 0x1F634, prExtendedPictographic}, // 6.1 [1] (๐Ÿ˜ด) sleeping face - {0x1F635, 0x1F640, prExtendedPictographic}, // 6.0 [12] (๐Ÿ˜ต..๐Ÿ™€) dizzy face..weary cat - {0x1F641, 0x1F642, prExtendedPictographic}, // 7.0 [2] (๐Ÿ™..๐Ÿ™‚) slightly frowning face..slightly smiling face - {0x1F643, 0x1F644, prExtendedPictographic}, // 8.0 [2] (๐Ÿ™ƒ..๐Ÿ™„) upside-down face..face with rolling eyes - {0x1F645, 0x1F64F, prExtendedPictographic}, // 6.0 [11] (๐Ÿ™…..๐Ÿ™) person gesturing NO..folded hands - {0x1F680, 0x1F6C5, prExtendedPictographic}, // 6.0 [70] (๐Ÿš€..๐Ÿ›…) rocket..left luggage - {0x1F6C6, 0x1F6CF, prExtendedPictographic}, // 7.0 [10] (๐Ÿ›†..๐Ÿ›๏ธ) TRIANGLE WITH ROUNDED CORNERS..bed - {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // 8.0 [1] (๐Ÿ›) place of worship - {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // 9.0 [2] (๐Ÿ›‘..๐Ÿ›’) stop sign..shopping cart - {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // 10.0 [2] (๐Ÿ›“..๐Ÿ›”) STUPA..PAGODA - {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // 12.0 [1] (๐Ÿ›•) hindu temple - {0x1F6D6, 0x1F6DF, prExtendedPictographic}, // NA [10] (๐Ÿ›–..๐Ÿ›Ÿ) .. - {0x1F6E0, 0x1F6EC, prExtendedPictographic}, // 7.0 [13] (๐Ÿ› ๏ธ..๐Ÿ›ฌ) hammer and wrench..airplane arrival - {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // NA [3] (๐Ÿ›ญ..๐Ÿ›ฏ) .. - {0x1F6F0, 0x1F6F3, prExtendedPictographic}, // 7.0 [4] (๐Ÿ›ฐ๏ธ..๐Ÿ›ณ๏ธ) satellite..passenger ship - {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // 9.0 [3] (๐Ÿ›ด..๐Ÿ›ถ) kick scooter..canoe - {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // 10.0 [2] (๐Ÿ›ท..๐Ÿ›ธ) sled..flying saucer - {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // 11.0 [1] (๐Ÿ›น) skateboard - {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // 12.0 [1] (๐Ÿ›บ) auto rickshaw - {0x1F6FB, 0x1F6FF, prExtendedPictographic}, // NA [5] (๐Ÿ›ป..๐Ÿ›ฟ) .. - {0x1F774, 0x1F77F, prExtendedPictographic}, // NA [12] (๐Ÿด..๐Ÿฟ) .. - {0x1F7D5, 0x1F7D8, prExtendedPictographic}, // 11.0 [4] (๐ŸŸ•..๐ŸŸ˜) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE - {0x1F7D9, 0x1F7DF, prExtendedPictographic}, // NA [7] (๐ŸŸ™..๐ŸŸŸ) .. - {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // 12.0 [12] (๐ŸŸ ..๐ŸŸซ) orange circle..brown square - {0x1F7EC, 0x1F7FF, prExtendedPictographic}, // NA [20] (๐ŸŸฌ..๐ŸŸฟ) .. - {0x1F80C, 0x1F80F, prExtendedPictographic}, // NA [4] (๐Ÿ Œ..๐Ÿ ) .. - {0x1F848, 0x1F84F, prExtendedPictographic}, // NA [8] (๐Ÿกˆ..๐Ÿก) .. - {0x1F85A, 0x1F85F, prExtendedPictographic}, // NA [6] (๐Ÿกš..๐ŸกŸ) .. - {0x1F888, 0x1F88F, prExtendedPictographic}, // NA [8] (๐Ÿขˆ..๐Ÿข) .. - {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // NA [82] (๐Ÿขฎ..๐Ÿฃฟ) .. - {0x1F90C, 0x1F90C, prExtendedPictographic}, // NA [1] (๐ŸคŒ) - {0x1F90D, 0x1F90F, prExtendedPictographic}, // 12.0 [3] (๐Ÿค..๐Ÿค) white heart..pinching hand - {0x1F910, 0x1F918, prExtendedPictographic}, // 8.0 [9] (๐Ÿค..๐Ÿค˜) zipper-mouth face..sign of the horns - {0x1F919, 0x1F91E, prExtendedPictographic}, // 9.0 [6] (๐Ÿค™..๐Ÿคž) call me hand..crossed fingers - {0x1F91F, 0x1F91F, prExtendedPictographic}, // 10.0 [1] (๐ŸคŸ) love-you gesture - {0x1F920, 0x1F927, prExtendedPictographic}, // 9.0 [8] (๐Ÿค ..๐Ÿคง) cowboy hat face..sneezing face - {0x1F928, 0x1F92F, prExtendedPictographic}, // 10.0 [8] (๐Ÿคจ..๐Ÿคฏ) face with raised eyebrow..exploding head - {0x1F930, 0x1F930, prExtendedPictographic}, // 9.0 [1] (๐Ÿคฐ) pregnant woman - {0x1F931, 0x1F932, prExtendedPictographic}, // 10.0 [2] (๐Ÿคฑ..๐Ÿคฒ) breast-feeding..palms up together - {0x1F933, 0x1F93A, prExtendedPictographic}, // 9.0 [8] (๐Ÿคณ..๐Ÿคบ) selfie..person fencing - {0x1F93C, 0x1F93E, prExtendedPictographic}, // 9.0 [3] (๐Ÿคผ..๐Ÿคพ) people wrestling..person playing handball - {0x1F93F, 0x1F93F, prExtendedPictographic}, // 12.0 [1] (๐Ÿคฟ) diving mask - {0x1F940, 0x1F945, prExtendedPictographic}, // 9.0 [6] (๐Ÿฅ€..๐Ÿฅ…) wilted flower..goal net - {0x1F947, 0x1F94B, prExtendedPictographic}, // 9.0 [5] (๐Ÿฅ‡..๐Ÿฅ‹) 1st place medal..martial arts uniform - {0x1F94C, 0x1F94C, prExtendedPictographic}, // 10.0 [1] (๐ŸฅŒ) curling stone - {0x1F94D, 0x1F94F, prExtendedPictographic}, // 11.0 [3] (๐Ÿฅ..๐Ÿฅ) lacrosse..flying disc - {0x1F950, 0x1F95E, prExtendedPictographic}, // 9.0 [15] (๐Ÿฅ..๐Ÿฅž) croissant..pancakes - {0x1F95F, 0x1F96B, prExtendedPictographic}, // 10.0 [13] (๐ŸฅŸ..๐Ÿฅซ) dumpling..canned food - {0x1F96C, 0x1F970, prExtendedPictographic}, // 11.0 [5] (๐Ÿฅฌ..๐Ÿฅฐ) leafy green..smiling face with hearts - {0x1F971, 0x1F971, prExtendedPictographic}, // 12.0 [1] (๐Ÿฅฑ) yawning face - {0x1F972, 0x1F972, prExtendedPictographic}, // NA [1] (๐Ÿฅฒ) - {0x1F973, 0x1F976, prExtendedPictographic}, // 11.0 [4] (๐Ÿฅณ..๐Ÿฅถ) partying face..cold face - {0x1F977, 0x1F979, prExtendedPictographic}, // NA [3] (๐Ÿฅท..๐Ÿฅน) .. - {0x1F97A, 0x1F97A, prExtendedPictographic}, // 11.0 [1] (๐Ÿฅบ) pleading face - {0x1F97B, 0x1F97B, prExtendedPictographic}, // 12.0 [1] (๐Ÿฅป) sari - {0x1F97C, 0x1F97F, prExtendedPictographic}, // 11.0 [4] (๐Ÿฅผ..๐Ÿฅฟ) lab coat..flat shoe - {0x1F980, 0x1F984, prExtendedPictographic}, // 8.0 [5] (๐Ÿฆ€..๐Ÿฆ„) crab..unicorn - {0x1F985, 0x1F991, prExtendedPictographic}, // 9.0 [13] (๐Ÿฆ…..๐Ÿฆ‘) eagle..squid - {0x1F992, 0x1F997, prExtendedPictographic}, // 10.0 [6] (๐Ÿฆ’..๐Ÿฆ—) giraffe..cricket - {0x1F998, 0x1F9A2, prExtendedPictographic}, // 11.0 [11] (๐Ÿฆ˜..๐Ÿฆข) kangaroo..swan - {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // NA [2] (๐Ÿฆฃ..๐Ÿฆค) .. - {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // 12.0 [6] (๐Ÿฆฅ..๐Ÿฆช) sloth..oyster - {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // NA [3] (๐Ÿฆซ..๐Ÿฆญ) .. - {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // 12.0 [2] (๐Ÿฆฎ..๐Ÿฆฏ) guide dog..probing cane - {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // 11.0 [10] (๐Ÿฆฐ..๐Ÿฆน) red hair..supervillain - {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // 12.0 [6] (๐Ÿฆบ..๐Ÿฆฟ) safety vest..mechanical leg - {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // 8.0 [1] (๐Ÿง€) cheese wedge - {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // 11.0 [2] (๐Ÿง..๐Ÿง‚) cupcake..salt - {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // 12.0 [8] (๐Ÿงƒ..๐ŸงŠ) beverage box..ice cube - {0x1F9CB, 0x1F9CC, prExtendedPictographic}, // NA [2] (๐Ÿง‹..๐ŸงŒ) .. - {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // 12.0 [3] (๐Ÿง..๐Ÿง) person standing..deaf person - {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // 10.0 [23] (๐Ÿง..๐Ÿงฆ) face with monocle..socks - {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // 11.0 [25] (๐Ÿงง..๐Ÿงฟ) red envelope..nazar amulet - {0x1FA00, 0x1FA53, prExtendedPictographic}, // 12.0 [84] (๐Ÿจ€..๐Ÿฉ“) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP - {0x1FA54, 0x1FA5F, prExtendedPictographic}, // NA [12] (๐Ÿฉ”..๐ŸฉŸ) .. - {0x1FA60, 0x1FA6D, prExtendedPictographic}, // 11.0 [14] (๐Ÿฉ ..๐Ÿฉญ) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER - {0x1FA6E, 0x1FA6F, prExtendedPictographic}, // NA [2] (๐Ÿฉฎ..๐Ÿฉฏ) .. - {0x1FA70, 0x1FA73, prExtendedPictographic}, // 12.0 [4] (๐Ÿฉฐ..๐Ÿฉณ) ballet shoes..shorts - {0x1FA74, 0x1FA77, prExtendedPictographic}, // NA [4] (๐Ÿฉด..๐Ÿฉท) .. - {0x1FA78, 0x1FA7A, prExtendedPictographic}, // 12.0 [3] (๐Ÿฉธ..๐Ÿฉบ) drop of blood..stethoscope - {0x1FA7B, 0x1FA7F, prExtendedPictographic}, // NA [5] (๐Ÿฉป..๐Ÿฉฟ) .. - {0x1FA80, 0x1FA82, prExtendedPictographic}, // 12.0 [3] (๐Ÿช€..๐Ÿช‚) yo-yo..parachute - {0x1FA83, 0x1FA8F, prExtendedPictographic}, // NA [13] (๐Ÿชƒ..๐Ÿช) .. - {0x1FA90, 0x1FA95, prExtendedPictographic}, // 12.0 [6] (๐Ÿช..๐Ÿช•) ringed planet..banjo - {0x1FA96, 0x1FFFD, prExtendedPictographic}, // NA[1384] (๐Ÿช–..๐Ÿฟฝ) .. - {0xE0000, 0xE0000, prControl}, // Cn - {0xE0001, 0xE0001, prControl}, // Cf LANGUAGE TAG - {0xE0002, 0xE001F, prControl}, // Cn [30] .. - {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG - {0xE0080, 0xE00FF, prControl}, // Cn [128] .. - {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - {0xE01F0, 0xE0FFF, prControl}, // Cn [3600] .. -} - -// property returns the Unicode property value (see constants above) of the -// given code point. -func property(r rune) int { - // Run a binary search. - from := 0 - to := len(codePoints) - for to > from { - middle := (from + to) / 2 - cpRange := codePoints[middle] - if int(r) < cpRange[0] { - to = middle - continue - } - if int(r) > cpRange[1] { - from = middle + 1 - continue - } - return cpRange[2] - } - return prAny -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 6c60aa2c9..3c2f42dea 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -35,6 +35,16 @@ github.com/ProtonMail/go-crypto/openpgp/x448 # github.com/bmatcuk/doublestar/v4 v4.9.1 ## explicit; go 1.16 github.com/bmatcuk/doublestar/v4 +# github.com/clipperhouse/displaywidth v0.3.1 +## explicit; go 1.18 +github.com/clipperhouse/displaywidth +# github.com/clipperhouse/stringish v0.1.1 +## explicit; go 1.18 +github.com/clipperhouse/stringish +# github.com/clipperhouse/uax29/v2 v2.2.0 +## explicit; go 1.18 +github.com/clipperhouse/uax29/v2/graphemes +github.com/clipperhouse/uax29/v2/internal/iterators # github.com/cloudflare/circl v1.6.1 ## explicit; go 1.22.0 github.com/cloudflare/circl/dh/x25519 @@ -169,21 +179,24 @@ github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.20 ## explicit; go 1.15 github.com/mattn/go-isatty -# github.com/mattn/go-runewidth v0.0.16 -## explicit; go 1.9 +# github.com/mattn/go-runewidth v0.0.19 +## explicit; go 1.20 github.com/mattn/go-runewidth # github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 ## explicit github.com/monochromegane/go-gitignore +# github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 +## explicit; go 1.21 +github.com/olekukonko/cat # github.com/olekukonko/errors v1.1.0 ## explicit; go 1.21 github.com/olekukonko/errors -# github.com/olekukonko/ll v0.0.9 +# github.com/olekukonko/ll v0.1.2 ## explicit; go 1.21 github.com/olekukonko/ll github.com/olekukonko/ll/lh github.com/olekukonko/ll/lx -# github.com/olekukonko/tablewriter v1.1.0 +# github.com/olekukonko/tablewriter v1.1.1 ## explicit; go 1.21 github.com/olekukonko/tablewriter github.com/olekukonko/tablewriter/pkg/twwarp @@ -208,9 +221,6 @@ github.com/pjbgf/sha1cd/ubc # github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 ## explicit github.com/pmezard/go-difflib/difflib -# github.com/rivo/uniseg v0.2.0 -## explicit; go 1.12 -github.com/rivo/uniseg # github.com/sagikazarmark/locafero v0.11.0 ## explicit; go 1.23.0 github.com/sagikazarmark/locafero