From 2164af4291c9e35ced8a210f3b38d1a4d99768cd Mon Sep 17 00:00:00 2001 From: ucwong Date: Fri, 7 Nov 2025 23:53:47 +0800 Subject: [PATCH 1/2] fix bug about getting stable LogsHash result --- core/state/statedb.go | 4 + go.mod | 45 +- go.sum | 90 +- .../azure-sdk-for-go/sdk/azcore/CHANGELOG.md | 11 + .../sdk/azcore/internal/exported/exported.go | 2 +- .../sdk/azcore/internal/shared/constants.go | 2 +- .../sdk/azcore/runtime/pager.go | 11 +- .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 5 + .../config/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/credentials/CHANGELOG.md | 5 + .../credentials/go_module_metadata.go | 2 +- .../feature/ec2/imds/CHANGELOG.md | 5 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../internal/configsources/CHANGELOG.md | 5 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/v2/CHANGELOG.md | 5 + .../endpoints/v2/go_module_metadata.go | 2 +- .../internal/accept-encoding/CHANGELOG.md | 4 + .../accept-encoding/go_module_metadata.go | 2 +- .../internal/presigned-url/CHANGELOG.md | 5 + .../presigned-url/go_module_metadata.go | 2 +- .../service/route53/CHANGELOG.md | 5 + .../service/route53/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 5 + .../service/sso/go_module_metadata.go | 2 +- .../service/ssooidc/CHANGELOG.md | 5 + .../service/ssooidc/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 5 + .../service/sts/go_module_metadata.go | 2 +- vendor/github.com/aws/smithy-go/CHANGELOG.md | 10 + .../aws/smithy-go/go_module_metadata.go | 2 +- .../github.com/aws/smithy-go/metrics/nop.go | 93 +- .../aws/smithy-go/middleware/ordered_group.go | 14 +- .../aws/smithy-go/middleware/step_build.go | 2 +- .../smithy-go/middleware/step_deserialize.go | 3 +- .../aws/smithy-go/middleware/step_finalize.go | 3 +- .../smithy-go/middleware/step_initialize.go | 2 +- .../smithy-go/middleware/step_serialize.go | 2 +- .../aws/smithy-go/transport/http/metrics.go | 6 + .../charmbracelet/colorprofile/env.go | 33 +- .../github.com/charmbracelet/x/ansi/mode.go | 465 ++-- .../charmbracelet/x/ansi/mode_deprecated.go | 495 +++++ .../github.com/charmbracelet/x/ansi/mouse.go | 2 +- .../charmbracelet/x/ansi/notification.go | 19 + .../charmbracelet/x/ansi/parser_decode.go | 33 +- vendor/github.com/charmbracelet/x/ansi/sgr.go | 110 +- .../github.com/charmbracelet/x/ansi/style.go | 605 +++--- .../charmbracelet/x/ansi/truncate.go | 57 +- .../github.com/charmbracelet/x/ansi/urxvt.go | 17 + .../github.com/charmbracelet/x/ansi/width.go | 14 +- .../github.com/charmbracelet/x/ansi/wrap.go | 50 +- .../clipperhouse/displaywidth/.gitignore | 1 + .../clipperhouse/displaywidth/AGENTS.md | 37 + .../clipperhouse/displaywidth/LICENSE | 21 + .../clipperhouse/displaywidth/README.md | 113 + .../clipperhouse/displaywidth/gen.go | 3 + .../clipperhouse/displaywidth/trie.go | 1903 +++++++++++++++++ .../clipperhouse/displaywidth/width.go | 224 ++ .../github.com/dop251/goja/builtin_regexp.go | 40 +- vendor/github.com/dop251/goja/regexp.go | 37 +- .../jedib0t/go-pretty/v6/progress/progress.go | 8 +- vendor/modernc.org/sqlite/CONTRIBUTORS | 1 + vendor/modules.txt | 51 +- 64 files changed, 3817 insertions(+), 902 deletions(-) create mode 100644 vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go create mode 100644 vendor/github.com/charmbracelet/x/ansi/urxvt.go create mode 100644 vendor/github.com/clipperhouse/displaywidth/.gitignore create mode 100644 vendor/github.com/clipperhouse/displaywidth/AGENTS.md create mode 100644 vendor/github.com/clipperhouse/displaywidth/LICENSE create mode 100644 vendor/github.com/clipperhouse/displaywidth/README.md create mode 100644 vendor/github.com/clipperhouse/displaywidth/gen.go create mode 100644 vendor/github.com/clipperhouse/displaywidth/trie.go create mode 100644 vendor/github.com/clipperhouse/displaywidth/width.go diff --git a/core/state/statedb.go b/core/state/statedb.go index e202e30f95..6903577d9d 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -23,6 +23,7 @@ import ( "maps" "math/big" "slices" + "sort" "sync" "sync/atomic" "time" @@ -261,6 +262,9 @@ func (s *StateDB) Logs() []*types.Log { for _, lgs := range s.logs { logs = append(logs, lgs...) } + sort.Slice(logs, func(i, j int) bool { + return logs[i].Index < logs[j].Index + }) return logs } diff --git a/go.mod b/go.mod index b6e57cd34a..b0a98ce5c7 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,15 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 github.com/CortexFoundation/inference v1.0.2-0.20230307032835-9197d586a4e8 github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66 - github.com/CortexFoundation/torrentfs v1.0.73-0.20251014112104-18ee6a47ca04 + github.com/CortexFoundation/torrentfs v1.0.73-0.20251104103338-c63cf48e29f3 github.com/Microsoft/go-winio v0.6.2 - github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251101005303-90401b9f2bb6 + github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251106012722-c7be33e82a11 github.com/VictoriaMetrics/fastcache v1.13.0 github.com/arsham/figurine v1.3.0 - github.com/aws/aws-sdk-go-v2 v1.39.5 - github.com/aws/aws-sdk-go-v2/config v1.31.16 - github.com/aws/aws-sdk-go-v2/credentials v1.18.20 - github.com/aws/aws-sdk-go-v2/service/route53 v1.59.2 + github.com/aws/aws-sdk-go-v2 v1.39.6 + github.com/aws/aws-sdk-go-v2/config v1.31.17 + github.com/aws/aws-sdk-go-v2/credentials v1.18.21 + github.com/aws/aws-sdk-go-v2/service/route53 v1.59.3 github.com/cespare/cp v1.1.1 github.com/charmbracelet/bubbletea v1.3.10 github.com/cloudflare/cloudflare-go v0.116.0 @@ -25,7 +25,7 @@ require ( github.com/dchest/siphash v1.2.3 github.com/deckarep/golang-set/v2 v2.8.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 - github.com/dop251/goja v0.0.0-20251008123653-cf18d89f3cf6 + github.com/dop251/goja v0.0.0-20251103141225-af2ceb9156d7 github.com/ethereum/c-kzg-4844 v1.0.3 github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab github.com/ethereum/go-verkle v0.2.2 @@ -78,7 +78,7 @@ require ( ) require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/CortexFoundation/compress v0.0.0-20240218153512-9074bdc2397c // indirect github.com/CortexFoundation/cvm-runtime v0.0.0-20221117094012-b5a251885572 // indirect @@ -109,16 +109,16 @@ require ( github.com/antlabs/timer v0.1.4 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/arsham/rainbow v1.2.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 // indirect - github.com/aws/smithy-go v1.23.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 // indirect + github.com/aws/smithy-go v1.23.2 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/benbjohnson/immutable v0.4.3 // indirect @@ -128,11 +128,12 @@ require ( github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/charmbracelet/colorprofile v0.3.2 // indirect + github.com/charmbracelet/colorprofile v0.3.3 // indirect github.com/charmbracelet/lipgloss v1.1.0 // indirect - github.com/charmbracelet/x/ansi v0.10.2 // indirect + github.com/charmbracelet/x/ansi v0.11.0 // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/clipperhouse/displaywidth v0.4.1 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect github.com/clipperhouse/uax29/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.12.0 // indirect @@ -170,7 +171,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect - github.com/jedib0t/go-pretty/v6 v6.6.9 // indirect + github.com/jedib0t/go-pretty/v6 v6.7.0 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kr/pretty v0.3.1 // indirect @@ -235,7 +236,7 @@ require ( github.com/tklauser/numcpus v0.10.0 // indirect github.com/ucwong/filecache v1.0.7 // indirect github.com/ucwong/go-ttlmap v1.0.2-0.20221020173635-331e7ddde2bb // indirect - github.com/ucwong/golang-kv v1.0.24-0.20251012094715-3e5c407f0405 // indirect + github.com/ucwong/golang-kv v1.0.24-0.20251104103105-e81670df077d // indirect github.com/ucwong/shard v1.0.1-0.20250814204722-892131bad5ef // indirect github.com/wlynxg/anet v0.0.5 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect @@ -260,6 +261,6 @@ require ( modernc.org/libc v1.66.10 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.39.1 // indirect + modernc.org/sqlite v1.40.0 // indirect zombiezen.com/go/sqlite v1.4.2 // indirect ) diff --git a/go.sum b/go.sum index c69b40a5fa..81d4bae79b 100644 --- a/go.sum +++ b/go.sum @@ -35,8 +35,8 @@ filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7 git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 h1:5YTBM8QDVIBN3sxBil89WfdAAqDZbyJTgh688DSxX5w= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 h1:JXg2dwJUmPB9JmtVmdEB16APJ7jurfbY5jnfXpJoRMc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0/go.mod h1:YD5h/ldMsG0XiIw7PdyNhLxaM317eFh5yNLccNfGdyw= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 h1:KpMC6LFL7mqpExyMC9jVOYRiVhLmamjeZfRsUpB7l4s= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0/go.mod h1:J7MUC/wtRpfGVbQ5sIItY5/FuVWmvzlY21WAOfQnq/I= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= @@ -70,8 +70,8 @@ github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66/go.mod h1: github.com/CortexFoundation/torrentfs v1.0.13-0.20200623060705-ce027f43f2f8/go.mod h1:Ma+tGhPPvz4CEZHaqEJQMOEGOfHeQBiAoNd1zyc/w3Q= github.com/CortexFoundation/torrentfs v1.0.14-0.20200703071639-3fcabcabf274/go.mod h1:qnb3YlIJmuetVBtC6Lsejr0Xru+1DNmDCdTqnwy7lhk= github.com/CortexFoundation/torrentfs v1.0.20-0.20200810031954-d36d26f82fcc/go.mod h1:N5BsicP5ynjXIi/Npl/SRzlJ630n1PJV2sRj0Z0t2HA= -github.com/CortexFoundation/torrentfs v1.0.73-0.20251014112104-18ee6a47ca04 h1:aKmKxN0yB5he65xnIdlkErGOAUyGjmXcQ9vPDkRALu4= -github.com/CortexFoundation/torrentfs v1.0.73-0.20251014112104-18ee6a47ca04/go.mod h1:4+iPt+j+h8WvWDGmNAYAzCHd3VlznsojQHJffKRkWtk= +github.com/CortexFoundation/torrentfs v1.0.73-0.20251104103338-c63cf48e29f3 h1:LJwKk5qSPkTcTmdIMA0j2ExB6DYrHgOExP6AvEHqqEg= +github.com/CortexFoundation/torrentfs v1.0.73-0.20251104103338-c63cf48e29f3/go.mod h1:AI9LpE5y74V/Eb2VWyAlvmElzNAjMUzJdJisseilYmA= github.com/CortexFoundation/wormhole v0.0.2-0.20250807143819-52807b74f358 h1:y0QMrHsFxmrKBJDjYTnsXw8h/rtjO+tMnmK2OdUzZ/w= github.com/CortexFoundation/wormhole v0.0.2-0.20250807143819-52807b74f358/go.mod h1:R/2T+BS27RdmRWWhoDdgSlordZpUBjVTh8hi4fHoioE= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -85,8 +85,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251101005303-90401b9f2bb6 h1:fLk42CH6Zmm5UhQpvWtNbnNIIYdxyaslU/fr8VbcfHw= -github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251101005303-90401b9f2bb6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251106012722-c7be33e82a11 h1:cP8UbFCldZ6uVbZnI3/EI4FSdO9NaYnx4hY+tyW6FbU= +github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251106012722-c7be33e82a11/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= @@ -267,34 +267,34 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.30.24/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go v1.31.0/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.39.5 h1:e/SXuia3rkFtapghJROrydtQpfQaaUgd1cUvyO1mp2w= -github.com/aws/aws-sdk-go-v2 v1.39.5/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM= -github.com/aws/aws-sdk-go-v2/config v1.31.16 h1:E4Tz+tJiPc7kGnXwIfCyUj6xHJNpENlY11oKpRTgsjc= -github.com/aws/aws-sdk-go-v2/config v1.31.16/go.mod h1:2S9hBElpCyGMifv14WxQ7EfPumgoeCPZUpuPX8VtW34= -github.com/aws/aws-sdk-go-v2/credentials v1.18.20 h1:KFndAnHd9NUuzikHjQ8D5CfFVO+bgELkmcGY8yAw98Q= -github.com/aws/aws-sdk-go-v2/credentials v1.18.20/go.mod h1:9mCi28a+fmBHSQ0UM79omkz6JtN+PEsvLrnG36uoUv0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 h1:VO3FIM2TDbm0kqp6sFNR0PbioXJb/HzCDW6NtIZpIWE= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12/go.mod h1:6C39gB8kg82tx3r72muZSrNhHia9rjGkX7ORaS2GKNE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 h1:p/9flfXdoAnwJnuW9xHEAFY22R3A6skYkW19JFF9F+8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12/go.mod h1:ZTLHakoVCTtW8AaLGSwJ3LXqHD9uQKnOcv1TrpO6u2k= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 h1:2lTWFvRcnWFFLzHWmtddu5MTchc5Oj2OOey++99tPZ0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12/go.mod h1:hI92pK+ho8HVcWMHKHrK3Uml4pfG7wvL86FzO0LVtQQ= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2/config v1.31.17 h1:QFl8lL6RgakNK86vusim14P2k8BFSxjvUkcWLDjgz9Y= +github.com/aws/aws-sdk-go-v2/config v1.31.17/go.mod h1:V8P7ILjp/Uef/aX8TjGk6OHZN6IKPM5YW6S78QnRD5c= +github.com/aws/aws-sdk-go-v2/credentials v1.18.21 h1:56HGpsgnmD+2/KpG0ikvvR8+3v3COCwaF4r+oWwOeNA= +github.com/aws/aws-sdk-go-v2/credentials v1.18.21/go.mod h1:3YELwedmQbw7cXNaII2Wywd+YY58AmLPwX4LzARgmmA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 h1:T1brd5dR3/fzNFAQch/iBKeX07/ffu/cLu+q+RuzEWk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13/go.mod h1:Peg/GBAQ6JDt+RoBf4meB1wylmAipb7Kg2ZFakZTlwk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 h1:xtuxji5CS0JknaXoACOunXOYOQzgfTvGAc9s2QdCJA4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2/go.mod h1:zxwi0DIR0rcRcgdbl7E2MSOvxDyyXGBlScvBkARFaLQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 h1:MM8imH7NZ0ovIVX7D2RxfMDv7Jt9OiUXkcQ+GqywA7M= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12/go.mod h1:gf4OGwdNkbEsb7elw2Sy76odfhwNktWII3WgvQgQQ6w= -github.com/aws/aws-sdk-go-v2/service/route53 v1.59.2 h1:P2p+SDAxnRSz7nBb0zITMc0XdAiEI9nJxnnUBAZOgus= -github.com/aws/aws-sdk-go-v2/service/route53 v1.59.2/go.mod h1:23A7j88sNiaT3N9cb5THyCILUMcwwHQOKxuhMKK3R6Q= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 h1:xHXvxst78wBpJFgDW07xllOx0IAzbryrSdM4nMVQ4Dw= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.0/go.mod h1:/e8m+AO6HNPPqMyfKRtzZ9+mBF5/x1Wk8QiDva4m07I= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 h1:tBw2Qhf0kj4ZwtsVpDiVRU3zKLvjvjgIjHMKirxXg8M= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4/go.mod h1:Deq4B7sRM6Awq/xyOBlxBdgW8/Z926KYNNaGMW2lrkA= -github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 h1:C+BRMnasSYFcgDw8o9H5hzehKzXyAb9GY5v/8bP9DUY= -github.com/aws/aws-sdk-go-v2/service/sts v1.39.0/go.mod h1:4EjU+4mIx6+JqKQkruye+CaigV7alL3thVPfDd9VlMs= -github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M= -github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 h1:kDqdFvMY4AtKoACfzIGD8A0+hbT41KTKF//gq7jITfM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13/go.mod h1:lmKuogqSU3HzQCwZ9ZtcqOc5XGMqtDK7OIc2+DxiUEg= +github.com/aws/aws-sdk-go-v2/service/route53 v1.59.3 h1:YZrYzMaF4J0GbZwxlgSwXgHLBnYzklW3GakKFoOJQik= +github.com/aws/aws-sdk-go-v2/service/route53 v1.59.3/go.mod h1:TUbfYOisWZWyT2qjmlMh93ERw1Ry8G4q/yT2Q8TsDag= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 h1:0JPwLz1J+5lEOfy/g0SURC9cxhbQ1lIMHMa+AHZSzz0= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.1/go.mod h1:fKvyjJcz63iL/ftA6RaM8sRCtN4r4zl4tjL3qw5ec7k= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 h1:OWs0/j2UYR5LOGi88sD5/lhN6TDLG6SfA7CqsQO9zF0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5/go.mod h1:klO+ejMvYsB4QATfEOIXk8WAEwN4N0aBfJpvC+5SZBo= +github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 h1:mLlUgHn02ue8whiR4BmxxGJLR2gwU6s6ZzJ5wDamBUs= +github.com/aws/aws-sdk-go-v2/service/sts v1.39.1/go.mod h1:E19xDjpzPZC7LS2knI9E6BaRFDK43Eul7vd6rSq2HWk= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -343,12 +343,12 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw= github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4= -github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= -github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= +github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI= +github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4= github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= -github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= -github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= +github.com/charmbracelet/x/ansi v0.11.0 h1:uuIVK7GIplwX6UBIz8S2TF8nkr7xRlygSsBRjSJqIvA= +github.com/charmbracelet/x/ansi v0.11.0/go.mod h1:uQt8bOrq/xgXjlGcFMc8U2WYbnxyjrKhnvTQluvfCaE= github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= @@ -359,6 +359,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clipperhouse/displaywidth v0.4.1 h1:uVw9V8UDfnggg3K2U84VWY1YLQ/x2aKSCtkRyYozfoU= +github.com/clipperhouse/displaywidth v0.4.1/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o= 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.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= @@ -435,8 +437,8 @@ github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cn github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= -github.com/dop251/goja v0.0.0-20251008123653-cf18d89f3cf6 h1:6dE1TmjqkY6tehR4A67gDNhvDtuZ54ocu7ab4K9o540= -github.com/dop251/goja v0.0.0-20251008123653-cf18d89f3cf6/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= +github.com/dop251/goja v0.0.0-20251103141225-af2ceb9156d7 h1:jxmXU5V9tXxJnydU5v/m9SG8TRUa/Z7IXODBpMs/P+U= +github.com/dop251/goja v0.0.0-20251103141225-af2ceb9156d7/go.mod h1:MxLav0peU43GgvwVgNbLAj1s/bSGboKkhuULvq/7hx4= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -733,8 +735,8 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jedib0t/go-pretty/v6 v6.6.9 h1:PQecJLK3L8ODuVyMe2223b61oRJjrKnmXAncbWTv9MY= -github.com/jedib0t/go-pretty/v6 v6.6.9/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jedib0t/go-pretty/v6 v6.7.0 h1:DanoN1RnjXTwDN+B8yqtixXzXqNBCs2Vxo2ARsnrpsY= +github.com/jedib0t/go-pretty/v6 v6.7.0/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7 h1:FWpSWRD8FbVkKQu8M1DM9jF5oXFLyE+XpisIYfdzbic= github.com/jedisct1/go-minisign v0.0.0-20241212093149-d2f9f49435c7/go.mod h1:BMxO138bOokdgt4UaxZiEfypcSHX0t6SIFimVP1oRfk= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= @@ -1248,8 +1250,8 @@ github.com/ucwong/filecache v1.0.7 h1:2ingbpnDpTt5WoWT+vLWdiM3M5LQjpZFIYkkx3x86U github.com/ucwong/filecache v1.0.7/go.mod h1:ddwX+NCjMZPdpzcGh1fcEbNTUTCtKgt2hC2rqvmLKgA= github.com/ucwong/go-ttlmap v1.0.2-0.20221020173635-331e7ddde2bb h1:dVZH3AH9f7zB3VBmsjn25B7lfcAyMP4QxdFYTrfj7tg= github.com/ucwong/go-ttlmap v1.0.2-0.20221020173635-331e7ddde2bb/go.mod h1:3yswsBsVuwsOjDvFfC5Na9XSEf4HC7mj3W3g6jvSY/s= -github.com/ucwong/golang-kv v1.0.24-0.20251012094715-3e5c407f0405 h1:qzKPjJ3NPdzMMgzR6jfljL8Uk98UweTv7XVZ/hvwENE= -github.com/ucwong/golang-kv v1.0.24-0.20251012094715-3e5c407f0405/go.mod h1:zgLbsSNoVysDqux6SCvPOLLSysh/tOSHvbDro3ZIU7U= +github.com/ucwong/golang-kv v1.0.24-0.20251104103105-e81670df077d h1:Z0Iatl7SiRcSubryfA55ygjC+1ikX1Wn92egoeF5ous= +github.com/ucwong/golang-kv v1.0.24-0.20251104103105-e81670df077d/go.mod h1:9B0YH0Qv7PjQwknbbzs5OUW1TiIOFEjD8EmZGOdZ/3Y= github.com/ucwong/golang-set v1.8.1-0.20200419153428-d7b0b1ac2d43/go.mod h1:xu0FaiQFGbBcFZj2o7udZ5rbA8jRTsv47hkPoG5qQNM= github.com/ucwong/goleveldb v1.0.3-0.20200508074755-578cba616f37/go.mod h1:dgJUTtDxq/ne6/JzZhHzF24OL/uqILz9IWk8HmT4V2g= github.com/ucwong/goleveldb v1.0.3-0.20200618184106-f1c6bc3a428b/go.mod h1:7Sq6w7AfEZuB/a6mrlvHCSXCSkqojCMMrM3Ei12QAT0= @@ -1799,8 +1801,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.39.1 h1:H+/wGFzuSCIEVCvXYVHX5RQglwhMOvtHSv+VtidL2r4= -modernc.org/sqlite v1.39.1/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= +modernc.org/sqlite v1.40.0 h1:bNWEDlYhNPAUdUdBzjAvn8icAs/2gaKlj4vM+tQ6KdQ= +modernc.org/sqlite v1.40.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md index 1799c6ef22..47d2b85fa8 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/CHANGELOG.md @@ -1,5 +1,16 @@ # Release History +## 1.20.0 (2025-11-06) + +### Features Added + +* Added `runtime.FetcherForNextLinkOptions.HTTPVerb` to specify the HTTP verb when fetching the next page via next link. Defaults to `http.MethodGet`. + +### Bugs Fixed + +* Fixed potential panic when decoding base64 strings. +* Fixed an issue in resource identifier parsing which prevented it from returning an error for malformed resource IDs. + ## 1.19.1 (2025-09-11) ### Bugs Fixed diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go index 460170034a..612af11ac6 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/exported/exported.go @@ -92,7 +92,7 @@ func DecodeByteArray(s string, v *[]byte, format Base64Encoding) error { return nil } payload := string(s) - if payload[0] == '"' { + if len(payload) >= 2 && payload[0] == '"' && payload[len(payload)-1] == '"' { // remove surrounding quotes payload = payload[1 : len(payload)-1] } diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go index 8aebe5ce53..f152000913 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/internal/shared/constants.go @@ -40,5 +40,5 @@ const ( Module = "azcore" // Version is the semantic version (see http://semver.org) of this module. - Version = "v1.19.1" + Version = "v1.20.0" ) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go index c66fc0a90a..edb4a3cd44 100644 --- a/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go +++ b/vendor/github.com/Azure/azure-sdk-for-go/sdk/azcore/runtime/pager.go @@ -99,6 +99,11 @@ type FetcherForNextLinkOptions struct { // StatusCodes contains additional HTTP status codes indicating success. // The default value is http.StatusOK. StatusCodes []int + + // HTTPVerb specifies the HTTP verb to use when fetching the next page. + // The default value is http.MethodGet. + // This field is only used when NextReq is not specified. + HTTPVerb string } // FetcherForNextLink is a helper containing boilerplate code to simplify creating a PagingHandler[T].Fetcher from a next link URL. @@ -119,7 +124,11 @@ func FetcherForNextLink(ctx context.Context, pl Pipeline, nextLink string, first if options.NextReq != nil { req, err = options.NextReq(ctx, nextLink) } else { - req, err = NewRequest(ctx, http.MethodGet, nextLink) + verb := http.MethodGet + if options.HTTPVerb != "" { + verb = options.HTTPVerb + } + req, err = NewRequest(ctx, verb, nextLink) } } if err != nil { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 8f747b745f..372d0f9839 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.39.5" +const goModuleVersion = "1.39.6" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index 27afcdadcc..b6057249bd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.31.17 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.31.16 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index 7f4888ae95..e27cb6f4d8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.31.16" +const goModuleVersion = "1.31.17" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index e66518ff72..463dce685c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.18.21 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.18.20 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index bdec1e26a8..89e632cc24 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.20" +const goModuleVersion = "1.18.21" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index aa3726bd17..cfb9d77fe0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.18.13 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.18.12 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index 5909b39adb..1af019aec2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.12" +const goModuleVersion = "1.18.13" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index 9ccaf88dae..0981931aa7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.4.13 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.4.12 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index 2d23b91da7..970e61deed 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.4.12" +const goModuleVersion = "1.4.13" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index c07b855aad..9c3aafe1da 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,8 @@ +# v2.7.13 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v2.7.12 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index 960cde8d31..9675feb419 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.7.12" +const goModuleVersion = "2.7.13" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md index a57fe5681c..c05f82ea41 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.13.3 (2025-11-04) + +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.13.2 (2025-10-16) * **Dependency Update**: Bump minimum Go version to 1.23. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go index 5679801451..6a4c336055 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go @@ -3,4 +3,4 @@ package acceptencoding // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.2" +const goModuleVersion = "1.13.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index 79d299763f..2021865dd0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.13.13 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.13.12 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index 926a0f299b..9d29218c31 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.12" +const goModuleVersion = "1.13.13" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md index 0278bc785e..2df4ebb723 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.59.3 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.59.2 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go index d1aca4a773..b23464b4d2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/route53/go_module_metadata.go @@ -3,4 +3,4 @@ package route53 // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.59.2" +const goModuleVersion = "1.59.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index 6de9f9fc16..4cb0c9100b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.30.1 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.30.0 (2025-10-30) * **Feature**: Update endpoint ruleset parameters casing diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index 3f4d85a04e..c84f88075c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.30.0" +const goModuleVersion = "1.30.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index 681dc1e989..ac8f4c476e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.35.5 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.35.4 (2025-10-30) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index 0d62a15a58..d882f41ddc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.35.4" +const goModuleVersion = "1.35.5" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index 7606774589..9ae35f4499 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.39.1 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + # v1.39.0 (2025-10-30) * **Feature**: Update endpoint ruleset parameters casing diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index c89b362b00..a4dbe82e4e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.39.0" +const goModuleVersion = "1.39.1" diff --git a/vendor/github.com/aws/smithy-go/CHANGELOG.md b/vendor/github.com/aws/smithy-go/CHANGELOG.md index 3e07a9b02d..8193f4b396 100644 --- a/vendor/github.com/aws/smithy-go/CHANGELOG.md +++ b/vendor/github.com/aws/smithy-go/CHANGELOG.md @@ -1,3 +1,13 @@ +# Release (2025-11-03) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/smithy-go`: v1.23.2 + * **Bug Fix**: Adjust the initial sizes of each middleware phase to avoid some unnecessary reallocation. + * **Bug Fix**: Avoid unnecessary allocation overhead from the metrics system when not in use. + # Release (2025-10-15) ## General Highlights diff --git a/vendor/github.com/aws/smithy-go/go_module_metadata.go b/vendor/github.com/aws/smithy-go/go_module_metadata.go index 39b45809e3..263059014b 100644 --- a/vendor/github.com/aws/smithy-go/go_module_metadata.go +++ b/vendor/github.com/aws/smithy-go/go_module_metadata.go @@ -3,4 +3,4 @@ package smithy // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.23.1" +const goModuleVersion = "1.23.2" diff --git a/vendor/github.com/aws/smithy-go/metrics/nop.go b/vendor/github.com/aws/smithy-go/metrics/nop.go index fb374e1fb8..444126df5a 100644 --- a/vendor/github.com/aws/smithy-go/metrics/nop.go +++ b/vendor/github.com/aws/smithy-go/metrics/nop.go @@ -9,54 +9,82 @@ var _ MeterProvider = (*NopMeterProvider)(nil) // Meter returns a meter which creates no-op instruments. func (NopMeterProvider) Meter(string, ...MeterOption) Meter { - return nopMeter{} + return NopMeter{} } -type nopMeter struct{} +// NopMeter creates no-op instruments. +type NopMeter struct{} -var _ Meter = (*nopMeter)(nil) +var _ Meter = (*NopMeter)(nil) -func (nopMeter) Int64Counter(string, ...InstrumentOption) (Int64Counter, error) { - return nopInstrument[int64]{}, nil +// Int64Counter creates a no-op instrument. +func (NopMeter) Int64Counter(string, ...InstrumentOption) (Int64Counter, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64UpDownCounter(string, ...InstrumentOption) (Int64UpDownCounter, error) { - return nopInstrument[int64]{}, nil + +// Int64UpDownCounter creates a no-op instrument. +func (NopMeter) Int64UpDownCounter(string, ...InstrumentOption) (Int64UpDownCounter, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64Gauge(string, ...InstrumentOption) (Int64Gauge, error) { - return nopInstrument[int64]{}, nil + +// Int64Gauge creates a no-op instrument. +func (NopMeter) Int64Gauge(string, ...InstrumentOption) (Int64Gauge, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64Histogram(string, ...InstrumentOption) (Int64Histogram, error) { - return nopInstrument[int64]{}, nil + +// Int64Histogram creates a no-op instrument. +func (NopMeter) Int64Histogram(string, ...InstrumentOption) (Int64Histogram, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64AsyncCounter(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[int64]{}, nil + +// Int64AsyncCounter creates a no-op instrument. +func (NopMeter) Int64AsyncCounter(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64AsyncUpDownCounter(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[int64]{}, nil + +// Int64AsyncUpDownCounter creates a no-op instrument. +func (NopMeter) Int64AsyncUpDownCounter(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Int64AsyncGauge(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[int64]{}, nil + +// Int64AsyncGauge creates a no-op instrument. +func (NopMeter) Int64AsyncGauge(string, Int64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentInt64, nil } -func (nopMeter) Float64Counter(string, ...InstrumentOption) (Float64Counter, error) { - return nopInstrument[float64]{}, nil + +// Float64Counter creates a no-op instrument. +func (NopMeter) Float64Counter(string, ...InstrumentOption) (Float64Counter, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64UpDownCounter(string, ...InstrumentOption) (Float64UpDownCounter, error) { - return nopInstrument[float64]{}, nil + +// Float64UpDownCounter creates a no-op instrument. +func (NopMeter) Float64UpDownCounter(string, ...InstrumentOption) (Float64UpDownCounter, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64Gauge(string, ...InstrumentOption) (Float64Gauge, error) { - return nopInstrument[float64]{}, nil + +// Float64Gauge creates a no-op instrument. +func (NopMeter) Float64Gauge(string, ...InstrumentOption) (Float64Gauge, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64Histogram(string, ...InstrumentOption) (Float64Histogram, error) { - return nopInstrument[float64]{}, nil + +// Float64Histogram creates a no-op instrument. +func (NopMeter) Float64Histogram(string, ...InstrumentOption) (Float64Histogram, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64AsyncCounter(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[float64]{}, nil + +// Float64AsyncCounter creates a no-op instrument. +func (NopMeter) Float64AsyncCounter(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64AsyncUpDownCounter(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[float64]{}, nil + +// Float64AsyncUpDownCounter creates a no-op instrument. +func (NopMeter) Float64AsyncUpDownCounter(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentFloat64, nil } -func (nopMeter) Float64AsyncGauge(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { - return nopInstrument[float64]{}, nil + +// Float64AsyncGauge creates a no-op instrument. +func (NopMeter) Float64AsyncGauge(string, Float64Callback, ...InstrumentOption) (AsyncInstrument, error) { + return nopInstrumentFloat64, nil } type nopInstrument[N any] struct{} @@ -65,3 +93,6 @@ func (nopInstrument[N]) Add(context.Context, N, ...RecordMetricOption) {} func (nopInstrument[N]) Sample(context.Context, N, ...RecordMetricOption) {} func (nopInstrument[N]) Record(context.Context, N, ...RecordMetricOption) {} func (nopInstrument[_]) Stop() {} + +var nopInstrumentInt64 = nopInstrument[int64]{} +var nopInstrumentFloat64 = nopInstrument[float64]{} diff --git a/vendor/github.com/aws/smithy-go/middleware/ordered_group.go b/vendor/github.com/aws/smithy-go/middleware/ordered_group.go index 4b195308c5..daf90136e9 100644 --- a/vendor/github.com/aws/smithy-go/middleware/ordered_group.go +++ b/vendor/github.com/aws/smithy-go/middleware/ordered_group.go @@ -23,12 +23,14 @@ type orderedIDs struct { items map[string]ider } -const baseOrderedItems = 5 +// selected based on the general upper bound of # of middlewares in each step +// in the downstream aws-sdk-go-v2 +const baseOrderedItems = 8 -func newOrderedIDs() *orderedIDs { +func newOrderedIDs(cap int) *orderedIDs { return &orderedIDs{ - order: newRelativeOrder(), - items: make(map[string]ider, baseOrderedItems), + order: newRelativeOrder(cap), + items: make(map[string]ider, cap), } } @@ -141,9 +143,9 @@ type relativeOrder struct { order []string } -func newRelativeOrder() *relativeOrder { +func newRelativeOrder(cap int) *relativeOrder { return &relativeOrder{ - order: make([]string, 0, baseOrderedItems), + order: make([]string, 0, cap), } } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_build.go b/vendor/github.com/aws/smithy-go/middleware/step_build.go index 7e1d94caee..cc7fe89c94 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_build.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_build.go @@ -79,7 +79,7 @@ type BuildStep struct { // initialization added to it. func NewBuildStep() *BuildStep { return &BuildStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), } } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go b/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go index 4486072157..9a6679a59b 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go @@ -85,7 +85,8 @@ type DeserializeStep struct { // initialization added to it. func NewDeserializeStep() *DeserializeStep { return &DeserializeStep{ - ids: newOrderedIDs(), + // downstream SDK typically has larger Deserialize step + ids: newOrderedIDs(baseOrderedItems * 2), } } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_finalize.go b/vendor/github.com/aws/smithy-go/middleware/step_finalize.go index 065e3885de..76eab24909 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_finalize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_finalize.go @@ -79,7 +79,8 @@ type FinalizeStep struct { // initialization added to it. func NewFinalizeStep() *FinalizeStep { return &FinalizeStep{ - ids: newOrderedIDs(), + // downstream SDK typically has larger Finalize step + ids: newOrderedIDs(baseOrderedItems * 2), } } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_initialize.go b/vendor/github.com/aws/smithy-go/middleware/step_initialize.go index fe359144d2..312be3a331 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_initialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_initialize.go @@ -79,7 +79,7 @@ type InitializeStep struct { // initialization added to it. func NewInitializeStep() *InitializeStep { return &InitializeStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), } } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_serialize.go b/vendor/github.com/aws/smithy-go/middleware/step_serialize.go index 114bafcede..a4ce4bee3b 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_serialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_serialize.go @@ -85,7 +85,7 @@ type SerializeStep struct { // serialize the input parameters into. func NewSerializeStep(newRequest func() interface{}) *SerializeStep { return &SerializeStep{ - ids: newOrderedIDs(), + ids: newOrderedIDs(baseOrderedItems), newRequest: newRequest, } } diff --git a/vendor/github.com/aws/smithy-go/transport/http/metrics.go b/vendor/github.com/aws/smithy-go/transport/http/metrics.go index d1beaa595d..b4cd4a47e3 100644 --- a/vendor/github.com/aws/smithy-go/transport/http/metrics.go +++ b/vendor/github.com/aws/smithy-go/transport/http/metrics.go @@ -17,6 +17,12 @@ var now = time.Now func withMetrics(parent context.Context, client ClientDo, meter metrics.Meter) ( context.Context, ClientDo, error, ) { + // WithClientTrace is an expensive operation - avoid calling it if we're + // not actually using a metrics sink. + if _, ok := meter.(metrics.NopMeter); ok { + return parent, client, nil + } + hm, err := newHTTPMetrics(meter) if err != nil { return nil, nil, err diff --git a/vendor/github.com/charmbracelet/colorprofile/env.go b/vendor/github.com/charmbracelet/colorprofile/env.go index 749f989e23..3c312c9fd9 100644 --- a/vendor/github.com/charmbracelet/colorprofile/env.go +++ b/vendor/github.com/charmbracelet/colorprofile/env.go @@ -153,29 +153,24 @@ func envColorProfile(env environ) (p Profile) { p = ANSI } - parts := strings.Split(term, "-") - switch parts[0] { - case "alacritty", - "contour", - "foot", - "ghostty", - "kitty", - "rio", - "st", - "wezterm": + switch { + case strings.Contains(term, "alacritty"), + strings.Contains(term, "contour"), + strings.Contains(term, "foot"), + strings.Contains(term, "ghostty"), + strings.Contains(term, "kitty"), + strings.Contains(term, "rio"), + strings.Contains(term, "st"), + strings.Contains(term, "wezterm"): return TrueColor - case "xterm": - if len(parts) > 1 { - switch parts[1] { - case "ghostty", "kitty": - // These terminals can be defined as xterm-TERMNAME - return TrueColor - } - } - case "tmux", "screen": + case strings.HasPrefix(term, "tmux"), strings.HasPrefix(term, "screen"): if p < ANSI256 { p = ANSI256 } + case strings.HasPrefix(term, "xterm"): + if p < ANSI { + p = ANSI + } } if isCloudShell, _ := strconv.ParseBool(env.get("GOOGLE_CLOUD_SHELL")); isCloudShell { diff --git a/vendor/github.com/charmbracelet/x/ansi/mode.go b/vendor/github.com/charmbracelet/x/ansi/mode.go index 03c91108cc..1c21a61fb4 100644 --- a/vendor/github.com/charmbracelet/x/ansi/mode.go +++ b/vendor/github.com/charmbracelet/x/ansi/mode.go @@ -108,7 +108,7 @@ func DECRST(modes ...Mode) string { func setMode(reset bool, modes ...Mode) (s string) { if len(modes) == 0 { - return //nolint:nakedret + return s } cmd := "h" @@ -142,7 +142,7 @@ func setMode(reset bool, modes ...Mode) (s string) { if len(dec) > 0 { s += seq + "?" + strings.Join(dec, ";") + cmd } - return //nolint:nakedret + return s } // RequestMode (DECRQM) returns a sequence to request a mode from the terminal. @@ -228,12 +228,12 @@ func (m DECMode) Mode() int { // // See: https://vt100.net/docs/vt510-rm/KAM.html const ( - KeyboardActionMode = ANSIMode(2) - KAM = KeyboardActionMode + ModeKeyboardAction = ANSIMode(2) + KAM = ModeKeyboardAction - SetKeyboardActionMode = "\x1b[2h" - ResetKeyboardActionMode = "\x1b[2l" - RequestKeyboardActionMode = "\x1b[2$p" + SetModeKeyboardAction = "\x1b[2h" + ResetModeKeyboardAction = "\x1b[2l" + RequestModeKeyboardAction = "\x1b[2$p" ) // Insert/Replace Mode (IRM) is a mode that determines whether characters are @@ -245,12 +245,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/IRM.html const ( - InsertReplaceMode = ANSIMode(4) - IRM = InsertReplaceMode + ModeInsertReplace = ANSIMode(4) + IRM = ModeInsertReplace - SetInsertReplaceMode = "\x1b[4h" - ResetInsertReplaceMode = "\x1b[4l" - RequestInsertReplaceMode = "\x1b[4$p" + SetModeInsertReplace = "\x1b[4h" + ResetModeInsertReplace = "\x1b[4l" + RequestModeInsertReplace = "\x1b[4$p" ) // BiDirectional Support Mode (BDSM) is a mode that determines whether the @@ -260,12 +260,12 @@ const ( // // See ECMA-48 7.2.1. const ( - BiDirectionalSupportMode = ANSIMode(8) - BDSM = BiDirectionalSupportMode + ModeBiDirectionalSupport = ANSIMode(8) + BDSM = ModeBiDirectionalSupport - SetBiDirectionalSupportMode = "\x1b[8h" - ResetBiDirectionalSupportMode = "\x1b[8l" - RequestBiDirectionalSupportMode = "\x1b[8$p" + SetModeBiDirectionalSupport = "\x1b[8h" + ResetModeBiDirectionalSupport = "\x1b[8l" + RequestModeBiDirectionalSupport = "\x1b[8$p" ) // Send Receive Mode (SRM) or Local Echo Mode is a mode that determines whether @@ -274,17 +274,17 @@ const ( // // See: https://vt100.net/docs/vt510-rm/SRM.html const ( - SendReceiveMode = ANSIMode(12) - LocalEchoMode = SendReceiveMode - SRM = SendReceiveMode + ModeSendReceive = ANSIMode(12) + ModeLocalEcho = ModeSendReceive + SRM = ModeSendReceive - SetSendReceiveMode = "\x1b[12h" - ResetSendReceiveMode = "\x1b[12l" - RequestSendReceiveMode = "\x1b[12$p" + SetModeSendReceive = "\x1b[12h" + ResetModeSendReceive = "\x1b[12l" + RequestModeSendReceive = "\x1b[12$p" - SetLocalEchoMode = "\x1b[12h" - ResetLocalEchoMode = "\x1b[12l" - RequestLocalEchoMode = "\x1b[12$p" + SetModeLocalEcho = "\x1b[12h" + ResetModeLocalEcho = "\x1b[12l" + RequestModeLocalEcho = "\x1b[12$p" ) // Line Feed/New Line Mode (LNM) is a mode that determines whether the terminal @@ -299,12 +299,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/LNM.html const ( - LineFeedNewLineMode = ANSIMode(20) - LNM = LineFeedNewLineMode + ModeLineFeedNewLine = ANSIMode(20) + LNM = ModeLineFeedNewLine - SetLineFeedNewLineMode = "\x1b[20h" - ResetLineFeedNewLineMode = "\x1b[20l" - RequestLineFeedNewLineMode = "\x1b[20$p" + SetModeLineFeedNewLine = "\x1b[20h" + ResetModeLineFeedNewLine = "\x1b[20l" + RequestModeLineFeedNewLine = "\x1b[20$p" ) // Cursor Keys Mode (DECCKM) is a mode that determines whether the cursor keys @@ -312,18 +312,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECCKM.html const ( - CursorKeysMode = DECMode(1) - DECCKM = CursorKeysMode + ModeCursorKeys = DECMode(1) + DECCKM = ModeCursorKeys - SetCursorKeysMode = "\x1b[?1h" - ResetCursorKeysMode = "\x1b[?1l" - RequestCursorKeysMode = "\x1b[?1$p" -) - -// Deprecated: use [SetCursorKeysMode] and [ResetCursorKeysMode] instead. -const ( - EnableCursorKeys = "\x1b[?1h" //nolint:revive // grouped constants - DisableCursorKeys = "\x1b[?1l" + SetModeCursorKeys = "\x1b[?1h" + ResetModeCursorKeys = "\x1b[?1l" + RequestModeCursorKeys = "\x1b[?1$p" ) // Origin Mode (DECOM) is a mode that determines whether the cursor moves to the @@ -331,12 +325,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECOM.html const ( - OriginMode = DECMode(6) - DECOM = OriginMode + ModeOrigin = DECMode(6) + DECOM = ModeOrigin - SetOriginMode = "\x1b[?6h" - ResetOriginMode = "\x1b[?6l" - RequestOriginMode = "\x1b[?6$p" + SetModeOrigin = "\x1b[?6h" + ResetModeOrigin = "\x1b[?6l" + RequestModeOrigin = "\x1b[?6$p" ) // Auto Wrap Mode (DECAWM) is a mode that determines whether the cursor wraps @@ -344,12 +338,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECAWM.html const ( - AutoWrapMode = DECMode(7) - DECAWM = AutoWrapMode + ModeAutoWrap = DECMode(7) + DECAWM = ModeAutoWrap - SetAutoWrapMode = "\x1b[?7h" - ResetAutoWrapMode = "\x1b[?7l" - RequestAutoWrapMode = "\x1b[?7$p" + SetModeAutoWrap = "\x1b[?7h" + ResetModeAutoWrap = "\x1b[?7l" + RequestModeAutoWrap = "\x1b[?7$p" ) // X10 Mouse Mode is a mode that determines whether the mouse reports on button @@ -364,39 +358,29 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - X10MouseMode = DECMode(9) + ModeMouseX10 = DECMode(9) - SetX10MouseMode = "\x1b[?9h" - ResetX10MouseMode = "\x1b[?9l" - RequestX10MouseMode = "\x1b[?9$p" + SetModeMouseX10 = "\x1b[?9h" + ResetModeMouseX10 = "\x1b[?9l" + RequestModeMouseX10 = "\x1b[?9$p" ) // Text Cursor Enable Mode (DECTCEM) is a mode that shows/hides the cursor. // // See: https://vt100.net/docs/vt510-rm/DECTCEM.html const ( - TextCursorEnableMode = DECMode(25) - DECTCEM = TextCursorEnableMode + ModeTextCursorEnable = DECMode(25) + DECTCEM = ModeTextCursorEnable - SetTextCursorEnableMode = "\x1b[?25h" - ResetTextCursorEnableMode = "\x1b[?25l" - RequestTextCursorEnableMode = "\x1b[?25$p" + SetModeTextCursorEnable = "\x1b[?25h" + ResetModeTextCursorEnable = "\x1b[?25l" + RequestModeTextCursorEnable = "\x1b[?25$p" ) -// These are aliases for [SetTextCursorEnableMode] and [ResetTextCursorEnableMode]. -const ( - ShowCursor = SetTextCursorEnableMode - HideCursor = ResetTextCursorEnableMode -) - -// Text Cursor Enable Mode (DECTCEM) is a mode that shows/hides the cursor. -// -// See: https://vt100.net/docs/vt510-rm/DECTCEM.html -// -// Deprecated: use [SetTextCursorEnableMode] and [ResetTextCursorEnableMode] instead. +// These are aliases for [SetModeTextCursorEnable] and [ResetModeTextCursorEnable]. const ( - CursorEnableMode = DECMode(25) - RequestCursorVisibility = "\x1b[?25$p" + ShowCursor = SetModeTextCursorEnable + HideCursor = ResetModeTextCursorEnable ) // Numeric Keypad Mode (DECNKM) is a mode that determines whether the keypad @@ -406,12 +390,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECNKM.html const ( - NumericKeypadMode = DECMode(66) - DECNKM = NumericKeypadMode + ModeNumericKeypad = DECMode(66) + DECNKM = ModeNumericKeypad - SetNumericKeypadMode = "\x1b[?66h" - ResetNumericKeypadMode = "\x1b[?66l" - RequestNumericKeypadMode = "\x1b[?66$p" + SetModeNumericKeypad = "\x1b[?66h" + ResetModeNumericKeypad = "\x1b[?66l" + RequestModeNumericKeypad = "\x1b[?66$p" ) // Backarrow Key Mode (DECBKM) is a mode that determines whether the backspace @@ -419,12 +403,12 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECBKM.html const ( - BackarrowKeyMode = DECMode(67) - DECBKM = BackarrowKeyMode + ModeBackarrowKey = DECMode(67) + DECBKM = ModeBackarrowKey - SetBackarrowKeyMode = "\x1b[?67h" - ResetBackarrowKeyMode = "\x1b[?67l" - RequestBackarrowKeyMode = "\x1b[?67$p" + SetModeBackarrowKey = "\x1b[?67h" + ResetModeBackarrowKey = "\x1b[?67l" + RequestModeBackarrowKey = "\x1b[?67$p" ) // Left Right Margin Mode (DECLRMM) is a mode that determines whether the left @@ -432,47 +416,33 @@ const ( // // See: https://vt100.net/docs/vt510-rm/DECLRMM.html const ( - LeftRightMarginMode = DECMode(69) - DECLRMM = LeftRightMarginMode + ModeLeftRightMargin = DECMode(69) + DECLRMM = ModeLeftRightMargin - SetLeftRightMarginMode = "\x1b[?69h" - ResetLeftRightMarginMode = "\x1b[?69l" - RequestLeftRightMarginMode = "\x1b[?69$p" + SetModeLeftRightMargin = "\x1b[?69h" + ResetModeLeftRightMargin = "\x1b[?69l" + RequestModeLeftRightMargin = "\x1b[?69$p" ) // Normal Mouse Mode is a mode that determines whether the mouse reports on // button presses and releases. It will also report modifier keys, wheel // events, and extra buttons. // -// It uses the same encoding as [X10MouseMode] with a few differences: +// It uses the same encoding as [ModeMouseX10] with a few differences: // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - NormalMouseMode = DECMode(1000) + ModeMouseNormal = DECMode(1000) - SetNormalMouseMode = "\x1b[?1000h" - ResetNormalMouseMode = "\x1b[?1000l" - RequestNormalMouseMode = "\x1b[?1000$p" -) - -// VT Mouse Tracking is a mode that determines whether the mouse reports on -// button press and release. -// -// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking -// -// Deprecated: use [NormalMouseMode] instead. -const ( - MouseMode = DECMode(1000) - - EnableMouse = "\x1b[?1000h" - DisableMouse = "\x1b[?1000l" - RequestMouse = "\x1b[?1000$p" + SetModeMouseNormal = "\x1b[?1000h" + ResetModeMouseNormal = "\x1b[?1000l" + RequestModeMouseNormal = "\x1b[?1000$p" ) // Highlight Mouse Tracking is a mode that determines whether the mouse reports // on button presses, releases, and highlighted cells. // -// It uses the same encoding as [NormalMouseMode] with a few differences: +// It uses the same encoding as [ModeMouseNormal] with a few differences: // // On highlight events, the terminal responds with the following encoding: // @@ -481,11 +451,11 @@ const ( // // Where the parameters are startx, starty, endx, endy, mousex, and mousey. const ( - HighlightMouseMode = DECMode(1001) + ModeMouseHighlight = DECMode(1001) - SetHighlightMouseMode = "\x1b[?1001h" - ResetHighlightMouseMode = "\x1b[?1001l" - RequestHighlightMouseMode = "\x1b[?1001$p" + SetModeMouseHighlight = "\x1b[?1001h" + ResetModeMouseHighlight = "\x1b[?1001l" + RequestModeMouseHighlight = "\x1b[?1001$p" ) // VT Hilite Mouse Tracking is a mode that determines whether the mouse reports on @@ -493,65 +463,29 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking // -// Deprecated: use [HighlightMouseMode] instead. -const ( - MouseHiliteMode = DECMode(1001) - EnableMouseHilite = "\x1b[?1001h" - DisableMouseHilite = "\x1b[?1001l" - RequestMouseHilite = "\x1b[?1001$p" -) - -// Button Event Mouse Tracking is essentially the same as [NormalMouseMode], +// Button Event Mouse Tracking is essentially the same as [ModeMouseNormal], // but it also reports button-motion events when a button is pressed. // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - ButtonEventMouseMode = DECMode(1002) - - SetButtonEventMouseMode = "\x1b[?1002h" - ResetButtonEventMouseMode = "\x1b[?1002l" - RequestButtonEventMouseMode = "\x1b[?1002$p" -) - -// Cell Motion Mouse Tracking is a mode that determines whether the mouse -// reports on button press, release, and motion events. -// -// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking -// -// Deprecated: use [ButtonEventMouseMode] instead. -const ( - MouseCellMotionMode = DECMode(1002) + ModeMouseButtonEvent = DECMode(1002) - EnableMouseCellMotion = "\x1b[?1002h" - DisableMouseCellMotion = "\x1b[?1002l" - RequestMouseCellMotion = "\x1b[?1002$p" + SetModeMouseButtonEvent = "\x1b[?1002h" + ResetModeMouseButtonEvent = "\x1b[?1002l" + RequestModeMouseButtonEvent = "\x1b[?1002$p" ) -// Any Event Mouse Tracking is the same as [ButtonEventMouseMode], except that +// Any Event Mouse Tracking is the same as [ModeMouseButtonEvent], except that // all motion events are reported even if no mouse buttons are pressed. // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - AnyEventMouseMode = DECMode(1003) + ModeMouseAnyEvent = DECMode(1003) - SetAnyEventMouseMode = "\x1b[?1003h" - ResetAnyEventMouseMode = "\x1b[?1003l" - RequestAnyEventMouseMode = "\x1b[?1003$p" -) - -// All Mouse Tracking is a mode that determines whether the mouse reports on -// button press, release, motion, and highlight events. -// -// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking -// -// Deprecated: use [AnyEventMouseMode] instead. -const ( - MouseAllMotionMode = DECMode(1003) - - EnableMouseAllMotion = "\x1b[?1003h" - DisableMouseAllMotion = "\x1b[?1003l" - RequestMouseAllMotion = "\x1b[?1003$p" + SetModeMouseAnyEvent = "\x1b[?1003h" + ResetModeMouseAnyEvent = "\x1b[?1003l" + RequestModeMouseAnyEvent = "\x1b[?1003$p" ) // Focus Event Mode is a mode that determines whether the terminal reports focus @@ -564,22 +498,11 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Focus-Tracking const ( - FocusEventMode = DECMode(1004) + ModeFocusEvent = DECMode(1004) - SetFocusEventMode = "\x1b[?1004h" - ResetFocusEventMode = "\x1b[?1004l" - RequestFocusEventMode = "\x1b[?1004$p" -) - -// Deprecated: use [SetFocusEventMode], [ResetFocusEventMode], and -// [RequestFocusEventMode] instead. -// Focus reporting mode constants. -const ( - ReportFocusMode = DECMode(1004) //nolint:revive // grouped constants - - EnableReportFocus = "\x1b[?1004h" - DisableReportFocus = "\x1b[?1004l" - RequestReportFocus = "\x1b[?1004$p" + SetModeFocusEvent = "\x1b[?1004h" + ResetModeFocusEvent = "\x1b[?1004l" + RequestModeFocusEvent = "\x1b[?1004$p" ) // SGR Extended Mouse Mode is a mode that changes the mouse tracking encoding @@ -589,24 +512,15 @@ const ( // // CSI < Cb ; Cx ; Cy M // -// Where Cb is the same as [NormalMouseMode], and Cx and Cy are the x and y. +// Where Cb is the same as [ModeMouseNormal], and Cx and Cy are the x and y. // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - SgrExtMouseMode = DECMode(1006) + ModeMouseExtSgr = DECMode(1006) - SetSgrExtMouseMode = "\x1b[?1006h" - ResetSgrExtMouseMode = "\x1b[?1006l" - RequestSgrExtMouseMode = "\x1b[?1006$p" -) - -// Deprecated: use [SgrExtMouseMode] [SetSgrExtMouseMode], -// [ResetSgrExtMouseMode], and [RequestSgrExtMouseMode] instead. -const ( - MouseSgrExtMode = DECMode(1006) //nolint:revive // grouped constants - EnableMouseSgrExt = "\x1b[?1006h" - DisableMouseSgrExt = "\x1b[?1006l" - RequestMouseSgrExt = "\x1b[?1006$p" + SetModeMouseExtSgr = "\x1b[?1006h" + ResetModeMouseExtSgr = "\x1b[?1006l" + RequestModeMouseExtSgr = "\x1b[?1006$p" ) // UTF-8 Extended Mouse Mode is a mode that changes the mouse tracking encoding @@ -614,11 +528,11 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - Utf8ExtMouseMode = DECMode(1005) + ModeMouseExtUtf8 = DECMode(1005) - SetUtf8ExtMouseMode = "\x1b[?1005h" - ResetUtf8ExtMouseMode = "\x1b[?1005l" - RequestUtf8ExtMouseMode = "\x1b[?1005$p" + SetModeMouseExtUtf8 = "\x1b[?1005h" + ResetModeMouseExtUtf8 = "\x1b[?1005l" + RequestModeMouseExtUtf8 = "\x1b[?1005$p" ) // URXVT Extended Mouse Mode is a mode that changes the mouse tracking encoding @@ -626,25 +540,25 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - UrxvtExtMouseMode = DECMode(1015) + ModeMouseExtUrxvt = DECMode(1015) - SetUrxvtExtMouseMode = "\x1b[?1015h" - ResetUrxvtExtMouseMode = "\x1b[?1015l" - RequestUrxvtExtMouseMode = "\x1b[?1015$p" + SetModeMouseExtUrxvt = "\x1b[?1015h" + ResetModeMouseExtUrxvt = "\x1b[?1015l" + RequestModeMouseExtUrxvt = "\x1b[?1015$p" ) // SGR Pixel Extended Mouse Mode is a mode that changes the mouse tracking // encoding to use SGR parameters with pixel coordinates. // -// This is similar to [SgrExtMouseMode], but also reports pixel coordinates. +// This is similar to [ModeMouseExtSgr], but also reports pixel coordinates. // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking const ( - SgrPixelExtMouseMode = DECMode(1016) + ModeMouseExtSgrPixel = DECMode(1016) - SetSgrPixelExtMouseMode = "\x1b[?1016h" - ResetSgrPixelExtMouseMode = "\x1b[?1016l" - RequestSgrPixelExtMouseMode = "\x1b[?1016$p" + SetModeMouseExtSgrPixel = "\x1b[?1016h" + ResetModeMouseExtSgrPixel = "\x1b[?1016l" + RequestModeMouseExtSgrPixel = "\x1b[?1016$p" ) // Alternate Screen Mode is a mode that determines whether the alternate screen @@ -653,11 +567,11 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer const ( - AltScreenMode = DECMode(1047) + ModeAltScreen = DECMode(1047) - SetAltScreenMode = "\x1b[?1047h" - ResetAltScreenMode = "\x1b[?1047l" - RequestAltScreenMode = "\x1b[?1047$p" + SetModeAltScreen = "\x1b[?1047h" + ResetModeAltScreen = "\x1b[?1047l" + RequestModeAltScreen = "\x1b[?1047$p" ) // Save Cursor Mode is a mode that saves the cursor position. @@ -665,42 +579,24 @@ const ( // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer const ( - SaveCursorMode = DECMode(1048) + ModeSaveCursor = DECMode(1048) - SetSaveCursorMode = "\x1b[?1048h" - ResetSaveCursorMode = "\x1b[?1048l" - RequestSaveCursorMode = "\x1b[?1048$p" + SetModeSaveCursor = "\x1b[?1048h" + ResetModeSaveCursor = "\x1b[?1048l" + RequestModeSaveCursor = "\x1b[?1048$p" ) // Alternate Screen Save Cursor Mode is a mode that saves the cursor position as in -// [SaveCursorMode], switches to the alternate screen buffer as in [AltScreenMode], +// [ModeSaveCursor], switches to the alternate screen buffer as in [ModeAltScreen], // and clears the screen on switch. // // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer const ( - AltScreenSaveCursorMode = DECMode(1049) + ModeAltScreenSaveCursor = DECMode(1049) - SetAltScreenSaveCursorMode = "\x1b[?1049h" - ResetAltScreenSaveCursorMode = "\x1b[?1049l" - RequestAltScreenSaveCursorMode = "\x1b[?1049$p" -) - -// Alternate Screen Buffer is a mode that determines whether the alternate screen -// buffer is active. -// -// See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer -// -// Deprecated: use [AltScreenSaveCursorMode] instead. -const ( - AltScreenBufferMode = DECMode(1049) - - SetAltScreenBufferMode = "\x1b[?1049h" - ResetAltScreenBufferMode = "\x1b[?1049l" - RequestAltScreenBufferMode = "\x1b[?1049$p" - - EnableAltScreenBuffer = "\x1b[?1049h" - DisableAltScreenBuffer = "\x1b[?1049l" - RequestAltScreenBuffer = "\x1b[?1049$p" + SetModeAltScreenSaveCursor = "\x1b[?1049h" + ResetModeAltScreenSaveCursor = "\x1b[?1049l" + RequestModeAltScreenSaveCursor = "\x1b[?1049$p" ) // Bracketed Paste Mode is a mode that determines whether pasted text is @@ -709,19 +605,11 @@ const ( // See: https://cirw.in/blog/bracketed-paste // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Bracketed-Paste-Mode const ( - BracketedPasteMode = DECMode(2004) - - SetBracketedPasteMode = "\x1b[?2004h" - ResetBracketedPasteMode = "\x1b[?2004l" - RequestBracketedPasteMode = "\x1b[?2004$p" -) + ModeBracketedPaste = DECMode(2004) -// Deprecated: use [SetBracketedPasteMode], [ResetBracketedPasteMode], and -// [RequestBracketedPasteMode] instead. -const ( - EnableBracketedPaste = "\x1b[?2004h" //nolint:revive // grouped constants - DisableBracketedPaste = "\x1b[?2004l" - RequestBracketedPaste = "\x1b[?2004$p" + SetModeBracketedPaste = "\x1b[?2004h" + ResetModeBracketedPaste = "\x1b[?2004l" + RequestModeBracketedPaste = "\x1b[?2004$p" ) // Synchronized Output Mode is a mode that determines whether output is @@ -729,23 +617,11 @@ const ( // // See: https://gist.github.com/christianparpart/d8a62cc1ab659194337d73e399004036 const ( - SynchronizedOutputMode = DECMode(2026) + ModeSynchronizedOutput = DECMode(2026) - SetSynchronizedOutputMode = "\x1b[?2026h" - ResetSynchronizedOutputMode = "\x1b[?2026l" - RequestSynchronizedOutputMode = "\x1b[?2026$p" -) - -// Synchronized Output Mode. See [SynchronizedOutputMode]. -// -// Deprecated: use [SynchronizedOutputMode], [SetSynchronizedOutputMode], and -// [ResetSynchronizedOutputMode], and [RequestSynchronizedOutputMode] instead. -const ( - SyncdOutputMode = DECMode(2026) - - EnableSyncdOutput = "\x1b[?2026h" - DisableSyncdOutput = "\x1b[?2026l" - RequestSyncdOutput = "\x1b[?2026$p" + SetModeSynchronizedOutput = "\x1b[?2026h" + ResetModeSynchronizedOutput = "\x1b[?2026l" + RequestModeSynchronizedOutput = "\x1b[?2026$p" ) // Unicode Core Mode is a mode that determines whether the terminal should use @@ -754,41 +630,16 @@ const ( // // See: https://github.com/contour-terminal/terminal-unicode-core const ( - UnicodeCoreMode = DECMode(2027) + ModeUnicodeCore = DECMode(2027) - SetUnicodeCoreMode = "\x1b[?2027h" - ResetUnicodeCoreMode = "\x1b[?2027l" - RequestUnicodeCoreMode = "\x1b[?2027$p" + SetModeUnicodeCore = "\x1b[?2027h" + ResetModeUnicodeCore = "\x1b[?2027l" + RequestModeUnicodeCore = "\x1b[?2027$p" ) -// Grapheme Clustering Mode is a mode that determines whether the terminal -// should look for grapheme clusters instead of single runes in the rendered -// text. This makes the terminal properly render combining characters such as -// emojis. // -// See: https://github.com/contour-terminal/terminal-unicode-core -// -// Deprecated: use [GraphemeClusteringMode], [SetUnicodeCoreMode], -// [ResetUnicodeCoreMode], and [RequestUnicodeCoreMode] instead. -const ( - GraphemeClusteringMode = DECMode(2027) - SetGraphemeClusteringMode = "\x1b[?2027h" - ResetGraphemeClusteringMode = "\x1b[?2027l" - RequestGraphemeClusteringMode = "\x1b[?2027$p" -) - -// Grapheme Clustering Mode. See [GraphemeClusteringMode]. -// -// Deprecated: use [SetUnicodeCoreMode], [ResetUnicodeCoreMode], and -// [RequestUnicodeCoreMode] instead. -const ( - EnableGraphemeClustering = "\x1b[?2027h" - DisableGraphemeClustering = "\x1b[?2027l" - RequestGraphemeClustering = "\x1b[?2027$p" -) - -// LightDarkMode is a mode that enables reporting the operating system's color +// ModeLightDark is a mode that enables reporting the operating system's color // scheme (light or dark) preference. It reports the color scheme as a [DSR] // and [LightDarkReport] escape sequences encoded as follows: // @@ -802,14 +653,14 @@ const ( // // See: https://contour-terminal.org/vt-extensions/color-palette-update-notifications/ const ( - LightDarkMode = DECMode(2031) + ModeLightDark = DECMode(2031) - SetLightDarkMode = "\x1b[?2031h" - ResetLightDarkMode = "\x1b[?2031l" - RequestLightDarkMode = "\x1b[?2031$p" + SetModeLightDark = "\x1b[?2031h" + ResetModeLightDark = "\x1b[?2031l" + RequestModeLightDark = "\x1b[?2031$p" ) -// InBandResizeMode is a mode that reports terminal resize events as escape +// ModeInBandResize is a mode that reports terminal resize events as escape // sequences. This is useful for systems that do not support [SIGWINCH] like // Windows. // @@ -819,11 +670,11 @@ const ( // // See: https://gist.github.com/rockorager/e695fb2924d36b2bcf1fff4a3704bd83 const ( - InBandResizeMode = DECMode(2048) + ModeInBandResize = DECMode(2048) - SetInBandResizeMode = "\x1b[?2048h" - ResetInBandResizeMode = "\x1b[?2048l" - RequestInBandResizeMode = "\x1b[?2048$p" + SetModeInBandResize = "\x1b[?2048h" + ResetModeInBandResize = "\x1b[?2048l" + RequestModeInBandResize = "\x1b[?2048$p" ) // Win32Input is a mode that determines whether input is processed by the @@ -831,17 +682,9 @@ const ( // // See: https://github.com/microsoft/terminal/blob/main/doc/specs/%234999%20-%20Improved%20keyboard%20handling%20in%20Conpty.md const ( - Win32InputMode = DECMode(9001) - - SetWin32InputMode = "\x1b[?9001h" - ResetWin32InputMode = "\x1b[?9001l" - RequestWin32InputMode = "\x1b[?9001$p" -) + ModeWin32Input = DECMode(9001) -// Deprecated: use [SetWin32InputMode], [ResetWin32InputMode], and -// [RequestWin32InputMode] instead. -const ( - EnableWin32Input = "\x1b[?9001h" //nolint:revive // grouped constants - DisableWin32Input = "\x1b[?9001l" - RequestWin32Input = "\x1b[?9001$p" + SetModeWin32Input = "\x1b[?9001h" + ResetModeWin32Input = "\x1b[?9001l" + RequestModeWin32Input = "\x1b[?9001$p" ) diff --git a/vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go b/vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go new file mode 100644 index 0000000000..323d5fb53b --- /dev/null +++ b/vendor/github.com/charmbracelet/x/ansi/mode_deprecated.go @@ -0,0 +1,495 @@ +package ansi + +// Keyboard Action Mode (KAM) controls locking of the keyboard. +// +// Deprecated: use [ModeKeyboardAction] instead. +const ( + KeyboardActionMode = ANSIMode(2) + + SetKeyboardActionMode = "\x1b[2h" + ResetKeyboardActionMode = "\x1b[2l" + RequestKeyboardActionMode = "\x1b[2$p" +) + +// Insert/Replace Mode (IRM) determines whether characters are inserted or replaced. +// +// Deprecated: use [ModeInsertReplace] instead. +const ( + InsertReplaceMode = ANSIMode(4) + + SetInsertReplaceMode = "\x1b[4h" + ResetInsertReplaceMode = "\x1b[4l" + RequestInsertReplaceMode = "\x1b[4$p" +) + +// BiDirectional Support Mode (BDSM) determines whether the terminal supports bidirectional text. +// +// Deprecated: use [ModeBiDirectionalSupport] instead. +const ( + BiDirectionalSupportMode = ANSIMode(8) + + SetBiDirectionalSupportMode = "\x1b[8h" + ResetBiDirectionalSupportMode = "\x1b[8l" + RequestBiDirectionalSupportMode = "\x1b[8$p" +) + +// Send Receive Mode (SRM) or Local Echo Mode determines whether the terminal echoes characters. +// +// Deprecated: use [ModeSendReceive] instead. +const ( + SendReceiveMode = ANSIMode(12) + LocalEchoMode = SendReceiveMode + + SetSendReceiveMode = "\x1b[12h" + ResetSendReceiveMode = "\x1b[12l" + RequestSendReceiveMode = "\x1b[12$p" + + SetLocalEchoMode = "\x1b[12h" + ResetLocalEchoMode = "\x1b[12l" + RequestLocalEchoMode = "\x1b[12$p" +) + +// Line Feed/New Line Mode (LNM) determines whether the terminal interprets line feed as new line. +// +// Deprecated: use [ModeLineFeedNewLine] instead. +const ( + LineFeedNewLineMode = ANSIMode(20) + + SetLineFeedNewLineMode = "\x1b[20h" + ResetLineFeedNewLineMode = "\x1b[20l" + RequestLineFeedNewLineMode = "\x1b[20$p" +) + +// Cursor Keys Mode (DECCKM) determines whether cursor keys send ANSI or application sequences. +// +// Deprecated: use [ModeCursorKeys] instead. +const ( + CursorKeysMode = DECMode(1) + + SetCursorKeysMode = "\x1b[?1h" + ResetCursorKeysMode = "\x1b[?1l" + RequestCursorKeysMode = "\x1b[?1$p" +) + +// Cursor Keys mode. +// +// Deprecated: use [SetModeCursorKeys] and [ResetModeCursorKeys] instead. +const ( + EnableCursorKeys = "\x1b[?1h" + DisableCursorKeys = "\x1b[?1l" +) + +// Origin Mode (DECOM) determines whether the cursor moves to home or margin position. +// +// Deprecated: use [ModeOrigin] instead. +const ( + OriginMode = DECMode(6) + + SetOriginMode = "\x1b[?6h" + ResetOriginMode = "\x1b[?6l" + RequestOriginMode = "\x1b[?6$p" +) + +// Auto Wrap Mode (DECAWM) determines whether the cursor wraps to the next line. +// +// Deprecated: use [ModeAutoWrap] instead. +const ( + AutoWrapMode = DECMode(7) + + SetAutoWrapMode = "\x1b[?7h" + ResetAutoWrapMode = "\x1b[?7l" + RequestAutoWrapMode = "\x1b[?7$p" +) + +// X10 Mouse Mode determines whether the mouse reports on button presses. +// +// Deprecated: use [ModeMouseX10] instead. +const ( + X10MouseMode = DECMode(9) + + SetX10MouseMode = "\x1b[?9h" + ResetX10MouseMode = "\x1b[?9l" + RequestX10MouseMode = "\x1b[?9$p" +) + +// Text Cursor Enable Mode (DECTCEM) shows/hides the cursor. +// +// Deprecated: use [ModeTextCursorEnable] instead. +const ( + TextCursorEnableMode = DECMode(25) + + SetTextCursorEnableMode = "\x1b[?25h" + ResetTextCursorEnableMode = "\x1b[?25l" + RequestTextCursorEnableMode = "\x1b[?25$p" +) + +// Text Cursor Enable mode. +// +// Deprecated: use [SetModeTextCursorEnable] and [ResetModeTextCursorEnable] instead. +const ( + CursorEnableMode = DECMode(25) + RequestCursorVisibility = "\x1b[?25$p" +) + +// Numeric Keypad Mode (DECNKM) determines whether the keypad sends application or numeric sequences. +// +// Deprecated: use [ModeNumericKeypad] instead. +const ( + NumericKeypadMode = DECMode(66) + + SetNumericKeypadMode = "\x1b[?66h" + ResetNumericKeypadMode = "\x1b[?66l" + RequestNumericKeypadMode = "\x1b[?66$p" +) + +// Backarrow Key Mode (DECBKM) determines whether the backspace key sends backspace or delete. +// +// Deprecated: use [ModeBackarrowKey] instead. +const ( + BackarrowKeyMode = DECMode(67) + + SetBackarrowKeyMode = "\x1b[?67h" + ResetBackarrowKeyMode = "\x1b[?67l" + RequestBackarrowKeyMode = "\x1b[?67$p" +) + +// Left Right Margin Mode (DECLRMM) determines whether left and right margins can be set. +// +// Deprecated: use [ModeLeftRightMargin] instead. +const ( + LeftRightMarginMode = DECMode(69) + + SetLeftRightMarginMode = "\x1b[?69h" + ResetLeftRightMarginMode = "\x1b[?69l" + RequestLeftRightMarginMode = "\x1b[?69$p" +) + +// Normal Mouse Mode determines whether the mouse reports on button presses and releases. +// +// Deprecated: use [ModeMouseNormal] instead. +const ( + NormalMouseMode = DECMode(1000) + + SetNormalMouseMode = "\x1b[?1000h" + ResetNormalMouseMode = "\x1b[?1000l" + RequestNormalMouseMode = "\x1b[?1000$p" +) + +// VT Mouse Tracking mode. +// +// Deprecated: use [ModeMouseNormal] instead. +const ( + MouseMode = DECMode(1000) + + EnableMouse = "\x1b[?1000h" + DisableMouse = "\x1b[?1000l" + RequestMouse = "\x1b[?1000$p" +) + +// Highlight Mouse Tracking determines whether the mouse reports on button presses and highlighted cells. +// +// Deprecated: use [ModeMouseHighlight] instead. +const ( + HighlightMouseMode = DECMode(1001) + + SetHighlightMouseMode = "\x1b[?1001h" + ResetHighlightMouseMode = "\x1b[?1001l" + RequestHighlightMouseMode = "\x1b[?1001$p" +) + +// VT Hilite Mouse Tracking mode. +// +// Deprecated: use [ModeMouseHighlight] instead. +const ( + MouseHiliteMode = DECMode(1001) + + EnableMouseHilite = "\x1b[?1001h" + DisableMouseHilite = "\x1b[?1001l" + RequestMouseHilite = "\x1b[?1001$p" +) + +// Button Event Mouse Tracking reports button-motion events when a button is pressed. +// +// Deprecated: use [ModeMouseButtonEvent] instead. +const ( + ButtonEventMouseMode = DECMode(1002) + + SetButtonEventMouseMode = "\x1b[?1002h" + ResetButtonEventMouseMode = "\x1b[?1002l" + RequestButtonEventMouseMode = "\x1b[?1002$p" +) + +// Cell Motion Mouse Tracking mode. +// +// Deprecated: use [ModeMouseButtonEvent] instead. +const ( + MouseCellMotionMode = DECMode(1002) + + EnableMouseCellMotion = "\x1b[?1002h" + DisableMouseCellMotion = "\x1b[?1002l" + RequestMouseCellMotion = "\x1b[?1002$p" +) + +// Any Event Mouse Tracking reports all motion events. +// +// Deprecated: use [ModeMouseAnyEvent] instead. +const ( + AnyEventMouseMode = DECMode(1003) + + SetAnyEventMouseMode = "\x1b[?1003h" + ResetAnyEventMouseMode = "\x1b[?1003l" + RequestAnyEventMouseMode = "\x1b[?1003$p" +) + +// All Mouse Tracking mode. +// +// Deprecated: use [ModeMouseAnyEvent] instead. +const ( + MouseAllMotionMode = DECMode(1003) + + EnableMouseAllMotion = "\x1b[?1003h" + DisableMouseAllMotion = "\x1b[?1003l" + RequestMouseAllMotion = "\x1b[?1003$p" +) + +// Focus Event Mode determines whether the terminal reports focus and blur events. +// +// Deprecated: use [ModeFocusEvent] instead. +const ( + FocusEventMode = DECMode(1004) + + SetFocusEventMode = "\x1b[?1004h" + ResetFocusEventMode = "\x1b[?1004l" + RequestFocusEventMode = "\x1b[?1004$p" +) + +// Focus reporting mode. +// +// Deprecated: use [SetModeFocusEvent], [ResetModeFocusEvent], and +// [RequestModeFocusEvent] instead. +const ( + ReportFocusMode = DECMode(1004) + + EnableReportFocus = "\x1b[?1004h" + DisableReportFocus = "\x1b[?1004l" + RequestReportFocus = "\x1b[?1004$p" +) + +// UTF-8 Extended Mouse Mode changes the mouse tracking encoding to use UTF-8 parameters. +// +// Deprecated: use [ModeMouseExtUtf8] instead. +const ( + Utf8ExtMouseMode = DECMode(1005) + + SetUtf8ExtMouseMode = "\x1b[?1005h" + ResetUtf8ExtMouseMode = "\x1b[?1005l" + RequestUtf8ExtMouseMode = "\x1b[?1005$p" +) + +// SGR Extended Mouse Mode changes the mouse tracking encoding to use SGR parameters. +// +// Deprecated: use [ModeMouseExtSgr] instead. +const ( + SgrExtMouseMode = DECMode(1006) + + SetSgrExtMouseMode = "\x1b[?1006h" + ResetSgrExtMouseMode = "\x1b[?1006l" + RequestSgrExtMouseMode = "\x1b[?1006$p" +) + +// Mouse SGR Extended mode. +// +// Deprecated: use [ModeMouseExtSgr], [SetModeMouseExtSgr], +// [ResetModeMouseExtSgr], and [RequestModeMouseExtSgr] instead. +const ( + MouseSgrExtMode = DECMode(1006) + EnableMouseSgrExt = "\x1b[?1006h" + DisableMouseSgrExt = "\x1b[?1006l" + RequestMouseSgrExt = "\x1b[?1006$p" +) + +// URXVT Extended Mouse Mode changes the mouse tracking encoding to use an alternate encoding. +// +// Deprecated: use [ModeMouseUrxvtExt] instead. +const ( + UrxvtExtMouseMode = DECMode(1015) + + SetUrxvtExtMouseMode = "\x1b[?1015h" + ResetUrxvtExtMouseMode = "\x1b[?1015l" + RequestUrxvtExtMouseMode = "\x1b[?1015$p" +) + +// SGR Pixel Extended Mouse Mode changes the mouse tracking encoding to use SGR parameters with pixel coordinates. +// +// Deprecated: use [ModeMouseExtSgrPixel] instead. +const ( + SgrPixelExtMouseMode = DECMode(1016) + + SetSgrPixelExtMouseMode = "\x1b[?1016h" + ResetSgrPixelExtMouseMode = "\x1b[?1016l" + RequestSgrPixelExtMouseMode = "\x1b[?1016$p" +) + +// Alternate Screen Mode determines whether the alternate screen buffer is active. +// +// Deprecated: use [ModeAltScreen] instead. +const ( + AltScreenMode = DECMode(1047) + + SetAltScreenMode = "\x1b[?1047h" + ResetAltScreenMode = "\x1b[?1047l" + RequestAltScreenMode = "\x1b[?1047$p" +) + +// Save Cursor Mode saves the cursor position. +// +// Deprecated: use [ModeSaveCursor] instead. +const ( + SaveCursorMode = DECMode(1048) + + SetSaveCursorMode = "\x1b[?1048h" + ResetSaveCursorMode = "\x1b[?1048l" + RequestSaveCursorMode = "\x1b[?1048$p" +) + +// Alternate Screen Save Cursor Mode saves the cursor position and switches to alternate screen. +// +// Deprecated: use [ModeAltScreenSaveCursor] instead. +const ( + AltScreenSaveCursorMode = DECMode(1049) + + SetAltScreenSaveCursorMode = "\x1b[?1049h" + ResetAltScreenSaveCursorMode = "\x1b[?1049l" + RequestAltScreenSaveCursorMode = "\x1b[?1049$p" +) + +// Alternate Screen Buffer mode. +// +// Deprecated: use [ModeAltScreenSaveCursor] instead. +const ( + AltScreenBufferMode = DECMode(1049) + + SetAltScreenBufferMode = "\x1b[?1049h" + ResetAltScreenBufferMode = "\x1b[?1049l" + RequestAltScreenBufferMode = "\x1b[?1049$p" + + EnableAltScreenBuffer = "\x1b[?1049h" + DisableAltScreenBuffer = "\x1b[?1049l" + RequestAltScreenBuffer = "\x1b[?1049$p" +) + +// Bracketed Paste Mode determines whether pasted text is bracketed with escape sequences. +// +// Deprecated: use [ModeBracketedPaste] instead. +const ( + BracketedPasteMode = DECMode(2004) + + SetBracketedPasteMode = "\x1b[?2004h" + ResetBracketedPasteMode = "\x1b[?2004l" + RequestBracketedPasteMode = "\x1b[?2004$p" +) + +// Deprecated: use [SetModeBracketedPaste], [ResetModeBracketedPaste], and +// [RequestModeBracketedPaste] instead. +const ( + EnableBracketedPaste = "\x1b[?2004h" //nolint:revive + DisableBracketedPaste = "\x1b[?2004l" + RequestBracketedPaste = "\x1b[?2004$p" +) + +// Synchronized Output Mode determines whether output is synchronized with the terminal. +// +// Deprecated: use [ModeSynchronizedOutput] instead. +const ( + SynchronizedOutputMode = DECMode(2026) + + SetSynchronizedOutputMode = "\x1b[?2026h" + ResetSynchronizedOutputMode = "\x1b[?2026l" + RequestSynchronizedOutputMode = "\x1b[?2026$p" +) + +// Synchronized output mode. +// +// Deprecated: use [ModeSynchronizedOutput], [SetModeSynchronizedOutput], +// [ResetModeSynchronizedOutput], and [RequestModeSynchronizedOutput] instead. +const ( + SyncdOutputMode = DECMode(2026) + + EnableSyncdOutput = "\x1b[?2026h" + DisableSyncdOutput = "\x1b[?2026l" + RequestSyncdOutput = "\x1b[?2026$p" +) + +// Unicode Core Mode determines whether the terminal uses Unicode grapheme clustering. +// +// Deprecated: use [ModeUnicodeCore] instead. +const ( + UnicodeCoreMode = DECMode(2027) + + SetUnicodeCoreMode = "\x1b[?2027h" + ResetUnicodeCoreMode = "\x1b[?2027l" + RequestUnicodeCoreMode = "\x1b[?2027$p" +) + +// Grapheme Clustering Mode determines whether the terminal looks for grapheme clusters. +// +// Deprecated: use [ModeUnicodeCore], [SetModeUnicodeCore], +// [ResetModeUnicodeCore], and [RequestModeUnicodeCore] instead. +const ( + GraphemeClusteringMode = DECMode(2027) + + SetGraphemeClusteringMode = "\x1b[?2027h" + ResetGraphemeClusteringMode = "\x1b[?2027l" + RequestGraphemeClusteringMode = "\x1b[?2027$p" +) + +// Unicode Core mode. +// +// Deprecated: use [SetModeUnicodeCore], [ResetModeUnicodeCore], and +// [RequestModeUnicodeCore] instead. +const ( + EnableGraphemeClustering = "\x1b[?2027h" + DisableGraphemeClustering = "\x1b[?2027l" + RequestGraphemeClustering = "\x1b[?2027$p" +) + +// Light Dark Mode enables reporting the operating system's color scheme preference. +// +// Deprecated: use [ModeLightDark] instead. +const ( + LightDarkMode = DECMode(2031) + + SetLightDarkMode = "\x1b[?2031h" + ResetLightDarkMode = "\x1b[?2031l" + RequestLightDarkMode = "\x1b[?2031$p" +) + +// In Band Resize Mode reports terminal resize events as escape sequences. +// +// Deprecated: use [ModeInBandResize] instead. +const ( + InBandResizeMode = DECMode(2048) + + SetInBandResizeMode = "\x1b[?2048h" + ResetInBandResizeMode = "\x1b[?2048l" + RequestInBandResizeMode = "\x1b[?2048$p" +) + +// Win32Input determines whether input is processed by the Win32 console and Conpty. +// +// Deprecated: use [ModeWin32Input] instead. +const ( + Win32InputMode = DECMode(9001) + + SetWin32InputMode = "\x1b[?9001h" + ResetWin32InputMode = "\x1b[?9001l" + RequestWin32InputMode = "\x1b[?9001$p" +) + +// Deprecated: use [SetModeWin32Input], [ResetModeWin32Input], and +// [RequestModeWin32Input] instead. +const ( + EnableWin32Input = "\x1b[?9001h" //nolint:revive + DisableWin32Input = "\x1b[?9001l" + RequestWin32Input = "\x1b[?9001$p" +) diff --git a/vendor/github.com/charmbracelet/x/ansi/mouse.go b/vendor/github.com/charmbracelet/x/ansi/mouse.go index 0e4776bb23..94b8b48588 100644 --- a/vendor/github.com/charmbracelet/x/ansi/mouse.go +++ b/vendor/github.com/charmbracelet/x/ansi/mouse.go @@ -134,7 +134,7 @@ func EncodeMouseButton(b MouseButton, motion, shift, alt, ctrl bool) (m byte) { m |= bitMotion } - return //nolint:nakedret + return m } // x10Offset is the offset for X10 mouse events. diff --git a/vendor/github.com/charmbracelet/x/ansi/notification.go b/vendor/github.com/charmbracelet/x/ansi/notification.go index c712f34059..fd6221d24d 100644 --- a/vendor/github.com/charmbracelet/x/ansi/notification.go +++ b/vendor/github.com/charmbracelet/x/ansi/notification.go @@ -1,5 +1,10 @@ package ansi +import ( + "fmt" + "strings" +) + // Notify sends a desktop notification using iTerm's OSC 9. // // OSC 9 ; Mc ST @@ -11,3 +16,17 @@ package ansi func Notify(s string) string { return "\x1b]9;" + s + "\x07" } + +// DesktopNotification sends a desktop notification based on the extensible OSC +// 99 escape code. +// +// OSC 99 ; ; ST +// OSC 99 ; ; BEL +// +// Where is a colon-separated list of key-value pairs, and +// is the notification body. +// +// See: https://sw.kovidgoyal.net/kitty/desktop-notifications/ +func DesktopNotification(payload string, metadata ...string) string { + return fmt.Sprintf("\x1b]99;%s;%s\x07", strings.Join(metadata, ":"), payload) +} diff --git a/vendor/github.com/charmbracelet/x/ansi/parser_decode.go b/vendor/github.com/charmbracelet/x/ansi/parser_decode.go index dfd2dc7613..096c86354e 100644 --- a/vendor/github.com/charmbracelet/x/ansi/parser_decode.go +++ b/vendor/github.com/charmbracelet/x/ansi/parser_decode.go @@ -4,8 +4,9 @@ import ( "unicode/utf8" "github.com/charmbracelet/x/ansi/parser" + "github.com/clipperhouse/displaywidth" + "github.com/clipperhouse/uax29/v2/graphemes" "github.com/mattn/go-runewidth" - "github.com/rivo/uniseg" ) // State represents the state of the ANSI escape sequence parser used by @@ -176,10 +177,7 @@ func decodeSequence[T string | []byte](m Method, b T, state State, p *Parser) (s } if utf8.RuneStart(c) { - seq, _, width, _ = FirstGraphemeCluster(b, -1) - if m == WcWidth { - width = runewidth.StringWidth(string(seq)) - } + seq, width = FirstGraphemeCluster(b, m) i += len(seq) return b[:i], width, i, NormalState } @@ -434,17 +432,22 @@ func HasEscPrefix[T string | []byte](b T) bool { return len(b) > 0 && b[0] == ESC } -// FirstGraphemeCluster returns the first grapheme cluster in the given string or byte slice. -// This is a syntactic sugar function that wraps -// uniseg.FirstGraphemeClusterInString and uniseg.FirstGraphemeCluster. -func FirstGraphemeCluster[T string | []byte](b T, state int) (T, T, int, int) { +// FirstGraphemeCluster returns the first grapheme cluster in the given string +// or byte slice, and its monospace display width. +func FirstGraphemeCluster[T string | []byte](b T, m Method) (T, int) { switch b := any(b).(type) { case string: - cluster, rest, width, newState := uniseg.FirstGraphemeClusterInString(b, state) - return T(cluster), T(rest), width, newState + cluster := graphemes.FromString(b).First() + if m == WcWidth { + return T(cluster), runewidth.StringWidth(cluster) + } + return T(cluster), displaywidth.String(cluster) case []byte: - cluster, rest, width, newState := uniseg.FirstGraphemeCluster(b, state) - return T(cluster), T(rest), width, newState + cluster := graphemes.FromBytes(b).First() + if m == WcWidth { + return T(cluster), runewidth.StringWidth(string(cluster)) + } + return T(cluster), displaywidth.Bytes(cluster) } panic("unreachable") } @@ -490,7 +493,7 @@ func Command(prefix, inter, final byte) (c int) { c = int(final) c |= int(prefix) << parser.PrefixShift c |= int(inter) << parser.IntermedShift - return + return c } // Param represents a sequence parameter. Sequence parameters with @@ -520,5 +523,5 @@ func Parameter(p int, hasMore bool) (s int) { if hasMore { s |= parser.HasMoreFlag } - return + return s } diff --git a/vendor/github.com/charmbracelet/x/ansi/sgr.go b/vendor/github.com/charmbracelet/x/ansi/sgr.go index 5e6d05dfe4..b3481a9aaf 100644 --- a/vendor/github.com/charmbracelet/x/ansi/sgr.go +++ b/vendor/github.com/charmbracelet/x/ansi/sgr.go @@ -21,59 +21,59 @@ func SGR(ps ...Attr) string { } var attrStrings = map[int]string{ - ResetAttr: resetAttr, - BoldAttr: boldAttr, - FaintAttr: faintAttr, - ItalicAttr: italicAttr, - UnderlineAttr: underlineAttr, - SlowBlinkAttr: slowBlinkAttr, - RapidBlinkAttr: rapidBlinkAttr, - ReverseAttr: reverseAttr, - ConcealAttr: concealAttr, - StrikethroughAttr: strikethroughAttr, - NormalIntensityAttr: normalIntensityAttr, - NoItalicAttr: noItalicAttr, - NoUnderlineAttr: noUnderlineAttr, - NoBlinkAttr: noBlinkAttr, - NoReverseAttr: noReverseAttr, - NoConcealAttr: noConcealAttr, - NoStrikethroughAttr: noStrikethroughAttr, - BlackForegroundColorAttr: blackForegroundColorAttr, - RedForegroundColorAttr: redForegroundColorAttr, - GreenForegroundColorAttr: greenForegroundColorAttr, - YellowForegroundColorAttr: yellowForegroundColorAttr, - BlueForegroundColorAttr: blueForegroundColorAttr, - MagentaForegroundColorAttr: magentaForegroundColorAttr, - CyanForegroundColorAttr: cyanForegroundColorAttr, - WhiteForegroundColorAttr: whiteForegroundColorAttr, - ExtendedForegroundColorAttr: extendedForegroundColorAttr, - DefaultForegroundColorAttr: defaultForegroundColorAttr, - BlackBackgroundColorAttr: blackBackgroundColorAttr, - RedBackgroundColorAttr: redBackgroundColorAttr, - GreenBackgroundColorAttr: greenBackgroundColorAttr, - YellowBackgroundColorAttr: yellowBackgroundColorAttr, - BlueBackgroundColorAttr: blueBackgroundColorAttr, - MagentaBackgroundColorAttr: magentaBackgroundColorAttr, - CyanBackgroundColorAttr: cyanBackgroundColorAttr, - WhiteBackgroundColorAttr: whiteBackgroundColorAttr, - ExtendedBackgroundColorAttr: extendedBackgroundColorAttr, - DefaultBackgroundColorAttr: defaultBackgroundColorAttr, - ExtendedUnderlineColorAttr: extendedUnderlineColorAttr, - DefaultUnderlineColorAttr: defaultUnderlineColorAttr, - BrightBlackForegroundColorAttr: brightBlackForegroundColorAttr, - BrightRedForegroundColorAttr: brightRedForegroundColorAttr, - BrightGreenForegroundColorAttr: brightGreenForegroundColorAttr, - BrightYellowForegroundColorAttr: brightYellowForegroundColorAttr, - BrightBlueForegroundColorAttr: brightBlueForegroundColorAttr, - BrightMagentaForegroundColorAttr: brightMagentaForegroundColorAttr, - BrightCyanForegroundColorAttr: brightCyanForegroundColorAttr, - BrightWhiteForegroundColorAttr: brightWhiteForegroundColorAttr, - BrightBlackBackgroundColorAttr: brightBlackBackgroundColorAttr, - BrightRedBackgroundColorAttr: brightRedBackgroundColorAttr, - BrightGreenBackgroundColorAttr: brightGreenBackgroundColorAttr, - BrightYellowBackgroundColorAttr: brightYellowBackgroundColorAttr, - BrightBlueBackgroundColorAttr: brightBlueBackgroundColorAttr, - BrightMagentaBackgroundColorAttr: brightMagentaBackgroundColorAttr, - BrightCyanBackgroundColorAttr: brightCyanBackgroundColorAttr, - BrightWhiteBackgroundColorAttr: brightWhiteBackgroundColorAttr, + AttrReset: attrReset, + AttrBold: attrBold, + AttrFaint: attrFaint, + AttrItalic: attrItalic, + AttrUnderline: attrUnderline, + AttrBlink: attrBlink, + AttrRapidBlink: attrRapidBlink, + AttrReverse: attrReverse, + AttrConceal: attrConceal, + AttrStrikethrough: attrStrikethrough, + AttrNormalIntensity: attrNormalIntensity, + AttrNoItalic: attrNoItalic, + AttrNoUnderline: attrNoUnderline, + AttrNoBlink: attrNoBlink, + AttrNoReverse: attrNoReverse, + AttrNoConceal: attrNoConceal, + AttrNoStrikethrough: attrNoStrikethrough, + AttrBlackForegroundColor: attrBlackForegroundColor, + AttrRedForegroundColor: attrRedForegroundColor, + AttrGreenForegroundColor: attrGreenForegroundColor, + AttrYellowForegroundColor: attrYellowForegroundColor, + AttrBlueForegroundColor: attrBlueForegroundColor, + AttrMagentaForegroundColor: attrMagentaForegroundColor, + AttrCyanForegroundColor: attrCyanForegroundColor, + AttrWhiteForegroundColor: attrWhiteForegroundColor, + AttrExtendedForegroundColor: attrExtendedForegroundColor, + AttrDefaultForegroundColor: attrDefaultForegroundColor, + AttrBlackBackgroundColor: attrBlackBackgroundColor, + AttrRedBackgroundColor: attrRedBackgroundColor, + AttrGreenBackgroundColor: attrGreenBackgroundColor, + AttrYellowBackgroundColor: attrYellowBackgroundColor, + AttrBlueBackgroundColor: attrBlueBackgroundColor, + AttrMagentaBackgroundColor: attrMagentaBackgroundColor, + AttrCyanBackgroundColor: attrCyanBackgroundColor, + AttrWhiteBackgroundColor: attrWhiteBackgroundColor, + AttrExtendedBackgroundColor: attrExtendedBackgroundColor, + AttrDefaultBackgroundColor: attrDefaultBackgroundColor, + AttrExtendedUnderlineColor: attrExtendedUnderlineColor, + AttrDefaultUnderlineColor: attrDefaultUnderlineColor, + AttrBrightBlackForegroundColor: attrBrightBlackForegroundColor, + AttrBrightRedForegroundColor: attrBrightRedForegroundColor, + AttrBrightGreenForegroundColor: attrBrightGreenForegroundColor, + AttrBrightYellowForegroundColor: attrBrightYellowForegroundColor, + AttrBrightBlueForegroundColor: attrBrightBlueForegroundColor, + AttrBrightMagentaForegroundColor: attrBrightMagentaForegroundColor, + AttrBrightCyanForegroundColor: attrBrightCyanForegroundColor, + AttrBrightWhiteForegroundColor: attrBrightWhiteForegroundColor, + AttrBrightBlackBackgroundColor: attrBrightBlackBackgroundColor, + AttrBrightRedBackgroundColor: attrBrightRedBackgroundColor, + AttrBrightGreenBackgroundColor: attrBrightGreenBackgroundColor, + AttrBrightYellowBackgroundColor: attrBrightYellowBackgroundColor, + AttrBrightBlueBackgroundColor: attrBrightBlueBackgroundColor, + AttrBrightMagentaBackgroundColor: attrBrightMagentaBackgroundColor, + AttrBrightCyanBackgroundColor: attrBrightCyanBackgroundColor, + AttrBrightWhiteBackgroundColor: attrBrightWhiteBackgroundColor, } diff --git a/vendor/github.com/charmbracelet/x/ansi/style.go b/vendor/github.com/charmbracelet/x/ansi/style.go index d8a7efaecd..e4078d268a 100644 --- a/vendor/github.com/charmbracelet/x/ansi/style.go +++ b/vendor/github.com/charmbracelet/x/ansi/style.go @@ -17,7 +17,9 @@ type Attr = int // Style represents an ANSI SGR (Select Graphic Rendition) style. type Style []string -// NewStyle returns a new style with the given attributes. +// NewStyle returns a new style with the given attributes. Attributes are SGR +// (Select Graphic Rendition) codes that control text formatting like bold, +// italic, colors, etc. func NewStyle(attrs ...Attr) Style { if len(attrs) == 0 { return Style{} @@ -46,7 +48,8 @@ func (s Style) String() string { return "\x1b[" + strings.Join(s, ";") + "m" } -// Styled returns a styled string with the given style applied. +// Styled returns a styled string with the given style applied. The style is +// applied at the beginning and reset at the end of the string. func (s Style) Styled(str string) string { if len(s) == 0 { return str @@ -54,161 +57,211 @@ func (s Style) Styled(str string) string { return s.String() + str + ResetStyle } -// Reset appends the reset style attribute to the style. +// Reset appends the reset style attribute to the style. This resets all +// formatting attributes to their defaults. func (s Style) Reset() Style { - return append(s, resetAttr) + return append(s, attrReset) } -// Bold appends the bold style attribute to the style. +// Bold appends the bold or normal intensity style attribute to the style. +// You can use [Style.Normal] to reset to normal intensity. func (s Style) Bold() Style { - return append(s, boldAttr) + return append(s, attrBold) } -// Faint appends the faint style attribute to the style. +// Faint appends the faint or normal intensity style attribute to the style. +// You can use [Style.Normal] to reset to normal intensity. func (s Style) Faint() Style { - return append(s, faintAttr) + return append(s, attrFaint) } -// Italic appends the italic style attribute to the style. -func (s Style) Italic() Style { - return append(s, italicAttr) +// Italic appends the italic or no italic style attribute to the style. +// When v is true, text is rendered in italic. When false, italic is disabled. +func (s Style) Italic(v bool) Style { + if v { + return append(s, attrItalic) + } + return append(s, attrNoItalic) } -// Underline appends the underline style attribute to the style. -func (s Style) Underline() Style { - return append(s, underlineAttr) +// Underline appends the underline or no underline style attribute to the style. +// When v is true, text is underlined. When false, underline is disabled. +func (s Style) Underline(v bool) Style { + if v { + return append(s, attrUnderline) + } + return append(s, attrNoUnderline) } // UnderlineStyle appends the underline style attribute to the style. +// Supports various underline styles including single, double, curly, dotted, +// and dashed. func (s Style) UnderlineStyle(u UnderlineStyle) Style { switch u { - case NoUnderlineStyle: - return s.NoUnderline() - case SingleUnderlineStyle: - return s.Underline() - case DoubleUnderlineStyle: - return append(s, doubleUnderlineStyle) - case CurlyUnderlineStyle: - return append(s, curlyUnderlineStyle) - case DottedUnderlineStyle: - return append(s, dottedUnderlineStyle) - case DashedUnderlineStyle: - return append(s, dashedUnderlineStyle) + case UnderlineStyleNone: + return s.Underline(false) + case UnderlineStyleSingle: + return s.Underline(true) + case UnderlineStyleDouble: + return append(s, underlineStyleDouble) + case UnderlineStyleCurly: + return append(s, underlineStyleCurly) + case UnderlineStyleDotted: + return append(s, underlineStyleDotted) + case UnderlineStyleDashed: + return append(s, underlineStyleDashed) } return s } -// DoubleUnderline appends the double underline style attribute to the style. -// This is a convenience method for UnderlineStyle(DoubleUnderlineStyle). -func (s Style) DoubleUnderline() Style { - return s.UnderlineStyle(DoubleUnderlineStyle) -} - -// CurlyUnderline appends the curly underline style attribute to the style. -// This is a convenience method for UnderlineStyle(CurlyUnderlineStyle). -func (s Style) CurlyUnderline() Style { - return s.UnderlineStyle(CurlyUnderlineStyle) -} - -// DottedUnderline appends the dotted underline style attribute to the style. -// This is a convenience method for UnderlineStyle(DottedUnderlineStyle). -func (s Style) DottedUnderline() Style { - return s.UnderlineStyle(DottedUnderlineStyle) -} - -// DashedUnderline appends the dashed underline style attribute to the style. -// This is a convenience method for UnderlineStyle(DashedUnderlineStyle). -func (s Style) DashedUnderline() Style { - return s.UnderlineStyle(DashedUnderlineStyle) -} - -// SlowBlink appends the slow blink style attribute to the style. -func (s Style) SlowBlink() Style { - return append(s, slowBlinkAttr) +// Blink appends the slow blink or no blink style attribute to the style. +// When v is true, text blinks slowly (less than 150 per minute). When false, +// blinking is disabled. +func (s Style) Blink(v bool) Style { + if v { + return append(s, attrBlink) + } + return append(s, attrNoBlink) } -// RapidBlink appends the rapid blink style attribute to the style. -func (s Style) RapidBlink() Style { - return append(s, rapidBlinkAttr) +// RapidBlink appends the rapid blink or no blink style attribute to the style. +// When v is true, text blinks rapidly (150+ per minute). When false, blinking +// is disabled. +// +// Note that this is not widely supported in terminal emulators. +func (s Style) RapidBlink(v bool) Style { + if v { + return append(s, attrRapidBlink) + } + return append(s, attrNoBlink) } -// Reverse appends the reverse style attribute to the style. -func (s Style) Reverse() Style { - return append(s, reverseAttr) +// Reverse appends the reverse or no reverse style attribute to the style. +// When v is true, foreground and background colors are swapped. When false, +// reverse video is disabled. +func (s Style) Reverse(v bool) Style { + if v { + return append(s, attrReverse) + } + return append(s, attrNoReverse) } -// Conceal appends the conceal style attribute to the style. -func (s Style) Conceal() Style { - return append(s, concealAttr) +// Conceal appends the conceal or no conceal style attribute to the style. +// When v is true, text is hidden/concealed. When false, concealment is +// disabled. +func (s Style) Conceal(v bool) Style { + if v { + return append(s, attrConceal) + } + return append(s, attrNoConceal) } -// Strikethrough appends the strikethrough style attribute to the style. -func (s Style) Strikethrough() Style { - return append(s, strikethroughAttr) +// Strikethrough appends the strikethrough or no strikethrough style attribute +// to the style. When v is true, text is rendered with a horizontal line through +// it. When false, strikethrough is disabled. +func (s Style) Strikethrough(v bool) Style { + if v { + return append(s, attrStrikethrough) + } + return append(s, attrNoStrikethrough) } -// NormalIntensity appends the normal intensity style attribute to the style. -func (s Style) NormalIntensity() Style { - return append(s, normalIntensityAttr) +// Normal appends the normal intensity style attribute to the style. This +// resets [Style.Bold] and [Style.Faint] attributes. +func (s Style) Normal() Style { + return append(s, attrNormalIntensity) } // NoItalic appends the no italic style attribute to the style. +// +// Deprecated: use [Style.Italic](false) instead. func (s Style) NoItalic() Style { - return append(s, noItalicAttr) + return append(s, attrNoItalic) } // NoUnderline appends the no underline style attribute to the style. +// +// Deprecated: use [Style.Underline](false) instead. func (s Style) NoUnderline() Style { - return append(s, noUnderlineAttr) + return append(s, attrNoUnderline) } // NoBlink appends the no blink style attribute to the style. +// +// Deprecated: use [Style.Blink](false) or [Style.RapidBlink](false) instead. func (s Style) NoBlink() Style { - return append(s, noBlinkAttr) + return append(s, attrNoBlink) } // NoReverse appends the no reverse style attribute to the style. +// +// Deprecated: use [Style.Reverse](false) instead. func (s Style) NoReverse() Style { - return append(s, noReverseAttr) + return append(s, attrNoReverse) } // NoConceal appends the no conceal style attribute to the style. +// +// Deprecated: use [Style.Conceal](false) instead. func (s Style) NoConceal() Style { - return append(s, noConcealAttr) + return append(s, attrNoConceal) } // NoStrikethrough appends the no strikethrough style attribute to the style. +// +// Deprecated: use [Style.Strikethrough](false) instead. func (s Style) NoStrikethrough() Style { - return append(s, noStrikethroughAttr) + return append(s, attrNoStrikethrough) } // DefaultForegroundColor appends the default foreground color style attribute to the style. +// +// Deprecated: use [Style.ForegroundColor](nil) instead. func (s Style) DefaultForegroundColor() Style { - return append(s, defaultForegroundColorAttr) + return append(s, attrDefaultForegroundColor) } // DefaultBackgroundColor appends the default background color style attribute to the style. +// +// Deprecated: use [Style.BackgroundColor](nil) instead. func (s Style) DefaultBackgroundColor() Style { - return append(s, defaultBackgroundColorAttr) + return append(s, attrDefaultBackgroundColor) } // DefaultUnderlineColor appends the default underline color style attribute to the style. +// +// Deprecated: use [Style.UnderlineColor](nil) instead. func (s Style) DefaultUnderlineColor() Style { - return append(s, defaultUnderlineColorAttr) + return append(s, attrDefaultUnderlineColor) } // ForegroundColor appends the foreground color style attribute to the style. +// If c is nil, the default foreground color is used. Supports [BasicColor], +// [IndexedColor] (256-color), and [color.Color] (24-bit RGB). func (s Style) ForegroundColor(c Color) Style { + if c == nil { + return append(s, attrDefaultForegroundColor) + } return append(s, foregroundColorString(c)) } // BackgroundColor appends the background color style attribute to the style. +// If c is nil, the default background color is used. Supports [BasicColor], +// [IndexedColor] (256-color), and [color.Color] (24-bit RGB). func (s Style) BackgroundColor(c Color) Style { + if c == nil { + return append(s, attrDefaultBackgroundColor) + } return append(s, backgroundColorString(c)) } // UnderlineColor appends the underline color style attribute to the style. +// If c is nil, the default underline color is used. Supports [BasicColor], +// [IndexedColor] (256-color), and [color.Color] (24-bit RGB). func (s Style) UnderlineColor(c Color) Style { + if c == nil { + return append(s, attrDefaultUnderlineColor) + } return append(s, underlineColorString(c)) } @@ -217,146 +270,216 @@ func (s Style) UnderlineColor(c Color) Style { type UnderlineStyle = byte const ( - doubleUnderlineStyle = "4:2" - curlyUnderlineStyle = "4:3" - dottedUnderlineStyle = "4:4" - dashedUnderlineStyle = "4:5" + underlineStyleDouble = "4:2" + underlineStyleCurly = "4:3" + underlineStyleDotted = "4:4" + underlineStyleDashed = "4:5" ) +// Underline styles constants. +const ( + UnderlineStyleNone UnderlineStyle = iota + UnderlineStyleSingle + UnderlineStyleDouble + UnderlineStyleCurly + UnderlineStyleDotted + UnderlineStyleDashed +) + +// Underline styles constants. +// +// Deprecated: use [UnderlineStyleNone], [UnderlineStyleSingle], etc. instead. const ( - // NoUnderlineStyle is the default underline style. NoUnderlineStyle UnderlineStyle = iota - // SingleUnderlineStyle is a single underline style. SingleUnderlineStyle - // DoubleUnderlineStyle is a double underline style. DoubleUnderlineStyle - // CurlyUnderlineStyle is a curly underline style. CurlyUnderlineStyle - // DottedUnderlineStyle is a dotted underline style. DottedUnderlineStyle - // DashedUnderlineStyle is a dashed underline style. DashedUnderlineStyle ) // SGR (Select Graphic Rendition) style attributes. // See: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters const ( - ResetAttr Attr = 0 - BoldAttr Attr = 1 - FaintAttr Attr = 2 - ItalicAttr Attr = 3 - UnderlineAttr Attr = 4 - SlowBlinkAttr Attr = 5 - RapidBlinkAttr Attr = 6 - ReverseAttr Attr = 7 - ConcealAttr Attr = 8 - StrikethroughAttr Attr = 9 - NormalIntensityAttr Attr = 22 - NoItalicAttr Attr = 23 - NoUnderlineAttr Attr = 24 - NoBlinkAttr Attr = 25 - NoReverseAttr Attr = 27 - NoConcealAttr Attr = 28 - NoStrikethroughAttr Attr = 29 - BlackForegroundColorAttr Attr = 30 - RedForegroundColorAttr Attr = 31 - GreenForegroundColorAttr Attr = 32 - YellowForegroundColorAttr Attr = 33 - BlueForegroundColorAttr Attr = 34 - MagentaForegroundColorAttr Attr = 35 - CyanForegroundColorAttr Attr = 36 - WhiteForegroundColorAttr Attr = 37 - ExtendedForegroundColorAttr Attr = 38 - DefaultForegroundColorAttr Attr = 39 - BlackBackgroundColorAttr Attr = 40 - RedBackgroundColorAttr Attr = 41 - GreenBackgroundColorAttr Attr = 42 - YellowBackgroundColorAttr Attr = 43 - BlueBackgroundColorAttr Attr = 44 - MagentaBackgroundColorAttr Attr = 45 - CyanBackgroundColorAttr Attr = 46 - WhiteBackgroundColorAttr Attr = 47 - ExtendedBackgroundColorAttr Attr = 48 - DefaultBackgroundColorAttr Attr = 49 - ExtendedUnderlineColorAttr Attr = 58 - DefaultUnderlineColorAttr Attr = 59 - BrightBlackForegroundColorAttr Attr = 90 - BrightRedForegroundColorAttr Attr = 91 - BrightGreenForegroundColorAttr Attr = 92 - BrightYellowForegroundColorAttr Attr = 93 - BrightBlueForegroundColorAttr Attr = 94 - BrightMagentaForegroundColorAttr Attr = 95 - BrightCyanForegroundColorAttr Attr = 96 - BrightWhiteForegroundColorAttr Attr = 97 - BrightBlackBackgroundColorAttr Attr = 100 - BrightRedBackgroundColorAttr Attr = 101 - BrightGreenBackgroundColorAttr Attr = 102 - BrightYellowBackgroundColorAttr Attr = 103 - BrightBlueBackgroundColorAttr Attr = 104 - BrightMagentaBackgroundColorAttr Attr = 105 - BrightCyanBackgroundColorAttr Attr = 106 - BrightWhiteBackgroundColorAttr Attr = 107 - - RGBColorIntroducerAttr Attr = 2 - ExtendedColorIntroducerAttr Attr = 5 + AttrReset Attr = 0 + AttrBold Attr = 1 + AttrFaint Attr = 2 + AttrItalic Attr = 3 + AttrUnderline Attr = 4 + AttrBlink Attr = 5 + AttrRapidBlink Attr = 6 + AttrReverse Attr = 7 + AttrConceal Attr = 8 + AttrStrikethrough Attr = 9 + AttrNormalIntensity Attr = 22 + AttrNoItalic Attr = 23 + AttrNoUnderline Attr = 24 + AttrNoBlink Attr = 25 + AttrNoReverse Attr = 27 + AttrNoConceal Attr = 28 + AttrNoStrikethrough Attr = 29 + AttrBlackForegroundColor Attr = 30 + AttrRedForegroundColor Attr = 31 + AttrGreenForegroundColor Attr = 32 + AttrYellowForegroundColor Attr = 33 + AttrBlueForegroundColor Attr = 34 + AttrMagentaForegroundColor Attr = 35 + AttrCyanForegroundColor Attr = 36 + AttrWhiteForegroundColor Attr = 37 + AttrExtendedForegroundColor Attr = 38 + AttrDefaultForegroundColor Attr = 39 + AttrBlackBackgroundColor Attr = 40 + AttrRedBackgroundColor Attr = 41 + AttrGreenBackgroundColor Attr = 42 + AttrYellowBackgroundColor Attr = 43 + AttrBlueBackgroundColor Attr = 44 + AttrMagentaBackgroundColor Attr = 45 + AttrCyanBackgroundColor Attr = 46 + AttrWhiteBackgroundColor Attr = 47 + AttrExtendedBackgroundColor Attr = 48 + AttrDefaultBackgroundColor Attr = 49 + AttrExtendedUnderlineColor Attr = 58 + AttrDefaultUnderlineColor Attr = 59 + AttrBrightBlackForegroundColor Attr = 90 + AttrBrightRedForegroundColor Attr = 91 + AttrBrightGreenForegroundColor Attr = 92 + AttrBrightYellowForegroundColor Attr = 93 + AttrBrightBlueForegroundColor Attr = 94 + AttrBrightMagentaForegroundColor Attr = 95 + AttrBrightCyanForegroundColor Attr = 96 + AttrBrightWhiteForegroundColor Attr = 97 + AttrBrightBlackBackgroundColor Attr = 100 + AttrBrightRedBackgroundColor Attr = 101 + AttrBrightGreenBackgroundColor Attr = 102 + AttrBrightYellowBackgroundColor Attr = 103 + AttrBrightBlueBackgroundColor Attr = 104 + AttrBrightMagentaBackgroundColor Attr = 105 + AttrBrightCyanBackgroundColor Attr = 106 + AttrBrightWhiteBackgroundColor Attr = 107 + + AttrRGBColorIntroducer Attr = 2 + AttrExtendedColorIntroducer Attr = 5 +) + +// SGR (Select Graphic Rendition) style attributes. +// +// Deprecated: use Attr* constants instead. +const ( + ResetAttr = AttrReset + BoldAttr = AttrBold + FaintAttr = AttrFaint + ItalicAttr = AttrItalic + UnderlineAttr = AttrUnderline + SlowBlinkAttr = AttrBlink + RapidBlinkAttr = AttrRapidBlink + ReverseAttr = AttrReverse + ConcealAttr = AttrConceal + StrikethroughAttr = AttrStrikethrough + NormalIntensityAttr = AttrNormalIntensity + NoItalicAttr = AttrNoItalic + NoUnderlineAttr = AttrNoUnderline + NoBlinkAttr = AttrNoBlink + NoReverseAttr = AttrNoReverse + NoConcealAttr = AttrNoConceal + NoStrikethroughAttr = AttrNoStrikethrough + BlackForegroundColorAttr = AttrBlackForegroundColor + RedForegroundColorAttr = AttrRedForegroundColor + GreenForegroundColorAttr = AttrGreenForegroundColor + YellowForegroundColorAttr = AttrYellowForegroundColor + BlueForegroundColorAttr = AttrBlueForegroundColor + MagentaForegroundColorAttr = AttrMagentaForegroundColor + CyanForegroundColorAttr = AttrCyanForegroundColor + WhiteForegroundColorAttr = AttrWhiteForegroundColor + ExtendedForegroundColorAttr = AttrExtendedForegroundColor + DefaultForegroundColorAttr = AttrDefaultForegroundColor + BlackBackgroundColorAttr = AttrBlackBackgroundColor + RedBackgroundColorAttr = AttrRedBackgroundColor + GreenBackgroundColorAttr = AttrGreenBackgroundColor + YellowBackgroundColorAttr = AttrYellowBackgroundColor + BlueBackgroundColorAttr = AttrBlueBackgroundColor + MagentaBackgroundColorAttr = AttrMagentaBackgroundColor + CyanBackgroundColorAttr = AttrCyanBackgroundColor + WhiteBackgroundColorAttr = AttrWhiteBackgroundColor + ExtendedBackgroundColorAttr = AttrExtendedBackgroundColor + DefaultBackgroundColorAttr = AttrDefaultBackgroundColor + ExtendedUnderlineColorAttr = AttrExtendedUnderlineColor + DefaultUnderlineColorAttr = AttrDefaultUnderlineColor + BrightBlackForegroundColorAttr = AttrBrightBlackForegroundColor + BrightRedForegroundColorAttr = AttrBrightRedForegroundColor + BrightGreenForegroundColorAttr = AttrBrightGreenForegroundColor + BrightYellowForegroundColorAttr = AttrBrightYellowForegroundColor + BrightBlueForegroundColorAttr = AttrBrightBlueForegroundColor + BrightMagentaForegroundColorAttr = AttrBrightMagentaForegroundColor + BrightCyanForegroundColorAttr = AttrBrightCyanForegroundColor + BrightWhiteForegroundColorAttr = AttrBrightWhiteForegroundColor + BrightBlackBackgroundColorAttr = AttrBrightBlackBackgroundColor + BrightRedBackgroundColorAttr = AttrBrightRedBackgroundColor + BrightGreenBackgroundColorAttr = AttrBrightGreenBackgroundColor + BrightYellowBackgroundColorAttr = AttrBrightYellowBackgroundColor + BrightBlueBackgroundColorAttr = AttrBrightBlueBackgroundColor + BrightMagentaBackgroundColorAttr = AttrBrightMagentaBackgroundColor + BrightCyanBackgroundColorAttr = AttrBrightCyanBackgroundColor + BrightWhiteBackgroundColorAttr = AttrBrightWhiteBackgroundColor + RGBColorIntroducerAttr = AttrRGBColorIntroducer + ExtendedColorIntroducerAttr = AttrExtendedColorIntroducer ) const ( - resetAttr = "0" - boldAttr = "1" - faintAttr = "2" - italicAttr = "3" - underlineAttr = "4" - slowBlinkAttr = "5" - rapidBlinkAttr = "6" - reverseAttr = "7" - concealAttr = "8" - strikethroughAttr = "9" - normalIntensityAttr = "22" - noItalicAttr = "23" - noUnderlineAttr = "24" - noBlinkAttr = "25" - noReverseAttr = "27" - noConcealAttr = "28" - noStrikethroughAttr = "29" - blackForegroundColorAttr = "30" - redForegroundColorAttr = "31" - greenForegroundColorAttr = "32" - yellowForegroundColorAttr = "33" - blueForegroundColorAttr = "34" - magentaForegroundColorAttr = "35" - cyanForegroundColorAttr = "36" - whiteForegroundColorAttr = "37" - extendedForegroundColorAttr = "38" - defaultForegroundColorAttr = "39" - blackBackgroundColorAttr = "40" - redBackgroundColorAttr = "41" - greenBackgroundColorAttr = "42" - yellowBackgroundColorAttr = "43" - blueBackgroundColorAttr = "44" - magentaBackgroundColorAttr = "45" - cyanBackgroundColorAttr = "46" - whiteBackgroundColorAttr = "47" - extendedBackgroundColorAttr = "48" - defaultBackgroundColorAttr = "49" - extendedUnderlineColorAttr = "58" - defaultUnderlineColorAttr = "59" - brightBlackForegroundColorAttr = "90" - brightRedForegroundColorAttr = "91" - brightGreenForegroundColorAttr = "92" - brightYellowForegroundColorAttr = "93" - brightBlueForegroundColorAttr = "94" - brightMagentaForegroundColorAttr = "95" - brightCyanForegroundColorAttr = "96" - brightWhiteForegroundColorAttr = "97" - brightBlackBackgroundColorAttr = "100" - brightRedBackgroundColorAttr = "101" - brightGreenBackgroundColorAttr = "102" - brightYellowBackgroundColorAttr = "103" - brightBlueBackgroundColorAttr = "104" - brightMagentaBackgroundColorAttr = "105" - brightCyanBackgroundColorAttr = "106" - brightWhiteBackgroundColorAttr = "107" + attrReset = "0" + attrBold = "1" + attrFaint = "2" + attrItalic = "3" + attrUnderline = "4" + attrBlink = "5" + attrRapidBlink = "6" + attrReverse = "7" + attrConceal = "8" + attrStrikethrough = "9" + attrNormalIntensity = "22" + attrNoItalic = "23" + attrNoUnderline = "24" + attrNoBlink = "25" + attrNoReverse = "27" + attrNoConceal = "28" + attrNoStrikethrough = "29" + attrBlackForegroundColor = "30" + attrRedForegroundColor = "31" + attrGreenForegroundColor = "32" + attrYellowForegroundColor = "33" + attrBlueForegroundColor = "34" + attrMagentaForegroundColor = "35" + attrCyanForegroundColor = "36" + attrWhiteForegroundColor = "37" + attrExtendedForegroundColor = "38" + attrDefaultForegroundColor = "39" + attrBlackBackgroundColor = "40" + attrRedBackgroundColor = "41" + attrGreenBackgroundColor = "42" + attrYellowBackgroundColor = "43" + attrBlueBackgroundColor = "44" + attrMagentaBackgroundColor = "45" + attrCyanBackgroundColor = "46" + attrWhiteBackgroundColor = "47" + attrExtendedBackgroundColor = "48" + attrDefaultBackgroundColor = "49" + attrExtendedUnderlineColor = "58" + attrDefaultUnderlineColor = "59" + attrBrightBlackForegroundColor = "90" + attrBrightRedForegroundColor = "91" + attrBrightGreenForegroundColor = "92" + attrBrightYellowForegroundColor = "93" + attrBrightBlueForegroundColor = "94" + attrBrightMagentaForegroundColor = "95" + attrBrightCyanForegroundColor = "96" + attrBrightWhiteForegroundColor = "97" + attrBrightBlackBackgroundColor = "100" + attrBrightRedBackgroundColor = "101" + attrBrightGreenBackgroundColor = "102" + attrBrightYellowBackgroundColor = "103" + attrBrightBlueBackgroundColor = "104" + attrBrightMagentaBackgroundColor = "105" + attrBrightCyanBackgroundColor = "106" + attrBrightWhiteBackgroundColor = "107" ) // foregroundColorString returns the style SGR attribute for the given @@ -369,37 +492,37 @@ func foregroundColorString(c Color) string { // "3" or "9" where n is the color number from 0 to 7 switch c { case Black: - return blackForegroundColorAttr + return attrBlackForegroundColor case Red: - return redForegroundColorAttr + return attrRedForegroundColor case Green: - return greenForegroundColorAttr + return attrGreenForegroundColor case Yellow: - return yellowForegroundColorAttr + return attrYellowForegroundColor case Blue: - return blueForegroundColorAttr + return attrBlueForegroundColor case Magenta: - return magentaForegroundColorAttr + return attrMagentaForegroundColor case Cyan: - return cyanForegroundColorAttr + return attrCyanForegroundColor case White: - return whiteForegroundColorAttr + return attrWhiteForegroundColor case BrightBlack: - return brightBlackForegroundColorAttr + return attrBrightBlackForegroundColor case BrightRed: - return brightRedForegroundColorAttr + return attrBrightRedForegroundColor case BrightGreen: - return brightGreenForegroundColorAttr + return attrBrightGreenForegroundColor case BrightYellow: - return brightYellowForegroundColorAttr + return attrBrightYellowForegroundColor case BrightBlue: - return brightBlueForegroundColorAttr + return attrBrightBlueForegroundColor case BrightMagenta: - return brightMagentaForegroundColorAttr + return attrBrightMagentaForegroundColor case BrightCyan: - return brightCyanForegroundColorAttr + return attrBrightCyanForegroundColor case BrightWhite: - return brightWhiteForegroundColorAttr + return attrBrightWhiteForegroundColor } case ExtendedColor: // 256-color ANSI foreground @@ -414,7 +537,7 @@ func foregroundColorString(c Color) string { strconv.FormatUint(uint64(shift(g)), 10) + ";" + strconv.FormatUint(uint64(shift(b)), 10) } - return defaultForegroundColorAttr + return attrDefaultForegroundColor } // backgroundColorString returns the style SGR attribute for the given @@ -427,37 +550,37 @@ func backgroundColorString(c Color) string { // "4" or "10" where n is the color number from 0 to 7 switch c { case Black: - return blackBackgroundColorAttr + return attrBlackBackgroundColor case Red: - return redBackgroundColorAttr + return attrRedBackgroundColor case Green: - return greenBackgroundColorAttr + return attrGreenBackgroundColor case Yellow: - return yellowBackgroundColorAttr + return attrYellowBackgroundColor case Blue: - return blueBackgroundColorAttr + return attrBlueBackgroundColor case Magenta: - return magentaBackgroundColorAttr + return attrMagentaBackgroundColor case Cyan: - return cyanBackgroundColorAttr + return attrCyanBackgroundColor case White: - return whiteBackgroundColorAttr + return attrWhiteBackgroundColor case BrightBlack: - return brightBlackBackgroundColorAttr + return attrBrightBlackBackgroundColor case BrightRed: - return brightRedBackgroundColorAttr + return attrBrightRedBackgroundColor case BrightGreen: - return brightGreenBackgroundColorAttr + return attrBrightGreenBackgroundColor case BrightYellow: - return brightYellowBackgroundColorAttr + return attrBrightYellowBackgroundColor case BrightBlue: - return brightBlueBackgroundColorAttr + return attrBrightBlueBackgroundColor case BrightMagenta: - return brightMagentaBackgroundColorAttr + return attrBrightMagentaBackgroundColor case BrightCyan: - return brightCyanBackgroundColorAttr + return attrBrightCyanBackgroundColor case BrightWhite: - return brightWhiteBackgroundColorAttr + return attrBrightWhiteBackgroundColor } case ExtendedColor: // 256-color ANSI foreground @@ -472,7 +595,7 @@ func backgroundColorString(c Color) string { strconv.FormatUint(uint64(shift(g)), 10) + ";" + strconv.FormatUint(uint64(shift(b)), 10) } - return defaultBackgroundColorAttr + return attrDefaultBackgroundColor } // underlineColorString returns the style SGR attribute for the given underline @@ -498,7 +621,7 @@ func underlineColorString(c Color) string { strconv.FormatUint(uint64(shift(g)), 10) + ";" + strconv.FormatUint(uint64(shift(b)), 10) } - return defaultUnderlineColorAttr + return attrDefaultUnderlineColor } // ReadStyleColor decodes a color from a slice of parameters. It returns the @@ -526,7 +649,7 @@ func underlineColorString(c Color) string { // 2. Support ignoring and omitting the color space id (second parameter) with respect to RGB colors // 3. Support ignoring and omitting the 6th parameter with respect to RGB and CMY colors // 4. Support reading RGBA colors -func ReadStyleColor(params Params, co *color.Color) (n int) { +func ReadStyleColor(params Params, co *color.Color) int { if len(params) < 2 { // Need at least SGR type and color type return 0 } @@ -535,7 +658,7 @@ func ReadStyleColor(params Params, co *color.Color) (n int) { s := params[0] p := params[1] colorType := p.Param(0) - n = 2 + n := 2 paramsfn := func() (p1, p2, p3, p4 int) { // Where should we start reading the color? @@ -594,7 +717,7 @@ func ReadStyleColor(params Params, co *color.Color) (n int) { B: uint8(b), //nolint:gosec A: 0xff, } - return //nolint:nakedret + return n case 3: // CMY direct color if len(params) < 5 { @@ -612,7 +735,7 @@ func ReadStyleColor(params Params, co *color.Color) (n int) { Y: uint8(y), //nolint:gosec K: 0, } - return //nolint:nakedret + return n case 4: // CMYK direct color if len(params) < 6 { @@ -630,7 +753,7 @@ func ReadStyleColor(params Params, co *color.Color) (n int) { Y: uint8(y), //nolint:gosec K: uint8(k), //nolint:gosec } - return //nolint:nakedret + return n case 5: // indexed color if len(params) < 3 { @@ -665,7 +788,7 @@ func ReadStyleColor(params Params, co *color.Color) (n int) { B: uint8(b), //nolint:gosec A: uint8(a), //nolint:gosec } - return //nolint:nakedret + return n default: return 0 diff --git a/vendor/github.com/charmbracelet/x/ansi/truncate.go b/vendor/github.com/charmbracelet/x/ansi/truncate.go index 3f541fa566..f95f829309 100644 --- a/vendor/github.com/charmbracelet/x/ansi/truncate.go +++ b/vendor/github.com/charmbracelet/x/ansi/truncate.go @@ -1,11 +1,11 @@ package ansi import ( - "bytes" + "strings" "github.com/charmbracelet/x/ansi/parser" - "github.com/mattn/go-runewidth" - "github.com/rivo/uniseg" + "github.com/clipperhouse/displaywidth" + "github.com/clipperhouse/uax29/v2/graphemes" ) // Cut the string, without adding any prefix or tail strings. This function is @@ -74,12 +74,11 @@ func truncate(m Method, s string, length int, tail string) string { return "" } - var cluster []byte - var buf bytes.Buffer + var cluster string + var buf strings.Builder curWidth := 0 ignoring := false pstate := parser.GroundState // initial state - b := []byte(s) i := 0 // Here we iterate over the bytes of the string and collect printable @@ -88,16 +87,12 @@ func truncate(m Method, s string, length int, tail string) string { // // Once we reach the given length, we start ignoring characters and only // collect ANSI escape codes until we reach the end of string. - for i < len(b) { - state, action := parser.Table.Transition(pstate, b[i]) + for i < len(s) { + state, action := parser.Table.Transition(pstate, s[i]) if state == parser.Utf8State { // This action happens when we transition to the Utf8State. var width int - cluster, _, width, _ = uniseg.FirstGraphemeCluster(b[i:], -1) - if m == WcWidth { - width = runewidth.StringWidth(string(cluster)) - } - + cluster, width = FirstGraphemeCluster(s[i:], m) // increment the index by the length of the cluster i += len(cluster) curWidth += width @@ -118,7 +113,7 @@ func truncate(m Method, s string, length int, tail string) string { continue } - buf.Write(cluster) + buf.WriteString(cluster) // Done collecting, now we're back in the ground state. pstate = parser.GroundState @@ -152,7 +147,7 @@ func truncate(m Method, s string, length int, tail string) string { } fallthrough default: - buf.WriteByte(b[i]) + buf.WriteByte(s[i]) i++ } @@ -193,27 +188,23 @@ func truncateLeft(m Method, s string, n int, prefix string) string { return s } - var cluster []byte - var buf bytes.Buffer + var cluster string + var buf strings.Builder curWidth := 0 ignoring := true pstate := parser.GroundState - b := []byte(s) i := 0 - for i < len(b) { + for i < len(s) { if !ignoring { - buf.Write(b[i:]) + buf.WriteString(s[i:]) break } - state, action := parser.Table.Transition(pstate, b[i]) + state, action := parser.Table.Transition(pstate, s[i]) if state == parser.Utf8State { var width int - cluster, _, width, _ = uniseg.FirstGraphemeCluster(b[i:], -1) - if m == WcWidth { - width = runewidth.StringWidth(string(cluster)) - } + cluster, width = FirstGraphemeCluster(s[i:], m) i += len(cluster) curWidth += width @@ -224,7 +215,7 @@ func truncateLeft(m Method, s string, n int, prefix string) string { } if curWidth > n { - buf.Write(cluster) + buf.WriteString(cluster) } if ignoring { @@ -259,7 +250,7 @@ func truncateLeft(m Method, s string, n int, prefix string) string { } fallthrough default: - buf.WriteByte(b[i]) + buf.WriteByte(s[i]) i++ } @@ -278,22 +269,22 @@ func truncateLeft(m Method, s string, n int, prefix string) string { // You can use this with [Truncate], [TruncateLeft], and [Cut]. func ByteToGraphemeRange(str string, byteStart, byteStop int) (charStart, charStop int) { bytePos, charPos := 0, 0 - gr := uniseg.NewGraphemes(str) + gr := graphemes.FromString(str) for byteStart > bytePos { if !gr.Next() { break } - bytePos += len(gr.Str()) - charPos += max(1, gr.Width()) + bytePos += len(gr.Value()) + charPos += max(1, displaywidth.String(gr.Value())) } charStart = charPos for byteStop > bytePos { if !gr.Next() { break } - bytePos += len(gr.Str()) - charPos += max(1, gr.Width()) + bytePos += len(gr.Value()) + charPos += max(1, displaywidth.String(gr.Value())) } charStop = charPos - return + return charStart, charStop } diff --git a/vendor/github.com/charmbracelet/x/ansi/urxvt.go b/vendor/github.com/charmbracelet/x/ansi/urxvt.go new file mode 100644 index 0000000000..b9e86281d9 --- /dev/null +++ b/vendor/github.com/charmbracelet/x/ansi/urxvt.go @@ -0,0 +1,17 @@ +package ansi + +import ( + "fmt" + "strings" +) + +// URxvtExt returns an escape sequence for calling a URxvt perl extension with +// the given name and parameters. +// +// OSC 777 ; extension_name ; param1 ; param2 ; ... ST +// OSC 777 ; extension_name ; param1 ; param2 ; ... BEL +// +// See: https://man.archlinux.org/man/extra/rxvt-unicode/urxvt.7.en#XTerm_Operating_System_Commands +func URxvtExt(extension string, params ...string) string { + return fmt.Sprintf("\x1b]777;%s;%s\x07", extension, strings.Join(params, ";")) +} diff --git a/vendor/github.com/charmbracelet/x/ansi/width.go b/vendor/github.com/charmbracelet/x/ansi/width.go index cc0858161c..fd680cfdc0 100644 --- a/vendor/github.com/charmbracelet/x/ansi/width.go +++ b/vendor/github.com/charmbracelet/x/ansi/width.go @@ -4,8 +4,6 @@ import ( "bytes" "github.com/charmbracelet/x/ansi/parser" - "github.com/mattn/go-runewidth" - "github.com/rivo/uniseg" ) // Strip removes ANSI escape codes from a string. @@ -83,20 +81,16 @@ func stringWidth(m Method, s string) int { } var ( - pstate = parser.GroundState // initial state - cluster string - width int + pstate = parser.GroundState // initial state + width int ) for i := 0; i < len(s); i++ { state, action := parser.Table.Transition(pstate, s[i]) if state == parser.Utf8State { - var w int - cluster, _, w, _ = uniseg.FirstGraphemeClusterInString(s[i:], -1) - if m == WcWidth { - w = runewidth.StringWidth(cluster) - } + cluster, w := FirstGraphemeCluster(s[i:], m) width += w + i += len(cluster) - 1 pstate = parser.GroundState continue diff --git a/vendor/github.com/charmbracelet/x/ansi/wrap.go b/vendor/github.com/charmbracelet/x/ansi/wrap.go index 253e123358..530be6caee 100644 --- a/vendor/github.com/charmbracelet/x/ansi/wrap.go +++ b/vendor/github.com/charmbracelet/x/ansi/wrap.go @@ -2,12 +2,11 @@ package ansi import ( "bytes" + "strings" "unicode" "unicode/utf8" "github.com/charmbracelet/x/ansi/parser" - "github.com/mattn/go-runewidth" - "github.com/rivo/uniseg" ) // nbsp is a non-breaking space. @@ -55,12 +54,9 @@ func hardwrap(m Method, s string, limit int, preserveSpace bool) string { i := 0 for i < len(b) { state, action := parser.Table.Transition(pstate, b[i]) - if state == parser.Utf8State { //nolint:nestif + if state == parser.Utf8State { var width int - cluster, _, width, _ = uniseg.FirstGraphemeCluster(b[i:], -1) - if m == WcWidth { - width = runewidth.StringWidth(string(cluster)) - } + cluster, width = FirstGraphemeCluster(b[i:], m) i += len(cluster) if curWidth+width > limit { @@ -192,10 +188,7 @@ func wordwrap(m Method, s string, limit int, breakpoints string) string { state, action := parser.Table.Transition(pstate, b[i]) if state == parser.Utf8State { //nolint:nestif var width int - cluster, _, width, _ = uniseg.FirstGraphemeCluster(b[i:], -1) - if m == WcWidth { - width = runewidth.StringWidth(string(cluster)) - } + cluster, width = FirstGraphemeCluster(b[i:], m) i += len(cluster) r, _ := utf8.DecodeRune(cluster) @@ -303,7 +296,7 @@ func wrap(m Method, s string, limit int, breakpoints string) string { } var ( - cluster []byte + cluster string buf bytes.Buffer word bytes.Buffer space bytes.Buffer @@ -311,10 +304,12 @@ func wrap(m Method, s string, limit int, breakpoints string) string { curWidth int // written width of the line wordLen int // word buffer len without ANSI escape codes pstate = parser.GroundState // initial state - b = []byte(s) ) addSpace := func() { + if spaceWidth == 0 && space.Len() == 0 { + return + } curWidth += spaceWidth buf.Write(space.Bytes()) space.Reset() @@ -341,30 +336,27 @@ func wrap(m Method, s string, limit int, breakpoints string) string { } i := 0 - for i < len(b) { - state, action := parser.Table.Transition(pstate, b[i]) + for i < len(s) { + state, action := parser.Table.Transition(pstate, s[i]) if state == parser.Utf8State { //nolint:nestif var width int - cluster, _, width, _ = uniseg.FirstGraphemeCluster(b[i:], -1) - if m == WcWidth { - width = runewidth.StringWidth(string(cluster)) - } + cluster, width = FirstGraphemeCluster(s[i:], m) i += len(cluster) - r, _ := utf8.DecodeRune(cluster) + r, _ := utf8.DecodeRuneInString(cluster) switch { case r != utf8.RuneError && unicode.IsSpace(r) && r != nbsp: // nbsp is a non-breaking space addWord() space.WriteRune(r) spaceWidth += width - case bytes.ContainsAny(cluster, breakpoints): + case strings.ContainsAny(cluster, breakpoints): addSpace() if curWidth+wordLen+width > limit { - word.Write(cluster) + word.WriteString(cluster) wordLen += width } else { addWord() - buf.Write(cluster) + buf.WriteString(cluster) curWidth += width } default: @@ -373,12 +365,17 @@ func wrap(m Method, s string, limit int, breakpoints string) string { addWord() } - word.Write(cluster) + word.WriteString(cluster) wordLen += width if curWidth+wordLen+spaceWidth > limit { addNewline() } + + if wordLen == limit { + // Hardwrap the word if it's too long + addWord() + } } pstate = parser.GroundState @@ -387,7 +384,7 @@ func wrap(m Method, s string, limit int, breakpoints string) string { switch action { case parser.PrintAction, parser.ExecuteAction: - switch r := rune(b[i]); { + switch r := rune(s[i]); { case r == '\n': if wordLen == 0 { if curWidth+spaceWidth > limit { @@ -424,6 +421,7 @@ func wrap(m Method, s string, limit int, breakpoints string) string { if curWidth == limit { addNewline() } + word.WriteRune(r) wordLen++ @@ -438,7 +436,7 @@ func wrap(m Method, s string, limit int, breakpoints string) string { } default: - word.WriteByte(b[i]) + word.WriteByte(s[i]) } // We manage the UTF8 state separately manually above. diff --git a/vendor/github.com/clipperhouse/displaywidth/.gitignore b/vendor/github.com/clipperhouse/displaywidth/.gitignore new file mode 100644 index 0000000000..e43b0f9889 --- /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 0000000000..853e2917db --- /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/clipperhouse/displaywidth/LICENSE b/vendor/github.com/clipperhouse/displaywidth/LICENSE new file mode 100644 index 0000000000..4b8064eb37 --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/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/displaywidth/README.md b/vendor/github.com/clipperhouse/displaywidth/README.md new file mode 100644 index 0000000000..209bff798f --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/README.md @@ -0,0 +1,113 @@ +# 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) +} +``` + +For most purposes, you should use the `String` or `Bytes` methods. + +### 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](https://www.unicode.org/reports/tr11/)), and handles +[version selectors](https://en.wikipedia.org/wiki/Variation_Selectors_(Unicode_block)), +and [regional indicator pairs](https://en.wikipedia.org/wiki/Regional_indicator_symbol) +(flags). It operates on bytes without decoding runes for better performance. + +## Prior Art + +[mattn/go-runewidth](https://github.com/mattn/go-runewidth) + +[rivo/uniseg](https://github.com/rivo/uniseg) + +[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 + +```bash +cd comparison +go test -bench=. -benchmem +``` + +``` +goos: darwin +goarch: arm64 +pkg: github.com/clipperhouse/displaywidth/comparison +cpu: Apple M2 +BenchmarkStringDefault/clipperhouse/displaywidth-8 11124 ns/op 151.66 MB/s 0 B/op 0 allocs/op +BenchmarkStringDefault/mattn/go-runewidth-8 14209 ns/op 118.73 MB/s 0 B/op 0 allocs/op +BenchmarkStringDefault/rivo/uniseg-8 19287 ns/op 87.47 MB/s 0 B/op 0 allocs/op +BenchmarkString_EAW/clipperhouse/displaywidth-8 11134 ns/op 151.52 MB/s 0 B/op 0 allocs/op +BenchmarkString_EAW/mattn/go-runewidth-8 23793 ns/op 70.90 MB/s 0 B/op 0 allocs/op +BenchmarkString_EAW/rivo/uniseg-8 19593 ns/op 86.10 MB/s 0 B/op 0 allocs/op +BenchmarkString_StrictEmoji/clipperhouse/displaywidth-8 11124 ns/op 151.65 MB/s 0 B/op 0 allocs/op +BenchmarkString_StrictEmoji/mattn/go-runewidth-8 14310 ns/op 117.89 MB/s 0 B/op 0 allocs/op +BenchmarkString_StrictEmoji/rivo/uniseg-8 19699 ns/op 85.64 MB/s 0 B/op 0 allocs/op +BenchmarkString_ASCII/clipperhouse/displaywidth-8 1107 ns/op 115.64 MB/s 0 B/op 0 allocs/op +BenchmarkString_ASCII/mattn/go-runewidth-8 1174 ns/op 109.04 MB/s 0 B/op 0 allocs/op +BenchmarkString_ASCII/rivo/uniseg-8 1582 ns/op 80.93 MB/s 0 B/op 0 allocs/op +BenchmarkString_Unicode/clipperhouse/displaywidth-8 959.7 ns/op 138.59 MB/s 0 B/op 0 allocs/op +BenchmarkString_Unicode/mattn/go-runewidth-8 1422 ns/op 93.53 MB/s 0 B/op 0 allocs/op +BenchmarkString_Unicode/rivo/uniseg-8 2032 ns/op 65.47 MB/s 0 B/op 0 allocs/op +BenchmarkStringWidth_Emoji/clipperhouse/displaywidth-8 3230 ns/op 224.17 MB/s 0 B/op 0 allocs/op +BenchmarkStringWidth_Emoji/mattn/go-runewidth-8 4826 ns/op 150.03 MB/s 0 B/op 0 allocs/op +BenchmarkStringWidth_Emoji/rivo/uniseg-8 6582 ns/op 109.99 MB/s 0 B/op 0 allocs/op +BenchmarkString_Mixed/clipperhouse/displaywidth-8 4094 ns/op 123.83 MB/s 0 B/op 0 allocs/op +BenchmarkString_Mixed/mattn/go-runewidth-8 4612 ns/op 109.92 MB/s 0 B/op 0 allocs/op +BenchmarkString_Mixed/rivo/uniseg-8 6312 ns/op 80.32 MB/s 0 B/op 0 allocs/op +BenchmarkString_ControlChars/clipperhouse/displaywidth-8 346.7 ns/op 95.19 MB/s 0 B/op 0 allocs/op +BenchmarkString_ControlChars/mattn/go-runewidth-8 365.0 ns/op 90.42 MB/s 0 B/op 0 allocs/op +BenchmarkString_ControlChars/rivo/uniseg-8 408.9 ns/op 80.70 MB/s 0 B/op 0 allocs/op +``` + +I use a similar technique in [this grapheme cluster library](https://github.com/clipperhouse/uax29). + +## Compatibility + +`clipperhouse/displaywidth`, `mattn/go-runewidth`, and `rivo/uniseg` should give the +same outputs for real-world text. See [comparison/README.md](comparison/README.md). diff --git a/vendor/github.com/clipperhouse/displaywidth/gen.go b/vendor/github.com/clipperhouse/displaywidth/gen.go new file mode 100644 index 0000000000..52e1085bcd --- /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 0000000000..9866a7aae8 --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/trie.go @@ -0,0 +1,1903 @@ +// 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 7 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 + // VARIATION SELECTOR-15 (U+FE0E) requests text presentation (width 1); not in the trie, see [width] + _VS15 + // VARIATION SELECTOR-16 (U+FE0F) requests emoji presentation (width 2); not in the trie, see [width] + _VS16 + // Regional Indicator Pair (flag) grapheme cluster; not in the trie, see [width] + _RI_PAIR +) + +// 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 0000000000..0c7edb2fd3 --- /dev/null +++ b/vendor/github.com/clipperhouse/displaywidth/width.go @@ -0,0 +1,224 @@ +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; + // we use lookupProperties which can consider immediate VS15/VS16. + 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; + // we use lookupProperties which can consider immediate VS15/VS16. + 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 { + if len(s) == 0 { + return 0 + } + + b := s[0] + if isASCIIControl(b) { + return _ZeroWidth + } + + l := len(s) + + if b < utf8.RuneSelf { // Single-byte ASCII + // Check for variation selector after ASCII (e.g., keycap sequences like 1️⃣) + var p property + if l >= 4 { + // Create a subslice to help the compiler eliminate bounds checks + vs := s[1:4] + if vs[0] == 0xEF && vs[1] == 0xB8 { + switch vs[2] { + case 0x8E: + p |= _VS15 + case 0x8F: + p |= _VS16 + } + } + } + return p // ASCII characters are width 1 by default, or 2 with VS16 + } + + // Regional indicator pair (flag) - detect early before trie lookup. + // Formed by two Regional Indicator symbols (U+1F1E6–U+1F1FF), + // each encoded as F0 9F 87 A6–BF. Always width 2, no trie lookup needed. + if l >= 8 { + // Create a subslice to help the compiler eliminate bounds checks + ri := s[:8] + if ri[0] == 0xF0 && + ri[1] == 0x9F && + ri[2] == 0x87 { + b3 := ri[3] + if b3 >= 0xA6 && b3 <= 0xBF && + ri[4] == 0xF0 && + ri[5] == 0x9F && + ri[6] == 0x87 { + b7 := ri[7] + if b7 >= 0xA6 && b7 <= 0xBF { + return _RI_PAIR + } + } + } + } + + props, size := lookup(s) + p := property(props) + + // Variation Selectors + if size > 0 && l >= size+3 { + // Create a subslice to help the compiler eliminate bounds checks + vs := s[size : size+3] + if vs[0] == 0xEF && vs[1] == 0xB8 { + switch vs[2] { + case 0x8E: + p |= _VS15 + case 0x8F: + p |= _VS16 + } + } + } + + return p +} + +// 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 + } + + // Explicit presentation overrides from VS come first. + if p.is(_VS16) { + return 2 + } + if p.is(_VS15) { + return 1 + } + + // Regional indicator pair (flag) grapheme cluster + // returns 1 under StrictEmojiNeutral=false, which + // is compatible with go-runewidth & uniseg. + if p.is(_RI_PAIR) && options.StrictEmojiNeutral { + return 2 + } + + 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/dop251/goja/builtin_regexp.go b/vendor/github.com/dop251/goja/builtin_regexp.go index cdc0d9db20..0cb044ff3d 100644 --- a/vendor/github.com/dop251/goja/builtin_regexp.go +++ b/vendor/github.com/dop251/goja/builtin_regexp.go @@ -1,12 +1,15 @@ package goja import ( + "errors" "fmt" - "github.com/dop251/goja/parser" "regexp" + "regexp/syntax" "strings" "unicode/utf16" "unicode/utf8" + + "github.com/dop251/goja/parser" ) func (r *Runtime) newRegexpObject(proto *Object) *regexpObject { @@ -241,8 +244,8 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) { patternStr = convertRegexpToUtf16(patternStr) } - re2Str, err1 := parser.TransformRegExp(patternStr, dotAll, unicode) - if err1 == nil { + re2Str, err := parser.TransformRegExp(patternStr, dotAll, unicode) + if err == nil { re2flags := "" if multiline { re2flags += "m" @@ -259,15 +262,22 @@ func compileRegexp(patternStr, flags string) (p *regexpPattern, err error) { pattern, err1 := regexp.Compile(re2Str) if err1 != nil { - err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1) - return + var syntaxError *syntax.Error + if !errors.As(err1, &syntaxError) || syntaxError.Code != syntax.ErrInvalidRepeatSize { + err = fmt.Errorf("Invalid regular expression (re2): %s (%v)", re2Str, err1) + return + } + } else { + wrapper = (*regexpWrapper)(pattern) } - wrapper = (*regexpWrapper)(pattern) } else { - if _, incompat := err1.(parser.RegexpErrorIncompatible); !incompat { - err = err1 + var incompat parser.RegexpErrorIncompatible + if !errors.As(err, &incompat) { return } + } + + if wrapper == nil { wrapper2, err = compileRegexp2(patternStr, multiline, dotAll, ignoreCase, unicode) if err != nil { err = fmt.Errorf("Invalid regular expression (regexp2): %s (%v)", patternStr, err) @@ -762,16 +772,15 @@ func (r *Runtime) regexpproto_stdMatcher(call FunctionCall) Value { return r.regexpproto_stdMatcherGeneric(thisObj, s) } if rx.pattern.global { + rx.setOwnStr("lastIndex", intToValue(0), true) res := rx.pattern.findAllSubmatchIndex(s, 0, -1, rx.pattern.sticky) if len(res) == 0 { - rx.setOwnStr("lastIndex", intToValue(0), true) return _null } a := make([]Value, 0, len(res)) for _, result := range res { a = append(a, s.Substring(result[0], result[1])) } - rx.setOwnStr("lastIndex", intToValue(int64(res[len(res)-1][1])), true) return r.newArrayValues(a) } else { return rx.exec(s) @@ -1226,17 +1235,16 @@ func (r *Runtime) regexpproto_stdReplacer(call FunctionCall) Value { find := 1 if rx.pattern.global { find = -1 - rx.setOwnStr("lastIndex", intToValue(0), true) } else { index = rx.getLastIndex() } found := rx.pattern.findAllSubmatchIndex(s, toIntStrict(index), find, rx.pattern.sticky) - if len(found) > 0 { - if !rx.updateLastIndex(index, found[0], found[len(found)-1]) { - found = nil + if rx.pattern.global || rx.pattern.sticky { + var newLastIndex int64 + if !rx.pattern.global && len(found) > 0 { + newLastIndex = int64(found[len(found)-1][1]) } - } else { - rx.updateLastIndex(index, nil, nil) + rx.setOwnStr("lastIndex", intToValue(newLastIndex), true) } return stringReplace(s, found, replaceStr, rcall) diff --git a/vendor/github.com/dop251/goja/regexp.go b/vendor/github.com/dop251/goja/regexp.go index f70c34d954..0fd1370293 100644 --- a/vendor/github.com/dop251/goja/regexp.go +++ b/vendor/github.com/dop251/goja/regexp.go @@ -2,13 +2,14 @@ package goja import ( "fmt" - "github.com/dlclark/regexp2" - "github.com/dop251/goja/unistring" "io" "regexp" "sort" "strings" "unicode/utf16" + + "github.com/dlclark/regexp2" + "github.com/dop251/goja/unistring" ) type regexp2MatchCache struct { @@ -538,33 +539,21 @@ func (r *regexpObject) getLastIndex() int64 { return lastIndex } -func (r *regexpObject) updateLastIndex(index int64, firstResult, lastResult []int) bool { - if r.pattern.sticky { - if firstResult == nil || int64(firstResult[0]) != index { - r.setOwnStr("lastIndex", intToValue(0), true) - return false - } - } else { - if firstResult == nil { - if r.pattern.global { - r.setOwnStr("lastIndex", intToValue(0), true) - } - return false - } - } - - if r.pattern.global || r.pattern.sticky { - r.setOwnStr("lastIndex", intToValue(int64(lastResult[1])), true) - } - return true -} - func (r *regexpObject) execRegexp(target String) (match bool, result []int) { index := r.getLastIndex() if index >= 0 && index <= int64(target.Length()) { result = r.pattern.findSubmatchIndex(target, int(index)) } - match = r.updateLastIndex(index, result, result) + match = len(result) > 0 && (!r.pattern.sticky || int64(result[0]) == index) + + if r.pattern.global || r.pattern.sticky { + var newLastIndex int64 + if match { + newLastIndex = int64(result[1]) + } + r.setOwnStr("lastIndex", intToValue(newLastIndex), true) + } + return } diff --git a/vendor/github.com/jedib0t/go-pretty/v6/progress/progress.go b/vendor/github.com/jedib0t/go-pretty/v6/progress/progress.go index 8d101f7896..c20523d7cf 100644 --- a/vendor/github.com/jedib0t/go-pretty/v6/progress/progress.go +++ b/vendor/github.com/jedib0t/go-pretty/v6/progress/progress.go @@ -353,9 +353,11 @@ func (p *Progress) initForRender() { p.updateFrequency = DefaultUpdateFrequency } - // get the current terminal size for preventing roll-overs, and do this in a - // background loop until end of render - go p.watchTerminalSize() // needs p.updateFrequency + if p.outputWriter == os.Stdout { + // get the current terminal size for preventing roll-overs, and do this in a + // background loop until end of render. This only works if the output writer is STDOUT. + go p.watchTerminalSize() // needs p.updateFrequency + } } func (p *Progress) updateTerminalSize() { diff --git a/vendor/modernc.org/sqlite/CONTRIBUTORS b/vendor/modernc.org/sqlite/CONTRIBUTORS index 625b7dcd2c..8c09cfcea0 100644 --- a/vendor/modernc.org/sqlite/CONTRIBUTORS +++ b/vendor/modernc.org/sqlite/CONTRIBUTORS @@ -38,5 +38,6 @@ Sean McGivern Steffen Butzer Toni Spets W. Michael Petullo +Walter Wanderley Yaacov Akiba Slama Prathyush PV diff --git a/vendor/modules.txt b/vendor/modules.txt index f4a63aa396..f6411ffaa8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 +# github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 ## explicit; go 1.23.0 github.com/Azure/azure-sdk-for-go/sdk/azcore github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud @@ -61,7 +61,7 @@ github.com/CortexFoundation/robot/backend # github.com/CortexFoundation/statik v0.0.0-20210315012922-8bb8a7b5dc66 ## explicit; go 1.16 github.com/CortexFoundation/statik -# github.com/CortexFoundation/torrentfs v1.0.73-0.20251014112104-18ee6a47ca04 +# github.com/CortexFoundation/torrentfs v1.0.73-0.20251104103338-c63cf48e29f3 ## explicit; go 1.24.4 github.com/CortexFoundation/torrentfs github.com/CortexFoundation/torrentfs/backend @@ -81,7 +81,7 @@ github.com/Microsoft/go-winio/internal/fs github.com/Microsoft/go-winio/internal/socket github.com/Microsoft/go-winio/internal/stringbuffer github.com/Microsoft/go-winio/pkg/guid -# github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251101005303-90401b9f2bb6 +# github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251106012722-c7be33e82a11 ## explicit; go 1.24.0 github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime # github.com/RoaringBitmap/roaring v1.9.4 @@ -217,7 +217,7 @@ github.com/arsham/figurine/figurine # github.com/arsham/rainbow v1.2.1 ## explicit; go 1.18 github.com/arsham/rainbow/rainbow -# github.com/aws/aws-sdk-go-v2 v1.39.5 +# github.com/aws/aws-sdk-go-v2 v1.39.6 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/aws github.com/aws/aws-sdk-go-v2/aws/defaults @@ -243,10 +243,10 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults github.com/aws/aws-sdk-go-v2/internal/strings github.com/aws/aws-sdk-go-v2/internal/sync/singleflight github.com/aws/aws-sdk-go-v2/internal/timeconv -# github.com/aws/aws-sdk-go-v2/config v1.31.16 +# github.com/aws/aws-sdk-go-v2/config v1.31.17 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.18.20 +# github.com/aws/aws-sdk-go-v2/credentials v1.18.21 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds @@ -255,47 +255,47 @@ github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 # github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/ini -# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 +# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/route53 v1.59.2 +# github.com/aws/aws-sdk-go-v2/service/route53 v1.59.3 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/route53 github.com/aws/aws-sdk-go-v2/service/route53/internal/customizations github.com/aws/aws-sdk-go-v2/service/route53/internal/endpoints github.com/aws/aws-sdk-go-v2/service/route53/types -# github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 +# github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 +# github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sts/types -# github.com/aws/smithy-go v1.23.1 +# github.com/aws/smithy-go v1.23.2 ## explicit; go 1.23 github.com/aws/smithy-go github.com/aws/smithy-go/auth @@ -353,14 +353,14 @@ github.com/cespare/xxhash/v2 # github.com/charmbracelet/bubbletea v1.3.10 ## explicit; go 1.24.0 github.com/charmbracelet/bubbletea -# github.com/charmbracelet/colorprofile v0.3.2 -## explicit; go 1.23.0 +# github.com/charmbracelet/colorprofile v0.3.3 +## explicit; go 1.24.2 github.com/charmbracelet/colorprofile # github.com/charmbracelet/lipgloss v1.1.0 ## explicit; go 1.18 github.com/charmbracelet/lipgloss -# github.com/charmbracelet/x/ansi v0.10.2 -## explicit; go 1.24.0 +# github.com/charmbracelet/x/ansi v0.11.0 +## explicit; go 1.24.2 github.com/charmbracelet/x/ansi github.com/charmbracelet/x/ansi/parser # github.com/charmbracelet/x/cellbuf v0.0.13 @@ -369,6 +369,9 @@ github.com/charmbracelet/x/cellbuf # github.com/charmbracelet/x/term v0.2.2 ## explicit; go 1.24.0 github.com/charmbracelet/x/term +# github.com/clipperhouse/displaywidth v0.4.1 +## explicit; go 1.18 +github.com/clipperhouse/displaywidth # github.com/clipperhouse/stringish v0.1.1 ## explicit; go 1.18 github.com/clipperhouse/stringish @@ -535,7 +538,7 @@ github.com/dgraph-io/ristretto/v2/z/simd ## explicit; go 1.13 github.com/dlclark/regexp2 github.com/dlclark/regexp2/syntax -# github.com/dop251/goja v0.0.0-20251008123653-cf18d89f3cf6 +# github.com/dop251/goja v0.0.0-20251103141225-af2ceb9156d7 ## explicit; go 1.20 github.com/dop251/goja github.com/dop251/goja/ast @@ -729,7 +732,7 @@ github.com/influxdata/line-protocol # github.com/jackpal/go-nat-pmp v1.0.2 ## explicit github.com/jackpal/go-nat-pmp -# github.com/jedib0t/go-pretty/v6 v6.6.9 +# github.com/jedib0t/go-pretty/v6 v6.7.0 ## explicit; go 1.18 github.com/jedib0t/go-pretty/v6/progress github.com/jedib0t/go-pretty/v6/text @@ -1103,7 +1106,7 @@ github.com/ucwong/filecache # github.com/ucwong/go-ttlmap v1.0.2-0.20221020173635-331e7ddde2bb ## explicit; go 1.19 github.com/ucwong/go-ttlmap -# github.com/ucwong/golang-kv v1.0.24-0.20251012094715-3e5c407f0405 +# github.com/ucwong/golang-kv v1.0.24-0.20251104103105-e81670df077d ## explicit; go 1.24.0 github.com/ucwong/golang-kv github.com/ucwong/golang-kv/badger @@ -1394,7 +1397,7 @@ modernc.org/mathutil # modernc.org/memory v1.11.0 ## explicit; go 1.23.0 modernc.org/memory -# modernc.org/sqlite v1.39.1 +# modernc.org/sqlite v1.40.0 ## explicit; go 1.24.0 modernc.org/sqlite/lib # zombiezen.com/go/sqlite v1.4.2 From d04c1cdaa6ae5af805d894e9b7ff8a53c3c8e107 Mon Sep 17 00:00:00 2001 From: ucwong Date: Wed, 12 Nov 2025 19:03:24 +0800 Subject: [PATCH 2/2] validate hash length in no cgo Sign --- crypto/signature_nocgo.go | 7 +- go.mod | 2 +- go.sum | 4 +- .../charmbracelet/x/cellbuf/buffer.go | 15 +- .../charmbracelet/x/cellbuf/cell.go | 83 +++---- .../charmbracelet/x/cellbuf/geom.go | 2 +- .../charmbracelet/x/cellbuf/hardscroll.go | 19 +- .../charmbracelet/x/cellbuf/hashmap.go | 16 +- .../charmbracelet/x/cellbuf/link.go | 2 +- .../github.com/charmbracelet/x/cellbuf/pen.go | 92 +++++++ .../charmbracelet/x/cellbuf/screen.go | 225 +++++++++++------- .../charmbracelet/x/cellbuf/style.go | 4 +- .../charmbracelet/x/cellbuf/utils.go | 14 -- .../charmbracelet/x/cellbuf/wrap.go | 20 +- .../charmbracelet/x/cellbuf/writer.go | 29 +-- vendor/modules.txt | 4 +- 16 files changed, 332 insertions(+), 206 deletions(-) create mode 100644 vendor/github.com/charmbracelet/x/cellbuf/pen.go diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go index cadba081f7..067cf88ee0 100644 --- a/crypto/signature_nocgo.go +++ b/crypto/signature_nocgo.go @@ -43,6 +43,9 @@ func sigToPub(hash, sig []byte) (*secp256k1.PublicKey, error) { if len(sig) != SignatureLength { return nil, errors.New("invalid signature") } + if len(hash) != DigestLength { + return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(hash)) + } // Convert to secp256k1 input format with 'recovery id' v at the beginning. btcsig := make([]byte, SignatureLength) btcsig[0] = sig[RecoveryIDOffset] + 27 @@ -76,8 +79,8 @@ func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { // // The produced signature is in the [R || S || V] format where V is 0 or 1. func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) { - if len(hash) != 32 { - return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) + if len(hash) != DigestLength { + return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(hash)) } if prv.Curve != S256() { return nil, errors.New("private key curve is not secp256k1") diff --git a/go.mod b/go.mod index b0a98ce5c7..f201fe43d9 100644 --- a/go.mod +++ b/go.mod @@ -131,7 +131,7 @@ require ( github.com/charmbracelet/colorprofile v0.3.3 // indirect github.com/charmbracelet/lipgloss v1.1.0 // indirect github.com/charmbracelet/x/ansi v0.11.0 // indirect - github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/cellbuf v0.0.14 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect github.com/clipperhouse/displaywidth v0.4.1 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect diff --git a/go.sum b/go.sum index 81d4bae79b..9461453fe7 100644 --- a/go.sum +++ b/go.sum @@ -349,8 +349,8 @@ github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoF github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= github.com/charmbracelet/x/ansi v0.11.0 h1:uuIVK7GIplwX6UBIz8S2TF8nkr7xRlygSsBRjSJqIvA= github.com/charmbracelet/x/ansi v0.11.0/go.mod h1:uQt8bOrq/xgXjlGcFMc8U2WYbnxyjrKhnvTQluvfCaE= -github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= -github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4= +github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA= github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= diff --git a/vendor/github.com/charmbracelet/x/cellbuf/buffer.go b/vendor/github.com/charmbracelet/x/cellbuf/buffer.go index 790d1f7c4c..e144cc5617 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/buffer.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/buffer.go @@ -1,3 +1,4 @@ +// Package cellbuf provides terminal cell buffer functionality. package cellbuf import ( @@ -24,7 +25,7 @@ func NewCell(r rune, comb ...rune) (c *Cell) { } c.Comb = comb c.Width = runewidth.StringWidth(string(append([]rune{r}, comb...))) - return + return c } // NewCellString returns a new cell with the given string content. This is a @@ -46,7 +47,7 @@ func NewCellString(s string) (c *Cell) { c.Comb = append(c.Comb, r) } } - return + return c } // NewGraphemeCell returns a new cell. This is a convenience function that @@ -71,7 +72,7 @@ func newGraphemeCell(s string, w int) (c *Cell) { c.Comb = append(c.Comb, r) } } - return + return c } // Line represents a line in the terminal. @@ -104,7 +105,7 @@ func (l Line) String() (s string) { } } s = strings.TrimRight(s, " ") - return + return s } // At returns the cell at the given x position. @@ -150,7 +151,7 @@ func (l Line) set(x int, c *Cell, clone bool) bool { for j := 1; j < maxCellWidth && x-j >= 0; j++ { wide := l.At(x - j) if wide != nil && wide.Width > 1 && j < wide.Width { - for k := 0; k < wide.Width; k++ { + for k := range wide.Width { l[x-j+k] = wide.Clone().Blank() } break @@ -206,7 +207,7 @@ func (b *Buffer) String() (s string) { s += "\r\n" } } - return + return s } // Line returns a pointer to the line at the given y position. @@ -296,7 +297,7 @@ func (b *Buffer) FillRect(c *Cell, rect Rectangle) { } for y := rect.Min.Y; y < rect.Max.Y; y++ { for x := rect.Min.X; x < rect.Max.X; x += cellWidth { - b.setCell(x, y, c, false) //nolint:errcheck + b.setCell(x, y, c, false) } } } diff --git a/vendor/github.com/charmbracelet/x/cellbuf/cell.go b/vendor/github.com/charmbracelet/x/cellbuf/cell.go index 4d49d45ee5..cdb16e9c7c 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/cell.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/cell.go @@ -96,7 +96,7 @@ func (c *Cell) Clear() bool { func (c *Cell) Clone() (n *Cell) { n = new(Cell) *n = *c - return + return n } // Blank makes the cell a blank cell by setting the rune to a space, comb to @@ -164,12 +164,12 @@ type UnderlineStyle = ansi.UnderlineStyle // These are the available underline styles. const ( - NoUnderline = ansi.NoUnderlineStyle - SingleUnderline = ansi.SingleUnderlineStyle - DoubleUnderline = ansi.DoubleUnderlineStyle - CurlyUnderline = ansi.CurlyUnderlineStyle - DottedUnderline = ansi.DottedUnderlineStyle - DashedUnderline = ansi.DashedUnderlineStyle + NoUnderline = ansi.UnderlineStyleNone + SingleUnderline = ansi.UnderlineStyleSingle + DoubleUnderline = ansi.UnderlineStyleDouble + CurlyUnderline = ansi.UnderlineStyleCurly + DottedUnderline = ansi.UnderlineStyleDotted + DashedUnderline = ansi.UnderlineStyleDashed ) // Style represents the Style of a cell. @@ -189,7 +189,7 @@ func (s Style) Sequence() string { var b ansi.Style - if s.Attrs != 0 { + if s.Attrs != 0 { //nolint:nestif if s.Attrs&BoldAttr != 0 { b = b.Bold() } @@ -197,36 +197,31 @@ func (s Style) Sequence() string { b = b.Faint() } if s.Attrs&ItalicAttr != 0 { - b = b.Italic() + b = b.Italic(true) } if s.Attrs&SlowBlinkAttr != 0 { - b = b.SlowBlink() + b = b.Blink(true) } if s.Attrs&RapidBlinkAttr != 0 { - b = b.RapidBlink() + b = b.RapidBlink(true) } if s.Attrs&ReverseAttr != 0 { - b = b.Reverse() + b = b.Reverse(true) } if s.Attrs&ConcealAttr != 0 { - b = b.Conceal() + b = b.Conceal(true) } if s.Attrs&StrikethroughAttr != 0 { - b = b.Strikethrough() + b = b.Strikethrough(true) } } if s.UlStyle != NoUnderline { - switch s.UlStyle { - case SingleUnderline: - b = b.Underline() - case DoubleUnderline: - b = b.DoubleUnderline() - case CurlyUnderline: - b = b.CurlyUnderline() - case DottedUnderline: - b = b.DottedUnderline() - case DashedUnderline: - b = b.DashedUnderline() + switch u := s.UlStyle; u { + case NoUnderline: + b = b.Underline(false) + default: + b = b.Underline(true) + b = b.UnderlineStyle(u) } } if s.Fg != nil { @@ -268,64 +263,48 @@ func (s Style) DiffSequence(o Style) string { isNormal bool ) - if s.Attrs != o.Attrs { + if s.Attrs != o.Attrs { //nolint:nestif if s.Attrs&BoldAttr != o.Attrs&BoldAttr { if s.Attrs&BoldAttr != 0 { b = b.Bold() } else if !isNormal { isNormal = true - b = b.NormalIntensity() + b = b.Normal() } } if s.Attrs&FaintAttr != o.Attrs&FaintAttr { if s.Attrs&FaintAttr != 0 { b = b.Faint() } else if !isNormal { - b = b.NormalIntensity() + b = b.Normal() } } if s.Attrs&ItalicAttr != o.Attrs&ItalicAttr { - if s.Attrs&ItalicAttr != 0 { - b = b.Italic() - } else { - b = b.NoItalic() - } + b = b.Italic(s.Attrs&ItalicAttr != 0) } if s.Attrs&SlowBlinkAttr != o.Attrs&SlowBlinkAttr { if s.Attrs&SlowBlinkAttr != 0 { - b = b.SlowBlink() + b = b.Blink(true) } else if !noBlink { noBlink = true - b = b.NoBlink() + b = b.Blink(false) } } if s.Attrs&RapidBlinkAttr != o.Attrs&RapidBlinkAttr { if s.Attrs&RapidBlinkAttr != 0 { - b = b.RapidBlink() + b = b.RapidBlink(true) } else if !noBlink { - b = b.NoBlink() + b = b.Blink(false) } } if s.Attrs&ReverseAttr != o.Attrs&ReverseAttr { - if s.Attrs&ReverseAttr != 0 { - b = b.Reverse() - } else { - b = b.NoReverse() - } + b = b.Reverse(s.Attrs&ReverseAttr != 0) } if s.Attrs&ConcealAttr != o.Attrs&ConcealAttr { - if s.Attrs&ConcealAttr != 0 { - b = b.Conceal() - } else { - b = b.NoConceal() - } + b = b.Conceal(s.Attrs&ConcealAttr != 0) } if s.Attrs&StrikethroughAttr != o.Attrs&StrikethroughAttr { - if s.Attrs&StrikethroughAttr != 0 { - b = b.Strikethrough() - } else { - b = b.NoStrikethrough() - } + b = b.Strikethrough(s.Attrs&StrikethroughAttr != 0) } } diff --git a/vendor/github.com/charmbracelet/x/cellbuf/geom.go b/vendor/github.com/charmbracelet/x/cellbuf/geom.go index c12e6fb1dc..7232e76f6d 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/geom.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/geom.go @@ -12,7 +12,7 @@ func Pos(x, y int) Position { return image.Pt(x, y) } -// Rectange represents a rectangle. +// Rectangle represents a rectangle. type Rectangle = image.Rectangle // Rect is a shorthand for Rectangle. diff --git a/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go b/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go index 402ac06a69..a55fcc7047 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go @@ -75,7 +75,7 @@ func (s *Screen) scrolln(n, top, bot, maxY int) (v bool) { //nolint:unparam ) blank := s.clearBlank() - if n > 0 { + if n > 0 { //nolint:nestif // Scroll up (forward) v = s.scrollUp(n, top, bot, 0, maxY, blank) if !v { @@ -99,7 +99,7 @@ func (s *Screen) scrolln(n, top, bot, maxY int) (v bool) { //nolint:unparam s.move(0, bot-n+1) s.clearToBottom(nil) } else { - for i := 0; i < n; i++ { + for i := range n { s.move(0, bot-i) s.clearToEnd(nil, false) } @@ -124,7 +124,7 @@ func (s *Screen) scrolln(n, top, bot, maxY int) (v bool) { //nolint:unparam // Clear newly shifted-in lines. if v && (nonDestScrollRegion || (memoryBelow && top == 0)) { - for i := 0; i < -n; i++ { + for i := range -n { s.move(0, top+i) s.clearToEnd(nil, false) } @@ -133,7 +133,7 @@ func (s *Screen) scrolln(n, top, bot, maxY int) (v bool) { //nolint:unparam } if !v { - return + return v } s.scrollBuffer(s.curbuf, n, top, bot, blank) @@ -193,7 +193,7 @@ func (s *Screen) touchLine(width, height, y, n int, changed bool) { // scrollUp scrolls the screen up by n lines. func (s *Screen) scrollUp(n, top, bot, minY, maxY int, blank *Cell) bool { - if n == 1 && top == minY && bot == maxY { + if n == 1 && top == minY && bot == maxY { //nolint:nestif s.move(0, bot) s.updatePen(blank) s.buf.WriteByte('\n') @@ -202,13 +202,14 @@ func (s *Screen) scrollUp(n, top, bot, minY, maxY int, blank *Cell) bool { s.updatePen(blank) s.buf.WriteString(ansi.DeleteLine(1)) } else if top == minY && bot == maxY { - if s.xtermLike { + supportsSU := s.caps.Contains(capSU) + if supportsSU { s.move(0, bot) } else { s.move(0, top) } s.updatePen(blank) - if s.xtermLike { + if supportsSU { s.buf.WriteString(ansi.ScrollUp(n)) } else { s.buf.WriteString(strings.Repeat("\n", n)) @@ -225,7 +226,7 @@ func (s *Screen) scrollUp(n, top, bot, minY, maxY int, blank *Cell) bool { // scrollDown scrolls the screen down by n lines. func (s *Screen) scrollDown(n, top, bot, minY, maxY int, blank *Cell) bool { - if n == 1 && top == minY && bot == maxY { + if n == 1 && top == minY && bot == maxY { //nolint:nestif s.move(0, top) s.updatePen(blank) s.buf.WriteString(ansi.ReverseIndex) @@ -236,7 +237,7 @@ func (s *Screen) scrollDown(n, top, bot, minY, maxY int, blank *Cell) bool { } else if top == minY && bot == maxY { s.move(0, top) s.updatePen(blank) - if s.xtermLike { + if s.caps.Contains(capSD) { s.buf.WriteString(ansi.ScrollDown(n)) } else { s.buf.WriteString(strings.Repeat(ansi.ReverseIndex, n)) diff --git a/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go b/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go index 0d25b5492c..f4e088619c 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go @@ -15,7 +15,7 @@ func hash(l Line) (h uint64) { } h += (h << 5) + uint64(r) } - return + return h } // hashmap represents a single [Line] hash. @@ -33,7 +33,7 @@ func (s *Screen) updateHashmap() { height := s.newbuf.Height() if len(s.oldhash) >= height && len(s.newhash) >= height { // rehash changed lines - for i := 0; i < height; i++ { + for i := range height { _, ok := s.touch[i] if ok { s.oldhash[i] = hash(s.curbuf.Line(i)) @@ -48,14 +48,14 @@ func (s *Screen) updateHashmap() { if len(s.newhash) != height { s.newhash = make([]uint64, height) } - for i := 0; i < height; i++ { + for i := range height { s.oldhash[i] = hash(s.curbuf.Line(i)) s.newhash[i] = hash(s.newbuf.Line(i)) } } s.hashtab = make([]hashmap, height*2) - for i := 0; i < height; i++ { + for i := range height { hashval := s.oldhash[i] // Find matching hash or empty slot @@ -71,7 +71,7 @@ func (s *Screen) updateHashmap() { s.hashtab[idx].oldcount++ s.hashtab[idx].oldindex = i } - for i := 0; i < height; i++ { + for i := range height { hashval := s.newhash[i] // Find matching hash or empty slot @@ -130,7 +130,7 @@ func (s *Screen) updateHashmap() { s.growHunks() } -// scrollOldhash +// scrollOldhash. func (s *Screen) scrollOldhash(n, top, bot int) { if len(s.oldhash) == 0 { return @@ -287,7 +287,7 @@ func (s *Screen) updateCost(from, to Line) (cost int) { cost++ } } - return + return cost } func (s *Screen) updateCostBlank(to Line) (cost int) { @@ -297,5 +297,5 @@ func (s *Screen) updateCostBlank(to Line) (cost int) { cost++ } } - return + return cost } diff --git a/vendor/github.com/charmbracelet/x/cellbuf/link.go b/vendor/github.com/charmbracelet/x/cellbuf/link.go index 112f8e8ab6..7bf9f382f2 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/link.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/link.go @@ -4,7 +4,7 @@ import ( "github.com/charmbracelet/colorprofile" ) -// Convert converts a hyperlink to respect the given color profile. +// ConvertLink converts a hyperlink to respect the given color profile. func ConvertLink(h Link, p colorprofile.Profile) Link { if p == colorprofile.NoTTY { return Link{} diff --git a/vendor/github.com/charmbracelet/x/cellbuf/pen.go b/vendor/github.com/charmbracelet/x/cellbuf/pen.go new file mode 100644 index 0000000000..49744e1d94 --- /dev/null +++ b/vendor/github.com/charmbracelet/x/cellbuf/pen.go @@ -0,0 +1,92 @@ +package cellbuf + +import ( + "io" + + "github.com/charmbracelet/x/ansi" +) + +// PenWriter is a writer that writes to a buffer and keeps track of the current +// pen style and link state for the purpose of wrapping with newlines. +type PenWriter struct { + w io.Writer + p *ansi.Parser + style Style + link Link +} + +// NewPenWriter returns a new PenWriter. +func NewPenWriter(w io.Writer) *PenWriter { + pw := &PenWriter{w: w} + pw.p = ansi.GetParser() + handleCsi := func(cmd ansi.Cmd, params ansi.Params) { + if cmd == 'm' { + ReadStyle(params, &pw.style) + } + } + handleOsc := func(cmd int, data []byte) { + if cmd == 8 { + ReadLink(data, &pw.link) + } + } + pw.p.SetHandler(ansi.Handler{ + HandleCsi: handleCsi, + HandleOsc: handleOsc, + }) + return pw +} + +// Style returns the current pen style. +func (w *PenWriter) Style() Style { + return w.style +} + +// Link returns the current pen link. +func (w *PenWriter) Link() Link { + return w.link +} + +// Write writes to the buffer. +func (w *PenWriter) Write(p []byte) (int, error) { + for i := range p { + b := p[i] + w.p.Advance(b) + if b == '\n' { + if !w.style.Empty() { + _, _ = w.w.Write([]byte(ansi.ResetStyle)) + } + if !w.link.Empty() { + _, _ = w.w.Write([]byte(ansi.ResetHyperlink())) + } + } + + _, _ = w.w.Write([]byte{b}) + if b == '\n' { + if !w.link.Empty() { + _, _ = w.w.Write([]byte(ansi.SetHyperlink(w.link.URL, w.link.Params))) + } + if !w.style.Empty() { + _, _ = w.w.Write([]byte(w.style.Sequence())) + } + } + } + + return len(p), nil +} + +// Close closes the writer, resets the style and link if necessary, and releases +// its parser. Calling it is performance critical, but forgetting it does not +// cause safety issues or leaks. +func (w *PenWriter) Close() error { + if !w.style.Empty() { + _, _ = w.w.Write([]byte(ansi.ResetStyle)) + } + if !w.link.Empty() { + _, _ = w.w.Write([]byte(ansi.ResetHyperlink())) + } + if w.p != nil { + ansi.PutParser(w.p) + w.p = nil + } + return nil +} diff --git a/vendor/github.com/charmbracelet/x/cellbuf/screen.go b/vendor/github.com/charmbracelet/x/cellbuf/screen.go index 963b9cac36..be997787e1 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/screen.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/screen.go @@ -39,9 +39,9 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa var seq strings.Builder width, height := s.newbuf.Width(), s.newbuf.Height() - if ty != fy { + if ty != fy { //nolint:nestif var yseq string - if s.xtermLike && !s.opts.RelativeCursor { + if s.caps.Contains(capVPA) && !s.opts.RelativeCursor { yseq = ansi.VerticalPositionAbsolute(ty + 1) } @@ -54,9 +54,13 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa } shouldScroll := !s.opts.AltScreen && fy+n >= s.scrollHeight if lf := strings.Repeat("\n", n); shouldScroll || (fy+n < height && len(lf) < len(yseq)) { + //nolint:godox // TODO: Ensure we're not unintentionally scrolling the screen down. yseq = lf s.scrollHeight = max(s.scrollHeight, fy+n) + if s.opts.MapNL { + fx = 0 + } } } else if ty < fy { n := fy - ty @@ -64,6 +68,7 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa yseq = cuu } if n == 1 && fy-1 > 0 { + //nolint:godox // TODO: Ensure we're not unintentionally scrolling the screen up. yseq = ansi.ReverseIndex } @@ -72,9 +77,9 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa seq.WriteString(yseq) } - if tx != fx { + if tx != fx { //nolint:nestif var xseq string - if s.xtermLike && !s.opts.RelativeCursor { + if s.caps.Contains(capHPA) && !s.opts.RelativeCursor { xseq = ansi.HorizontalPositionAbsolute(tx + 1) } @@ -93,7 +98,8 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa if tabs > 0 { cht := ansi.CursorHorizontalForwardTab(tabs) tab := strings.Repeat("\t", tabs) - if false && s.xtermLike && len(cht) < len(tab) { + if false && s.caps.Contains(capCHT) && len(cht) < len(tab) { + //nolint:godox // TODO: The linux console and some terminals such as // Alacritty don't support [ansi.CHT]. Enable this when // we have a way to detect this, or after 5 years when @@ -144,7 +150,7 @@ func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBa } } else if tx < fx { n := fx - tx - if useTabs && s.xtermLike { + if useTabs && s.caps.Contains(capCBT) { // VT100 does not support backward tabs [ansi.CBT]. col := fx @@ -190,7 +196,7 @@ func moveCursor(s *Screen, x, y int, overwrite bool) (seq string) { // Method #0: Use [ansi.CUP] if the distance is long. seq = ansi.CursorPosition(x+1, y+1) if fx == -1 || fy == -1 || notLocal(s.newbuf.Width(), fx, fy, x, y) { - return + return seq } } @@ -234,7 +240,7 @@ func moveCursor(s *Screen, x, y int, overwrite bool) (seq string) { } } - return + return seq } // moveCursor moves the cursor to the specified position. @@ -242,10 +248,10 @@ func (s *Screen) moveCursor(x, y int, overwrite bool) { if !s.opts.AltScreen && s.cur.X == -1 && s.cur.Y == -1 { // First cursor movement in inline mode, move the cursor to the first // column before moving to the target position. - s.buf.WriteByte('\r') //nolint:errcheck + s.buf.WriteByte('\r') s.cur.X, s.cur.Y = 0, 0 } - s.buf.WriteString(moveCursor(s, x, y, overwrite)) //nolint:errcheck + s.buf.WriteString(moveCursor(s, x, y, overwrite)) s.cur.X, s.cur.Y = x, y } @@ -274,10 +280,11 @@ func (s *Screen) move(x, y int) { // Reset wrap around (phantom cursor) state if s.atPhantom { s.cur.X = 0 - s.buf.WriteByte('\r') //nolint:errcheck - s.atPhantom = false // reset phantom cell state + s.buf.WriteByte('\r') + s.atPhantom = false // reset phantom cell state } + //nolint:godox // TODO: Investigate if we need to handle this case and/or if we need the // following code. // @@ -291,7 +298,7 @@ func (s *Screen) move(x, y int) { // // if l > 0 { // s.cur.X = 0 - // s.buf.WriteString("\r" + strings.Repeat("\n", l)) //nolint:errcheck + // s.buf.WriteString("\r" + strings.Repeat("\n", l)) // } // } @@ -339,6 +346,10 @@ type ScreenOptions struct { HardTabs bool // Backspace is whether to use backspace characters to move the cursor. Backspace bool + // MapNL whether we have ONLCR mapping enabled. When we set the terminal to + // raw mode, the ONLCR mode gets disabled. ONLCR maps any newline/linefeed + // (`\n`) character to carriage return + line feed (`\r\n`). + MapNL bool } // lineData represents the metadata for a line. @@ -365,13 +376,13 @@ type Screen struct { opts ScreenOptions mu sync.Mutex method ansi.Method - scrollHeight int // keeps track of how many lines we've scrolled down (inline mode) - altScreenMode bool // whether alternate screen mode is enabled - cursorHidden bool // whether text cursor mode is enabled - clear bool // whether to force clear the screen - xtermLike bool // whether to use xterm-like optimizations, otherwise, it uses vt100 only - queuedText bool // whether we have queued non-zero width text queued up - atPhantom bool // whether the cursor is out of bounds and at a phantom cell + scrollHeight int // keeps track of how many lines we've scrolled down (inline mode) + altScreenMode bool // whether alternate screen mode is enabled + cursorHidden bool // whether text cursor mode is enabled + clear bool // whether to force clear the screen + caps capabilities // terminal control sequence capabilities + queuedText bool // whether we have queued non-zero width text queued up + atPhantom bool // whether the cursor is out of bounds and at a phantom cell } // SetMethod sets the method used to calculate the width of cells. @@ -491,36 +502,77 @@ func (s *Screen) FillRect(cell *Cell, r Rectangle) bool { return true } -// isXtermLike returns whether the terminal is xterm-like. This means that the +// capabilities represents a mask of supported ANSI escape sequences. +type capabilities uint + +const ( + // Vertical Position Absolute [ansi.VPA]. + capVPA capabilities = 1 << iota + // Horizontal Position Absolute [ansi.HPA]. + capHPA + // Cursor Horizontal Tab [ansi.CHT]. + capCHT + // Cursor Backward Tab [ansi.CBT]. + capCBT + // Repeat Previous Character [ansi.REP]. + capREP + // Erase Character [ansi.ECH]. + capECH + // Insert Character [ansi.ICH]. + capICH + // Scroll Down [ansi.SD]. + capSD + // Scroll Up [ansi.SU]. + capSU + + noCaps capabilities = 0 + allCaps = capVPA | capHPA | capCHT | capCBT | capREP | capECH | capICH | + capSD | capSU +) + +// Contains returns whether the capabilities contains the given capability. +func (v capabilities) Contains(c capabilities) bool { + return v&c == c +} + +// xtermCaps returns whether the terminal is xterm-like. This means that the // terminal supports ECMA-48 and ANSI X3.64 escape sequences. -// TODO: Should this be a lookup table into each $TERM terminfo database? Like -// we could keep a map of ANSI escape sequence to terminfo capability name and -// check if the database supports the escape sequence. Instead of keeping a -// list of terminal names here. -func isXtermLike(termtype string) (v bool) { +// xtermCaps returns a list of control sequence capabilities for the given +// terminal type. This only supports a subset of sequences that can +// be different among terminals. +// NOTE: A hybrid approach would be to support Terminfo databases for a full +// set of capabilities. +func xtermCaps(termtype string) (v capabilities) { parts := strings.Split(termtype, "-") if len(parts) == 0 { - return + return v } switch parts[0] { case - "alacritty", "contour", "foot", "ghostty", "kitty", - "linux", "rio", - "screen", "st", "tmux", "wezterm", "xterm": - v = true - } - - return + v = allCaps + case "alacritty": + v = allCaps + v &^= capCHT // NOTE: alacritty added support for [ansi.CHT] in 2024-12-28 #62d5b13. + case "screen": + // See https://www.gnu.org/software/screen/manual/screen.html#Control-Sequences-1 + v = allCaps + v &^= capREP + case "linux": + // See https://man7.org/linux/man-pages/man4/console_codes.4.html + v = capVPA | capHPA | capECH | capICH + } + + return v } // NewScreen creates a new Screen. @@ -548,14 +600,14 @@ func NewScreen(w io.Writer, width, height int, opts *ScreenOptions) (s *Screen) } s.buf = new(bytes.Buffer) - s.xtermLike = isXtermLike(s.opts.Term) + s.caps = xtermCaps(s.opts.Term) s.curbuf = NewBuffer(width, height) s.newbuf = NewBuffer(width, height) s.cur = Cursor{Position: Pos(-1, -1)} // start at -1 to force a move s.saved = s.cur s.reset() - return + return s } // Width returns the width of the screen. @@ -595,7 +647,7 @@ func (s *Screen) putCell(cell *Cell) { // wrapCursor wraps the cursor to the next line. // -//nolint:unused + func (s *Screen) wrapCursor() { const autoRightMargin = true if autoRightMargin { @@ -628,9 +680,9 @@ func (s *Screen) putAttrCell(cell *Cell) { } s.updatePen(cell) - s.buf.WriteRune(cell.Rune) //nolint:errcheck + s.buf.WriteRune(cell.Rune) for _, c := range cell.Comb { - s.buf.WriteRune(c) //nolint:errcheck + s.buf.WriteRune(c) } s.cur.X += cell.Width @@ -649,12 +701,12 @@ func (s *Screen) putCellLR(cell *Cell) { // Optimize for the lower right corner cell. curX := s.cur.X if cell == nil || !cell.Empty() { - s.buf.WriteString(ansi.ResetAutoWrapMode) //nolint:errcheck + s.buf.WriteString(ansi.ResetModeAutoWrap) s.putAttrCell(cell) // Writing to lower-right corner cell should not wrap. s.atPhantom = false s.cur.X = curX - s.buf.WriteString(ansi.SetAutoWrapMode) //nolint:errcheck + s.buf.WriteString(ansi.SetModeAutoWrap) } } @@ -675,11 +727,11 @@ func (s *Screen) updatePen(cell *Cell) { if cell.Style.Empty() && len(seq) > len(ansi.ResetStyle) { seq = ansi.ResetStyle } - s.buf.WriteString(seq) //nolint:errcheck + s.buf.WriteString(seq) s.cur.Style = cell.Style } if !cell.Link.Equal(&s.cur.Link) { - s.buf.WriteString(ansi.SetHyperlink(cell.Link.URL, cell.Link.Params)) //nolint:errcheck + s.buf.WriteString(ansi.SetHyperlink(cell.Link.URL, cell.Link.Params)) s.cur.Link = cell.Link } } @@ -712,9 +764,9 @@ func (s *Screen) emitRange(line Line, n int) (eoi bool) { ech := ansi.EraseCharacter(count) cup := ansi.CursorPosition(s.cur.X+count, s.cur.Y) rep := ansi.RepeatPreviousCharacter(count) - if s.xtermLike && count > len(ech)+len(cup) && cell0 != nil && cell0.Clear() { + if s.caps.Contains(capECH) && count > len(ech)+len(cup) && cell0 != nil && cell0.Clear() { //nolint:nestif s.updatePen(cell0) - s.buf.WriteString(ech) //nolint:errcheck + s.buf.WriteString(ech) // If this is the last cell, we don't need to move the cursor. if count < n { @@ -722,7 +774,7 @@ func (s *Screen) emitRange(line Line, n int) (eoi bool) { } else { return true // cursor in the middle } - } else if s.xtermLike && count > len(rep) && + } else if s.caps.Contains(capREP) && count > len(rep) && (cell0 == nil || (len(cell0.Comb) == 0 && cell0.Rune < 256)) { // We only support ASCII characters. Most terminals will handle // non-ASCII characters correctly, but some might not, ahem xterm. @@ -740,13 +792,13 @@ func (s *Screen) emitRange(line Line, n int) (eoi bool) { s.putCell(cell0) repCount-- // cell0 is a single width cell ASCII character - s.buf.WriteString(ansi.RepeatPreviousCharacter(repCount)) //nolint:errcheck + s.buf.WriteString(ansi.RepeatPreviousCharacter(repCount)) s.cur.X += repCount if wrapPossible { s.putCell(cell0) } } else { - for i := 0; i < count; i++ { + for i := range count { s.putCell(line.At(i)) } } @@ -755,7 +807,7 @@ func (s *Screen) emitRange(line Line, n int) (eoi bool) { n -= count } - return + return eoi } // putRange puts a range of cells from the old line to the new line. @@ -765,7 +817,7 @@ func (s *Screen) putRange(oldLine, newLine Line, y, start, end int) (eoi bool) { inline := min(len(ansi.CursorPosition(start+1, y+1)), min(len(ansi.HorizontalPositionAbsolute(start+1)), len(ansi.CursorForward(start+1)))) - if (end - start + 1) > inline { + if (end - start + 1) > inline { //nolint:nestif var j, same int for j, same = start, 0; j <= end; j++ { oldCell, newCell := oldLine.At(j), newLine.At(j) @@ -817,9 +869,9 @@ func (s *Screen) clearToEnd(blank *Cell, force bool) { //nolint:unparam s.updatePen(blank) count := s.newbuf.Width() - s.cur.X if s.el0Cost() <= count { - s.buf.WriteString(ansi.EraseLineRight) //nolint:errcheck + s.buf.WriteString(ansi.EraseLineRight) } else { - for i := 0; i < count; i++ { + for range count { s.putCell(blank) } } @@ -839,12 +891,13 @@ func (s *Screen) clearBlank() *Cell { // insertCells inserts the count cells pointed by the given line at the current // cursor position. func (s *Screen) insertCells(line Line, count int) { - if s.xtermLike { + supportsICH := s.caps.Contains(capICH) + if supportsICH { // Use [ansi.ICH] as an optimization. - s.buf.WriteString(ansi.InsertCharacter(count)) //nolint:errcheck + s.buf.WriteString(ansi.InsertCharacter(count)) } else { // Otherwise, use [ansi.IRM] mode. - s.buf.WriteString(ansi.SetInsertReplaceMode) //nolint:errcheck + s.buf.WriteString(ansi.SetModeInsertReplace) } for i := 0; count > 0; i++ { @@ -852,8 +905,8 @@ func (s *Screen) insertCells(line Line, count int) { count-- } - if !s.xtermLike { - s.buf.WriteString(ansi.ResetInsertReplaceMode) //nolint:errcheck + if !supportsICH { + s.buf.WriteString(ansi.ResetModeInsertReplace) } } @@ -862,7 +915,7 @@ func (s *Screen) insertCells(line Line, count int) { // [ansi.EL] 0 i.e. [ansi.EraseLineRight] to clear // trailing spaces. func (s *Screen) el0Cost() int { - if s.xtermLike { + if s.caps != noCaps { return 0 } return len(ansi.EraseLineRight) @@ -878,7 +931,7 @@ func (s *Screen) transformLine(y int) { // Find the first changed cell in the line var lineChanged bool - for i := 0; i < s.newbuf.Width(); i++ { + for i := range s.newbuf.Width() { if !cellEqual(newLine.At(i), oldLine.At(i)) { lineChanged = true break @@ -886,7 +939,7 @@ func (s *Screen) transformLine(y int) { } const ceolStandoutGlitch = false - if ceolStandoutGlitch && lineChanged { + if ceolStandoutGlitch && lineChanged { //nolint:nestif s.move(0, y) s.clearToEnd(nil, false) s.putRange(oldLine, newLine, y, 0, s.newbuf.Width()-1) @@ -897,12 +950,12 @@ func (s *Screen) transformLine(y int) { // [ansi.EraseLineLeft]. if blank == nil || blank.Clear() { var oFirstCell, nFirstCell int - for oFirstCell = 0; oFirstCell < s.curbuf.Width(); oFirstCell++ { + for oFirstCell = range s.curbuf.Width() { if !cellEqual(oldLine.At(oFirstCell), blank) { break } } - for nFirstCell = 0; nFirstCell < s.newbuf.Width(); nFirstCell++ { + for nFirstCell = range s.newbuf.Width() { if !cellEqual(newLine.At(nFirstCell), blank) { break } @@ -925,11 +978,11 @@ func (s *Screen) transformLine(y int) { if nFirstCell >= s.newbuf.Width() { s.move(0, y) s.updatePen(blank) - s.buf.WriteString(ansi.EraseLineRight) //nolint:errcheck + s.buf.WriteString(ansi.EraseLineRight) } else { s.move(nFirstCell-1, y) s.updatePen(blank) - s.buf.WriteString(ansi.EraseLineLeft) //nolint:errcheck + s.buf.WriteString(ansi.EraseLineLeft) } for firstCell < nFirstCell { @@ -1045,7 +1098,7 @@ func (s *Screen) transformLine(y int) { s.move(n+1, y) ichCost := 3 + nLastCell - oLastCell - if s.xtermLike && (nLastCell < nLastNonBlank || ichCost > (m-n)) { + if s.caps.Contains(capICH) && (nLastCell < nLastNonBlank || ichCost > (m-n)) { s.putRange(oldLine, newLine, y, n+1, m) } else { s.insertCells(newLine[n+1:], nLastCell-oLastCell) @@ -1079,7 +1132,7 @@ func (s *Screen) transformLine(y int) { func (s *Screen) deleteCells(count int) { // [ansi.DCH] will shift in cells from the right margin so we need to // ensure that they are the right style. - s.buf.WriteString(ansi.DeleteCharacter(count)) //nolint:errcheck + s.buf.WriteString(ansi.DeleteCharacter(count)) } // clearToBottom clears the screen from the current cursor position to the end @@ -1091,7 +1144,7 @@ func (s *Screen) clearToBottom(blank *Cell) { } s.updatePen(blank) - s.buf.WriteString(ansi.EraseScreenBelow) //nolint:errcheck + s.buf.WriteString(ansi.EraseScreenBelow) // Clear the rest of the current line s.curbuf.ClearRect(Rect(col, row, s.curbuf.Width()-col, 1)) // Clear everything below the current line @@ -1104,7 +1157,7 @@ func (s *Screen) clearToBottom(blank *Cell) { // It returns the top line. func (s *Screen) clearBottom(total int) (top int) { if total <= 0 { - return + return top } top = total @@ -1112,7 +1165,7 @@ func (s *Screen) clearBottom(total int) (top int) { blank := s.clearBlank() canClearWithBlank := blank == nil || blank.Clear() - if canClearWithBlank { + if canClearWithBlank { //nolint:nestif var row int for row = total - 1; row >= 0; row-- { oldLine := s.curbuf.Line(row) @@ -1147,14 +1200,14 @@ func (s *Screen) clearBottom(total int) (top int) { } } - return + return top } // clearScreen clears the screen and put cursor at home. func (s *Screen) clearScreen(blank *Cell) { s.updatePen(blank) - s.buf.WriteString(ansi.CursorHomePosition) //nolint:errcheck - s.buf.WriteString(ansi.EraseEntireScreen) //nolint:errcheck + s.buf.WriteString(ansi.CursorHomePosition) + s.buf.WriteString(ansi.EraseEntireScreen) s.cur.X, s.cur.Y = 0, 0 s.curbuf.Fill(blank) } @@ -1179,7 +1232,7 @@ func (s *Screen) clearUpdate() { s.clearBelow(blank, 0) } nonEmpty = s.clearBottom(nonEmpty) - for i := 0; i < nonEmpty; i++ { + for i := range nonEmpty { s.transformLine(i) } } @@ -1194,13 +1247,13 @@ func (s *Screen) Flush() (err error) { func (s *Screen) flush() (err error) { // Write the buffer if s.buf.Len() > 0 { - _, err = s.w.Write(s.buf.Bytes()) //nolint:errcheck + _, err = s.w.Write(s.buf.Bytes()) if err == nil { s.buf.Reset() } } - return + return err //nolint:wrapcheck } // Render renders changes of the screen to the internal buffer. Call @@ -1221,6 +1274,7 @@ func (s *Screen) render() { return } + //nolint:godox // TODO: Investigate whether this is necessary. Theoretically, terminals // can add/remove tab stops and we should be able to handle that. We could // use [ansi.DECTABSR] to read the tab stops, but that's not implemented in @@ -1235,9 +1289,9 @@ func (s *Screen) render() { // Do we need alt-screen mode? if s.opts.AltScreen != s.altScreenMode { if s.opts.AltScreen { - s.buf.WriteString(ansi.SetAltScreenSaveCursorMode) + s.buf.WriteString(ansi.SetModeAltScreenSaveCursor) } else { - s.buf.WriteString(ansi.ResetAltScreenSaveCursorMode) + s.buf.WriteString(ansi.ResetModeAltScreenSaveCursor) } s.altScreenMode = s.opts.AltScreen } @@ -1252,7 +1306,9 @@ func (s *Screen) render() { // Do we have queued strings to write above the screen? if len(s.queueAbove) > 0 { + //nolint:godox // TODO: Use scrolling region if available. + //nolint:godox // TODO: Use [Screen.Write] [io.Writer] interface. // We need to scroll the screen up by the number of lines in the queue. @@ -1290,12 +1346,13 @@ func (s *Screen) render() { s.clearBelow(nil, s.newbuf.Height()-1) } - if s.clear { + if s.clear { //nolint:nestif s.clearUpdate() s.clear = false } else if len(s.touch) > 0 { if s.opts.AltScreen { // Optimize scrolling for the alternate screen buffer. + //nolint:godox // TODO: Should we optimize for inline mode as well? If so, we need // to know the actual cursor position to use [ansi.DECSTBM]. s.scrollOptimize() @@ -1311,7 +1368,7 @@ func (s *Screen) render() { } nonEmpty = s.clearBottom(nonEmpty) - for i = 0; i < nonEmpty; i++ { + for i = range nonEmpty { _, ok := s.touch[i] if ok { s.transformLine(i) @@ -1359,7 +1416,7 @@ func (s *Screen) Close() (err error) { s.move(0, s.newbuf.Height()-1) if s.altScreenMode { - s.buf.WriteString(ansi.ResetAltScreenSaveCursorMode) + s.buf.WriteString(ansi.ResetModeAltScreenSaveCursor) s.altScreenMode = false } @@ -1371,11 +1428,11 @@ func (s *Screen) Close() (err error) { // Write the buffer err = s.flush() if err != nil { - return + return err } s.reset() - return + return err } // reset resets the screen to its initial state. @@ -1420,9 +1477,9 @@ func (s *Screen) Resize(width, height int) bool { } if height > oldh { - s.ClearRect(Rect(0, max(oldh-1, 0), width, height-oldh)) + s.ClearRect(Rect(0, max(oldh, 0), width, height-oldh)) } else if height < oldh { - s.ClearRect(Rect(0, max(height-1, 0), width, oldh-height)) + s.ClearRect(Rect(0, max(height, 0), width, oldh-height)) } s.mu.Lock() diff --git a/vendor/github.com/charmbracelet/x/cellbuf/style.go b/vendor/github.com/charmbracelet/x/cellbuf/style.go index 82c4afb73b..6d3876390b 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/style.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/style.go @@ -4,9 +4,9 @@ import ( "github.com/charmbracelet/colorprofile" ) -// Convert converts a style to respect the given color profile. +// ConvertStyle converts a style to respect the given color profile. func ConvertStyle(s Style, p colorprofile.Profile) Style { - switch p { + switch p { //nolint:exhaustive case colorprofile.TrueColor: return s case colorprofile.Ascii: diff --git a/vendor/github.com/charmbracelet/x/cellbuf/utils.go b/vendor/github.com/charmbracelet/x/cellbuf/utils.go index b0452fa9a7..a7a2df3400 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/utils.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/utils.go @@ -9,20 +9,6 @@ func Height(s string) int { return strings.Count(s, "\n") + 1 } -func min(a, b int) int { //nolint:predeclared - if a > b { - return b - } - return a -} - -func max(a, b int) int { //nolint:predeclared - if a > b { - return a - } - return b -} - func clamp(v, low, high int) int { if high < low { low, high = high, low diff --git a/vendor/github.com/charmbracelet/x/cellbuf/wrap.go b/vendor/github.com/charmbracelet/x/cellbuf/wrap.go index f89f52f606..aaba6ef7ec 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/wrap.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/wrap.go @@ -2,6 +2,7 @@ package cellbuf import ( "bytes" + "slices" "unicode" "unicode/utf8" @@ -20,6 +21,16 @@ const nbsp = '\u00a0' // // Note: breakpoints must be a string of 1-cell wide rune characters. func Wrap(s string, limit int, breakpoints string) string { + //nolint:godox + // TODO: Use [PenWriter] once we get + // https://github.com/charmbracelet/lipgloss/pull/489 out the door and + // released. + // The problem is that [ansi.Wrap] doesn't keep track of style and link + // state, so combining both breaks styled space cells. To fix this, we use + // non-breaking space cells for padding and styled blank cells. And since + // both wrapping methods respect non-breaking spaces, we can use them to + // preserve styled spaces in the output. + if len(s) == 0 { return "" } @@ -90,7 +101,7 @@ func Wrap(s string, limit int, breakpoints string) string { seq, width, n, newState := ansi.DecodeSequence(s, state, p) switch width { case 0: - if ansi.Equal(seq, "\t") { + if ansi.Equal(seq, "\t") { //nolint:nestif addWord() space.WriteString(seq) break @@ -176,10 +187,5 @@ func Wrap(s string, limit int, breakpoints string) string { } func runeContainsAny[T string | []rune](r rune, s T) bool { - for _, c := range []rune(s) { - if c == r { - return true - } - } - return false + return slices.Contains([]rune(s), r) } diff --git a/vendor/github.com/charmbracelet/x/cellbuf/writer.go b/vendor/github.com/charmbracelet/x/cellbuf/writer.go index ae8b2a8106..7207678018 100644 --- a/vendor/github.com/charmbracelet/x/cellbuf/writer.go +++ b/vendor/github.com/charmbracelet/x/cellbuf/writer.go @@ -25,7 +25,7 @@ type CellBuffer interface { func FillRect(s CellBuffer, c *Cell, rect Rectangle) { for y := rect.Min.Y; y < rect.Max.Y; y++ { for x := rect.Min.X; x < rect.Max.X; x++ { - s.SetCell(x, y, c) //nolint:errcheck + s.SetCell(x, y, c) } } } @@ -68,7 +68,7 @@ func SetContent(s CellBuffer, str string) { func Render(d CellBuffer) string { var buf bytes.Buffer height := d.Bounds().Dy() - for y := 0; y < height; y++ { + for y := range height { _, line := RenderLine(d, y) buf.WriteString(line) if y < height-1 { @@ -98,32 +98,32 @@ func RenderLine(d CellBuffer, n int) (w int, line string) { pendingLine = "" } - for x := 0; x < d.Bounds().Dx(); x++ { - if cell := d.Cell(x, n); cell != nil && cell.Width > 0 { + for x := range d.Bounds().Dx() { + if cell := d.Cell(x, n); cell != nil && cell.Width > 0 { //nolint:nestif // Convert the cell's style and link to the given color profile. cellStyle := cell.Style cellLink := cell.Link if cellStyle.Empty() && !pen.Empty() { writePending() - buf.WriteString(ansi.ResetStyle) //nolint:errcheck + buf.WriteString(ansi.ResetStyle) pen.Reset() } if !cellStyle.Equal(&pen) { writePending() seq := cellStyle.DiffSequence(pen) - buf.WriteString(seq) // nolint:errcheck + buf.WriteString(seq) pen = cellStyle } // Write the URL escape sequence if cellLink != link && link.URL != "" { writePending() - buf.WriteString(ansi.ResetHyperlink()) //nolint:errcheck + buf.WriteString(ansi.ResetHyperlink()) link.Reset() } if cellLink != link { writePending() - buf.WriteString(ansi.SetHyperlink(cellLink.URL, cellLink.Params)) //nolint:errcheck + buf.WriteString(ansi.SetHyperlink(cellLink.URL, cellLink.Params)) link = cellLink } @@ -140,10 +140,10 @@ func RenderLine(d CellBuffer, n int) (w int, line string) { } } if link.URL != "" { - buf.WriteString(ansi.ResetHyperlink()) //nolint:errcheck + buf.WriteString(ansi.ResetHyperlink()) } if !pen.Empty() { - buf.WriteString(ansi.ResetStyle) //nolint:errcheck + buf.WriteString(ansi.ResetStyle) } return w, strings.TrimRight(buf.String(), " ") // Trim trailing spaces } @@ -201,7 +201,7 @@ func (s *ScreenWriter) SetContentRect(str string, rect Rectangle) { // string to the width of the screen if it exceeds the width of the screen. // This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape // sequences. -func (s *ScreenWriter) Print(str string, v ...interface{}) { +func (s *ScreenWriter) Print(str string, v ...any) { if len(v) > 0 { str = fmt.Sprintf(str, v...) } @@ -214,7 +214,7 @@ func (s *ScreenWriter) Print(str string, v ...interface{}) { // the width of the screen if it exceeds the width of the screen. // This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape // sequences. -func (s *ScreenWriter) PrintAt(x, y int, str string, v ...interface{}) { +func (s *ScreenWriter) PrintAt(x, y int, str string, v ...any) { if len(v) > 0 { str = fmt.Sprintf(str, v...) } @@ -299,7 +299,7 @@ func printString[T []byte | string]( // Print the cell to the screen cell.Style = style cell.Link = link - s.SetCell(x, y, &cell) //nolint:errcheck + s.SetCell(x, y, &cell) x += width } } @@ -309,6 +309,7 @@ func printString[T []byte | string]( cell.Reset() default: // Valid sequences always have a non-zero Cmd. + //nolint:godox // TODO: Handle cursor movement and other sequences switch { case ansi.HasCsiPrefix(seq) && p.Command() == 'm': @@ -333,7 +334,7 @@ func printString[T []byte | string]( // Make sure to set the last cell if it's not empty. if !cell.Empty() { - s.SetCell(x, y, &cell) //nolint:errcheck + s.SetCell(x, y, &cell) cell.Reset() } } diff --git a/vendor/modules.txt b/vendor/modules.txt index f6411ffaa8..009670a7ba 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -363,8 +363,8 @@ github.com/charmbracelet/lipgloss ## explicit; go 1.24.2 github.com/charmbracelet/x/ansi github.com/charmbracelet/x/ansi/parser -# github.com/charmbracelet/x/cellbuf v0.0.13 -## explicit; go 1.18 +# github.com/charmbracelet/x/cellbuf v0.0.14 +## explicit; go 1.24.2 github.com/charmbracelet/x/cellbuf # github.com/charmbracelet/x/term v0.2.2 ## explicit; go 1.24.0