summaryrefslogtreecommitdiff
path: root/src/drv/tty
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-07-07 13:22:53 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-07-25 14:16:41 +0200
commit14f60e4fd65c42f126eaee7e09cb4251c167c6ed (patch)
tree313b5e16d7d99cf1518c953e2efe5e5fc920dfbf /src/drv/tty
parent48a61c16eaa6dcfc75d00dba302537ce1492db98 (diff)
downloadwnix-tty.tar.gz
wiptty
Diffstat (limited to 'src/drv/tty')
-rw-r--r--src/drv/tty/CMakeLists.txt20
-rw-r--r--src/drv/tty/include/drv/tty.h28
-rw-r--r--src/drv/tty/private_include/drv/tty/font.h29
-rw-r--r--src/drv/tty/private_include/drv/tty/ops.h30
-rw-r--r--src/drv/tty/private_include/drv/tty/types.h39
-rw-r--r--src/drv/tty/src/CMakeLists.txt27
-rw-r--r--src/drv/tty/src/free.c39
-rw-r--r--src/drv/tty/src/init.c58
-rw-r--r--src/drv/tty/src/ps1/CMakeLists.txt19
-rw-r--r--src/drv/tty/src/ps1/ttyfont_tim.c705
-rw-r--r--src/drv/tty/src/setdim.c62
-rw-r--r--src/drv/tty/src/update.c104
-rw-r--r--src/drv/tty/src/write.c62
13 files changed, 1222 insertions, 0 deletions
diff --git a/src/drv/tty/CMakeLists.txt b/src/drv/tty/CMakeLists.txt
new file mode 100644
index 0000000..9661134
--- /dev/null
+++ b/src/drv/tty/CMakeLists.txt
@@ -0,0 +1,20 @@
+# wanix, a Unix-like operating system for WebAssembly applications.
+# Copyright (C) 2025 Xavier Del Campo Romero
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+add_library(drv_tty)
+add_subdirectory(src)
+target_include_directories(drv_tty PUBLIC include PRIVATE private_include)
+target_link_libraries(drv_tty PUBLIC c PRIVATE gfx drv_event)
diff --git a/src/drv/tty/include/drv/tty.h b/src/drv/tty/include/drv/tty.h
new file mode 100644
index 0000000..49115f5
--- /dev/null
+++ b/src/drv/tty/include/drv/tty.h
@@ -0,0 +1,28 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_TTY_H
+#define DRV_TTY_H
+
+#include <drv/event.h>
+
+struct drv_port *drv_tty_init(const struct drv_event *ev);
+int drv_tty_update(struct drv_port *p);
+void drv_tty_free(struct drv_port *p);
+
+#endif
diff --git a/src/drv/tty/private_include/drv/tty/font.h b/src/drv/tty/private_include/drv/tty/font.h
new file mode 100644
index 0000000..60d9740
--- /dev/null
+++ b/src/drv/tty/private_include/drv/tty/font.h
@@ -0,0 +1,29 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_TTY_FONT_H
+#define DRV_TTY_FONT_H
+
+#include <gfx/sprite.h>
+#include <stddef.h>
+
+struct gfx_sprite ttyfont_spr;
+extern const unsigned char ttyfont[];
+extern const size_t ttyfont_size;
+
+#endif
diff --git a/src/drv/tty/private_include/drv/tty/ops.h b/src/drv/tty/private_include/drv/tty/ops.h
new file mode 100644
index 0000000..1d7cbd2
--- /dev/null
+++ b/src/drv/tty/private_include/drv/tty/ops.h
@@ -0,0 +1,30 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_TTY_OPS_H
+#define DRV_TTY_OPS_H
+
+#include <drv/event.h>
+#include <drv/tty/types.h>
+#include <stddef.h>
+
+int drv_tty_write(const void *buf, size_t n, const struct drv_event_done *done,
+ void *args);
+int drv_tty_setdim(struct drv_port *p, unsigned x, unsigned y);
+
+#endif
diff --git a/src/drv/tty/private_include/drv/tty/types.h b/src/drv/tty/private_include/drv/tty/types.h
new file mode 100644
index 0000000..e8fdd40
--- /dev/null
+++ b/src/drv/tty/private_include/drv/tty/types.h
@@ -0,0 +1,39 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef DRV_TTY_TYPES_H
+#define DRV_TTY_TYPES_H
+
+#include <drv/event.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+struct row
+{
+ char *columns;
+};
+
+struct drv_port
+{
+ bool init;
+ struct row *rows, *first_row, *last_row;
+ size_t nrows, ncolumns, last_column;
+ struct drv_event ev;
+};
+
+#endif
diff --git a/src/drv/tty/src/CMakeLists.txt b/src/drv/tty/src/CMakeLists.txt
new file mode 100644
index 0000000..d0690c8
--- /dev/null
+++ b/src/drv/tty/src/CMakeLists.txt
@@ -0,0 +1,27 @@
+# wanix, a Unix-like operating system for WebAssembly applications.
+# Copyright (C) 2025 Xavier Del Campo Romero
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+target_sources(drv_tty PRIVATE
+ free.c
+ init.c
+ setdim.c
+ update.c
+ write.c
+)
+
+if(PS1_BUILD)
+ add_subdirectory(ps1)
+endif()
diff --git a/src/drv/tty/src/free.c b/src/drv/tty/src/free.c
new file mode 100644
index 0000000..346e706
--- /dev/null
+++ b/src/drv/tty/src/free.c
@@ -0,0 +1,39 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/event.h>
+#include <drv/tty.h>
+#include <drv/tty/font.h>
+#include <drv/tty/ops.h>
+#include <drv/tty/types.h>
+#include <gfx/gfx.h>
+#include <gfx/sprite.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+void drv_tty_free(struct drv_port *const p)
+{
+ if (!p)
+ return;
+
+ for (size_t i = 0; i < p->nrows; i++)
+ free(p->rows[i].columns);
+
+ free(p->rows);
+ free(p);
+}
diff --git a/src/drv/tty/src/init.c b/src/drv/tty/src/init.c
new file mode 100644
index 0000000..b436cef
--- /dev/null
+++ b/src/drv/tty/src/init.c
@@ -0,0 +1,58 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/event.h>
+#include <drv/tty.h>
+#include <drv/tty/font.h>
+#include <drv/tty/ops.h>
+#include <drv/tty/types.h>
+#include <gfx/gfx.h>
+#include <gfx/sprite.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int load(void *const buf, const size_t n, void *const args)
+{
+ size_t *const off = args;
+
+ memcpy(buf, ttyfont + *off, n);
+ *off += n;
+ return 0;
+}
+
+struct drv_port *drv_tty_init(const struct drv_event *const ev)
+{
+ size_t off = 0;
+ struct drv_port *ret = NULL;
+
+ if (!(ret = malloc(sizeof *ret)))
+ goto failure;
+
+ *ret = (const struct drv_port){.ev = *ev};
+ gfx_sprite_load(&ttyfont_spr, load, &off);
+
+ if (drv_tty_setdim(ret, screen_w, screen_h))
+ goto failure;
+
+ return ret;
+
+failure:
+ drv_tty_free(ret);
+ return NULL;
+}
diff --git a/src/drv/tty/src/ps1/CMakeLists.txt b/src/drv/tty/src/ps1/CMakeLists.txt
new file mode 100644
index 0000000..0dbe9ef
--- /dev/null
+++ b/src/drv/tty/src/ps1/CMakeLists.txt
@@ -0,0 +1,19 @@
+# wanix, a Unix-like operating system for WebAssembly applications.
+# Copyright (C) 2025 Xavier Del Campo Romero
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+target_sources(drv_tty PRIVATE
+ ttyfont_tim.c
+)
diff --git a/src/drv/tty/src/ps1/ttyfont_tim.c b/src/drv/tty/src/ps1/ttyfont_tim.c
new file mode 100644
index 0000000..ebf22d4
--- /dev/null
+++ b/src/drv/tty/src/ps1/ttyfont_tim.c
@@ -0,0 +1,705 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/* Derived from res/font.bmp. See res/orig/LICENSE for details. */
+
+#include <drv/tty/font.h>
+#include <stddef.h>
+
+const unsigned char ttyfont[] = {
+ 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00,
+ 0x80, 0x02, 0xf2, 0x01, 0x10, 0x00, 0x01, 0x00, 0xe7, 0x18, 0x00, 0x00,
+ 0x8e, 0x31, 0x18, 0x7b, 0xff, 0x7f, 0x80, 0x08, 0x42, 0x08, 0x42, 0x08,
+ 0x44, 0x08, 0x42, 0x00, 0x02, 0x10, 0x80, 0x08, 0x42, 0x08, 0x42, 0x08,
+ 0x42, 0x08, 0x42, 0x08, 0x8c, 0x1f, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00,
+ 0x18, 0x00, 0xa8, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x32,
+ 0x24, 0x43, 0x10, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22,
+ 0x32, 0x20, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x32, 0x24, 0x11, 0x11, 0x11, 0x21,
+ 0x32, 0x34, 0x10, 0x11, 0x11, 0x21, 0x32, 0x03, 0x12, 0x11, 0x11, 0x21,
+ 0x03, 0x32, 0x10, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x32,
+ 0x44, 0x34, 0x20, 0x11, 0x21, 0x22, 0x12, 0x21, 0x22, 0x11, 0x21, 0x32,
+ 0x44, 0x03, 0x12, 0x11, 0x11, 0x11, 0x21, 0x03, 0x11, 0x11, 0x11, 0x21,
+ 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x00, 0x01, 0x10, 0x11, 0x21, 0x42, 0x04, 0x42, 0x04, 0x12, 0x21, 0x43,
+ 0x40, 0x30, 0x03, 0x11, 0x21, 0x44, 0x10, 0x22, 0x03, 0x11, 0x21, 0x43,
+ 0x00, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x00, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x21, 0x44,
+ 0x40, 0x00, 0x00, 0x11, 0x21, 0x33, 0x20, 0x42, 0x00, 0x11, 0x21, 0x44,
+ 0x20, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x40, 0x04, 0x10, 0x21, 0x43,
+ 0x40, 0x20, 0x12, 0x11, 0x21, 0x00, 0x22, 0x04, 0x10, 0x11, 0x21, 0x43,
+ 0x22, 0x04, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x21, 0x42,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x42, 0x04, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x24, 0x42, 0x04, 0x12, 0x11, 0x02,
+ 0x40, 0x40, 0x03, 0x11, 0x11, 0x22, 0x04, 0x20, 0x22, 0x11, 0x21, 0x43,
+ 0x00, 0x40, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x21, 0x22,
+ 0x42, 0x40, 0x04, 0x11, 0x21, 0x42, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x40, 0x04, 0x10, 0x21, 0x33,
+ 0x40, 0x40, 0x03, 0x11, 0x21, 0x03, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43,
+ 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x21, 0x00, 0x11, 0x02, 0x00, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x44, 0x20, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x11, 0x02,
+ 0x30, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x30, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x10, 0x11, 0x11, 0x21, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x21, 0x30, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x11, 0x11, 0x22,
+ 0x43, 0x03, 0x12, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x22,
+ 0x12, 0x22, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x03, 0x11, 0x21, 0x32,
+ 0x00, 0x34, 0x20, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x32,
+ 0x20, 0x32, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x21, 0x43,
+ 0x00, 0x44, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02,
+ 0x24, 0x04, 0x10, 0x11, 0x21, 0x22, 0x42, 0x24, 0x22, 0x12, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x04, 0x10, 0x11, 0x21, 0x44,
+ 0x30, 0x44, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21,
+ 0x42, 0x00, 0x11, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x40, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x22,
+ 0x04, 0x04, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x34, 0x10, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x04, 0x10, 0x11, 0x11, 0x21, 0x44,
+ 0x34, 0x40, 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x32,
+ 0x20, 0x30, 0x10, 0x11, 0x21, 0x00, 0x40, 0x04, 0x00, 0x10, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x21, 0x42, 0x00, 0x11, 0x11, 0x11, 0x21, 0x43,
+ 0x04, 0x40, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02,
+ 0x10, 0x02, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x11, 0x11, 0x21, 0x03, 0x10, 0x11, 0x11, 0x11, 0x21, 0x30,
+ 0x04, 0x30, 0x00, 0x11, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02,
+ 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x32, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x00, 0x00, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x32, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11,
+ 0x21, 0x22, 0x12, 0x11, 0x21, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x21, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, 0x32, 0x03, 0x11, 0x11, 0x21, 0x32,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11,
+ 0x22, 0x33, 0x10, 0x11, 0x21, 0x43, 0x44, 0x34, 0x10, 0x11, 0x21, 0x32,
+ 0x44, 0x34, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x32,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x43, 0x04, 0x11, 0x11, 0x21, 0x33,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x02, 0x00, 0x40, 0x03, 0x11, 0x11, 0x21,
+ 0x32, 0x44, 0x10, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x43,
+ 0x00, 0x00, 0x10, 0x11, 0x21, 0x33, 0x00, 0x40, 0x03, 0x11, 0x21, 0x43,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x21, 0x40, 0x04, 0x11, 0x11, 0x21, 0x00,
+ 0x20, 0x42, 0x03, 0x11, 0x11, 0x21, 0x22, 0x33, 0x00, 0x11, 0x11, 0x22,
+ 0x43, 0x44, 0x10, 0x11, 0x21, 0x44, 0x20, 0x22, 0x12, 0x11, 0x21, 0x44,
+ 0x20, 0x22, 0x12, 0x11, 0x21, 0x00, 0x20, 0x43, 0x00, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x33, 0x00, 0x11, 0x11, 0x21, 0x43, 0x04, 0x10, 0x11, 0x21, 0x32,
+ 0x03, 0x44, 0x10, 0x11, 0x21, 0x43, 0x44, 0x34, 0x20, 0x11, 0x21, 0x44,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x11, 0x22, 0x34, 0x10, 0x11, 0x21, 0x43,
+ 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x21,
+ 0x32, 0x03, 0x10, 0x11, 0x11, 0x21, 0x00, 0x33, 0x20, 0x11, 0x21, 0x43,
+ 0x20, 0x44, 0x20, 0x11, 0x21, 0x00, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x32, 0x04, 0x10, 0x11, 0x21, 0x42,
+ 0x44, 0x44, 0x00, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x22,
+ 0x33, 0x00, 0x11, 0x11, 0x11, 0x11, 0x21, 0x40, 0x03, 0x11, 0x21, 0x43,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x11, 0x21, 0x42, 0x03, 0x11, 0x11, 0x21, 0x43,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x32,
+ 0x03, 0x10, 0x11, 0x11, 0x21, 0x22, 0x12, 0x40, 0x04, 0x11, 0x21, 0x00,
+ 0x00, 0x44, 0x00, 0x11, 0x21, 0x22, 0x12, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x00, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x11, 0x22, 0x42, 0x04, 0x22, 0x11, 0x21, 0x43,
+ 0x20, 0x22, 0x22, 0x11, 0x21, 0x33, 0x20, 0x42, 0x03, 0x11, 0x11, 0x11,
+ 0x21, 0x44, 0x10, 0x11, 0x21, 0x43, 0x20, 0x42, 0x03, 0x11, 0x21, 0x43,
+ 0x22, 0x42, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x43,
+ 0x22, 0x42, 0x03, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x43,
+ 0x44, 0x44, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11,
+ 0x21, 0x33, 0x10, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x21, 0x33, 0x10, 0x11, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x21, 0x00, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x10, 0x11, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x22, 0x12, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x21, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x12, 0x11, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x22, 0x43,
+ 0x44, 0x44, 0x34, 0x20, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x43, 0x04, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x32,
+ 0x34, 0x20, 0x11, 0x11, 0x21, 0x43, 0x03, 0x40, 0x03, 0x11, 0x32, 0x24,
+ 0x22, 0x22, 0x42, 0x03, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x11, 0x11,
+ 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x21,
+ 0x32, 0x44, 0x00, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x02,
+ 0x43, 0x03, 0x12, 0x11, 0x21, 0x33, 0x20, 0x42, 0x03, 0x11, 0x42, 0x22,
+ 0x43, 0x34, 0x20, 0x04, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x22,
+ 0x43, 0x04, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x21,
+ 0x30, 0x34, 0x20, 0x11, 0x21, 0x00, 0x20, 0x43, 0x00, 0x11, 0x42, 0x42,
+ 0x04, 0x40, 0x03, 0x04, 0x21, 0x43, 0x22, 0x42, 0x04, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x44, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x44, 0x03, 0x11, 0x11, 0x11, 0x22, 0x34, 0x10, 0x11, 0x42, 0x42,
+ 0x04, 0x42, 0x04, 0x04, 0x21, 0x30, 0x44, 0x44, 0x04, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x44, 0x20, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11,
+ 0x22, 0x44, 0x03, 0x11, 0x11, 0x11, 0x32, 0x04, 0x10, 0x11, 0x42, 0x32,
+ 0x24, 0x42, 0x04, 0x04, 0x11, 0x02, 0x00, 0x40, 0x04, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x02,
+ 0x43, 0x04, 0x12, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x21,
+ 0x32, 0x34, 0x00, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x02,
+ 0x43, 0x44, 0x44, 0x04, 0x11, 0x22, 0x22, 0x42, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x21,
+ 0x30, 0x44, 0x20, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x22,
+ 0x43, 0x03, 0x10, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x32, 0x24,
+ 0x00, 0x00, 0x20, 0x03, 0x11, 0x32, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11,
+ 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x42, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x43, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x02, 0x43,
+ 0x44, 0x44, 0x34, 0x00, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x21, 0x30, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02,
+ 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x11, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22,
+ 0x12, 0x22, 0x22, 0x11, 0x11, 0x22, 0x43, 0x03, 0x12, 0x11, 0x21, 0x43,
+ 0x44, 0x34, 0x20, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43,
+ 0x44, 0x03, 0x12, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x43,
+ 0x44, 0x44, 0x03, 0x11, 0x21, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x32, 0x03, 0x33, 0x20, 0x11, 0x21, 0x44,
+ 0x00, 0x40, 0x03, 0x11, 0x21, 0x43, 0x03, 0x30, 0x03, 0x11, 0x21, 0x44,
+ 0x00, 0x33, 0x20, 0x11, 0x21, 0x44, 0x00, 0x00, 0x00, 0x11, 0x21, 0x44,
+ 0x00, 0x00, 0x00, 0x11, 0x21, 0x43, 0x03, 0x00, 0x00, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x02, 0x00, 0x11, 0x21, 0x44,
+ 0x10, 0x40, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x22, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x44,
+ 0x44, 0x34, 0x10, 0x11, 0x21, 0x44, 0x20, 0x22, 0x22, 0x11, 0x21, 0x44,
+ 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x44, 0x44, 0x00, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x34, 0x10, 0x11, 0x21, 0x44,
+ 0x00, 0x00, 0x10, 0x11, 0x21, 0x44, 0x20, 0x43, 0x03, 0x11, 0x21, 0x44,
+ 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, 0x22, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x00, 0x40, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x00, 0x10, 0x11, 0x21, 0x44,
+ 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x20, 0x40, 0x04, 0x11, 0x21, 0x44,
+ 0x00, 0x40, 0x04, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x02, 0x22, 0x22, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44,
+ 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x40, 0x04, 0x11, 0x21, 0x44,
+ 0x22, 0x42, 0x03, 0x11, 0x21, 0x43, 0x23, 0x32, 0x03, 0x11, 0x21, 0x44,
+ 0x20, 0x33, 0x00, 0x11, 0x21, 0x44, 0x00, 0x00, 0x00, 0x11, 0x21, 0x44,
+ 0x10, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x40, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43,
+ 0x44, 0x34, 0x00, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x43,
+ 0x44, 0x03, 0x10, 0x11, 0x21, 0x43, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x11, 0x11, 0x11, 0x21, 0x30, 0x44, 0x44, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x21, 0x00,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00,
+ 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00,
+ 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x21, 0x00,
+ 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11,
+ 0x11, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x11, 0x22,
+ 0x22, 0x11, 0x11, 0x11, 0x21, 0x22, 0x11, 0x21, 0x22, 0x11, 0x21, 0x22,
+ 0x12, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11,
+ 0x11, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x11, 0x32,
+ 0x03, 0x11, 0x11, 0x11, 0x21, 0x03, 0x12, 0x22, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x02, 0x40, 0x04, 0x00, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x03, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x34, 0x20, 0x32, 0x04, 0x11, 0x21, 0x44,
+ 0x20, 0x42, 0x04, 0x11, 0x21, 0x43, 0x00, 0x40, 0x03, 0x11, 0x21, 0x44,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x33, 0x00, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x23, 0x43, 0x04, 0x11, 0x21, 0x44,
+ 0x03, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x04, 0x12, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x44,
+ 0x34, 0x40, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x22, 0x42, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x33, 0x20, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x30, 0x40, 0x04, 0x11, 0x21, 0x44,
+ 0x44, 0x44, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x22,
+ 0x12, 0x42, 0x04, 0x11, 0x21, 0x44, 0x00, 0x40, 0x03, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x30, 0x44, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x33,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x40, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x00, 0x43, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x42, 0x04, 0x22, 0x11, 0x21, 0x43,
+ 0x20, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x40, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x22, 0x22, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x20, 0x40, 0x04, 0x11, 0x21, 0x43, 0x22, 0x42, 0x03, 0x11, 0x21, 0x44,
+ 0x10, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x21, 0x33, 0x10, 0x30, 0x03, 0x11, 0x11, 0x42,
+ 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x21, 0x33,
+ 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x10, 0x11, 0x21, 0x00, 0x10, 0x00, 0x00, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x00, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x21, 0x00,
+ 0x10, 0x02, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00,
+ 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x12, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x22,
+ 0x12, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x22,
+ 0x12, 0x22, 0x22, 0x11, 0x21, 0x32, 0x44, 0x34, 0x20, 0x11, 0x21, 0x43,
+ 0x44, 0x34, 0x20, 0x11, 0x21, 0x32, 0x44, 0x03, 0x12, 0x11, 0x11, 0x32,
+ 0x44, 0x44, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x21, 0x43, 0x00, 0x42, 0x03, 0x11, 0x21, 0x44,
+ 0x00, 0x42, 0x03, 0x11, 0x21, 0x43, 0x00, 0x33, 0x10, 0x11, 0x11, 0x02,
+ 0x40, 0x04, 0x00, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x04, 0x11, 0x21, 0x43,
+ 0x00, 0x42, 0x03, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x43, 0x20, 0x22, 0x12, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x21, 0x30,
+ 0x23, 0x33, 0x00, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x22, 0x43, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x20, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x00, 0x42, 0x04, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x11, 0x02,
+ 0x44, 0x04, 0x10, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x44,
+ 0x44, 0x24, 0x00, 0x11, 0x11, 0x02, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x43,
+ 0x23, 0x43, 0x03, 0x11, 0x21, 0x44, 0x44, 0x44, 0x04, 0x11, 0x21, 0x32,
+ 0x03, 0x33, 0x00, 0x11, 0x21, 0x44, 0x20, 0x42, 0x03, 0x11, 0x21, 0x44,
+ 0x30, 0x34, 0x02, 0x11, 0x21, 0x22, 0x12, 0x40, 0x04, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x42, 0x04, 0x11, 0x21, 0x30,
+ 0x44, 0x34, 0x00, 0x11, 0x21, 0x44, 0x03, 0x43, 0x04, 0x11, 0x21, 0x43,
+ 0x00, 0x40, 0x03, 0x11, 0x21, 0x43, 0x32, 0x44, 0x02, 0x11, 0x21, 0x44,
+ 0x00, 0x43, 0x23, 0x11, 0x21, 0x33, 0x00, 0x40, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x00, 0x42, 0x03, 0x11, 0x11, 0x02,
+ 0x43, 0x03, 0x10, 0x11, 0x21, 0x44, 0x00, 0x40, 0x04, 0x11, 0x21, 0x44,
+ 0x10, 0x42, 0x04, 0x11, 0x21, 0x30, 0x34, 0x30, 0x23, 0x11, 0x21, 0x33,
+ 0x20, 0x30, 0x03, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11,
+ 0x32, 0x03, 0x11, 0x11, 0x21, 0x30, 0x44, 0x34, 0x00, 0x11, 0x11, 0x21,
+ 0x30, 0x00, 0x11, 0x11, 0x21, 0x33, 0x10, 0x30, 0x03, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x21, 0x00,
+ 0x10, 0x02, 0x00, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x02, 0x10, 0x11, 0x11, 0x21, 0x00, 0x10, 0x00, 0x00, 0x11, 0x21, 0x00,
+ 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11,
+ 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x22, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x21, 0x22,
+ 0x22, 0x22, 0x22, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21,
+ 0x42, 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x03, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x21, 0x43,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x00, 0x10, 0x11, 0x21, 0x22,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x44, 0x10, 0x11, 0x11, 0x22,
+ 0x04, 0x04, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x40, 0x20, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x21, 0x00,
+ 0x00, 0x40, 0x04, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x03,
+ 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x42,
+ 0x20, 0x30, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x04, 0x12, 0x11, 0x11, 0x32, 0x04, 0x42, 0x03, 0x11, 0x11, 0x11,
+ 0x22, 0x43, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x21, 0x40,
+ 0x20, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x02,
+ 0x10, 0x02, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x21, 0x30, 0x10, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x21,
+ 0x32, 0x34, 0x00, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x02,
+ 0x04, 0x12, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x02, 0x10, 0x11, 0x11, 0x21, 0x40, 0x04, 0x10, 0x11, 0x11, 0x22,
+ 0x43, 0x03, 0x10, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x21,
+ 0x40, 0x20, 0x11, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x32,
+ 0x34, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x04, 0x12, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x43,
+ 0x03, 0x10, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x21, 0x40, 0x20, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x21, 0x44,
+ 0x20, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x02, 0x03, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x21, 0x43,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x21, 0x00, 0x11, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00,
+ 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x44, 0x20, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x44, 0x03, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x32, 0x34, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x43, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21,
+ 0x22, 0x42, 0x04, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22,
+ 0x44, 0x20, 0x12, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x42,
+ 0x04, 0x22, 0x12, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x22,
+ 0x43, 0x44, 0x04, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x32,
+ 0x44, 0x34, 0x10, 0x11, 0x11, 0x22, 0x43, 0x44, 0x03, 0x11, 0x11, 0x42,
+ 0x04, 0x22, 0x12, 0x11, 0x11, 0x42, 0x04, 0x40, 0x03, 0x11, 0x11, 0x42,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x32, 0x04, 0x30, 0x03, 0x11, 0x11, 0x32,
+ 0x04, 0x40, 0x04, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x02,
+ 0x44, 0x00, 0x10, 0x11, 0x11, 0x32, 0x04, 0x40, 0x04, 0x11, 0x11, 0x42,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x40, 0x03, 0x11, 0x11, 0x42, 0x04, 0x22, 0x22, 0x11, 0x11, 0x42,
+ 0x04, 0x40, 0x04, 0x11, 0x11, 0x42, 0x44, 0x44, 0x03, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x40, 0x03, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x03, 0x11, 0x11, 0x32, 0x24, 0x32, 0x03, 0x11, 0x11, 0x32,
+ 0x04, 0x40, 0x04, 0x11, 0x11, 0x32, 0x04, 0x00, 0x00, 0x11, 0x11, 0x21,
+ 0x44, 0x10, 0x11, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x11, 0x02, 0x43, 0x44, 0x03, 0x11, 0x11, 0x32,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x02,
+ 0x43, 0x44, 0x03, 0x11, 0x11, 0x02, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21,
+ 0x33, 0x10, 0x11, 0x11, 0x11, 0x22, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32,
+ 0x03, 0x32, 0x03, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x21,
+ 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x21,
+ 0x00, 0x10, 0x11, 0x11, 0x11, 0x22, 0x22, 0x42, 0x03, 0x11, 0x11, 0x02,
+ 0x00, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x34, 0x00, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x22, 0x22, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x43, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x04, 0x22, 0x22, 0x11, 0x11, 0x21,
+ 0x40, 0x04, 0x11, 0x11, 0x21, 0x22, 0x22, 0x22, 0x12, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x22, 0x22, 0x11, 0x11, 0x42, 0x04, 0x32, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x43, 0x44, 0x34, 0x20, 0x11, 0x11, 0x32,
+ 0x44, 0x34, 0x20, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x32, 0x03, 0x11, 0x11, 0x42, 0x24, 0x33, 0x00, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x40, 0x42, 0x03, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x03, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x22,
+ 0x43, 0x34, 0x20, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x44, 0x04, 0x10, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x40, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x32,
+ 0x04, 0x40, 0x03, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x33, 0x20, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x42, 0x04, 0x11, 0x11, 0x42, 0x04, 0x42, 0x03, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x21, 0x44, 0x00, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x11, 0x32, 0x24, 0x42, 0x03, 0x11, 0x11, 0x42,
+ 0x24, 0x42, 0x03, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x42, 0x04, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x11,
+ 0x32, 0x03, 0x11, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x11, 0x32,
+ 0x03, 0x32, 0x03, 0x11, 0x11, 0x02, 0x43, 0x34, 0x00, 0x11, 0x11, 0x42,
+ 0x44, 0x34, 0x00, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x42, 0x03, 0x11, 0x11, 0x02, 0x00, 0x02, 0x00, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, 0x10, 0x02, 0x00, 0x11, 0x11, 0x02,
+ 0x00, 0x02, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x10, 0x11, 0x11, 0x42,
+ 0x04, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02,
+ 0x43, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x32,
+ 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21,
+ 0x00, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02,
+ 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x22,
+ 0x12, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x12, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x21,
+ 0x32, 0x03, 0x12, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x22, 0x11, 0x21, 0x22, 0x12, 0x22, 0x22, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x11, 0x21, 0x22, 0x22, 0x12, 0x11, 0x11, 0x32,
+ 0x23, 0x34, 0x10, 0x11, 0x11, 0x22, 0x43, 0x34, 0x10, 0x11, 0x11, 0x21,
+ 0x43, 0x34, 0x10, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x32,
+ 0x03, 0x32, 0x03, 0x11, 0x21, 0x33, 0x10, 0x32, 0x03, 0x11, 0x21, 0x43,
+ 0x20, 0x42, 0x03, 0x11, 0x11, 0x22, 0x43, 0x34, 0x20, 0x11, 0x11, 0x42,
+ 0x34, 0x00, 0x10, 0x11, 0x11, 0x32, 0x04, 0x00, 0x10, 0x11, 0x11, 0x21,
+ 0x40, 0x04, 0x10, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x21, 0x44, 0x20, 0x42, 0x04, 0x11, 0x21, 0x30,
+ 0x23, 0x33, 0x00, 0x11, 0x11, 0x32, 0x04, 0x40, 0x03, 0x11, 0x11, 0x42,
+ 0x04, 0x10, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x12, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x42, 0x04, 0x11, 0x21, 0x44, 0x30, 0x42, 0x04, 0x11, 0x11, 0x22,
+ 0x44, 0x04, 0x10, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x11, 0x02, 0x43, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x24, 0x42, 0x03, 0x11, 0x21, 0x44, 0x40, 0x42, 0x04, 0x11, 0x21, 0x32,
+ 0x03, 0x33, 0x00, 0x11, 0x11, 0x32, 0x24, 0x42, 0x04, 0x11, 0x11, 0x42,
+ 0x04, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x42, 0x04, 0x10, 0x11, 0x11, 0x32, 0x04, 0x42, 0x04, 0x11, 0x11, 0x32,
+ 0x24, 0x33, 0x00, 0x11, 0x21, 0x44, 0x30, 0x42, 0x03, 0x11, 0x21, 0x43,
+ 0x00, 0x40, 0x03, 0x11, 0x11, 0x02, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32,
+ 0x03, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x10, 0x11, 0x11, 0x11,
+ 0x32, 0x34, 0x10, 0x11, 0x11, 0x02, 0x43, 0x44, 0x03, 0x11, 0x11, 0x02,
+ 0x43, 0x03, 0x10, 0x11, 0x21, 0x43, 0x03, 0x33, 0x00, 0x11, 0x21, 0x33,
+ 0x10, 0x32, 0x03, 0x11, 0x11, 0x21, 0x00, 0x40, 0x04, 0x11, 0x11, 0x02,
+ 0x00, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x02, 0x00, 0x10, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x11, 0x11, 0x21,
+ 0x00, 0x00, 0x11, 0x11, 0x21, 0x00, 0x00, 0x00, 0x10, 0x11, 0x21, 0x00,
+ 0x10, 0x02, 0x00, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11,
+ 0x22, 0x12, 0x11, 0x11, 0x11, 0x22, 0x22, 0x12, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x32, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x32, 0x10, 0x11, 0x11, 0x11, 0x32, 0x34, 0x20, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x43, 0x03, 0x10, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x02, 0x43, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x22,
+ 0x22, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x21, 0x40, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x22, 0x22, 0x11, 0x11, 0x32,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x03, 0x32, 0x03, 0x11, 0x11, 0x02,
+ 0x00, 0x42, 0x03, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x12, 0x11, 0x11, 0x21,
+ 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x11,
+ 0x22, 0x33, 0x00, 0x11, 0x11, 0x42, 0x04, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x22,
+ 0x34, 0x20, 0x03, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x42, 0x04, 0x11, 0x11, 0x21,
+ 0x32, 0x03, 0x10, 0x11, 0x11, 0x42, 0x04, 0x12, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x22, 0x44, 0x10, 0x11, 0x11, 0x32,
+ 0x00, 0x43, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x04, 0x42, 0x04, 0x11, 0x11, 0x22,
+ 0x33, 0x00, 0x11, 0x11, 0x11, 0x02, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x10, 0x11, 0x11, 0x02,
+ 0x20, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x43, 0x44, 0x04, 0x11, 0x11, 0x32,
+ 0x04, 0x22, 0x22, 0x11, 0x11, 0x21, 0x44, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x11, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x00, 0x42, 0x03, 0x11, 0x11, 0x32,
+ 0x44, 0x44, 0x03, 0x11, 0x11, 0x21, 0x44, 0x20, 0x11, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x21, 0x42, 0x04, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x22, 0x22, 0x33, 0x00, 0x11, 0x11, 0x02,
+ 0x00, 0x00, 0x00, 0x11, 0x11, 0x21, 0x43, 0x03, 0x12, 0x11, 0x11, 0x11,
+ 0x42, 0x10, 0x11, 0x11, 0x11, 0x22, 0x43, 0x03, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x32, 0x44, 0x03, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x21, 0x30, 0x34, 0x10, 0x11, 0x11, 0x11,
+ 0x32, 0x10, 0x11, 0x11, 0x11, 0x32, 0x34, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, 0x00, 0x10, 0x11, 0x11, 0x11,
+ 0x02, 0x10, 0x11, 0x11, 0x11, 0x02, 0x00, 0x10, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11
+};
+
+const size_t ttyfont_size = sizeof ttyfont;
diff --git a/src/drv/tty/src/setdim.c b/src/drv/tty/src/setdim.c
new file mode 100644
index 0000000..3170197
--- /dev/null
+++ b/src/drv/tty/src/setdim.c
@@ -0,0 +1,62 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/event.h>
+#include <drv/tty.h>
+#include <drv/tty/font.h>
+#include <drv/tty/ops.h>
+#include <drv/tty/types.h>
+#include <gfx/gfx.h>
+#include <gfx/sprite.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+int drv_tty_setdim(struct drv_port *const p, const unsigned w, const unsigned h)
+{
+ const unsigned columns = w / 8, rows = h / 14;
+ struct row *const prs = malloc(rows * sizeof *prs);
+
+ if (!prs)
+ goto failure;
+
+ for (unsigned i = 0; i < rows; i++)
+ *(prs + i) = (const struct row){0};
+
+ for (unsigned i = 0; i < rows; i++)
+ {
+ struct row *const p = &prs[i];
+ char *const c = malloc(columns);
+
+ if (!c)
+ goto failure;
+
+ p->columns = c;
+ }
+
+ p->first_row = p->last_row = p->rows = prs;
+ p->nrows = rows;
+ p->ncolumns = columns;
+ return 0;
+
+failure:
+ for (unsigned i = 0; i < rows; i++)
+ free(prs[i].columns);
+
+ free(prs);
+ return -1;
+}
diff --git a/src/drv/tty/src/update.c b/src/drv/tty/src/update.c
new file mode 100644
index 0000000..b65f3f0
--- /dev/null
+++ b/src/drv/tty/src/update.c
@@ -0,0 +1,104 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/event.h>
+#include <drv/tty.h>
+#include <drv/tty/font.h>
+#include <drv/tty/ops.h>
+#include <drv/tty/types.h>
+#include <gfx/gfx.h>
+#include <gfx/sprite.h>
+#include <stdbool.h>
+
+static int init(struct drv_port *const p)
+{
+ const struct drv_event *const ev = &p->ev;
+ const struct drv_event_ops ops =
+ {
+ .write = drv_tty_write,
+ .args = p
+ };
+
+ if (p->init)
+ return 0;
+ else if (ev->status("tty", &ops, true, ev->args))
+ return -1;
+
+ p->init = true;
+ return 0;
+}
+
+static int draw(struct drv_port *const p)
+{
+ short y = 0;
+ const struct row *r = p->first_row, *last = p->last_row + 1;
+
+ if (last - p->rows >= p->nrows)
+ last = p->rows;
+
+ for (;;)
+ {
+ short x = 0;
+
+ for (const char *c = r->columns;
+ *c && c - r->columns < p->ncolumns; c++, x += 8)
+ {
+ if (*c == ' ')
+ continue;
+
+ struct gfx_sprite *const s = gfx_sprite_get();
+ const char ch = *c - '!';
+ const short u = (12 * ch) % ttyfont_spr.w;
+ const short v = 14 * ((12 * ch) / ttyfont_spr.w);
+
+ if (!s || gfx_sprite_clone(&ttyfont_spr, s))
+ return -1;
+
+ /* TODO: replace hardcoded values */
+ s->x = x;
+ s->y = y;
+ s->w = 12;
+ s->h = 14;
+ s->u += u;
+ s->v += v;
+
+ if (gfx_sprite_sort(s))
+ return -1;
+ }
+
+ if (++r - p->rows >= p->nrows)
+ r = p->rows;
+
+ if (r == last)
+ break;
+
+ y += 14;
+ }
+
+ return gfx_draw();
+}
+
+int drv_tty_update(struct drv_port *const p)
+{
+ if (init(p))
+ return -1;
+ else if (!gfx_ready())
+ return 0;
+
+ return draw(p);
+}
diff --git a/src/drv/tty/src/write.c b/src/drv/tty/src/write.c
new file mode 100644
index 0000000..6af6113
--- /dev/null
+++ b/src/drv/tty/src/write.c
@@ -0,0 +1,62 @@
+/*
+ * wanix, a Unix-like operating system for WebAssembly applications.
+ * Copyright (C) 2025 Xavier Del Campo Romero
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include <drv/event.h>
+#include <drv/tty.h>
+#include <drv/tty/types.h>
+#include <drv/tty/ops.h>
+#include <errno.h>
+#include <stddef.h>
+
+int drv_tty_write(const void *const buf, const size_t n,
+ const struct drv_event_done *const d, void *const args)
+{
+ struct drv_port *const p = args;
+
+ for (const char *s = buf; s - (const char *)buf < n; s++)
+ {
+ char *const col = &p->last_row->columns[p->last_column];
+
+ if (*s == '\r')
+ {
+ *col = '\0';
+ p->last_column = 0;
+ }
+ else
+ {
+ if (*s != '\n')
+ *col = *s;
+
+ if (*s == '\n' || ++p->last_column >= p->ncolumns - 1)
+ {
+ if (++p->last_row - p->rows >= p->nrows)
+ {
+ p->last_row = p->rows;
+
+ if (++p->first_row - p->rows >= p->nrows)
+ p->first_row = p->rows;
+ }
+
+ col[p->last_column] = '\0';
+ p->last_column = 0;
+ }
+ }
+ }
+
+ return d->f(SUCCESS, d->args);
+}