Compare commits

...

62 Commits

Author SHA1 Message Date
Ioan Bizău 6dbb8c8d1a fixup! fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău b799ca2e05 fixup! fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău 25e9198da0 fixup! fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău 39e10c48c0 fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău a279d9bcbc fixup! chore(core): rename "seed" to "backup"
2 weeks ago
Ioan Bizău 1f524eb814 chore(core): rename "seed" to "backup"
2 weeks ago
Ioan Bizău 990e6bfe5c fixup! chore(core): add an extra confirmation for non-1-of-1 Shamir backups
2 weeks ago
Ioan Bizău 788f9fe115 fixup! chore(core): add an extra confirmation for non-1-of-1 Shamir backups
2 weeks ago
Ioan Bizău e0e143c796 chore(core): add an extra confirmation for non-1-of-1 Shamir backups
2 weeks ago
Ioan Bizău 9edfa305f6 fixup! refactor(core): make 1-of-1 SLIP39 backups use same messaging as BIP39
2 weeks ago
Ioan Bizău 2269749984 fixup! refactor(core): make 1-of-1 SLIP39 backups use same messaging as BIP39
2 weeks ago
Ioan Bizău 8ee6bd65f5 fixup! refactor(core): make 1-of-1 SLIP39 backups use same messaging as BIP39
2 weeks ago
Ioan Bizău e9dda08859 refactor(core): make 1-of-1 SLIP39 backups use same messaging as BIP39
2 weeks ago
Ioan Bizău 01729c34c3 fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău f7378c4ee4 fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău 4f29ab3bda fixup! feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
Ioan Bizău ba49b9e760 feat(core): add ability to request backups with any number of groups/shares.
2 weeks ago
tychovrahe 91a783ee37 chore(core): fix flash_combine makefile command
2 weeks ago
Andrew Kozlik 27f54eec9c feat(core): Add unit packaging variant field to Features.
2 weeks ago
tychovrahe d349c44a58 refactor(core): generate macros for rust bindgen automatically
2 weeks ago
tychovrahe c635b945e1 chore(core/boardloader): bump version after release
2 weeks ago
tychovrahe d9590cbe90 chore(core/boardloader): generate changelog
2 weeks ago
tychovrahe ab11afa442 fix(core): set proper VDD level for T3T1 boards
2 weeks ago
matejcik 39e1085295 chore(core): add T3T1 QA bootloader 2.1.5
2 weeks ago
matejcik 66b96bc279 build(core): fix prodtest build from build-docker
2 weeks ago
matejcik f0c7cc4e8e chore(core): add signed vendor headers for T3T1
2 weeks ago
matejcik c01302dd31 chore(core): add signed production T3T1 bootloader v2.1.5
2 weeks ago
tychovrahe e5e40cf4a8 fix(core): ensure correctly programmed oem key option bytes
2 weeks ago
Ondřej Vejpustek db3b7563b2 fix(crypto): imporve handling of return value
3 weeks ago
Ondřej Vejpustek 057b927e99 refactor(crypto): explicitly ignore return value
3 weeks ago
Ondřej Vejpustek 80029823be refactor(crypto): remove unnecessary if
3 weeks ago
tychovrahe 916dbdff9c fix(core): fix reboot to bootloader crash when display copying is in progress
3 weeks ago
Pavol Rusnak caa3c035e7 build(deps): drop curve25519-donna and ed25519 from deps
3 weeks ago
matejcik 90afd9c96a chore(core): bump versions of prodtest / bootloader after release
3 weeks ago
matejcik af6c4efed5 build: allow targets list in build-docker.sh
3 weeks ago
matejcik 4728b14bcc docs(core): add changelogs for prodtest and bootloader
3 weeks ago
matejcik 5b0b145f12 build(core): allow custom vendor header for prodtest
3 weeks ago
tychovrahe dfe5ee67f1 fix(core): move OEM key check after display initialization so that error message can be displayed
3 weeks ago
tychovrahe 9a212a22bd chore(core): add T3T1 production keys to trezorctl
3 weeks ago
tychovrahe 457e5956c8 fix(core): fix sha256 calculation with hash processor
3 weeks ago
Ondřej Vejpustek e9f6eb0b2b fix(core/reflash): fix compile errors
3 weeks ago
Pavol Rusnak 5ec23c1c95 build(deps): bump PyYAML from 6.0.0 to 6.0.1
3 weeks ago
obrusvit a47ae5da1a docs: minor fix of build emu
3 weeks ago
M1nd3r ad848eefc5 ci: fix jobs.md link in ci readme
3 weeks ago
matejcik 89fdaed31e chore(core): add unsigned vendor headers with production keys
4 weeks ago
matejcik 0109ab2232 chore(core): make vendor_unsafe.toif small
4 weeks ago
matejcik 867300b8c6 chore(core): include T3T1 boardloader / bootloader production keys
4 weeks ago
matejcik 5d9bb0ebfc tools(core): nicer build_vendorheader for manual use
4 weeks ago
matejcik 729d7c59e1 fix(core/vendorheader): include correct backup key into trezor_btconly vendor header
4 weeks ago
Martin Milata 4baa4d95a4 fix(core): fix display fatal error screen (T3T1)
4 weeks ago
Martin Milata 5c5433ada2 refactor(core/rust): use more Self
4 weeks ago
Martin Milata 906c00e4e5 refactor(core): rename screen_boot_{empty,full} to screen_boot_stage_{1,2}
4 weeks ago
Martin Milata 804d97c9d8 feat(core): bootloader: T3T1 startup UI
4 weeks ago
tychovrahe c277dbcfcb feat(core): T3T1 loader
4 weeks ago
Martin Milata cf00726152 feat(core): copy T2T1 bootloader UI for T3T1
4 weeks ago
Martin Milata b5fa5a3f3a feat(core): add fonts for T3T1 bootloader
4 weeks ago
dependabot[bot] d5da0f2d4c build(deps): bump idna from 3.3 to 3.7
4 weeks ago
tychovrahe 72146c2ae2 fix(core): fix display fatal error screen
4 weeks ago
tychovrahe 165238b78e fix(core): fix T3T1 unsafe vendorheader
4 weeks ago
tychovrahe 1600759457 refactor(core): simplify secret.h api, hide platform differences
4 weeks ago
tychovrahe 89c6590e45 feat(core/prodtest): add commands TOUCH VERSION and VARIANT READ
4 weeks ago
tychovrahe c8e18dd4d2 fix(core): slow down SDIO communication in T3T1 prodtest
4 weeks ago

@ -118,7 +118,7 @@ jobs:
submodules: recursive
- uses: ./.github/actions/environment
- run: nix-shell --run "poetry run make -C core build_bootloader_emu"
if: matrix.coins == 'universal' && matrix.model != 'T3T1' # FIXME T3T1 bootloader emulator
if: matrix.coins == 'universal'
- run: nix-shell --run "poetry run make -C core build_unix_frozen"
- run: cp core/build/unix/trezor-emu-core core/build/unix/trezor-emu-core-${{ matrix.model }}-${{ matrix.coins }}
- uses: actions/upload-artifact@v4

@ -52,13 +52,15 @@ function help_and_die() {
echo " --skip-normal - do not build regular firmwares"
echo " --skip-core - do not build core"
echo " --skip-legacy - do not build legacy"
echo " --prodtest - build core prodtest"
echo " --repository path/to/repo - checkout the repository from the given path/url"
echo " --no-init - do not recreate docker environments"
echo " --models - comma-separated list of models. default: --models R,T"
echo " --targets - comma-separated list of targets for core build. default: --targets boardloader,bootloader,firmware"
echo " --help"
echo
echo "Option --prodtest is deprecated. Use "--targets prodtest" to build prodtest."
echo "Set PRODUCTION=0 to run non-production builds."
echo "Set VENDOR_HEADER=vendorheader_prodtest_unsigned.bin to use the specified vendor header for prodtest."
exit 0
}
@ -66,9 +68,9 @@ OPT_BUILD_CORE=1
OPT_BUILD_LEGACY=1
OPT_BUILD_NORMAL=1
OPT_BUILD_BITCOINONLY=1
OPT_BUILD_PRODTEST=0
INIT=1
MODELS=(R T)
CORE_TARGETS=(boardloader bootloader firmware)
REPOSITORY="/local"
@ -93,10 +95,6 @@ while true; do
OPT_BUILD_LEGACY=0
shift
;;
--prodtest)
OPT_BUILD_PRODTEST=1
shift
;;
--repository)
REPOSITORY="$2"
shift 2
@ -110,6 +108,11 @@ while true; do
IFS=',' read -r -a MODELS <<< "$2"
shift 2
;;
--targets)
# take comma-separated next argument and turn it into an array
IFS=',' read -r -a CORE_TARGETS <<< "$2"
shift 2
;;
*)
break
;;
@ -266,6 +269,11 @@ for TREZOR_MODEL in ${MODELS[@]}; do
DIRSUFFIX=${DIRSUFFIX/0/}
DIRSUFFIX="-${TREZOR_MODEL}${DIRSUFFIX}"
MAKE_TARGETS=""
for TARGET in ${CORE_TARGETS[@]}; do
MAKE_TARGETS="$MAKE_TARGETS build_$TARGET"
done
SCRIPT_NAME=".build_core_${TREZOR_MODEL}_${BITCOIN_ONLY}.sh"
cat <<EOF > "build/$SCRIPT_NAME"
# DO NOT MODIFY!
@ -274,11 +282,13 @@ for TREZOR_MODEL in ${MODELS[@]}; do
set -e -o pipefail
cd /reproducible-build/trezor-firmware/core
$GIT_CLEAN_REPO
poetry run make clean vendor build_boardloader build_bootloader build_firmware
for item in bootloader firmware; do
poetry run ../python/tools/firmware-fingerprint.py \
-o build/\$item/\$item.bin.fingerprint \
build/\$item/\$item.bin
poetry run make clean vendor $MAKE_TARGETS
for item in bootloader firmware prodtest; do
if [ -f build/\$item/\$item.bin ]; then
poetry run ../python/tools/firmware-fingerprint.py \
-o build/\$item/\$item.bin.fingerprint \
build/\$item/\$item.bin
fi
done
rm -rf /build/*
cp -r build/* /build
@ -287,6 +297,7 @@ EOF
echo
echo ">>> DOCKER RUN core BITCOIN_ONLY=$BITCOIN_ONLY TREZOR_MODEL=$TREZOR_MODEL PRODUCTION=$PRODUCTION"
echo " (targets: ${CORE_TARGETS[@]})"
echo
$DOCKER run \
@ -298,6 +309,7 @@ EOF
--env BITCOIN_ONLY="$BITCOIN_ONLY" \
--env TREZOR_MODEL="$TREZOR_MODEL" \
--env PRODUCTION="$PRODUCTION" \
--env VENDOR_HEADER="$VENDOR_HEADER" \
--init \
"$SNAPSHOT_NAME" \
/nix/var/nix/profiles/default/bin/nix-shell --run "bash /local/build/$SCRIPT_NAME"
@ -350,45 +362,6 @@ EOF
/nix/var/nix/profiles/default/bin/nix-shell --run "bash /local/build/$SCRIPT_NAME"
done
if [ "$OPT_BUILD_PRODTEST" -eq "1" ]; then
for TREZOR_MODEL in ${MODELS[@]}; do
DIRSUFFIX="-${TREZOR_MODEL}-prodtest"
SCRIPT_NAME=".build_${TREZOR_MODEL}-prodtest.sh"
cat <<EOF > "build/$SCRIPT_NAME"
# DO NOT MODIFY!
# this file was generated by ${BASH_SOURCE[0]}
# variant: core build prodtest
set -e -o pipefail
cd /reproducible-build/trezor-firmware/core
$GIT_CLEAN_REPO
poetry run make clean vendor build_prodtest
poetry run ../python/tools/firmware-fingerprint.py \
-o build/prodtest/prodtest.bin.fingerprint \
build/prodtest/prodtest.bin
rm -rf /build/*
cp -r build/* /build
chown -R $USER:$GROUP /build
EOF
echo
echo ">>> DOCKER RUN core prodtest TREZOR_MODEL=$TREZOR_MODEL PRODUCTION=$PRODUCTION"
echo
$DOCKER run \
--network=host \
-it \
--rm \
-v "$DIR:/local" \
-v "$DIR/build/core$DIRSUFFIX":/build:z \
--env TREZOR_MODEL="$TREZOR_MODEL" \
--env PRODUCTION="$PRODUCTION" \
--init \
"$SNAPSHOT_NAME" \
/nix/var/nix/profiles/default/bin/nix-shell --run "bash /local/build/$SCRIPT_NAME"
done
fi
echo
echo "Docker image retained as $SNAPSHOT_NAME"
echo "To remove it, run:"
@ -401,8 +374,8 @@ echo "Built from commit $COMMIT_HASH"
echo
echo "Fingerprints:"
for VARIANT in core legacy; do
for MODEL in "R" "T"; do
for DIRSUFFIX in "" "-bitcoinonly" "-prodtest"; do
for MODEL in ${MODELS[@]}; do
for DIRSUFFIX in "" "-bitcoinonly"; do
BUILD_DIR=build/${VARIANT}-${MODEL}${DIRSUFFIX}
for file in $BUILD_DIR/*/*.fingerprint; do
if [ -f "$file" ]; then

@ -133,6 +133,7 @@ message Features {
optional uint32 homescreen_height = 48; // homescreen height in pixels
optional bool bootloader_locked = 49; // bootloader is locked
optional bool language_version_matches = 50 [default=true]; // translation blob version matches firmware version
optional uint32 unit_packaging = 51; // unit/device packaging version
}
/**
@ -396,6 +397,12 @@ message ResetDevice {
* @next Success
*/
message BackupDevice {
optional uint32 group_threshold = 1;
message Slip39Group {
required uint32 member_threshold = 1;
required uint32 member_count = 2;
}
repeated Slip39Group groups = 2;
}
/**

@ -0,0 +1 @@
Added ability to request Shamir backups with any number of groups/shares.

@ -42,6 +42,8 @@ OPENOCD_INTERFACE ?= stlink
# OpenOCD transport default. Alternative: jtag
OPENOCD_TRANSPORT ?= hla_swd
BINDGEN_MACROS_COMMON=-I../unix,-I../trezorhal/unix,-I../../build/unix,-I../../vendor/micropython/ports/unix,-I../../../crypto,-I../../../storage,-I../../vendor/micropython,-I../../vendor/micropython/lib/uzlib,-I../lib,-I../trezorhal,-I../trezorhal/unix,-I../models,-DTREZOR_EMULATOR,-DTREZOR_BOARD="boards/board-unix.h",
ifeq ($(TREZOR_MODEL), 1)
MCU = STM32F2
LAYOUT_FILE = embed/models/model_T1B1.h
@ -50,10 +52,14 @@ else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),T))
MCU = STM32F4
LAYOUT_FILE = embed/models/model_T2T1.h
OPENOCD_TARGET = target/stm32f4x.cfg
BINDGEN_MACROS_MODEL = -DSTM32F427,-DTREZOR_MODEL_T,-DFLASH_BIT_ACCESS=1,-DFLASH_BLOCK_WORDS=1,
MODEL_FEATURE = model_tt
else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),R))
MCU = STM32F4
LAYOUT_FILE = embed/models/model_T2B1.h
OPENOCD_TARGET = target/stm32f4x.cfg
BINDGEN_MACROS_MODEL =-DSTM32F427,-DTREZOR_MODEL_R,-DFLASH_BIT_ACCESS=1,-DFLASH_BLOCK_WORDS=1,
MODEL_FEATURE = model_tr
else ifeq ($(TREZOR_MODEL),$(filter $(TREZOR_MODEL),T3T1))
MCU = STM32U5
OPENOCD_TARGET = target/stm32u5x.cfg
@ -137,9 +143,10 @@ emu: ## run emulator
test: ## run unit tests
cd tests ; ./run_tests.sh $(TESTOPTS)
test_rust: export BINDGEN_MACROS=$(BINDGEN_MACROS_COMMON)$(BINDGEN_MACROS_MODEL)
test_rust: ## run rs unit tests
cd embed/rust ; cargo test $(TESTOPTS) --target=$(RUST_TARGET) \
--no-default-features --features model_t$(shell echo $(TREZOR_MODEL) | tr "TR" "tr"),test \
--no-default-features --features $(MODEL_FEATURE),test \
-- --test-threads=1 --nocapture
test_emu: ## run selected device tests from python-trezor
@ -206,8 +213,9 @@ typecheck: pyright
pyright:
python ../tools/pyright_tool.py
clippy: export BINDGEN_MACROS:=$(BINDGEN_MACROS_COMMON)$(BINDGEN_MACROS_MODEL)
clippy:
cd embed/rust ; cargo clippy --all-features --target=$(RUST_TARGET)
cd embed/rust ; cargo clippy $(TESTOPTS) --all-features --target=$(RUST_TARGET)
## code generation:
@ -340,7 +348,7 @@ else
endif
flash_combine: $(PRODTEST_BUILD_DIR)/combined.bin ## flash combined using OpenOCD
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(FLASH_START); exit"
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(BOARDLOADER_START); exit"
flash_erase: ## erase all sectors in flash bank 0
$(OPENOCD) -c "init; reset halt; flash info 0; flash erase_sector 0 0 last; flash erase_check 0; exit"

@ -36,12 +36,18 @@ if TREZOR_MODEL in ('R', ):
FONT_BOLD='Font_PixelOperator_Bold_8'
FONT_MONO='Font_PixelOperator_Regular_8'
FONT_BIG=None
elif TREZOR_MODEL in ('T', 'T3T1', 'DISC1', 'DISC2'):
elif TREZOR_MODEL in ('T', 'DISC1', 'DISC2'):
FONT_NORMAL='Font_TTHoves_Regular_21'
FONT_DEMIBOLD='Font_TTHoves_Regular_21'
FONT_BOLD='Font_TTHoves_Bold_17'
FONT_MONO='Font_TTHoves_Regular_21'
FONT_BIG=None
elif TREZOR_MODEL in ('T3T1',):
FONT_NORMAL='Font_TTSatoshi_DemiBold_21'
FONT_DEMIBOLD='Font_TTSatoshi_DemiBold_21'
FONT_BOLD='Font_TTHoves_Bold_17'
FONT_MONO='Font_TTSatoshi_DemiBold_21'
FONT_BIG=None
# modtrezorcrypto
CCFLAGS_MOD += '-Wno-sequence-point '
@ -145,6 +151,18 @@ env.Replace(
env.Replace(
TREZOR_MODEL=TREZOR_MODEL, )
ALLPATHS = [
'embed/rust',
'embed/bootloader',
'embed/bootloader/nanopb',
'embed/bootloader/protob',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/extmod/modtrezorui',
'vendor/nanopb',
] + CPPPATH_MOD + PATH_HAL
env.Replace(
COPT=env.get('ENV').get('OPTIMIZE', '-Os'),
CCFLAGS='$COPT '
@ -157,17 +175,7 @@ env.Replace(
+ env.get('ENV')["CPU_CCFLAGS"] + CCFLAGS_MOD,
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
LINKFLAGS=f'-T embed/bootloader/memory_{LINKER_SCRIPT_SUFFIX}.ld -Wl,--gc-sections -Wl,-Map=build/bootloader/bootloader.map -Wl,--warn-common -Wl,--print-memory-usage',
CPPPATH=[
'embed/rust',
'embed/bootloader',
'embed/bootloader/nanopb',
'embed/bootloader/protob',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/extmod/modtrezorui',
'vendor/nanopb',
] + CPPPATH_MOD + PATH_HAL,
CPPPATH=ALLPATHS,
CPPDEFINES=[
'BOOTLOADER',
'TREZOR_MODEL_'+TREZOR_MODEL,
@ -214,12 +222,16 @@ def cargo_build():
features = ["model_t1"]
elif TREZOR_MODEL in ("R",):
features = ["model_tr"]
elif TREZOR_MODEL in ("T3T1",):
features = ["model_mercury"]
else:
features = ["model_tt"]
features.append("ui")
features.append("bootloader")
features.extend(FEATURES_AVAILABLE)
env.get("ENV")["BINDGEN_MACROS"] = tools.get_bindgen_defines(env.get("ALLDEFS"), ALLPATHS)
cargo_opts = [
f'--target={env.get("ENV")["RUST_TARGET"]}',
f'--target-dir=../../build/bootloader/rust',

@ -34,12 +34,18 @@ if TREZOR_MODEL in ('1', 'R'):
FONT_BOLD=None
FONT_MONO='Font_PixelOperatorMono_Regular_8'
FONT_BIG=None
elif TREZOR_MODEL in ('T', 'T3T1'):
elif TREZOR_MODEL in ('T',):
FONT_NORMAL='Font_Roboto_Regular_20'
FONT_DEMIBOLD=None
FONT_BOLD=None
FONT_MONO='Font_RobotoMono_Medium_20'
FONT_BIG=None
elif TREZOR_MODEL in ('T3T1',):
FONT_NORMAL='Font_TTSatoshi_DemiBold_21'
FONT_DEMIBOLD=None
FONT_BOLD=None
FONT_MONO='Font_RobotoMono_Medium_21'
FONT_BIG=None
# modtrezorcrypto
CCFLAGS_MOD += '-Wno-sequence-point '

@ -20,7 +20,7 @@ if TREZOR_MODEL in ('1', 'DISC1'):
)
Return()
FEATURES_WANTED = ["input", "rgb_led"]
FEATURES_WANTED = ["input", "rgb_led", "dma2d"]
CCFLAGS_MOD = ''
CPPPATH_MOD = []
@ -33,12 +33,18 @@ if TREZOR_MODEL in ('1', 'R'):
FONT_BOLD='Font_PixelOperator_Bold_8'
FONT_MONO='Font_PixelOperator_Regular_8'
FONT_BIG=None
elif TREZOR_MODEL in ('T', 'T3T1', 'DISC2'):
elif TREZOR_MODEL in ('T', 'DISC2'):
FONT_NORMAL='Font_TTHoves_Regular_21'
FONT_DEMIBOLD=None
FONT_BOLD='Font_TTHoves_Bold_17'
FONT_MONO=None
FONT_BIG=None
elif TREZOR_MODEL in ('T3T1',):
FONT_NORMAL='Font_TTSatoshi_DemiBold_21'
FONT_DEMIBOLD='Font_TTSatoshi_DemiBold_21'
FONT_BOLD='Font_TTHoves_Bold_17'
FONT_MONO='Font_TTSatoshi_DemiBold_21'
FONT_BIG=None
# modtrezorcrypto
CCFLAGS_MOD += '-Wno-sequence-point '
@ -82,6 +88,7 @@ SOURCE_MOD += [
'embed/lib/colors.c',
'embed/lib/display_utils.c',
'embed/lib/display.c',
'embed/lib/dma2d_emul.c',
'embed/lib/fonts/font_bitmap.c',
'embed/lib/fonts/fonts.c',
'embed/lib/image.c',
@ -137,11 +144,11 @@ SOURCE_TREZORHAL = [
'embed/trezorhal/unix/rng.c',
'embed/trezorhal/unix/usb.c',
'embed/trezorhal/unix/random_delays.c',
'embed/trezorhal/unix/secret.c',
]
if TREZOR_MODEL in ('R', 'T3T1'):
SOURCE_TREZORHAL += [
'embed/trezorhal/unix/secret.c',
'embed/trezorhal/unix/optiga_hal.c',
]
@ -191,6 +198,19 @@ else:
MODEL_IDENTIFIER = tools.get_model_identifier(TREZOR_MODEL)
MODEL_AS_NUMBER = str(boards.get_hw_model_as_number(MODEL_IDENTIFIER))
ALLPATHS = ['embed/rust',
'embed/bootloader',
'embed/bootloader/nanopb',
'embed/bootloader/protob',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/trezorhal/unix',
'embed/unix',
'embed/extmod/modtrezorui',
'vendor/nanopb',
] + CPPPATH_MOD,
env.Replace(
COPT=env.get('ENV').get('OPTIMIZE', '-Os'),
CCFLAGS='$COPT '
@ -201,19 +221,7 @@ env.Replace(
'-ffreestanding '
'-fstack-protector-all '
+ CCFLAGS_MOD,
CPPPATH=[
'embed/rust',
'embed/bootloader',
'embed/bootloader/nanopb',
'embed/bootloader/protob',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/trezorhal/unix',
'embed/unix',
'embed/extmod/modtrezorui',
'vendor/nanopb',
] + CPPPATH_MOD,
CPPPATH=ALLPATHS,
CPPDEFINES=[
'BOOTLOADER',
'TREZOR_EMULATOR',
@ -268,18 +276,23 @@ def cargo_build():
features = ["model_t1"]
elif TREZOR_MODEL in ("R",):
features = ["model_tr"]
elif TREZOR_MODEL in ("T3T1",):
features = ["model_mercury"]
else:
features = ["model_tt"]
if TREZOR_MODEL in ('T', 'T3T1'):
features.append('touch')
features.append('backlight')
features.append('dma2d')
if TREZOR_MODEL in ('R', '1'):
features.append('button')
features.append("ui")
features.append("bootloader")
env.get("ENV")["BINDGEN_MACROS"] = tools.get_bindgen_defines(env.get("ALLDEFS"), ALLPATHS)
cargo_opts = [
f'--target={RUST_TARGET}',
'--target-dir=../../build/bootloader_emu/rust',

@ -452,6 +452,17 @@ if TREZOR_MODEL in ('1',):
else:
LD_VARIANT = ''
ALLPATHS = [
'.',
'embed/rust',
'embed/firmware',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/extmod/modtrezorui',
'vendor/micropython',
] + CPPPATH_MOD + PATH_HAL
env.Replace(
COPT=env.get('ENV').get('OPTIMIZE', '-Os'),
CCFLAGS='$COPT '
@ -464,16 +475,7 @@ env.Replace(
+ env.get('ENV')["CPU_CCFLAGS"] + CCFLAGS_MOD,
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
LINKFLAGS='-T embed/firmware/memory_${TREZOR_MODEL}%s.ld -Wl,--gc-sections -Wl,--print-memory-usage -Wl,-Map=build/firmware/firmware.map -Wl,--warn-common' % LD_VARIANT,
CPPPATH=[
'.',
'embed/rust',
'embed/firmware',
'embed/lib',
'embed/models',
'embed/trezorhal',
'embed/extmod/modtrezorui',
'vendor/micropython',
] + CPPPATH_MOD + PATH_HAL,
CPPPATH=ALLPATHS,
CPPDEFINES=[
'FIRMWARE',
'TREZOR_MODEL_'+TREZOR_MODEL,
@ -711,6 +713,35 @@ if FROZEN:
env.Depends(source_mpyc, qstr_generated)
#
# Program objects
#
source_files = SOURCE_MOD + SOURCE_FIRMWARE + SOURCE_MICROPYTHON + SOURCE_MICROPYTHON_SPEED + SOURCE_HAL
obj_program = []
obj_program.extend(env.Object(source=SOURCE_MOD))
if FEATURE_FLAGS["SECP256K1_ZKP"]:
obj_program.extend(env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function'))
source_files.extend(SOURCE_MOD_SECP256K1_ZKP)
obj_program.extend(env.Object(source=SOURCE_FIRMWARE))
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON))
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON_SPEED, COPT='-O3'))
obj_program.extend(env.Object(source=SOURCE_HAL))
if FROZEN:
obj_program.extend(env.Object(source=source_mpyc))
env.Replace(
ALLSOURCES=source_files,
ALLDEFS=tools.get_defs_for_cmake(env['CPPDEFINES'] + env['CPPDEFINES_IMPLICIT'] + [f"PRODUCTION={int(PRODUCTION)}", f"BOOTLOADER_QA={int(BOOTLOADER_QA)}", f"PYOPT={PYOPT}", f"BITCOIN_ONLY={BITCOIN_ONLY}"]))
cmake_gen = env.Command(
target='CMakeLists.txt',
source='',
action='$MAKECMAKELISTS --sources $ALLSOURCES --dirs $CPPPATH --defs $ALLDEFS',
)
#
# Rust library
#
@ -749,6 +780,8 @@ def cargo_build():
features.extend(FEATURES_AVAILABLE)
env.get("ENV")["BINDGEN_MACROS"] = tools.get_bindgen_defines(env.get("ALLDEFS"), ALLPATHS)
cargo_opts = [
f'--target={env.get("ENV")["RUST_TARGET"]}',
f'--target-dir=../../build/firmware/rust',
@ -772,34 +805,6 @@ env.Depends(rust, TRANSLATION_DATA)
env.Append(LINKFLAGS=f' -L{RUST_LIBDIR}')
env.Append(LINKFLAGS=f' -l{RUST_LIB}')
#
# Program objects
#
source_files = SOURCE_MOD + SOURCE_FIRMWARE + SOURCE_MICROPYTHON + SOURCE_MICROPYTHON_SPEED + SOURCE_HAL
obj_program = []
obj_program.extend(env.Object(source=SOURCE_MOD))
if FEATURE_FLAGS["SECP256K1_ZKP"]:
obj_program.extend(env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function'))
source_files.extend(SOURCE_MOD_SECP256K1_ZKP)
obj_program.extend(env.Object(source=SOURCE_FIRMWARE))
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON))
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON_SPEED, COPT='-O3'))
obj_program.extend(env.Object(source=SOURCE_HAL))
if FROZEN:
obj_program.extend(env.Object(source=source_mpyc))
env.Replace(
ALLSOURCES=source_files,
ALLDEFS=tools.get_defs_for_cmake(env['CPPDEFINES'] + env['CPPDEFINES_IMPLICIT'] + [f"PRODUCTION={int(PRODUCTION)}", f"BOOTLOADER_QA={int(BOOTLOADER_QA)}", f"PYOPT={PYOPT}", f"BITCOIN_ONLY={BITCOIN_ONLY}"]))
cmake_gen = env.Command(
target='CMakeLists.txt',
source='',
action='$MAKECMAKELISTS --sources $ALLSOURCES --dirs $CPPPATH --defs $ALLDEFS',
)
MODEL_IDENTIFIER = tools.get_model_identifier(TREZOR_MODEL)
BOOTLOADER_SUFFIX = MODEL_IDENTIFIER

@ -195,7 +195,16 @@ obj_program.extend(env.Object(source=SOURCE_HAL))
MODEL_IDENTIFIER = tools.get_model_identifier(TREZOR_MODEL)
if PRODUCTION:
if (vh := ARGUMENTS.get("VENDOR_HEADER", None)):
VENDORHEADER = vh
elif (vh := os.environ.get("VENDOR_HEADER", None)):
# TODO looking at envvars in a build script is not very nice. But justifiable in case
# of vendor header which does not affect reproducibility of the build. Nonetheless,
# we should figure out a cleaner way to pass in this argument, without having to teach
# the Makefile about it.
VENDORHEADER = f'embed/vendorheader/{MODEL_IDENTIFIER}/{vh}'
elif PRODUCTION:
VENDORHEADER = f'embed/vendorheader/{MODEL_IDENTIFIER}/vendorheader_prodtest_signed_prod.bin'
elif BOOTLOADER_DEVEL:
VENDORHEADER = f'embed/vendorheader/{MODEL_IDENTIFIER}/vendorheader_dev_DO_NOT_SIGN_signed_dev.bin'

@ -532,6 +532,19 @@ elif TREZOR_MODEL in ('1',):
else:
raise ValueError('Unknown Trezor model')
ALLPATHS=['.',
'embed/rust',
'embed/lib',
'embed/models',
'embed/unix',
'embed/trezorhal',
'embed/trezorhal/unix',
'embed/extmod/modtrezorui',
'vendor/micropython',
'vendor/micropython/ports/unix',
'vendor/micropython/lib/mp-readline',
] + CPPPATH_MOD
env.Replace(
CCFLAGS='$COPT '
'-g3 '
@ -539,19 +552,7 @@ env.Replace(
'-fdata-sections -ffunction-sections -fPIE ' + CCFLAGS_MOD,
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
LIBS=['m'],
CPPPATH=[
'.',
'embed/rust',
'embed/lib',
'embed/models',
'embed/unix',
'embed/trezorhal',
'embed/trezorhal/unix',
'embed/extmod/modtrezorui',
'vendor/micropython',
'vendor/micropython/ports/unix',
'vendor/micropython/lib/mp-readline',
] + CPPPATH_MOD,
CPPPATH=ALLPATHS,
CPPDEFINES=[
CPU_MODEL,
'TREZOR_EMULATOR',
@ -798,6 +799,34 @@ if FROZEN:
env.Depends(source_mpyc, qstr_generated)
#
# Program objects
#
obj_program = []
source_files = SOURCE_MOD + SOURCE_MICROPYTHON + SOURCE_UNIX
obj_program.extend(env.Object(source=SOURCE_MOD))
if FEATURE_FLAGS["SECP256K1_ZKP"]:
obj_program.extend(env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function'))
source_files.extend(SOURCE_MOD_SECP256K1_ZKP)
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON))
obj_program.extend(env.Object(source=SOURCE_UNIX))
if FROZEN:
obj_program.extend(env.Object(source=source_mpyc))
env.Replace(
ALLSOURCES=source_files,
ALLDEFS=tools.get_defs_for_cmake(env['CPPDEFINES']))
cmake_gen = env.Command(
target='CMakeLists.txt',
source='',
action='$MAKECMAKELISTS --sources $ALLSOURCES --dirs $CPPPATH --defs $ALLDEFS',
)
#
# Rust library
#
@ -842,7 +871,7 @@ def cargo_build():
if TREZOR_MODEL in ('R', '1'):
features.append('button')
env.get('ENV')['TREZOR_MODEL'] = TREZOR_MODEL
env.get("ENV")["BINDGEN_MACROS"] = tools.get_bindgen_defines(env.get("ALLDEFS"), ALLPATHS)
return f'cd embed/rust; cargo build --profile {RUST_PROFILE} --target-dir=../../build/unix/rust --no-default-features --features "{" ".join(features)}" --target {TARGET}'
@ -857,33 +886,6 @@ env.Depends(rust, TRANSLATION_DATA)
env.Append(LINKFLAGS=f'-L{RUST_LIBDIR}')
env.Append(LINKFLAGS=f'-l{RUST_LIB}')
#
# Program objects
#
obj_program = []
source_files = SOURCE_MOD + SOURCE_MICROPYTHON + SOURCE_UNIX
obj_program.extend(env.Object(source=SOURCE_MOD))
if FEATURE_FLAGS["SECP256K1_ZKP"]:
obj_program.extend(env.Object(source=SOURCE_MOD_SECP256K1_ZKP, CCFLAGS='$CCFLAGS -Wno-unused-function'))
source_files.extend(SOURCE_MOD_SECP256K1_ZKP)
obj_program.extend(env.Object(source=SOURCE_MICROPYTHON))
obj_program.extend(env.Object(source=SOURCE_UNIX))
if FROZEN:
obj_program.extend(env.Object(source=source_mpyc))
env.Replace(
ALLSOURCES=source_files,
ALLDEFS=tools.get_defs_for_cmake(env['CPPDEFINES']))
cmake_gen = env.Command(
target='CMakeLists.txt',
source='',
action='$MAKECMAKELISTS --sources $ALLSOURCES --dirs $CPPPATH --defs $ALLDEFS',
)
env.Depends(obj_program, qstr_generated)
program = env.Command(

@ -1,2 +0,0 @@
Added firmware update without interaction.
Split builds of different parts to use simple util.s assembler, while FW+bootloader use interconnected ones.

@ -1 +0,0 @@
Added basic support for STM32U5

@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.1.2 [April 2024]
### Added
- Added firmware update without interaction.
Split builds of different parts to use simple util.s assembler, while FW+bootloader use interconnected ones. [#3205]
- Added basic support for STM32U5 [#3370]
## 2.1.1 [September 2023]
### Added
@ -43,4 +51,6 @@ Internal only release for Model R prototypes.
[#2955]: https://github.com/trezor/trezor-firmware/pull/2955
[#2989]: https://github.com/trezor/trezor-firmware/pull/2989
[#3048]: https://github.com/trezor/trezor-firmware/pull/3048
[#3205]: https://github.com/trezor/trezor-firmware/pull/3205
[#3222]: https://github.com/trezor/trezor-firmware/pull/3222
[#3370]: https://github.com/trezor/trezor-firmware/pull/3370

@ -258,11 +258,6 @@ int main(void) {
#ifdef STM32U5
tamper_init();
if (sectrue == secret_bhk_locked()) {
delete_secrets();
NVIC_SystemReset();
}
trustzone_init_boardloader();
secret_ensure_initialized();

@ -1,4 +1,4 @@
#define VERSION_MAJOR 2
#define VERSION_MINOR 1
#define VERSION_PATCH 2
#define VERSION_PATCH 3
#define VERSION_BUILD 0

@ -1 +0,0 @@
Added basic support for STM32U5

@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.1.5 [April 2024]
### Added
- Added support for T3T1
- Added basic support for STM32U5 [#3370]
### Changed
- Speed-up device boot [#3429]
## 2.1.4 [November 2023]
### Added
@ -117,3 +127,5 @@ Internal only release for Model R prototypes.
[#3205]: https://github.com/trezor/trezor-firmware/pull/3205
[#3222]: https://github.com/trezor/trezor-firmware/pull/3222
[#3303]: https://github.com/trezor/trezor-firmware/pull/3303
[#3370]: https://github.com/trezor/trezor-firmware/pull/3370
[#3429]: https://github.com/trezor/trezor-firmware/pull/3429

@ -248,7 +248,7 @@ void ui_screen_done(uint8_t restart_seconds, secbool full_redraw) {
screen_install_success(restart_seconds, initial_setup, full_redraw);
}
void ui_screen_boot_empty(bool fading) { screen_boot_empty(fading); }
void ui_screen_boot_stage_1(bool fading) { screen_boot_stage_1(fading); }
// error UI
void ui_screen_fail(void) { screen_install_fail(); }
@ -257,16 +257,6 @@ void ui_screen_fail(void) { screen_install_fail(); }
uint32_t ui_screen_unlock_bootloader_confirm(void) {
return screen_unlock_bootloader_confirm();
}
void ui_screen_install_restricted(void) {
display_clear();
screen_fatal_error_rust(
"INSTALL RESTRICTED",
"Installation of custom firmware is currently restricted.",
"Please visit\ntrezor.io/bootloader");
display_refresh();
}
#else
void ui_screen_install_restricted(void) { screen_install_fail(); }
#endif

@ -62,13 +62,12 @@ void ui_screen_wipe_progress(int pos, int len);
void ui_screen_done(uint8_t restart_seconds, secbool full_redraw);
void ui_screen_fail(void);
void ui_screen_install_restricted(void);
void ui_fadein(void);
void ui_fadeout(void);
void ui_set_initial_setup(bool initial);
void ui_screen_boot_empty(bool fading);
void ui_screen_boot_stage_1(bool fading);
#ifdef USE_OPTIGA
uint32_t ui_screen_unlock_bootloader_confirm(void);

@ -100,7 +100,6 @@ __attribute__((noreturn)) void display_error_and_die(const char *message,
display_init();
display_backlight(180);
screen_fatal_error_rust(title, message, footer);
display_refresh();
#if USE_TOUCH
printf("Click screen to exit.\n");
#elif USE_BUTTON
@ -210,7 +209,6 @@ __attribute__((noreturn)) void jump_to(void *addr) {
"STORAGE WAS RETAINED");
}
display_backlight(180);
display_refresh();
hal_delay(3000);
exit(0);
}

@ -193,7 +193,7 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr,
r = process_msg_FirmwareUpload(USB_IFACE_NUM, msg_size, buf);
if (r < 0 && r != UPLOAD_ERR_USER_ABORT) { // error, but not user abort
if (r == UPLOAD_ERR_BOOTLOADER_LOCKED) {
ui_screen_install_restricted();
secret_show_install_restricted_screen();
} else {
ui_screen_fail();
}
@ -325,33 +325,9 @@ void real_jump_to_firmware(void) {
&FIRMWARE_AREA),
"Firmware is corrupted");
#ifdef STM32U5
secret_bhk_provision();
secret_bhk_lock();
#ifdef USE_OPTIGA
if (sectrue == secret_optiga_present()) {
secret_optiga_backup();
secret_hide();
} else {
secret_optiga_hide();
}
#else
secret_hide();
#endif
#endif
#ifdef USE_OPTIGA
#ifdef STM32U5
if ((vhdr.vtrust & VTRUST_SECRET) != 0) {
secret_optiga_hide();
}
#else
if (((vhdr.vtrust & VTRUST_SECRET) != 0) && (sectrue != secret_wiped())) {
ui_screen_install_restricted();
trezor_shutdown();
}
#endif
#endif
secret_prepare_fw(
((vhdr.vtrust & VTRUST_SECRET) == VTRUST_SECRET_ALLOW) * sectrue,
((vhdr.vtrust & VTRUST_ALL) == VTRUST_ALL) * sectrue);
// if all VTRUST flags are unset = ultimate trust => skip the procedure
if ((vhdr.vtrust & VTRUST_ALL) != VTRUST_ALL) {
@ -374,9 +350,10 @@ void real_jump_to_firmware(void) {
ui_screen_boot_click();
}
ui_screen_boot_empty(false);
ui_screen_boot_stage_1(false);
}
display_finish_actions();
ensure_compatible_settings();
// mpu_config_firmware();
@ -388,6 +365,7 @@ void real_jump_to_firmware(void) {
#ifdef STM32U5
__attribute__((noreturn)) void jump_to_fw_through_reset(void) {
display_finish_actions();
display_fade(display_backlight(-1), 0, 200);
__disable_irq();
@ -442,7 +420,7 @@ int bootloader_main(void) {
#endif
#endif
ui_screen_boot_empty(false);
ui_screen_boot_stage_1(false);
mpu_config_bootloader();
@ -645,7 +623,7 @@ int bootloader_main(void) {
}
if (ui_result == 0x11223344) { // reboot
#ifndef STM32U5
ui_screen_boot_empty(true);
ui_screen_boot_stage_1(true);
#endif
continue_to_firmware = firmware_present;
continue_to_firmware_backup = firmware_present_backup;
@ -710,7 +688,7 @@ int bootloader_main(void) {
#ifdef STM32U5
firmware_jump_fn = jump_to_fw_through_reset;
#else
ui_screen_boot_empty(true);
ui_screen_boot_stage_1(true);
firmware_jump_fn = real_jump_to_firmware;
#endif
break;

@ -314,6 +314,7 @@ static void send_msg_features(uint8_t iface_num,
}
if (unit_variant_present()) {
MSG_SEND_ASSIGN_VALUE(unit_color, unit_variant_get_color());
MSG_SEND_ASSIGN_VALUE(unit_packaging, unit_variant_get_packaging());
MSG_SEND_ASSIGN_VALUE(unit_btconly, unit_variant_get_btconly());
}
@ -638,7 +639,8 @@ int process_msg_FirmwareUpload(uint8_t iface_num, uint32_t msg_size,
}
#if defined USE_OPTIGA && !defined STM32U5
if (sectrue != secret_wiped() && ((vhdr.vtrust & VTRUST_SECRET) != 0)) {
if (sectrue != secret_wiped() &&
((vhdr.vtrust & VTRUST_SECRET) != VTRUST_SECRET_ALLOW)) {
MSG_SEND_INIT(Failure);
MSG_SEND_ASSIGN_VALUE(code, FailureType_Failure_ProcessError);
MSG_SEND_ASSIGN_STRING(message, "Install restricted");

@ -105,6 +105,8 @@ typedef struct _Features {
bool unit_btconly;
bool has_bootloader_locked;
bool bootloader_locked;
bool has_unit_packaging;
uint32_t unit_packaging;
} Features;
typedef struct _FirmwareErase {
@ -156,7 +158,7 @@ extern "C" {
/* Initializer values for message structs */
#define Initialize_init_default {0}
#define GetFeatures_init_default {0}
#define Features_init_default {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0}
#define Features_init_default {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0}
#define Ping_init_default {false, ""}
#define Success_init_default {false, ""}
#define Failure_init_default {false, _FailureType_MIN, false, ""}
@ -168,7 +170,7 @@ extern "C" {
#define UnlockBootloader_init_default {0}
#define Initialize_init_zero {0}
#define GetFeatures_init_zero {0}
#define Features_init_zero {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0}
#define Features_init_zero {false, "", 0, 0, 0, false, 0, false, "", false, "", false, "", false, 0, false, {0, {0}}, false, 0, false, "", false, 0, false, 0, false, 0, false, "", false, "", false, 0, false, 0, false, 0, false, 0}
#define Ping_init_zero {false, ""}
#define Success_init_zero {false, ""}
#define Failure_init_zero {false, _FailureType_MIN, false, ""}
@ -203,6 +205,7 @@ extern "C" {
#define Features_unit_color_tag 45
#define Features_unit_btconly_tag 46
#define Features_bootloader_locked_tag 49
#define Features_unit_packaging_tag 51
#define FirmwareErase_length_tag 1
#define FirmwareRequest_offset_tag 1
#define FirmwareRequest_length_tag 2
@ -242,7 +245,8 @@ X(a, STATIC, OPTIONAL, STRING, fw_vendor, 25) \
X(a, STATIC, OPTIONAL, STRING, internal_model, 44) \
X(a, STATIC, OPTIONAL, UINT32, unit_color, 45) \
X(a, STATIC, OPTIONAL, BOOL, unit_btconly, 46) \
X(a, STATIC, OPTIONAL, BOOL, bootloader_locked, 49)
X(a, STATIC, OPTIONAL, BOOL, bootloader_locked, 49) \
X(a, STATIC, OPTIONAL, UINT32, unit_packaging, 51)
#define Features_CALLBACK NULL
#define Features_DEFAULT NULL
@ -326,7 +330,7 @@ extern const pb_msgdesc_t UnlockBootloader_msg;
#define ButtonAck_size 0
#define ButtonRequest_size 2
#define Failure_size 260
#define Features_size 490
#define Features_size 497
#define FirmwareErase_size 6
#define FirmwareRequest_size 12
#define GetFeatures_size 0

@ -62,6 +62,7 @@ message Features {
optional uint32 unit_color = 45; // color of the unit/device
optional bool unit_btconly = 46; // unit/device is intended as bitcoin only
optional bool bootloader_locked = 49; // bootloader is locked
optional uint32 unit_packaging = 51; // unit/device packaging version
}
/**

@ -1,6 +1,6 @@
#define VERSION_MAJOR 2
#define VERSION_MINOR 1
#define VERSION_PATCH 5
#define VERSION_PATCH 6
#define VERSION_BUILD 0
#define VERSION_UINT32 \
(VERSION_MAJOR | (VERSION_MINOR << 8) | (VERSION_PATCH << 16) | \

@ -253,6 +253,19 @@ STATIC mp_obj_t mod_trezorutils_unit_btconly(void) {
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorutils_unit_btconly_obj,
mod_trezorutils_unit_btconly);
/// def unit_packaging() -> int | None:
/// """
/// Returns the packaging version of the unit.
/// """
STATIC mp_obj_t mod_trezorutils_unit_packaging(void) {
if (!unit_variant_present()) {
return mp_const_none;
}
return mp_obj_new_int(unit_variant_get_packaging());
}
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_trezorutils_unit_packaging_obj,
mod_trezorutils_unit_packaging);
/// def sd_hotswap_enabled() -> bool:
/// """
/// Returns True if SD card hot swapping is enabled
@ -423,6 +436,8 @@ STATIC const mp_rom_map_elem_t mp_module_trezorutils_globals_table[] = {
MP_ROM_PTR(&mod_trezorutils_bootloader_locked_obj)},
{MP_ROM_QSTR(MP_QSTR_unit_color),
MP_ROM_PTR(&mod_trezorutils_unit_color_obj)},
{MP_ROM_QSTR(MP_QSTR_unit_packaging),
MP_ROM_PTR(&mod_trezorutils_unit_packaging_obj)},
{MP_ROM_QSTR(MP_QSTR_unit_btconly),
MP_ROM_PTR(&mod_trezorutils_unit_btconly_obj)},
{MP_ROM_QSTR(MP_QSTR_sd_hotswap_enabled),

@ -84,6 +84,12 @@ static secbool known_bootloader(const uint8_t *hash, int len) {
// bootloader_T2T1_qa.bin version 2.1.4.0
#define BOOTLOADER_T2T1_QA_00 {0xff, 0xda, 0xfd, 0x0f, 0xe1, 0x89, 0x56, 0xb6, 0x0b, 0x6e, 0x2d, 0x67, 0xf1, 0x63, 0x8c, 0x4c, 0x4d, 0x6f, 0x97, 0xe7, 0xe0, 0xa4, 0xce, 0x76, 0xc9, 0x49, 0x0a, 0x34, 0x3e, 0xd8, 0xcb, 0x1f}
#define BOOTLOADER_T2T1_QA_FF {0xbe, 0x31, 0x71, 0x7b, 0x8b, 0x31, 0x12, 0xbd, 0x58, 0xc4, 0x81, 0x09, 0x8d, 0xd9, 0x07, 0x51, 0x5c, 0xb6, 0x3d, 0x07, 0x82, 0x00, 0x30, 0x4a, 0xeb, 0x26, 0xf0, 0xe4, 0x00, 0xd4, 0xf2, 0x9c}
// bootloader_T3T1.bin version 2.1.5.0
#define BOOTLOADER_T3T1_00 {0xc4, 0x9f, 0xfc, 0x91, 0xab, 0x6a, 0x2c, 0x85, 0x01, 0xac, 0x98, 0x2a, 0x0a, 0x4b, 0x62, 0x2a, 0xa0, 0x70, 0x81, 0xa3, 0xaa, 0x49, 0x6b, 0x79, 0x3a, 0x0a, 0x37, 0x66, 0xbc, 0x09, 0x7c, 0x9e}
#define BOOTLOADER_T3T1_FF {0x93, 0x79, 0x40, 0xdf, 0x9f, 0xf4, 0xfe, 0xe9, 0x77, 0xb7, 0x38, 0x3a, 0x07, 0x16, 0xe5, 0xca, 0xdd, 0xcb, 0xbf, 0xd5, 0x00, 0x5a, 0x93, 0x61, 0x05, 0x71, 0xa8, 0x76, 0x86, 0x61, 0xf2, 0x3b}
// bootloader_T3T1_qa.bin version 2.1.5.0
#define BOOTLOADER_T3T1_QA_00 {0xad, 0x43, 0x20, 0x2a, 0xf9, 0xdc, 0xce, 0x01, 0x45, 0x63, 0x22, 0x98, 0xe0, 0xfa, 0x13, 0x1e, 0x4e, 0xfb, 0xf7, 0x06, 0x81, 0x1d, 0xf0, 0x0f, 0x2d, 0xed, 0x6a, 0x26, 0x25, 0x1f, 0xbb, 0x9f}
#define BOOTLOADER_T3T1_QA_FF {0x04, 0x16, 0x00, 0x16, 0x5e, 0x22, 0x76, 0x2f, 0x60, 0x01, 0x18, 0x36, 0x7c, 0xaa, 0x32, 0x60, 0x8d, 0x98, 0x89, 0x2f, 0x41, 0x10, 0x82, 0xdf, 0x02, 0xca, 0x28, 0x85, 0xcc, 0xd1, 0xae, 0x15}
// --- END GENERATED BOOTLOADER SECTION ---

@ -111,10 +111,6 @@ int main(void) {
rdi_start();
#endif
#ifdef STM32U5
check_oem_keys();
#endif
// reinitialize HAL for Trezor One
#if defined TREZOR_MODEL_1
HAL_Init();
@ -134,7 +130,11 @@ int main(void) {
display_reinit();
screen_boot_full();
#ifdef STM32U5
check_oem_keys();
#endif
screen_boot_stage_2();
#if !defined TREZOR_MODEL_1
parse_boardloader_capabilities();

@ -0,0 +1,203 @@
#include <stdint.h>
// clang-format off
// - the first two bytes are width and height of the glyph
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 4-bit glyph data
/* */ static const uint8_t Font_RobotoMono_Medium_21_glyph_32[] = { 0, 0, 13, 0, 0 };
/* ! */ static const uint8_t Font_RobotoMono_Medium_21_glyph_33[] = { 4, 16, 13, 4, 15, 240, 127, 240, 127, 240, 127, 240, 127, 240, 127, 240, 111, 240, 111, 240, 111, 240, 111, 208, 95, 0, 0, 0, 0, 96, 41, 242, 175, 225, 127, 0, 1 };
/* " */ static const uint8_t Font_RobotoMono_Medium_21_glyph_34[] = { 7, 6, 13, 3, 16, 201, 0, 201, 0, 252, 1, 253, 0, 252, 0, 253, 0, 252, 0, 237, 0, 220, 0, 221, 0, 101, 0, 85, 0 };
/* # */ static const uint8_t Font_RobotoMono_Medium_21_glyph_35[] = { 12, 15, 13, 0, 15, 0, 0, 243, 6, 243, 7, 0, 0, 246, 4, 246, 4, 0, 0, 249, 1, 249, 1, 0, 0, 236, 0, 236, 0, 112, 170, 239, 170, 239, 170, 160, 255, 255, 255, 255, 239, 0, 80, 95, 64, 111, 0, 0, 128, 47, 112, 63, 0, 0, 176, 15, 160, 15, 0, 198, 252, 207, 252, 207, 44, 198, 253, 206, 253, 206, 44, 0, 243, 7, 243, 7, 0, 0, 246, 4, 246, 4, 0, 0, 249, 1, 249, 1, 0, 0, 236, 0, 236, 0, 0 };
/* $ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_36[] = { 11, 21, 13, 1, 18, 0, 0, 80, 3, 0, 0, 0, 0, 240, 9, 0, 0, 0, 0, 240, 9, 0, 0, 0, 178, 255, 223, 5, 0, 32, 255, 239, 255, 127, 0, 176, 239, 2, 193, 255, 1, 224, 143, 0, 48, 255, 5, 224, 143, 0, 0, 187, 4, 176, 255, 4, 0, 0, 0, 32, 255, 207, 5, 0, 0, 0, 194, 255, 239, 6, 0, 0, 0, 147, 255, 159, 0, 0, 0, 0, 177, 255, 3, 132, 8, 0, 16, 255, 7, 247, 31, 0, 0, 255, 7, 242, 175, 0, 128, 255, 4, 144, 255, 223, 254, 191, 0, 0, 231, 255, 239, 8, 0, 0, 0, 244, 7, 0, 0, 0, 0, 243, 6, 0, 0, 0, 0, 32, 1, 0, 0 };
/* % */ static const uint8_t Font_RobotoMono_Medium_21_glyph_37[] = { 13, 17, 13, 0, 16, 0, 16, 0, 0, 0, 0, 0, 144, 255, 62, 0, 0, 0, 0, 245, 106, 223, 0, 0, 0, 0, 249, 2, 250, 1, 171, 0, 0, 249, 1, 250, 65, 95, 0, 0, 247, 39, 238, 192, 13, 0, 0, 208, 255, 111, 245, 4, 0, 0, 0, 100, 2, 190, 0, 0, 0, 0, 0, 112, 63, 0, 0, 0, 0, 0, 225, 10, 83, 2, 0, 0, 0, 248, 178, 255, 111, 0, 0, 16, 143, 245, 57, 253, 0, 0, 160, 31, 248, 3, 248, 2, 0, 160, 7, 248, 3, 248, 2, 0, 0, 0, 244, 75, 237, 0, 0, 0, 0, 144, 255, 79, 0, 0, 0, 0, 0, 33, 0, 0 };
/* & */ static const uint8_t Font_RobotoMono_Medium_21_glyph_38[] = { 13, 17, 13, 0, 16, 0, 0, 16, 1, 0, 0, 0, 0, 64, 253, 223, 3, 0, 0, 0, 243, 255, 254, 30, 0, 0, 0, 249, 13, 208, 95, 0, 0, 0, 251, 9, 176, 111, 0, 0, 0, 250, 11, 242, 47, 0, 0, 0, 244, 143, 255, 6, 0, 0, 0, 176, 255, 95, 0, 0, 0, 0, 210, 255, 11, 0, 17, 0, 32, 254, 253, 127, 16, 255, 1, 176, 223, 129, 255, 51, 255, 0, 240, 127, 0, 252, 190, 191, 0, 241, 111, 0, 225, 255, 79, 0, 224, 223, 0, 144, 255, 12, 0, 96, 255, 206, 254, 255, 95, 0, 0, 230, 255, 223, 180, 255, 2, 0, 0, 50, 1, 0, 0, 0 };
/* ' */ static const uint8_t Font_RobotoMono_Medium_21_glyph_39[] = { 3, 6, 13, 4, 16, 193, 9, 242, 12, 242, 11, 242, 10, 242, 9, 129, 5 };
/* ( */ static const uint8_t Font_RobotoMono_Medium_21_glyph_40[] = { 7, 22, 13, 3, 17, 0, 0, 97, 0, 0, 16, 253, 0, 0, 192, 95, 0, 0, 247, 9, 0, 16, 255, 1, 0, 112, 175, 0, 0, 192, 95, 0, 0, 240, 31, 0, 0, 243, 15, 0, 0, 245, 13, 0, 0, 246, 12, 0, 0, 246, 12, 0, 0, 245, 13, 0, 0, 243, 15, 0, 0, 240, 31, 0, 0, 192, 95, 0, 0, 112, 175, 0, 0, 16, 255, 1, 0, 0, 248, 8, 0, 0, 208, 79, 0, 0, 16, 253, 0, 0, 0, 113, 0 };
/* ) */ static const uint8_t Font_RobotoMono_Medium_21_glyph_41[] = { 6, 22, 13, 3, 17, 51, 0, 0, 249, 5, 0, 209, 79, 0, 48, 239, 0, 0, 250, 7, 0, 244, 14, 0, 224, 63, 0, 176, 143, 0, 144, 191, 0, 112, 223, 0, 96, 239, 0, 96, 239, 0, 112, 223, 0, 128, 191, 0, 176, 143, 0, 224, 79, 0, 243, 14, 0, 249, 7, 32, 239, 0, 192, 79, 0, 249, 6, 0, 68, 0, 0 };
/* * */ static const uint8_t Font_RobotoMono_Medium_21_glyph_42[] = { 11, 11, 13, 1, 15, 0, 0, 243, 11, 0, 0, 0, 0, 242, 10, 0, 0, 0, 0, 241, 9, 0, 0, 224, 58, 240, 8, 197, 6, 243, 255, 252, 236, 255, 10, 0, 132, 253, 191, 55, 0, 0, 32, 238, 95, 0, 0, 0, 208, 47, 253, 3, 0, 0, 251, 8, 244, 30, 0, 0, 233, 0, 176, 45, 0, 0, 16, 0, 16, 0, 0 };
/* + */ static const uint8_t Font_RobotoMono_Medium_21_glyph_43[] = { 11, 12, 13, 1, 13, 0, 0, 85, 2, 0, 0, 0, 0, 255, 6, 0, 0, 0, 0, 255, 6, 0, 0, 0, 0, 255, 6, 0, 0, 50, 51, 255, 56, 51, 1, 254, 255, 255, 255, 255, 5, 254, 255, 255, 255, 255, 5, 17, 17, 255, 23, 17, 0, 0, 0, 255, 6, 0, 0, 0, 0, 255, 6, 0, 0, 0, 0, 255, 6, 0, 0, 0, 0, 135, 3, 0, 0 };
/* , */ static const uint8_t Font_RobotoMono_Medium_21_glyph_44[] = { 4, 7, 13, 3, 3, 32, 102, 96, 255, 96, 255, 112, 239, 160, 175, 241, 47, 145, 6 };
/* - */ static const uint8_t Font_RobotoMono_Medium_21_glyph_45[] = { 9, 3, 13, 2, 8, 147, 153, 153, 153, 7, 246, 255, 255, 255, 14, 114, 119, 119, 119, 6 };
/* . */ static const uint8_t Font_RobotoMono_Medium_21_glyph_46[] = { 5, 5, 13, 4, 4, 0, 2, 0, 225, 207, 0, 245, 255, 2, 225, 223, 0, 0, 2, 0 };
/* / */ static const uint8_t Font_RobotoMono_Medium_21_glyph_47[] = { 9, 17, 13, 2, 15, 0, 0, 0, 253, 4, 0, 0, 64, 255, 0, 0, 0, 160, 159, 0, 0, 0, 240, 79, 0, 0, 0, 245, 14, 0, 0, 0, 251, 8, 0, 0, 16, 255, 2, 0, 0, 112, 223, 0, 0, 0, 192, 127, 0, 0, 0, 242, 31, 0, 0, 0, 248, 11, 0, 0, 0, 254, 5, 0, 0, 48, 255, 0, 0, 0, 144, 175, 0, 0, 0, 240, 79, 0, 0, 0, 245, 14, 0, 0, 0, 66, 3, 0, 0, 0 };
/* 0 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_48[] = { 11, 17, 13, 1, 16, 0, 0, 33, 0, 0, 0, 0, 212, 255, 175, 1, 0, 80, 255, 223, 255, 30, 0, 224, 191, 0, 242, 143, 0, 244, 47, 0, 128, 239, 0, 247, 15, 0, 96, 255, 1, 248, 14, 0, 228, 255, 2, 248, 14, 128, 255, 255, 2, 248, 30, 251, 90, 255, 2, 248, 239, 111, 64, 255, 2, 248, 223, 2, 64, 255, 2, 247, 15, 0, 80, 255, 1, 244, 47, 0, 128, 239, 0, 224, 191, 0, 226, 159, 0, 80, 255, 206, 255, 30, 0, 0, 229, 255, 207, 2, 0, 0, 0, 50, 1, 0, 0 };
/* 1 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_49[] = { 8, 15, 13, 1, 15, 0, 0, 80, 59, 0, 147, 255, 63, 208, 255, 255, 63, 241, 158, 247, 63, 64, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63, 0, 0, 244, 63 };
/* 2 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_50[] = { 12, 16, 13, 0, 16, 0, 0, 16, 1, 0, 0, 0, 161, 255, 239, 8, 0, 32, 254, 239, 255, 175, 0, 176, 239, 3, 144, 255, 3, 241, 111, 0, 0, 255, 7, 162, 42, 0, 0, 255, 7, 0, 0, 0, 48, 255, 4, 0, 0, 0, 192, 223, 0, 0, 0, 0, 249, 63, 0, 0, 0, 128, 255, 5, 0, 0, 0, 247, 127, 0, 0, 0, 80, 255, 8, 0, 0, 0, 244, 159, 0, 0, 0, 48, 255, 9, 0, 0, 0, 224, 255, 255, 255, 255, 31, 224, 255, 255, 255, 255, 31 };
/* 3 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_51[] = { 11, 17, 13, 0, 16, 0, 0, 16, 1, 0, 0, 0, 145, 255, 255, 25, 0, 16, 253, 239, 254, 223, 0, 144, 255, 4, 96, 255, 6, 192, 175, 0, 0, 253, 10, 0, 0, 0, 0, 253, 10, 0, 0, 0, 64, 255, 5, 0, 0, 151, 251, 159, 0, 0, 0, 253, 255, 45, 0, 0, 0, 84, 215, 255, 2, 0, 0, 0, 0, 253, 10, 0, 0, 0, 0, 249, 14, 240, 143, 0, 0, 250, 13, 192, 239, 2, 48, 255, 9, 48, 255, 223, 253, 239, 1, 0, 179, 255, 255, 26, 0, 0, 0, 32, 2, 0, 0 };
/* 4 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_52[] = { 12, 15, 13, 0, 15, 0, 0, 0, 226, 159, 0, 0, 0, 0, 252, 175, 0, 0, 0, 96, 255, 175, 0, 0, 0, 241, 239, 175, 0, 0, 0, 251, 200, 175, 0, 0, 80, 223, 192, 175, 0, 0, 225, 63, 192, 175, 0, 0, 250, 9, 192, 175, 0, 64, 239, 0, 192, 175, 0, 208, 159, 85, 213, 207, 37, 244, 255, 255, 255, 255, 143, 163, 170, 170, 234, 239, 90, 0, 0, 0, 192, 175, 0, 0, 0, 0, 192, 175, 0, 0, 0, 0, 192, 175, 0 };
/* 5 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_53[] = { 11, 16, 13, 1, 15, 64, 255, 255, 255, 191, 0, 96, 255, 255, 255, 207, 0, 112, 223, 68, 68, 52, 0, 144, 175, 0, 0, 0, 0, 176, 143, 0, 0, 0, 0, 208, 175, 201, 123, 0, 0, 224, 255, 255, 255, 29, 0, 176, 175, 52, 249, 175, 0, 0, 0, 0, 144, 255, 1, 0, 0, 0, 64, 255, 3, 0, 0, 0, 48, 255, 4, 246, 15, 0, 96, 255, 2, 242, 159, 0, 209, 223, 0, 128, 255, 206, 255, 79, 0, 0, 230, 255, 223, 4, 0, 0, 0, 50, 1, 0, 0 };
/* 6 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_54[] = { 11, 16, 13, 1, 15, 0, 0, 199, 238, 0, 0, 0, 227, 255, 239, 0, 0, 32, 255, 126, 19, 0, 0, 176, 223, 1, 0, 0, 0, 242, 79, 0, 0, 0, 0, 247, 46, 218, 157, 1, 0, 250, 254, 255, 255, 29, 0, 251, 191, 35, 248, 159, 0, 252, 13, 0, 176, 239, 0, 252, 11, 0, 96, 255, 0, 250, 12, 0, 80, 255, 1, 247, 31, 0, 128, 239, 0, 241, 175, 0, 243, 159, 0, 96, 255, 222, 255, 30, 0, 0, 229, 255, 191, 2, 0, 0, 0, 50, 1, 0, 0 };
/* 7 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_55[] = { 12, 15, 13, 0, 15, 241, 255, 255, 255, 255, 63, 241, 255, 255, 255, 255, 47, 32, 34, 34, 34, 249, 12, 0, 0, 0, 0, 255, 4, 0, 0, 0, 112, 223, 0, 0, 0, 0, 224, 111, 0, 0, 0, 0, 246, 15, 0, 0, 0, 0, 253, 8, 0, 0, 0, 80, 255, 2, 0, 0, 0, 192, 175, 0, 0, 0, 0, 243, 63, 0, 0, 0, 0, 251, 12, 0, 0, 0, 32, 255, 5, 0, 0, 0, 160, 239, 0, 0, 0, 0, 241, 127, 0, 0, 0 };
/* 8 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_56[] = { 11, 17, 13, 1, 16, 0, 0, 33, 0, 0, 0, 0, 214, 255, 191, 2, 0, 112, 255, 239, 255, 47, 0, 240, 191, 0, 243, 159, 0, 243, 79, 0, 160, 223, 0, 243, 63, 0, 144, 223, 0, 224, 175, 0, 225, 143, 0, 64, 255, 173, 254, 12, 0, 0, 250, 255, 255, 4, 0, 176, 239, 87, 250, 95, 0, 244, 63, 0, 144, 239, 0, 248, 14, 0, 64, 255, 2, 248, 15, 0, 80, 255, 2, 244, 143, 0, 209, 239, 0, 176, 255, 206, 255, 95, 0, 0, 248, 255, 223, 5, 0, 0, 0, 50, 1, 0, 0 };
/* 9 */ static const uint8_t Font_RobotoMono_Medium_21_glyph_57[] = { 10, 17, 13, 1, 16, 0, 0, 17, 0, 0, 0, 230, 255, 126, 0, 144, 255, 239, 255, 9, 243, 159, 0, 248, 63, 249, 14, 0, 208, 159, 251, 11, 0, 144, 223, 252, 11, 0, 112, 239, 250, 14, 0, 144, 255, 245, 143, 0, 245, 239, 176, 255, 238, 255, 223, 0, 249, 255, 169, 191, 0, 0, 1, 224, 111, 0, 0, 0, 247, 31, 0, 16, 164, 255, 6, 0, 249, 255, 143, 0, 0, 249, 174, 3, 0, 0, 0, 0, 0, 0 };
/* : */ static const uint8_t Font_RobotoMono_Medium_21_glyph_58[] = { 5, 14, 13, 4, 13, 0, 18, 0, 176, 255, 2, 240, 255, 7, 176, 255, 3, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 176, 255, 2, 240, 255, 7, 176, 255, 3, 0, 18, 0 };
/* ; */ static const uint8_t Font_RobotoMono_Medium_21_glyph_59[] = { 5, 17, 13, 4, 13, 0, 18, 0, 112, 255, 5, 208, 255, 10, 128, 255, 5, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 102, 0, 96, 255, 0, 96, 255, 0, 96, 255, 0, 144, 175, 0, 224, 63, 0, 145, 6, 0 };
/* < */ static const uint8_t Font_RobotoMono_Medium_21_glyph_60[] = { 10, 11, 13, 1, 12, 0, 0, 0, 0, 16, 0, 0, 0, 96, 157, 0, 0, 130, 255, 159, 0, 180, 255, 239, 40, 211, 255, 175, 4, 0, 245, 175, 1, 0, 0, 211, 255, 159, 4, 0, 0, 180, 255, 239, 40, 0, 0, 130, 255, 159, 0, 0, 0, 96, 157, 0, 0, 0, 0, 16 };
/* = */ static const uint8_t Font_RobotoMono_Medium_21_glyph_61[] = { 11, 7, 13, 1, 10, 163, 170, 170, 170, 170, 1, 245, 255, 255, 255, 255, 2, 97, 102, 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, 81, 85, 85, 85, 85, 0, 245, 255, 255, 255, 255, 2, 179, 187, 187, 187, 187, 1 };
/* > */ static const uint8_t Font_RobotoMono_Medium_21_glyph_62[] = { 10, 11, 13, 1, 12, 1, 0, 0, 0, 0, 228, 40, 0, 0, 0, 244, 255, 91, 0, 0, 96, 251, 255, 126, 1, 0, 16, 199, 255, 159, 0, 0, 0, 229, 239, 0, 16, 215, 255, 159, 96, 252, 255, 126, 1, 244, 255, 75, 0, 0, 228, 40, 0, 0, 0, 1, 0, 0, 0, 0 };
/* ? */ static const uint8_t Font_RobotoMono_Medium_21_glyph_63[] = { 11, 17, 13, 1, 16, 0, 0, 33, 1, 0, 0, 0, 213, 255, 223, 5, 0, 112, 255, 255, 255, 111, 0, 240, 207, 1, 209, 239, 0, 194, 60, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 225, 175, 0, 0, 0, 0, 252, 30, 0, 0, 0, 193, 239, 3, 0, 0, 0, 248, 47, 0, 0, 0, 0, 252, 9, 0, 0, 0, 0, 151, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 2, 0, 0, 0, 16, 255, 11, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 16, 0, 0, 0 };
/* @ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_64[] = { 12, 16, 13, 0, 15, 0, 0, 165, 205, 41, 0, 0, 160, 207, 169, 254, 4, 0, 250, 5, 0, 176, 31, 64, 95, 64, 186, 21, 127, 192, 12, 245, 221, 15, 202, 241, 6, 190, 112, 15, 231, 244, 67, 79, 128, 13, 246, 246, 113, 31, 160, 12, 231, 247, 145, 15, 176, 11, 185, 246, 129, 47, 224, 9, 125, 244, 52, 239, 237, 190, 30, 240, 10, 199, 39, 187, 3, 144, 95, 0, 0, 0, 0, 0, 252, 123, 150, 10, 0, 0, 128, 254, 239, 8, 0, 0, 0, 0, 0, 0, 0 };
/* A */ static const uint8_t Font_RobotoMono_Medium_21_glyph_65[] = { 13, 15, 13, 0, 15, 0, 0, 176, 175, 0, 0, 0, 0, 0, 241, 255, 0, 0, 0, 0, 0, 246, 255, 5, 0, 0, 0, 0, 251, 255, 10, 0, 0, 0, 16, 255, 247, 15, 0, 0, 0, 96, 239, 240, 79, 0, 0, 0, 176, 159, 176, 159, 0, 0, 0, 241, 79, 96, 239, 0, 0, 0, 245, 15, 16, 255, 4, 0, 0, 251, 142, 136, 255, 9, 0, 0, 255, 255, 255, 255, 14, 0, 80, 255, 153, 153, 250, 63, 0, 160, 223, 0, 0, 224, 143, 0, 240, 143, 0, 0, 160, 223, 0, 245, 63, 0, 0, 80, 255, 2 };
/* B */ static const uint8_t Font_RobotoMono_Medium_21_glyph_66[] = { 11, 15, 13, 1, 15, 247, 255, 239, 173, 3, 0, 248, 255, 255, 255, 127, 0, 248, 31, 33, 212, 255, 2, 248, 15, 0, 32, 255, 6, 248, 15, 0, 0, 255, 6, 248, 15, 0, 112, 255, 2, 248, 175, 170, 253, 111, 0, 248, 255, 255, 255, 44, 0, 248, 79, 68, 197, 255, 2, 248, 15, 0, 0, 254, 10, 248, 15, 0, 0, 250, 12, 248, 15, 0, 0, 253, 11, 248, 15, 0, 146, 255, 6, 248, 255, 255, 255, 191, 0, 248, 255, 255, 207, 6, 0 };
/* C */ static const uint8_t Font_RobotoMono_Medium_21_glyph_67[] = { 12, 17, 13, 0, 16, 0, 0, 16, 2, 0, 0, 0, 64, 252, 255, 76, 0, 0, 246, 255, 254, 255, 5, 32, 255, 26, 16, 252, 14, 128, 239, 0, 0, 242, 95, 208, 175, 0, 0, 176, 124, 240, 127, 0, 0, 0, 0, 240, 111, 0, 0, 0, 0, 241, 111, 0, 0, 0, 0, 240, 111, 0, 0, 0, 0, 240, 127, 0, 0, 0, 0, 208, 159, 0, 0, 128, 89, 144, 239, 0, 0, 241, 111, 32, 255, 9, 0, 251, 31, 0, 247, 239, 253, 255, 5, 0, 96, 254, 255, 77, 0, 0, 0, 32, 19, 0, 0 };
/* D */ static const uint8_t Font_RobotoMono_Medium_21_glyph_68[] = { 11, 15, 13, 1, 15, 248, 255, 206, 24, 0, 0, 249, 255, 255, 255, 5, 0, 249, 30, 81, 252, 79, 0, 249, 14, 0, 208, 239, 0, 249, 14, 0, 64, 255, 4, 249, 14, 0, 0, 255, 8, 249, 14, 0, 0, 253, 10, 249, 14, 0, 0, 253, 10, 249, 14, 0, 0, 253, 10, 249, 14, 0, 0, 255, 8, 249, 14, 0, 48, 255, 5, 249, 14, 0, 176, 239, 0, 249, 14, 48, 251, 95, 0, 249, 255, 255, 255, 7, 0, 249, 255, 223, 41, 0, 0 };
/* E */ static const uint8_t Font_RobotoMono_Medium_21_glyph_69[] = { 11, 15, 13, 1, 15, 245, 255, 255, 255, 255, 4, 245, 255, 255, 255, 255, 4, 245, 63, 17, 17, 17, 0, 245, 47, 0, 0, 0, 0, 245, 47, 0, 0, 0, 0, 245, 47, 0, 0, 0, 0, 245, 191, 187, 187, 59, 0, 245, 255, 255, 255, 95, 0, 245, 111, 68, 68, 20, 0, 245, 47, 0, 0, 0, 0, 245, 47, 0, 0, 0, 0, 245, 47, 0, 0, 0, 0, 245, 47, 0, 0, 0, 0, 245, 255, 255, 255, 255, 5, 245, 255, 255, 255, 255, 5 };
/* F */ static const uint8_t Font_RobotoMono_Medium_21_glyph_70[] = { 11, 15, 13, 1, 15, 244, 255, 255, 255, 255, 6, 244, 255, 255, 255, 255, 6, 244, 79, 17, 17, 17, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 143, 102, 102, 54, 0, 244, 255, 255, 255, 143, 0, 244, 191, 170, 170, 90, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0 };
/* G */ static const uint8_t Font_RobotoMono_Medium_21_glyph_71[] = { 12, 17, 13, 0, 16, 0, 0, 0, 2, 0, 0, 0, 64, 252, 255, 76, 0, 0, 245, 255, 254, 255, 6, 16, 255, 28, 16, 252, 31, 128, 255, 1, 0, 242, 95, 192, 191, 0, 0, 112, 55, 240, 143, 0, 0, 0, 0, 240, 127, 0, 0, 0, 0, 241, 127, 0, 133, 136, 72, 240, 127, 0, 249, 255, 143, 240, 127, 0, 99, 246, 143, 208, 175, 0, 0, 224, 143, 128, 255, 1, 0, 224, 143, 16, 255, 27, 0, 243, 143, 0, 246, 255, 237, 255, 63, 0, 64, 253, 255, 159, 1, 0, 0, 16, 35, 0, 0 };
/* H */ static const uint8_t Font_RobotoMono_Medium_21_glyph_72[] = { 11, 15, 13, 1, 15, 249, 11, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 190, 187, 203, 255, 2, 250, 255, 255, 255, 255, 2, 250, 93, 85, 117, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2, 250, 12, 0, 48, 255, 2 };
/* I */ static const uint8_t Font_RobotoMono_Medium_21_glyph_73[] = { 10, 15, 13, 1, 15, 241, 255, 255, 255, 175, 241, 255, 255, 255, 191, 16, 17, 255, 24, 17, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 241, 255, 255, 255, 191, 241, 255, 255, 255, 191 };
/* J */ static const uint8_t Font_RobotoMono_Medium_21_glyph_74[] = { 11, 16, 13, 1, 15, 0, 0, 0, 96, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 0, 0, 0, 112, 255, 0, 85, 3, 0, 112, 255, 0, 253, 11, 0, 160, 239, 0, 248, 79, 0, 245, 159, 0, 225, 255, 238, 255, 29, 0, 16, 250, 255, 159, 1, 0, 0, 0, 34, 0, 0, 0 };
/* K */ static const uint8_t Font_RobotoMono_Medium_21_glyph_75[] = { 12, 15, 13, 1, 15, 247, 15, 0, 16, 253, 29, 248, 15, 0, 176, 255, 3, 248, 15, 0, 248, 127, 0, 248, 15, 64, 255, 10, 0, 248, 15, 225, 223, 0, 0, 248, 15, 252, 47, 0, 0, 248, 143, 255, 7, 0, 0, 248, 255, 255, 12, 0, 0, 248, 255, 253, 111, 0, 0, 248, 191, 192, 255, 1, 0, 248, 15, 32, 255, 11, 0, 248, 15, 0, 248, 95, 0, 248, 15, 0, 208, 239, 1, 248, 15, 0, 64, 255, 10, 248, 15, 0, 0, 250, 79 };
/* L */ static const uint8_t Font_RobotoMono_Medium_21_glyph_76[] = { 11, 15, 13, 1, 15, 243, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 63, 0, 0, 0, 0, 244, 255, 255, 255, 255, 5, 244, 255, 255, 255, 255, 5 };
/* M */ static const uint8_t Font_RobotoMono_Medium_21_glyph_77[] = { 11, 15, 13, 1, 15, 249, 143, 0, 192, 255, 6, 249, 223, 0, 241, 255, 6, 249, 255, 2, 246, 255, 6, 249, 255, 7, 252, 254, 6, 249, 251, 27, 223, 252, 6, 249, 217, 127, 143, 253, 6, 249, 138, 255, 63, 253, 6, 249, 58, 255, 13, 253, 6, 249, 10, 254, 8, 254, 6, 249, 11, 249, 3, 254, 6, 249, 11, 98, 0, 254, 6, 249, 11, 0, 0, 254, 6, 249, 11, 0, 0, 254, 6, 249, 11, 0, 0, 254, 6, 249, 11, 0, 0, 254, 6 };
/* N */ static const uint8_t Font_RobotoMono_Medium_21_glyph_78[] = { 11, 15, 13, 1, 15, 249, 30, 0, 64, 255, 2, 250, 143, 0, 80, 255, 2, 250, 255, 0, 80, 255, 2, 250, 255, 7, 80, 255, 2, 250, 255, 14, 80, 255, 2, 250, 205, 111, 80, 255, 2, 250, 93, 223, 80, 255, 2, 250, 13, 253, 85, 255, 2, 250, 13, 245, 93, 255, 2, 250, 13, 224, 175, 255, 2, 250, 13, 96, 255, 255, 2, 250, 13, 0, 254, 255, 2, 250, 13, 0, 247, 255, 2, 250, 13, 0, 241, 255, 2, 250, 13, 0, 128, 255, 2 };
/* O */ static const uint8_t Font_RobotoMono_Medium_21_glyph_79[] = { 12, 17, 13, 0, 16, 0, 0, 16, 1, 0, 0, 0, 80, 253, 255, 25, 0, 0, 246, 255, 255, 223, 1, 32, 255, 27, 80, 255, 10, 128, 239, 0, 0, 247, 47, 208, 175, 0, 0, 241, 111, 240, 127, 0, 0, 224, 159, 240, 111, 0, 0, 208, 175, 241, 111, 0, 0, 208, 175, 240, 111, 0, 0, 208, 175, 240, 127, 0, 0, 224, 159, 208, 159, 0, 0, 240, 111, 144, 239, 0, 0, 246, 47, 32, 255, 10, 48, 254, 11, 0, 247, 255, 254, 239, 1, 0, 96, 254, 255, 27, 0, 0, 0, 32, 2, 0, 0 };
/* P */ static const uint8_t Font_RobotoMono_Medium_21_glyph_80[] = { 11, 15, 13, 1, 15, 244, 255, 239, 174, 4, 0, 244, 255, 255, 255, 143, 0, 244, 63, 17, 179, 255, 5, 244, 47, 0, 0, 254, 11, 244, 47, 0, 0, 250, 13, 244, 47, 0, 0, 251, 12, 244, 47, 0, 80, 255, 8, 244, 207, 187, 253, 223, 1, 244, 255, 255, 255, 26, 0, 244, 111, 85, 20, 0, 0, 244, 47, 0, 0, 0, 0, 244, 47, 0, 0, 0, 0, 244, 47, 0, 0, 0, 0, 244, 47, 0, 0, 0, 0, 244, 47, 0, 0, 0, 0 };
/* Q */ static const uint8_t Font_RobotoMono_Medium_21_glyph_81[] = { 13, 19, 13, 0, 16, 0, 0, 16, 2, 0, 0, 0, 0, 64, 253, 255, 26, 0, 0, 0, 246, 255, 255, 239, 1, 0, 32, 255, 27, 64, 254, 11, 0, 128, 239, 0, 0, 245, 63, 0, 208, 175, 0, 0, 240, 143, 0, 240, 127, 0, 0, 192, 175, 0, 241, 111, 0, 0, 176, 207, 0, 241, 111, 0, 0, 176, 207, 0, 241, 111, 0, 0, 176, 207, 0, 240, 127, 0, 0, 192, 191, 0, 224, 159, 0, 0, 224, 143, 0, 144, 239, 0, 0, 244, 79, 0, 32, 255, 10, 32, 254, 13, 0, 0, 247, 255, 254, 255, 2, 0, 0, 80, 254, 255, 255, 6, 0, 0, 0, 32, 19, 250, 143, 0, 0, 0, 0, 0, 144, 207, 0, 0, 0, 0, 0, 0, 5, 0 };
/* R */ static const uint8_t Font_RobotoMono_Medium_21_glyph_82[] = { 12, 15, 13, 1, 15, 246, 255, 239, 157, 3, 0, 247, 255, 255, 255, 111, 0, 247, 31, 17, 212, 255, 2, 247, 15, 0, 32, 255, 7, 247, 15, 0, 0, 254, 9, 247, 15, 0, 0, 255, 7, 247, 15, 0, 160, 255, 2, 247, 207, 220, 255, 127, 0, 247, 255, 255, 255, 4, 0, 247, 63, 99, 255, 4, 0, 247, 15, 0, 252, 12, 0, 247, 15, 0, 245, 95, 0, 247, 15, 0, 208, 223, 0, 247, 15, 0, 80, 255, 5, 247, 15, 0, 0, 253, 13 };
/* S */ static const uint8_t Font_RobotoMono_Medium_21_glyph_83[] = { 11, 17, 13, 1, 16, 0, 0, 32, 1, 0, 0, 0, 197, 255, 223, 6, 0, 128, 255, 239, 255, 159, 0, 243, 175, 1, 144, 255, 4, 247, 15, 0, 0, 254, 10, 247, 31, 0, 0, 100, 5, 243, 207, 2, 0, 0, 0, 112, 255, 207, 22, 0, 0, 0, 213, 255, 255, 8, 0, 0, 0, 148, 255, 191, 0, 0, 0, 0, 144, 255, 6, 135, 4, 0, 0, 253, 11, 253, 11, 0, 0, 252, 12, 247, 127, 0, 80, 255, 8, 176, 255, 223, 254, 223, 1, 0, 214, 255, 255, 25, 0, 0, 0, 33, 2, 0, 0 };
/* T */ static const uint8_t Font_RobotoMono_Medium_21_glyph_84[] = { 13, 15, 13, 0, 15, 247, 255, 255, 255, 255, 255, 1, 248, 255, 255, 255, 255, 255, 2, 16, 17, 241, 159, 17, 17, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 0, 240, 143, 0, 0, 0 };
/* U */ static const uint8_t Font_RobotoMono_Medium_21_glyph_85[] = { 11, 16, 13, 1, 15, 249, 11, 0, 32, 255, 3, 250, 12, 0, 48, 255, 3, 250, 12, 0, 48, 255, 3, 250, 12, 0, 48, 255, 3, 250, 12, 0, 48, 255, 3, 250, 12, 0, 48, 255, 3, 250, 13, 0, 48, 255, 4, 250, 13, 0, 48, 255, 4, 250, 13, 0, 48, 255, 4, 250, 13, 0, 48, 255, 4, 250, 13, 0, 64, 255, 3, 247, 31, 0, 112, 255, 1, 242, 175, 0, 226, 191, 0, 128, 255, 222, 255, 47, 0, 0, 231, 255, 191, 2, 0, 0, 0, 50, 1, 0, 0 };
/* V */ static const uint8_t Font_RobotoMono_Medium_21_glyph_86[] = { 13, 15, 13, 0, 15, 245, 79, 0, 0, 176, 223, 0, 241, 159, 0, 0, 240, 175, 0, 192, 223, 0, 0, 244, 95, 0, 112, 255, 2, 0, 249, 15, 0, 32, 255, 6, 0, 253, 11, 0, 0, 253, 10, 16, 255, 6, 0, 0, 248, 15, 96, 255, 1, 0, 0, 243, 63, 160, 207, 0, 0, 0, 224, 143, 224, 127, 0, 0, 0, 144, 207, 243, 47, 0, 0, 0, 64, 255, 249, 13, 0, 0, 0, 0, 255, 255, 8, 0, 0, 0, 0, 250, 255, 4, 0, 0, 0, 0, 245, 239, 0, 0, 0, 0, 0, 241, 175, 0, 0, 0 };
/* W */ static const uint8_t Font_RobotoMono_Medium_21_glyph_87[] = { 13, 15, 13, 0, 15, 247, 12, 160, 95, 16, 255, 3, 245, 14, 208, 143, 32, 255, 1, 243, 15, 240, 175, 64, 255, 0, 241, 47, 242, 223, 96, 223, 0, 240, 79, 244, 255, 128, 191, 0, 208, 95, 247, 254, 162, 159, 0, 176, 127, 250, 249, 197, 111, 0, 144, 159, 252, 244, 215, 79, 0, 96, 191, 223, 241, 250, 47, 0, 64, 239, 175, 240, 254, 15, 0, 32, 255, 127, 192, 255, 14, 0, 0, 255, 95, 144, 255, 12, 0, 0, 254, 47, 96, 255, 10, 0, 0, 252, 15, 64, 255, 8, 0, 0, 250, 13, 16, 255, 6, 0 };
/* X */ static const uint8_t Font_RobotoMono_Medium_21_glyph_88[] = { 13, 15, 13, 0, 15, 225, 191, 0, 0, 208, 223, 0, 128, 255, 4, 0, 247, 95, 0, 0, 254, 12, 0, 254, 12, 0, 0, 245, 79, 112, 255, 3, 0, 0, 192, 223, 241, 175, 0, 0, 0, 48, 255, 252, 31, 0, 0, 0, 0, 250, 255, 7, 0, 0, 0, 0, 243, 255, 1, 0, 0, 0, 0, 250, 255, 8, 0, 0, 0, 64, 255, 252, 47, 0, 0, 0, 208, 223, 224, 191, 0, 0, 0, 246, 79, 96, 255, 4, 0, 16, 254, 12, 0, 253, 13, 0, 144, 255, 4, 0, 245, 111, 0, 242, 191, 0, 0, 208, 239, 1 };
/* Y */ static const uint8_t Font_RobotoMono_Medium_21_glyph_89[] = { 13, 15, 13, 0, 15, 244, 111, 0, 0, 176, 239, 0, 208, 223, 0, 0, 242, 143, 0, 80, 255, 4, 0, 249, 31, 0, 0, 253, 11, 16, 255, 8, 0, 0, 246, 47, 112, 255, 1, 0, 0, 208, 159, 224, 159, 0, 0, 0, 96, 255, 246, 31, 0, 0, 0, 0, 254, 255, 9, 0, 0, 0, 0, 247, 255, 1, 0, 0, 0, 0, 240, 175, 0, 0, 0, 0, 0, 224, 143, 0, 0, 0, 0, 0, 224, 143, 0, 0, 0, 0, 0, 224, 143, 0, 0, 0, 0, 0, 224, 143, 0, 0, 0, 0, 0, 224, 143, 0, 0, 0 };
/* Z */ static const uint8_t Font_RobotoMono_Medium_21_glyph_90[] = { 11, 15, 13, 1, 15, 253, 255, 255, 255, 255, 4, 254, 255, 255, 255, 255, 4, 17, 17, 17, 226, 207, 0, 0, 0, 0, 249, 47, 0, 0, 0, 48, 255, 7, 0, 0, 0, 208, 207, 0, 0, 0, 0, 248, 47, 0, 0, 0, 48, 255, 8, 0, 0, 0, 192, 223, 0, 0, 0, 0, 247, 63, 0, 0, 0, 32, 255, 8, 0, 0, 0, 192, 223, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 255, 255, 255, 255, 255, 8, 255, 255, 255, 255, 255, 8 };
/* [ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_91[] = { 5, 22, 13, 4, 18, 50, 51, 2, 252, 255, 9, 252, 190, 6, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 9, 0, 252, 157, 5, 252, 255, 9, 84, 85, 3 };
/* \ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_92[] = { 9, 17, 13, 2, 15, 246, 12, 0, 0, 0, 241, 63, 0, 0, 0, 176, 159, 0, 0, 0, 80, 239, 0, 0, 0, 0, 255, 4, 0, 0, 0, 249, 10, 0, 0, 0, 244, 15, 0, 0, 0, 224, 111, 0, 0, 0, 128, 191, 0, 0, 0, 32, 255, 1, 0, 0, 0, 252, 7, 0, 0, 0, 247, 13, 0, 0, 0, 241, 47, 0, 0, 0, 176, 143, 0, 0, 0, 80, 239, 0, 0, 0, 0, 255, 4, 0, 0, 0, 67, 2 };
/* ] */ static const uint8_t Font_RobotoMono_Medium_21_glyph_93[] = { 5, 22, 13, 4, 18, 51, 51, 1, 254, 255, 8, 186, 255, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 0, 254, 8, 152, 255, 8, 254, 255, 8, 84, 85, 2 };
/* ^ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_94[] = { 9, 8, 13, 2, 15, 0, 144, 127, 0, 0, 0, 241, 223, 0, 0, 0, 247, 254, 4, 0, 0, 253, 246, 11, 0, 64, 191, 224, 31, 0, 176, 95, 128, 143, 0, 242, 14, 16, 239, 0, 248, 8, 0, 251, 5 };
/* _ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_95[] = { 10, 2, 13, 1, 0, 247, 255, 255, 255, 239, 246, 255, 255, 255, 223 };
/* ` */ static const uint8_t Font_RobotoMono_Medium_21_glyph_96[] = { 5, 4, 13, 4, 16, 33, 2, 0, 243, 127, 0, 48, 255, 2, 0, 164, 6 };
/* a */ static const uint8_t Font_RobotoMono_Medium_21_glyph_97[] = { 11, 13, 13, 1, 12, 0, 16, 68, 2, 0, 0, 16, 251, 255, 223, 4, 0, 208, 255, 170, 254, 63, 0, 245, 63, 0, 225, 159, 0, 16, 1, 0, 176, 191, 0, 0, 131, 187, 236, 207, 0, 160, 255, 206, 252, 207, 0, 245, 95, 0, 176, 207, 0, 249, 13, 0, 176, 207, 0, 249, 47, 0, 245, 207, 0, 243, 255, 236, 255, 223, 0, 64, 253, 255, 137, 255, 1, 0, 32, 3, 0, 0, 0 };
/* b */ static const uint8_t Font_RobotoMono_Medium_21_glyph_98[] = { 11, 17, 13, 1, 16, 196, 12, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 65, 4, 0, 0, 246, 127, 255, 255, 7, 0, 246, 255, 189, 255, 95, 0, 246, 143, 0, 209, 223, 0, 246, 31, 0, 96, 255, 2, 246, 31, 0, 32, 255, 4, 246, 31, 0, 16, 255, 5, 246, 31, 0, 32, 255, 4, 246, 31, 0, 96, 255, 2, 246, 175, 0, 225, 223, 0, 246, 255, 223, 255, 79, 0, 246, 94, 254, 239, 5, 0, 0, 0, 32, 2, 0, 0 };
/* c */ static const uint8_t Font_RobotoMono_Medium_21_glyph_99[] = { 11, 13, 13, 1, 12, 0, 0, 67, 3, 0, 0, 0, 230, 255, 239, 5, 0, 112, 255, 189, 254, 95, 0, 242, 159, 0, 192, 223, 0, 247, 31, 0, 64, 238, 0, 250, 13, 0, 0, 0, 0, 250, 12, 0, 0, 0, 0, 250, 13, 0, 0, 0, 0, 246, 31, 0, 48, 170, 0, 241, 175, 0, 176, 223, 0, 96, 255, 206, 255, 79, 0, 0, 229, 255, 207, 3, 0, 0, 0, 50, 1, 0, 0 };
/* d */ static const uint8_t Font_RobotoMono_Medium_21_glyph_100[] = { 10, 17, 13, 1, 16, 0, 0, 0, 96, 188, 0, 0, 0, 128, 255, 0, 0, 0, 128, 255, 0, 0, 0, 128, 255, 0, 32, 52, 128, 255, 0, 250, 255, 173, 255, 176, 255, 189, 255, 255, 243, 159, 0, 209, 255, 248, 15, 0, 128, 255, 251, 12, 0, 128, 255, 251, 11, 0, 128, 255, 250, 12, 0, 128, 255, 248, 31, 0, 128, 255, 242, 175, 0, 226, 255, 144, 255, 222, 255, 255, 0, 249, 255, 124, 255, 0, 0, 19, 0, 0 };
/* e */ static const uint8_t Font_RobotoMono_Medium_21_glyph_101[] = { 11, 13, 13, 1, 12, 0, 0, 67, 3, 0, 0, 0, 229, 255, 239, 5, 0, 96, 255, 190, 254, 95, 0, 241, 175, 0, 160, 239, 0, 247, 31, 0, 32, 255, 3, 250, 158, 153, 153, 255, 5, 251, 255, 255, 255, 255, 6, 251, 61, 51, 51, 51, 1, 248, 47, 0, 0, 0, 0, 241, 223, 2, 16, 155, 0, 80, 255, 223, 253, 223, 0, 0, 196, 255, 255, 9, 0, 0, 0, 49, 2, 0, 0 };
/* f */ static const uint8_t Font_RobotoMono_Medium_21_glyph_102[] = { 11, 17, 13, 1, 17, 0, 0, 0, 32, 18, 0, 0, 0, 161, 255, 255, 10, 0, 0, 252, 239, 237, 9, 0, 80, 255, 7, 0, 0, 0, 144, 239, 0, 0, 0, 16, 161, 223, 17, 17, 0, 249, 255, 255, 255, 255, 0, 183, 235, 255, 187, 187, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 160, 223, 0, 0, 0 };
/* g */ static const uint8_t Font_RobotoMono_Medium_21_glyph_103[] = { 11, 17, 13, 1, 12, 0, 16, 52, 0, 17, 0, 0, 250, 255, 126, 255, 0, 160, 255, 190, 255, 255, 0, 243, 175, 0, 192, 255, 0, 248, 31, 0, 96, 255, 0, 250, 12, 0, 96, 255, 0, 251, 11, 0, 96, 255, 0, 250, 12, 0, 96, 255, 0, 248, 31, 0, 96, 255, 0, 242, 175, 0, 209, 255, 0, 144, 255, 223, 255, 255, 0, 0, 248, 255, 156, 255, 0, 0, 0, 34, 128, 255, 0, 64, 8, 0, 225, 191, 0, 224, 223, 169, 254, 63, 0, 48, 252, 255, 223, 4, 0, 0, 32, 85, 3, 0, 0 };
/* h */ static const uint8_t Font_RobotoMono_Medium_21_glyph_104[] = { 11, 16, 13, 1, 16, 196, 12, 0, 0, 0, 0, 246, 15, 0, 0, 0, 0, 246, 15, 0, 0, 0, 0, 246, 15, 0, 0, 0, 0, 246, 15, 48, 36, 0, 0, 246, 63, 253, 255, 27, 0, 246, 239, 190, 254, 175, 0, 246, 127, 0, 176, 255, 0, 246, 15, 0, 80, 255, 2, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3, 246, 15, 0, 64, 255, 3 };
/* i */ static const uint8_t Font_RobotoMono_Medium_21_glyph_105[] = { 10, 16, 13, 2, 16, 0, 0, 36, 0, 0, 0, 128, 255, 0, 0, 0, 128, 207, 0, 0, 0, 0, 2, 0, 0, 17, 17, 17, 0, 0, 253, 255, 255, 0, 0, 252, 255, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 1, 0, 253, 255, 255, 255, 79, 253, 255, 255, 255, 79 };
/* j */ static const uint8_t Font_RobotoMono_Medium_21_glyph_106[] = { 7, 21, 13, 2, 16, 0, 0, 65, 1, 0, 0, 252, 12, 0, 0, 252, 13, 0, 0, 81, 1, 16, 17, 17, 1, 224, 255, 255, 12, 208, 255, 255, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 12, 0, 0, 251, 11, 0, 16, 255, 9, 150, 233, 255, 3, 251, 255, 127, 0, 116, 87, 1, 0 };
/* k */ static const uint8_t Font_RobotoMono_Medium_21_glyph_107[] = { 11, 16, 13, 1, 16, 196, 12, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 16, 17, 0, 246, 31, 0, 243, 207, 0, 246, 31, 32, 254, 12, 0, 246, 31, 226, 223, 1, 0, 246, 63, 254, 30, 0, 0, 246, 239, 255, 3, 0, 0, 246, 255, 255, 12, 0, 0, 246, 239, 247, 143, 0, 0, 246, 47, 144, 255, 4, 0, 246, 31, 0, 253, 47, 0, 246, 31, 0, 243, 207, 0, 246, 31, 0, 96, 255, 9 };
/* l */ static const uint8_t Font_RobotoMono_Medium_21_glyph_108[] = { 10, 16, 13, 2, 16, 203, 204, 204, 0, 0, 255, 255, 255, 0, 0, 68, 148, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 0, 0, 0, 112, 255, 1, 0, 255, 255, 255, 255, 111, 255, 255, 255, 255, 111 };
/* m */ static const uint8_t Font_RobotoMono_Medium_21_glyph_109[] = { 12, 12, 13, 0, 12, 16, 1, 66, 0, 66, 0, 242, 143, 255, 141, 255, 30, 242, 239, 252, 255, 252, 143, 242, 47, 224, 127, 160, 175, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191, 242, 31, 208, 111, 144, 191 };
/* n */ static const uint8_t Font_RobotoMono_Medium_21_glyph_110[] = { 11, 12, 13, 1, 12, 16, 1, 48, 36, 0, 0, 246, 61, 253, 255, 28, 0, 246, 239, 190, 254, 175, 0, 246, 143, 0, 176, 255, 0, 246, 15, 0, 80, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2, 246, 15, 0, 64, 255, 2 };
/* o */ static const uint8_t Font_RobotoMono_Medium_21_glyph_111[] = { 11, 13, 13, 1, 12, 0, 0, 67, 2, 0, 0, 0, 248, 255, 223, 3, 0, 160, 255, 189, 254, 63, 0, 244, 143, 0, 209, 223, 0, 249, 14, 0, 80, 255, 3, 252, 10, 0, 16, 255, 6, 253, 9, 0, 0, 255, 6, 252, 10, 0, 16, 255, 6, 249, 14, 0, 80, 255, 2, 243, 159, 0, 209, 207, 0, 128, 255, 206, 255, 63, 0, 0, 230, 255, 207, 3, 0, 0, 0, 50, 1, 0, 0 };
/* p */ static const uint8_t Font_RobotoMono_Medium_21_glyph_112[] = { 11, 17, 13, 1, 12, 16, 1, 65, 4, 0, 0, 246, 126, 255, 255, 6, 0, 246, 255, 205, 255, 95, 0, 246, 127, 0, 226, 223, 0, 246, 31, 0, 112, 255, 1, 246, 31, 0, 48, 255, 4, 246, 31, 0, 32, 255, 4, 246, 31, 0, 48, 255, 3, 246, 31, 0, 112, 255, 1, 246, 143, 0, 226, 207, 0, 246, 255, 206, 255, 63, 0, 246, 127, 254, 239, 4, 0, 246, 31, 32, 2, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 246, 31, 0, 0, 0, 0, 65, 4, 0, 0, 0, 0 };
/* q */ static const uint8_t Font_RobotoMono_Medium_21_glyph_113[] = { 10, 17, 13, 1, 12, 0, 32, 52, 0, 17, 0, 251, 255, 125, 255, 176, 255, 189, 254, 255, 243, 159, 0, 192, 255, 248, 15, 0, 128, 255, 251, 12, 0, 128, 255, 251, 11, 0, 128, 255, 250, 12, 0, 128, 255, 248, 31, 0, 128, 255, 243, 175, 0, 209, 255, 144, 255, 206, 255, 255, 0, 249, 255, 172, 255, 0, 0, 35, 128, 255, 0, 0, 0, 128, 255, 0, 0, 0, 128, 255, 0, 0, 0, 128, 255, 0, 0, 0, 32, 68 };
/* r */ static const uint8_t Font_RobotoMono_Medium_21_glyph_114[] = { 9, 12, 13, 3, 12, 17, 0, 48, 52, 0, 254, 71, 254, 255, 3, 254, 252, 255, 255, 1, 254, 223, 37, 67, 0, 254, 14, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0, 254, 9, 0, 0, 0 };
/* s */ static const uint8_t Font_RobotoMono_Medium_21_glyph_115[] = { 11, 13, 13, 1, 12, 0, 0, 67, 3, 0, 0, 0, 249, 255, 255, 8, 0, 160, 255, 154, 251, 159, 0, 241, 111, 0, 128, 255, 1, 241, 127, 0, 16, 51, 0, 160, 255, 140, 21, 0, 0, 0, 231, 255, 255, 26, 0, 0, 0, 115, 251, 223, 0, 115, 6, 0, 80, 255, 3, 245, 79, 0, 80, 255, 2, 192, 255, 172, 252, 191, 0, 0, 232, 255, 239, 8, 0, 0, 0, 50, 2, 0, 0 };
/* t */ static const uint8_t Font_RobotoMono_Medium_21_glyph_116[] = { 11, 15, 13, 1, 14, 0, 192, 108, 0, 0, 0, 0, 240, 143, 0, 0, 0, 16, 241, 159, 17, 17, 0, 250, 255, 255, 255, 191, 0, 183, 251, 223, 187, 139, 0, 0, 240, 143, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 240, 143, 0, 0, 0, 0, 208, 223, 1, 0, 0, 0, 112, 255, 223, 254, 0, 0, 0, 248, 255, 223, 0, 0, 0, 0, 35, 1, 0 };
/* u */ static const uint8_t Font_RobotoMono_Medium_21_glyph_117[] = { 11, 13, 13, 1, 12, 16, 1, 0, 0, 17, 0, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 245, 47, 0, 96, 255, 1, 244, 63, 0, 96, 255, 1, 241, 159, 0, 210, 255, 1, 160, 255, 222, 239, 255, 1, 16, 251, 255, 58, 255, 1, 0, 16, 19, 0, 0, 0 };
/* v */ static const uint8_t Font_RobotoMono_Medium_21_glyph_118[] = { 12, 12, 13, 0, 12, 16, 1, 0, 0, 16, 17, 224, 159, 0, 0, 240, 143, 128, 239, 0, 0, 245, 31, 32, 255, 4, 0, 251, 11, 0, 251, 9, 0, 255, 5, 0, 245, 14, 80, 239, 0, 0, 224, 79, 176, 143, 0, 0, 128, 175, 241, 47, 0, 0, 32, 255, 246, 12, 0, 0, 0, 252, 254, 5, 0, 0, 0, 246, 255, 0, 0, 0, 0, 240, 159, 0, 0 };
/* w */ static const uint8_t Font_RobotoMono_Medium_21_glyph_119[] = { 13, 12, 13, 0, 12, 16, 0, 0, 1, 0, 17, 0, 248, 10, 160, 63, 32, 255, 0, 245, 13, 224, 111, 64, 223, 0, 242, 15, 241, 159, 112, 175, 0, 224, 47, 244, 222, 144, 127, 0, 176, 79, 248, 249, 176, 79, 0, 128, 111, 219, 245, 228, 31, 0, 80, 159, 159, 241, 248, 14, 0, 32, 223, 111, 208, 253, 11, 0, 0, 255, 47, 160, 255, 7, 0, 0, 252, 14, 96, 255, 4, 0, 0, 249, 11, 32, 255, 1, 0 };
/* x */ static const uint8_t Font_RobotoMono_Medium_21_glyph_120[] = { 11, 12, 13, 1, 12, 17, 1, 0, 0, 17, 1, 246, 79, 0, 80, 255, 6, 176, 239, 1, 225, 191, 0, 16, 254, 10, 251, 30, 0, 0, 244, 191, 255, 4, 0, 0, 144, 255, 159, 0, 0, 0, 32, 255, 47, 0, 0, 0, 192, 255, 191, 0, 0, 0, 247, 127, 255, 7, 0, 48, 255, 8, 248, 63, 0, 208, 207, 0, 192, 223, 0, 250, 47, 0, 32, 255, 9 };
/* y */ static const uint8_t Font_RobotoMono_Medium_21_glyph_121[] = { 13, 17, 13, 0, 12, 16, 1, 0, 0, 0, 17, 0, 242, 143, 0, 0, 160, 255, 1, 160, 239, 0, 0, 241, 159, 0, 48, 255, 5, 0, 247, 47, 0, 0, 252, 12, 0, 253, 11, 0, 0, 245, 47, 48, 255, 4, 0, 0, 224, 159, 144, 223, 0, 0, 0, 112, 255, 241, 111, 0, 0, 0, 0, 255, 251, 14, 0, 0, 0, 0, 248, 255, 8, 0, 0, 0, 0, 242, 255, 1, 0, 0, 0, 0, 192, 175, 0, 0, 0, 0, 0, 243, 63, 0, 0, 0, 0, 0, 252, 12, 0, 0, 0, 0, 201, 255, 3, 0, 0, 0, 32, 255, 111, 0, 0, 0, 0, 16, 119, 2, 0, 0, 0, 0 };
/* z */ static const uint8_t Font_RobotoMono_Medium_21_glyph_122[] = { 11, 12, 13, 1, 12, 16, 17, 17, 17, 17, 0, 247, 255, 255, 255, 255, 1, 231, 238, 238, 254, 239, 0, 0, 0, 0, 251, 79, 0, 0, 0, 144, 255, 6, 0, 0, 0, 247, 143, 0, 0, 0, 64, 255, 10, 0, 0, 0, 243, 207, 0, 0, 0, 16, 254, 30, 0, 0, 0, 192, 255, 2, 0, 0, 0, 248, 255, 255, 255, 255, 6, 249, 255, 255, 255, 255, 6 };
/* { */ static const uint8_t Font_RobotoMono_Medium_21_glyph_123[] = { 8, 21, 13, 3, 17, 0, 0, 32, 4, 0, 0, 248, 15, 0, 80, 223, 2, 0, 192, 111, 0, 0, 240, 79, 0, 0, 241, 63, 0, 0, 241, 63, 0, 0, 241, 63, 0, 0, 245, 15, 0, 115, 254, 6, 0, 252, 111, 0, 0, 199, 239, 3, 0, 0, 248, 13, 0, 0, 242, 47, 0, 0, 241, 63, 0, 0, 241, 63, 0, 0, 240, 63, 0, 0, 208, 111, 0, 0, 128, 207, 0, 0, 0, 252, 13, 0, 0, 112, 9 };
/* | */ static const uint8_t Font_RobotoMono_Medium_21_glyph_124[] = { 3, 20, 13, 5, 15, 247, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 248, 2, 33, 0 };
/* } */ static const uint8_t Font_RobotoMono_Medium_21_glyph_125[] = { 8, 21, 13, 3, 17, 66, 0, 0, 0, 248, 45, 0, 0, 128, 223, 0, 0, 0, 254, 4, 0, 0, 252, 7, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 251, 9, 0, 0, 248, 12, 0, 0, 225, 175, 4, 0, 16, 253, 63, 0, 160, 239, 42, 0, 245, 30, 0, 0, 250, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 254, 5, 0, 80, 239, 0, 0, 246, 95, 0, 0, 148, 3, 0, 0 };
/* ~ */ static const uint8_t Font_RobotoMono_Medium_21_glyph_126[] = { 12, 6, 13, 0, 9, 0, 82, 3, 0, 0, 0, 128, 255, 207, 2, 0, 155, 244, 191, 254, 111, 97, 191, 248, 5, 144, 255, 255, 79, 98, 0, 0, 197, 239, 6, 0, 0, 0, 0, 0, 0 };
/* ? */ const uint8_t Font_RobotoMono_Medium_21_glyph_nonprintable[] = { 11, 17, 13, 1, 16, 255, 255, 222, 254, 255, 255, 255, 42, 0, 32, 250, 255, 143, 0, 0, 0, 144, 255, 15, 48, 254, 46, 16, 255, 61, 195, 255, 143, 0, 255, 255, 255, 255, 143, 0, 255, 255, 255, 255, 30, 80, 255, 255, 255, 255, 3, 225, 255, 255, 255, 62, 16, 252, 255, 255, 255, 7, 208, 255, 255, 255, 255, 3, 246, 255, 255, 255, 255, 104, 251, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 105, 253, 255, 255, 255, 239, 0, 244, 255, 255, 255, 255, 2, 248, 255, 255, 255, 255, 239, 255, 255, 255 };
const uint8_t * const Font_RobotoMono_Medium_21[126 + 1 - 32] = {
Font_RobotoMono_Medium_21_glyph_32,
Font_RobotoMono_Medium_21_glyph_33,
Font_RobotoMono_Medium_21_glyph_34,
Font_RobotoMono_Medium_21_glyph_35,
Font_RobotoMono_Medium_21_glyph_36,
Font_RobotoMono_Medium_21_glyph_37,
Font_RobotoMono_Medium_21_glyph_38,
Font_RobotoMono_Medium_21_glyph_39,
Font_RobotoMono_Medium_21_glyph_40,
Font_RobotoMono_Medium_21_glyph_41,
Font_RobotoMono_Medium_21_glyph_42,
Font_RobotoMono_Medium_21_glyph_43,
Font_RobotoMono_Medium_21_glyph_44,
Font_RobotoMono_Medium_21_glyph_45,
Font_RobotoMono_Medium_21_glyph_46,
Font_RobotoMono_Medium_21_glyph_47,
Font_RobotoMono_Medium_21_glyph_48,
Font_RobotoMono_Medium_21_glyph_49,
Font_RobotoMono_Medium_21_glyph_50,
Font_RobotoMono_Medium_21_glyph_51,
Font_RobotoMono_Medium_21_glyph_52,
Font_RobotoMono_Medium_21_glyph_53,
Font_RobotoMono_Medium_21_glyph_54,
Font_RobotoMono_Medium_21_glyph_55,
Font_RobotoMono_Medium_21_glyph_56,
Font_RobotoMono_Medium_21_glyph_57,
Font_RobotoMono_Medium_21_glyph_58,
Font_RobotoMono_Medium_21_glyph_59,
Font_RobotoMono_Medium_21_glyph_60,
Font_RobotoMono_Medium_21_glyph_61,
Font_RobotoMono_Medium_21_glyph_62,
Font_RobotoMono_Medium_21_glyph_63,
Font_RobotoMono_Medium_21_glyph_64,
Font_RobotoMono_Medium_21_glyph_65,
Font_RobotoMono_Medium_21_glyph_66,
Font_RobotoMono_Medium_21_glyph_67,
Font_RobotoMono_Medium_21_glyph_68,
Font_RobotoMono_Medium_21_glyph_69,
Font_RobotoMono_Medium_21_glyph_70,
Font_RobotoMono_Medium_21_glyph_71,
Font_RobotoMono_Medium_21_glyph_72,
Font_RobotoMono_Medium_21_glyph_73,
Font_RobotoMono_Medium_21_glyph_74,
Font_RobotoMono_Medium_21_glyph_75,
Font_RobotoMono_Medium_21_glyph_76,
Font_RobotoMono_Medium_21_glyph_77,
Font_RobotoMono_Medium_21_glyph_78,
Font_RobotoMono_Medium_21_glyph_79,
Font_RobotoMono_Medium_21_glyph_80,
Font_RobotoMono_Medium_21_glyph_81,
Font_RobotoMono_Medium_21_glyph_82,
Font_RobotoMono_Medium_21_glyph_83,
Font_RobotoMono_Medium_21_glyph_84,
Font_RobotoMono_Medium_21_glyph_85,
Font_RobotoMono_Medium_21_glyph_86,
Font_RobotoMono_Medium_21_glyph_87,
Font_RobotoMono_Medium_21_glyph_88,
Font_RobotoMono_Medium_21_glyph_89,
Font_RobotoMono_Medium_21_glyph_90,
Font_RobotoMono_Medium_21_glyph_91,
Font_RobotoMono_Medium_21_glyph_92,
Font_RobotoMono_Medium_21_glyph_93,
Font_RobotoMono_Medium_21_glyph_94,
Font_RobotoMono_Medium_21_glyph_95,
Font_RobotoMono_Medium_21_glyph_96,
Font_RobotoMono_Medium_21_glyph_97,
Font_RobotoMono_Medium_21_glyph_98,
Font_RobotoMono_Medium_21_glyph_99,
Font_RobotoMono_Medium_21_glyph_100,
Font_RobotoMono_Medium_21_glyph_101,
Font_RobotoMono_Medium_21_glyph_102,
Font_RobotoMono_Medium_21_glyph_103,
Font_RobotoMono_Medium_21_glyph_104,
Font_RobotoMono_Medium_21_glyph_105,
Font_RobotoMono_Medium_21_glyph_106,
Font_RobotoMono_Medium_21_glyph_107,
Font_RobotoMono_Medium_21_glyph_108,
Font_RobotoMono_Medium_21_glyph_109,
Font_RobotoMono_Medium_21_glyph_110,
Font_RobotoMono_Medium_21_glyph_111,
Font_RobotoMono_Medium_21_glyph_112,
Font_RobotoMono_Medium_21_glyph_113,
Font_RobotoMono_Medium_21_glyph_114,
Font_RobotoMono_Medium_21_glyph_115,
Font_RobotoMono_Medium_21_glyph_116,
Font_RobotoMono_Medium_21_glyph_117,
Font_RobotoMono_Medium_21_glyph_118,
Font_RobotoMono_Medium_21_glyph_119,
Font_RobotoMono_Medium_21_glyph_120,
Font_RobotoMono_Medium_21_glyph_121,
Font_RobotoMono_Medium_21_glyph_122,
Font_RobotoMono_Medium_21_glyph_123,
Font_RobotoMono_Medium_21_glyph_124,
Font_RobotoMono_Medium_21_glyph_125,
Font_RobotoMono_Medium_21_glyph_126,
};

@ -0,0 +1,10 @@
#include <stdint.h>
#if TREZOR_FONT_BPP != 4
#error Wrong TREZOR_FONT_BPP (expected 4)
#endif
#define Font_RobotoMono_Medium_21_HEIGHT 21
#define Font_RobotoMono_Medium_21_MAX_HEIGHT 23
#define Font_RobotoMono_Medium_21_BASELINE 5
extern const uint8_t* const Font_RobotoMono_Medium_21[126 + 1 - 32];
extern const uint8_t Font_RobotoMono_Medium_21_glyph_nonprintable[];

@ -0,0 +1,203 @@
#include <stdint.h>
// clang-format off
// - the first two bytes are width and height of the glyph
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 4-bit glyph data
/* */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_32[] = { 0, 0, 5, 0, 0 };
/* ! */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_33[] = { 3, 13, 5, 1, 13, 248, 12, 248, 12, 248, 12, 248, 12, 248, 12, 248, 11, 247, 10, 245, 8, 244, 7, 64, 1, 132, 6, 248, 12, 248, 12 };
/* " */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_34[] = { 6, 5, 8, 1, 13, 254, 146, 127, 254, 146, 127, 254, 146, 127, 254, 146, 127, 34, 16, 18 };
/* # */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_35[] = { 13, 13, 13, 0, 13, 0, 0, 248, 8, 243, 13, 0, 0, 0, 251, 5, 246, 10, 0, 0, 0, 254, 1, 250, 6, 0, 112, 255, 255, 255, 255, 255, 8, 176, 255, 255, 255, 255, 255, 5, 0, 144, 127, 64, 207, 0, 0, 0, 192, 79, 112, 159, 0, 0, 0, 240, 31, 160, 127, 0, 0, 247, 255, 255, 255, 255, 159, 0, 251, 255, 255, 255, 255, 95, 0, 0, 249, 7, 243, 12, 0, 0, 0, 252, 4, 247, 9, 0, 0, 0, 255, 1, 250, 6, 0, 0 };
/* $ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_36[] = { 11, 17, 11, 0, 15, 0, 0, 249, 10, 0, 0, 0, 0, 249, 10, 0, 0, 0, 179, 255, 191, 5, 0, 64, 255, 255, 255, 127, 0, 208, 207, 2, 178, 255, 1, 240, 79, 0, 0, 255, 5, 240, 175, 0, 0, 0, 0, 160, 255, 207, 89, 1, 0, 16, 251, 255, 255, 111, 0, 0, 32, 134, 252, 255, 3, 0, 0, 0, 32, 255, 8, 244, 31, 0, 0, 252, 8, 241, 207, 3, 97, 255, 5, 96, 255, 255, 255, 191, 0, 0, 180, 255, 207, 7, 0, 0, 0, 249, 10, 0, 0, 0, 0, 249, 10, 0, 0 };
/* % */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_37[] = { 14, 13, 15, 0, 13, 32, 252, 77, 0, 48, 239, 1, 224, 191, 255, 2, 208, 111, 0, 244, 8, 245, 7, 246, 12, 0, 244, 8, 245, 23, 255, 3, 0, 224, 191, 255, 162, 159, 0, 0, 48, 252, 77, 243, 30, 0, 0, 0, 0, 0, 253, 6, 0, 0, 0, 0, 112, 207, 144, 238, 8, 0, 0, 241, 63, 249, 221, 143, 0, 0, 250, 9, 238, 0, 222, 0, 48, 239, 1, 238, 0, 222, 0, 208, 111, 0, 249, 220, 143, 0, 247, 12, 0, 144, 238, 8 };
/* & */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_38[] = { 12, 13, 12, 0, 13, 0, 179, 238, 42, 0, 0, 32, 255, 255, 239, 1, 0, 128, 239, 50, 255, 6, 0, 144, 175, 0, 253, 7, 0, 64, 255, 116, 255, 3, 0, 0, 248, 255, 95, 0, 0, 0, 246, 255, 5, 0, 0, 112, 255, 253, 12, 243, 15, 241, 127, 192, 191, 247, 13, 243, 15, 16, 253, 255, 6, 241, 127, 0, 246, 239, 0, 160, 255, 255, 255, 255, 7, 0, 198, 239, 58, 243, 111 };
/* ' */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_39[] = { 3, 5, 4, 1, 13, 254, 2, 254, 2, 254, 2, 254, 2, 34, 0 };
/* ( */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_40[] = { 6, 17, 6, 1, 13, 0, 181, 10, 0, 254, 5, 112, 223, 0, 208, 127, 0, 242, 47, 0, 246, 13, 0, 248, 11, 0, 250, 9, 0, 251, 8, 0, 250, 9, 0, 249, 11, 0, 247, 12, 0, 243, 31, 0, 224, 95, 0, 128, 191, 0, 32, 255, 3, 0, 248, 12 };
/* ) */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_41[] = { 6, 17, 6, 0, 13, 180, 10, 0, 208, 111, 0, 96, 239, 0, 0, 255, 5, 0, 250, 9, 0, 246, 13, 0, 244, 15, 0, 242, 31, 0, 240, 63, 0, 241, 47, 0, 243, 15, 0, 245, 14, 0, 249, 10, 0, 254, 6, 64, 255, 1, 192, 159, 0, 245, 30, 0 };
/* * */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_42[] = { 9, 8, 9, 0, 13, 0, 112, 79, 0, 0, 0, 96, 63, 0, 0, 224, 155, 143, 204, 0, 161, 254, 255, 173, 0, 0, 242, 223, 1, 0, 16, 253, 245, 11, 0, 16, 107, 144, 9, 0, 0, 0, 0, 0, 0 };
/* + */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_43[] = { 9, 10, 10, 0, 10, 0, 0, 69, 0, 0, 0, 0, 239, 0, 0, 0, 0, 239, 0, 0, 0, 0, 239, 0, 0, 241, 255, 255, 255, 15, 241, 255, 255, 255, 15, 0, 0, 239, 0, 0, 0, 0, 239, 0, 0, 0, 0, 239, 0, 0, 0, 0, 68, 0, 0 };
/* , */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_44[] = { 4, 5, 5, 0, 3, 16, 18, 224, 143, 240, 63, 241, 14, 243, 10 };
/* - */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_45[] = { 7, 3, 8, 0, 7, 0, 0, 0, 0, 243, 255, 255, 14, 243, 255, 255, 14 };
/* . */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_46[] = { 3, 3, 5, 1, 3, 135, 4, 254, 9, 254, 9 };
/* / */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_47[] = { 8, 17, 7, 0, 13, 0, 0, 178, 11, 0, 0, 246, 13, 0, 0, 251, 8, 0, 0, 255, 3, 0, 80, 239, 0, 0, 144, 175, 0, 0, 224, 95, 0, 0, 243, 31, 0, 0, 247, 12, 0, 0, 252, 7, 0, 16, 255, 2, 0, 96, 223, 0, 0, 160, 159, 0, 0, 240, 79, 0, 0, 244, 15, 0, 0, 248, 11, 0, 0, 253, 6, 0, 0 };
/* 0 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_48[] = { 12, 13, 12, 0, 13, 0, 48, 234, 174, 3, 0, 0, 246, 255, 255, 127, 0, 32, 255, 109, 198, 255, 2, 160, 239, 0, 0, 253, 11, 224, 127, 0, 0, 246, 15, 240, 79, 0, 0, 243, 31, 242, 47, 0, 0, 242, 63, 240, 79, 0, 0, 243, 31, 224, 127, 0, 0, 246, 15, 160, 239, 0, 0, 253, 11, 32, 255, 93, 197, 255, 2, 0, 246, 255, 255, 127, 0, 0, 48, 234, 190, 4, 0 };
/* 1 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_49[] = { 6, 13, 7, 0, 13, 0, 240, 111, 248, 255, 111, 248, 255, 111, 66, 244, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111, 0, 240, 111 };
/* 2 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_50[] = { 10, 13, 10, 0, 13, 0, 162, 238, 76, 0, 32, 255, 255, 255, 6, 192, 255, 86, 253, 15, 240, 111, 0, 244, 63, 113, 23, 0, 242, 79, 0, 0, 0, 249, 31, 0, 0, 128, 255, 7, 0, 0, 248, 143, 0, 0, 128, 255, 9, 0, 0, 248, 159, 0, 0, 144, 255, 76, 51, 35, 240, 255, 255, 255, 143, 240, 255, 255, 255, 143 };
/* 3 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_51[] = { 10, 13, 10, 0, 13, 0, 179, 238, 92, 0, 96, 255, 255, 255, 7, 240, 207, 102, 252, 15, 162, 26, 0, 243, 63, 0, 0, 16, 249, 15, 0, 0, 253, 255, 5, 0, 0, 253, 239, 4, 0, 0, 33, 250, 30, 16, 1, 0, 240, 79, 245, 31, 0, 240, 95, 242, 207, 85, 251, 47, 112, 255, 255, 255, 8, 0, 196, 238, 92, 0 };
/* 4 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_52[] = { 10, 13, 10, 0, 13, 0, 0, 248, 255, 5, 0, 16, 255, 255, 5, 0, 144, 239, 255, 5, 0, 242, 79, 255, 5, 0, 251, 11, 255, 5, 64, 255, 3, 255, 5, 192, 175, 0, 255, 5, 245, 47, 0, 255, 5, 251, 255, 255, 255, 207, 251, 255, 255, 255, 207, 34, 34, 34, 255, 39, 0, 0, 0, 255, 5, 0, 0, 0, 255, 5 };
/* 5 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_53[] = { 10, 13, 11, 0, 13, 80, 255, 255, 255, 31, 96, 255, 255, 255, 31, 128, 207, 68, 68, 4, 144, 175, 0, 0, 0, 176, 159, 16, 0, 0, 192, 239, 255, 175, 1, 224, 255, 255, 255, 30, 128, 120, 2, 245, 143, 0, 0, 0, 144, 191, 145, 57, 0, 160, 175, 224, 239, 86, 250, 111, 64, 255, 255, 255, 11, 0, 162, 253, 124, 0 };
/* 6 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_54[] = { 10, 13, 10, 0, 13, 0, 0, 243, 127, 0, 0, 0, 253, 13, 0, 0, 128, 255, 3, 0, 0, 243, 143, 0, 0, 0, 253, 255, 108, 0, 112, 255, 255, 255, 9, 224, 239, 53, 250, 63, 243, 79, 0, 208, 143, 243, 31, 0, 160, 175, 241, 79, 0, 208, 143, 192, 239, 53, 250, 63, 32, 255, 255, 255, 9, 0, 161, 253, 92, 0 };
/* 7 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_55[] = { 9, 13, 9, 0, 13, 248, 255, 255, 255, 14, 248, 255, 255, 255, 14, 66, 68, 68, 255, 11, 0, 0, 64, 255, 5, 0, 0, 176, 239, 0, 0, 0, 241, 143, 0, 0, 0, 248, 47, 0, 0, 0, 254, 11, 0, 0, 64, 255, 5, 0, 0, 176, 239, 0, 0, 0, 242, 143, 0, 0, 0, 248, 31, 0, 0, 0, 254, 11, 0, 0 };
/* 8 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_56[] = { 10, 13, 11, 0, 13, 0, 162, 253, 124, 0, 32, 255, 255, 255, 11, 176, 223, 37, 248, 79, 208, 127, 0, 208, 127, 160, 207, 3, 246, 79, 16, 252, 255, 255, 8, 32, 253, 255, 255, 9, 192, 207, 2, 245, 95, 241, 63, 0, 160, 175, 242, 79, 0, 160, 191, 224, 223, 19, 246, 143, 64, 255, 255, 255, 13, 0, 162, 253, 140, 0 };
/* 9 */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_57[] = { 10, 13, 10, 0, 13, 0, 161, 237, 92, 0, 32, 255, 255, 255, 8, 192, 239, 53, 250, 63, 241, 79, 0, 208, 143, 243, 31, 0, 160, 175, 241, 79, 0, 208, 175, 192, 239, 53, 250, 111, 48, 255, 255, 255, 14, 0, 162, 254, 255, 4, 0, 0, 242, 159, 0, 0, 0, 252, 14, 0, 0, 96, 255, 4, 0, 0, 241, 175, 0, 0 };
/* : */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_58[] = { 3, 10, 5, 1, 10, 254, 9, 254, 9, 135, 5, 0, 0, 0, 0, 0, 0, 0, 0, 135, 4, 254, 9, 254, 9 };
/* ; */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_59[] = { 4, 12, 5, 0, 10, 208, 175, 208, 175, 112, 88, 0, 0, 0, 0, 0, 0, 0, 0, 224, 143, 240, 79, 241, 15, 243, 11, 32, 1 };
/* < */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_60[] = { 9, 9, 10, 0, 10, 0, 0, 0, 0, 3, 0, 0, 16, 231, 14, 0, 64, 251, 255, 13, 112, 254, 255, 91, 0, 240, 255, 23, 0, 0, 240, 255, 142, 2, 0, 16, 215, 255, 207, 6, 0, 0, 164, 255, 14, 0, 0, 0, 113, 11 };
/* = */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_61[] = { 8, 6, 10, 1, 8, 251, 255, 255, 175, 251, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 175, 251, 255, 255, 175 };
/* > */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_62[] = { 9, 9, 10, 0, 10, 48, 0, 0, 0, 0, 240, 125, 1, 0, 0, 240, 255, 175, 4, 0, 0, 181, 255, 223, 6, 0, 0, 129, 255, 14, 0, 32, 232, 255, 14, 112, 252, 255, 109, 0, 240, 255, 57, 0, 0, 192, 6, 0, 0, 0 };
/* ? */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_63[] = { 9, 13, 10, 0, 13, 0, 199, 223, 26, 0, 176, 255, 255, 255, 2, 244, 175, 116, 255, 10, 214, 12, 0, 249, 13, 0, 0, 0, 252, 12, 0, 0, 194, 255, 6, 0, 16, 254, 95, 0, 0, 112, 255, 2, 0, 0, 144, 191, 0, 0, 0, 32, 36, 0, 0, 0, 80, 104, 0, 0, 0, 160, 191, 0, 0, 0, 160, 191, 0, 0 };
/* @ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_64[] = { 17, 15, 17, 0, 13, 0, 0, 80, 235, 239, 124, 0, 0, 0, 0, 16, 251, 255, 255, 255, 61, 0, 0, 0, 226, 223, 21, 16, 180, 255, 5, 0, 0, 251, 10, 0, 0, 0, 246, 30, 0, 80, 239, 0, 216, 174, 252, 144, 175, 0, 192, 95, 160, 239, 252, 255, 16, 255, 0, 240, 31, 242, 29, 96, 255, 0, 254, 2, 241, 14, 245, 8, 0, 255, 0, 251, 4, 240, 15, 245, 9, 0, 255, 0, 252, 2, 224, 47, 241, 79, 145, 255, 67, 239, 0, 144, 159, 128, 255, 255, 255, 255, 127, 0, 16, 255, 5, 165, 140, 113, 172, 5, 0, 0, 245, 175, 3, 0, 0, 0, 0, 0, 0, 80, 254, 255, 222, 221, 1, 0, 0, 0, 0, 112, 236, 255, 255, 2, 0, 0 };
/* A */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_65[] = { 13, 13, 12, 0, 13, 0, 0, 250, 255, 1, 0, 0, 0, 0, 255, 255, 7, 0, 0, 0, 80, 255, 253, 12, 0, 0, 0, 176, 207, 245, 47, 0, 0, 0, 241, 127, 240, 127, 0, 0, 0, 246, 47, 176, 223, 0, 0, 0, 252, 12, 96, 255, 2, 0, 16, 255, 7, 16, 255, 8, 0, 112, 255, 255, 255, 255, 13, 0, 192, 255, 255, 255, 255, 63, 0, 242, 143, 34, 34, 243, 143, 0, 247, 31, 0, 0, 176, 239, 0, 253, 12, 0, 0, 80, 255, 3 };
/* B */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_66[] = { 10, 13, 12, 1, 13, 250, 255, 255, 191, 3, 250, 255, 255, 255, 47, 250, 27, 17, 228, 159, 250, 10, 0, 160, 207, 250, 10, 0, 227, 159, 250, 255, 255, 255, 30, 250, 255, 255, 255, 29, 250, 27, 17, 227, 159, 250, 10, 0, 128, 223, 250, 10, 0, 128, 239, 250, 11, 0, 227, 191, 250, 255, 255, 255, 79, 250, 255, 255, 207, 4 };
/* C */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_67[] = { 13, 13, 13, 0, 13, 0, 0, 183, 238, 90, 0, 0, 0, 194, 255, 255, 255, 11, 0, 0, 253, 159, 85, 251, 159, 0, 112, 255, 3, 0, 128, 255, 3, 208, 159, 0, 0, 0, 153, 4, 240, 79, 0, 0, 0, 0, 0, 242, 47, 0, 0, 0, 0, 0, 240, 79, 0, 0, 0, 0, 0, 208, 159, 0, 0, 0, 170, 5, 112, 255, 3, 0, 128, 255, 3, 0, 253, 159, 85, 250, 159, 0, 0, 194, 255, 255, 255, 10, 0, 0, 0, 183, 254, 108, 0, 0 };
/* D */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_68[] = { 12, 13, 13, 1, 13, 250, 255, 239, 90, 0, 0, 250, 255, 255, 255, 27, 0, 250, 76, 100, 250, 191, 0, 250, 10, 0, 96, 255, 5, 250, 10, 0, 0, 251, 11, 250, 10, 0, 0, 247, 14, 250, 10, 0, 0, 245, 15, 250, 10, 0, 0, 247, 14, 250, 10, 0, 0, 251, 11, 250, 10, 0, 96, 255, 5, 250, 60, 84, 250, 191, 0, 250, 255, 255, 255, 27, 0, 250, 255, 239, 107, 0, 0 };
/* E */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_69[] = { 9, 13, 11, 1, 13, 250, 255, 255, 255, 12, 250, 255, 255, 255, 12, 250, 43, 34, 34, 2, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 43, 34, 34, 1, 250, 255, 255, 255, 6, 250, 255, 255, 255, 6, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 43, 34, 34, 2, 250, 255, 255, 255, 12, 250, 255, 255, 255, 12 };
/* F */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_70[] = { 9, 13, 11, 1, 13, 250, 255, 255, 255, 11, 250, 255, 255, 255, 11, 250, 43, 34, 34, 1, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 255, 255, 255, 4, 250, 255, 255, 255, 4, 250, 43, 34, 34, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0 };
/* G */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_71[] = { 13, 13, 14, 0, 13, 0, 0, 183, 238, 91, 0, 0, 0, 194, 255, 255, 255, 11, 0, 0, 253, 159, 85, 251, 159, 0, 112, 255, 4, 0, 144, 255, 3, 208, 159, 0, 0, 0, 136, 4, 240, 79, 0, 0, 0, 0, 0, 242, 47, 0, 160, 204, 204, 8, 240, 79, 0, 192, 255, 255, 10, 208, 143, 0, 0, 0, 252, 10, 128, 255, 3, 0, 80, 255, 10, 0, 253, 159, 85, 250, 255, 10, 0, 194, 255, 255, 255, 251, 10, 0, 0, 183, 238, 75, 242, 10 };
/* H */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_72[] = { 11, 13, 13, 1, 13, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 255, 255, 255, 255, 11, 250, 255, 255, 255, 255, 11, 250, 92, 85, 85, 252, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11, 250, 10, 0, 0, 250, 11 };
/* I */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_73[] = { 3, 13, 5, 1, 13, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10, 250, 10 };
/* J */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_74[] = { 7, 13, 7, 0, 13, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 0, 48, 255, 1, 51, 148, 255, 1, 253, 255, 239, 0, 253, 255, 77, 0 };
/* K */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_75[] = { 11, 13, 11, 1, 13, 250, 10, 0, 245, 143, 0, 250, 10, 32, 255, 12, 0, 250, 10, 192, 239, 1, 0, 250, 10, 249, 79, 0, 0, 250, 90, 255, 8, 0, 0, 250, 236, 207, 0, 0, 0, 250, 255, 79, 0, 0, 0, 250, 219, 239, 1, 0, 0, 250, 42, 255, 11, 0, 0, 250, 10, 245, 143, 0, 0, 250, 10, 144, 255, 4, 0, 250, 10, 0, 252, 46, 0, 250, 10, 0, 225, 223, 0 };
/* L */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_76[] = { 9, 13, 10, 1, 13, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 60, 51, 51, 2, 250, 255, 255, 255, 9, 250, 255, 255, 255, 9 };
/* M */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_77[] = { 15, 13, 17, 1, 13, 250, 255, 4, 0, 0, 251, 255, 3, 250, 255, 9, 0, 16, 255, 255, 3, 250, 255, 14, 0, 96, 255, 255, 3, 250, 255, 63, 0, 176, 255, 255, 3, 250, 202, 159, 0, 240, 111, 255, 3, 250, 106, 239, 0, 245, 47, 255, 3, 250, 26, 255, 3, 250, 42, 255, 3, 250, 10, 252, 8, 255, 37, 255, 3, 250, 10, 247, 93, 255, 32, 255, 3, 250, 10, 242, 239, 175, 32, 255, 3, 250, 10, 192, 255, 95, 32, 255, 3, 250, 10, 112, 255, 15, 32, 255, 3, 250, 10, 32, 255, 11, 32, 255, 3 };
/* N */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_78[] = { 11, 13, 13, 1, 13, 250, 191, 0, 0, 248, 12, 250, 255, 3, 0, 248, 12, 250, 255, 12, 0, 248, 12, 250, 255, 63, 0, 248, 12, 250, 170, 207, 0, 248, 12, 250, 42, 255, 4, 248, 12, 250, 10, 250, 12, 248, 12, 250, 10, 242, 79, 248, 12, 250, 10, 160, 207, 249, 12, 250, 10, 32, 255, 255, 12, 250, 10, 0, 249, 255, 12, 250, 10, 0, 242, 255, 12, 250, 10, 0, 144, 255, 12 };
/* O */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_79[] = { 14, 13, 14, 0, 13, 0, 0, 183, 238, 90, 0, 0, 0, 194, 255, 255, 255, 27, 0, 0, 253, 159, 101, 250, 191, 0, 112, 255, 3, 0, 96, 255, 5, 208, 159, 0, 0, 0, 251, 10, 240, 79, 0, 0, 0, 247, 13, 242, 47, 0, 0, 0, 245, 15, 240, 79, 0, 0, 0, 247, 13, 208, 159, 0, 0, 0, 251, 10, 112, 255, 3, 0, 80, 255, 5, 0, 253, 159, 85, 250, 191, 0, 0, 194, 255, 255, 255, 27, 0, 0, 0, 183, 238, 107, 0, 0 };
/* P */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_80[] = { 10, 13, 12, 1, 13, 250, 255, 255, 174, 2, 250, 255, 255, 255, 31, 250, 76, 68, 247, 159, 250, 10, 0, 128, 223, 250, 10, 0, 96, 239, 250, 10, 0, 128, 223, 250, 60, 67, 246, 159, 250, 255, 255, 255, 31, 250, 255, 255, 190, 2, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0, 250, 10, 0, 0, 0 };
/* Q */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_81[] = { 14, 14, 14, 0, 13, 0, 0, 183, 238, 90, 0, 0, 0, 194, 255, 255, 255, 27, 0, 0, 253, 159, 101, 250, 191, 0, 112, 255, 3, 0, 96, 255, 5, 208, 159, 0, 0, 0, 251, 10, 240, 79, 0, 0, 0, 247, 13, 242, 47, 0, 0, 0, 245, 15, 240, 79, 0, 0, 0, 247, 15, 208, 159, 0, 119, 6, 251, 11, 112, 255, 3, 244, 175, 255, 5, 0, 253, 159, 165, 255, 175, 0, 0, 194, 255, 255, 255, 95, 0, 0, 0, 183, 238, 186, 255, 2, 0, 0, 0, 0, 0, 185, 10 };
/* R */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_82[] = { 11, 13, 12, 1, 13, 250, 255, 255, 190, 2, 0, 250, 255, 255, 255, 47, 0, 250, 76, 68, 230, 191, 0, 250, 10, 0, 112, 239, 0, 250, 10, 0, 80, 255, 0, 250, 10, 0, 194, 207, 0, 250, 255, 255, 255, 79, 0, 250, 255, 255, 239, 5, 0, 250, 107, 255, 11, 0, 0, 250, 10, 247, 127, 0, 0, 250, 10, 160, 255, 5, 0, 250, 10, 0, 252, 63, 0, 250, 10, 0, 225, 239, 1 };
/* S */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_83[] = { 11, 13, 11, 0, 13, 0, 145, 253, 189, 3, 0, 48, 255, 255, 255, 111, 0, 192, 223, 53, 213, 255, 1, 240, 95, 0, 16, 255, 4, 240, 159, 0, 0, 34, 1, 160, 255, 174, 55, 0, 0, 16, 250, 255, 255, 78, 0, 0, 16, 116, 250, 255, 2, 32, 2, 0, 16, 254, 7, 243, 47, 0, 0, 252, 8, 224, 239, 54, 147, 255, 5, 64, 255, 255, 255, 191, 0, 0, 145, 253, 206, 6, 0 };
/* T */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_84[] = { 11, 13, 11, 0, 13, 250, 255, 255, 255, 255, 3, 250, 255, 255, 255, 255, 3, 66, 68, 254, 73, 68, 1, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0, 0, 0, 253, 7, 0, 0 };
/* U */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_85[] = { 11, 13, 13, 1, 13, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 251, 9, 0, 0, 250, 11, 249, 11, 0, 0, 252, 8, 247, 63, 0, 48, 255, 6, 225, 255, 71, 247, 239, 0, 64, 255, 255, 255, 79, 0, 0, 162, 253, 157, 1, 0 };
/* V */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_86[] = { 13, 13, 12, 0, 13, 252, 13, 0, 0, 160, 255, 0, 246, 47, 0, 0, 224, 175, 0, 241, 127, 0, 0, 244, 79, 0, 192, 207, 0, 0, 249, 15, 0, 96, 255, 2, 0, 254, 10, 0, 16, 255, 7, 48, 255, 5, 0, 0, 252, 12, 128, 255, 0, 0, 0, 246, 31, 208, 175, 0, 0, 0, 241, 111, 242, 95, 0, 0, 0, 192, 191, 248, 15, 0, 0, 0, 96, 255, 255, 10, 0, 0, 0, 16, 255, 255, 5, 0, 0, 0, 0, 252, 255, 0, 0, 0 };
/* W */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_87[] = { 18, 13, 18, 0, 13, 252, 12, 0, 160, 255, 4, 0, 242, 111, 248, 15, 0, 224, 255, 8, 0, 246, 47, 245, 79, 0, 242, 255, 12, 0, 250, 14, 241, 143, 0, 246, 255, 15, 0, 254, 11, 208, 191, 0, 250, 216, 79, 16, 255, 7, 144, 255, 0, 253, 164, 143, 80, 255, 3, 80, 255, 19, 255, 96, 207, 144, 255, 0, 16, 255, 87, 207, 32, 255, 208, 191, 0, 0, 253, 154, 143, 0, 254, 244, 127, 0, 0, 249, 255, 79, 0, 250, 254, 63, 0, 0, 245, 255, 31, 0, 247, 255, 15, 0, 0, 242, 255, 13, 0, 243, 255, 12, 0, 0, 224, 255, 9, 0, 240, 255, 8, 0 };
/* X */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_88[] = { 13, 13, 13, 0, 13, 144, 255, 3, 0, 160, 255, 2, 0, 254, 12, 0, 244, 127, 0, 0, 245, 127, 0, 254, 12, 0, 0, 160, 255, 146, 255, 3, 0, 0, 16, 254, 253, 143, 0, 0, 0, 0, 246, 255, 13, 0, 0, 0, 0, 241, 255, 8, 0, 0, 0, 0, 249, 255, 47, 0, 0, 0, 64, 255, 233, 207, 0, 0, 0, 208, 223, 80, 255, 6, 0, 0, 249, 63, 0, 251, 47, 0, 48, 255, 9, 0, 241, 191, 0, 208, 239, 0, 0, 96, 255, 6 };
/* Y */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_89[] = { 13, 13, 12, 0, 13, 224, 175, 0, 0, 128, 255, 1, 96, 255, 3, 0, 241, 143, 0, 0, 253, 12, 0, 249, 14, 0, 0, 244, 79, 32, 255, 7, 0, 0, 192, 207, 160, 239, 0, 0, 0, 48, 255, 249, 111, 0, 0, 0, 0, 251, 255, 13, 0, 0, 0, 0, 242, 255, 4, 0, 0, 0, 0, 160, 223, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0, 0, 0, 144, 191, 0, 0, 0 };
/* Z */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_90[] = { 11, 13, 11, 0, 13, 244, 255, 255, 255, 255, 2, 244, 255, 255, 255, 255, 2, 65, 68, 68, 247, 223, 0, 0, 0, 0, 253, 47, 0, 0, 0, 160, 255, 6, 0, 0, 0, 245, 175, 0, 0, 0, 32, 255, 13, 0, 0, 0, 208, 255, 3, 0, 0, 0, 249, 111, 0, 0, 0, 80, 255, 10, 0, 0, 0, 225, 255, 53, 51, 51, 0, 245, 255, 255, 255, 255, 3, 245, 255, 255, 255, 255, 3 };
/* [ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_91[] = { 5, 18, 7, 1, 14, 0, 0, 0, 248, 255, 14, 248, 255, 14, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 10, 0, 248, 11, 0, 248, 255, 14, 248, 255, 14 };
/* \ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_92[] = { 8, 17, 7, 0, 13, 186, 4, 0, 0, 250, 9, 0, 0, 245, 14, 0, 0, 241, 63, 0, 0, 192, 127, 0, 0, 112, 207, 0, 0, 32, 255, 1, 0, 0, 253, 6, 0, 0, 249, 10, 0, 0, 244, 15, 0, 0, 240, 79, 0, 0, 160, 143, 0, 0, 96, 223, 0, 0, 16, 255, 2, 0, 0, 252, 7, 0, 0, 248, 11, 0, 0, 243, 15 };
/* ] */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_93[] = { 6, 18, 7, 0, 14, 0, 0, 0, 245, 255, 31, 245, 255, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 241, 31, 0, 242, 31, 245, 255, 31, 245, 255, 31 };
/* ^ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_94[] = { 8, 6, 8, 0, 13, 0, 247, 127, 0, 0, 253, 223, 0, 48, 207, 252, 3, 144, 111, 246, 9, 224, 15, 240, 14, 32, 1, 16, 2 };
/* _ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_95[] = { 9, 3, 8, 0, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 5, 245, 255, 255, 255, 5 };
/* ` */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_96[] = { 5, 3, 5, 0, 13, 226, 63, 0, 64, 223, 0, 0, 149, 3 };
/* a */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_97[] = { 9, 10, 10, 0, 10, 0, 180, 238, 42, 0, 64, 255, 239, 255, 1, 176, 191, 0, 253, 9, 32, 18, 0, 248, 12, 16, 217, 255, 255, 12, 192, 255, 188, 253, 12, 242, 63, 0, 248, 12, 243, 63, 16, 254, 12, 208, 255, 253, 255, 12, 32, 234, 190, 244, 12 };
/* b */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_98[] = { 10, 13, 11, 1, 13, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 136, 238, 59, 0, 251, 255, 255, 255, 4, 251, 159, 50, 252, 13, 251, 13, 0, 242, 63, 251, 9, 0, 224, 95, 251, 9, 0, 224, 95, 251, 13, 0, 242, 63, 251, 159, 50, 252, 13, 251, 255, 255, 255, 4, 251, 149, 238, 59, 0 };
/* c */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_99[] = { 10, 10, 10, 0, 10, 0, 144, 253, 124, 0, 16, 254, 255, 255, 10, 160, 239, 37, 246, 79, 240, 95, 0, 112, 106, 243, 15, 0, 0, 0, 243, 15, 0, 0, 0, 240, 95, 0, 128, 107, 160, 239, 20, 246, 79, 16, 254, 255, 255, 10, 0, 145, 253, 124, 0 };
/* d */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_100[] = { 10, 13, 11, 0, 13, 0, 0, 0, 80, 239, 0, 0, 0, 80, 239, 0, 0, 0, 80, 239, 0, 162, 238, 105, 239, 32, 255, 255, 255, 239, 176, 239, 36, 247, 239, 240, 79, 0, 176, 239, 243, 15, 0, 96, 239, 243, 15, 0, 96, 239, 240, 79, 0, 160, 239, 176, 239, 20, 247, 239, 32, 255, 255, 255, 239, 0, 162, 238, 74, 239 };
/* e */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_101[] = { 10, 10, 11, 0, 10, 0, 145, 253, 108, 0, 16, 254, 255, 255, 10, 176, 207, 1, 243, 95, 240, 63, 0, 144, 175, 243, 255, 255, 255, 223, 242, 143, 136, 136, 120, 240, 79, 0, 0, 0, 144, 223, 2, 244, 111, 16, 253, 255, 255, 11, 0, 144, 253, 124, 0 };
/* f */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_102[] = { 7, 13, 7, 0, 13, 0, 212, 255, 3, 0, 254, 255, 3, 0, 255, 4, 0, 248, 255, 255, 3, 248, 255, 255, 3, 49, 255, 37, 0, 0, 255, 3, 0, 0, 255, 3, 0, 0, 255, 3, 0, 0, 255, 3, 0, 0, 255, 3, 0, 0, 255, 3, 0, 0, 255, 3, 0 };
/* g */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_103[] = { 10, 14, 11, 0, 10, 0, 179, 238, 121, 191, 48, 255, 255, 255, 191, 208, 207, 2, 247, 191, 241, 63, 0, 192, 191, 243, 15, 0, 144, 191, 241, 47, 0, 176, 191, 208, 207, 2, 247, 191, 64, 255, 255, 255, 191, 0, 179, 238, 153, 191, 0, 0, 0, 144, 175, 160, 91, 0, 192, 143, 176, 239, 2, 246, 79, 32, 254, 255, 255, 11, 0, 161, 254, 124, 0 };
/* h */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_104[] = { 9, 13, 11, 1, 13, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 152, 238, 26, 0, 251, 255, 255, 239, 0, 251, 111, 98, 255, 7, 251, 10, 0, 250, 10, 251, 8, 0, 248, 11, 251, 7, 0, 248, 11, 251, 7, 0, 248, 11, 251, 7, 0, 248, 11, 251, 7, 0, 248, 11, 251, 7, 0, 248, 11 };
/* i */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_105[] = { 3, 13, 5, 1, 13, 254, 7, 254, 7, 34, 1, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6 };
/* j */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_106[] = { 5, 17, 6, 0, 13, 0, 254, 7, 0, 254, 7, 0, 34, 1, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 16, 254, 6, 254, 255, 4, 254, 142, 0 };
/* k */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_107[] = { 9, 13, 9, 1, 13, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 7, 0, 0, 0, 251, 7, 112, 255, 2, 251, 7, 243, 95, 0, 251, 23, 254, 9, 0, 251, 184, 207, 0, 0, 251, 254, 47, 0, 0, 251, 252, 63, 0, 0, 251, 151, 239, 1, 0, 251, 7, 252, 12, 0, 251, 7, 225, 143, 0, 251, 7, 64, 255, 5 };
/* l */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_108[] = { 3, 13, 5, 1, 13, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7, 251, 7 };
/* m */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_109[] = { 14, 10, 15, 1, 10, 253, 182, 223, 22, 234, 142, 0, 253, 255, 255, 239, 255, 255, 10, 253, 78, 210, 255, 41, 247, 47, 253, 9, 128, 255, 1, 240, 95, 253, 6, 80, 239, 0, 208, 111, 253, 6, 80, 239, 0, 208, 111, 253, 6, 80, 239, 0, 208, 111, 253, 6, 80, 239, 0, 208, 111, 253, 6, 80, 239, 0, 208, 111, 253, 6, 80, 239, 0, 208, 111 };
/* n */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_110[] = { 9, 10, 11, 1, 10, 253, 166, 238, 26, 0, 253, 255, 255, 223, 0, 253, 95, 114, 255, 5, 253, 8, 0, 252, 8, 253, 6, 0, 250, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9 };
/* o */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_111[] = { 11, 10, 11, 0, 10, 0, 144, 253, 124, 0, 0, 16, 254, 255, 255, 12, 0, 160, 239, 37, 247, 127, 0, 240, 95, 0, 128, 223, 0, 243, 15, 0, 64, 255, 0, 243, 15, 0, 64, 255, 0, 240, 95, 0, 128, 223, 0, 160, 239, 20, 246, 127, 0, 16, 254, 255, 255, 12, 0, 0, 145, 253, 124, 0, 0 };
/* p */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_112[] = { 10, 14, 11, 1, 10, 253, 149, 238, 43, 0, 253, 255, 255, 255, 3, 253, 143, 66, 253, 12, 253, 11, 0, 243, 31, 253, 7, 0, 240, 79, 253, 7, 0, 240, 79, 253, 11, 0, 243, 31, 253, 143, 50, 253, 12, 253, 255, 255, 255, 3, 253, 167, 238, 43, 0, 253, 6, 0, 0, 0, 253, 6, 0, 0, 0, 253, 6, 0, 0, 0, 253, 6, 0, 0, 0 };
/* q */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_113[] = { 10, 14, 11, 0, 10, 0, 162, 238, 90, 239, 32, 255, 255, 255, 239, 176, 239, 36, 247, 239, 240, 79, 0, 176, 239, 243, 15, 0, 96, 239, 243, 15, 0, 96, 239, 240, 79, 0, 160, 239, 176, 239, 20, 247, 239, 32, 255, 255, 255, 239, 0, 162, 238, 122, 239, 0, 0, 0, 80, 239, 0, 0, 0, 80, 239, 0, 0, 0, 80, 239, 0, 0, 0, 80, 239 };
/* r */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_114[] = { 6, 10, 7, 1, 10, 253, 216, 191, 253, 255, 191, 253, 110, 34, 253, 7, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0, 253, 6, 0 };
/* s */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_115[] = { 9, 10, 9, 0, 10, 16, 217, 207, 7, 0, 225, 255, 254, 175, 0, 245, 31, 64, 255, 2, 245, 95, 0, 0, 0, 225, 255, 223, 25, 0, 16, 200, 255, 239, 1, 0, 0, 64, 255, 5, 245, 30, 16, 254, 5, 208, 255, 253, 239, 1, 0, 217, 239, 42, 0 };
/* t */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_116[] = { 7, 13, 7, 0, 13, 16, 153, 1, 0, 16, 255, 2, 0, 16, 255, 2, 0, 248, 255, 255, 3, 248, 255, 255, 3, 65, 255, 36, 0, 16, 255, 2, 0, 16, 255, 2, 0, 16, 255, 2, 0, 16, 255, 2, 0, 16, 255, 3, 0, 0, 255, 255, 3, 0, 229, 255, 3 };
/* u */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_117[] = { 9, 10, 11, 1, 10, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 249, 9, 253, 6, 0, 250, 9, 252, 8, 0, 252, 9, 249, 95, 113, 255, 9, 241, 255, 255, 255, 9, 32, 251, 142, 248, 9 };
/* v */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_118[] = { 10, 10, 9, 0, 10, 253, 7, 0, 242, 63, 248, 12, 0, 246, 14, 243, 31, 0, 251, 9, 224, 111, 0, 255, 4, 144, 175, 80, 239, 0, 64, 255, 160, 159, 0, 0, 255, 228, 79, 0, 0, 250, 254, 15, 0, 0, 245, 255, 10, 0, 0, 240, 255, 5, 0 };
/* w */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_119[] = { 15, 10, 14, 0, 10, 252, 8, 64, 255, 7, 80, 255, 0, 249, 12, 112, 255, 11, 128, 207, 0, 245, 15, 176, 255, 14, 192, 143, 0, 241, 63, 224, 190, 47, 240, 79, 0, 208, 111, 242, 106, 95, 243, 31, 0, 160, 175, 246, 54, 159, 247, 13, 0, 96, 239, 250, 2, 223, 251, 9, 0, 32, 255, 255, 0, 252, 255, 5, 0, 0, 254, 191, 0, 248, 255, 2, 0, 0, 251, 143, 0, 244, 239, 0, 0 };
/* x */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_120[] = { 11, 10, 10, 0, 10, 160, 207, 0, 160, 223, 0, 16, 255, 7, 244, 63, 0, 0, 246, 47, 254, 9, 0, 0, 176, 255, 239, 0, 0, 0, 48, 255, 95, 0, 0, 0, 128, 255, 191, 0, 0, 0, 242, 127, 255, 4, 0, 0, 250, 11, 249, 13, 0, 48, 255, 3, 241, 111, 0, 192, 175, 0, 128, 239, 0 };
/* y */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_121[] = { 10, 14, 10, 0, 10, 253, 7, 0, 240, 95, 247, 13, 0, 244, 31, 242, 47, 0, 249, 11, 192, 143, 0, 254, 6, 112, 223, 48, 255, 1, 32, 255, 131, 207, 0, 0, 252, 216, 127, 0, 0, 247, 255, 47, 0, 0, 241, 255, 13, 0, 0, 192, 255, 8, 0, 0, 96, 255, 3, 0, 0, 129, 239, 0, 0, 224, 255, 143, 0, 0, 224, 255, 10, 0, 0 };
/* z */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_122[] = { 8, 10, 9, 0, 10, 245, 255, 255, 239, 245, 255, 255, 239, 16, 17, 245, 143, 0, 16, 254, 12, 0, 192, 239, 1, 0, 248, 79, 0, 80, 255, 7, 0, 226, 207, 1, 0, 247, 255, 255, 255, 247, 255, 255, 255 };
/* { */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_123[] = { 7, 18, 7, 0, 14, 0, 0, 0, 0, 0, 177, 255, 1, 0, 249, 255, 1, 0, 253, 9, 0, 0, 253, 6, 0, 0, 253, 6, 0, 0, 253, 6, 0, 32, 255, 5, 0, 241, 207, 0, 0, 241, 30, 0, 0, 128, 255, 1, 0, 0, 254, 5, 0, 0, 253, 6, 0, 0, 253, 6, 0, 0, 253, 6, 0, 0, 252, 25, 0, 0, 249, 255, 1, 0, 161, 255, 1 };
/* | */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_124[] = { 3, 17, 7, 2, 13, 185, 4, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6, 253, 6 };
/* } */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_125[] = { 6, 18, 7, 0, 14, 0, 0, 0, 245, 159, 0, 245, 255, 5, 0, 252, 8, 0, 250, 9, 0, 250, 9, 0, 250, 9, 0, 249, 28, 0, 210, 223, 0, 128, 223, 0, 247, 110, 0, 250, 9, 0, 250, 9, 0, 250, 9, 0, 250, 9, 16, 253, 8, 245, 255, 5, 245, 142, 0 };
/* ~ */ static const uint8_t Font_TTSatoshi_DemiBold_18_glyph_126[] = { 10, 4, 11, 0, 7, 32, 251, 44, 48, 137, 192, 255, 239, 182, 191, 242, 127, 250, 255, 111, 146, 9, 112, 238, 8 };
/* ? */ const uint8_t Font_TTSatoshi_DemiBold_18_glyph_nonprintable[] = { 9, 13, 10, 0, 13, 255, 56, 32, 229, 255, 79, 0, 0, 0, 253, 11, 80, 139, 0, 245, 41, 243, 255, 6, 242, 255, 255, 255, 3, 243, 255, 255, 61, 0, 249, 255, 239, 1, 160, 255, 255, 143, 0, 253, 255, 255, 111, 64, 255, 255, 255, 223, 219, 255, 255, 255, 175, 151, 255, 255, 255, 95, 64, 255, 255, 255, 95, 64, 255, 255 };
const uint8_t * const Font_TTSatoshi_DemiBold_18[126 + 1 - 32] = {
Font_TTSatoshi_DemiBold_18_glyph_32,
Font_TTSatoshi_DemiBold_18_glyph_33,
Font_TTSatoshi_DemiBold_18_glyph_34,
Font_TTSatoshi_DemiBold_18_glyph_35,
Font_TTSatoshi_DemiBold_18_glyph_36,
Font_TTSatoshi_DemiBold_18_glyph_37,
Font_TTSatoshi_DemiBold_18_glyph_38,
Font_TTSatoshi_DemiBold_18_glyph_39,
Font_TTSatoshi_DemiBold_18_glyph_40,
Font_TTSatoshi_DemiBold_18_glyph_41,
Font_TTSatoshi_DemiBold_18_glyph_42,
Font_TTSatoshi_DemiBold_18_glyph_43,
Font_TTSatoshi_DemiBold_18_glyph_44,
Font_TTSatoshi_DemiBold_18_glyph_45,
Font_TTSatoshi_DemiBold_18_glyph_46,
Font_TTSatoshi_DemiBold_18_glyph_47,
Font_TTSatoshi_DemiBold_18_glyph_48,
Font_TTSatoshi_DemiBold_18_glyph_49,
Font_TTSatoshi_DemiBold_18_glyph_50,
Font_TTSatoshi_DemiBold_18_glyph_51,
Font_TTSatoshi_DemiBold_18_glyph_52,
Font_TTSatoshi_DemiBold_18_glyph_53,
Font_TTSatoshi_DemiBold_18_glyph_54,
Font_TTSatoshi_DemiBold_18_glyph_55,
Font_TTSatoshi_DemiBold_18_glyph_56,
Font_TTSatoshi_DemiBold_18_glyph_57,
Font_TTSatoshi_DemiBold_18_glyph_58,
Font_TTSatoshi_DemiBold_18_glyph_59,
Font_TTSatoshi_DemiBold_18_glyph_60,
Font_TTSatoshi_DemiBold_18_glyph_61,
Font_TTSatoshi_DemiBold_18_glyph_62,
Font_TTSatoshi_DemiBold_18_glyph_63,
Font_TTSatoshi_DemiBold_18_glyph_64,
Font_TTSatoshi_DemiBold_18_glyph_65,
Font_TTSatoshi_DemiBold_18_glyph_66,
Font_TTSatoshi_DemiBold_18_glyph_67,
Font_TTSatoshi_DemiBold_18_glyph_68,
Font_TTSatoshi_DemiBold_18_glyph_69,
Font_TTSatoshi_DemiBold_18_glyph_70,
Font_TTSatoshi_DemiBold_18_glyph_71,
Font_TTSatoshi_DemiBold_18_glyph_72,
Font_TTSatoshi_DemiBold_18_glyph_73,
Font_TTSatoshi_DemiBold_18_glyph_74,
Font_TTSatoshi_DemiBold_18_glyph_75,
Font_TTSatoshi_DemiBold_18_glyph_76,
Font_TTSatoshi_DemiBold_18_glyph_77,
Font_TTSatoshi_DemiBold_18_glyph_78,
Font_TTSatoshi_DemiBold_18_glyph_79,
Font_TTSatoshi_DemiBold_18_glyph_80,
Font_TTSatoshi_DemiBold_18_glyph_81,
Font_TTSatoshi_DemiBold_18_glyph_82,
Font_TTSatoshi_DemiBold_18_glyph_83,
Font_TTSatoshi_DemiBold_18_glyph_84,
Font_TTSatoshi_DemiBold_18_glyph_85,
Font_TTSatoshi_DemiBold_18_glyph_86,
Font_TTSatoshi_DemiBold_18_glyph_87,
Font_TTSatoshi_DemiBold_18_glyph_88,
Font_TTSatoshi_DemiBold_18_glyph_89,
Font_TTSatoshi_DemiBold_18_glyph_90,
Font_TTSatoshi_DemiBold_18_glyph_91,
Font_TTSatoshi_DemiBold_18_glyph_92,
Font_TTSatoshi_DemiBold_18_glyph_93,
Font_TTSatoshi_DemiBold_18_glyph_94,
Font_TTSatoshi_DemiBold_18_glyph_95,
Font_TTSatoshi_DemiBold_18_glyph_96,
Font_TTSatoshi_DemiBold_18_glyph_97,
Font_TTSatoshi_DemiBold_18_glyph_98,
Font_TTSatoshi_DemiBold_18_glyph_99,
Font_TTSatoshi_DemiBold_18_glyph_100,
Font_TTSatoshi_DemiBold_18_glyph_101,
Font_TTSatoshi_DemiBold_18_glyph_102,
Font_TTSatoshi_DemiBold_18_glyph_103,
Font_TTSatoshi_DemiBold_18_glyph_104,
Font_TTSatoshi_DemiBold_18_glyph_105,
Font_TTSatoshi_DemiBold_18_glyph_106,
Font_TTSatoshi_DemiBold_18_glyph_107,
Font_TTSatoshi_DemiBold_18_glyph_108,
Font_TTSatoshi_DemiBold_18_glyph_109,
Font_TTSatoshi_DemiBold_18_glyph_110,
Font_TTSatoshi_DemiBold_18_glyph_111,
Font_TTSatoshi_DemiBold_18_glyph_112,
Font_TTSatoshi_DemiBold_18_glyph_113,
Font_TTSatoshi_DemiBold_18_glyph_114,
Font_TTSatoshi_DemiBold_18_glyph_115,
Font_TTSatoshi_DemiBold_18_glyph_116,
Font_TTSatoshi_DemiBold_18_glyph_117,
Font_TTSatoshi_DemiBold_18_glyph_118,
Font_TTSatoshi_DemiBold_18_glyph_119,
Font_TTSatoshi_DemiBold_18_glyph_120,
Font_TTSatoshi_DemiBold_18_glyph_121,
Font_TTSatoshi_DemiBold_18_glyph_122,
Font_TTSatoshi_DemiBold_18_glyph_123,
Font_TTSatoshi_DemiBold_18_glyph_124,
Font_TTSatoshi_DemiBold_18_glyph_125,
Font_TTSatoshi_DemiBold_18_glyph_126,
};

@ -0,0 +1,10 @@
#include <stdint.h>
#if TREZOR_FONT_BPP != 4
#error Wrong TREZOR_FONT_BPP (expected 4)
#endif
#define Font_TTSatoshi_DemiBold_18_HEIGHT 18
#define Font_TTSatoshi_DemiBold_18_MAX_HEIGHT 19
#define Font_TTSatoshi_DemiBold_18_BASELINE 4
extern const uint8_t* const Font_TTSatoshi_DemiBold_18[126 + 1 - 32];
extern const uint8_t Font_TTSatoshi_DemiBold_18_glyph_nonprintable[];

@ -0,0 +1,203 @@
#include <stdint.h>
// clang-format off
// - the first two bytes are width and height of the glyph
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 4-bit glyph data
/* */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_32[] = { 0, 0, 5, 0, 0 };
/* ! */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_33[] = { 4, 15, 6, 1, 15, 245, 111, 245, 111, 245, 111, 245, 111, 245, 111, 245, 111, 244, 95, 243, 79, 241, 47, 240, 31, 160, 10, 0, 0, 228, 110, 245, 111, 245, 111 };
/* " */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_34[] = { 7, 5, 9, 1, 15, 251, 10, 253, 8, 251, 10, 253, 8, 251, 10, 253, 8, 251, 10, 253, 8, 218, 9, 219, 7 };
/* # */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_35[] = { 15, 15, 15, 0, 15, 0, 0, 192, 175, 0, 251, 11, 0, 0, 0, 240, 127, 0, 254, 7, 0, 0, 0, 242, 63, 32, 255, 4, 0, 0, 68, 248, 95, 132, 255, 70, 3, 64, 255, 255, 255, 255, 255, 255, 9, 128, 255, 255, 255, 255, 255, 255, 6, 0, 0, 255, 6, 240, 111, 0, 0, 0, 48, 255, 2, 243, 63, 0, 0, 0, 112, 255, 0, 246, 15, 0, 0, 246, 255, 255, 255, 255, 255, 143, 0, 249, 255, 255, 255, 255, 255, 79, 0, 67, 246, 143, 84, 255, 72, 4, 0, 0, 244, 47, 48, 255, 2, 0, 0, 0, 247, 14, 112, 255, 0, 0, 0, 0, 251, 11, 160, 207, 0, 0, 0 };
/* $ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_36[] = { 13, 19, 13, 0, 17, 0, 0, 208, 207, 0, 0, 0, 0, 0, 208, 207, 0, 0, 0, 0, 96, 252, 255, 124, 0, 0, 0, 251, 255, 255, 255, 12, 0, 112, 255, 207, 202, 255, 143, 0, 208, 255, 3, 0, 244, 255, 0, 224, 223, 0, 0, 144, 238, 1, 176, 255, 5, 0, 0, 0, 0, 64, 255, 239, 139, 5, 0, 0, 0, 212, 255, 255, 255, 9, 0, 0, 0, 82, 184, 255, 191, 0, 0, 0, 0, 0, 193, 255, 2, 226, 142, 0, 0, 96, 255, 5, 240, 255, 3, 0, 176, 255, 3, 144, 255, 207, 186, 254, 239, 0, 16, 252, 255, 255, 255, 79, 0, 0, 112, 252, 255, 157, 1, 0, 0, 0, 208, 207, 0, 0, 0, 0, 0, 208, 207, 0, 0, 0 };
/* % */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_37[] = { 17, 15, 17, 0, 15, 0, 216, 190, 2, 0, 128, 255, 1, 0, 144, 255, 255, 30, 0, 242, 127, 0, 0, 241, 63, 176, 127, 0, 252, 13, 0, 0, 243, 12, 112, 159, 96, 255, 3, 0, 0, 241, 79, 194, 127, 225, 175, 0, 0, 0, 128, 255, 255, 14, 249, 30, 0, 0, 0, 0, 198, 157, 49, 255, 6, 0, 0, 0, 0, 0, 0, 192, 207, 0, 0, 0, 0, 0, 0, 0, 246, 63, 145, 188, 6, 0, 0, 0, 16, 255, 9, 254, 255, 143, 0, 0, 0, 160, 239, 113, 207, 82, 255, 1, 0, 0, 244, 95, 144, 111, 0, 253, 3, 0, 0, 253, 12, 112, 191, 48, 255, 1, 0, 112, 255, 2, 16, 254, 255, 159, 0, 0, 242, 143, 0, 0, 178, 222, 8, 0 };
/* & */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_38[] = { 14, 15, 14, 0, 15, 0, 96, 252, 173, 2, 0, 0, 0, 250, 255, 255, 47, 0, 0, 48, 255, 109, 249, 191, 0, 0, 96, 255, 5, 192, 239, 0, 0, 48, 255, 7, 224, 223, 0, 0, 0, 252, 95, 252, 111, 0, 0, 0, 225, 255, 255, 6, 0, 0, 0, 210, 255, 95, 0, 0, 0, 32, 254, 255, 207, 0, 250, 12, 208, 255, 68, 255, 11, 254, 11, 241, 175, 0, 245, 223, 255, 5, 241, 159, 0, 80, 255, 223, 0, 208, 255, 55, 165, 255, 159, 0, 48, 255, 255, 255, 207, 255, 7, 0, 162, 253, 174, 3, 250, 111 };
/* ' */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_39[] = { 3, 5, 5, 1, 15, 251, 10, 251, 10, 251, 10, 251, 10, 218, 9 };
/* ( */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_40[] = { 7, 20, 8, 1, 16, 0, 96, 120, 0, 0, 243, 127, 0, 0, 251, 14, 0, 32, 255, 7, 0, 144, 255, 1, 0, 208, 207, 0, 0, 241, 143, 0, 0, 244, 95, 0, 0, 246, 79, 0, 0, 247, 47, 0, 0, 248, 31, 0, 0, 246, 63, 0, 0, 245, 95, 0, 0, 243, 111, 0, 0, 240, 175, 0, 0, 176, 255, 0, 0, 96, 255, 4, 0, 0, 254, 11, 0, 0, 247, 63, 0, 0, 208, 207, 0 };
/* ) */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_41[] = { 7, 20, 8, 0, 16, 131, 40, 0, 0, 224, 191, 0, 0, 96, 255, 4, 0, 0, 254, 11, 0, 0, 249, 31, 0, 0, 244, 111, 0, 0, 240, 175, 0, 0, 208, 223, 0, 0, 176, 239, 0, 0, 160, 255, 0, 0, 144, 255, 0, 0, 160, 255, 0, 0, 192, 223, 0, 0, 224, 207, 0, 0, 241, 143, 0, 0, 246, 63, 0, 0, 251, 14, 0, 48, 255, 7, 0, 160, 255, 1, 0, 244, 127, 0, 0 };
/* * */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_42[] = { 10, 9, 10, 0, 15, 0, 0, 254, 2, 0, 0, 0, 252, 1, 0, 128, 40, 251, 97, 11, 240, 255, 255, 255, 63, 64, 199, 255, 141, 20, 0, 208, 255, 47, 0, 0, 250, 106, 223, 1, 0, 232, 1, 187, 1, 0, 16, 0, 1, 0 };
/* + */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_43[] = { 10, 11, 12, 1, 12, 0, 16, 34, 0, 0, 0, 96, 239, 0, 0, 0, 96, 239, 0, 0, 0, 96, 239, 0, 0, 68, 148, 255, 68, 36, 255, 255, 255, 255, 127, 255, 255, 255, 255, 127, 0, 96, 239, 0, 0, 0, 96, 239, 0, 0, 0, 96, 239, 0, 0, 0, 80, 222, 0, 0 };
/* , */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_44[] = { 5, 5, 5, 0, 3, 176, 255, 2, 192, 223, 0, 224, 159, 0, 240, 79, 0, 209, 13, 0 };
/* - */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_45[] = { 9, 3, 9, 0, 8, 96, 102, 102, 102, 0, 240, 255, 255, 255, 1, 240, 255, 255, 255, 1 };
/* . */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_46[] = { 4, 3, 5, 1, 3, 235, 46, 251, 47, 251, 47 };
/* / */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_47[] = { 9, 20, 8, 0, 16, 0, 0, 32, 136, 2, 0, 0, 128, 255, 1, 0, 0, 208, 207, 0, 0, 0, 242, 127, 0, 0, 0, 246, 63, 0, 0, 0, 251, 14, 0, 0, 0, 255, 9, 0, 0, 64, 255, 4, 0, 0, 144, 255, 0, 0, 0, 224, 191, 0, 0, 0, 243, 111, 0, 0, 0, 247, 47, 0, 0, 0, 252, 13, 0, 0, 16, 255, 8, 0, 0, 96, 255, 3, 0, 0, 160, 239, 0, 0, 0, 240, 175, 0, 0, 0, 244, 95, 0, 0, 0, 248, 31, 0, 0, 0, 253, 12, 0, 0, 0 };
/* 0 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_48[] = { 14, 15, 14, 0, 15, 0, 0, 197, 255, 108, 0, 0, 0, 144, 255, 255, 255, 10, 0, 0, 249, 255, 187, 255, 159, 0, 32, 255, 46, 0, 210, 255, 2, 144, 255, 5, 0, 64, 255, 10, 192, 239, 0, 0, 0, 254, 12, 224, 207, 0, 0, 0, 251, 15, 240, 191, 0, 0, 0, 250, 31, 224, 207, 0, 0, 0, 251, 15, 192, 239, 0, 0, 0, 254, 12, 144, 255, 5, 0, 64, 255, 10, 32, 255, 46, 0, 210, 255, 3, 0, 249, 255, 187, 255, 175, 0, 0, 160, 255, 255, 255, 10, 0, 0, 0, 165, 238, 107, 0, 0 };
/* 1 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_49[] = { 7, 15, 8, 0, 15, 0, 112, 255, 4, 148, 217, 255, 4, 247, 255, 255, 4, 247, 255, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4, 0, 96, 255, 4 };
/* 2 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_50[] = { 12, 15, 12, 0, 15, 0, 80, 235, 190, 5, 0, 0, 249, 255, 255, 159, 0, 80, 255, 191, 251, 255, 5, 192, 255, 4, 96, 255, 10, 240, 207, 0, 0, 255, 13, 32, 18, 0, 16, 255, 12, 0, 0, 0, 160, 255, 7, 0, 0, 0, 249, 207, 0, 0, 0, 160, 255, 29, 0, 0, 0, 250, 223, 1, 0, 0, 160, 255, 29, 0, 0, 0, 251, 223, 1, 0, 0, 160, 255, 191, 153, 153, 25, 208, 255, 255, 255, 255, 31, 208, 255, 255, 255, 255, 31 };
/* 3 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_51[] = { 12, 15, 12, 0, 15, 0, 112, 236, 190, 5, 0, 16, 253, 255, 255, 175, 0, 160, 255, 174, 251, 255, 5, 240, 223, 0, 48, 255, 10, 80, 53, 0, 0, 255, 11, 0, 0, 0, 145, 255, 7, 0, 0, 242, 255, 191, 0, 0, 0, 242, 255, 95, 0, 0, 0, 97, 232, 255, 4, 0, 0, 0, 16, 254, 12, 163, 74, 0, 0, 252, 15, 242, 207, 0, 32, 255, 13, 192, 255, 174, 251, 255, 8, 32, 254, 255, 255, 191, 0, 0, 128, 252, 190, 5, 0 };
/* 4 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_52[] = { 12, 15, 12, 0, 15, 0, 0, 176, 255, 191, 0, 0, 0, 244, 255, 191, 0, 0, 0, 252, 255, 191, 0, 0, 80, 255, 249, 191, 0, 0, 208, 239, 240, 191, 0, 0, 246, 111, 240, 191, 0, 0, 254, 13, 240, 191, 0, 112, 255, 5, 240, 191, 0, 241, 223, 0, 240, 191, 0, 248, 191, 136, 248, 239, 56, 250, 255, 255, 255, 255, 111, 250, 255, 255, 255, 255, 111, 0, 0, 0, 240, 191, 0, 0, 0, 0, 240, 191, 0, 0, 0, 0, 240, 191, 0 };
/* 5 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_53[] = { 12, 15, 12, 0, 15, 0, 255, 255, 255, 255, 9, 16, 255, 255, 255, 255, 9, 48, 255, 156, 153, 153, 5, 64, 255, 5, 0, 0, 0, 96, 255, 3, 0, 0, 0, 112, 255, 100, 87, 1, 0, 144, 255, 255, 255, 127, 0, 160, 255, 255, 255, 255, 7, 176, 255, 40, 80, 255, 31, 0, 0, 0, 0, 247, 79, 48, 35, 0, 0, 245, 95, 224, 239, 2, 0, 251, 47, 112, 255, 191, 234, 255, 11, 0, 251, 255, 255, 223, 1, 0, 96, 235, 207, 8, 0 };
/* 6 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_54[] = { 12, 15, 12, 0, 15, 0, 0, 80, 255, 12, 0, 0, 0, 225, 255, 3, 0, 0, 0, 249, 159, 0, 0, 0, 48, 255, 30, 0, 0, 0, 208, 255, 6, 0, 0, 0, 247, 255, 207, 7, 0, 32, 255, 255, 255, 207, 0, 160, 255, 175, 233, 255, 9, 240, 255, 2, 16, 254, 15, 242, 175, 0, 0, 248, 63, 241, 175, 0, 0, 248, 63, 224, 255, 2, 16, 253, 15, 96, 255, 159, 233, 255, 8, 0, 250, 255, 255, 207, 0, 0, 80, 235, 190, 6, 0 };
/* 7 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_55[] = { 11, 15, 11, 0, 15, 247, 255, 255, 255, 255, 6, 247, 255, 255, 255, 255, 6, 148, 153, 153, 249, 255, 5, 0, 0, 0, 242, 239, 0, 0, 0, 0, 248, 143, 0, 0, 0, 0, 254, 47, 0, 0, 0, 80, 255, 11, 0, 0, 0, 176, 255, 4, 0, 0, 0, 242, 239, 0, 0, 0, 0, 248, 127, 0, 0, 0, 0, 254, 31, 0, 0, 0, 80, 255, 10, 0, 0, 0, 192, 255, 4, 0, 0, 0, 242, 223, 0, 0, 0, 0, 249, 111, 0, 0, 0 };
/* 8 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_56[] = { 12, 15, 12, 0, 15, 0, 64, 235, 207, 8, 0, 0, 249, 255, 255, 239, 1, 80, 255, 142, 199, 255, 11, 144, 255, 3, 0, 253, 15, 160, 255, 0, 0, 250, 15, 96, 255, 26, 80, 255, 11, 0, 249, 255, 255, 223, 2, 0, 246, 255, 255, 191, 0, 80, 255, 109, 165, 255, 11, 208, 239, 0, 0, 249, 47, 240, 191, 0, 0, 245, 111, 224, 239, 1, 0, 250, 79, 128, 255, 142, 183, 255, 14, 0, 252, 255, 255, 239, 3, 0, 80, 235, 207, 24, 0 };
/* 9 */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_57[] = { 12, 15, 12, 0, 15, 0, 64, 235, 190, 6, 0, 0, 250, 255, 255, 191, 0, 96, 255, 175, 233, 255, 8, 208, 255, 2, 16, 254, 15, 241, 175, 0, 0, 248, 63, 241, 175, 0, 0, 248, 79, 224, 255, 2, 16, 253, 47, 96, 255, 159, 233, 255, 12, 0, 250, 255, 255, 255, 4, 0, 80, 235, 255, 175, 0, 0, 0, 48, 255, 30, 0, 0, 0, 208, 255, 6, 0, 0, 0, 247, 207, 0, 0, 0, 16, 255, 47, 0, 0, 0, 160, 255, 8, 0, 0 };
/* : */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_58[] = { 4, 11, 5, 1, 11, 251, 47, 251, 47, 251, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 235, 46, 251, 47, 251, 47 };
/* ; */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_59[] = { 5, 13, 5, 0, 11, 160, 255, 4, 160, 255, 4, 144, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 2, 192, 223, 0, 224, 159, 0, 240, 79, 0, 209, 13, 0 };
/* < */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_60[] = { 10, 10, 12, 1, 11, 0, 0, 0, 48, 90, 0, 0, 113, 253, 111, 0, 163, 255, 255, 78, 214, 255, 255, 91, 0, 253, 223, 23, 0, 0, 253, 239, 57, 0, 0, 181, 255, 255, 125, 1, 0, 130, 254, 255, 95, 0, 0, 80, 251, 111, 0, 0, 0, 32, 72 };
/* = */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_61[] = { 10, 8, 12, 1, 10, 66, 68, 68, 68, 4, 248, 255, 255, 255, 31, 248, 255, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 255, 31, 248, 255, 255, 255, 31, 66, 68, 68, 68, 4 };
/* > */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_62[] = { 10, 10, 12, 1, 11, 123, 1, 0, 0, 0, 253, 175, 4, 0, 0, 250, 255, 223, 23, 0, 32, 216, 255, 255, 42, 0, 0, 148, 255, 111, 0, 0, 181, 255, 111, 64, 250, 255, 239, 24, 252, 255, 191, 5, 0, 253, 142, 2, 0, 0, 89, 0, 0, 0, 0 };
/* ? */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_63[] = { 11, 15, 11, 0, 15, 0, 162, 253, 157, 1, 0, 80, 255, 255, 255, 79, 0, 225, 255, 155, 253, 239, 0, 244, 175, 0, 192, 255, 3, 99, 38, 0, 128, 255, 5, 0, 0, 0, 209, 255, 3, 0, 0, 96, 255, 175, 0, 0, 0, 246, 255, 7, 0, 0, 0, 253, 79, 0, 0, 0, 0, 255, 11, 0, 0, 0, 0, 170, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 238, 10, 0, 0, 0, 16, 255, 11, 0, 0, 0, 16, 255, 11, 0, 0 };
/* @ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_64[] = { 18, 18, 20, 1, 15, 0, 0, 96, 218, 255, 173, 6, 0, 0, 0, 80, 254, 255, 255, 255, 223, 4, 0, 0, 248, 255, 122, 68, 151, 255, 175, 0, 80, 255, 44, 0, 0, 0, 145, 255, 8, 224, 207, 0, 198, 223, 165, 11, 249, 47, 246, 47, 144, 255, 255, 255, 15, 224, 143, 251, 11, 243, 127, 65, 254, 15, 144, 223, 253, 8, 247, 12, 0, 247, 15, 96, 239, 254, 6, 249, 9, 0, 244, 15, 80, 255, 253, 8, 248, 12, 0, 247, 15, 128, 223, 251, 11, 244, 127, 64, 254, 79, 226, 159, 247, 47, 176, 255, 255, 255, 255, 255, 31, 241, 191, 0, 232, 255, 41, 252, 207, 3, 112, 255, 9, 0, 1, 0, 0, 0, 0, 0, 251, 239, 55, 1, 0, 0, 0, 0, 0, 144, 255, 255, 255, 255, 47, 0, 0, 0, 0, 162, 254, 255, 255, 47, 0, 0, 0, 0, 0, 16, 50, 51, 3, 0, 0 };
/* A */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_65[] = { 15, 15, 14, 0, 15, 0, 0, 224, 255, 111, 0, 0, 0, 0, 0, 244, 255, 207, 0, 0, 0, 0, 0, 250, 255, 255, 1, 0, 0, 0, 0, 255, 126, 255, 7, 0, 0, 0, 80, 255, 25, 255, 12, 0, 0, 0, 160, 255, 3, 252, 47, 0, 0, 0, 241, 239, 0, 246, 143, 0, 0, 0, 246, 143, 0, 241, 223, 0, 0, 0, 251, 63, 0, 176, 255, 3, 0, 16, 255, 255, 255, 255, 255, 8, 0, 96, 255, 255, 255, 255, 255, 14, 0, 192, 255, 137, 136, 136, 252, 79, 0, 242, 223, 0, 0, 0, 245, 159, 0, 247, 143, 0, 0, 0, 241, 239, 0, 253, 63, 0, 0, 0, 176, 255, 4 };
/* B */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_66[] = { 12, 15, 14, 1, 15, 246, 255, 255, 255, 124, 0, 246, 255, 255, 255, 255, 10, 246, 159, 102, 150, 255, 79, 246, 79, 0, 0, 246, 127, 246, 79, 0, 0, 244, 143, 246, 79, 0, 32, 251, 79, 246, 255, 255, 255, 255, 11, 246, 255, 255, 255, 255, 7, 246, 159, 102, 118, 254, 63, 246, 79, 0, 0, 243, 159, 246, 79, 0, 0, 240, 191, 246, 79, 0, 0, 243, 175, 246, 159, 102, 118, 254, 111, 246, 255, 255, 255, 255, 13, 246, 255, 255, 255, 141, 0 };
/* C */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_67[] = { 15, 15, 15, 0, 15, 0, 0, 112, 236, 223, 24, 0, 0, 0, 48, 253, 255, 255, 239, 4, 0, 0, 243, 255, 190, 235, 255, 79, 0, 0, 253, 143, 0, 0, 248, 239, 0, 112, 255, 9, 0, 0, 144, 255, 6, 192, 255, 1, 0, 0, 16, 85, 3, 240, 223, 0, 0, 0, 0, 0, 0, 240, 191, 0, 0, 0, 0, 0, 0, 240, 223, 0, 0, 0, 0, 0, 0, 192, 255, 1, 0, 0, 16, 102, 4, 112, 255, 9, 0, 0, 144, 255, 5, 0, 253, 143, 0, 0, 247, 223, 0, 0, 243, 255, 190, 234, 255, 79, 0, 0, 48, 253, 255, 255, 239, 4, 0, 0, 0, 112, 252, 223, 24, 0, 0 };
/* D */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_68[] = { 14, 15, 15, 1, 15, 246, 255, 255, 206, 7, 0, 0, 246, 255, 255, 255, 223, 3, 0, 246, 191, 169, 251, 255, 63, 0, 246, 79, 0, 0, 249, 223, 0, 246, 79, 0, 0, 144, 255, 7, 246, 79, 0, 0, 16, 255, 12, 246, 79, 0, 0, 0, 253, 15, 246, 79, 0, 0, 0, 251, 15, 246, 79, 0, 0, 0, 253, 15, 246, 79, 0, 0, 16, 255, 12, 246, 79, 0, 0, 144, 255, 7, 246, 79, 0, 0, 248, 223, 0, 246, 191, 153, 235, 255, 63, 0, 246, 255, 255, 255, 223, 3, 0, 246, 255, 255, 207, 7, 0, 0 };
/* E */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_69[] = { 11, 15, 13, 1, 15, 246, 255, 255, 255, 255, 6, 246, 255, 255, 255, 255, 6, 246, 175, 136, 136, 136, 3, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 175, 136, 136, 136, 0, 246, 255, 255, 255, 255, 0, 246, 255, 255, 255, 255, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 175, 136, 136, 136, 3, 246, 255, 255, 255, 255, 6, 246, 255, 255, 255, 255, 6 };
/* F */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_70[] = { 11, 15, 12, 1, 15, 246, 255, 255, 255, 255, 5, 246, 255, 255, 255, 255, 5, 246, 175, 136, 136, 136, 2, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 255, 255, 255, 207, 0, 246, 255, 255, 255, 207, 0, 246, 175, 136, 136, 104, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0 };
/* G */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_71[] = { 15, 15, 16, 0, 15, 0, 0, 112, 252, 190, 24, 0, 0, 0, 48, 253, 255, 255, 239, 5, 0, 0, 243, 255, 190, 235, 255, 79, 0, 0, 253, 143, 0, 0, 248, 239, 1, 112, 255, 9, 0, 0, 160, 255, 6, 192, 255, 0, 0, 0, 0, 34, 1, 240, 223, 0, 0, 0, 0, 0, 0, 240, 191, 0, 0, 249, 255, 255, 12, 240, 223, 0, 0, 249, 255, 255, 12, 192, 255, 1, 0, 17, 33, 255, 12, 112, 255, 9, 0, 0, 112, 255, 12, 0, 253, 143, 0, 0, 246, 255, 12, 0, 243, 255, 190, 235, 255, 255, 12, 0, 48, 253, 255, 255, 223, 249, 12, 0, 0, 112, 252, 206, 7, 245, 12 };
/* H */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_72[] = { 13, 15, 15, 1, 15, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 255, 255, 255, 255, 255, 10, 246, 255, 255, 255, 255, 255, 10, 246, 223, 187, 187, 203, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10, 246, 79, 0, 0, 16, 255, 10 };
/* I */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_73[] = { 4, 15, 6, 1, 15, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79, 246, 79 };
/* J */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_74[] = { 8, 15, 9, 0, 15, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 249, 31, 0, 0, 250, 31, 151, 169, 255, 31, 252, 255, 255, 13, 252, 255, 207, 2 };
/* K */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_75[] = { 13, 15, 13, 1, 15, 246, 79, 0, 16, 254, 95, 0, 246, 79, 0, 192, 255, 8, 0, 246, 79, 0, 248, 207, 0, 0, 246, 79, 64, 255, 46, 0, 0, 246, 79, 225, 255, 4, 0, 0, 246, 79, 252, 143, 0, 0, 0, 246, 207, 255, 12, 0, 0, 0, 246, 255, 255, 5, 0, 0, 0, 246, 175, 255, 30, 0, 0, 0, 246, 79, 249, 207, 0, 0, 0, 246, 79, 192, 255, 8, 0, 0, 246, 79, 16, 254, 95, 0, 0, 246, 79, 0, 243, 255, 2, 0, 246, 79, 0, 96, 255, 29, 0, 246, 79, 0, 0, 250, 191, 0 };
/* L */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_76[] = { 11, 15, 12, 1, 15, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 191, 153, 153, 153, 2, 246, 255, 255, 255, 255, 3, 246, 255, 255, 255, 255, 3 };
/* M */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_77[] = { 17, 15, 19, 1, 15, 246, 255, 47, 0, 0, 0, 253, 255, 11, 246, 255, 127, 0, 0, 32, 255, 255, 11, 246, 255, 207, 0, 0, 112, 255, 255, 11, 246, 255, 255, 1, 0, 208, 255, 255, 11, 246, 207, 255, 7, 0, 242, 207, 255, 11, 246, 95, 254, 12, 0, 247, 79, 255, 11, 246, 79, 250, 31, 0, 252, 14, 255, 11, 246, 79, 244, 111, 32, 255, 9, 255, 11, 246, 79, 240, 191, 112, 255, 4, 255, 11, 246, 79, 160, 255, 193, 239, 0, 255, 11, 246, 79, 64, 255, 250, 159, 0, 255, 11, 246, 79, 0, 255, 255, 79, 0, 255, 11, 246, 79, 0, 250, 255, 14, 0, 255, 11, 246, 79, 0, 244, 255, 9, 0, 255, 11, 246, 79, 0, 240, 255, 4, 0, 255, 11 };
/* N */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_78[] = { 13, 15, 15, 1, 15, 246, 255, 7, 0, 0, 255, 11, 246, 255, 30, 0, 0, 255, 11, 246, 255, 143, 0, 0, 255, 11, 246, 255, 255, 1, 0, 255, 11, 246, 191, 255, 8, 0, 255, 11, 246, 79, 252, 31, 0, 255, 11, 246, 79, 244, 143, 0, 255, 11, 246, 79, 192, 255, 1, 255, 11, 246, 79, 48, 255, 9, 255, 11, 246, 79, 0, 251, 31, 255, 11, 246, 79, 0, 243, 191, 255, 11, 246, 79, 0, 176, 255, 255, 11, 246, 79, 0, 48, 255, 255, 11, 246, 79, 0, 0, 251, 255, 11, 246, 79, 0, 0, 242, 255, 11 };
/* O */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_79[] = { 16, 15, 16, 0, 15, 0, 0, 112, 236, 223, 24, 0, 0, 0, 48, 253, 255, 255, 239, 5, 0, 0, 243, 255, 190, 235, 255, 111, 0, 0, 253, 143, 0, 0, 246, 239, 1, 112, 255, 9, 0, 0, 112, 255, 9, 192, 255, 1, 0, 0, 0, 254, 14, 240, 223, 0, 0, 0, 0, 250, 31, 240, 191, 0, 0, 0, 0, 248, 63, 240, 223, 0, 0, 0, 0, 250, 31, 192, 255, 1, 0, 0, 0, 254, 14, 112, 255, 9, 0, 0, 96, 255, 9, 0, 253, 143, 0, 0, 246, 239, 1, 0, 243, 255, 190, 235, 255, 111, 0, 0, 48, 253, 255, 255, 239, 5, 0, 0, 0, 112, 252, 223, 24, 0, 0 };
/* P */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_80[] = { 12, 15, 14, 1, 15, 246, 255, 255, 255, 92, 0, 246, 255, 255, 255, 255, 8, 246, 191, 153, 185, 255, 63, 246, 79, 0, 0, 246, 143, 246, 79, 0, 0, 240, 191, 246, 79, 0, 0, 240, 191, 246, 79, 0, 0, 245, 143, 246, 191, 153, 185, 255, 63, 246, 255, 255, 255, 255, 9, 246, 255, 255, 255, 92, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0, 246, 79, 0, 0, 0, 0 };
/* Q */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_81[] = { 16, 16, 16, 0, 15, 0, 0, 112, 236, 223, 24, 0, 0, 0, 48, 253, 255, 255, 239, 5, 0, 0, 243, 255, 190, 235, 255, 111, 0, 0, 253, 143, 0, 0, 246, 239, 1, 112, 255, 9, 0, 0, 112, 255, 9, 192, 255, 1, 0, 0, 0, 254, 14, 240, 223, 0, 0, 0, 0, 250, 31, 240, 191, 0, 0, 0, 0, 248, 63, 240, 223, 0, 0, 0, 0, 250, 31, 192, 255, 1, 48, 51, 0, 254, 15, 112, 255, 9, 128, 255, 105, 255, 10, 0, 253, 143, 0, 250, 255, 239, 1, 0, 243, 255, 190, 250, 255, 95, 0, 0, 48, 253, 255, 255, 255, 95, 0, 0, 0, 112, 252, 223, 217, 255, 3, 0, 0, 0, 0, 0, 32, 220, 28 };
/* R */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_82[] = { 13, 15, 14, 1, 15, 246, 255, 255, 255, 92, 0, 0, 246, 255, 255, 255, 255, 9, 0, 246, 191, 153, 185, 255, 79, 0, 246, 79, 0, 0, 245, 175, 0, 246, 79, 0, 0, 224, 207, 0, 246, 79, 0, 0, 224, 223, 0, 246, 79, 0, 0, 244, 175, 0, 246, 175, 136, 152, 255, 95, 0, 246, 255, 255, 255, 255, 10, 0, 246, 255, 255, 255, 108, 0, 0, 246, 79, 246, 239, 2, 0, 0, 246, 79, 112, 255, 30, 0, 0, 246, 79, 0, 248, 223, 1, 0, 246, 79, 0, 128, 255, 29, 0, 246, 79, 0, 0, 249, 207, 0 };
/* S */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_83[] = { 13, 15, 13, 0, 15, 0, 64, 219, 223, 91, 0, 0, 0, 250, 255, 255, 255, 11, 0, 96, 255, 175, 185, 255, 143, 0, 192, 255, 2, 0, 242, 239, 0, 224, 223, 0, 0, 128, 204, 1, 192, 255, 6, 0, 0, 0, 0, 80, 255, 255, 172, 38, 0, 0, 0, 246, 255, 255, 255, 26, 0, 0, 0, 116, 218, 255, 207, 0, 0, 0, 0, 0, 210, 255, 2, 194, 124, 0, 0, 96, 255, 5, 240, 239, 2, 0, 160, 255, 3, 128, 255, 191, 152, 253, 223, 0, 0, 250, 255, 255, 255, 46, 0, 0, 64, 218, 239, 140, 0, 0 };
/* T */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_84[] = { 12, 15, 12, 0, 15, 249, 255, 255, 255, 255, 255, 249, 255, 255, 255, 255, 255, 149, 153, 251, 223, 153, 153, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0, 0, 0, 242, 143, 0, 0 };
/* U */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_85[] = { 13, 15, 15, 1, 15, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 47, 0, 0, 16, 255, 10, 248, 63, 0, 0, 16, 255, 10, 246, 79, 0, 0, 48, 255, 8, 243, 159, 0, 0, 128, 255, 5, 224, 255, 6, 0, 245, 255, 1, 96, 255, 223, 202, 255, 127, 0, 0, 248, 255, 255, 255, 9, 0, 0, 48, 218, 223, 74, 0, 0 };
/* V */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_86[] = { 15, 15, 14, 0, 15, 251, 79, 0, 0, 0, 240, 255, 0, 246, 175, 0, 0, 0, 245, 175, 0, 241, 239, 0, 0, 0, 251, 95, 0, 176, 255, 4, 0, 0, 255, 15, 0, 96, 255, 9, 0, 80, 255, 10, 0, 16, 255, 14, 0, 160, 255, 5, 0, 0, 251, 63, 0, 240, 255, 0, 0, 0, 246, 159, 0, 245, 175, 0, 0, 0, 241, 239, 0, 250, 79, 0, 0, 0, 176, 255, 3, 255, 15, 0, 0, 0, 80, 255, 72, 255, 10, 0, 0, 0, 16, 255, 190, 255, 4, 0, 0, 0, 0, 251, 255, 255, 0, 0, 0, 0, 0, 245, 255, 175, 0, 0, 0, 0, 0, 240, 255, 79, 0, 0, 0 };
/* W */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_87[] = { 21, 15, 21, 0, 15, 252, 79, 0, 0, 246, 255, 0, 0, 176, 255, 5, 248, 127, 0, 0, 250, 255, 3, 0, 224, 255, 1, 244, 191, 0, 0, 254, 255, 7, 0, 242, 223, 0, 240, 255, 0, 32, 255, 255, 11, 0, 246, 159, 0, 192, 255, 3, 96, 255, 253, 15, 0, 250, 95, 0, 128, 255, 7, 160, 223, 244, 63, 0, 254, 31, 0, 80, 255, 10, 224, 159, 241, 127, 16, 255, 14, 0, 16, 255, 14, 242, 95, 208, 191, 80, 255, 10, 0, 0, 253, 47, 246, 47, 144, 255, 144, 255, 6, 0, 0, 249, 111, 250, 14, 80, 255, 211, 255, 2, 0, 0, 245, 207, 254, 10, 16, 255, 250, 239, 0, 0, 0, 241, 255, 255, 6, 0, 253, 255, 175, 0, 0, 0, 208, 255, 255, 2, 0, 249, 255, 111, 0, 0, 0, 144, 255, 239, 0, 0, 245, 255, 47, 0, 0, 0, 80, 255, 175, 0, 0, 241, 255, 14, 0, 0 };
/* X */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_88[] = { 15, 15, 14, 0, 15, 144, 255, 10, 0, 0, 243, 239, 1, 0, 254, 79, 0, 0, 253, 95, 0, 0, 244, 239, 0, 128, 255, 11, 0, 0, 160, 255, 9, 242, 255, 1, 0, 0, 16, 254, 79, 252, 111, 0, 0, 0, 0, 245, 255, 255, 12, 0, 0, 0, 0, 176, 255, 255, 2, 0, 0, 0, 0, 80, 255, 207, 0, 0, 0, 0, 0, 225, 255, 255, 6, 0, 0, 0, 0, 249, 207, 255, 30, 0, 0, 0, 64, 255, 14, 248, 191, 0, 0, 0, 224, 255, 4, 208, 255, 5, 0, 0, 249, 175, 0, 48, 255, 30, 0, 48, 255, 30, 0, 0, 249, 175, 0, 208, 255, 5, 0, 0, 224, 255, 5 };
/* Y */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_89[] = { 15, 15, 14, 0, 15, 224, 255, 1, 0, 0, 241, 239, 0, 96, 255, 10, 0, 0, 250, 111, 0, 0, 253, 47, 0, 32, 255, 13, 0, 0, 245, 191, 0, 176, 255, 5, 0, 0, 192, 255, 4, 243, 207, 0, 0, 0, 48, 255, 12, 252, 63, 0, 0, 0, 0, 250, 191, 255, 10, 0, 0, 0, 0, 242, 255, 255, 2, 0, 0, 0, 0, 144, 255, 159, 0, 0, 0, 0, 0, 16, 255, 31, 0, 0, 0, 0, 0, 0, 253, 13, 0, 0, 0, 0, 0, 0, 253, 13, 0, 0, 0, 0, 0, 0, 253, 13, 0, 0, 0, 0, 0, 0, 253, 13, 0, 0, 0, 0, 0, 0, 253, 13, 0, 0, 0 };
/* Z */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_90[] = { 12, 15, 13, 0, 15, 242, 255, 255, 255, 255, 223, 242, 255, 255, 255, 255, 223, 145, 153, 153, 169, 255, 191, 0, 0, 0, 112, 255, 30, 0, 0, 0, 243, 255, 4, 0, 0, 16, 254, 143, 0, 0, 0, 176, 255, 12, 0, 0, 0, 247, 239, 2, 0, 0, 48, 255, 95, 0, 0, 0, 225, 255, 9, 0, 0, 0, 251, 207, 0, 0, 0, 112, 255, 47, 0, 0, 0, 242, 255, 157, 153, 153, 153, 244, 255, 255, 255, 255, 255, 244, 255, 255, 255, 255, 255 };
/* [ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_91[] = { 6, 20, 8, 1, 16, 98, 102, 86, 245, 255, 239, 245, 255, 239, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 79, 0, 245, 159, 86, 245, 255, 239, 245, 255, 239 };
/* \ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_92[] = { 9, 20, 8, 0, 16, 135, 5, 0, 0, 0, 251, 14, 0, 0, 0, 246, 63, 0, 0, 0, 241, 127, 0, 0, 0, 208, 207, 0, 0, 0, 128, 255, 1, 0, 0, 48, 255, 6, 0, 0, 0, 254, 10, 0, 0, 0, 250, 15, 0, 0, 0, 245, 79, 0, 0, 0, 240, 159, 0, 0, 0, 176, 223, 0, 0, 0, 112, 255, 2, 0, 0, 32, 255, 7, 0, 0, 0, 253, 12, 0, 0, 0, 249, 31, 0, 0, 0, 244, 95, 0, 0, 0, 240, 175, 0, 0, 0, 160, 239, 0, 0, 0, 96, 255, 3 };
/* ] */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_93[] = { 6, 20, 8, 0, 16, 97, 102, 102, 244, 255, 255, 244, 255, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 0, 160, 255, 97, 198, 255, 244, 255, 255, 244, 255, 255 };
/* ^ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_94[] = { 9, 6, 9, 0, 15, 0, 241, 255, 5, 0, 0, 246, 255, 11, 0, 0, 252, 251, 31, 0, 32, 255, 210, 127, 0, 128, 207, 112, 223, 0, 208, 111, 16, 255, 3 };
/* _ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_95[] = { 10, 3, 9, 0, 0, 246, 255, 255, 255, 159, 246, 255, 255, 255, 159, 98, 102, 102, 102, 70 };
/* ` */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_96[] = { 6, 4, 6, 0, 16, 0, 0, 0, 209, 191, 0, 32, 255, 5, 0, 244, 30 };
/* a */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_97[] = { 11, 11, 12, 0, 11, 0, 112, 252, 173, 2, 0, 0, 252, 255, 255, 79, 0, 112, 255, 57, 229, 239, 0, 48, 68, 0, 96, 255, 3, 0, 180, 254, 255, 255, 4, 96, 255, 255, 255, 255, 4, 224, 239, 2, 96, 255, 4, 241, 159, 0, 144, 255, 4, 240, 239, 36, 247, 255, 4, 128, 255, 255, 255, 255, 4, 0, 198, 239, 41, 255, 4 };
/* b */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_98[] = { 12, 15, 13, 1, 15, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 47, 233, 190, 5, 0, 248, 239, 255, 255, 159, 0, 248, 255, 124, 232, 255, 5, 248, 191, 0, 32, 255, 12, 248, 79, 0, 0, 249, 15, 248, 47, 0, 0, 247, 47, 248, 63, 0, 0, 249, 15, 248, 191, 0, 32, 255, 12, 248, 255, 124, 232, 255, 5, 248, 239, 255, 255, 159, 0, 248, 29, 234, 190, 5, 0 };
/* c */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_99[] = { 12, 11, 12, 0, 11, 0, 48, 218, 207, 7, 0, 0, 247, 255, 255, 223, 1, 48, 255, 159, 183, 255, 10, 192, 255, 3, 0, 250, 47, 240, 175, 0, 0, 0, 0, 242, 127, 0, 0, 0, 0, 240, 175, 0, 0, 32, 2, 192, 255, 2, 0, 251, 31, 64, 255, 159, 183, 255, 10, 0, 247, 255, 255, 223, 1, 0, 48, 218, 207, 7, 0 };
/* d */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_100[] = { 12, 15, 13, 0, 15, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143, 0, 80, 235, 158, 242, 143, 0, 249, 255, 255, 254, 143, 64, 255, 142, 199, 255, 143, 192, 255, 2, 0, 251, 143, 240, 159, 0, 0, 243, 143, 242, 127, 0, 0, 241, 143, 240, 159, 0, 0, 243, 143, 208, 255, 1, 0, 251, 143, 80, 255, 142, 199, 255, 143, 0, 250, 255, 255, 254, 143, 0, 80, 251, 174, 209, 143 };
/* e */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_101[] = { 12, 11, 12, 0, 11, 0, 48, 218, 207, 7, 0, 0, 248, 255, 255, 223, 1, 64, 255, 92, 132, 255, 11, 208, 239, 0, 0, 246, 63, 240, 239, 204, 204, 252, 127, 241, 255, 255, 255, 255, 143, 240, 159, 0, 0, 0, 0, 176, 239, 1, 0, 117, 7, 48, 255, 93, 148, 255, 12, 0, 246, 255, 255, 223, 1, 0, 48, 218, 207, 8, 0 };
/* f */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_102[] = { 8, 15, 8, 0, 15, 0, 144, 254, 63, 0, 247, 255, 63, 0, 250, 111, 20, 0, 251, 14, 0, 247, 255, 255, 63, 247, 255, 255, 63, 132, 253, 143, 24, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0, 0, 251, 14, 0 };
/* g */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_103[] = { 12, 15, 13, 0, 11, 0, 96, 252, 158, 242, 95, 0, 251, 255, 255, 255, 95, 112, 255, 109, 198, 255, 95, 224, 239, 0, 0, 252, 95, 241, 143, 0, 0, 246, 95, 241, 143, 0, 0, 246, 95, 224, 223, 0, 0, 252, 95, 112, 255, 109, 182, 255, 95, 0, 252, 255, 255, 255, 95, 0, 112, 252, 158, 246, 95, 0, 0, 0, 0, 245, 79, 160, 221, 1, 0, 250, 31, 96, 255, 109, 165, 255, 12, 0, 250, 255, 255, 239, 2, 0, 96, 236, 207, 8, 0 };
/* h */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_104[] = { 11, 15, 13, 1, 15, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 63, 234, 190, 3, 0, 248, 255, 255, 255, 79, 0, 248, 255, 122, 251, 223, 0, 248, 127, 0, 160, 255, 2, 248, 47, 0, 80, 255, 4, 248, 31, 0, 64, 255, 5, 248, 31, 0, 64, 255, 5, 248, 31, 0, 64, 255, 5, 248, 31, 0, 64, 255, 5, 248, 31, 0, 64, 255, 5, 248, 31, 0, 64, 255, 5 };
/* i */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_105[] = { 4, 15, 5, 1, 15, 251, 31, 251, 31, 134, 8, 0, 0, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15, 250, 15 };
/* j */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_106[] = { 7, 19, 7, 0, 15, 0, 176, 255, 1, 0, 176, 255, 1, 0, 96, 136, 0, 0, 0, 0, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 0, 160, 255, 0, 96, 230, 255, 0, 240, 255, 191, 0, 240, 255, 27, 0 };
/* k */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_107[] = { 11, 15, 11, 1, 15, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 0, 0, 0, 248, 31, 0, 245, 191, 0, 248, 31, 32, 255, 13, 0, 248, 31, 209, 239, 2, 0, 248, 31, 251, 79, 0, 0, 248, 175, 255, 7, 0, 0, 248, 255, 239, 0, 0, 0, 248, 127, 255, 10, 0, 0, 248, 31, 248, 127, 0, 0, 248, 31, 176, 255, 4, 0, 248, 31, 16, 253, 47, 0, 248, 31, 0, 242, 223, 1 };
/* l */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_108[] = { 4, 15, 6, 1, 15, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31, 248, 31 };
/* m */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_109[] = { 16, 11, 18, 1, 11, 250, 61, 252, 125, 64, 252, 141, 0, 250, 255, 255, 255, 252, 255, 255, 11, 250, 255, 136, 255, 255, 123, 253, 95, 250, 79, 0, 249, 191, 0, 242, 175, 250, 15, 0, 244, 111, 0, 224, 207, 250, 15, 0, 243, 111, 0, 208, 207, 250, 15, 0, 243, 111, 0, 208, 207, 250, 15, 0, 243, 111, 0, 208, 207, 250, 15, 0, 243, 111, 0, 208, 207, 250, 15, 0, 243, 111, 0, 208, 207, 250, 15, 0, 243, 111, 0, 208, 207 };
/* n */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_110[] = { 11, 11, 13, 1, 11, 250, 45, 234, 190, 2, 0, 250, 255, 255, 255, 63, 0, 250, 255, 121, 252, 207, 0, 250, 95, 0, 192, 255, 0, 250, 15, 0, 112, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3 };
/* o */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_111[] = { 12, 11, 13, 0, 11, 0, 48, 218, 207, 8, 0, 0, 247, 255, 255, 223, 2, 48, 255, 159, 199, 255, 12, 192, 255, 3, 0, 249, 95, 240, 175, 0, 0, 241, 143, 242, 127, 0, 0, 224, 191, 240, 175, 0, 0, 241, 143, 192, 255, 2, 0, 249, 95, 64, 255, 159, 183, 255, 12, 0, 247, 255, 255, 223, 2, 0, 48, 218, 207, 8, 0 };
/* p */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_112[] = { 12, 15, 13, 1, 11, 250, 29, 234, 190, 4, 0, 250, 239, 255, 255, 127, 0, 250, 255, 123, 249, 255, 3, 250, 159, 0, 48, 255, 11, 250, 47, 0, 0, 251, 14, 250, 15, 0, 0, 249, 15, 250, 47, 0, 0, 251, 14, 250, 175, 0, 48, 255, 11, 250, 255, 123, 249, 255, 3, 250, 255, 255, 255, 143, 0, 250, 47, 235, 190, 4, 0, 250, 15, 0, 0, 0, 0, 250, 15, 0, 0, 0, 0, 250, 15, 0, 0, 0, 0, 250, 15, 0, 0, 0, 0 };
/* q */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_113[] = { 12, 15, 13, 0, 11, 0, 80, 235, 158, 241, 143, 0, 249, 255, 255, 255, 143, 80, 255, 142, 199, 255, 143, 192, 255, 2, 0, 251, 143, 240, 159, 0, 0, 243, 143, 242, 127, 0, 0, 241, 143, 240, 159, 0, 0, 243, 143, 208, 255, 1, 0, 251, 143, 80, 255, 142, 199, 255, 143, 0, 249, 255, 255, 255, 143, 0, 80, 235, 174, 243, 143, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143, 0, 0, 0, 0, 241, 143 };
/* r */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_114[] = { 7, 11, 8, 1, 11, 250, 138, 254, 13, 250, 255, 255, 13, 250, 239, 137, 7, 250, 63, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0, 250, 15, 0, 0 };
/* s */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_115[] = { 10, 11, 11, 0, 11, 0, 197, 238, 108, 0, 144, 255, 255, 255, 11, 242, 207, 52, 249, 111, 245, 111, 0, 96, 71, 241, 255, 156, 38, 0, 64, 253, 255, 255, 11, 0, 32, 134, 253, 143, 98, 22, 0, 224, 207, 242, 191, 19, 245, 191, 128, 255, 255, 255, 63, 0, 197, 254, 173, 2 };
/* t */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_116[] = { 8, 15, 8, 0, 15, 0, 0, 0, 0, 0, 252, 13, 0, 0, 252, 13, 0, 0, 252, 13, 0, 247, 255, 255, 63, 247, 255, 255, 63, 132, 254, 142, 24, 0, 252, 13, 0, 0, 252, 13, 0, 0, 252, 13, 0, 0, 252, 13, 0, 0, 252, 13, 0, 0, 252, 95, 20, 0, 249, 255, 63, 0, 161, 255, 63 };
/* u */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_117[] = { 11, 11, 13, 1, 11, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 250, 15, 0, 96, 255, 3, 249, 15, 0, 112, 255, 3, 247, 95, 0, 176, 255, 3, 243, 255, 121, 252, 255, 3, 144, 255, 255, 255, 255, 3, 0, 198, 223, 71, 255, 3 };
/* v */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_118[] = { 11, 11, 11, 0, 11, 253, 14, 0, 0, 255, 11, 248, 63, 0, 64, 255, 6, 242, 143, 0, 160, 255, 1, 208, 223, 0, 224, 191, 0, 112, 255, 2, 244, 111, 0, 32, 255, 8, 249, 31, 0, 0, 253, 13, 254, 11, 0, 0, 247, 143, 255, 6, 0, 0, 242, 255, 255, 1, 0, 0, 208, 255, 191, 0, 0, 0, 112, 255, 111, 0, 0 };
/* w */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_119[] = { 17, 11, 17, 0, 11, 252, 15, 0, 244, 223, 0, 80, 255, 5, 248, 63, 0, 248, 255, 1, 144, 255, 1, 244, 111, 0, 252, 255, 5, 208, 223, 0, 240, 175, 0, 255, 254, 9, 241, 159, 0, 192, 239, 64, 239, 245, 13, 245, 95, 0, 128, 255, 130, 175, 241, 31, 249, 31, 0, 64, 255, 198, 111, 208, 95, 253, 13, 0, 0, 255, 253, 47, 144, 223, 255, 9, 0, 0, 252, 255, 14, 80, 255, 255, 5, 0, 0, 248, 255, 10, 16, 255, 255, 1, 0, 0, 244, 255, 6, 0, 253, 223, 0, 0 };
/* x */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_120[] = { 12, 11, 12, 0, 11, 160, 255, 4, 0, 249, 95, 16, 254, 30, 64, 255, 10, 0, 245, 175, 224, 239, 1, 0, 160, 255, 253, 95, 0, 0, 16, 254, 255, 10, 0, 0, 0, 252, 255, 7, 0, 0, 96, 255, 255, 31, 0, 0, 225, 223, 242, 175, 0, 0, 249, 79, 144, 255, 4, 48, 255, 11, 16, 254, 13, 192, 255, 2, 0, 246, 143 };
/* y */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_121[] = { 12, 15, 11, 0, 11, 252, 14, 0, 0, 252, 14, 246, 79, 0, 32, 255, 9, 241, 175, 0, 112, 255, 3, 160, 255, 0, 208, 239, 0, 64, 255, 6, 242, 143, 0, 0, 254, 12, 248, 63, 0, 0, 248, 47, 253, 13, 0, 0, 242, 223, 255, 7, 0, 0, 192, 255, 255, 2, 0, 0, 96, 255, 207, 0, 0, 0, 16, 255, 127, 0, 0, 0, 0, 251, 31, 0, 0, 64, 118, 255, 12, 0, 0, 176, 255, 255, 5, 0, 0, 176, 255, 126, 0, 0, 0 };
/* z */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_122[] = { 10, 11, 10, 0, 11, 244, 255, 255, 255, 63, 244, 255, 255, 255, 63, 97, 102, 166, 255, 30, 0, 0, 225, 255, 4, 0, 0, 253, 111, 0, 0, 176, 255, 9, 0, 0, 248, 191, 0, 0, 80, 255, 13, 0, 0, 243, 255, 104, 102, 38, 245, 255, 255, 255, 95, 245, 255, 255, 255, 95 };
/* { */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_123[] = { 7, 20, 8, 1, 16, 0, 48, 101, 0, 0, 250, 255, 1, 64, 255, 255, 1, 112, 255, 6, 0, 112, 255, 2, 0, 112, 255, 2, 0, 112, 255, 2, 0, 112, 255, 2, 0, 193, 255, 0, 0, 255, 143, 0, 0, 255, 9, 0, 0, 253, 207, 0, 0, 160, 255, 1, 0, 112, 255, 2, 0, 112, 255, 2, 0, 112, 255, 2, 0, 112, 255, 2, 0, 96, 255, 107, 0, 32, 255, 255, 1, 0, 196, 255, 1 };
/* | */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_124[] = { 4, 20, 8, 2, 16, 131, 24, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47, 247, 47 };
/* } */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_125[] = { 7, 20, 8, 0, 16, 97, 37, 0, 0, 244, 255, 7, 0, 244, 255, 47, 0, 0, 248, 79, 0, 0, 244, 95, 0, 0, 244, 95, 0, 0, 244, 95, 0, 0, 244, 95, 0, 0, 242, 175, 1, 0, 160, 255, 12, 0, 0, 250, 12, 0, 208, 255, 10, 0, 243, 143, 0, 0, 244, 95, 0, 0, 244, 95, 0, 0, 244, 95, 0, 0, 244, 95, 0, 97, 252, 79, 0, 244, 255, 14, 0, 244, 191, 3, 0 };
/* ~ */ static const uint8_t Font_TTSatoshi_DemiBold_21_glyph_126[] = { 12, 5, 12, 0, 8, 0, 215, 158, 1, 144, 73, 112, 255, 255, 61, 246, 111, 224, 255, 251, 255, 255, 47, 241, 127, 64, 254, 255, 9, 48, 19, 0, 113, 72, 0 };
/* ? */ const uint8_t Font_TTSatoshi_DemiBold_21_glyph_nonprintable[] = { 11, 15, 11, 0, 15, 255, 93, 2, 98, 254, 255, 175, 0, 0, 0, 176, 255, 30, 0, 100, 2, 16, 255, 11, 80, 255, 63, 0, 252, 156, 217, 255, 127, 0, 250, 255, 255, 255, 46, 0, 252, 255, 255, 159, 0, 80, 255, 255, 255, 9, 0, 248, 255, 255, 255, 2, 176, 255, 255, 255, 255, 0, 244, 255, 255, 255, 255, 85, 249, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 17, 245, 255, 255, 255, 239, 0, 244, 255, 255, 255, 239, 0, 244, 255, 255 };
const uint8_t * const Font_TTSatoshi_DemiBold_21[126 + 1 - 32] = {
Font_TTSatoshi_DemiBold_21_glyph_32,
Font_TTSatoshi_DemiBold_21_glyph_33,
Font_TTSatoshi_DemiBold_21_glyph_34,
Font_TTSatoshi_DemiBold_21_glyph_35,
Font_TTSatoshi_DemiBold_21_glyph_36,
Font_TTSatoshi_DemiBold_21_glyph_37,
Font_TTSatoshi_DemiBold_21_glyph_38,
Font_TTSatoshi_DemiBold_21_glyph_39,
Font_TTSatoshi_DemiBold_21_glyph_40,
Font_TTSatoshi_DemiBold_21_glyph_41,
Font_TTSatoshi_DemiBold_21_glyph_42,
Font_TTSatoshi_DemiBold_21_glyph_43,
Font_TTSatoshi_DemiBold_21_glyph_44,
Font_TTSatoshi_DemiBold_21_glyph_45,
Font_TTSatoshi_DemiBold_21_glyph_46,
Font_TTSatoshi_DemiBold_21_glyph_47,
Font_TTSatoshi_DemiBold_21_glyph_48,
Font_TTSatoshi_DemiBold_21_glyph_49,
Font_TTSatoshi_DemiBold_21_glyph_50,
Font_TTSatoshi_DemiBold_21_glyph_51,
Font_TTSatoshi_DemiBold_21_glyph_52,
Font_TTSatoshi_DemiBold_21_glyph_53,
Font_TTSatoshi_DemiBold_21_glyph_54,
Font_TTSatoshi_DemiBold_21_glyph_55,
Font_TTSatoshi_DemiBold_21_glyph_56,
Font_TTSatoshi_DemiBold_21_glyph_57,
Font_TTSatoshi_DemiBold_21_glyph_58,
Font_TTSatoshi_DemiBold_21_glyph_59,
Font_TTSatoshi_DemiBold_21_glyph_60,
Font_TTSatoshi_DemiBold_21_glyph_61,
Font_TTSatoshi_DemiBold_21_glyph_62,
Font_TTSatoshi_DemiBold_21_glyph_63,
Font_TTSatoshi_DemiBold_21_glyph_64,
Font_TTSatoshi_DemiBold_21_glyph_65,
Font_TTSatoshi_DemiBold_21_glyph_66,
Font_TTSatoshi_DemiBold_21_glyph_67,
Font_TTSatoshi_DemiBold_21_glyph_68,
Font_TTSatoshi_DemiBold_21_glyph_69,
Font_TTSatoshi_DemiBold_21_glyph_70,
Font_TTSatoshi_DemiBold_21_glyph_71,
Font_TTSatoshi_DemiBold_21_glyph_72,
Font_TTSatoshi_DemiBold_21_glyph_73,
Font_TTSatoshi_DemiBold_21_glyph_74,
Font_TTSatoshi_DemiBold_21_glyph_75,
Font_TTSatoshi_DemiBold_21_glyph_76,
Font_TTSatoshi_DemiBold_21_glyph_77,
Font_TTSatoshi_DemiBold_21_glyph_78,
Font_TTSatoshi_DemiBold_21_glyph_79,
Font_TTSatoshi_DemiBold_21_glyph_80,
Font_TTSatoshi_DemiBold_21_glyph_81,
Font_TTSatoshi_DemiBold_21_glyph_82,
Font_TTSatoshi_DemiBold_21_glyph_83,
Font_TTSatoshi_DemiBold_21_glyph_84,
Font_TTSatoshi_DemiBold_21_glyph_85,
Font_TTSatoshi_DemiBold_21_glyph_86,
Font_TTSatoshi_DemiBold_21_glyph_87,
Font_TTSatoshi_DemiBold_21_glyph_88,
Font_TTSatoshi_DemiBold_21_glyph_89,
Font_TTSatoshi_DemiBold_21_glyph_90,
Font_TTSatoshi_DemiBold_21_glyph_91,
Font_TTSatoshi_DemiBold_21_glyph_92,
Font_TTSatoshi_DemiBold_21_glyph_93,
Font_TTSatoshi_DemiBold_21_glyph_94,
Font_TTSatoshi_DemiBold_21_glyph_95,
Font_TTSatoshi_DemiBold_21_glyph_96,
Font_TTSatoshi_DemiBold_21_glyph_97,
Font_TTSatoshi_DemiBold_21_glyph_98,
Font_TTSatoshi_DemiBold_21_glyph_99,
Font_TTSatoshi_DemiBold_21_glyph_100,
Font_TTSatoshi_DemiBold_21_glyph_101,
Font_TTSatoshi_DemiBold_21_glyph_102,
Font_TTSatoshi_DemiBold_21_glyph_103,
Font_TTSatoshi_DemiBold_21_glyph_104,
Font_TTSatoshi_DemiBold_21_glyph_105,
Font_TTSatoshi_DemiBold_21_glyph_106,
Font_TTSatoshi_DemiBold_21_glyph_107,
Font_TTSatoshi_DemiBold_21_glyph_108,
Font_TTSatoshi_DemiBold_21_glyph_109,
Font_TTSatoshi_DemiBold_21_glyph_110,
Font_TTSatoshi_DemiBold_21_glyph_111,
Font_TTSatoshi_DemiBold_21_glyph_112,
Font_TTSatoshi_DemiBold_21_glyph_113,
Font_TTSatoshi_DemiBold_21_glyph_114,
Font_TTSatoshi_DemiBold_21_glyph_115,
Font_TTSatoshi_DemiBold_21_glyph_116,
Font_TTSatoshi_DemiBold_21_glyph_117,
Font_TTSatoshi_DemiBold_21_glyph_118,
Font_TTSatoshi_DemiBold_21_glyph_119,
Font_TTSatoshi_DemiBold_21_glyph_120,
Font_TTSatoshi_DemiBold_21_glyph_121,
Font_TTSatoshi_DemiBold_21_glyph_122,
Font_TTSatoshi_DemiBold_21_glyph_123,
Font_TTSatoshi_DemiBold_21_glyph_124,
Font_TTSatoshi_DemiBold_21_glyph_125,
Font_TTSatoshi_DemiBold_21_glyph_126,
};

@ -0,0 +1,10 @@
#include <stdint.h>
#if TREZOR_FONT_BPP != 4
#error Wrong TREZOR_FONT_BPP (expected 4)
#endif
#define Font_TTSatoshi_DemiBold_21_HEIGHT 21
#define Font_TTSatoshi_DemiBold_21_MAX_HEIGHT 21
#define Font_TTSatoshi_DemiBold_21_BASELINE 4
extern const uint8_t* const Font_TTSatoshi_DemiBold_21[126 + 1 - 32];
extern const uint8_t Font_TTSatoshi_DemiBold_21_glyph_nonprintable[];

@ -0,0 +1,203 @@
#include <stdint.h>
// clang-format off
// - the first two bytes are width and height of the glyph
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 4-bit glyph data
/* */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_32[] = { 0, 0, 11, 0, 0 };
/* ! */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_33[] = { 6, 29, 12, 3, 29, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 249, 255, 207, 248, 255, 191, 247, 255, 159, 245, 255, 143, 244, 255, 111, 242, 255, 95, 241, 255, 63, 240, 255, 47, 224, 255, 15, 80, 102, 6, 0, 0, 0, 0, 0, 0, 216, 221, 189, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207, 250, 255, 207 };
/* " */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_34[] = { 14, 10, 18, 2, 29, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 247, 255, 95, 0, 251, 255, 31, 165, 170, 58, 0, 167, 170, 26 };
/* # */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_35[] = { 30, 29, 30, 0, 29, 0, 0, 0, 0, 0, 246, 255, 111, 0, 0, 245, 255, 127, 0, 0, 0, 0, 0, 0, 0, 249, 255, 63, 0, 0, 248, 255, 79, 0, 0, 0, 0, 0, 0, 0, 253, 255, 15, 0, 0, 252, 255, 31, 0, 0, 0, 0, 0, 0, 0, 255, 255, 12, 0, 0, 255, 255, 13, 0, 0, 0, 0, 0, 0, 48, 255, 255, 8, 0, 48, 255, 255, 10, 0, 0, 0, 0, 0, 0, 112, 255, 255, 5, 0, 96, 255, 255, 6, 0, 0, 0, 0, 0, 0, 160, 255, 255, 1, 0, 160, 255, 255, 3, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 144, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 146, 153, 153, 255, 255, 175, 153, 153, 254, 255, 175, 153, 153, 6, 0, 0, 0, 0, 255, 255, 13, 0, 0, 254, 255, 14, 0, 0, 0, 0, 0, 0, 48, 255, 255, 9, 0, 32, 255, 255, 10, 0, 0, 0, 0, 0, 0, 112, 255, 255, 6, 0, 80, 255, 255, 7, 0, 0, 0, 0, 0, 0, 160, 255, 255, 2, 0, 144, 255, 255, 4, 0, 0, 0, 0, 0, 0, 224, 255, 239, 0, 0, 192, 255, 255, 0, 0, 0, 0, 80, 153, 153, 249, 255, 239, 153, 153, 249, 255, 255, 153, 153, 41, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 32, 255, 255, 10, 0, 16, 255, 255, 11, 0, 0, 0, 0, 0, 0, 96, 255, 255, 6, 0, 64, 255, 255, 8, 0, 0, 0, 0, 0, 0, 144, 255, 255, 3, 0, 128, 255, 255, 4, 0, 0, 0, 0, 0, 0, 208, 255, 255, 0, 0, 176, 255, 255, 1, 0, 0, 0, 0, 0, 0, 240, 255, 207, 0, 0, 240, 255, 223, 0, 0, 0, 0, 0, 0, 0, 244, 255, 143, 0, 0, 242, 255, 175, 0, 0, 0, 0, 0, 0, 0, 247, 255, 95, 0, 0, 246, 255, 111, 0, 0, 0, 0, 0 };
/* $ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_36[] = { 24, 40, 27, 1, 35, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 97, 251, 255, 255, 207, 40, 0, 0, 0, 0, 0, 160, 255, 255, 255, 255, 255, 255, 43, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 242, 255, 255, 255, 255, 255, 255, 255, 255, 95, 0, 0, 252, 255, 255, 175, 87, 117, 250, 255, 255, 255, 1, 64, 255, 255, 207, 2, 0, 0, 32, 252, 255, 255, 9, 144, 255, 255, 31, 0, 0, 0, 0, 225, 255, 255, 15, 192, 255, 255, 11, 0, 0, 0, 0, 112, 255, 255, 63, 224, 255, 255, 9, 0, 0, 0, 0, 48, 255, 255, 79, 192, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 108, 2, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 239, 139, 37, 0, 0, 0, 0, 0, 245, 255, 255, 255, 255, 255, 255, 174, 4, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 255, 207, 3, 0, 0, 0, 162, 255, 255, 255, 255, 255, 255, 255, 111, 0, 0, 0, 0, 64, 201, 254, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 16, 116, 251, 255, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 143, 148, 153, 153, 0, 0, 0, 0, 0, 0, 253, 255, 191, 247, 255, 255, 3, 0, 0, 0, 0, 0, 252, 255, 207, 244, 255, 255, 10, 0, 0, 0, 0, 0, 255, 255, 191, 240, 255, 255, 159, 0, 0, 0, 0, 176, 255, 255, 159, 144, 255, 255, 255, 126, 20, 16, 115, 254, 255, 255, 95, 32, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31, 0, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 8, 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, 207, 0, 0, 0, 178, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 97, 251, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 176, 255, 255, 223, 90, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 32, 51, 51, 2, 0, 0, 0, 0 };
/* % */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_37[] = { 32, 31, 34, 1, 30, 0, 0, 181, 254, 174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 159, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 253, 255, 255, 255, 255, 11, 0, 0, 0, 96, 255, 255, 12, 0, 0, 128, 255, 255, 223, 255, 255, 95, 0, 0, 0, 241, 255, 255, 3, 0, 0, 241, 255, 143, 0, 177, 255, 239, 0, 0, 0, 251, 255, 143, 0, 0, 0, 245, 255, 12, 0, 16, 255, 255, 2, 0, 80, 255, 255, 14, 0, 0, 0, 247, 255, 8, 0, 0, 252, 255, 4, 0, 224, 255, 255, 4, 0, 0, 0, 247, 255, 8, 0, 0, 252, 255, 4, 0, 249, 255, 175, 0, 0, 0, 0, 245, 255, 12, 0, 16, 255, 255, 2, 48, 255, 255, 31, 0, 0, 0, 0, 241, 255, 143, 0, 177, 255, 239, 0, 208, 255, 255, 6, 0, 0, 0, 0, 144, 255, 255, 222, 255, 255, 95, 0, 247, 255, 207, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 11, 32, 255, 255, 47, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 159, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 181, 254, 174, 4, 0, 245, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 254, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 95, 0, 48, 234, 239, 91, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 11, 0, 249, 255, 255, 255, 27, 0, 0, 0, 0, 0, 0, 242, 255, 255, 2, 160, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 245, 255, 255, 253, 255, 255, 8, 0, 0, 0, 0, 96, 255, 255, 13, 0, 253, 255, 27, 0, 248, 255, 31, 0, 0, 0, 0, 225, 255, 255, 3, 32, 255, 255, 1, 0, 192, 255, 95, 0, 0, 0, 0, 250, 255, 159, 0, 64, 255, 207, 0, 0, 128, 255, 127, 0, 0, 0, 64, 255, 255, 14, 0, 64, 255, 207, 0, 0, 128, 255, 143, 0, 0, 0, 208, 255, 255, 5, 0, 32, 255, 255, 1, 0, 192, 255, 111, 0, 0, 0, 248, 255, 191, 0, 0, 0, 254, 255, 27, 0, 248, 255, 31, 0, 0, 48, 255, 255, 31, 0, 0, 0, 245, 255, 255, 237, 255, 255, 9, 0, 0, 192, 255, 255, 7, 0, 0, 0, 176, 255, 255, 255, 255, 223, 0, 0, 0, 246, 255, 207, 0, 0, 0, 0, 0, 249, 255, 255, 255, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 234, 239, 91, 0, 0 };
/* & */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_38[] = { 27, 31, 27, 1, 30, 0, 0, 0, 130, 236, 239, 140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 16, 253, 255, 255, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 244, 255, 255, 223, 202, 255, 255, 255, 4, 0, 0, 0, 0, 0, 249, 255, 255, 5, 0, 244, 255, 255, 10, 0, 0, 0, 0, 0, 252, 255, 175, 0, 0, 144, 255, 255, 13, 0, 0, 0, 0, 0, 253, 255, 127, 0, 0, 80, 255, 255, 14, 0, 0, 0, 0, 0, 251, 255, 159, 0, 0, 112, 255, 255, 12, 0, 0, 0, 0, 0, 248, 255, 239, 0, 0, 208, 255, 255, 9, 0, 0, 0, 0, 0, 242, 255, 255, 11, 16, 252, 255, 255, 3, 0, 0, 0, 0, 0, 112, 255, 255, 159, 211, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 191, 1, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 255, 239, 6, 0, 0, 0, 0, 0, 0, 0, 0, 210, 255, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 64, 254, 255, 255, 255, 255, 4, 0, 64, 238, 238, 11, 0, 0, 244, 255, 255, 255, 255, 255, 63, 0, 96, 255, 255, 9, 0, 32, 255, 255, 255, 156, 255, 255, 239, 2, 160, 255, 255, 7, 0, 160, 255, 255, 191, 0, 250, 255, 255, 30, 240, 255, 255, 4, 0, 240, 255, 255, 12, 0, 176, 255, 255, 223, 248, 255, 239, 0, 0, 242, 255, 255, 3, 0, 0, 252, 255, 255, 255, 255, 143, 0, 0, 244, 255, 255, 0, 0, 0, 209, 255, 255, 255, 255, 31, 0, 0, 244, 255, 255, 0, 0, 0, 32, 254, 255, 255, 255, 7, 0, 0, 243, 255, 255, 6, 0, 0, 0, 243, 255, 255, 239, 0, 0, 0, 224, 255, 255, 79, 0, 0, 16, 249, 255, 255, 255, 8, 0, 0, 128, 255, 255, 255, 140, 134, 251, 255, 255, 255, 255, 127, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 6, 0, 0, 226, 255, 255, 255, 255, 255, 255, 143, 246, 255, 255, 95, 0, 0, 16, 250, 255, 255, 255, 255, 191, 2, 64, 254, 255, 255, 4, 0, 0, 16, 183, 254, 223, 138, 2, 0, 0, 0, 0, 0, 0 };
/* ' */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_39[] = { 6, 10, 10, 2, 29, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 247, 255, 95, 165, 170, 58 };
/* ( */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_40[] = { 13, 40, 15, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 223, 0, 0, 0, 48, 255, 255, 79, 0, 0, 0, 192, 255, 255, 10, 0, 0, 0, 244, 255, 255, 2, 0, 0, 0, 252, 255, 159, 0, 0, 0, 48, 255, 255, 47, 0, 0, 0, 160, 255, 255, 11, 0, 0, 0, 240, 255, 255, 5, 0, 0, 0, 245, 255, 255, 0, 0, 0, 0, 250, 255, 175, 0, 0, 0, 0, 254, 255, 111, 0, 0, 0, 32, 255, 255, 47, 0, 0, 0, 96, 255, 255, 14, 0, 0, 0, 128, 255, 255, 11, 0, 0, 0, 176, 255, 255, 9, 0, 0, 0, 208, 255, 255, 6, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 3, 0, 0, 0, 240, 255, 255, 3, 0, 0, 0, 240, 255, 255, 3, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 208, 255, 255, 6, 0, 0, 0, 160, 255, 255, 9, 0, 0, 0, 128, 255, 255, 11, 0, 0, 0, 80, 255, 255, 14, 0, 0, 0, 32, 255, 255, 47, 0, 0, 0, 0, 254, 255, 111, 0, 0, 0, 0, 250, 255, 175, 0, 0, 0, 0, 245, 255, 255, 0, 0, 0, 0, 240, 255, 255, 5, 0, 0, 0, 144, 255, 255, 11, 0, 0, 0, 48, 255, 255, 47, 0, 0, 0, 0, 251, 255, 159, 0, 0, 0, 0, 244, 255, 255, 2, 0, 0, 0, 176, 255, 255, 10, 0, 0, 0, 32, 255, 255, 79, 0, 0, 0, 0, 248, 255, 239, 0 };
/* ) */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_41[] = { 13, 40, 15, 0, 32, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 10, 0, 0, 0, 32, 255, 255, 79, 0, 0, 0, 0, 248, 255, 223, 0, 0, 0, 0, 241, 255, 255, 6, 0, 0, 0, 128, 255, 255, 13, 0, 0, 0, 16, 255, 255, 95, 0, 0, 0, 0, 249, 255, 191, 0, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 224, 255, 255, 7, 0, 0, 0, 128, 255, 255, 12, 0, 0, 0, 64, 255, 255, 15, 0, 0, 0, 0, 255, 255, 79, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 250, 255, 175, 0, 0, 0, 0, 247, 255, 207, 0, 0, 0, 0, 245, 255, 239, 0, 0, 0, 0, 243, 255, 255, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 241, 255, 255, 2, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 243, 255, 255, 0, 0, 0, 0, 245, 255, 239, 0, 0, 0, 0, 247, 255, 207, 0, 0, 0, 0, 250, 255, 175, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 255, 255, 63, 0, 0, 0, 64, 255, 255, 15, 0, 0, 0, 144, 255, 255, 11, 0, 0, 0, 224, 255, 255, 6, 0, 0, 0, 244, 255, 255, 1, 0, 0, 0, 250, 255, 191, 0, 0, 0, 16, 255, 255, 79, 0, 0, 0, 128, 255, 255, 13, 0, 0, 0, 241, 255, 255, 5, 0, 0, 0, 249, 255, 223, 0, 0, 0, 48, 255, 255, 79, 0, 0, 0, 208, 255, 255, 9, 0, 0, 0 };
/* * */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_42[] = { 18, 17, 21, 1, 29, 0, 0, 0, 192, 255, 95, 0, 0, 0, 0, 0, 0, 176, 255, 79, 0, 0, 0, 0, 0, 0, 160, 255, 63, 0, 0, 0, 0, 0, 0, 144, 255, 47, 0, 0, 0, 32, 57, 0, 128, 255, 31, 0, 80, 8, 112, 255, 125, 113, 255, 15, 164, 255, 31, 192, 255, 255, 239, 255, 239, 255, 255, 95, 241, 255, 255, 255, 255, 255, 255, 255, 175, 97, 201, 255, 255, 255, 255, 255, 190, 71, 0, 0, 48, 252, 255, 255, 39, 0, 0, 0, 0, 80, 255, 255, 255, 13, 0, 0, 0, 0, 242, 255, 223, 255, 175, 0, 0, 0, 16, 253, 255, 42, 255, 255, 8, 0, 0, 176, 255, 239, 1, 246, 255, 95, 0, 0, 160, 255, 95, 0, 192, 255, 95, 0, 0, 0, 247, 10, 0, 32, 223, 2, 0, 0, 0, 64, 1, 0, 0, 4, 0, 0 };
/* + */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_43[] = { 19, 21, 23, 2, 23, 0, 0, 0, 64, 102, 86, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 152, 153, 153, 233, 255, 255, 153, 153, 153, 9, 254, 255, 255, 255, 255, 255, 255, 255, 255, 15, 254, 255, 255, 255, 255, 255, 255, 255, 255, 15, 254, 255, 255, 255, 255, 255, 255, 255, 255, 15, 254, 255, 255, 255, 255, 255, 255, 255, 255, 15, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 192, 255, 223, 0, 0, 0, 0, 0, 0, 0, 144, 204, 172, 0, 0, 0, 0 };
/* , */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_44[] = { 8, 10, 11, 1, 6, 80, 255, 255, 127, 112, 255, 255, 47, 128, 255, 255, 14, 160, 255, 255, 9, 192, 255, 255, 5, 224, 255, 255, 1, 240, 255, 207, 0, 241, 255, 127, 0, 243, 255, 63, 0, 163, 170, 10, 0 };
/* - */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_45[] = { 16, 5, 18, 1, 15, 209, 221, 221, 221, 221, 221, 221, 45, 241, 255, 255, 255, 255, 255, 255, 47, 241, 255, 255, 255, 255, 255, 255, 47, 241, 255, 255, 255, 255, 255, 255, 47, 241, 255, 255, 255, 255, 255, 255, 47 };
/* . */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_46[] = { 7, 6, 11, 2, 6, 214, 221, 221, 5, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6 };
/* / */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_47[] = { 17, 40, 17, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 0, 0, 243, 255, 255, 0, 0, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 0, 16, 255, 255, 47, 0, 0, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 249, 255, 175, 0, 0, 0, 0, 0, 0, 253, 255, 111, 0, 0, 0, 0, 0, 32, 255, 255, 31, 0, 0, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 0, 0, 192, 255, 255, 7, 0, 0, 0, 0, 0, 241, 255, 255, 3, 0, 0, 0, 0, 0, 245, 255, 239, 0, 0, 0, 0, 0, 0, 250, 255, 159, 0, 0, 0, 0, 0, 0, 254, 255, 79, 0, 0, 0, 0, 0, 48, 255, 255, 15, 0, 0, 0, 0, 0, 128, 255, 255, 11, 0, 0, 0, 0, 0, 208, 255, 255, 6, 0, 0, 0, 0, 0, 241, 255, 255, 2, 0, 0, 0, 0, 0, 246, 255, 223, 0, 0, 0, 0, 0, 0, 251, 255, 143, 0, 0, 0, 0, 0, 0, 255, 255, 63, 0, 0, 0, 0, 0, 64, 255, 255, 14, 0, 0, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 0, 0, 247, 255, 207, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 0, 16, 255, 255, 47, 0, 0, 0, 0, 0, 80, 255, 255, 13, 0, 0, 0, 0, 0, 160, 255, 255, 9, 0, 0, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 0, 0, 253, 255, 111, 0, 0, 0, 0, 0, 0 };
/* 0 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_48[] = { 26, 31, 28, 1, 30, 0, 0, 0, 0, 81, 219, 255, 189, 22, 0, 0, 0, 0, 0, 0, 0, 112, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 239, 3, 0, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 62, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 239, 1, 0, 0, 144, 255, 255, 255, 142, 85, 215, 255, 255, 255, 11, 0, 0, 242, 255, 255, 159, 0, 0, 0, 248, 255, 255, 79, 0, 0, 249, 255, 255, 9, 0, 0, 0, 112, 255, 255, 191, 0, 0, 255, 255, 239, 0, 0, 0, 0, 0, 252, 255, 255, 2, 80, 255, 255, 111, 0, 0, 0, 0, 0, 244, 255, 255, 6, 128, 255, 255, 31, 0, 0, 0, 0, 0, 224, 255, 255, 10, 192, 255, 255, 12, 0, 0, 0, 0, 0, 160, 255, 255, 14, 224, 255, 255, 9, 0, 0, 0, 0, 0, 112, 255, 255, 15, 240, 255, 255, 7, 0, 0, 0, 0, 0, 80, 255, 255, 31, 240, 255, 255, 6, 0, 0, 0, 0, 0, 64, 255, 255, 47, 241, 255, 255, 5, 0, 0, 0, 0, 0, 48, 255, 255, 63, 240, 255, 255, 6, 0, 0, 0, 0, 0, 64, 255, 255, 47, 240, 255, 255, 7, 0, 0, 0, 0, 0, 80, 255, 255, 31, 224, 255, 255, 9, 0, 0, 0, 0, 0, 112, 255, 255, 15, 192, 255, 255, 12, 0, 0, 0, 0, 0, 160, 255, 255, 14, 128, 255, 255, 31, 0, 0, 0, 0, 0, 224, 255, 255, 10, 80, 255, 255, 111, 0, 0, 0, 0, 0, 244, 255, 255, 7, 16, 255, 255, 239, 0, 0, 0, 0, 0, 252, 255, 255, 2, 0, 249, 255, 255, 9, 0, 0, 0, 112, 255, 255, 191, 0, 0, 242, 255, 255, 159, 0, 0, 0, 247, 255, 255, 79, 0, 0, 144, 255, 255, 255, 142, 68, 215, 255, 255, 255, 11, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 239, 1, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 239, 3, 0, 0, 0, 0, 0, 112, 255, 255, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 97, 219, 255, 189, 22, 0, 0, 0, 0 };
/* 1 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_49[] = { 12, 29, 16, 1, 29, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 48, 255, 255, 159, 255, 255, 255, 255, 255, 159, 255, 255, 255, 255, 255, 159, 255, 255, 255, 255, 255, 159, 255, 255, 255, 255, 255, 159, 255, 255, 255, 255, 255, 159, 68, 68, 68, 254, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159, 0, 0, 0, 253, 255, 159 };
/* 2 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_50[] = { 22, 30, 24, 1, 30, 0, 0, 0, 97, 219, 255, 189, 23, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 255, 9, 0, 0, 0, 16, 252, 255, 255, 255, 255, 255, 223, 1, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 12, 0, 0, 248, 255, 255, 255, 255, 255, 255, 255, 143, 0, 16, 255, 255, 255, 159, 85, 249, 255, 255, 255, 1, 112, 255, 255, 223, 2, 0, 32, 254, 255, 255, 6, 192, 255, 255, 63, 0, 0, 0, 245, 255, 255, 10, 240, 255, 255, 11, 0, 0, 0, 240, 255, 255, 12, 240, 255, 255, 7, 0, 0, 0, 208, 255, 255, 12, 80, 85, 85, 2, 0, 0, 0, 240, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 4, 0, 0, 0, 0, 0, 0, 176, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 63, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 251, 255, 255, 111, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 252, 255, 255, 127, 0, 0, 0, 0, 0, 0, 193, 255, 255, 255, 7, 0, 0, 0, 0, 0, 16, 252, 255, 255, 111, 0, 0, 0, 0, 0, 0, 209, 255, 255, 255, 6, 0, 0, 0, 0, 0, 16, 253, 255, 255, 111, 0, 0, 0, 0, 0, 0, 209, 255, 255, 255, 5, 0, 0, 0, 0, 0, 32, 254, 255, 255, 159, 51, 51, 51, 51, 51, 3, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63 };
/* 3 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_51[] = { 22, 31, 24, 1, 30, 0, 0, 0, 115, 236, 255, 189, 23, 0, 0, 0, 0, 0, 178, 255, 255, 255, 255, 255, 8, 0, 0, 0, 80, 255, 255, 255, 255, 255, 255, 223, 1, 0, 0, 245, 255, 255, 255, 255, 255, 255, 255, 12, 0, 16, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 128, 255, 255, 255, 123, 100, 232, 255, 255, 255, 0, 224, 255, 255, 79, 0, 0, 16, 252, 255, 255, 4, 242, 255, 255, 8, 0, 0, 0, 242, 255, 255, 7, 244, 255, 255, 4, 0, 0, 0, 224, 255, 255, 9, 32, 34, 34, 0, 0, 0, 0, 224, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 2, 0, 0, 0, 0, 0, 32, 213, 255, 255, 191, 0, 0, 0, 0, 0, 245, 255, 255, 255, 255, 30, 0, 0, 0, 0, 0, 245, 255, 255, 255, 207, 2, 0, 0, 0, 0, 0, 245, 255, 255, 255, 29, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 239, 4, 0, 0, 0, 0, 0, 212, 253, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 130, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 13, 67, 68, 52, 0, 0, 0, 0, 128, 255, 255, 15, 250, 255, 239, 0, 0, 0, 0, 128, 255, 255, 15, 249, 255, 255, 4, 0, 0, 0, 208, 255, 255, 14, 244, 255, 255, 62, 0, 0, 0, 249, 255, 255, 11, 224, 255, 255, 255, 122, 84, 232, 255, 255, 255, 5, 96, 255, 255, 255, 255, 255, 255, 255, 255, 223, 0, 0, 250, 255, 255, 255, 255, 255, 255, 255, 46, 0, 0, 160, 255, 255, 255, 255, 255, 255, 239, 3, 0, 0, 0, 230, 255, 255, 255, 255, 255, 25, 0, 0, 0, 0, 0, 149, 236, 255, 189, 23, 0, 0, 0 };
/* 4 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_52[] = { 23, 29, 24, 0, 29, 0, 0, 0, 0, 0, 242, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 16, 254, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 144, 255, 255, 143, 255, 255, 143, 0, 0, 0, 0, 0, 242, 255, 255, 10, 254, 255, 143, 0, 0, 0, 0, 0, 251, 255, 255, 1, 254, 255, 143, 0, 0, 0, 0, 64, 255, 255, 127, 0, 254, 255, 143, 0, 0, 0, 0, 208, 255, 255, 14, 0, 254, 255, 143, 0, 0, 0, 0, 246, 255, 255, 5, 0, 254, 255, 143, 0, 0, 0, 16, 254, 255, 207, 0, 0, 254, 255, 143, 0, 0, 0, 144, 255, 255, 63, 0, 0, 254, 255, 143, 0, 0, 0, 242, 255, 255, 9, 0, 0, 254, 255, 143, 0, 0, 0, 251, 255, 255, 1, 0, 0, 254, 255, 143, 0, 0, 64, 255, 255, 127, 0, 0, 0, 254, 255, 143, 0, 0, 208, 255, 255, 14, 0, 0, 0, 254, 255, 143, 0, 0, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 143, 0, 0 };
/* 5 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_53[] = { 22, 30, 25, 1, 29, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 241, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 242, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 246, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 247, 255, 223, 68, 68, 68, 68, 68, 68, 0, 0, 249, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 95, 199, 254, 239, 107, 1, 0, 0, 16, 255, 255, 255, 255, 255, 255, 255, 126, 0, 0, 32, 255, 255, 255, 255, 255, 255, 255, 255, 10, 0, 64, 255, 255, 255, 255, 255, 255, 255, 255, 175, 0, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 6, 112, 255, 255, 255, 75, 1, 99, 254, 255, 255, 14, 128, 238, 238, 94, 0, 0, 0, 209, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 207, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 223, 208, 221, 221, 6, 0, 0, 0, 0, 253, 255, 191, 224, 255, 255, 13, 0, 0, 0, 80, 255, 255, 143, 160, 255, 255, 191, 1, 0, 0, 227, 255, 255, 79, 64, 255, 255, 255, 158, 70, 166, 255, 255, 255, 13, 0, 251, 255, 255, 255, 255, 255, 255, 255, 255, 4, 0, 225, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 9, 0, 0, 0, 145, 255, 255, 255, 255, 255, 93, 0, 0, 0, 0, 0, 97, 219, 254, 206, 73, 0, 0, 0 };
/* 6 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_54[] = { 22, 30, 24, 1, 29, 0, 0, 0, 0, 0, 245, 255, 255, 14, 0, 0, 0, 0, 0, 0, 16, 254, 255, 255, 5, 0, 0, 0, 0, 0, 0, 144, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 8, 0, 0, 0, 0, 0, 0, 128, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 10, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 225, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 255, 223, 57, 0, 0, 0, 0, 64, 255, 255, 255, 255, 255, 255, 43, 0, 0, 0, 208, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 248, 255, 255, 255, 255, 255, 255, 255, 79, 0, 16, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 128, 255, 255, 255, 76, 17, 147, 255, 255, 255, 9, 208, 255, 255, 143, 0, 0, 0, 243, 255, 255, 15, 241, 255, 255, 12, 0, 0, 0, 112, 255, 255, 95, 243, 255, 255, 6, 0, 0, 0, 16, 255, 255, 143, 244, 255, 255, 3, 0, 0, 0, 0, 253, 255, 159, 244, 255, 255, 3, 0, 0, 0, 0, 254, 255, 159, 242, 255, 255, 6, 0, 0, 0, 16, 255, 255, 143, 240, 255, 255, 13, 0, 0, 0, 112, 255, 255, 95, 160, 255, 255, 159, 0, 0, 0, 244, 255, 255, 15, 48, 255, 255, 255, 92, 18, 148, 255, 255, 255, 9, 0, 250, 255, 255, 255, 255, 255, 255, 255, 239, 1, 0, 208, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 16, 252, 255, 255, 255, 255, 255, 239, 4, 0, 0, 0, 112, 254, 255, 255, 255, 255, 26, 0, 0, 0, 0, 0, 96, 218, 255, 206, 39, 0, 0, 0 };
/* 7 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_55[] = { 20, 29, 22, 1, 29, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 255, 255, 255, 255, 255, 255, 255, 255, 255, 207, 68, 68, 68, 68, 68, 68, 196, 255, 255, 127, 0, 0, 0, 0, 0, 0, 241, 255, 255, 31, 0, 0, 0, 0, 0, 0, 247, 255, 255, 10, 0, 0, 0, 0, 0, 0, 254, 255, 255, 3, 0, 0, 0, 0, 0, 80, 255, 255, 207, 0, 0, 0, 0, 0, 0, 176, 255, 255, 95, 0, 0, 0, 0, 0, 0, 242, 255, 255, 14, 0, 0, 0, 0, 0, 0, 249, 255, 255, 8, 0, 0, 0, 0, 0, 0, 255, 255, 255, 1, 0, 0, 0, 0, 0, 112, 255, 255, 175, 0, 0, 0, 0, 0, 0, 208, 255, 255, 63, 0, 0, 0, 0, 0, 0, 244, 255, 255, 13, 0, 0, 0, 0, 0, 0, 251, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 239, 0, 0, 0, 0, 0, 0, 128, 255, 255, 143, 0, 0, 0, 0, 0, 0, 240, 255, 255, 47, 0, 0, 0, 0, 0, 0, 246, 255, 255, 11, 0, 0, 0, 0, 0, 0, 253, 255, 255, 4, 0, 0, 0, 0, 0, 64, 255, 255, 223, 0, 0, 0, 0, 0, 0, 160, 255, 255, 111, 0, 0, 0, 0, 0, 0, 241, 255, 255, 15, 0, 0, 0, 0, 0, 0, 248, 255, 255, 8, 0, 0, 0, 0, 0, 0, 254, 255, 255, 2, 0, 0, 0, 0, 0, 96, 255, 255, 191, 0, 0, 0, 0, 0 };
/* 8 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_56[] = { 22, 31, 25, 1, 30, 0, 0, 0, 96, 218, 254, 206, 73, 0, 0, 0, 0, 0, 112, 254, 255, 255, 255, 255, 77, 0, 0, 0, 0, 251, 255, 255, 255, 255, 255, 255, 8, 0, 0, 176, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 245, 255, 255, 255, 239, 255, 255, 255, 255, 2, 0, 253, 255, 255, 60, 0, 80, 254, 255, 255, 9, 32, 255, 255, 223, 0, 0, 0, 242, 255, 255, 14, 80, 255, 255, 79, 0, 0, 0, 128, 255, 255, 47, 112, 255, 255, 15, 0, 0, 0, 64, 255, 255, 63, 96, 255, 255, 31, 0, 0, 0, 80, 255, 255, 47, 64, 255, 255, 95, 0, 0, 0, 144, 255, 255, 15, 0, 254, 255, 239, 1, 0, 0, 243, 255, 255, 11, 0, 245, 255, 255, 110, 2, 131, 255, 255, 255, 2, 0, 160, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 0, 249, 255, 255, 255, 255, 255, 255, 6, 0, 0, 0, 227, 255, 255, 255, 255, 255, 207, 1, 0, 0, 96, 255, 255, 255, 255, 255, 255, 255, 78, 0, 0, 246, 255, 255, 239, 172, 252, 255, 255, 255, 3, 32, 255, 255, 239, 6, 0, 0, 248, 255, 255, 13, 144, 255, 255, 63, 0, 0, 0, 112, 255, 255, 95, 224, 255, 255, 10, 0, 0, 0, 0, 254, 255, 175, 240, 255, 255, 6, 0, 0, 0, 0, 250, 255, 207, 241, 255, 255, 7, 0, 0, 0, 0, 251, 255, 223, 240, 255, 255, 11, 0, 0, 0, 0, 254, 255, 207, 192, 255, 255, 111, 0, 0, 0, 144, 255, 255, 143, 112, 255, 255, 255, 41, 0, 48, 251, 255, 255, 63, 0, 253, 255, 255, 255, 223, 255, 255, 255, 255, 10, 0, 243, 255, 255, 255, 255, 255, 255, 255, 223, 1, 0, 64, 254, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 161, 255, 255, 255, 255, 255, 142, 0, 0, 0, 0, 0, 97, 218, 254, 222, 90, 0, 0, 0 };
/* 9 */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_57[] = { 22, 30, 24, 1, 30, 0, 0, 0, 80, 218, 254, 189, 39, 0, 0, 0, 0, 0, 112, 254, 255, 255, 255, 255, 26, 0, 0, 0, 16, 252, 255, 255, 255, 255, 255, 239, 4, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 250, 255, 255, 255, 255, 255, 255, 255, 239, 1, 48, 255, 255, 255, 93, 18, 148, 255, 255, 255, 8, 160, 255, 255, 159, 0, 0, 0, 244, 255, 255, 15, 240, 255, 255, 13, 0, 0, 0, 128, 255, 255, 95, 242, 255, 255, 6, 0, 0, 0, 16, 255, 255, 143, 244, 255, 255, 3, 0, 0, 0, 0, 254, 255, 159, 244, 255, 255, 3, 0, 0, 0, 0, 253, 255, 175, 242, 255, 255, 6, 0, 0, 0, 16, 255, 255, 143, 240, 255, 255, 12, 0, 0, 0, 112, 255, 255, 127, 176, 255, 255, 143, 0, 0, 0, 243, 255, 255, 63, 64, 255, 255, 255, 76, 17, 147, 255, 255, 255, 14, 0, 251, 255, 255, 255, 255, 255, 255, 255, 255, 7, 0, 209, 255, 255, 255, 255, 255, 255, 255, 223, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 79, 0, 0, 0, 144, 255, 255, 255, 255, 255, 255, 10, 0, 0, 0, 0, 114, 236, 255, 255, 255, 239, 1, 0, 0, 0, 0, 0, 0, 242, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 11, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 224, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 13, 0, 0, 0, 0, 0, 0, 32, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 192, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 246, 255, 255, 30, 0, 0, 0, 0, 0, 0, 16, 254, 255, 255, 5, 0, 0, 0, 0, 0, 0, 144, 255, 255, 191, 0, 0, 0, 0, 0 };
/* : */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_58[] = { 7, 21, 11, 2, 21, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 230, 238, 238, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 214, 221, 221, 5, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6, 247, 255, 255, 6 };
/* ; */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_59[] = { 8, 25, 11, 1, 21, 64, 255, 255, 159, 64, 255, 255, 159, 64, 255, 255, 159, 64, 255, 255, 159, 64, 255, 255, 159, 64, 238, 238, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 127, 112, 255, 255, 47, 128, 255, 255, 14, 160, 255, 255, 9, 192, 255, 255, 5, 224, 255, 255, 1, 240, 255, 207, 0, 241, 255, 127, 0, 243, 255, 63, 0, 163, 170, 10, 0 };
/* < */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_60[] = { 19, 20, 23, 2, 22, 0, 0, 0, 0, 0, 0, 0, 0, 113, 10, 0, 0, 0, 0, 0, 0, 0, 180, 255, 12, 0, 0, 0, 0, 0, 16, 231, 255, 255, 12, 0, 0, 0, 0, 64, 251, 255, 255, 255, 12, 0, 0, 0, 129, 254, 255, 255, 255, 255, 12, 0, 0, 180, 255, 255, 255, 255, 255, 191, 5, 32, 232, 255, 255, 255, 255, 255, 125, 1, 0, 248, 255, 255, 255, 255, 255, 57, 0, 0, 0, 251, 255, 255, 255, 191, 5, 0, 0, 0, 0, 251, 255, 255, 126, 1, 0, 0, 0, 0, 0, 251, 255, 255, 191, 5, 0, 0, 0, 0, 0, 251, 255, 255, 255, 239, 57, 0, 0, 0, 0, 230, 255, 255, 255, 255, 255, 125, 1, 0, 0, 0, 164, 255, 255, 255, 255, 255, 191, 5, 0, 0, 0, 113, 253, 255, 255, 255, 255, 255, 8, 0, 0, 0, 64, 250, 255, 255, 255, 255, 12, 0, 0, 0, 0, 16, 215, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 164, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 113, 253, 12, 0, 0, 0, 0, 0, 0, 0, 0, 48, 7 };
/* = */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_61[] = { 19, 14, 23, 2, 19, 144, 153, 153, 153, 153, 153, 153, 153, 153, 1, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 240, 255, 255, 255, 255, 255, 255, 255, 255, 2, 144, 153, 153, 153, 153, 153, 153, 153, 153, 1 };
/* > */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_62[] = { 19, 20, 23, 2, 22, 137, 2, 0, 0, 0, 0, 0, 0, 0, 0, 251, 191, 5, 0, 0, 0, 0, 0, 0, 0, 251, 255, 239, 40, 0, 0, 0, 0, 0, 0, 251, 255, 255, 255, 91, 0, 0, 0, 0, 0, 251, 255, 255, 255, 255, 142, 2, 0, 0, 0, 180, 255, 255, 255, 255, 255, 191, 5, 0, 0, 0, 113, 253, 255, 255, 255, 255, 239, 40, 0, 0, 0, 48, 233, 255, 255, 255, 255, 255, 9, 0, 0, 0, 0, 181, 255, 255, 255, 255, 12, 0, 0, 0, 0, 0, 97, 253, 255, 255, 12, 0, 0, 0, 0, 0, 164, 255, 255, 255, 12, 0, 0, 0, 32, 232, 255, 255, 255, 255, 12, 0, 0, 113, 253, 255, 255, 255, 255, 239, 7, 0, 181, 255, 255, 255, 255, 255, 191, 5, 0, 231, 255, 255, 255, 255, 255, 142, 1, 0, 0, 251, 255, 255, 255, 255, 75, 0, 0, 0, 0, 251, 255, 255, 239, 23, 0, 0, 0, 0, 0, 251, 255, 175, 4, 0, 0, 0, 0, 0, 0, 251, 125, 1, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* ? */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_63[] = { 20, 30, 22, 1, 30, 0, 0, 32, 200, 254, 223, 123, 2, 0, 0, 0, 32, 251, 255, 255, 255, 255, 175, 1, 0, 0, 244, 255, 255, 255, 255, 255, 255, 62, 0, 48, 255, 255, 255, 255, 255, 255, 255, 239, 2, 192, 255, 255, 255, 255, 255, 255, 255, 255, 11, 244, 255, 255, 175, 20, 98, 254, 255, 255, 63, 249, 255, 255, 8, 0, 0, 192, 255, 255, 143, 253, 255, 255, 0, 0, 0, 48, 255, 255, 175, 220, 221, 173, 0, 0, 0, 0, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 255, 255, 175, 0, 0, 0, 0, 0, 0, 80, 255, 255, 143, 0, 0, 0, 0, 0, 0, 245, 255, 255, 63, 0, 0, 0, 0, 0, 178, 255, 255, 255, 12, 0, 0, 0, 0, 112, 255, 255, 255, 239, 2, 0, 0, 0, 0, 246, 255, 255, 255, 44, 0, 0, 0, 0, 32, 255, 255, 255, 94, 0, 0, 0, 0, 0, 128, 255, 255, 207, 1, 0, 0, 0, 0, 0, 208, 255, 255, 14, 0, 0, 0, 0, 0, 0, 224, 255, 255, 7, 0, 0, 0, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 0, 0, 0, 240, 255, 255, 3, 0, 0, 0, 0, 0, 0, 80, 85, 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 221, 221, 6, 0, 0, 0, 0, 0, 0, 243, 255, 255, 6, 0, 0, 0, 0, 0, 0, 243, 255, 255, 6, 0, 0, 0, 0, 0, 0, 243, 255, 255, 6, 0, 0, 0, 0, 0, 0, 243, 255, 255, 6, 0, 0, 0, 0, 0, 0, 243, 255, 255, 6, 0, 0, 0 };
/* @ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_64[] = { 37, 34, 40, 2, 29, 0, 0, 0, 0, 0, 0, 98, 202, 253, 223, 172, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 215, 255, 255, 255, 255, 255, 255, 158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 255, 255, 255, 255, 255, 255, 255, 255, 159, 1, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 78, 0, 0, 0, 0, 0, 0, 48, 254, 255, 255, 255, 174, 121, 135, 218, 255, 255, 255, 255, 7, 0, 0, 0, 0, 0, 243, 255, 255, 255, 56, 0, 0, 0, 0, 97, 253, 255, 255, 143, 0, 0, 0, 0, 32, 254, 255, 255, 26, 0, 0, 0, 0, 0, 0, 80, 254, 255, 255, 6, 0, 0, 0, 208, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 63, 0, 0, 0, 247, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 191, 0, 0, 16, 254, 255, 111, 0, 0, 48, 217, 255, 140, 2, 252, 239, 0, 225, 255, 255, 4, 0, 128, 255, 255, 11, 0, 16, 250, 255, 255, 255, 175, 255, 239, 0, 80, 255, 255, 12, 0, 208, 255, 255, 2, 0, 209, 255, 255, 255, 255, 255, 255, 239, 0, 0, 252, 255, 31, 0, 242, 255, 175, 0, 0, 252, 255, 255, 255, 255, 255, 255, 239, 0, 0, 245, 255, 111, 0, 247, 255, 95, 0, 80, 255, 255, 127, 2, 179, 255, 255, 239, 0, 0, 241, 255, 175, 0, 250, 255, 31, 0, 192, 255, 255, 3, 0, 0, 249, 255, 239, 0, 0, 208, 255, 207, 0, 251, 255, 14, 0, 241, 255, 159, 0, 0, 0, 224, 255, 239, 0, 0, 176, 255, 239, 0, 253, 255, 12, 0, 243, 255, 79, 0, 0, 0, 160, 255, 239, 0, 0, 160, 255, 255, 0, 254, 255, 11, 0, 244, 255, 47, 0, 0, 0, 128, 255, 239, 0, 0, 176, 255, 255, 0, 252, 255, 13, 0, 243, 255, 79, 0, 0, 0, 160, 255, 239, 0, 0, 192, 255, 239, 0, 251, 255, 14, 0, 241, 255, 159, 0, 0, 0, 224, 255, 239, 0, 0, 241, 255, 191, 0, 249, 255, 47, 0, 192, 255, 255, 3, 0, 0, 249, 255, 255, 1, 0, 249, 255, 127, 0, 245, 255, 127, 0, 80, 255, 255, 127, 2, 179, 255, 255, 255, 76, 164, 255, 255, 47, 0, 240, 255, 223, 0, 0, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 176, 255, 255, 7, 0, 209, 255, 255, 255, 255, 255, 254, 255, 255, 255, 255, 223, 0, 0, 48, 255, 255, 63, 0, 16, 251, 255, 255, 255, 191, 65, 255, 255, 255, 255, 27, 0, 0, 0, 250, 255, 239, 2, 0, 48, 217, 255, 172, 3, 0, 129, 252, 223, 73, 0, 0, 0, 0, 242, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 157, 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 193, 255, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 251, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 101, 102, 102, 102, 102, 2, 0, 0, 0, 0, 0 };
/* A */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_65[] = { 29, 29, 29, 0, 29, 0, 0, 0, 0, 0, 250, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 255, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 245, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 175, 176, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 79, 80, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 15, 0, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 10, 0, 250, 255, 255, 4, 0, 0, 0, 0, 0, 0, 250, 255, 255, 4, 0, 245, 255, 255, 10, 0, 0, 0, 0, 0, 0, 255, 255, 239, 0, 0, 240, 255, 255, 15, 0, 0, 0, 0, 0, 96, 255, 255, 159, 0, 0, 160, 255, 255, 95, 0, 0, 0, 0, 0, 192, 255, 255, 79, 0, 0, 64, 255, 255, 191, 0, 0, 0, 0, 0, 241, 255, 255, 14, 0, 0, 0, 254, 255, 255, 1, 0, 0, 0, 0, 247, 255, 255, 9, 0, 0, 0, 249, 255, 255, 7, 0, 0, 0, 0, 253, 255, 255, 4, 0, 0, 0, 244, 255, 255, 12, 0, 0, 0, 48, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 47, 0, 0, 0, 128, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 0, 224, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 0, 0, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 10, 0, 0, 255, 255, 255, 2, 0, 0, 0, 0, 0, 242, 255, 255, 15, 0, 80, 255, 255, 207, 0, 0, 0, 0, 0, 0, 192, 255, 255, 95, 0, 176, 255, 255, 111, 0, 0, 0, 0, 0, 0, 96, 255, 255, 191, 0, 241, 255, 255, 15, 0, 0, 0, 0, 0, 0, 16, 255, 255, 255, 1, 247, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 7, 253, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 12 };
/* B */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_66[] = { 23, 29, 28, 3, 29, 253, 255, 255, 255, 255, 255, 255, 222, 73, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 27, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 2, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 253, 255, 255, 221, 221, 221, 237, 255, 255, 255, 111, 0, 253, 255, 159, 0, 0, 0, 0, 177, 255, 255, 207, 0, 253, 255, 159, 0, 0, 0, 0, 0, 253, 255, 255, 0, 253, 255, 159, 0, 0, 0, 0, 0, 247, 255, 255, 2, 253, 255, 159, 0, 0, 0, 0, 0, 244, 255, 255, 2, 253, 255, 159, 0, 0, 0, 0, 0, 247, 255, 255, 0, 253, 255, 159, 0, 0, 0, 0, 0, 253, 255, 207, 0, 253, 255, 159, 0, 0, 0, 0, 196, 255, 255, 111, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 6, 0, 253, 255, 255, 221, 221, 221, 221, 255, 255, 255, 63, 0, 253, 255, 159, 0, 0, 0, 0, 128, 255, 255, 207, 0, 253, 255, 159, 0, 0, 0, 0, 0, 248, 255, 255, 3, 253, 255, 159, 0, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 0, 224, 255, 255, 9, 253, 255, 159, 0, 0, 0, 0, 0, 240, 255, 255, 8, 253, 255, 159, 0, 0, 0, 0, 0, 248, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 112, 255, 255, 255, 3, 253, 255, 239, 221, 221, 221, 221, 255, 255, 255, 223, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 7, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 94, 0, 0, 253, 255, 255, 255, 255, 255, 255, 239, 107, 0, 0, 0 };
/* C */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_67[] = { 29, 31, 31, 1, 30, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 253, 255, 255, 255, 123, 69, 166, 255, 255, 255, 239, 1, 0, 0, 160, 255, 255, 255, 26, 0, 0, 0, 177, 255, 255, 255, 9, 0, 0, 242, 255, 255, 127, 0, 0, 0, 0, 0, 247, 255, 255, 47, 0, 0, 250, 255, 255, 8, 0, 0, 0, 0, 0, 160, 255, 255, 159, 0, 16, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 0, 80, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 231, 238, 238, 3, 160, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 16, 17, 17, 0, 96, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 3, 16, 255, 255, 207, 0, 0, 0, 0, 0, 0, 16, 255, 255, 239, 0, 0, 250, 255, 255, 7, 0, 0, 0, 0, 0, 160, 255, 255, 159, 0, 0, 242, 255, 255, 111, 0, 0, 0, 0, 0, 247, 255, 255, 47, 0, 0, 160, 255, 255, 255, 26, 0, 0, 0, 177, 255, 255, 255, 9, 0, 0, 0, 253, 255, 255, 255, 107, 69, 150, 255, 255, 255, 223, 1, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0 };
/* D */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_68[] = { 26, 29, 30, 3, 29, 253, 255, 255, 255, 255, 239, 189, 39, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 93, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 44, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 4, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 253, 255, 191, 68, 68, 84, 166, 255, 255, 255, 239, 2, 0, 253, 255, 159, 0, 0, 0, 0, 129, 255, 255, 255, 12, 0, 253, 255, 159, 0, 0, 0, 0, 0, 244, 255, 255, 95, 0, 253, 255, 159, 0, 0, 0, 0, 0, 64, 255, 255, 223, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 249, 255, 255, 3, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 8, 253, 255, 159, 0, 0, 0, 0, 0, 0, 192, 255, 255, 13, 253, 255, 159, 0, 0, 0, 0, 0, 0, 128, 255, 255, 15, 253, 255, 159, 0, 0, 0, 0, 0, 0, 96, 255, 255, 15, 253, 255, 159, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 253, 255, 159, 0, 0, 0, 0, 0, 0, 96, 255, 255, 15, 253, 255, 159, 0, 0, 0, 0, 0, 0, 128, 255, 255, 15, 253, 255, 159, 0, 0, 0, 0, 0, 0, 192, 255, 255, 13, 253, 255, 159, 0, 0, 0, 0, 0, 0, 241, 255, 255, 8, 253, 255, 159, 0, 0, 0, 0, 0, 0, 249, 255, 255, 3, 253, 255, 159, 0, 0, 0, 0, 0, 64, 255, 255, 223, 0, 253, 255, 159, 0, 0, 0, 0, 0, 244, 255, 255, 95, 0, 253, 255, 159, 0, 0, 0, 0, 128, 255, 255, 255, 13, 0, 253, 255, 191, 51, 51, 68, 166, 255, 255, 255, 239, 2, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 4, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 44, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 93, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 189, 55, 0, 0, 0, 0, 0 };
/* E */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_69[] = { 20, 29, 25, 3, 29, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 175, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 15, 253, 255, 255, 255, 255, 255, 255, 255, 255, 15, 253, 255, 255, 255, 255, 255, 255, 255, 255, 15, 253, 255, 255, 255, 255, 255, 255, 255, 255, 15, 253, 255, 255, 255, 255, 255, 255, 255, 255, 15, 253, 255, 175, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239 };
/* F */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_70[] = { 20, 29, 25, 3, 29, 253, 255, 255, 255, 255, 255, 255, 255, 255, 175, 253, 255, 255, 255, 255, 255, 255, 255, 255, 175, 253, 255, 255, 255, 255, 255, 255, 255, 255, 175, 253, 255, 255, 255, 255, 255, 255, 255, 255, 175, 253, 255, 255, 255, 255, 255, 255, 255, 255, 175, 253, 255, 175, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 253, 255, 175, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0 };
/* G */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_71[] = { 29, 31, 32, 1, 30, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 4, 0, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 63, 0, 0, 0, 0, 253, 255, 255, 255, 123, 85, 167, 255, 255, 255, 239, 1, 0, 0, 144, 255, 255, 255, 26, 0, 0, 0, 162, 255, 255, 255, 10, 0, 0, 242, 255, 255, 127, 0, 0, 0, 0, 0, 248, 255, 255, 63, 0, 0, 250, 255, 255, 8, 0, 0, 0, 0, 0, 160, 255, 255, 175, 0, 16, 255, 255, 223, 0, 0, 0, 0, 0, 0, 16, 254, 255, 255, 0, 80, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 198, 204, 204, 3, 144, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 6, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 1, 241, 255, 255, 5, 0, 0, 0, 48, 255, 255, 255, 255, 255, 255, 9, 240, 255, 255, 6, 0, 0, 0, 48, 255, 255, 255, 255, 255, 255, 9, 240, 255, 255, 7, 0, 0, 0, 48, 255, 255, 255, 255, 255, 255, 9, 224, 255, 255, 10, 0, 0, 0, 48, 255, 255, 255, 255, 255, 255, 9, 160, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 9, 96, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 9, 16, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 9, 0, 251, 255, 255, 7, 0, 0, 0, 0, 0, 48, 255, 255, 255, 9, 0, 243, 255, 255, 111, 0, 0, 0, 0, 0, 227, 255, 255, 255, 9, 0, 160, 255, 255, 255, 25, 0, 0, 0, 112, 255, 255, 255, 255, 9, 0, 0, 253, 255, 255, 255, 107, 68, 150, 254, 255, 255, 255, 255, 9, 0, 0, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 0, 32, 254, 255, 255, 255, 255, 255, 255, 255, 159, 255, 255, 9, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 7, 253, 255, 9, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 60, 0, 250, 255, 9, 0, 0, 0, 0, 0, 114, 219, 254, 206, 56, 0, 0, 0, 0, 0 };
/* H */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_72[] = { 25, 29, 30, 3, 29, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 207, 119, 119, 119, 119, 119, 119, 248, 255, 255, 4, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 0, 242, 255, 255, 4 };
/* I */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_73[] = { 6, 29, 12, 3, 29, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159, 253, 255, 159 };
/* J */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_74[] = { 15, 29, 17, 0, 29, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 242, 255, 255, 4, 0, 0, 0, 0, 243, 255, 255, 4, 0, 0, 0, 0, 245, 255, 255, 4, 50, 51, 51, 84, 253, 255, 255, 3, 249, 255, 255, 255, 255, 255, 255, 1, 249, 255, 255, 255, 255, 255, 239, 0, 249, 255, 255, 255, 255, 255, 127, 0, 249, 255, 255, 255, 255, 255, 11, 0, 249, 255, 255, 255, 223, 91, 0, 0 };
/* K */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_75[] = { 24, 29, 25, 3, 29, 253, 255, 159, 0, 0, 0, 0, 176, 255, 255, 239, 1, 253, 255, 159, 0, 0, 0, 0, 247, 255, 255, 79, 0, 253, 255, 159, 0, 0, 0, 64, 255, 255, 255, 7, 0, 253, 255, 159, 0, 0, 0, 225, 255, 255, 175, 0, 0, 253, 255, 159, 0, 0, 0, 252, 255, 255, 13, 0, 0, 253, 255, 159, 0, 0, 128, 255, 255, 255, 2, 0, 0, 253, 255, 159, 0, 0, 245, 255, 255, 95, 0, 0, 0, 253, 255, 159, 0, 32, 255, 255, 255, 9, 0, 0, 0, 253, 255, 159, 0, 208, 255, 255, 207, 0, 0, 0, 0, 253, 255, 159, 0, 250, 255, 255, 30, 0, 0, 0, 0, 253, 255, 159, 96, 255, 255, 255, 3, 0, 0, 0, 0, 253, 255, 159, 243, 255, 255, 127, 0, 0, 0, 0, 0, 253, 255, 175, 254, 255, 255, 10, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 253, 255, 239, 255, 255, 255, 4, 0, 0, 0, 0, 0, 253, 255, 159, 249, 255, 255, 46, 0, 0, 0, 0, 0, 253, 255, 159, 192, 255, 255, 223, 0, 0, 0, 0, 0, 253, 255, 159, 16, 254, 255, 255, 11, 0, 0, 0, 0, 253, 255, 159, 0, 243, 255, 255, 143, 0, 0, 0, 0, 253, 255, 159, 0, 80, 255, 255, 255, 5, 0, 0, 0, 253, 255, 159, 0, 0, 248, 255, 255, 47, 0, 0, 0, 253, 255, 159, 0, 0, 176, 255, 255, 239, 1, 0, 0, 253, 255, 159, 0, 0, 16, 253, 255, 255, 12, 0, 0, 253, 255, 159, 0, 0, 0, 242, 255, 255, 159, 0, 0, 253, 255, 159, 0, 0, 0, 80, 255, 255, 255, 6, 0, 253, 255, 159, 0, 0, 0, 0, 247, 255, 255, 63, 0, 253, 255, 159, 0, 0, 0, 0, 160, 255, 255, 239, 1, 253, 255, 159, 0, 0, 0, 0, 0, 253, 255, 255, 12 };
/* L */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_76[] = { 20, 29, 23, 3, 29, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 253, 255, 191, 51, 51, 51, 51, 51, 51, 19, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127, 253, 255, 255, 255, 255, 255, 255, 255, 255, 127 };
/* M */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_77[] = { 33, 29, 39, 3, 29, 253, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 7, 253, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 7, 253, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 2, 0, 0, 0, 0, 0, 248, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 13, 0, 0, 0, 0, 48, 255, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 63, 0, 0, 0, 0, 128, 255, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 143, 0, 0, 0, 0, 224, 255, 255, 255, 255, 255, 7, 253, 255, 255, 255, 255, 239, 0, 0, 0, 0, 243, 255, 255, 255, 255, 255, 7, 253, 255, 175, 246, 255, 255, 3, 0, 0, 0, 249, 255, 255, 241, 255, 255, 7, 253, 255, 159, 241, 255, 255, 9, 0, 0, 0, 254, 255, 175, 240, 255, 255, 7, 253, 255, 159, 176, 255, 255, 14, 0, 0, 64, 255, 255, 95, 240, 255, 255, 7, 253, 255, 159, 80, 255, 255, 79, 0, 0, 144, 255, 255, 15, 240, 255, 255, 7, 253, 255, 159, 0, 255, 255, 159, 0, 0, 240, 255, 255, 10, 240, 255, 255, 7, 253, 255, 159, 0, 250, 255, 239, 0, 0, 244, 255, 255, 4, 240, 255, 255, 7, 253, 255, 159, 0, 245, 255, 255, 4, 0, 250, 255, 239, 0, 240, 255, 255, 7, 253, 255, 159, 0, 240, 255, 255, 9, 0, 255, 255, 159, 0, 240, 255, 255, 7, 253, 255, 159, 0, 160, 255, 255, 15, 80, 255, 255, 63, 0, 240, 255, 255, 7, 253, 255, 159, 0, 64, 255, 255, 79, 160, 255, 255, 14, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 254, 255, 175, 240, 255, 255, 8, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 249, 255, 255, 253, 255, 255, 3, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 243, 255, 255, 255, 255, 223, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 224, 255, 255, 255, 255, 143, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 128, 255, 255, 255, 255, 47, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 48, 255, 255, 255, 255, 13, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 253, 255, 255, 255, 7, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 247, 255, 255, 255, 1, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 242, 255, 255, 207, 0, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 192, 255, 255, 111, 0, 0, 0, 240, 255, 255, 7 };
/* N */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_78[] = { 25, 29, 31, 3, 29, 253, 255, 255, 207, 0, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 4, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 13, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 95, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 239, 0, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 255, 7, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 255, 14, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 255, 143, 0, 0, 0, 240, 255, 255, 7, 253, 255, 255, 255, 255, 255, 1, 0, 0, 240, 255, 255, 7, 253, 255, 175, 245, 255, 255, 9, 0, 0, 240, 255, 255, 7, 253, 255, 159, 192, 255, 255, 47, 0, 0, 240, 255, 255, 7, 253, 255, 159, 48, 255, 255, 175, 0, 0, 240, 255, 255, 7, 253, 255, 159, 0, 251, 255, 255, 3, 0, 240, 255, 255, 7, 253, 255, 159, 0, 242, 255, 255, 11, 0, 240, 255, 255, 7, 253, 255, 159, 0, 160, 255, 255, 79, 0, 240, 255, 255, 7, 253, 255, 159, 0, 16, 255, 255, 207, 0, 240, 255, 255, 7, 253, 255, 159, 0, 0, 248, 255, 255, 5, 240, 255, 255, 7, 253, 255, 159, 0, 0, 241, 255, 255, 13, 240, 255, 255, 7, 253, 255, 159, 0, 0, 112, 255, 255, 111, 240, 255, 255, 7, 253, 255, 159, 0, 0, 0, 254, 255, 239, 241, 255, 255, 7, 253, 255, 159, 0, 0, 0, 246, 255, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 208, 255, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 80, 255, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 252, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 244, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 176, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 48, 255, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 0, 250, 255, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 0, 242, 255, 255, 255, 7 };
/* O */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_79[] = { 30, 31, 32, 1, 30, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 111, 0, 0, 0, 0, 253, 255, 255, 255, 123, 69, 150, 254, 255, 255, 255, 3, 0, 0, 160, 255, 255, 255, 26, 0, 0, 0, 112, 255, 255, 255, 14, 0, 0, 242, 255, 255, 127, 0, 0, 0, 0, 0, 227, 255, 255, 127, 0, 0, 250, 255, 255, 8, 0, 0, 0, 0, 0, 48, 255, 255, 239, 0, 16, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 6, 80, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 11, 160, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 15, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 47, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 95, 241, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 111, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 95, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 79, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 47, 160, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 15, 96, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 11, 16, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 6, 0, 250, 255, 255, 7, 0, 0, 0, 0, 0, 48, 255, 255, 239, 0, 0, 242, 255, 255, 111, 0, 0, 0, 0, 0, 226, 255, 255, 127, 0, 0, 160, 255, 255, 255, 26, 0, 0, 0, 96, 255, 255, 255, 14, 0, 0, 0, 253, 255, 255, 255, 107, 69, 150, 254, 255, 255, 255, 3, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 111, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 6, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0 };
/* P */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_80[] = { 23, 29, 27, 3, 29, 253, 255, 255, 255, 255, 255, 255, 206, 39, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 207, 1, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 95, 0, 253, 255, 191, 68, 68, 68, 84, 248, 255, 255, 223, 0, 253, 255, 159, 0, 0, 0, 0, 16, 254, 255, 255, 2, 253, 255, 159, 0, 0, 0, 0, 0, 245, 255, 255, 6, 253, 255, 159, 0, 0, 0, 0, 0, 240, 255, 255, 8, 253, 255, 159, 0, 0, 0, 0, 0, 224, 255, 255, 9, 253, 255, 159, 0, 0, 0, 0, 0, 240, 255, 255, 8, 253, 255, 159, 0, 0, 0, 0, 0, 243, 255, 255, 7, 253, 255, 159, 0, 0, 0, 0, 0, 252, 255, 255, 3, 253, 255, 159, 0, 0, 0, 0, 196, 255, 255, 239, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 3, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 45, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 108, 0, 0, 0, 253, 255, 191, 68, 68, 68, 52, 2, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* Q */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_81[] = { 30, 33, 32, 1, 30, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 126, 0, 0, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 111, 0, 0, 0, 0, 253, 255, 255, 255, 123, 69, 150, 254, 255, 255, 255, 3, 0, 0, 160, 255, 255, 255, 26, 0, 0, 0, 112, 255, 255, 255, 14, 0, 0, 242, 255, 255, 127, 0, 0, 0, 0, 0, 227, 255, 255, 127, 0, 0, 250, 255, 255, 8, 0, 0, 0, 0, 0, 48, 255, 255, 239, 0, 16, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 6, 80, 255, 255, 95, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 11, 160, 255, 255, 15, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 15, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 47, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 95, 241, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 111, 240, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 16, 255, 255, 95, 240, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 79, 208, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 47, 160, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 15, 96, 255, 255, 95, 0, 0, 161, 170, 170, 42, 0, 240, 255, 255, 11, 16, 255, 255, 207, 0, 0, 80, 255, 255, 239, 1, 247, 255, 255, 6, 0, 250, 255, 255, 7, 0, 0, 247, 255, 255, 60, 255, 255, 255, 1, 0, 242, 255, 255, 111, 0, 0, 144, 255, 255, 255, 255, 255, 143, 0, 0, 160, 255, 255, 255, 26, 0, 0, 251, 255, 255, 255, 255, 14, 0, 0, 0, 253, 255, 255, 255, 107, 69, 247, 255, 255, 255, 255, 4, 0, 0, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 255, 111, 0, 0, 0, 0, 32, 253, 255, 255, 255, 255, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 177, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 0, 0, 0, 0, 0, 196, 255, 255, 255, 255, 255, 255, 255, 255, 30, 0, 0, 0, 0, 0, 0, 114, 219, 254, 205, 73, 96, 255, 255, 223, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 170, 170, 106 };
/* R */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_82[] = { 24, 29, 28, 3, 29, 253, 255, 255, 255, 255, 255, 255, 206, 40, 0, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 207, 1, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 12, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 0, 253, 255, 191, 68, 68, 68, 68, 232, 255, 255, 239, 0, 253, 255, 159, 0, 0, 0, 0, 16, 253, 255, 255, 5, 253, 255, 159, 0, 0, 0, 0, 0, 243, 255, 255, 9, 253, 255, 159, 0, 0, 0, 0, 0, 208, 255, 255, 11, 253, 255, 159, 0, 0, 0, 0, 0, 176, 255, 255, 12, 253, 255, 159, 0, 0, 0, 0, 0, 192, 255, 255, 12, 253, 255, 159, 0, 0, 0, 0, 0, 241, 255, 255, 10, 253, 255, 159, 0, 0, 0, 0, 0, 250, 255, 255, 6, 253, 255, 159, 0, 0, 0, 0, 179, 255, 255, 255, 1, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 159, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 30, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 239, 3, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 27, 0, 0, 253, 255, 255, 255, 255, 255, 255, 223, 73, 0, 0, 0, 253, 255, 175, 80, 255, 255, 255, 10, 0, 0, 0, 0, 253, 255, 159, 0, 245, 255, 255, 159, 0, 0, 0, 0, 253, 255, 159, 0, 96, 255, 255, 255, 8, 0, 0, 0, 253, 255, 159, 0, 0, 247, 255, 255, 127, 0, 0, 0, 253, 255, 159, 0, 0, 112, 255, 255, 255, 7, 0, 0, 253, 255, 159, 0, 0, 0, 248, 255, 255, 111, 0, 0, 253, 255, 159, 0, 0, 0, 144, 255, 255, 255, 5, 0, 253, 255, 159, 0, 0, 0, 0, 250, 255, 255, 95, 0, 253, 255, 159, 0, 0, 0, 0, 160, 255, 255, 255, 4, 253, 255, 159, 0, 0, 0, 0, 0, 251, 255, 255, 63 };
/* S */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_83[] = { 24, 31, 27, 1, 30, 0, 0, 0, 64, 201, 254, 239, 156, 21, 0, 0, 0, 0, 0, 96, 254, 255, 255, 255, 255, 255, 24, 0, 0, 0, 16, 252, 255, 255, 255, 255, 255, 255, 239, 3, 0, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 47, 0, 0, 249, 255, 255, 255, 255, 255, 255, 255, 255, 223, 0, 32, 255, 255, 255, 109, 19, 65, 231, 255, 255, 255, 6, 128, 255, 255, 175, 0, 0, 0, 0, 250, 255, 255, 12, 192, 255, 255, 14, 0, 0, 0, 0, 208, 255, 255, 31, 208, 255, 255, 10, 0, 0, 0, 0, 96, 255, 255, 63, 208, 255, 255, 9, 0, 0, 0, 0, 32, 221, 221, 77, 160, 255, 255, 14, 0, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 207, 2, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 255, 223, 89, 2, 0, 0, 0, 0, 0, 0, 250, 255, 255, 255, 255, 255, 156, 21, 0, 0, 0, 0, 209, 255, 255, 255, 255, 255, 255, 255, 75, 0, 0, 0, 0, 250, 255, 255, 255, 255, 255, 255, 255, 27, 0, 0, 0, 64, 234, 255, 255, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 99, 201, 255, 255, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 32, 166, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 211, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 175, 214, 221, 221, 0, 0, 0, 0, 0, 0, 252, 255, 191, 246, 255, 255, 3, 0, 0, 0, 0, 0, 252, 255, 191, 243, 255, 255, 12, 0, 0, 0, 0, 16, 255, 255, 175, 224, 255, 255, 175, 1, 0, 0, 0, 192, 255, 255, 111, 112, 255, 255, 255, 143, 36, 32, 132, 254, 255, 255, 31, 0, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 0, 226, 255, 255, 255, 255, 255, 255, 255, 255, 207, 0, 0, 32, 252, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 112, 253, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 64, 200, 237, 239, 189, 72, 0, 0, 0 };
/* T */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_84[] = { 24, 29, 25, 0, 29, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 242, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 64, 68, 68, 68, 132, 255, 255, 95, 68, 68, 68, 52, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 31, 0, 0, 0, 0 };
/* U */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_85[] = { 26, 30, 30, 2, 29, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 6, 0, 0, 0, 0, 0, 32, 255, 255, 79, 240, 255, 255, 7, 0, 0, 0, 0, 0, 48, 255, 255, 63, 224, 255, 255, 10, 0, 0, 0, 0, 0, 96, 255, 255, 47, 192, 255, 255, 14, 0, 0, 0, 0, 0, 176, 255, 255, 15, 128, 255, 255, 143, 0, 0, 0, 0, 0, 245, 255, 255, 11, 48, 255, 255, 255, 3, 0, 0, 0, 16, 254, 255, 255, 7, 0, 252, 255, 255, 127, 0, 0, 0, 228, 255, 255, 255, 1, 0, 245, 255, 255, 255, 124, 68, 182, 255, 255, 255, 143, 0, 0, 160, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 0, 0, 252, 255, 255, 255, 255, 255, 255, 255, 239, 2, 0, 0, 0, 160, 255, 255, 255, 255, 255, 255, 255, 28, 0, 0, 0, 0, 0, 213, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 0, 0, 131, 220, 255, 206, 73, 0, 0, 0, 0 };
/* V */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_86[] = { 29, 29, 29, 0, 29, 250, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 2, 244, 255, 255, 12, 0, 0, 0, 0, 0, 0, 64, 255, 255, 223, 0, 224, 255, 255, 47, 0, 0, 0, 0, 0, 0, 144, 255, 255, 127, 0, 144, 255, 255, 127, 0, 0, 0, 0, 0, 0, 224, 255, 255, 47, 0, 48, 255, 255, 223, 0, 0, 0, 0, 0, 0, 244, 255, 255, 12, 0, 0, 254, 255, 255, 2, 0, 0, 0, 0, 0, 249, 255, 255, 6, 0, 0, 248, 255, 255, 8, 0, 0, 0, 0, 0, 254, 255, 255, 1, 0, 0, 243, 255, 255, 13, 0, 0, 0, 0, 64, 255, 255, 191, 0, 0, 0, 208, 255, 255, 47, 0, 0, 0, 0, 160, 255, 255, 111, 0, 0, 0, 112, 255, 255, 143, 0, 0, 0, 0, 240, 255, 255, 31, 0, 0, 0, 32, 255, 255, 223, 0, 0, 0, 0, 245, 255, 255, 11, 0, 0, 0, 0, 252, 255, 255, 3, 0, 0, 0, 250, 255, 255, 5, 0, 0, 0, 0, 247, 255, 255, 8, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 241, 255, 255, 13, 0, 0, 80, 255, 255, 175, 0, 0, 0, 0, 0, 192, 255, 255, 63, 0, 0, 160, 255, 255, 79, 0, 0, 0, 0, 0, 96, 255, 255, 143, 0, 0, 240, 255, 255, 14, 0, 0, 0, 0, 0, 16, 255, 255, 239, 0, 0, 245, 255, 255, 9, 0, 0, 0, 0, 0, 0, 251, 255, 255, 3, 0, 251, 255, 255, 4, 0, 0, 0, 0, 0, 0, 245, 255, 255, 9, 0, 255, 255, 239, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 14, 80, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 79, 176, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 159, 241, 255, 255, 13, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 252, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 255, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 6, 0, 0, 0, 0, 0 };
/* W */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_87[] = { 41, 29, 41, 0, 29, 250, 255, 255, 6, 0, 0, 0, 0, 176, 255, 255, 223, 0, 0, 0, 0, 0, 244, 255, 255, 13, 246, 255, 255, 10, 0, 0, 0, 0, 240, 255, 255, 255, 1, 0, 0, 0, 0, 248, 255, 255, 9, 242, 255, 255, 14, 0, 0, 0, 0, 243, 255, 255, 255, 5, 0, 0, 0, 0, 252, 255, 255, 5, 224, 255, 255, 47, 0, 0, 0, 0, 247, 255, 255, 255, 10, 0, 0, 0, 0, 255, 255, 255, 1, 160, 255, 255, 111, 0, 0, 0, 0, 251, 255, 255, 255, 14, 0, 0, 0, 64, 255, 255, 207, 0, 96, 255, 255, 175, 0, 0, 0, 0, 255, 255, 255, 255, 47, 0, 0, 0, 128, 255, 255, 143, 0, 32, 255, 255, 239, 0, 0, 0, 64, 255, 255, 255, 255, 111, 0, 0, 0, 192, 255, 255, 79, 0, 0, 254, 255, 255, 2, 0, 0, 128, 255, 255, 255, 255, 175, 0, 0, 0, 240, 255, 255, 15, 0, 0, 250, 255, 255, 6, 0, 0, 192, 255, 255, 255, 255, 239, 0, 0, 0, 244, 255, 255, 12, 0, 0, 246, 255, 255, 10, 0, 0, 240, 255, 255, 228, 255, 255, 3, 0, 0, 248, 255, 255, 8, 0, 0, 242, 255, 255, 14, 0, 0, 244, 255, 223, 160, 255, 255, 7, 0, 0, 252, 255, 255, 4, 0, 0, 224, 255, 255, 47, 0, 0, 249, 255, 159, 96, 255, 255, 11, 0, 0, 255, 255, 255, 0, 0, 0, 160, 255, 255, 111, 0, 0, 253, 255, 95, 32, 255, 255, 15, 0, 64, 255, 255, 207, 0, 0, 0, 96, 255, 255, 175, 0, 16, 255, 255, 31, 0, 254, 255, 63, 0, 128, 255, 255, 143, 0, 0, 0, 32, 255, 255, 239, 0, 80, 255, 255, 12, 0, 250, 255, 127, 0, 192, 255, 255, 79, 0, 0, 0, 0, 253, 255, 255, 2, 144, 255, 255, 8, 0, 246, 255, 207, 0, 240, 255, 255, 15, 0, 0, 0, 0, 249, 255, 255, 6, 208, 255, 255, 4, 0, 242, 255, 255, 0, 244, 255, 255, 12, 0, 0, 0, 0, 245, 255, 255, 10, 242, 255, 255, 0, 0, 224, 255, 255, 4, 248, 255, 255, 8, 0, 0, 0, 0, 241, 255, 255, 14, 246, 255, 207, 0, 0, 160, 255, 255, 8, 252, 255, 255, 4, 0, 0, 0, 0, 208, 255, 255, 47, 250, 255, 143, 0, 0, 96, 255, 255, 12, 255, 255, 255, 0, 0, 0, 0, 0, 144, 255, 255, 223, 255, 255, 79, 0, 0, 32, 255, 255, 223, 255, 255, 191, 0, 0, 0, 0, 0, 80, 255, 255, 255, 255, 255, 15, 0, 0, 0, 254, 255, 255, 255, 255, 127, 0, 0, 0, 0, 0, 16, 255, 255, 255, 255, 255, 12, 0, 0, 0, 250, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 8, 0, 0, 0, 245, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 255, 4, 0, 0, 0, 241, 255, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 245, 255, 255, 255, 255, 0, 0, 0, 0, 208, 255, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 241, 255, 255, 255, 191, 0, 0, 0, 0, 144, 255, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 127, 0, 0, 0, 0, 80, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 63, 0, 0, 0, 0, 16, 255, 255, 255, 191, 0, 0, 0, 0 };
/* X */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_88[] = { 29, 29, 28, 0, 29, 112, 255, 255, 255, 1, 0, 0, 0, 0, 0, 243, 255, 255, 95, 0, 0, 252, 255, 255, 11, 0, 0, 0, 0, 0, 253, 255, 255, 10, 0, 0, 242, 255, 255, 95, 0, 0, 0, 0, 112, 255, 255, 239, 1, 0, 0, 112, 255, 255, 239, 1, 0, 0, 0, 242, 255, 255, 95, 0, 0, 0, 0, 252, 255, 255, 11, 0, 0, 0, 252, 255, 255, 10, 0, 0, 0, 0, 242, 255, 255, 95, 0, 0, 112, 255, 255, 239, 1, 0, 0, 0, 0, 112, 255, 255, 239, 1, 0, 242, 255, 255, 79, 0, 0, 0, 0, 0, 0, 252, 255, 255, 10, 0, 252, 255, 255, 10, 0, 0, 0, 0, 0, 0, 242, 255, 255, 95, 112, 255, 255, 239, 1, 0, 0, 0, 0, 0, 0, 96, 255, 255, 239, 247, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 255, 239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 250, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 225, 255, 255, 127, 144, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 250, 255, 255, 12, 0, 253, 255, 255, 8, 0, 0, 0, 0, 0, 80, 255, 255, 255, 2, 0, 243, 255, 255, 63, 0, 0, 0, 0, 0, 225, 255, 255, 111, 0, 0, 144, 255, 255, 223, 0, 0, 0, 0, 0, 251, 255, 255, 12, 0, 0, 0, 253, 255, 255, 9, 0, 0, 0, 96, 255, 255, 255, 2, 0, 0, 0, 243, 255, 255, 79, 0, 0, 0, 241, 255, 255, 111, 0, 0, 0, 0, 128, 255, 255, 239, 0, 0, 0, 251, 255, 255, 11, 0, 0, 0, 0, 0, 253, 255, 255, 9, 0, 96, 255, 255, 255, 2, 0, 0, 0, 0, 0, 243, 255, 255, 79, 0, 242, 255, 255, 111, 0, 0, 0, 0, 0, 0, 128, 255, 255, 239, 1 };
/* Y */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_89[] = { 28, 29, 27, 0, 29, 242, 255, 255, 14, 0, 0, 0, 0, 0, 0, 224, 255, 255, 47, 144, 255, 255, 127, 0, 0, 0, 0, 0, 0, 247, 255, 255, 9, 16, 255, 255, 255, 1, 0, 0, 0, 0, 16, 255, 255, 255, 1, 0, 247, 255, 255, 9, 0, 0, 0, 0, 144, 255, 255, 127, 0, 0, 208, 255, 255, 47, 0, 0, 0, 0, 242, 255, 255, 14, 0, 0, 80, 255, 255, 191, 0, 0, 0, 0, 251, 255, 255, 5, 0, 0, 0, 252, 255, 255, 4, 0, 0, 64, 255, 255, 207, 0, 0, 0, 0, 243, 255, 255, 13, 0, 0, 192, 255, 255, 63, 0, 0, 0, 0, 160, 255, 255, 111, 0, 0, 245, 255, 255, 10, 0, 0, 0, 0, 16, 255, 255, 239, 0, 0, 254, 255, 255, 2, 0, 0, 0, 0, 0, 248, 255, 255, 8, 112, 255, 255, 143, 0, 0, 0, 0, 0, 0, 224, 255, 255, 31, 241, 255, 255, 30, 0, 0, 0, 0, 0, 0, 96, 255, 255, 207, 252, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 255, 255, 79, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 32, 255, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 255, 255, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 11, 0, 0, 0, 0, 0 };
/* Z */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_90[] = { 23, 29, 25, 1, 29, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 245, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 11, 65, 68, 68, 68, 68, 68, 68, 228, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 111, 0, 0, 0, 0, 0, 0, 0, 96, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 207, 0, 0, 0, 0, 0, 0, 0, 16, 254, 255, 255, 30, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 4, 0, 0, 0, 0, 0, 0, 0, 248, 255, 255, 127, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 226, 255, 255, 239, 1, 0, 0, 0, 0, 0, 0, 0, 252, 255, 255, 63, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 246, 255, 255, 159, 0, 0, 0, 0, 0, 0, 0, 48, 255, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 225, 255, 255, 255, 53, 51, 51, 51, 51, 51, 51, 3, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14, 248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 14 };
/* [ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_91[] = { 11, 39, 15, 3, 31, 216, 221, 221, 221, 221, 11, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 159, 0, 0, 0, 250, 255, 239, 221, 221, 11, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13, 250, 255, 255, 255, 255, 13 };
/* \ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_92[] = { 17, 40, 17, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 255, 111, 0, 0, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 0, 0, 243, 255, 255, 0, 0, 0, 0, 0, 0, 224, 255, 255, 4, 0, 0, 0, 0, 0, 160, 255, 255, 9, 0, 0, 0, 0, 0, 80, 255, 255, 14, 0, 0, 0, 0, 0, 16, 255, 255, 47, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 0, 0, 247, 255, 207, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 0, 0, 64, 255, 255, 15, 0, 0, 0, 0, 0, 0, 255, 255, 79, 0, 0, 0, 0, 0, 0, 251, 255, 143, 0, 0, 0, 0, 0, 0, 246, 255, 223, 0, 0, 0, 0, 0, 0, 241, 255, 255, 2, 0, 0, 0, 0, 0, 192, 255, 255, 7, 0, 0, 0, 0, 0, 128, 255, 255, 11, 0, 0, 0, 0, 0, 48, 255, 255, 15, 0, 0, 0, 0, 0, 0, 254, 255, 95, 0, 0, 0, 0, 0, 0, 250, 255, 159, 0, 0, 0, 0, 0, 0, 245, 255, 239, 0, 0, 0, 0, 0, 0, 240, 255, 255, 3, 0, 0, 0, 0, 0, 176, 255, 255, 8, 0, 0, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 0, 0, 32, 255, 255, 31, 0, 0, 0, 0, 0, 0, 253, 255, 111, 0, 0, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 0, 0, 160, 255, 255, 9, 0, 0, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 0, 0, 16, 255, 255, 47, 0, 0, 0, 0, 0, 0, 252, 255, 127, 0, 0, 0, 0, 0, 0, 247, 255, 207, 0, 0, 0, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 0, 0, 144, 255, 255, 10 };
/* ] */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_93[] = { 11, 39, 15, 1, 31, 215, 221, 221, 221, 221, 12, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 215, 221, 237, 255, 255, 15, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15, 248, 255, 255, 255, 255, 15 };
/* ^ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_94[] = { 16, 12, 19, 1, 29, 0, 0, 224, 255, 255, 159, 0, 0, 0, 0, 244, 255, 255, 239, 0, 0, 0, 0, 250, 255, 255, 255, 4, 0, 0, 0, 255, 255, 255, 255, 10, 0, 0, 80, 255, 255, 253, 255, 31, 0, 0, 176, 255, 239, 244, 255, 111, 0, 0, 241, 255, 143, 208, 255, 207, 0, 0, 247, 255, 47, 112, 255, 255, 2, 0, 253, 255, 12, 32, 255, 255, 8, 48, 255, 255, 6, 0, 252, 255, 14, 144, 255, 255, 1, 0, 246, 255, 63, 224, 255, 175, 0, 0, 240, 255, 159 };
/* _ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_95[] = { 19, 5, 17, 0, 0, 219, 221, 221, 221, 221, 221, 221, 221, 221, 2, 253, 255, 255, 255, 255, 255, 255, 255, 255, 3, 253, 255, 255, 255, 255, 255, 255, 255, 255, 3, 253, 255, 255, 255, 255, 255, 255, 255, 255, 3, 253, 255, 255, 255, 255, 255, 255, 255, 255, 3 };
/* ` */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_96[] = { 10, 7, 12, 1, 31, 245, 255, 255, 1, 0, 128, 255, 255, 11, 0, 0, 250, 255, 95, 0, 0, 192, 255, 239, 1, 0, 16, 254, 255, 10, 0, 0, 243, 255, 95, 0, 0, 16, 17, 17 };
/* a */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_97[] = { 20, 23, 23, 1, 22, 0, 0, 0, 147, 237, 239, 140, 3, 0, 0, 0, 0, 161, 255, 255, 255, 255, 191, 2, 0, 0, 48, 255, 255, 255, 255, 255, 255, 62, 0, 0, 225, 255, 255, 255, 255, 255, 255, 239, 1, 0, 250, 255, 255, 108, 100, 252, 255, 255, 9, 0, 255, 255, 159, 0, 0, 176, 255, 255, 15, 64, 255, 255, 15, 0, 0, 32, 255, 255, 95, 16, 34, 34, 2, 0, 0, 0, 253, 255, 127, 0, 0, 0, 0, 0, 0, 0, 251, 255, 159, 0, 0, 96, 218, 254, 255, 255, 255, 255, 159, 0, 96, 255, 255, 255, 255, 255, 255, 255, 159, 0, 249, 255, 255, 255, 255, 255, 255, 255, 159, 80, 255, 255, 255, 255, 255, 255, 255, 255, 159, 208, 255, 255, 143, 2, 0, 0, 250, 255, 159, 242, 255, 255, 5, 0, 0, 0, 252, 255, 159, 244, 255, 255, 0, 0, 0, 0, 255, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 159, 242, 255, 255, 6, 0, 0, 244, 255, 255, 159, 224, 255, 255, 159, 52, 166, 255, 255, 255, 159, 80, 255, 255, 255, 255, 255, 255, 255, 255, 159, 0, 250, 255, 255, 255, 255, 255, 251, 255, 159, 0, 112, 255, 255, 255, 255, 111, 240, 255, 159, 0, 0, 129, 236, 223, 123, 0, 0, 0, 0 };
/* b */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_98[] = { 23, 30, 26, 2, 29, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 96, 218, 239, 124, 1, 0, 0, 0, 240, 255, 255, 82, 254, 255, 255, 255, 143, 0, 0, 0, 240, 255, 255, 249, 255, 255, 255, 255, 255, 11, 0, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 207, 0, 0, 240, 255, 255, 255, 255, 239, 255, 255, 255, 255, 7, 0, 240, 255, 255, 255, 94, 1, 48, 252, 255, 255, 31, 0, 240, 255, 255, 223, 1, 0, 0, 144, 255, 255, 127, 0, 240, 255, 255, 63, 0, 0, 0, 0, 254, 255, 207, 0, 240, 255, 255, 11, 0, 0, 0, 0, 246, 255, 255, 0, 240, 255, 255, 7, 0, 0, 0, 0, 242, 255, 255, 3, 240, 255, 255, 5, 0, 0, 0, 0, 240, 255, 255, 4, 240, 255, 255, 3, 0, 0, 0, 0, 224, 255, 255, 5, 240, 255, 255, 5, 0, 0, 0, 0, 240, 255, 255, 4, 240, 255, 255, 7, 0, 0, 0, 0, 242, 255, 255, 3, 240, 255, 255, 11, 0, 0, 0, 0, 246, 255, 255, 0, 240, 255, 255, 63, 0, 0, 0, 0, 254, 255, 207, 0, 240, 255, 255, 207, 1, 0, 0, 144, 255, 255, 127, 0, 240, 255, 255, 255, 94, 1, 48, 252, 255, 255, 31, 0, 240, 255, 255, 255, 255, 239, 255, 255, 255, 255, 7, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 207, 0, 0, 240, 255, 239, 250, 255, 255, 255, 255, 255, 28, 0, 0, 240, 255, 175, 112, 255, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 113, 219, 239, 124, 1, 0, 0, 0 };
/* c */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_99[] = { 22, 23, 24, 1, 22, 0, 0, 0, 48, 200, 254, 222, 73, 0, 0, 0, 0, 0, 48, 252, 255, 255, 255, 255, 61, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 6, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 95, 0, 0, 244, 255, 255, 255, 239, 255, 255, 255, 255, 2, 0, 253, 255, 255, 94, 1, 48, 252, 255, 255, 10, 80, 255, 255, 207, 1, 0, 0, 160, 255, 255, 31, 176, 255, 255, 47, 0, 0, 0, 0, 254, 255, 111, 240, 255, 255, 8, 0, 0, 0, 0, 100, 102, 54, 242, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 243, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 3, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 8, 0, 0, 0, 0, 150, 153, 89, 176, 255, 255, 31, 0, 0, 0, 16, 255, 255, 95, 80, 255, 255, 207, 1, 0, 0, 176, 255, 255, 15, 0, 253, 255, 255, 94, 1, 48, 252, 255, 255, 10, 0, 244, 255, 255, 255, 239, 255, 255, 255, 255, 1, 0, 112, 255, 255, 255, 255, 255, 255, 255, 95, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 6, 0, 0, 0, 48, 252, 255, 255, 255, 255, 61, 0, 0, 0, 0, 0, 64, 200, 254, 222, 73, 0, 0, 0 };
/* d */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_100[] = { 23, 30, 26, 1, 29, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 113, 236, 223, 123, 0, 242, 255, 255, 1, 0, 0, 128, 255, 255, 255, 255, 94, 242, 255, 255, 1, 0, 16, 252, 255, 255, 255, 255, 255, 249, 255, 255, 1, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 248, 255, 255, 255, 239, 255, 255, 255, 255, 255, 1, 16, 255, 255, 255, 60, 0, 81, 254, 255, 255, 255, 1, 112, 255, 255, 175, 0, 0, 0, 193, 255, 255, 255, 1, 192, 255, 255, 14, 0, 0, 0, 48, 255, 255, 255, 1, 240, 255, 255, 7, 0, 0, 0, 0, 251, 255, 255, 1, 243, 255, 255, 3, 0, 0, 0, 0, 247, 255, 255, 1, 244, 255, 255, 1, 0, 0, 0, 0, 244, 255, 255, 1, 244, 255, 255, 0, 0, 0, 0, 0, 243, 255, 255, 1, 243, 255, 255, 1, 0, 0, 0, 0, 244, 255, 255, 1, 242, 255, 255, 3, 0, 0, 0, 0, 247, 255, 255, 1, 240, 255, 255, 7, 0, 0, 0, 0, 250, 255, 255, 1, 176, 255, 255, 14, 0, 0, 0, 48, 255, 255, 255, 1, 96, 255, 255, 159, 0, 0, 0, 193, 255, 255, 255, 1, 0, 254, 255, 255, 60, 0, 64, 254, 255, 255, 255, 1, 0, 246, 255, 255, 255, 239, 255, 255, 255, 255, 255, 1, 0, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 251, 255, 255, 255, 255, 255, 234, 255, 255, 1, 0, 0, 128, 255, 255, 255, 255, 127, 160, 255, 255, 1, 0, 0, 0, 113, 236, 223, 123, 1, 0, 0, 0, 0 };
/* e */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_101[] = { 23, 23, 25, 1, 22, 0, 0, 0, 48, 200, 254, 206, 56, 0, 0, 0, 0, 0, 0, 48, 252, 255, 255, 255, 255, 59, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 5, 0, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 95, 0, 0, 0, 244, 255, 255, 223, 121, 217, 255, 255, 255, 2, 0, 0, 253, 255, 255, 6, 0, 0, 246, 255, 255, 11, 0, 96, 255, 255, 95, 0, 0, 0, 96, 255, 255, 63, 0, 176, 255, 255, 10, 0, 0, 0, 0, 252, 255, 143, 0, 240, 255, 255, 4, 0, 0, 0, 0, 246, 255, 223, 0, 242, 255, 255, 137, 136, 136, 136, 136, 250, 255, 255, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 243, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 224, 255, 255, 5, 0, 0, 0, 0, 0, 0, 0, 0, 160, 255, 255, 11, 0, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 127, 0, 0, 0, 64, 255, 255, 79, 0, 0, 253, 255, 255, 8, 0, 0, 245, 255, 255, 13, 0, 0, 243, 255, 255, 223, 121, 200, 255, 255, 255, 4, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 0, 0, 246, 255, 255, 255, 255, 255, 255, 8, 0, 0, 0, 0, 48, 252, 255, 255, 255, 255, 77, 0, 0, 0, 0, 0, 0, 48, 200, 254, 222, 73, 0, 0, 0, 0 };
/* f */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_102[] = { 14, 30, 16, 1, 30, 0, 0, 0, 199, 254, 255, 127, 0, 0, 193, 255, 255, 255, 127, 0, 0, 249, 255, 255, 255, 127, 0, 16, 255, 255, 255, 255, 127, 0, 48, 255, 255, 255, 154, 73, 0, 96, 255, 255, 47, 0, 0, 0, 96, 255, 255, 14, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0, 0, 96, 255, 255, 13, 0, 0 };
/* g */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_103[] = { 22, 31, 25, 1, 22, 0, 0, 0, 131, 236, 223, 90, 0, 0, 0, 0, 0, 0, 161, 255, 255, 255, 255, 61, 240, 255, 175, 0, 48, 254, 255, 255, 255, 255, 255, 245, 255, 175, 0, 225, 255, 255, 255, 255, 255, 255, 255, 255, 175, 0, 252, 255, 255, 255, 188, 254, 255, 255, 255, 175, 64, 255, 255, 255, 7, 0, 48, 254, 255, 255, 175, 176, 255, 255, 79, 0, 0, 0, 224, 255, 255, 175, 240, 255, 255, 10, 0, 0, 0, 64, 255, 255, 175, 242, 255, 255, 3, 0, 0, 0, 0, 254, 255, 175, 244, 255, 255, 1, 0, 0, 0, 0, 251, 255, 175, 244, 255, 255, 0, 0, 0, 0, 0, 250, 255, 175, 243, 255, 255, 2, 0, 0, 0, 0, 252, 255, 175, 241, 255, 255, 5, 0, 0, 0, 0, 255, 255, 175, 208, 255, 255, 13, 0, 0, 0, 128, 255, 255, 175, 144, 255, 255, 159, 0, 0, 0, 244, 255, 255, 175, 16, 255, 255, 255, 93, 18, 148, 255, 255, 255, 175, 0, 248, 255, 255, 255, 255, 255, 255, 255, 255, 175, 0, 176, 255, 255, 255, 255, 255, 255, 255, 255, 175, 0, 0, 250, 255, 255, 255, 255, 223, 251, 255, 175, 0, 0, 80, 253, 255, 255, 255, 25, 249, 255, 175, 0, 0, 0, 32, 135, 121, 21, 0, 249, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 175, 0, 0, 0, 0, 0, 0, 0, 0, 252, 255, 159, 144, 238, 238, 13, 0, 0, 0, 16, 255, 255, 127, 96, 255, 255, 111, 0, 0, 0, 160, 255, 255, 47, 16, 255, 255, 255, 7, 0, 16, 250, 255, 255, 13, 0, 248, 255, 255, 239, 172, 252, 255, 255, 255, 5, 0, 208, 255, 255, 255, 255, 255, 255, 255, 175, 0, 0, 16, 253, 255, 255, 255, 255, 255, 255, 10, 0, 0, 0, 128, 255, 255, 255, 255, 255, 110, 0, 0, 0, 0, 0, 97, 219, 254, 222, 89, 0, 0, 0 };
/* h */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_104[] = { 21, 29, 25, 2, 29, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 129, 235, 239, 91, 0, 0, 0, 240, 255, 255, 115, 255, 255, 255, 255, 61, 0, 0, 240, 255, 255, 252, 255, 255, 255, 255, 255, 4, 0, 240, 255, 255, 255, 255, 255, 255, 255, 255, 30, 0, 240, 255, 255, 255, 255, 254, 255, 255, 255, 175, 0, 240, 255, 255, 255, 23, 0, 178, 255, 255, 255, 1, 240, 255, 255, 79, 0, 0, 0, 250, 255, 255, 5, 240, 255, 255, 10, 0, 0, 0, 241, 255, 255, 8, 240, 255, 255, 5, 0, 0, 0, 192, 255, 255, 9, 240, 255, 255, 3, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10, 240, 255, 255, 2, 0, 0, 0, 144, 255, 255, 10 };
/* i */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_105[] = { 7, 30, 11, 2, 30, 247, 255, 255, 2, 247, 255, 255, 2, 247, 255, 255, 2, 247, 255, 255, 2, 247, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0, 244, 255, 255, 0 };
/* j */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_106[] = { 12, 38, 14, 0, 30, 0, 0, 112, 255, 255, 47, 0, 0, 112, 255, 255, 47, 0, 0, 112, 255, 255, 47, 0, 0, 112, 255, 255, 47, 0, 0, 112, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 64, 255, 255, 15, 0, 0, 128, 255, 255, 15, 209, 221, 254, 255, 255, 13, 241, 255, 255, 255, 255, 10, 241, 255, 255, 255, 255, 3, 241, 255, 255, 255, 127, 0, 241, 255, 255, 173, 3, 0 };
/* k */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_107[] = { 21, 29, 22, 2, 29, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 0, 0, 0, 0, 0, 240, 255, 255, 2, 0, 0, 64, 255, 255, 207, 0, 240, 255, 255, 2, 0, 0, 226, 255, 255, 29, 0, 240, 255, 255, 2, 0, 16, 253, 255, 255, 2, 0, 240, 255, 255, 2, 0, 192, 255, 255, 79, 0, 0, 240, 255, 255, 2, 0, 249, 255, 255, 6, 0, 0, 240, 255, 255, 2, 112, 255, 255, 143, 0, 0, 0, 240, 255, 255, 2, 245, 255, 255, 10, 0, 0, 0, 240, 255, 255, 50, 255, 255, 207, 0, 0, 0, 0, 240, 255, 255, 228, 255, 255, 30, 0, 0, 0, 0, 240, 255, 255, 254, 255, 255, 2, 0, 0, 0, 0, 240, 255, 255, 255, 255, 175, 0, 0, 0, 0, 0, 240, 255, 255, 250, 255, 255, 7, 0, 0, 0, 0, 240, 255, 255, 163, 255, 255, 95, 0, 0, 0, 0, 240, 255, 255, 2, 252, 255, 255, 3, 0, 0, 0, 240, 255, 255, 2, 209, 255, 255, 46, 0, 0, 0, 240, 255, 255, 2, 32, 254, 255, 223, 1, 0, 0, 240, 255, 255, 2, 0, 244, 255, 255, 12, 0, 0, 240, 255, 255, 2, 0, 96, 255, 255, 175, 0, 0, 240, 255, 255, 2, 0, 0, 248, 255, 255, 8, 0, 240, 255, 255, 2, 0, 0, 176, 255, 255, 111, 0, 240, 255, 255, 2, 0, 0, 0, 252, 255, 255, 4 };
/* l */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_108[] = { 7, 29, 11, 2, 29, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2, 240, 255, 255, 2 };
/* m */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_109[] = { 32, 22, 36, 2, 22, 0, 0, 0, 0, 181, 253, 156, 3, 0, 0, 166, 253, 190, 6, 0, 0, 244, 255, 175, 176, 255, 255, 255, 175, 0, 212, 255, 255, 255, 223, 3, 0, 244, 255, 255, 252, 255, 255, 255, 255, 91, 255, 255, 255, 255, 255, 63, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 223, 0, 244, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 254, 255, 255, 255, 7, 244, 255, 255, 207, 3, 48, 253, 255, 255, 255, 26, 0, 229, 255, 255, 15, 244, 255, 255, 13, 0, 0, 242, 255, 255, 175, 0, 0, 80, 255, 255, 95, 244, 255, 255, 4, 0, 0, 176, 255, 255, 31, 0, 0, 0, 254, 255, 127, 244, 255, 255, 1, 0, 0, 128, 255, 255, 14, 0, 0, 0, 251, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159, 244, 255, 255, 0, 0, 0, 112, 255, 255, 12, 0, 0, 0, 250, 255, 159 };
/* n */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_110[] = { 21, 22, 25, 2, 22, 0, 0, 0, 0, 146, 236, 223, 73, 0, 0, 0, 244, 255, 175, 144, 255, 255, 255, 255, 28, 0, 0, 244, 255, 255, 252, 255, 255, 255, 255, 239, 2, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 13, 0, 244, 255, 255, 255, 255, 254, 255, 255, 255, 111, 0, 244, 255, 255, 239, 5, 0, 212, 255, 255, 223, 0, 244, 255, 255, 30, 0, 0, 0, 253, 255, 255, 2, 244, 255, 255, 6, 0, 0, 0, 243, 255, 255, 5, 244, 255, 255, 2, 0, 0, 0, 240, 255, 255, 6, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7 };
/* o */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_111[] = { 23, 23, 25, 1, 22, 0, 0, 0, 48, 200, 254, 222, 73, 0, 0, 0, 0, 0, 0, 48, 252, 255, 255, 255, 255, 93, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 9, 0, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 175, 0, 0, 0, 244, 255, 255, 255, 239, 255, 255, 255, 255, 7, 0, 0, 253, 255, 255, 94, 1, 64, 252, 255, 255, 31, 0, 80, 255, 255, 207, 1, 0, 0, 160, 255, 255, 143, 0, 176, 255, 255, 47, 0, 0, 0, 0, 254, 255, 239, 0, 240, 255, 255, 8, 0, 0, 0, 0, 245, 255, 255, 2, 242, 255, 255, 3, 0, 0, 0, 0, 241, 255, 255, 5, 243, 255, 255, 1, 0, 0, 0, 0, 224, 255, 255, 6, 244, 255, 255, 0, 0, 0, 0, 0, 192, 255, 255, 7, 243, 255, 255, 1, 0, 0, 0, 0, 224, 255, 255, 6, 242, 255, 255, 3, 0, 0, 0, 0, 240, 255, 255, 5, 240, 255, 255, 8, 0, 0, 0, 0, 245, 255, 255, 2, 176, 255, 255, 31, 0, 0, 0, 0, 253, 255, 239, 0, 80, 255, 255, 207, 1, 0, 0, 144, 255, 255, 143, 0, 0, 253, 255, 255, 94, 1, 48, 252, 255, 255, 31, 0, 0, 244, 255, 255, 255, 239, 255, 255, 255, 255, 7, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 175, 0, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 9, 0, 0, 0, 0, 48, 252, 255, 255, 255, 255, 93, 0, 0, 0, 0, 0, 0, 64, 200, 254, 222, 73, 0, 0, 0, 0 };
/* p */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_112[] = { 23, 30, 26, 2, 22, 0, 0, 0, 0, 129, 219, 223, 107, 0, 0, 0, 0, 244, 255, 175, 112, 255, 255, 255, 255, 110, 0, 0, 0, 244, 255, 239, 249, 255, 255, 255, 255, 255, 9, 0, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 244, 255, 255, 255, 255, 239, 255, 255, 255, 255, 4, 0, 244, 255, 255, 255, 77, 0, 65, 254, 255, 255, 12, 0, 244, 255, 255, 191, 0, 0, 0, 193, 255, 255, 79, 0, 244, 255, 255, 31, 0, 0, 0, 32, 255, 255, 143, 0, 244, 255, 255, 8, 0, 0, 0, 0, 250, 255, 223, 0, 244, 255, 255, 4, 0, 0, 0, 0, 246, 255, 255, 0, 244, 255, 255, 2, 0, 0, 0, 0, 244, 255, 255, 0, 244, 255, 255, 0, 0, 0, 0, 0, 242, 255, 255, 1, 244, 255, 255, 1, 0, 0, 0, 0, 244, 255, 255, 0, 244, 255, 255, 3, 0, 0, 0, 0, 246, 255, 255, 0, 244, 255, 255, 6, 0, 0, 0, 0, 249, 255, 223, 0, 244, 255, 255, 14, 0, 0, 0, 32, 255, 255, 159, 0, 244, 255, 255, 159, 0, 0, 0, 176, 255, 255, 79, 0, 244, 255, 255, 255, 60, 0, 64, 253, 255, 255, 12, 0, 244, 255, 255, 255, 255, 239, 255, 255, 255, 255, 4, 0, 244, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 0, 244, 255, 255, 252, 255, 255, 255, 255, 255, 9, 0, 0, 244, 255, 255, 160, 255, 255, 255, 255, 110, 0, 0, 0, 244, 255, 255, 0, 146, 236, 239, 107, 1, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/* q */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_113[] = { 23, 30, 26, 1, 22, 0, 0, 0, 113, 236, 223, 106, 0, 0, 0, 0, 0, 0, 0, 128, 255, 255, 255, 255, 78, 208, 255, 255, 1, 0, 0, 251, 255, 255, 255, 255, 255, 243, 255, 255, 1, 0, 176, 255, 255, 255, 255, 255, 255, 254, 255, 255, 1, 0, 247, 255, 255, 255, 239, 255, 255, 255, 255, 255, 1, 0, 255, 255, 255, 60, 0, 81, 254, 255, 255, 255, 1, 112, 255, 255, 175, 0, 0, 0, 193, 255, 255, 255, 1, 192, 255, 255, 14, 0, 0, 0, 48, 255, 255, 255, 1, 240, 255, 255, 7, 0, 0, 0, 0, 251, 255, 255, 1, 242, 255, 255, 3, 0, 0, 0, 0, 247, 255, 255, 1, 243, 255, 255, 1, 0, 0, 0, 0, 244, 255, 255, 1, 244, 255, 255, 0, 0, 0, 0, 0, 243, 255, 255, 1, 243, 255, 255, 1, 0, 0, 0, 0, 244, 255, 255, 1, 242, 255, 255, 3, 0, 0, 0, 0, 247, 255, 255, 1, 240, 255, 255, 7, 0, 0, 0, 0, 250, 255, 255, 1, 192, 255, 255, 14, 0, 0, 0, 48, 255, 255, 255, 1, 112, 255, 255, 159, 0, 0, 0, 193, 255, 255, 255, 1, 0, 255, 255, 255, 60, 0, 64, 254, 255, 255, 255, 1, 0, 247, 255, 255, 255, 239, 255, 255, 255, 255, 255, 1, 0, 176, 255, 255, 255, 255, 255, 255, 255, 255, 255, 1, 0, 0, 251, 255, 255, 255, 255, 255, 252, 255, 255, 1, 0, 0, 128, 255, 255, 255, 255, 143, 242, 255, 255, 1, 0, 0, 0, 113, 236, 223, 139, 1, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 255, 255, 1 };
/* r */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_114[] = { 14, 21, 16, 2, 21, 244, 255, 63, 112, 252, 255, 191, 244, 255, 143, 252, 255, 255, 191, 244, 255, 255, 255, 255, 255, 191, 244, 255, 255, 255, 255, 255, 191, 244, 255, 255, 255, 255, 255, 191, 244, 255, 255, 175, 19, 0, 0, 244, 255, 255, 10, 0, 0, 0, 244, 255, 255, 2, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0, 244, 255, 255, 0, 0, 0, 0 };
/* s */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_115[] = { 19, 23, 21, 1, 22, 0, 0, 113, 219, 255, 206, 40, 0, 0, 0, 0, 144, 255, 255, 255, 255, 255, 26, 0, 0, 16, 253, 255, 255, 255, 255, 255, 239, 2, 0, 176, 255, 255, 255, 255, 255, 255, 255, 29, 0, 244, 255, 255, 143, 69, 198, 255, 255, 159, 0, 249, 255, 239, 2, 0, 0, 247, 255, 255, 0, 251, 255, 159, 0, 0, 0, 224, 255, 255, 3, 250, 255, 191, 0, 0, 0, 0, 17, 17, 0, 247, 255, 255, 75, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 239, 155, 21, 0, 0, 0, 112, 255, 255, 255, 255, 255, 255, 76, 0, 0, 0, 247, 255, 255, 255, 255, 255, 255, 10, 0, 0, 16, 216, 255, 255, 255, 255, 255, 143, 0, 0, 0, 0, 81, 168, 253, 255, 255, 255, 2, 0, 0, 0, 0, 0, 16, 248, 255, 255, 6, 0, 0, 0, 0, 0, 0, 176, 255, 255, 9, 251, 255, 127, 0, 0, 0, 144, 255, 255, 11, 247, 255, 239, 2, 0, 0, 208, 255, 255, 9, 241, 255, 255, 159, 53, 116, 253, 255, 255, 5, 112, 255, 255, 255, 255, 255, 255, 255, 223, 0, 0, 250, 255, 255, 255, 255, 255, 255, 46, 0, 0, 96, 254, 255, 255, 255, 255, 175, 1, 0, 0, 0, 81, 218, 254, 223, 123, 2, 0, 0 };
/* t */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_116[] = { 14, 28, 16, 1, 28, 0, 0, 17, 17, 0, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 255, 255, 255, 255, 255, 255, 127, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 10, 0, 0, 0, 144, 255, 255, 13, 0, 0, 0, 128, 255, 255, 207, 153, 73, 0, 80, 255, 255, 255, 255, 127, 0, 16, 254, 255, 255, 255, 127, 0, 0, 244, 255, 255, 255, 127, 0, 0, 16, 201, 255, 255, 127 };
/* u */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_117[] = { 21, 22, 25, 2, 21, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 192, 255, 255, 7, 244, 255, 255, 0, 0, 0, 0, 208, 255, 255, 7, 243, 255, 255, 2, 0, 0, 0, 240, 255, 255, 7, 242, 255, 255, 6, 0, 0, 0, 244, 255, 255, 7, 240, 255, 255, 30, 0, 0, 0, 253, 255, 255, 7, 160, 255, 255, 239, 5, 0, 211, 255, 255, 255, 7, 48, 255, 255, 255, 255, 253, 255, 255, 255, 255, 7, 0, 250, 255, 255, 255, 255, 255, 255, 255, 255, 7, 0, 208, 255, 255, 255, 255, 255, 222, 255, 255, 7, 0, 0, 250, 255, 255, 255, 191, 113, 255, 255, 7, 0, 0, 48, 217, 255, 172, 3, 0, 0, 0, 0 };
/* v */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_118[] = { 22, 21, 22, 0, 21, 253, 255, 159, 0, 0, 0, 0, 0, 252, 255, 175, 247, 255, 255, 0, 0, 0, 0, 32, 255, 255, 95, 242, 255, 255, 5, 0, 0, 0, 112, 255, 255, 15, 192, 255, 255, 10, 0, 0, 0, 208, 255, 255, 9, 96, 255, 255, 15, 0, 0, 0, 243, 255, 255, 4, 16, 255, 255, 95, 0, 0, 0, 248, 255, 239, 0, 0, 251, 255, 191, 0, 0, 0, 254, 255, 143, 0, 0, 246, 255, 255, 1, 0, 48, 255, 255, 63, 0, 0, 240, 255, 255, 6, 0, 144, 255, 255, 13, 0, 0, 160, 255, 255, 12, 0, 224, 255, 255, 8, 0, 0, 80, 255, 255, 31, 0, 244, 255, 255, 2, 0, 0, 0, 255, 255, 127, 0, 250, 255, 207, 0, 0, 0, 0, 250, 255, 207, 0, 255, 255, 127, 0, 0, 0, 0, 244, 255, 255, 82, 255, 255, 31, 0, 0, 0, 0, 224, 255, 255, 203, 255, 255, 12, 0, 0, 0, 0, 144, 255, 255, 255, 255, 255, 6, 0, 0, 0, 0, 48, 255, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 254, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 248, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 10, 0, 0, 0 };
/* w */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_119[] = { 33, 21, 33, 0, 21, 250, 255, 207, 0, 0, 0, 112, 255, 255, 175, 0, 0, 0, 160, 255, 255, 13, 246, 255, 255, 0, 0, 0, 192, 255, 255, 239, 0, 0, 0, 224, 255, 255, 9, 242, 255, 255, 4, 0, 0, 240, 255, 255, 255, 2, 0, 0, 242, 255, 255, 5, 224, 255, 255, 9, 0, 0, 244, 255, 255, 255, 7, 0, 0, 246, 255, 255, 1, 160, 255, 255, 13, 0, 0, 248, 255, 255, 255, 11, 0, 0, 250, 255, 207, 0, 80, 255, 255, 31, 0, 0, 252, 255, 255, 255, 15, 0, 0, 254, 255, 143, 0, 16, 255, 255, 95, 0, 16, 255, 255, 255, 255, 63, 0, 48, 255, 255, 79, 0, 0, 253, 255, 159, 0, 80, 255, 255, 249, 255, 127, 0, 112, 255, 255, 15, 0, 0, 249, 255, 239, 0, 144, 255, 239, 192, 255, 191, 0, 176, 255, 255, 12, 0, 0, 245, 255, 255, 2, 208, 255, 175, 112, 255, 255, 0, 240, 255, 255, 7, 0, 0, 241, 255, 255, 6, 241, 255, 111, 48, 255, 255, 4, 243, 255, 255, 3, 0, 0, 192, 255, 255, 10, 245, 255, 31, 0, 255, 255, 8, 248, 255, 255, 0, 0, 0, 128, 255, 255, 14, 249, 255, 13, 0, 250, 255, 12, 252, 255, 191, 0, 0, 0, 64, 255, 255, 127, 254, 255, 9, 0, 246, 255, 95, 255, 255, 127, 0, 0, 0, 0, 255, 255, 255, 255, 255, 5, 0, 242, 255, 255, 255, 255, 63, 0, 0, 0, 0, 252, 255, 255, 255, 255, 1, 0, 224, 255, 255, 255, 255, 14, 0, 0, 0, 0, 248, 255, 255, 255, 207, 0, 0, 144, 255, 255, 255, 255, 10, 0, 0, 0, 0, 244, 255, 255, 255, 143, 0, 0, 80, 255, 255, 255, 255, 6, 0, 0, 0, 0, 240, 255, 255, 255, 79, 0, 0, 16, 255, 255, 255, 255, 2, 0, 0, 0, 0, 176, 255, 255, 255, 15, 0, 0, 0, 253, 255, 255, 239, 0, 0, 0, 0, 0, 112, 255, 255, 255, 11, 0, 0, 0, 248, 255, 255, 175, 0, 0, 0 };
/* x */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_120[] = { 23, 21, 22, 0, 21, 160, 255, 255, 63, 0, 0, 0, 0, 252, 255, 255, 2, 16, 254, 255, 223, 0, 0, 0, 112, 255, 255, 111, 0, 0, 244, 255, 255, 9, 0, 0, 243, 255, 255, 11, 0, 0, 160, 255, 255, 79, 0, 0, 253, 255, 255, 1, 0, 0, 16, 254, 255, 239, 0, 128, 255, 255, 95, 0, 0, 0, 0, 244, 255, 255, 10, 243, 255, 255, 11, 0, 0, 0, 0, 144, 255, 255, 159, 253, 255, 239, 1, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 95, 0, 0, 0, 0, 0, 0, 244, 255, 255, 255, 255, 10, 0, 0, 0, 0, 0, 0, 144, 255, 255, 255, 239, 1, 0, 0, 0, 0, 0, 0, 64, 255, 255, 255, 191, 0, 0, 0, 0, 0, 0, 0, 208, 255, 255, 255, 255, 5, 0, 0, 0, 0, 0, 0, 249, 255, 255, 255, 255, 30, 0, 0, 0, 0, 0, 64, 255, 255, 255, 255, 255, 175, 0, 0, 0, 0, 0, 208, 255, 255, 14, 248, 255, 255, 5, 0, 0, 0, 0, 249, 255, 255, 4, 208, 255, 255, 30, 0, 0, 0, 48, 255, 255, 175, 0, 48, 255, 255, 175, 0, 0, 0, 208, 255, 255, 30, 0, 0, 249, 255, 255, 4, 0, 0, 248, 255, 255, 4, 0, 0, 208, 255, 255, 30, 0, 48, 255, 255, 175, 0, 0, 0, 48, 255, 255, 175, 0, 208, 255, 255, 30, 0, 0, 0, 0, 249, 255, 255, 4 };
/* y */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_121[] = { 23, 29, 22, 0, 21, 252, 255, 175, 0, 0, 0, 0, 0, 246, 255, 255, 1, 246, 255, 255, 1, 0, 0, 0, 0, 251, 255, 191, 0, 240, 255, 255, 6, 0, 0, 0, 16, 255, 255, 95, 0, 160, 255, 255, 13, 0, 0, 0, 112, 255, 255, 15, 0, 48, 255, 255, 63, 0, 0, 0, 208, 255, 255, 9, 0, 0, 253, 255, 159, 0, 0, 0, 242, 255, 255, 3, 0, 0, 247, 255, 255, 0, 0, 0, 248, 255, 239, 0, 0, 0, 241, 255, 255, 6, 0, 0, 254, 255, 143, 0, 0, 0, 160, 255, 255, 12, 0, 64, 255, 255, 47, 0, 0, 0, 64, 255, 255, 47, 0, 144, 255, 255, 12, 0, 0, 0, 0, 253, 255, 143, 0, 240, 255, 255, 6, 0, 0, 0, 0, 247, 255, 239, 0, 245, 255, 255, 1, 0, 0, 0, 0, 241, 255, 255, 5, 251, 255, 191, 0, 0, 0, 0, 0, 176, 255, 255, 27, 255, 255, 95, 0, 0, 0, 0, 0, 64, 255, 255, 255, 255, 255, 15, 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 9, 0, 0, 0, 0, 0, 0, 248, 255, 255, 255, 255, 3, 0, 0, 0, 0, 0, 0, 242, 255, 255, 255, 223, 0, 0, 0, 0, 0, 0, 0, 176, 255, 255, 255, 143, 0, 0, 0, 0, 0, 0, 0, 80, 255, 255, 255, 47, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 12, 0, 0, 0, 0, 0, 0, 0, 0, 249, 255, 255, 6, 0, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 16, 253, 255, 191, 0, 0, 0, 0, 0, 0, 214, 221, 253, 255, 255, 95, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 14, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 255, 6, 0, 0, 0, 0, 0, 0, 247, 255, 255, 255, 175, 0, 0, 0, 0, 0, 0, 0, 247, 255, 255, 189, 4, 0, 0, 0, 0, 0, 0 };
/* z */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_122[] = { 18, 21, 20, 1, 21, 248, 255, 255, 255, 255, 255, 255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 127, 248, 255, 255, 255, 255, 255, 255, 255, 127, 215, 221, 221, 221, 221, 254, 255, 255, 111, 0, 0, 0, 0, 0, 252, 255, 255, 10, 0, 0, 0, 0, 176, 255, 255, 191, 0, 0, 0, 0, 0, 250, 255, 255, 12, 0, 0, 0, 0, 144, 255, 255, 223, 1, 0, 0, 0, 0, 247, 255, 255, 46, 0, 0, 0, 0, 96, 255, 255, 255, 2, 0, 0, 0, 0, 245, 255, 255, 63, 0, 0, 0, 0, 48, 255, 255, 255, 5, 0, 0, 0, 0, 242, 255, 255, 111, 0, 0, 0, 0, 32, 254, 255, 255, 7, 0, 0, 0, 0, 209, 255, 255, 159, 0, 0, 0, 0, 0, 250, 255, 255, 223, 221, 221, 221, 221, 157, 251, 255, 255, 255, 255, 255, 255, 255, 175, 251, 255, 255, 255, 255, 255, 255, 255, 175, 251, 255, 255, 255, 255, 255, 255, 255, 175, 251, 255, 255, 255, 255, 255, 255, 255, 175 };
/* { */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_123[] = { 13, 39, 16, 2, 31, 0, 0, 0, 132, 219, 221, 3, 0, 0, 177, 255, 255, 255, 4, 0, 0, 252, 255, 255, 255, 4, 0, 96, 255, 255, 255, 255, 4, 0, 160, 255, 255, 255, 255, 4, 0, 208, 255, 255, 44, 0, 0, 0, 240, 255, 255, 5, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 242, 255, 255, 3, 0, 0, 48, 252, 255, 255, 1, 0, 0, 254, 255, 255, 143, 0, 0, 0, 254, 255, 255, 8, 0, 0, 0, 254, 255, 9, 0, 0, 0, 0, 254, 255, 191, 3, 0, 0, 0, 254, 255, 255, 79, 0, 0, 0, 183, 255, 255, 239, 0, 0, 0, 0, 246, 255, 255, 3, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 4, 0, 0, 0, 240, 255, 255, 5, 0, 0, 0, 224, 255, 255, 11, 0, 0, 0, 176, 255, 255, 255, 221, 3, 0, 112, 255, 255, 255, 255, 4, 0, 0, 253, 255, 255, 255, 4, 0, 0, 211, 255, 255, 255, 4, 0, 0, 0, 183, 253, 255, 4 };
/* | */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_124[] = { 6, 40, 15, 5, 32, 0, 0, 0, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79, 255, 255, 79 };
/* } */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_125[] = { 13, 39, 16, 1, 31, 215, 205, 122, 2, 0, 0, 0, 248, 255, 255, 143, 0, 0, 0, 248, 255, 255, 255, 7, 0, 0, 248, 255, 255, 255, 47, 0, 0, 248, 255, 255, 255, 111, 0, 0, 0, 64, 255, 255, 159, 0, 0, 0, 0, 250, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 247, 255, 239, 0, 0, 0, 0, 245, 255, 255, 41, 0, 0, 0, 192, 255, 255, 255, 10, 0, 0, 0, 251, 255, 255, 10, 0, 0, 0, 32, 253, 255, 10, 0, 0, 0, 163, 255, 255, 10, 0, 0, 96, 255, 255, 255, 10, 0, 0, 242, 255, 255, 159, 5, 0, 0, 247, 255, 255, 2, 0, 0, 0, 248, 255, 207, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 248, 255, 191, 0, 0, 0, 0, 249, 255, 191, 0, 0, 0, 16, 254, 255, 159, 0, 0, 215, 253, 255, 255, 127, 0, 0, 248, 255, 255, 255, 63, 0, 0, 248, 255, 255, 255, 9, 0, 0, 248, 255, 255, 191, 1, 0, 0, 248, 255, 173, 5, 0, 0, 0 };
/* ~ */ static const uint8_t Font_TTSatoshi_DemiBold_42_glyph_126[] = { 23, 9, 25, 1, 16, 0, 0, 182, 254, 157, 1, 0, 0, 80, 102, 102, 0, 0, 193, 255, 255, 255, 78, 0, 0, 240, 255, 255, 0, 0, 251, 255, 255, 255, 255, 7, 0, 244, 255, 255, 0, 80, 255, 255, 255, 255, 255, 175, 84, 254, 255, 207, 0, 192, 255, 255, 255, 255, 255, 255, 255, 255, 255, 143, 0, 240, 255, 255, 92, 214, 255, 255, 255, 255, 255, 47, 0, 243, 255, 255, 1, 0, 251, 255, 255, 255, 255, 8, 0, 244, 255, 207, 0, 0, 112, 255, 255, 255, 159, 0, 0, 98, 102, 70, 0, 0, 0, 163, 254, 174, 4, 0, 0 };
/* ? */ const uint8_t Font_TTSatoshi_DemiBold_42_glyph_nonprintable[] = { 20, 30, 22, 1, 30, 255, 255, 223, 55, 1, 32, 132, 253, 255, 255, 255, 223, 4, 0, 0, 0, 0, 80, 254, 255, 255, 11, 0, 0, 0, 0, 0, 0, 193, 255, 207, 0, 0, 0, 0, 0, 0, 0, 16, 253, 63, 0, 0, 0, 0, 0, 0, 0, 0, 244, 11, 0, 0, 80, 235, 157, 1, 0, 0, 192, 6, 0, 0, 247, 255, 255, 63, 0, 0, 112, 2, 0, 0, 255, 255, 255, 207, 0, 0, 80, 35, 34, 82, 255, 255, 255, 255, 0, 0, 48, 255, 255, 255, 255, 255, 255, 255, 0, 0, 80, 255, 255, 255, 255, 255, 255, 175, 0, 0, 112, 255, 255, 255, 255, 255, 255, 10, 0, 0, 192, 255, 255, 255, 255, 255, 77, 0, 0, 0, 243, 255, 255, 255, 255, 143, 0, 0, 0, 16, 253, 255, 255, 255, 255, 9, 0, 0, 0, 211, 255, 255, 255, 255, 223, 0, 0, 0, 161, 255, 255, 255, 255, 255, 127, 0, 0, 48, 254, 255, 255, 255, 255, 255, 47, 0, 0, 241, 255, 255, 255, 255, 255, 255, 31, 0, 0, 248, 255, 255, 255, 255, 255, 255, 15, 0, 0, 251, 255, 255, 255, 255, 255, 255, 15, 0, 0, 252, 255, 255, 255, 255, 255, 255, 175, 170, 170, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 34, 34, 249, 255, 255, 255, 255, 255, 255, 12, 0, 0, 249, 255, 255, 255, 255, 255, 255, 12, 0, 0, 249, 255, 255, 255, 255, 255, 255, 12, 0, 0, 249, 255, 255, 255, 255, 255, 255, 12, 0, 0, 249, 255, 255, 255, 255, 255, 255, 12, 0, 0, 249, 255, 255, 255 };
const uint8_t * const Font_TTSatoshi_DemiBold_42[126 + 1 - 32] = {
Font_TTSatoshi_DemiBold_42_glyph_32,
Font_TTSatoshi_DemiBold_42_glyph_33,
Font_TTSatoshi_DemiBold_42_glyph_34,
Font_TTSatoshi_DemiBold_42_glyph_35,
Font_TTSatoshi_DemiBold_42_glyph_36,
Font_TTSatoshi_DemiBold_42_glyph_37,
Font_TTSatoshi_DemiBold_42_glyph_38,
Font_TTSatoshi_DemiBold_42_glyph_39,
Font_TTSatoshi_DemiBold_42_glyph_40,
Font_TTSatoshi_DemiBold_42_glyph_41,
Font_TTSatoshi_DemiBold_42_glyph_42,
Font_TTSatoshi_DemiBold_42_glyph_43,
Font_TTSatoshi_DemiBold_42_glyph_44,
Font_TTSatoshi_DemiBold_42_glyph_45,
Font_TTSatoshi_DemiBold_42_glyph_46,
Font_TTSatoshi_DemiBold_42_glyph_47,
Font_TTSatoshi_DemiBold_42_glyph_48,
Font_TTSatoshi_DemiBold_42_glyph_49,
Font_TTSatoshi_DemiBold_42_glyph_50,
Font_TTSatoshi_DemiBold_42_glyph_51,
Font_TTSatoshi_DemiBold_42_glyph_52,
Font_TTSatoshi_DemiBold_42_glyph_53,
Font_TTSatoshi_DemiBold_42_glyph_54,
Font_TTSatoshi_DemiBold_42_glyph_55,
Font_TTSatoshi_DemiBold_42_glyph_56,
Font_TTSatoshi_DemiBold_42_glyph_57,
Font_TTSatoshi_DemiBold_42_glyph_58,
Font_TTSatoshi_DemiBold_42_glyph_59,
Font_TTSatoshi_DemiBold_42_glyph_60,
Font_TTSatoshi_DemiBold_42_glyph_61,
Font_TTSatoshi_DemiBold_42_glyph_62,
Font_TTSatoshi_DemiBold_42_glyph_63,
Font_TTSatoshi_DemiBold_42_glyph_64,
Font_TTSatoshi_DemiBold_42_glyph_65,
Font_TTSatoshi_DemiBold_42_glyph_66,
Font_TTSatoshi_DemiBold_42_glyph_67,
Font_TTSatoshi_DemiBold_42_glyph_68,
Font_TTSatoshi_DemiBold_42_glyph_69,
Font_TTSatoshi_DemiBold_42_glyph_70,
Font_TTSatoshi_DemiBold_42_glyph_71,
Font_TTSatoshi_DemiBold_42_glyph_72,
Font_TTSatoshi_DemiBold_42_glyph_73,
Font_TTSatoshi_DemiBold_42_glyph_74,
Font_TTSatoshi_DemiBold_42_glyph_75,
Font_TTSatoshi_DemiBold_42_glyph_76,
Font_TTSatoshi_DemiBold_42_glyph_77,
Font_TTSatoshi_DemiBold_42_glyph_78,
Font_TTSatoshi_DemiBold_42_glyph_79,
Font_TTSatoshi_DemiBold_42_glyph_80,
Font_TTSatoshi_DemiBold_42_glyph_81,
Font_TTSatoshi_DemiBold_42_glyph_82,
Font_TTSatoshi_DemiBold_42_glyph_83,
Font_TTSatoshi_DemiBold_42_glyph_84,
Font_TTSatoshi_DemiBold_42_glyph_85,
Font_TTSatoshi_DemiBold_42_glyph_86,
Font_TTSatoshi_DemiBold_42_glyph_87,
Font_TTSatoshi_DemiBold_42_glyph_88,
Font_TTSatoshi_DemiBold_42_glyph_89,
Font_TTSatoshi_DemiBold_42_glyph_90,
Font_TTSatoshi_DemiBold_42_glyph_91,
Font_TTSatoshi_DemiBold_42_glyph_92,
Font_TTSatoshi_DemiBold_42_glyph_93,
Font_TTSatoshi_DemiBold_42_glyph_94,
Font_TTSatoshi_DemiBold_42_glyph_95,
Font_TTSatoshi_DemiBold_42_glyph_96,
Font_TTSatoshi_DemiBold_42_glyph_97,
Font_TTSatoshi_DemiBold_42_glyph_98,
Font_TTSatoshi_DemiBold_42_glyph_99,
Font_TTSatoshi_DemiBold_42_glyph_100,
Font_TTSatoshi_DemiBold_42_glyph_101,
Font_TTSatoshi_DemiBold_42_glyph_102,
Font_TTSatoshi_DemiBold_42_glyph_103,
Font_TTSatoshi_DemiBold_42_glyph_104,
Font_TTSatoshi_DemiBold_42_glyph_105,
Font_TTSatoshi_DemiBold_42_glyph_106,
Font_TTSatoshi_DemiBold_42_glyph_107,
Font_TTSatoshi_DemiBold_42_glyph_108,
Font_TTSatoshi_DemiBold_42_glyph_109,
Font_TTSatoshi_DemiBold_42_glyph_110,
Font_TTSatoshi_DemiBold_42_glyph_111,
Font_TTSatoshi_DemiBold_42_glyph_112,
Font_TTSatoshi_DemiBold_42_glyph_113,
Font_TTSatoshi_DemiBold_42_glyph_114,
Font_TTSatoshi_DemiBold_42_glyph_115,
Font_TTSatoshi_DemiBold_42_glyph_116,
Font_TTSatoshi_DemiBold_42_glyph_117,
Font_TTSatoshi_DemiBold_42_glyph_118,
Font_TTSatoshi_DemiBold_42_glyph_119,
Font_TTSatoshi_DemiBold_42_glyph_120,
Font_TTSatoshi_DemiBold_42_glyph_121,
Font_TTSatoshi_DemiBold_42_glyph_122,
Font_TTSatoshi_DemiBold_42_glyph_123,
Font_TTSatoshi_DemiBold_42_glyph_124,
Font_TTSatoshi_DemiBold_42_glyph_125,
Font_TTSatoshi_DemiBold_42_glyph_126,
};

@ -0,0 +1,10 @@
#include <stdint.h>
#if TREZOR_FONT_BPP != 4
#error Wrong TREZOR_FONT_BPP (expected 4)
#endif
#define Font_TTSatoshi_DemiBold_42_HEIGHT 42
#define Font_TTSatoshi_DemiBold_42_MAX_HEIGHT 44
#define Font_TTSatoshi_DemiBold_42_BASELINE 9
extern const uint8_t* const Font_TTSatoshi_DemiBold_42[126 + 1 - 32];
extern const uint8_t Font_TTSatoshi_DemiBold_42_glyph_nonprintable[];

@ -58,8 +58,14 @@ typedef struct {
#define VTRUST_RED 0x0010
#define VTRUST_CLICK 0x0020
#define VTRUST_STRING 0x0040
#define VTRUST_SECRET \
0x0080 // inverse logic, if set, don't allow to run with secret present
// Two bits for historical reasons. On T2B1, only the lower bit was used with
// inverted logic (due to late inclusion of the secret handling during
// development process). On T3T1, we decided to remedy the situation by
// including the upper bit as well.
#define VTRUST_SECRET 0x0180
#define VTRUST_SECRET_ALLOW 0x0100
#define VTRUST_ALL (VTRUST_WAIT | VTRUST_RED | VTRUST_CLICK | VTRUST_STRING)
typedef struct {

@ -6,6 +6,7 @@
#include TREZOR_BOARD
static uint8_t unit_variant_color = 0;
static uint8_t unit_variant_packaging = 0;
static bool unit_variant_btconly = false;
static bool unit_variant_ok = false;
@ -14,6 +15,7 @@ static int16_t unit_variant_build_year = -1;
static void unit_variant_0x01(const uint8_t *data) {
unit_variant_color = data[1];
unit_variant_btconly = data[2] == 1;
unit_variant_packaging = data[3];
unit_variant_ok = true;
}
@ -69,6 +71,8 @@ void unit_variant_init(void) {
uint8_t unit_variant_get_color(void) { return unit_variant_color; }
uint8_t unit_variant_get_packaging(void) { return unit_variant_packaging; }
bool unit_variant_get_btconly(void) { return unit_variant_btconly; }
bool unit_variant_present(void) { return unit_variant_ok; }

@ -7,6 +7,7 @@
void unit_variant_init(void);
bool unit_variant_present(void);
uint8_t unit_variant_get_color(void);
uint8_t unit_variant_get_packaging(void);
bool unit_variant_get_btconly(void);
bool unit_variant_is_sd_hotswap_enabled(void);

@ -93,3 +93,12 @@ const flash_area_t ALL_WIPE_AREA = {
.num_sectors = 21,
},
};
const flash_area_t SECRET_AREA = {
.num_subareas = 1,
.subarea[0] =
{
.first_sector = 0,
.num_sectors = 0,
},
};

@ -9,16 +9,15 @@
#define MODEL_INTERNAL_NAME_TOKEN T3T1
#define MODEL_INTERNAL_NAME_QSTR MP_QSTR_T3T1
/*** Using DEV KEYS temporarily ***/
#define MODEL_BOARDLOADER_KEYS \
(const uint8_t *)"\xdb\x99\x5f\xe2\x51\x69\xd1\x41\xca\xb9\xbb\xba\x92\xba\xa0\x1f\x9f\x2e\x1e\xce\x7d\xf4\xcb\x2a\xc0\x51\x90\xf3\x7f\xcc\x1f\x9d", \
(const uint8_t *)"\x21\x52\xf8\xd1\x9b\x79\x1d\x24\x45\x32\x42\xe1\x5f\x2e\xab\x6c\xb7\xcf\xfa\x7b\x6a\x5e\xd3\x00\x97\x96\x0e\x06\x98\x81\xdb\x12", \
(const uint8_t *)"\x22\xfc\x29\x77\x92\xf0\xb6\xff\xc0\xbf\xcf\xdb\x7e\xdb\x0c\x0a\xa1\x4e\x02\x5a\x36\x5e\xc0\xe3\x42\xe8\x6e\x38\x29\xcb\x74\xb6",
(const uint8_t *)"\x76\xaf\x42\x6e\x61\x40\x6b\xad\x7c\x07\x7b\x40\x9c\x66\xfd\xe3\x9f\xb8\x17\x91\x93\x13\xae\x1e\x4c\x02\x53\x5c\x80\xbe\xed\x96", \
(const uint8_t *)"\x61\x97\x51\xdc\x8d\x2d\x09\xd7\xe5\xdf\xb9\x9e\x41\xf6\x06\xde\xbd\xf4\x19\xf8\x5a\x81\x43\xe8\xe5\x39\x9e\xa6\x7a\x39\x88\xc7", \
(const uint8_t *)"\xab\xf9\x4b\x66\x15\xa7\xdd\xe2\xa8\x71\xf7\xd6\x2c\x38\xef\xc7\xd9\xd8\xf6\x01\x0d\x88\x46\xbe\xe6\x36\xe4\xf3\xe6\x58\xa3\x8c",
#define MODEL_BOOTLOADER_KEYS \
(const uint8_t *)"\xd7\x59\x79\x3b\xbc\x13\xa2\x81\x9a\x82\x7c\x76\xad\xb6\xfb\xa8\xa4\x9a\xee\x00\x7f\x49\xf2\xd0\x99\x2d\x99\xb8\x25\xad\x2c\x48", \
(const uint8_t *)"\x63\x55\x69\x1c\x17\x8a\x8f\xf9\x10\x07\xa7\x47\x8a\xfb\x95\x5e\xf7\x35\x2c\x63\xe7\xb2\x57\x03\x98\x4c\xf7\x8b\x26\xe2\x1a\x56", \
(const uint8_t *)"\xee\x93\xa4\xf6\x6f\x8d\x16\xb8\x19\xbb\x9b\xeb\x9f\xfc\xcd\xfc\xdc\x14\x12\xe8\x7f\xee\x6a\x32\x4c\x2a\x99\xa1\xe0\xe6\x71\x48",
(const uint8_t *)"\x33\x8b\x94\x9b\x7e\x3b\x26\x47\x0d\x4f\xe3\x69\x6f\xd6\xff\xf2\x87\x57\x26\x5d\x14\xcc\xa4\x8e\xbf\x2d\xb9\x7b\x4f\x5b\xc0\x39", \
(const uint8_t *)"\x28\x68\x20\x27\x73\x0b\x78\x32\x01\xb0\x5a\x8c\x9d\x11\x68\x54\x47\xc1\x72\x97\xdb\x71\xb8\xa6\x0d\xc6\x93\xa4\x46\x10\x75\x1d", \
(const uint8_t *)"\x9f\xbf\x31\xb4\xe3\x51\xa4\xcc\x81\xc7\x59\x95\xb2\x25\x7f\x0a\x71\x69\x26\x8d\xa5\xa4\x4e\x94\xb6\xa5\x59\x0d\x43\x4e\x32\xda",
#define IMAGE_CHUNK_SIZE (128 * 1024)
#define IMAGE_HASH_SHA256

@ -1 +0,0 @@
Added basic support for STM32U5

@ -1,4 +1,14 @@
## 0.2.5 [16th April 2024]
### Added
- Added basic support for STM32U5. [#3370]
- [T3T1] Added support for T3T1.
- [T3T1] Added `HAPTIC` to test haptic feedback.
- [T2T1, T3T1] Added `TOUCH VERSION` to get version number of touch controller.
- Added `VARIANT READ` to read out result of `VARIANT` command.
## 0.2.4 [20th December 2023]
### Added
@ -21,3 +31,4 @@
[#3325]: https://github.com/trezor/trezor-firmware/pull/3325
[#3370]: https://github.com/trezor/trezor-firmware/pull/3370

@ -118,6 +118,16 @@ Example:
SENS 12
```
### TOUCH VERSION
Allows you to read the version of the touch screen controller, if its supported by the device.
The command returns `OK` followed by the version number.
Example:
```
TOUCH VERSION
OK 167
```
### PWM
The `PWM` command sets the display backlight using PWM (Pulse Width Modulation).
This command takes one input parameter, a decimal value between 0 to 255, and adjusts the PWM output to control the display LED backlight.
@ -205,6 +215,15 @@ Example (to write 8 bytes into OTP memory):
VARIANT 128 64 100 1 2 3 0 0
```
### VARIANT READ
The `VARIANT READ` command allows you to read 32 bytes of stored variant data (representing device variant options), each ranging from 0 to 255, and delimited by spaces.
Example:
```
VARIANT READ
OK 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
```
### WIPE
This command invalidates the current firmware in the flash memory by erasing its beginning, including metadata.
After performing this operation, it displays the text "WIPED" on the screen and returns the response OK.

@ -387,6 +387,11 @@ static void test_sensitivity(const char *args) {
touch_power_off();
}
static void touch_version(void) {
uint8_t version = touch_get_version();
vcp_println("OK %d", version);
}
#endif
static void test_pwm(const char *args) {
@ -403,14 +408,17 @@ static void test_sd(void) {
static uint32_t buf1[BLOCK_SIZE / sizeof(uint32_t)];
static uint32_t buf2[BLOCK_SIZE / sizeof(uint32_t)];
bool low_speed = false;
#ifndef TREZOR_MODEL_T3T1
if (sectrue != sdcard_is_present()) {
vcp_println("ERROR NOCARD");
return;
}
#else
low_speed = true;
#endif
if (sectrue != sdcard_power_on_unchecked()) {
if (sectrue != sdcard_power_on_unchecked(low_speed)) {
vcp_println("ERROR POWER ON");
return;
}
@ -520,6 +528,21 @@ static void test_otp_write(const char *args) {
vcp_println("OK");
}
static void test_otp_read_device_variant() {
uint8_t data[32] = {0};
if (sectrue !=
flash_otp_read(FLASH_OTP_BLOCK_DEVICE_VARIANT, 0, data, sizeof(data))) {
vcp_println("ERROR");
return;
}
vcp_print("OK ");
for (int i = 0; i < sizeof(data); i++) {
vcp_print("%d ", data[i]);
}
vcp_println("");
}
static void test_otp_write_device_variant(const char *args) {
#ifdef USE_OPTIGA
optiga_locked_status status = get_optiga_locked_status();
@ -660,11 +683,15 @@ int main(void) {
test_button(line + 7);
#endif
#ifdef USE_TOUCH
} else if (startswith(line, "TOUCH VERSION")) {
touch_version();
} else if (startswith(line, "TOUCH ")) {
test_touch(line + 6);
} else if (startswith(line, "SENS ")) {
test_sensitivity(line + 5);
#endif
} else if (startswith(line, "PWM ")) {
test_pwm(line + 4);
@ -712,6 +739,9 @@ int main(void) {
} else if (startswith(line, "OTP WRITE ")) {
test_otp_write(line + 10);
} else if (startswith(line, "VARIANT READ")) {
test_otp_read_device_variant();
} else if (startswith(line, "VARIANT ")) {
test_otp_write_device_variant(line + 8);

@ -1,6 +1,6 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 2
#define VERSION_PATCH 5
#define VERSION_PATCH 6
#define VERSION_BUILD 0
#define FIX_VERSION_MAJOR 0

@ -32,6 +32,7 @@
#include "sbu.h"
#include "sdcard.h"
#include "secbool.h"
#include "terminal.h"
#include "touch.h"
#ifdef USE_HASH_PROCESSOR
@ -56,8 +57,7 @@ static void flash_from_sdcard(const flash_area_t* area, uint32_t source,
ensure(sdcard_read_blocks(buf, i + source / SDCARD_BLOCK_SIZE, 1),
"sdcard_read_blocks");
for (uint32_t j = 0; j < SDCARD_BLOCK_SIZE / FLASH_BLOCK_SIZE)
; j++) {
for (uint32_t j = 0; j < SDCARD_BLOCK_SIZE / FLASH_BLOCK_SIZE; j++) {
ensure(flash_area_write_block(
area, i * SDCARD_BLOCK_SIZE + j * FLASH_BLOCK_SIZE,
&buf[j * FLASH_BLOCK_WORDS]),

@ -10,6 +10,7 @@ default = ["model_tt"]
crypto = ["zeroize"]
model_tt = ["jpeg"]
model_tr = []
model_mercury = ["jpeg", "dma2d"]
micropython = []
protobuf = ["micropython"]
ui = []

@ -14,20 +14,6 @@ fn main() {
link_core_objects();
}
fn mcu_type() -> String {
match env::var("MCU_TYPE") {
Ok(mcu) => mcu,
Err(_) => String::from("STM32F427xx"),
}
}
fn model() -> String {
match env::var("TREZOR_MODEL") {
Ok(model) => model,
Err(_) => String::from("T"),
}
}
// fn block_words() -> String {
// match env::var("FLASH_BLOCK_WORDS") {
// Ok(model) => model,
@ -35,19 +21,6 @@ fn model() -> String {
// }
// }
fn board() -> String {
if !is_firmware() {
return String::from("boards/board-unix.h");
}
match env::var("TREZOR_BOARD") {
Ok(board) => {
format!("boards/{}", board)
}
Err(_) => String::from("boards/trezor_t.h"),
}
}
/// Generates Rust module that exports QSTR constants used in firmware.
#[cfg(feature = "micropython")]
fn generate_qstr_bindings() {
@ -96,35 +69,19 @@ fn generate_qstr_bindings() {
fn prepare_bindings() -> bindgen::Builder {
let mut bindings = bindgen::Builder::default();
// Common include paths and defines
bindings = bindings.clang_args([
"-I../../../crypto",
"-I../../../storage",
"-I../../vendor/micropython",
"-I../../vendor/micropython/lib/uzlib",
"-I../lib",
"-I../trezorhal",
"-I../models",
format!("-D{}", mcu_type()).as_str(),
format!("-DTREZOR_MODEL_{}", model()).as_str(),
format!("-DTREZOR_BOARD=\"{}\"", board()).as_str(),
]);
let mut clang_args: Vec<&str> = Vec::new();
let includes = env::var("BINDGEN_MACROS").unwrap();
let args = includes.split(',');
for arg in args {
clang_args.push(arg);
}
// Pass in correct include paths and defines.
if is_firmware() {
let mut clang_args: Vec<&str> = Vec::new();
let includes = env::var("RUST_INCLUDES").unwrap();
let args = includes.split(';');
for arg in args {
clang_args.push(arg);
}
clang_args.push("-nostdinc");
clang_args.push("-I../firmware");
clang_args.push("-I../../build/firmware");
clang_args.push("-DUSE_HAL_DRIVER");
bindings = bindings.clang_args(&clang_args);
// Append gcc-arm-none-eabi's include paths.
let cc_output = Command::new("arm-none-eabi-gcc")
@ -147,17 +104,11 @@ fn prepare_bindings() -> bindgen::Builder {
bindings = bindings.clang_args(include_args);
} else {
bindings = bindings.clang_args(&[
"-I../unix",
"-I../trezorhal/unix",
"-I../../build/unix",
"-I../../vendor/micropython/ports/unix",
"-DTREZOR_EMULATOR",
"-DFLASH_BIT_ACCESS=1",
"-DFLASH_BLOCK_WORDS=1",
]);
clang_args.push("-I../../build/unix");
}
bindings = bindings.clang_args(&clang_args);
bindings
// Customize the standard types.
.use_core()

@ -353,8 +353,8 @@ static void _librust_qstrs(void) {
MP_QSTR_recovery__enter_share_from_diff_group;
MP_QSTR_recovery__group_num_template;
MP_QSTR_recovery__group_threshold_reached;
MP_QSTR_recovery__invalid_seed_entered;
MP_QSTR_recovery__invalid_share_entered;
MP_QSTR_recovery__invalid_wallet_backup_entered;
MP_QSTR_recovery__more_shares_needed;
MP_QSTR_recovery__num_of_words;
MP_QSTR_recovery__only_first_n_letters;
@ -393,13 +393,14 @@ static void _librust_qstrs(void) {
MP_QSTR_reset__by_continuing;
MP_QSTR_reset__check_backup_title;
MP_QSTR_reset__check_group_share_title_template;
MP_QSTR_reset__check_seed_title;
MP_QSTR_reset__check_share_title_template;
MP_QSTR_reset__check_wallet_backup_title;
MP_QSTR_reset__continue_with_next_share;
MP_QSTR_reset__continue_with_share_template;
MP_QSTR_reset__create_x_of_y_shamir_backup_template;
MP_QSTR_reset__finished_verifying_group_template;
MP_QSTR_reset__finished_verifying_seed;
MP_QSTR_reset__finished_verifying_shares;
MP_QSTR_reset__finished_verifying_wallet_backup;
MP_QSTR_reset__group_description;
MP_QSTR_reset__group_info;
MP_QSTR_reset__group_share_checked_successfully_template;
@ -417,8 +418,8 @@ static void _librust_qstrs(void) {
MP_QSTR_reset__number_of_shares_info;
MP_QSTR_reset__one_share;
MP_QSTR_reset__only_one_share_will_be_created;
MP_QSTR_reset__recovery_seed_title;
MP_QSTR_reset__recovery_share_title_template;
MP_QSTR_reset__recovery_wallet_backup_title;
MP_QSTR_reset__required_number_of_groups;
MP_QSTR_reset__select_correct_word;
MP_QSTR_reset__select_word_template;
@ -448,6 +449,7 @@ static void _librust_qstrs(void) {
MP_QSTR_reset__title_set_number_of_groups;
MP_QSTR_reset__title_set_number_of_shares;
MP_QSTR_reset__title_set_threshold;
MP_QSTR_reset__title_shamir_backup;
MP_QSTR_reset__to_form_group_template;
MP_QSTR_reset__tos_link;
MP_QSTR_reset__total_number_of_shares_in_group_template;

@ -20,7 +20,7 @@ uint32_t screen_install_success(uint8_t restart_seconds, bool initial_setup,
bool complete_draw);
uint32_t screen_install_fail(void);
void screen_welcome(void);
void screen_boot_empty(bool fading);
void screen_boot_stage_1(bool fading);
uint32_t screen_unlock_bootloader_confirm(void);
void screen_unlock_bootloader_success(void);
void bld_continue_label(uint16_t bg_color);

@ -3,7 +3,7 @@
void screen_fatal_error_rust(const char* title, const char* msg,
const char* footer);
void screen_boot_full(void);
void screen_boot_stage_2(void);
void display_image(int16_t x, int16_t y, const uint8_t* data, uint32_t datalen);
void display_icon(int16_t x, int16_t y, const uint8_t* data, uint32_t datalen,

@ -783,8 +783,8 @@ pub enum TranslatedString {
recovery__cancel_dry_run = 495, // "Cancel backup check"
recovery__check_dry_run = 496, // "Check your backup?"
recovery__cursor_will_change = 497, // "Position of the cursor will change between entries for enhanced security."
recovery__dry_run_bip39_valid_match = 498, // "The entered recovery seed is valid and matches the one in the device."
recovery__dry_run_bip39_valid_mismatch = 499, // "The entered recovery seed is valid but does not match the one in the device."
recovery__dry_run_bip39_valid_match = 498, // "The entered recovery wallet backup is valid and matches the one in the device."
recovery__dry_run_bip39_valid_mismatch = 499, // "The entered wallet backup is valid but does not match the one in the device."
recovery__dry_run_slip39_valid_match = 500, // "The entered recovery shares are valid and match what is currently in the device."
recovery__dry_run_slip39_valid_mismatch = 501, // "The entered recovery shares are valid but do not match what is currently in the device."
recovery__enter_any_share = 502, // "Enter any share"
@ -793,7 +793,7 @@ pub enum TranslatedString {
recovery__enter_share_from_diff_group = 505, // "Enter share from a different group."
recovery__group_num_template = 506, // "Group {0}"
recovery__group_threshold_reached = 507, // "Group threshold reached."
recovery__invalid_seed_entered = 508, // "Invalid recovery seed entered."
recovery__invalid_wallet_backup_entered = 508, // "Invalid wallet backup entered."
recovery__invalid_share_entered = 509, // "Invalid recovery share entered."
recovery__more_shares_needed = 510, // "More shares needed"
recovery__num_of_words = 511, // "Select the number of words in your backup."
@ -827,12 +827,12 @@ pub enum TranslatedString {
reset__by_continuing = 539, // "By continuing you agree to Trezor Company's terms and conditions."
reset__check_backup_title = 540, // "CHECK BACKUP"
reset__check_group_share_title_template = 541, // "CHECK G{0} - SHARE {1}"
reset__check_seed_title = 542, // "CHECK SEED"
reset__check_wallet_backup_title = 542, // "CHECK WALLET BACKUP"
reset__check_share_title_template = 543, // "CHECK SHARE #{0}"
reset__continue_with_next_share = 544, // "Continue with the next share."
reset__continue_with_share_template = 545, // "Continue with share #{0}."
reset__finished_verifying_group_template = 546, // "You have finished verifying your recovery shares for group {0}."
reset__finished_verifying_seed = 547, // "You have finished verifying your recovery seed."
reset__finished_verifying_wallet_backup = 547, // "You have finished verifying your wallet backup."
reset__finished_verifying_shares = 548, // "You have finished verifying your recovery shares."
reset__group_description = 549, // "A group is made up of recovery shares."
reset__group_info = 550, // "Each group has a set number of shares and its own threshold. In the next steps you will set the numbers of shares and the thresholds."
@ -843,7 +843,7 @@ pub enum TranslatedString {
reset__need_any_share_template = 555, // "For recovery you need any {0} of the shares."
reset__needed_to_form_a_group = 556, // "needed to form a group. "
reset__needed_to_recover_your_wallet = 557, // "needed to recover your wallet. "
reset__never_make_digital_copy = 558, // "Never make a digital copy of your backup or upload it online!"
reset__never_make_digital_copy = 558, // "Never put your backup anywhere digital."
reset__num_of_share_holders_template = 559, // "{0} people or locations will each hold one share."
reset__num_of_shares_advanced_info_template = 560, // "Each recovery share is a sequence of 20 words. Next you will choose the threshold number of shares needed to form Group {0}."
reset__num_of_shares_basic_info = 561, // "Each recovery share is a sequence of 20 words. Next you will choose how many shares you need to recover your wallet."
@ -851,7 +851,7 @@ pub enum TranslatedString {
reset__number_of_shares_info = 563, // "= total number of unique word lists used for wallet backup."
reset__one_share = 564, // "1 share"
reset__only_one_share_will_be_created = 565, // "Only one share will be created."
reset__recovery_seed_title = 566, // "RECOVERY SEED"
reset__recovery_wallet_backup_title = 566, // "WALLET BACKUP"
reset__recovery_share_title_template = 567, // "RECOVERY SHARE #{0}"
reset__required_number_of_groups = 568, // "The required number of groups for recovery."
reset__select_correct_word = 569, // "Select the correct word for each position."
@ -1237,6 +1237,8 @@ pub enum TranslatedString {
storage_msg__starting = 842, // "STARTING UP"
storage_msg__verifying_pin = 843, // "VERIFYING PIN"
storage_msg__wrong_pin = 844, // "WRONG PIN"
reset__create_x_of_y_shamir_backup_template = 845, // "Do you want to create a {0} of {1} Shamir backup?"
reset__title_shamir_backup = 846, // "SHAMIR BACKUP"
}
impl TranslatedString {
@ -2015,8 +2017,8 @@ impl TranslatedString {
Self::recovery__cancel_dry_run => "Cancel backup check",
Self::recovery__check_dry_run => "Check your backup?",
Self::recovery__cursor_will_change => "Position of the cursor will change between entries for enhanced security.",
Self::recovery__dry_run_bip39_valid_match => "The entered recovery seed is valid and matches the one in the device.",
Self::recovery__dry_run_bip39_valid_mismatch => "The entered recovery seed is valid but does not match the one in the device.",
Self::recovery__dry_run_bip39_valid_match => "The entered recovery wallet backup is valid and matches the one in the device.",
Self::recovery__dry_run_bip39_valid_mismatch => "The entered wallet backup is valid but does not match the one in the device.",
Self::recovery__dry_run_slip39_valid_match => "The entered recovery shares are valid and match what is currently in the device.",
Self::recovery__dry_run_slip39_valid_mismatch => "The entered recovery shares are valid but do not match what is currently in the device.",
Self::recovery__enter_any_share => "Enter any share",
@ -2025,7 +2027,7 @@ impl TranslatedString {
Self::recovery__enter_share_from_diff_group => "Enter share from a different group.",
Self::recovery__group_num_template => "Group {0}",
Self::recovery__group_threshold_reached => "Group threshold reached.",
Self::recovery__invalid_seed_entered => "Invalid recovery seed entered.",
Self::recovery__invalid_wallet_backup_entered => "Invalid wallet backup entered.",
Self::recovery__invalid_share_entered => "Invalid recovery share entered.",
Self::recovery__more_shares_needed => "More shares needed",
Self::recovery__num_of_words => "Select the number of words in your backup.",
@ -2059,12 +2061,12 @@ impl TranslatedString {
Self::reset__by_continuing => "By continuing you agree to Trezor Company's terms and conditions.",
Self::reset__check_backup_title => "CHECK BACKUP",
Self::reset__check_group_share_title_template => "CHECK G{0} - SHARE {1}",
Self::reset__check_seed_title => "CHECK SEED",
Self::reset__check_wallet_backup_title => "CHECK WALLET BACKUP",
Self::reset__check_share_title_template => "CHECK SHARE #{0}",
Self::reset__continue_with_next_share => "Continue with the next share.",
Self::reset__continue_with_share_template => "Continue with share #{0}.",
Self::reset__finished_verifying_group_template => "You have finished verifying your recovery shares for group {0}.",
Self::reset__finished_verifying_seed => "You have finished verifying your recovery seed.",
Self::reset__finished_verifying_wallet_backup => "You have finished verifying your wallet backup.",
Self::reset__finished_verifying_shares => "You have finished verifying your recovery shares.",
Self::reset__group_description => "A group is made up of recovery shares.",
Self::reset__group_info => "Each group has a set number of shares and its own threshold. In the next steps you will set the numbers of shares and the thresholds.",
@ -2075,7 +2077,7 @@ impl TranslatedString {
Self::reset__need_any_share_template => "For recovery you need any {0} of the shares.",
Self::reset__needed_to_form_a_group => "needed to form a group. ",
Self::reset__needed_to_recover_your_wallet => "needed to recover your wallet. ",
Self::reset__never_make_digital_copy => "Never make a digital copy of your backup or upload it online!",
Self::reset__never_make_digital_copy => "Never put your backup anywhere digital.",
Self::reset__num_of_share_holders_template => "{0} people or locations will each hold one share.",
Self::reset__num_of_shares_advanced_info_template => "Each recovery share is a sequence of 20 words. Next you will choose the threshold number of shares needed to form Group {0}.",
Self::reset__num_of_shares_basic_info => "Each recovery share is a sequence of 20 words. Next you will choose how many shares you need to recover your wallet.",
@ -2083,7 +2085,7 @@ impl TranslatedString {
Self::reset__number_of_shares_info => "= total number of unique word lists used for wallet backup.",
Self::reset__one_share => "1 share",
Self::reset__only_one_share_will_be_created => "Only one share will be created.",
Self::reset__recovery_seed_title => "RECOVERY SEED",
Self::reset__recovery_wallet_backup_title => "WALLET BACKUP",
Self::reset__recovery_share_title_template => "RECOVERY SHARE #{0}",
Self::reset__required_number_of_groups => "The required number of groups for recovery.",
Self::reset__select_correct_word => "Select the correct word for each position.",
@ -2469,6 +2471,8 @@ impl TranslatedString {
Self::storage_msg__starting => "STARTING UP",
Self::storage_msg__verifying_pin => "VERIFYING PIN",
Self::storage_msg__wrong_pin => "WRONG PIN",
Self::reset__create_x_of_y_shamir_backup_template => "Do you want to create a {0} of {1} Shamir backup?",
Self::reset__title_shamir_backup => "SHAMIR BACKUP",
}
}
@ -3258,7 +3262,7 @@ impl TranslatedString {
Qstr::MP_QSTR_recovery__enter_share_from_diff_group => Some(Self::recovery__enter_share_from_diff_group),
Qstr::MP_QSTR_recovery__group_num_template => Some(Self::recovery__group_num_template),
Qstr::MP_QSTR_recovery__group_threshold_reached => Some(Self::recovery__group_threshold_reached),
Qstr::MP_QSTR_recovery__invalid_seed_entered => Some(Self::recovery__invalid_seed_entered),
Qstr::MP_QSTR_recovery__invalid_wallet_backup_entered => Some(Self::recovery__invalid_wallet_backup_entered),
Qstr::MP_QSTR_recovery__invalid_share_entered => Some(Self::recovery__invalid_share_entered),
Qstr::MP_QSTR_recovery__more_shares_needed => Some(Self::recovery__more_shares_needed),
Qstr::MP_QSTR_recovery__num_of_words => Some(Self::recovery__num_of_words),
@ -3292,12 +3296,12 @@ impl TranslatedString {
Qstr::MP_QSTR_reset__by_continuing => Some(Self::reset__by_continuing),
Qstr::MP_QSTR_reset__check_backup_title => Some(Self::reset__check_backup_title),
Qstr::MP_QSTR_reset__check_group_share_title_template => Some(Self::reset__check_group_share_title_template),
Qstr::MP_QSTR_reset__check_seed_title => Some(Self::reset__check_seed_title),
Qstr::MP_QSTR_reset__check_wallet_backup_title => Some(Self::reset__check_wallet_backup_title),
Qstr::MP_QSTR_reset__check_share_title_template => Some(Self::reset__check_share_title_template),
Qstr::MP_QSTR_reset__continue_with_next_share => Some(Self::reset__continue_with_next_share),
Qstr::MP_QSTR_reset__continue_with_share_template => Some(Self::reset__continue_with_share_template),
Qstr::MP_QSTR_reset__finished_verifying_group_template => Some(Self::reset__finished_verifying_group_template),
Qstr::MP_QSTR_reset__finished_verifying_seed => Some(Self::reset__finished_verifying_seed),
Qstr::MP_QSTR_reset__finished_verifying_wallet_backup => Some(Self::reset__finished_verifying_wallet_backup),
Qstr::MP_QSTR_reset__finished_verifying_shares => Some(Self::reset__finished_verifying_shares),
Qstr::MP_QSTR_reset__group_description => Some(Self::reset__group_description),
Qstr::MP_QSTR_reset__group_info => Some(Self::reset__group_info),
@ -3316,7 +3320,7 @@ impl TranslatedString {
Qstr::MP_QSTR_reset__number_of_shares_info => Some(Self::reset__number_of_shares_info),
Qstr::MP_QSTR_reset__one_share => Some(Self::reset__one_share),
Qstr::MP_QSTR_reset__only_one_share_will_be_created => Some(Self::reset__only_one_share_will_be_created),
Qstr::MP_QSTR_reset__recovery_seed_title => Some(Self::reset__recovery_seed_title),
Qstr::MP_QSTR_reset__recovery_wallet_backup_title => Some(Self::reset__recovery_wallet_backup_title),
Qstr::MP_QSTR_reset__recovery_share_title_template => Some(Self::reset__recovery_share_title_template),
Qstr::MP_QSTR_reset__required_number_of_groups => Some(Self::reset__required_number_of_groups),
Qstr::MP_QSTR_reset__select_correct_word => Some(Self::reset__select_correct_word),
@ -3702,6 +3706,8 @@ impl TranslatedString {
Qstr::MP_QSTR_storage_msg__starting => Some(Self::storage_msg__starting),
Qstr::MP_QSTR_storage_msg__verifying_pin => Some(Self::storage_msg__verifying_pin),
Qstr::MP_QSTR_storage_msg__wrong_pin => Some(Self::storage_msg__wrong_pin),
Qstr::MP_QSTR_reset__create_x_of_y_shamir_backup_template => Some(Self::reset__create_x_of_y_shamir_backup_template),
Qstr::MP_QSTR_reset__title_shamir_backup => Some(Self::reset__title_shamir_backup),
_ => None,
}
}

@ -14,12 +14,14 @@ fn shutdown() -> ! {
#[cfg(feature = "bootloader")]
pub fn __fatal_error(_expr: &str, _msg: &str, _file: &str, _line: u32, _func: &str) -> ! {
ModelUI::screen_fatal_error("BL.rs", "BL.rs", "PLEASE VISIT\nTREZOR.IO/RSOD");
ModelUI::backlight_on();
shutdown()
}
#[cfg(not(feature = "bootloader"))]
pub fn __fatal_error(_expr: &str, msg: &str, _file: &str, _line: u32, _func: &str) -> ! {
ModelUI::screen_fatal_error("INTERNAL_ERROR", msg, "PLEASE VISIT\nTREZOR.IO/RSOD");
ModelUI::backlight_on();
shutdown()
}

@ -97,8 +97,8 @@ extern "C" fn screen_intro(
}
#[no_mangle]
extern "C" fn screen_boot_empty(fading: bool) {
ModelUI::screen_boot_empty(fading)
extern "C" fn screen_boot_stage_1(fading: bool) {
ModelUI::screen_boot_stage_1(fading)
}
#[no_mangle]

@ -24,8 +24,8 @@ extern "C" fn screen_fatal_error_rust(
}
#[no_mangle]
extern "C" fn screen_boot_full() {
ModelUI::screen_boot_full();
extern "C" fn screen_boot_stage_2() {
ModelUI::screen_boot_stage_2();
}
#[no_mangle]

@ -1,6 +1,12 @@
//! Reexporting the `constant` module according to the
//! current feature (Trezor model)
#[cfg(all(
feature = "model_mercury",
not(feature = "model_tr"),
not(feature = "model_tt")
))]
pub use super::model_mercury::constant::*;
#[cfg(all(feature = "model_tr", not(feature = "model_tt")))]
pub use super::model_tr::constant::*;
#[cfg(feature = "model_tt")]

@ -0,0 +1,333 @@
use crate::ui::{
constant,
constant::{screen, LOADER_INNER, LOADER_OUTER},
display,
display::{toif::Icon, Color},
geometry::{Offset, Point, Rect},
};
use crate::trezorhal::{
buffers,
dma2d::{dma2d_setup_4bpp_over_4bpp, dma2d_start_blend, dma2d_wait_for_transfer},
};
const ICON_MAX_SIZE: i16 = constant::LOADER_ICON_MAX_SIZE;
#[derive(Clone, Copy)]
pub struct LoaderDimensions {
in_inner_anti: i32,
inner_min: i32,
outer_out_anti: i32,
outer_max: i32,
}
impl LoaderDimensions {
pub fn new(outer: i16, inner: i16) -> Self {
let outer: f32 = outer.into();
let inner: f32 = inner.into();
Self {
in_inner_anti: ((inner + 0.5) * (inner + 0.5)) as i32,
inner_min: ((inner + 1.5) * (inner + 1.5)) as i32,
outer_out_anti: ((outer - 1.5) * (outer - 1.5)) as i32,
outer_max: ((outer - 0.5) * (outer - 0.5)) as i32,
}
}
}
pub fn loader_circular_uncompress(
dim: LoaderDimensions,
y_offset: i16,
fg_color: Color,
bg_color: Color,
progress: u16,
indeterminate: bool,
icon: Option<(Icon, Color)>,
) {
if let Some((icon, color)) = icon {
let toif_size = icon.toif.size();
if toif_size.x <= ICON_MAX_SIZE && toif_size.y <= ICON_MAX_SIZE {
let mut icon_data = [0_u8; ((ICON_MAX_SIZE * ICON_MAX_SIZE) / 2) as usize];
icon.toif.uncompress(&mut icon_data);
let i = Some((icon_data.as_ref(), color, toif_size));
loader_rust(
dim,
y_offset,
fg_color,
bg_color,
progress,
indeterminate,
i,
);
} else {
loader_rust(
dim,
y_offset,
fg_color,
bg_color,
progress,
indeterminate,
None,
);
}
} else {
loader_rust(
dim,
y_offset,
fg_color,
bg_color,
progress,
indeterminate,
None,
);
}
}
pub fn loader_circular(
progress: u16,
y_offset: i16,
fg_color: Color,
bg_color: Color,
icon: Option<(Icon, Color)>,
) {
loader_circular_uncompress(
LoaderDimensions::new(LOADER_OUTER, LOADER_INNER),
y_offset,
fg_color,
bg_color,
progress,
false,
icon,
);
}
pub fn loader_circular_indeterminate(
progress: u16,
y_offset: i16,
fg_color: Color,
bg_color: Color,
icon: Option<(Icon, Color)>,
) {
loader_circular_uncompress(
LoaderDimensions::new(LOADER_OUTER, LOADER_INNER),
y_offset,
fg_color,
bg_color,
progress,
true,
icon,
);
}
#[inline(always)]
fn get_loader_vectors(indeterminate: bool, progress: u16) -> (Point, Point) {
let (start_progress, end_progress) = if indeterminate {
const LOADER_INDETERMINATE_WIDTH: u16 = 100;
(
(progress + 1000 - LOADER_INDETERMINATE_WIDTH) % 1000,
(progress + LOADER_INDETERMINATE_WIDTH) % 1000,
)
} else {
(0, progress)
};
let start = ((360 * start_progress as i32) / 1000) % 360;
let end = ((360 * end_progress as i32) / 1000) % 360;
let start_vector;
let end_vector;
if indeterminate {
start_vector = display::get_vector(start as _);
end_vector = display::get_vector(end as _);
} else if progress >= 1000 {
start_vector = Point::zero();
end_vector = Point::zero();
} else if progress > 500 {
start_vector = display::get_vector(end as _);
end_vector = display::get_vector(start as _);
} else {
start_vector = display::get_vector(start as _);
end_vector = display::get_vector(end as _);
}
(start_vector, end_vector)
}
#[inline(always)]
fn loader_get_pixel_color_idx(
show_all: bool,
inverted: bool,
end_vector: Point,
n_start: Point,
c: Point,
center: Point,
dim: LoaderDimensions,
) -> u8 {
let y_p = -(c.y - center.y);
let x_p = c.x - center.x;
let vx = Point::new(x_p, y_p);
let n_vx = Point::new(-y_p, x_p);
let d = y_p as i32 * y_p as i32 + x_p as i32 * x_p as i32;
let included = if inverted {
!display::is_clockwise_or_equal(n_start, vx)
|| !display::is_clockwise_or_equal_inc(n_vx, end_vector)
} else {
display::is_clockwise_or_equal(n_start, vx)
&& display::is_clockwise_or_equal_inc(n_vx, end_vector)
};
// The antialiasing calculation below uses simplified distance difference
// calculation. Optimally, SQRT should be used, but assuming
// diameter large enough and antialiasing over distance
// r_outer-r_inner = 1, the difference between simplified:
// (d^2-r_inner^2)/(r_outer^2-r_inner^2) and precise: (sqrt(d^2)
// - r_inner)/(r_outer-r_inner) is negligible
if show_all || included {
//active part
if d <= dim.in_inner_anti {
0
} else if d <= dim.inner_min {
((15 * (d - dim.in_inner_anti)) / (dim.inner_min - dim.in_inner_anti)) as u8
} else if d <= dim.outer_out_anti {
15
} else if d <= dim.outer_max {
(15 - ((15 * (d - dim.outer_out_anti)) / (dim.outer_max - dim.outer_out_anti))) as u8
} else {
0
}
} else {
//inactive part
if d <= dim.in_inner_anti {
0
} else if d <= dim.inner_min {
((4 * (d - dim.in_inner_anti)) / (dim.inner_min - dim.in_inner_anti)) as u8
} else if d <= dim.outer_out_anti {
4
} else if d <= dim.outer_max {
4 - ((4 * (d - dim.outer_out_anti)) / (dim.outer_max - dim.outer_out_anti)) as u8
} else {
0
}
}
}
pub fn loader_rust(
dim: LoaderDimensions,
y_offset: i16,
fg_color: Color,
bg_color: Color,
progress: u16,
indeterminate: bool,
icon: Option<(&[u8], Color, Offset)>,
) {
let center = screen().center() + Offset::new(0, y_offset);
let r = Rect::from_center_and_size(center, Offset::uniform(LOADER_OUTER * 2));
let clamped = r.clamp(constant::screen());
display::set_window(clamped);
let center = r.center();
let mut use_icon = false;
let mut icon_area = Rect::zero();
let mut icon_area_clamped = Rect::zero();
let mut icon_width = 0;
let mut icon_offset = 0;
let mut icon_color = Color::from_u16(0);
let mut icon_data = [].as_ref();
if let Some((data, color, size)) = icon {
if size.x <= ICON_MAX_SIZE && size.y <= ICON_MAX_SIZE {
icon_width = size.x;
icon_area = Rect::from_center_and_size(center, size);
icon_area_clamped = icon_area.clamp(constant::screen());
icon_offset = (icon_area_clamped.x0 - r.x0) / 2;
icon_color = color;
icon_data = data;
use_icon = true;
}
}
let show_all = !indeterminate && progress >= 1000;
let inverted = !indeterminate && progress > 500;
let (start_vector, end_vector) = get_loader_vectors(indeterminate, progress);
let n_start = Point::new(-start_vector.y, start_vector.x);
let mut b1 = buffers::BufferLine16bpp::get();
let mut b2 = buffers::BufferLine16bpp::get();
let mut ib1 = buffers::BufferLine4bpp::get_cleared();
let mut ib2 = buffers::BufferLine4bpp::get_cleared();
let mut empty_line = buffers::BufferLine4bpp::get_cleared();
dma2d_setup_4bpp_over_4bpp(fg_color.into(), bg_color.into(), icon_color.into());
for y_c in r.y0..r.y1 {
let mut icon_buffer = &mut *empty_line;
let icon_buffer_used;
let loader_buffer;
if y_c % 2 == 0 {
icon_buffer_used = &mut *ib1;
loader_buffer = &mut *b1;
} else {
icon_buffer_used = &mut *ib2;
loader_buffer = &mut *b2;
}
if use_icon && y_c >= icon_area_clamped.y0 && y_c < icon_area_clamped.y1 {
let y_i = y_c - icon_area.y0;
// Optimally, we should cut corners of the icon if it happens to be large enough
// to invade loader area. but this would require calculation of circle chord
// length (since we need to limit data copied to the buffer),
// which requires expensive SQRT. Therefore, when using this method of loader
// drawing, special care needs to be taken to ensure that the icons
// have transparent corners.
icon_buffer_used.buffer[icon_offset as usize..(icon_offset + icon_width / 2) as usize]
.copy_from_slice(
&icon_data[(y_i * (icon_width / 2)) as usize
..((y_i + 1) * (icon_width / 2)) as usize],
);
icon_buffer = icon_buffer_used;
}
let mut pix_c_idx_prev: u8 = 0;
for x_c in r.x0..r.x1 {
let p = Point::new(x_c, y_c);
let pix_c_idx = if clamped.contains(p) {
loader_get_pixel_color_idx(
show_all,
inverted,
end_vector,
n_start,
Point::new(x_c, y_c),
center,
dim,
)
} else {
0
};
let x = x_c - r.x0;
if x % 2 == 0 {
pix_c_idx_prev = pix_c_idx;
} else {
loader_buffer.buffer[(x >> 1) as usize] = pix_c_idx_prev | pix_c_idx << 4;
}
}
dma2d_wait_for_transfer();
unsafe {
dma2d_start_blend(&icon_buffer.buffer, &loader_buffer.buffer, clamped.width());
}
}
dma2d_wait_for_transfer();
}

@ -1,4 +1,6 @@
mod circular;
#[cfg(feature = "dma2d")]
mod circular_thin;
mod rectangular;
mod small;
mod starry;
@ -9,12 +11,17 @@ use crate::ui::display::{Color, Icon};
use crate::ui::display::loader::circular::{
loader_circular as determinate, loader_circular_indeterminate as indeterminate,
};
#[cfg(feature = "model_tt")]
#[cfg(any(feature = "model_tt", feature = "model_mercury"))]
pub use crate::ui::display::loader::circular::{loader_circular_uncompress, LoaderDimensions};
#[cfg(not(feature = "model_tt"))]
#[cfg(all(feature = "model_mercury", not(feature = "model_tt")))]
use crate::ui::display::loader::circular_thin::{
loader_circular as determinate, loader_circular_indeterminate as indeterminate,
};
#[cfg(all(not(feature = "model_tt"), not(feature = "model_mercury")))]
use crate::ui::display::loader::rectangular::loader_rectangular as determinate;
#[cfg(not(feature = "model_tt"))]
#[cfg(all(not(feature = "model_tt"), not(feature = "model_mercury")))]
use crate::ui::display::loader::starry::loader_starry_indeterminate as indeterminate;
pub use small::loader_small_indeterminate;

@ -14,6 +14,9 @@ pub mod util;
pub mod layout;
mod api;
#[cfg(feature = "model_mercury")]
pub mod model_mercury;
#[cfg(feature = "model_tr")]
pub mod model_tr;
#[cfg(feature = "model_tt")]

@ -0,0 +1,113 @@
use crate::{
strutil::TString,
ui::{
component::{Child, Component, Event, EventCtx, Label, Pad},
constant::screen,
display::Icon,
geometry::{Alignment, Insets, Point, Rect},
},
};
use super::super::{
component::{Button, ButtonMsg::Clicked},
constant::WIDTH,
theme::bootloader::{
button_bld, button_bld_menu, text_title, BLD_BG, BUTTON_AREA_START, BUTTON_HEIGHT,
CONTENT_PADDING, CORNER_BUTTON_AREA, MENU32, TEXT_NORMAL, TEXT_WARNING, TITLE_AREA,
},
};
#[repr(u32)]
#[derive(Copy, Clone, ToPrimitive)]
pub enum IntroMsg {
Menu = 1,
Host = 2,
}
pub struct Intro<'a> {
bg: Pad,
title: Child<Label<'a>>,
menu: Child<Button>,
host: Child<Button>,
text: Child<Label<'a>>,
warn: Option<Child<Label<'a>>>,
}
impl<'a> Intro<'a> {
pub fn new(title: TString<'a>, content: TString<'a>, fw_ok: bool) -> Self {
Self {
bg: Pad::with_background(BLD_BG).with_clear(),
title: Child::new(Label::left_aligned(title, text_title(BLD_BG)).vertically_centered()),
menu: Child::new(
Button::with_icon(Icon::new(MENU32))
.styled(button_bld_menu())
.with_expanded_touch_area(Insets::uniform(13)),
),
host: Child::new(Button::with_text("INSTALL FIRMWARE".into()).styled(button_bld())),
text: Child::new(Label::left_aligned(content, TEXT_NORMAL).vertically_centered()),
warn: (!fw_ok).then_some(Child::new(
Label::new("FIRMWARE CORRUPTED".into(), Alignment::Start, TEXT_WARNING)
.vertically_centered(),
)),
}
}
}
impl<'a> Component for Intro<'a> {
type Msg = IntroMsg;
fn place(&mut self, bounds: Rect) -> Rect {
self.bg.place(screen());
self.title.place(TITLE_AREA);
self.menu.place(CORNER_BUTTON_AREA);
self.host.place(Rect::new(
Point::new(CONTENT_PADDING, BUTTON_AREA_START),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START + BUTTON_HEIGHT),
));
if self.warn.is_some() {
self.warn.place(Rect::new(
Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING),
Point::new(
WIDTH - CONTENT_PADDING,
TITLE_AREA.y1 + CONTENT_PADDING + 30,
),
));
self.text.place(Rect::new(
Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING + 30),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING),
));
} else {
self.text.place(Rect::new(
Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING),
));
}
bounds
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
if let Some(Clicked) = self.menu.event(ctx, event) {
return Some(Self::Msg::Menu);
};
if let Some(Clicked) = self.host.event(ctx, event) {
return Some(Self::Msg::Host);
};
None
}
fn paint(&mut self) {
self.bg.paint();
self.title.paint();
self.text.paint();
self.warn.paint();
self.host.paint();
self.menu.paint();
}
#[cfg(feature = "ui_bounds")]
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
self.menu.bounds(sink);
}
}

@ -0,0 +1,117 @@
use crate::{
trezorhal::secbool::{secbool, sectrue},
ui::{
component::{Child, Component, Event, EventCtx, Label, Pad},
constant::{screen, WIDTH},
display::Icon,
geometry::{Insets, Point, Rect},
},
};
use super::super::{
component::{Button, ButtonMsg::Clicked, IconText},
theme::bootloader::{
button_bld, button_bld_menu, text_title, BLD_BG, BUTTON_HEIGHT, CONTENT_PADDING,
CORNER_BUTTON_AREA, CORNER_BUTTON_TOUCH_EXPANSION, FIRE24, REFRESH24, TITLE_AREA, X32,
},
};
const BUTTON_AREA_START: i16 = 56;
const BUTTON_SPACING: i16 = 8;
#[repr(u32)]
#[derive(Copy, Clone, ToPrimitive)]
pub enum MenuMsg {
Close = 0xAABBCCDD,
Reboot = 0x11223344,
FactoryReset = 0x55667788,
}
pub struct Menu {
bg: Pad,
title: Child<Label<'static>>,
close: Child<Button>,
reboot: Child<Button>,
reset: Child<Button>,
}
impl Menu {
pub fn new(firmware_present: secbool) -> Self {
let content_reboot = IconText::new("REBOOT TREZOR", Icon::new(REFRESH24));
let content_reset = IconText::new("FACTORY RESET", Icon::new(FIRE24));
let mut instance = Self {
bg: Pad::with_background(BLD_BG),
title: Child::new(
Label::left_aligned("BOOTLOADER".into(), text_title(BLD_BG)).vertically_centered(),
),
close: Child::new(
Button::with_icon(Icon::new(X32))
.styled(button_bld_menu())
.with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)),
),
reboot: Child::new(
Button::with_icon_and_text(content_reboot)
.styled(button_bld())
.initially_enabled(sectrue == firmware_present),
),
reset: Child::new(Button::with_icon_and_text(content_reset).styled(button_bld())),
};
instance.bg.clear();
instance
}
}
impl Component for Menu {
type Msg = MenuMsg;
fn place(&mut self, bounds: Rect) -> Rect {
self.bg.place(screen());
self.title.place(TITLE_AREA);
self.close.place(CORNER_BUTTON_AREA);
self.reboot.place(Rect::new(
Point::new(CONTENT_PADDING, BUTTON_AREA_START),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START + BUTTON_HEIGHT),
));
self.reset.place(Rect::new(
Point::new(
CONTENT_PADDING,
BUTTON_AREA_START + BUTTON_HEIGHT + BUTTON_SPACING,
),
Point::new(
WIDTH - CONTENT_PADDING,
BUTTON_AREA_START + 2 * BUTTON_HEIGHT + BUTTON_SPACING,
),
));
bounds
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
if let Some(Clicked) = self.close.event(ctx, event) {
return Some(Self::Msg::Close);
}
if let Some(Clicked) = self.reboot.event(ctx, event) {
return Some(Self::Msg::Reboot);
}
if let Some(Clicked) = self.reset.event(ctx, event) {
return Some(Self::Msg::FactoryReset);
}
None
}
fn paint(&mut self) {
self.bg.paint();
self.title.paint();
self.close.paint();
self.reboot.paint();
self.reset.paint();
}
#[cfg(feature = "ui_bounds")]
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
self.close.bounds(sink);
self.reboot.bounds(sink);
self.reset.bounds(sink);
}
}

@ -0,0 +1,325 @@
use heapless::String;
use crate::{
trezorhal::secbool::secbool,
ui::{
component::{connect::Connect, Label},
display::{self, Color, Font, Icon},
geometry::{Offset, Point, Rect},
layout::simplified::{run, show},
},
};
use super::{
bootloader::welcome::Welcome,
component::{
bl_confirm::{Confirm, ConfirmTitle},
Button, ResultScreen, WelcomeScreen,
},
theme::{
bootloader::{
button_bld, button_bld_menu, button_confirm, button_wipe_cancel, button_wipe_confirm,
BLD_BG, BLD_FG, BLD_TITLE_COLOR, BLD_WIPE_COLOR, CHECK24, CHECK40, DOWNLOAD24, FIRE32,
FIRE40, RESULT_FW_INSTALL, RESULT_WIPE, TEXT_BOLD, TEXT_NORMAL, TEXT_WIPE_BOLD,
TEXT_WIPE_NORMAL, WARNING40, WELCOME_COLOR, X24,
},
BACKLIGHT_NORMAL, BLACK, GREEN_LIGHT, GREY, WHITE,
},
ModelMercuryFeatures,
};
use crate::ui::{ui_features::UIFeaturesBootloader, UIFeaturesCommon};
use intro::Intro;
use menu::Menu;
pub mod intro;
pub mod menu;
pub mod welcome;
pub type BootloaderString = String<128>;
const RECONNECT_MESSAGE: &str = "PLEASE RECONNECT\nTHE DEVICE";
const SCREEN: Rect = ModelMercuryFeatures::SCREEN;
const PROGRESS_TEXT_ORIGIN: Point = Point::new(2, 28);
impl ModelMercuryFeatures {
fn screen_progress(
text: &str,
progress: u16,
initialize: bool,
fg_color: Color,
bg_color: Color,
icon: Option<(Icon, Color)>,
center_text: Option<&str>,
) {
let loader_offset: i16 = 19;
let center_text_offset: i16 = 10;
if initialize {
Self::fadeout();
display::rect_fill(SCREEN, bg_color);
}
display::text_left(PROGRESS_TEXT_ORIGIN, text, Font::NORMAL, BLD_FG, bg_color);
display::loader(progress, 19, fg_color, bg_color, icon);
if let Some(center_text) = center_text {
display::text_center(
SCREEN.center() + Offset::y(loader_offset + center_text_offset),
center_text,
Font::NORMAL,
GREY,
bg_color,
);
}
display::refresh();
if initialize {
Self::fadein();
}
}
}
impl UIFeaturesBootloader for ModelMercuryFeatures {
fn screen_welcome() {
let mut frame = Welcome::new();
show(&mut frame, true);
}
fn bld_continue_label(bg_color: Color) {
display::text_center(
Point::new(SCREEN.width() / 2, SCREEN.height() - 5),
"click to continue ...",
Font::NORMAL,
WHITE,
bg_color,
);
}
fn screen_install_success(restart_seconds: u8, initial_setup: bool, complete_draw: bool) {
let mut reboot_msg = BootloaderString::new();
let bg_color = if initial_setup { WELCOME_COLOR } else { BLD_BG };
let fg_color = if initial_setup { GREEN_LIGHT } else { BLD_FG };
if restart_seconds >= 1 {
// in practice, restart_seconds is 5 or less so this is fine
let seconds_char = b'0' + restart_seconds % 10;
unwrap!(reboot_msg.push(seconds_char as char));
let progress = (5 - (restart_seconds as u16)).clamp(0, 5) * 200;
Self::screen_progress(
"Restarting device",
progress,
complete_draw,
fg_color,
bg_color,
None,
Some(reboot_msg.as_str()),
);
} else {
Self::screen_progress(
"Firmware installed",
1000,
complete_draw,
fg_color,
bg_color,
Some((Icon::new(CHECK24), BLD_FG)),
None,
);
}
display::refresh();
}
fn screen_install_fail() {
let mut frame = ResultScreen::new(
&RESULT_FW_INSTALL,
Icon::new(WARNING40),
"Firmware installation was not successful".into(),
Label::centered(RECONNECT_MESSAGE.into(), RESULT_FW_INSTALL.title_style())
.vertically_centered(),
true,
);
show(&mut frame, true);
}
fn screen_install_confirm(
vendor: &str,
version: &str,
fingerprint: &str,
should_keep_seed: bool,
is_newvendor: bool,
version_cmp: i32,
) -> u32 {
let mut version_str: BootloaderString = String::new();
unwrap!(version_str.push_str("Firmware version "));
unwrap!(version_str.push_str(version));
unwrap!(version_str.push_str("\nby "));
unwrap!(version_str.push_str(vendor));
let title_str = if is_newvendor {
"CHANGE FW\nVENDOR"
} else if version_cmp > 0 {
"UPDATE FIRMWARE"
} else if version_cmp == 0 {
"REINSTALL FW"
} else {
"DOWNGRADE FW"
};
let title = Label::left_aligned(title_str.into(), TEXT_BOLD).vertically_centered();
let msg = Label::left_aligned(version_str.as_str().into(), TEXT_NORMAL);
let alert = (!should_keep_seed).then_some(Label::left_aligned(
"SEED WILL BE ERASED!".into(),
TEXT_BOLD,
));
let (left, right) = if should_keep_seed {
let l = Button::with_text("CANCEL".into()).styled(button_bld());
let r = Button::with_text("INSTALL".into()).styled(button_confirm());
(l, r)
} else {
let l = Button::with_icon(Icon::new(X24)).styled(button_bld());
let r = Button::with_icon(Icon::new(CHECK24)).styled(button_confirm());
(l, r)
};
let mut frame = Confirm::new(BLD_BG, left, right, ConfirmTitle::Text(title), msg)
.with_info(
"FW FINGERPRINT".into(),
fingerprint.into(),
button_bld_menu(),
);
if let Some(alert) = alert {
frame = frame.with_alert(alert);
}
run(&mut frame)
}
fn screen_wipe_confirm() -> u32 {
let icon = Icon::new(FIRE40);
let msg = Label::centered(
"Are you sure you want to factory reset the device?".into(),
TEXT_WIPE_NORMAL,
);
let alert = Label::centered("SEED AND FIRMWARE\nWILL BE ERASED!".into(), TEXT_WIPE_BOLD);
let right = Button::with_text("RESET".into()).styled(button_wipe_confirm());
let left = Button::with_text("CANCEL".into()).styled(button_wipe_cancel());
let mut frame = Confirm::new(BLD_WIPE_COLOR, left, right, ConfirmTitle::Icon(icon), msg)
.with_alert(alert);
run(&mut frame)
}
fn screen_unlock_bootloader_confirm() -> u32 {
unimplemented!();
}
fn screen_unlock_bootloader_success() {
unimplemented!();
}
fn screen_menu(firmware_present: secbool) -> u32 {
run(&mut Menu::new(firmware_present))
}
fn screen_intro(bld_version: &str, vendor: &str, version: &str, fw_ok: bool) -> u32 {
let mut title_str: BootloaderString = String::new();
unwrap!(title_str.push_str("BOOTLOADER "));
unwrap!(title_str.push_str(bld_version));
let mut version_str: BootloaderString = String::new();
unwrap!(version_str.push_str("Firmware version "));
unwrap!(version_str.push_str(version));
unwrap!(version_str.push_str("\nby "));
unwrap!(version_str.push_str(vendor));
let mut frame = Intro::new(
title_str.as_str().into(),
version_str.as_str().into(),
fw_ok,
);
run(&mut frame)
}
fn screen_boot_stage_1(fading: bool) {
if fading {
Self::fadeout();
}
display::rect_fill(SCREEN, BLACK);
let mut frame = WelcomeScreen::new();
show(&mut frame, false);
if fading {
Self::fadein();
} else {
display::set_backlight(BACKLIGHT_NORMAL);
}
display::refresh();
}
fn screen_wipe_progress(progress: u16, initialize: bool) {
Self::screen_progress(
"Resetting Trezor",
progress,
initialize,
BLD_FG,
BLD_WIPE_COLOR,
Some((Icon::new(FIRE32), BLD_FG)),
None,
)
}
fn screen_install_progress(progress: u16, initialize: bool, initial_setup: bool) {
let bg_color = if initial_setup { WELCOME_COLOR } else { BLD_BG };
let fg_color = if initial_setup { GREEN_LIGHT } else { BLD_FG };
let icon_color = BLD_FG;
Self::screen_progress(
"Installing firmware",
progress,
initialize,
fg_color,
bg_color,
Some((Icon::new(DOWNLOAD24), icon_color)),
None,
)
}
fn screen_connect(initial_setup: bool) {
let bg = if initial_setup { WELCOME_COLOR } else { BLD_BG };
let mut frame = Connect::new("Waiting for host...", BLD_TITLE_COLOR, bg);
show(&mut frame, true);
}
fn screen_wipe_success() {
let mut frame = ResultScreen::new(
&RESULT_WIPE,
Icon::new(CHECK40),
"Trezor reset\nsuccessfully".into(),
Label::centered(RECONNECT_MESSAGE.into(), RESULT_WIPE.title_style())
.vertically_centered(),
true,
);
show(&mut frame, true);
}
fn screen_wipe_fail() {
let mut frame = ResultScreen::new(
&RESULT_WIPE,
Icon::new(WARNING40),
"Trezor reset was\nnot successful".into(),
Label::centered(RECONNECT_MESSAGE.into(), RESULT_WIPE.title_style())
.vertically_centered(),
true,
);
show(&mut frame, true);
}
}

@ -0,0 +1,64 @@
use crate::ui::{
component::{Component, Event, EventCtx, Never, Pad},
constant::screen,
display::{self, Font},
geometry::{Offset, Point, Rect},
};
use super::super::theme::{BLACK, GREY, WHITE};
const TEXT_ORIGIN: Point = Point::new(0, 105);
const STRIDE: i16 = 22;
pub struct Welcome {
bg: Pad,
}
impl Welcome {
pub fn new() -> Self {
Self {
bg: Pad::with_background(BLACK).with_clear(),
}
}
}
impl Component for Welcome {
type Msg = Never;
fn place(&mut self, bounds: Rect) -> Rect {
self.bg.place(screen());
bounds
}
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
None
}
fn paint(&mut self) {
let at_width = Font::NORMAL.text_width("at ");
self.bg.paint();
display::text_left(TEXT_ORIGIN, "Get started", Font::NORMAL, GREY, BLACK);
display::text_left(
TEXT_ORIGIN + Offset::y(STRIDE),
"with your Trezor",
Font::NORMAL,
GREY,
BLACK,
);
display::text_left(
TEXT_ORIGIN + Offset::y(2 * STRIDE),
"at",
Font::NORMAL,
GREY,
BLACK,
);
display::text_left(
TEXT_ORIGIN + Offset::new(at_width, 2 * STRIDE),
"trezor.io/start",
Font::NORMAL,
WHITE,
BLACK,
);
}
}

@ -0,0 +1,254 @@
use crate::{
strutil::TString,
ui::{
component::{Child, Component, ComponentExt, Event, EventCtx, Label, Pad},
constant,
constant::screen,
display::{Color, Icon},
geometry::{Alignment2D, Insets, Offset, Point, Rect},
},
};
use super::{
constant::WIDTH,
theme::{
bootloader::{
text_fingerprint, text_title, BUTTON_AREA_START, BUTTON_HEIGHT, CONTENT_PADDING,
CORNER_BUTTON_AREA, CORNER_BUTTON_TOUCH_EXPANSION, INFO32, TITLE_AREA, X32,
},
WHITE,
},
Button,
ButtonMsg::Clicked,
ButtonStyleSheet,
};
const ICON_TOP: i16 = 17;
const CONTENT_START: i16 = 72;
const CONTENT_AREA: Rect = Rect::new(
Point::new(CONTENT_PADDING, CONTENT_START),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING),
);
#[derive(Copy, Clone, ToPrimitive)]
pub enum ConfirmMsg {
Cancel = 1,
Confirm = 2,
}
pub enum ConfirmTitle {
Text(Label<'static>),
Icon(Icon),
}
pub struct ConfirmInfo<'a> {
pub title: Child<Label<'a>>,
pub text: Child<Label<'a>>,
pub info_button: Child<Button>,
pub close_button: Child<Button>,
}
pub struct Confirm<'a> {
bg: Pad,
content_pad: Pad,
bg_color: Color,
title: ConfirmTitle,
message: Child<Label<'a>>,
alert: Option<Child<Label<'static>>>,
left_button: Child<Button>,
right_button: Child<Button>,
info: Option<ConfirmInfo<'a>>,
show_info: bool,
}
impl<'a> Confirm<'a> {
pub fn new(
bg_color: Color,
left_button: Button,
right_button: Button,
title: ConfirmTitle,
message: Label<'a>,
) -> Self {
Self {
bg: Pad::with_background(bg_color).with_clear(),
content_pad: Pad::with_background(bg_color),
bg_color,
title,
message: Child::new(message.vertically_centered()),
left_button: Child::new(left_button),
right_button: Child::new(right_button),
alert: None,
info: None,
show_info: false,
}
}
pub fn with_alert(mut self, alert: Label<'static>) -> Self {
self.alert = Some(Child::new(alert.vertically_centered()));
self
}
pub fn with_info(
mut self,
title: TString<'a>,
text: TString<'a>,
menu_button: ButtonStyleSheet,
) -> Self {
self.info = Some(ConfirmInfo {
title: Child::new(
Label::left_aligned(title, text_title(self.bg_color)).vertically_centered(),
),
text: Child::new(
Label::left_aligned(text, text_fingerprint(self.bg_color)).vertically_centered(),
),
info_button: Child::new(
Button::with_icon(Icon::new(INFO32))
.styled(menu_button)
.with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)),
),
close_button: Child::new(
Button::with_icon(Icon::new(X32))
.styled(menu_button)
.with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)),
),
});
self
}
}
impl Component for Confirm<'_> {
type Msg = ConfirmMsg;
fn place(&mut self, bounds: Rect) -> Rect {
self.bg.place(constant::screen());
self.content_pad.place(Rect::new(
Point::zero(),
Point::new(WIDTH, BUTTON_AREA_START),
));
let mut content_area = CONTENT_AREA;
match &mut self.title {
ConfirmTitle::Icon(_) => {
// XXX HACK: when icon is present (wipe device screen), we know the
// string is long and we need to go outside the content padding
content_area = content_area.inset(Insets::sides(-CONTENT_PADDING));
}
ConfirmTitle::Text(title) => {
title.place(TITLE_AREA);
}
};
if self.alert.is_some() {
let message_height = self.message.inner().text_height(content_area.width());
self.message.place(Rect::from_top_left_and_size(
content_area.top_left(),
Offset::new(content_area.width(), message_height),
));
let (_, alert_bounds) = content_area.split_top(message_height);
self.alert.place(alert_bounds);
} else {
self.message.place(content_area);
}
let button_size = Offset::new((WIDTH - 3 * CONTENT_PADDING) / 2, BUTTON_HEIGHT);
self.left_button.place(Rect::from_top_left_and_size(
Point::new(CONTENT_PADDING, BUTTON_AREA_START),
button_size,
));
self.right_button.place(Rect::from_top_left_and_size(
Point::new(2 * CONTENT_PADDING + button_size.x, BUTTON_AREA_START),
button_size,
));
if let Some(info) = self.info.as_mut() {
info.info_button.place(CORNER_BUTTON_AREA);
info.close_button.place(CORNER_BUTTON_AREA);
info.title.place(TITLE_AREA);
info.text.place(Rect::new(
Point::new(CONTENT_PADDING, TITLE_AREA.y1),
Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START),
));
}
bounds
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
if let Some(info) = self.info.as_mut() {
if self.show_info {
if let Some(Clicked) = info.close_button.event(ctx, event) {
self.show_info = false;
self.content_pad.clear();
self.message.request_complete_repaint(ctx);
self.alert.request_complete_repaint(ctx);
return None;
}
} else if let Some(Clicked) = info.info_button.event(ctx, event) {
self.show_info = true;
info.text.request_complete_repaint(ctx);
info.title.request_complete_repaint(ctx);
self.content_pad.clear();
return None;
}
}
if let Some(Clicked) = self.left_button.event(ctx, event) {
return Some(Self::Msg::Cancel);
};
if let Some(Clicked) = self.right_button.event(ctx, event) {
return Some(Self::Msg::Confirm);
};
None
}
fn paint(&mut self) {
self.bg.paint();
self.content_pad.paint();
if let Some(info) = self.info.as_mut() {
if self.show_info {
info.close_button.paint();
info.title.paint();
info.text.paint();
self.left_button.paint();
self.right_button.paint();
// short-circuit before painting the main components
return;
} else {
info.info_button.paint();
// pass through to the rest of the paint
}
}
self.message.paint();
self.alert.paint();
self.left_button.paint();
self.right_button.paint();
match &mut self.title {
ConfirmTitle::Text(label) => label.paint(),
ConfirmTitle::Icon(icon) => {
icon.draw(
Point::new(screen().center().x, ICON_TOP),
Alignment2D::TOP_CENTER,
WHITE,
self.bg_color,
);
}
}
}
#[cfg(feature = "ui_bounds")]
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
self.left_button.bounds(sink);
self.right_button.bounds(sink);
}
}
#[cfg(feature = "ui_debug")]
impl crate::trace::Trace for Confirm<'_> {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("BlConfirm");
}
}

@ -0,0 +1,440 @@
#[cfg(feature = "haptic")]
use crate::trezorhal::haptic::{play, HapticEffect};
use crate::{
strutil::TString,
time::Duration,
ui::{
component::{Component, Event, EventCtx, TimerToken},
display::{self, toif::Icon, Color, Font},
event::TouchEvent,
geometry::{Alignment2D, Insets, Offset, Point, Rect},
},
};
use super::theme;
pub enum ButtonMsg {
Pressed,
Released,
Clicked,
LongPressed,
}
pub struct Button {
area: Rect,
touch_expand: Option<Insets>,
content: ButtonContent,
styles: ButtonStyleSheet,
state: State,
long_press: Option<Duration>,
long_timer: Option<TimerToken>,
}
impl Button {
/// Offsets the baseline of the button text either up (negative) or down
/// (positive).
pub const BASELINE_OFFSET: i16 = -2;
pub const fn new(content: ButtonContent) -> Self {
Self {
content,
area: Rect::zero(),
touch_expand: None,
styles: theme::button_default(),
state: State::Initial,
long_press: None,
long_timer: None,
}
}
pub const fn with_text(text: TString<'static>) -> Self {
Self::new(ButtonContent::Text(text))
}
pub const fn with_icon(icon: Icon) -> Self {
Self::new(ButtonContent::Icon(icon))
}
pub const fn with_icon_and_text(content: IconText) -> Self {
Self::new(ButtonContent::IconAndText(content))
}
pub const fn with_icon_blend(bg: Icon, fg: Icon, fg_offset: Offset) -> Self {
Self::new(ButtonContent::IconBlend(bg, fg, fg_offset))
}
pub const fn empty() -> Self {
Self::new(ButtonContent::Empty)
}
pub const fn styled(mut self, styles: ButtonStyleSheet) -> Self {
self.styles = styles;
self
}
pub const fn with_expanded_touch_area(mut self, expand: Insets) -> Self {
self.touch_expand = Some(expand);
self
}
pub fn with_long_press(mut self, duration: Duration) -> Self {
self.long_press = Some(duration);
self
}
pub fn enable_if(&mut self, ctx: &mut EventCtx, enabled: bool) {
if enabled {
self.enable(ctx);
} else {
self.disable(ctx);
}
}
pub fn initially_enabled(mut self, enabled: bool) -> Self {
if !enabled {
self.state = State::Disabled;
}
self
}
pub fn enable(&mut self, ctx: &mut EventCtx) {
self.set(ctx, State::Initial)
}
pub fn disable(&mut self, ctx: &mut EventCtx) {
self.set(ctx, State::Disabled)
}
pub fn is_enabled(&self) -> bool {
matches!(
self.state,
State::Initial | State::Pressed | State::Released
)
}
pub fn is_disabled(&self) -> bool {
matches!(self.state, State::Disabled)
}
pub fn set_content(&mut self, ctx: &mut EventCtx, content: ButtonContent) {
if self.content != content {
self.content = content;
ctx.request_paint();
}
}
pub fn content(&self) -> &ButtonContent {
&self.content
}
pub fn set_stylesheet(&mut self, ctx: &mut EventCtx, styles: ButtonStyleSheet) {
if self.styles != styles {
self.styles = styles;
ctx.request_paint();
}
}
pub fn style(&self) -> &ButtonStyle {
match self.state {
State::Initial | State::Released => self.styles.normal,
State::Pressed => self.styles.active,
State::Disabled => self.styles.disabled,
}
}
pub fn area(&self) -> Rect {
self.area
}
fn set(&mut self, ctx: &mut EventCtx, state: State) {
if self.state != state {
self.state = state;
ctx.request_paint();
}
}
pub fn paint_background(&self, style: &ButtonStyle) {
match &self.content {
ButtonContent::IconBlend(_, _, _) => {}
_ => {
if style.border_width > 0 {
// Paint the border and a smaller background on top of it.
display::rect_fill_rounded(
self.area,
style.border_color,
style.background_color,
style.border_radius,
);
display::rect_fill_rounded(
self.area.inset(Insets::uniform(style.border_width)),
style.button_color,
style.border_color,
style.border_radius,
);
} else {
// We do not need to draw an explicit border in this case, just a
// bigger background.
display::rect_fill_rounded(
self.area,
style.button_color,
style.background_color,
style.border_radius,
);
}
}
}
}
pub fn paint_content(&self, style: &ButtonStyle) {
match &self.content {
ButtonContent::Empty => {}
ButtonContent::Text(text) => {
let width = text.map(|c| style.font.text_width(c));
let height = style.font.text_height();
let start_of_baseline = self.area.center()
+ Offset::new(-width / 2, height / 2)
+ Offset::y(Self::BASELINE_OFFSET);
text.map(|text| {
display::text_left(
start_of_baseline,
text,
style.font,
style.text_color,
style.button_color,
);
});
}
ButtonContent::Icon(icon) => {
icon.draw(
self.area.center(),
Alignment2D::CENTER,
style.text_color,
style.button_color,
);
}
ButtonContent::IconAndText(child) => {
child.paint(self.area, self.style(), Self::BASELINE_OFFSET);
}
ButtonContent::IconBlend(bg, fg, offset) => display::icon_over_icon(
Some(self.area),
(*bg, Offset::zero(), style.button_color),
(*fg, *offset, style.text_color),
style.background_color,
),
}
}
}
impl Component for Button {
type Msg = ButtonMsg;
fn place(&mut self, bounds: Rect) -> Rect {
self.area = bounds;
self.area
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
let touch_area = if let Some(expand) = self.touch_expand {
self.area.outset(expand)
} else {
self.area
};
match event {
Event::Touch(TouchEvent::TouchStart(pos)) => {
match self.state {
State::Disabled => {
// Do nothing.
}
_ => {
// Touch started in our area, transform to `Pressed` state.
if touch_area.contains(pos) {
#[cfg(feature = "haptic")]
play(HapticEffect::ButtonPress);
self.set(ctx, State::Pressed);
if let Some(duration) = self.long_press {
self.long_timer = Some(ctx.request_timer(duration));
}
return Some(ButtonMsg::Pressed);
}
}
}
}
Event::Touch(TouchEvent::TouchMove(pos)) => {
match self.state {
State::Pressed if !touch_area.contains(pos) => {
// Touch is leaving our area, transform to `Released` state.
self.set(ctx, State::Released);
return Some(ButtonMsg::Released);
}
_ => {
// Do nothing.
}
}
}
Event::Touch(TouchEvent::TouchEnd(pos)) => {
match self.state {
State::Initial | State::Disabled => {
// Do nothing.
}
State::Pressed if touch_area.contains(pos) => {
// Touch finished in our area, we got clicked.
self.set(ctx, State::Initial);
return Some(ButtonMsg::Clicked);
}
_ => {
// Touch finished outside our area.
self.set(ctx, State::Initial);
self.long_timer = None;
}
}
}
Event::Timer(token) => {
if self.long_timer == Some(token) {
self.long_timer = None;
if matches!(self.state, State::Pressed) {
#[cfg(feature = "haptic")]
play(HapticEffect::ButtonPress);
self.set(ctx, State::Initial);
return Some(ButtonMsg::LongPressed);
}
}
}
_ => {}
};
None
}
fn paint(&mut self) {
let style = self.style();
self.paint_background(style);
self.paint_content(style);
}
#[cfg(feature = "ui_bounds")]
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
sink(self.area);
}
}
#[cfg(feature = "ui_debug")]
impl crate::trace::Trace for Button {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("Button");
match &self.content {
ButtonContent::Empty => {}
ButtonContent::Text(text) => t.string("text", *text),
ButtonContent::Icon(_) => t.bool("icon", true),
ButtonContent::IconAndText(content) => {
t.string("text", content.text.into());
t.bool("icon", true);
}
ButtonContent::IconBlend(_, _, _) => t.bool("icon", true),
}
}
}
#[derive(PartialEq, Eq)]
enum State {
Initial,
Pressed,
Released,
Disabled,
}
#[derive(PartialEq, Eq)]
pub enum ButtonContent {
Empty,
Text(TString<'static>),
Icon(Icon),
IconAndText(IconText),
IconBlend(Icon, Icon, Offset),
}
#[derive(PartialEq, Eq, Clone, Copy)]
pub struct ButtonStyleSheet {
pub normal: &'static ButtonStyle,
pub active: &'static ButtonStyle,
pub disabled: &'static ButtonStyle,
}
#[derive(PartialEq, Eq)]
pub struct ButtonStyle {
pub font: Font,
pub text_color: Color,
pub button_color: Color,
pub background_color: Color,
pub border_color: Color,
pub border_radius: u8,
pub border_width: i16,
}
#[derive(Clone, Copy)]
pub enum CancelInfoConfirmMsg {
Cancelled,
Info,
Confirmed,
}
#[derive(PartialEq, Eq)]
pub struct IconText {
text: &'static str,
icon: Icon,
}
impl IconText {
const ICON_SPACE: i16 = 46;
const ICON_MARGIN: i16 = 4;
const TEXT_MARGIN: i16 = 6;
pub fn new(text: &'static str, icon: Icon) -> Self {
Self { text, icon }
}
pub fn paint(&self, area: Rect, style: &ButtonStyle, baseline_offset: i16) {
let width = style.font.text_width(self.text);
let height = style.font.text_height();
let mut use_icon = false;
let mut use_text = false;
let mut icon_pos = Point::new(
area.top_left().x + ((Self::ICON_SPACE + Self::ICON_MARGIN) / 2),
area.center().y,
);
let mut text_pos =
area.center() + Offset::new(-width / 2, height / 2) + Offset::y(baseline_offset);
if area.width() > (Self::ICON_SPACE + Self::TEXT_MARGIN + width) {
//display both icon and text
text_pos = Point::new(area.top_left().x + Self::ICON_SPACE, text_pos.y);
use_text = true;
use_icon = true;
} else if area.width() > (width + Self::TEXT_MARGIN) {
use_text = true;
} else {
//if we can't fit the text, retreat to centering the icon
icon_pos = area.center();
use_icon = true;
}
if use_text {
display::text_left(
text_pos,
self.text,
style.font,
style.text_color,
style.button_color,
);
}
if use_icon {
self.icon.draw(
icon_pos,
Alignment2D::CENTER,
style.text_color,
style.button_color,
);
}
}
}

@ -0,0 +1,92 @@
use crate::{
strutil::TString,
ui::{
component::{Child, Component, Event, EventCtx, Label, Never, Pad},
constant::screen,
geometry::{Alignment2D, Point, Rect},
},
};
use super::{
constant::WIDTH,
theme::{FATAL_ERROR_COLOR, ICON_WARNING40, RESULT_FOOTER_START, RESULT_PADDING, WHITE},
ResultFooter, ResultStyle,
};
const ICON_TOP: i16 = 23;
const TITLE_AREA_START: i16 = 70;
const MESSAGE_AREA_START: i16 = 116;
#[cfg(feature = "bootloader")]
const STYLE: &ResultStyle = &crate::ui::model_mercury::theme::bootloader::RESULT_WIPE;
#[cfg(not(feature = "bootloader"))]
const STYLE: &ResultStyle = &super::theme::RESULT_ERROR;
pub struct ErrorScreen<'a> {
bg: Pad,
title: Child<Label<'a>>,
message: Child<Label<'a>>,
footer: Child<ResultFooter<'a>>,
}
impl<'a> ErrorScreen<'a> {
pub fn new(title: TString<'a>, message: TString<'a>, footer: TString<'a>) -> Self {
let title = Label::centered(title, STYLE.title_style());
let message = Label::centered(message, STYLE.message_style());
let footer = ResultFooter::new(
Label::centered(footer, STYLE.title_style()).vertically_centered(),
STYLE,
);
Self {
bg: Pad::with_background(FATAL_ERROR_COLOR).with_clear(),
title: Child::new(title),
message: Child::new(message),
footer: Child::new(footer),
}
}
}
impl<'a> Component for ErrorScreen<'a> {
type Msg = Never;
fn place(&mut self, _bounds: Rect) -> Rect {
self.bg.place(screen());
let title_area = Rect::new(
Point::new(RESULT_PADDING, TITLE_AREA_START),
Point::new(WIDTH - RESULT_PADDING, MESSAGE_AREA_START),
);
self.title.place(title_area);
let message_area = Rect::new(
Point::new(RESULT_PADDING, MESSAGE_AREA_START),
Point::new(WIDTH - RESULT_PADDING, RESULT_FOOTER_START),
);
self.message.place(message_area);
let (_, bottom_area) = ResultFooter::<'a>::split_bounds();
self.footer.place(bottom_area);
screen()
}
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
None
}
fn paint(&mut self) {
self.bg.paint();
let icon = ICON_WARNING40;
icon.draw(
Point::new(screen().center().x, ICON_TOP),
Alignment2D::TOP_CENTER,
WHITE,
FATAL_ERROR_COLOR,
);
self.title.paint();
self.message.paint();
self.footer.paint();
}
}

@ -0,0 +1,204 @@
use super::theme;
use crate::{
strutil::TString,
ui::{
component::{
base::ComponentExt, label::Label, text::TextStyle, Child, Component, Event, EventCtx,
},
display::Icon,
geometry::{Alignment, Insets, Offset, Rect},
},
};
use super::{Button, ButtonMsg, CancelInfoConfirmMsg};
pub struct Frame<T> {
border: Insets,
title: Child<Label<'static>>,
subtitle: Option<Child<Label<'static>>>,
button: Option<Child<Button>>,
button_msg: CancelInfoConfirmMsg,
content: Child<T>,
}
pub enum FrameMsg<T> {
Content(T),
Button(CancelInfoConfirmMsg),
}
impl<T> Frame<T>
where
T: Component,
{
pub fn new(
style: TextStyle,
alignment: Alignment,
title: TString<'static>,
content: T,
) -> Self {
Self {
title: Child::new(Label::new(title, alignment, style)),
subtitle: None,
border: theme::borders(),
button: None,
button_msg: CancelInfoConfirmMsg::Cancelled,
content: Child::new(content),
}
}
pub fn left_aligned(style: TextStyle, title: TString<'static>, content: T) -> Self {
Self::new(style, Alignment::Start, title, content)
}
pub fn right_aligned(style: TextStyle, title: TString<'static>, content: T) -> Self {
Self::new(style, Alignment::End, title, content)
}
pub fn centered(style: TextStyle, title: TString<'static>, content: T) -> Self {
Self::new(style, Alignment::Center, title, content)
}
pub fn with_border(mut self, border: Insets) -> Self {
self.border = border;
self
}
pub fn with_subtitle(mut self, style: TextStyle, subtitle: TString<'static>) -> Self {
self.subtitle = Some(Child::new(Label::new(
subtitle,
self.title.inner().alignment(),
style,
)));
self
}
fn with_button(mut self, icon: Icon, msg: CancelInfoConfirmMsg) -> Self {
let touch_area = Insets {
left: self.border.left * 4,
bottom: self.border.bottom * 4,
..self.border
};
self.button = Some(Child::new(
Button::with_icon(icon)
.with_expanded_touch_area(touch_area)
.styled(theme::button_moreinfo()),
));
self.button_msg = msg;
self
}
pub fn with_cancel_button(self) -> Self {
self.with_button(theme::ICON_CORNER_CANCEL, CancelInfoConfirmMsg::Cancelled)
}
pub fn with_info_button(self) -> Self {
self.with_button(theme::ICON_CORNER_INFO, CancelInfoConfirmMsg::Info)
}
pub fn inner(&self) -> &T {
self.content.inner()
}
pub fn update_title(&mut self, ctx: &mut EventCtx, new_title: TString<'static>) {
self.title.mutate(ctx, |ctx, t| {
t.set_text(new_title);
t.request_complete_repaint(ctx)
})
}
pub fn update_content<F, R>(&mut self, ctx: &mut EventCtx, update_fn: F) -> R
where
F: Fn(&mut T) -> R,
{
self.content.mutate(ctx, |ctx, c| {
let res = update_fn(c);
c.request_complete_repaint(ctx);
res
})
}
}
impl<T> Component for Frame<T>
where
T: Component,
{
type Msg = FrameMsg<T::Msg>;
fn place(&mut self, bounds: Rect) -> Rect {
const TITLE_SPACE: i16 = theme::BUTTON_SPACING;
let bounds = bounds.inset(self.border);
// Allowing for little longer titles to fit in
const TITLE_EXTRA_SPACE: Insets = Insets::right(2);
if let Some(b) = &mut self.button {
let button_side = theme::CORNER_BUTTON_SIDE;
let (header_area, button_area) = bounds.split_right(button_side);
let (button_area, _) = button_area.split_top(button_side);
b.place(button_area);
let title_area = self.title.place(header_area.outset(TITLE_EXTRA_SPACE));
let remaining = header_area.inset(Insets::top(title_area.height()));
let subtitle_area = self.subtitle.place(remaining);
let title_height = title_area.height() + subtitle_area.height();
let header_height = title_height.max(button_side);
if title_height < button_side {
self.title
.place(title_area.translate(Offset::y((button_side - title_height) / 2)));
self.subtitle
.place(subtitle_area.translate(Offset::y((button_side - title_height) / 2)));
}
let content_area = bounds.inset(Insets::top(header_height + TITLE_SPACE));
self.content.place(content_area);
} else {
let title_area = self.title.place(bounds.outset(TITLE_EXTRA_SPACE));
let remaining = bounds.inset(Insets::top(title_area.height()));
let subtitle_area = self.subtitle.place(remaining);
let remaining = remaining.inset(Insets::top(subtitle_area.height()));
let content_area = remaining.inset(Insets::top(TITLE_SPACE));
self.content.place(content_area);
}
bounds
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
self.title.event(ctx, event);
self.subtitle.event(ctx, event);
if let Some(ButtonMsg::Clicked) = self.button.event(ctx, event) {
return Some(FrameMsg::Button(self.button_msg));
}
self.content.event(ctx, event).map(FrameMsg::Content)
}
fn paint(&mut self) {
self.title.paint();
self.subtitle.paint();
self.button.paint();
self.content.paint();
}
#[cfg(feature = "ui_bounds")]
fn bounds(&self, sink: &mut dyn FnMut(Rect)) {
self.title.bounds(sink);
self.subtitle.bounds(sink);
self.button.bounds(sink);
self.content.bounds(sink);
}
}
#[cfg(feature = "ui_debug")]
impl<T> crate::trace::Trace for Frame<T>
where
T: crate::trace::Trace,
{
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("Frame");
t.child("title", &self.title);
t.child("content", &self.content);
if let Some(subtitle) = &self.subtitle {
t.child("subtitle", subtitle);
}
if let Some(button) = &self.button {
t.child("button", button);
}
}
}

@ -0,0 +1,253 @@
#[cfg(feature = "haptic")]
use crate::trezorhal::haptic::{play, HapticEffect};
use crate::{
time::{Duration, Instant},
ui::{
animation::Animation,
component::{Component, Event, EventCtx, Pad},
display::{self, toif::Icon, Color},
geometry::{Offset, Rect},
util::animation_disabled,
},
};
use super::{constant, theme};
const GROWING_DURATION_MS: u32 = 1000;
const SHRINKING_DURATION_MS: u32 = 500;
pub enum LoaderMsg {
GrownCompletely,
ShrunkCompletely,
}
enum State {
Initial,
Growing(Animation<u16>),
Shrinking(Animation<u16>),
}
pub struct Loader {
pub pad: Pad,
state: State,
growing_duration: Duration,
shrinking_duration: Duration,
styles: LoaderStyleSheet,
offset_y: i16,
}
impl Loader {
pub const SIZE: Offset = Offset::new(120, 120);
pub fn new() -> Self {
let styles = theme::loader_default();
Self::with_styles(styles)
}
pub fn with_lock_icon() -> Self {
let styles = theme::loader_lock_icon();
Self::with_styles(styles)
}
pub fn with_styles(styles: LoaderStyleSheet) -> Self {
Self {
pad: Pad::with_background(styles.normal.background_color),
state: State::Initial,
growing_duration: Duration::from_millis(GROWING_DURATION_MS),
shrinking_duration: Duration::from_millis(SHRINKING_DURATION_MS),
styles,
offset_y: 0,
}
}
pub fn with_durations(
mut self,
growing_duration: Duration,
shrinking_duration: Duration,
) -> Self {
self.growing_duration = growing_duration;
self.shrinking_duration = shrinking_duration;
self
}
pub fn start_growing(&mut self, ctx: &mut EventCtx, now: Instant) {
let mut anim = Animation::new(
display::LOADER_MIN,
display::LOADER_MAX,
self.growing_duration,
now,
);
if let State::Shrinking(shrinking) = &self.state {
anim.seek_to_value(shrinking.value(now));
}
self.state = State::Growing(anim);
// The animation is starting, request an animation frame event.
ctx.request_anim_frame();
// We don't have to wait for the animation frame event with the first paint,
// let's do that now.
ctx.request_paint();
}
pub fn start_shrinking(&mut self, ctx: &mut EventCtx, now: Instant) {
let mut anim = Animation::new(
display::LOADER_MAX,
display::LOADER_MIN,
self.shrinking_duration,
now,
);
if let State::Growing(growing) = &self.state {
anim.seek_to_value(display::LOADER_MAX.saturating_sub(growing.value(now)));
}
self.state = State::Shrinking(anim);
// Request anim frame as the animation may not be running, e.g. when already
// grown completely.
ctx.request_anim_frame();
// We don't have to wait for the animation frame event with next paint,
// let's do that now.
ctx.request_paint();
}
pub fn reset(&mut self) {
self.state = State::Initial;
}
pub fn animation(&self) -> Option<&Animation<u16>> {
match &self.state {
State::Initial => None,
State::Growing(a) | State::Shrinking(a) => Some(a),
}
}
pub fn progress(&self, now: Instant) -> Option<u16> {
self.animation().map(|a| a.value(now))
}
pub fn is_animating(&self) -> bool {
self.animation().is_some()
}
pub fn is_completely_grown(&self, now: Instant) -> bool {
matches!(self.progress(now), Some(display::LOADER_MAX))
}
pub fn is_completely_shrunk(&self, now: Instant) -> bool {
matches!(self.progress(now), Some(display::LOADER_MIN))
}
}
impl Component for Loader {
type Msg = LoaderMsg;
fn place(&mut self, bounds: Rect) -> Rect {
// Current loader API only takes Y-offset relative to screen center, which we
// compute from the bounds center point.
let screen_center = constant::screen().center();
self.offset_y = bounds.center().y - screen_center.y;
// FIXME: avoid umlauts rendering outside bounds
let mut bounds_up_to_top = bounds;
bounds_up_to_top.y0 = 0;
self.pad.place(bounds_up_to_top);
Rect::from_center_and_size(bounds.center(), Self::SIZE)
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
let now = Instant::now();
if let Event::Timer(EventCtx::ANIM_FRAME_TIMER) = event {
if self.is_animating() {
// We have something to paint, so request to be painted in the next pass.
if !animation_disabled() {
ctx.request_paint();
}
if self.is_completely_grown(now) {
#[cfg(feature = "haptic")]
play(HapticEffect::HoldToConfirm);
return Some(LoaderMsg::GrownCompletely);
} else if self.is_completely_shrunk(now) {
return Some(LoaderMsg::ShrunkCompletely);
} else {
// There is further progress in the animation, request an animation frame event.
ctx.request_anim_frame();
}
}
}
None
}
fn paint(&mut self) {
// TODO: Consider passing the current instant along with the event -- that way,
// we could synchronize painting across the component tree. Also could be useful
// in automated tests.
// In practice, taking the current instant here is more precise in case some
// other component in the tree takes a long time to draw.
let now = Instant::now();
if let Some(progress) = self.progress(now) {
let style = if progress < display::LOADER_MAX {
self.styles.normal
} else {
self.styles.active
};
self.pad.paint();
display::loader(
progress,
self.offset_y,
style.loader_color,
style.background_color,
style.icon,
);
}
}
}
pub struct LoaderStyleSheet {
pub normal: &'static LoaderStyle,
pub active: &'static LoaderStyle,
}
pub struct LoaderStyle {
pub icon: Option<(Icon, Color)>,
pub loader_color: Color,
pub background_color: Color,
}
#[cfg(feature = "ui_debug")]
impl crate::trace::Trace for Loader {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("Loader");
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn loader_yields_expected_progress() {
let mut ctx = EventCtx::new();
let mut l = Loader::new();
let t = Instant::now();
assert_eq!(l.progress(t), None);
l.start_growing(&mut ctx, t);
assert_eq!(l.progress(t), Some(0));
let t = add_millis(t, 500);
assert_eq!(l.progress(t), Some(500));
l.start_shrinking(&mut ctx, t);
assert_eq!(l.progress(t), Some(500));
let t = add_millis(t, 125);
assert_eq!(l.progress(t), Some(250));
let t = add_millis(t, 125);
assert_eq!(l.progress(t), Some(0));
}
fn add_millis(inst: Instant, millis: u32) -> Instant {
inst.checked_add(Duration::from_millis(millis)).unwrap()
}
}

@ -0,0 +1,18 @@
pub mod bl_confirm;
mod button;
mod error;
mod frame;
mod loader;
mod result;
mod welcome_screen;
pub use button::{
Button, ButtonContent, ButtonMsg, ButtonStyle, ButtonStyleSheet, CancelInfoConfirmMsg, IconText,
};
pub use error::ErrorScreen;
pub use frame::{Frame, FrameMsg};
pub use loader::{Loader, LoaderMsg, LoaderStyle, LoaderStyleSheet};
pub use result::{ResultFooter, ResultScreen, ResultStyle};
pub use welcome_screen::WelcomeScreen;
use super::{constant, theme};

@ -0,0 +1,168 @@
use crate::{
strutil::TString,
ui::{
component::{text::TextStyle, Child, Component, Event, EventCtx, Label, Never, Pad},
constant::screen,
display::{self, Color, Font, Icon},
geometry::{Alignment2D, Insets, Offset, Point, Rect},
},
};
use super::{
constant::WIDTH,
theme::{FG, RESULT_FOOTER_START, RESULT_PADDING},
};
const MESSAGE_AREA_START: i16 = 97;
const ICON_CENTER_Y: i16 = 62;
pub struct ResultStyle {
pub fg_color: Color,
pub bg_color: Color,
pub divider_color: Color,
}
impl ResultStyle {
pub const fn new(fg_color: Color, bg_color: Color, divider_color: Color) -> Self {
Self {
fg_color,
bg_color,
divider_color,
}
}
pub const fn message_style(&self) -> TextStyle {
TextStyle::new(Font::NORMAL, self.fg_color, self.bg_color, FG, FG)
}
pub const fn title_style(&self) -> TextStyle {
TextStyle::new(Font::BOLD, self.fg_color, self.bg_color, FG, FG)
}
}
pub struct ResultFooter<'a> {
style: &'a ResultStyle,
text: Label<'a>,
area: Rect,
}
impl<'a> ResultFooter<'a> {
pub fn new(text: Label<'a>, style: &'a ResultStyle) -> Self {
Self {
style,
text,
area: Rect::zero(),
}
}
}
impl ResultFooter<'_> {
pub const fn split_bounds() -> (Rect, Rect) {
let main_area = Rect::new(
Point::new(RESULT_PADDING, 0),
Point::new(WIDTH - RESULT_PADDING, RESULT_FOOTER_START),
);
let footer_area = Rect::new(
Point::new(RESULT_PADDING, RESULT_FOOTER_START),
Point::new(WIDTH - RESULT_PADDING, screen().height()),
);
(main_area, footer_area)
}
}
impl Component for ResultFooter<'_> {
type Msg = Never;
fn place(&mut self, bounds: Rect) -> Rect {
self.area = bounds;
self.text.place(bounds);
bounds
}
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
None
}
fn paint(&mut self) {
// divider line
let bar = Rect::from_center_and_size(
Point::new(self.area.center().x, self.area.y0),
Offset::new(self.area.width(), 1),
);
display::rect_fill(bar, self.style.divider_color);
// footer text
self.text.paint();
}
}
pub struct ResultScreen<'a> {
bg: Pad,
footer_pad: Pad,
style: &'a ResultStyle,
icon: Icon,
message: Child<Label<'a>>,
footer: Child<ResultFooter<'a>>,
}
impl<'a> ResultScreen<'a> {
pub fn new(
style: &'a ResultStyle,
icon: Icon,
message: TString<'a>,
footer: Label<'a>,
complete_draw: bool,
) -> Self {
let mut instance = Self {
bg: Pad::with_background(style.bg_color),
footer_pad: Pad::with_background(style.bg_color),
style,
icon,
message: Child::new(Label::centered(message, style.message_style())),
footer: Child::new(ResultFooter::new(footer, style)),
};
if complete_draw {
instance.bg.clear();
} else {
instance.footer_pad.clear();
}
instance
}
}
impl<'a> Component for ResultScreen<'a> {
type Msg = Never;
fn place(&mut self, _bounds: Rect) -> Rect {
self.bg.place(screen());
let (main_area, footer_area) = ResultFooter::split_bounds();
self.footer_pad.place(footer_area);
self.footer.place(footer_area);
let message_area = main_area.inset(Insets::top(MESSAGE_AREA_START));
self.message.place(message_area);
screen()
}
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
None
}
fn paint(&mut self) {
self.bg.paint();
self.footer_pad.paint();
self.icon.draw(
Point::new(screen().center().x, ICON_CENTER_Y),
Alignment2D::CENTER,
self.style.fg_color,
self.style.bg_color,
);
self.message.paint();
self.footer.paint();
}
}

@ -0,0 +1,62 @@
use crate::ui::{
component::{Component, Event, EventCtx, Never},
display,
geometry::{Alignment2D, Offset, Rect},
};
use super::theme;
const TEXT_BOTTOM_MARGIN: i16 = 54;
const ICON_TOP_MARGIN: i16 = 48;
#[cfg(not(feature = "bootloader"))]
const MODEL_NAME_FONT: display::Font = display::Font::DEMIBOLD;
#[cfg(not(feature = "bootloader"))]
use crate::trezorhal::model;
pub struct WelcomeScreen {
area: Rect,
}
impl WelcomeScreen {
pub fn new() -> Self {
Self { area: Rect::zero() }
}
}
impl Component for WelcomeScreen {
type Msg = Never;
fn place(&mut self, bounds: Rect) -> Rect {
self.area = bounds;
self.area
}
fn event(&mut self, _ctx: &mut EventCtx, _event: Event) -> Option<Self::Msg> {
None
}
fn paint(&mut self) {
theme::ICON_LOGO.draw(
self.area.top_center() + Offset::y(ICON_TOP_MARGIN),
Alignment2D::TOP_CENTER,
theme::FG,
theme::BG,
);
display::text_center(
self.area.bottom_center() - Offset::y(TEXT_BOTTOM_MARGIN),
"Trezor Safe 5",
display::Font::NORMAL,
theme::FG,
theme::BG,
);
}
}
#[cfg(feature = "ui_debug")]
impl crate::trace::Trace for WelcomeScreen {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
t.component("WelcomeScreen");
#[cfg(not(feature = "bootloader"))]
t.string("model", model::FULL_NAME.into());
}
}

@ -0,0 +1,22 @@
use crate::ui::geometry::{Offset, Point, Rect};
use crate::trezorhal::display::{DISPLAY_RESX, DISPLAY_RESY};
pub const WIDTH: i16 = DISPLAY_RESX as _;
pub const HEIGHT: i16 = DISPLAY_RESY as _;
pub const LINE_SPACE: i16 = 4;
pub const FONT_BPP: i16 = 4;
pub const LOADER_OUTER: i16 = 60;
pub const LOADER_INNER: i16 = 52;
pub const LOADER_ICON_MAX_SIZE: i16 = 64;
pub const fn size() -> Offset {
Offset::new(WIDTH, HEIGHT)
}
pub const SIZE: Offset = size();
pub const fn screen() -> Rect {
Rect::from_top_left_and_size(Point::zero(), SIZE)
}
pub const SCREEN: Rect = screen();

@ -0,0 +1,38 @@
use super::{geometry::Rect, UIFeaturesCommon};
#[cfg(feature = "bootloader")]
pub mod bootloader;
pub mod component;
pub mod constant;
pub mod theme;
mod screens;
pub struct ModelMercuryFeatures;
impl UIFeaturesCommon for ModelMercuryFeatures {
fn fadein() {
#[cfg(feature = "backlight")]
crate::ui::display::fade_backlight_duration(theme::BACKLIGHT_NORMAL, 150);
}
fn fadeout() {
#[cfg(feature = "backlight")]
crate::ui::display::fade_backlight_duration(theme::BACKLIGHT_DIM, 150);
}
fn backlight_on() {
#[cfg(feature = "backlight")]
crate::ui::display::set_backlight(theme::BACKLIGHT_NORMAL);
}
const SCREEN: Rect = constant::SCREEN;
fn screen_fatal_error(title: &str, msg: &str, footer: &str) {
screens::screen_fatal_error(title, msg, footer);
}
fn screen_boot_stage_2() {
screens::screen_boot_stage_2();
}
}

@ -0,0 +1,21 @@
use crate::ui::{component::Component, constant::screen, display};
use super::{
component::{ErrorScreen, WelcomeScreen},
constant,
};
pub fn screen_fatal_error(title: &str, msg: &str, footer: &str) {
let mut frame = ErrorScreen::new(title.into(), msg.into(), footer.into());
frame.place(constant::screen());
frame.paint();
display::refresh();
}
pub fn screen_boot_stage_2() {
let mut frame = WelcomeScreen::new();
frame.place(screen());
display::sync();
frame.paint();
display::refresh();
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save