diff --git a/.DS_Store b/.DS_Store
index 44ea690..925479d 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/Makefile b/Makefile
index 42efd84..0470a99 100644
--- a/Makefile
+++ b/Makefile
@@ -56,7 +56,7 @@ CROSS_TARGET := --target=aarch64-unknown-none-elf
# Compiler flags
# CPU target: generic works on QEMU and most ARM64 hardware
-CFLAGS_COMMON := -Wall -Wextra -Wno-unused-function -ffreestanding -fno-stack-protector \
+CFLAGS_COMMON := -Wall -Wextra -Wno-unused-function -ffreestanding -fstack-protector-strong \
-fno-pic -mcpu=cortex-a72 -O2 -g
CFLAGS_KERNEL := $(CFLAGS_COMMON) $(CROSS_TARGET) \
@@ -301,6 +301,22 @@ run-gui: kernel
-serial stdio \
-kernel $(KERNEL_BINARY)
+run-gpu: kernel
+ @echo "[RUN] Starting Vib-OS with virtio-GPU acceleration..."
+ @qemu-system-aarch64 -M virt,gic-version=3 \
+ -cpu max -m 512M \
+ -global virtio-mmio.force-legacy=false \
+ -device ramfb \
+ -device virtio-gpu-pci \
+ -device virtio-keyboard-device \
+ -device virtio-tablet-device \
+ -device virtio-net-device,netdev=net0 \
+ -netdev user,id=net0 \
+ -audiodev coreaudio,id=snd0 \
+ -device intel-hda -device hda-duplex,audiodev=snd0 \
+ -serial stdio \
+ -kernel $(KERNEL_BINARY)
+
# ============================================================================
# Toolchain Setup
# ============================================================================
diff --git a/README.md b/README.md
index 3b6d1de..c471f03 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@



-
+

```
@@ -19,9 +19,13 @@
Vib-OS v0.5.0 - Multi-Architecture OS with Full GUI
```
+
+
+
+
## Overview
-Vib-OS is a from-scratch, Unix-like operating system with **full multi-architecture support** for **ARM64** and **x86_64**. It features a custom kernel, a modern macOS-inspired graphical user interface, a full TCP/IP networking stack, and a Virtual File System (VFS). Built with **20,000+ lines** of C and Assembly, it runs natively on QEMU, real hardware (Raspberry Pi 4/5, x86_64 PCs), and Apple Silicon (via UTM).
+Vib-OS is a from-scratch, Unix-like operating system with **full multi-architecture support** for **ARM64** and **x86_64**. It features a custom kernel, a modern macOS-inspired graphical user interface, a full TCP/IP networking stack, and a Virtual File System (VFS). Built with **25,000+ lines** of C and Assembly, it runs natively on QEMU, real hardware (Raspberry Pi 4/5, x86_64 PCs), and Apple Silicon (via UTM).
## 🎯 Multi-Architecture Support
@@ -43,25 +47,33 @@ Vib-OS is a from-scratch, Unix-like operating system with **full multi-architect
## 📸 Screenshots
-### Desktop & File Manager
+### Main Desktop
+
+*Vib-OS desktop with animated dock, menu bar, and wallpaper system.*
+
+### File Manager

*Modern file manager with icon grid, navigation, file creation (New File/Folder), and renaming capabilities.*
### Terminal & Shell

-*VT100-compatible terminal with command history, `ls`, `cd`, and shell utilities.*
+*VT100-compatible terminal with command history, Python and Nano language support.*
-### Applications (Snake Game)
+### Image Viewer
+
+*JPEG image viewer with zoom, rotate, and pan support.*
+
+### Snake Game

*Interactive Snake game with score tracking and keyboard controls.*
-### Calculator
-
-*Fully functional calculator with arithmetic operations.*
+### Context Menu
+
+*Right-click context menu for desktop operations.*
-### Doom
-
-*Doom running natively on Vib-OS with full graphics and input support.*
+### Wallpaper Settings
+
+*Customizable wallpaper system with live preview.*
## 🏗 Architecture
@@ -72,6 +84,8 @@ graph TD
Shell[Terminal / Shell]
ProcMgr[Process Manager]
Doom[Doom Engine]
+ Python[Python Interpreter]
+ Nano[Nano Language]
end
subgraph Kernel ["Kernel (EL1/Ring 0)"]
@@ -85,6 +99,12 @@ graph TD
SMP["SMP (Multi-CPU)"]
end
+ subgraph Security
+ Spinlock[Spinlock Synchronization]
+ Sandbox[Media Sandbox]
+ ASLR[Address Space Randomization]
+ end
+
subgraph Drivers
VirtioNet[Virtio Net]
VirtioInput["Virtio Input (Tablet/Kbd)"]
@@ -99,6 +119,8 @@ graph TD
Shell --> Syscall
ProcMgr --> Syscall
Doom --> Syscall
+ Python --> Syscall
+ Nano --> Syscall
Syscall --> VFS
Syscall --> Process
@@ -109,6 +131,7 @@ graph TD
Process --> Mem
Process --> SMP
+ Security --> Mem
Drivers --> Hardware
```
@@ -118,9 +141,10 @@ graph TD
- **Window Manager**: Draggable and **resizable** windows with focus management and z-ordering
- **Traffic Light Controls**: Close, Minimize, and Maximize buttons (macOS-style)
- **Window Resizing**: Drag any edge or corner to resize windows (all 8 directions supported)
-- **Taskbar & Dock**: Animated dock with hover labels; top menu bar with clock and WiFi status
+- **Taskbar & Dock**: Animated dock with hover magnification and labels; top menu bar with clock and WiFi status
- **Compositor**: Double-buffered rendering engine for flicker-free visuals
- **Modern Design**: Clean, intuitive interface inspired by macOS
+- **Context Menus**: Right-click menus for desktop and file operations
### 📂 File System (VFS)
- **Virtual File System**: Unified interface for different filesystems
@@ -140,6 +164,24 @@ graph TD
- Notepad integration for editing text files
- File icons and visual feedback
+### 🐍 Programming Language Support
+- **Python Interpreter**: Run Python scripts directly in the terminal
+ ```bash
+ $ python examples/hello.py
+ Hello, Vib-OS!
+
+ $ python examples/fibonacci.py
+ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
+ ```
+- **Nano Language**: Lightweight scripting language ([github.com/jordanhubbard/nanolang](https://github.com/jordanhubbard/nanolang))
+ ```bash
+ $ nano examples/hello.nano
+ Hello from Nano!
+
+ $ nano examples/calculator.nano
+ Result: 42
+ ```
+
### 🌐 Networking
- **Virtio-Net Driver**: High-performance network interface
- **TCP/IP Stack**: Custom implementation of Ethernet, ARP, IP, ICMP, UDP, and TCP
@@ -148,6 +190,12 @@ graph TD
- **Socket API**: Berkeley sockets-compatible interface
- **WiFi Status**: Visual indicator in the menu bar
+### 🔒 Security Features
+- **Spinlock Synchronization**: IRQ-safe spinlocks for ARM64 and x86_64
+- **Media Sandbox**: Fault-isolating sandbox for media decoders
+- **ASLR**: Address Space Layout Randomization for process protection
+- **NX Protections**: Non-executable page support
+
### 🛠 Core System
- **Multi-Architecture Kernel**: Supports ARM64 and x86_64 with clean abstraction layer
- **Preemptive Multitasking**: Priority-based scheduler with context switching
@@ -187,9 +235,9 @@ graph TD
- **Media Pipeline**: Load and decode media files from VFS
### 📦 Applications
-- **Terminal**: `ls`, `cd`, `help`, `clear`, `cat`, `echo`, `play`, `view` commands
+- **Terminal**: `ls`, `cd`, `help`, `clear`, `cat`, `echo`, `play`, `view`, `python`, `nano` commands
- **Notepad**: Text editor with save/load functionality backed by VFS
-- **Image Viewer**: JPEG image viewer with zoom and pan support
+- **Image Viewer**: JPEG image viewer with zoom, rotate, and pan support
- **Audio Player**: MP3 playback support via minimp3 decoder
- **Process Manager**: View running processes (PID, name, state) with kill button
- **Snake**: Classic game with graphics and score tracking
@@ -197,6 +245,7 @@ graph TD
- **File Manager**: Browse, create, rename, and delete files (click images/audio to open)
- **Doom**: Full Doom port with graphics, input, and sound
- **Clock**: Real-time analog clock with hour/minute/second hands
+- **Settings**: System settings including wallpaper configuration
- **About**: System information dialog
## 🚀 Quick Start
@@ -225,7 +274,7 @@ sudo pacman -S qemu-system-aarch64 qemu-system-x86 aarch64-linux-gnu-gcc make
```bash
# Clone the repository
-git clone https://github.com/yourusername/vib-OS.git
+git clone https://github.com/viralcode/vib-OS.git
cd vib-OS
# Build everything (kernel, drivers, userspace)
@@ -359,8 +408,8 @@ Use UTM (https://mac.getutm.app/):
- ✅ **Complete sys_execve** - Loads ELF, sets up user stack, jumps to userspace
- ✅ Input (keyboard and mouse)
- ✅ Doom runs with full graphics
-- ✅ MP3 audio playback (via minimp3)
-- ✅ JPEG image viewing (via picojpeg)
+- ✅ Python and Nano language interpreters
+- ✅ Security features (spinlocks, sandbox, ASLR)
### Known Issues
1. **Sound Support**: Intel HDA driver works but audio may be choppy in QEMU
@@ -415,16 +464,21 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
- **DOOM**: id Software for the original Doom engine
- **minimp3**: lieff for the MP3 decoder library
- **picojpeg**: Rich Geldreich for the JPEG decoder
+- **Nano Language**: [Jordan Hubbard](https://github.com/jordanhubbard/nanolang) for the Nano scripting language
- **QEMU**: The QEMU team for the excellent emulator
- **OSDev Community**: For invaluable resources and documentation
## 📞 Contact
-- **GitHub**: [yourusername/vib-OS](https://github.com/yourusername/vib-OS)
-- **Issues**: [Report bugs or request features](https://github.com/yourusername/vib-OS/issues)
+**Author:** [JIJO JOHN](https://jijojohn.me)
+
+- **Website**: [jijojohn.me](https://jijojohn.me)
+- **GitHub**: [github.com/viralcode](https://github.com/viralcode)
+- **Repository**: [viralcode/vib-OS](https://github.com/viralcode/vib-OS)
+- **Issues**: [Report bugs or request features](https://github.com/viralcode/vib-OS/issues)
---
-**Made with ❤️ by the Vib-OS Team**
+**Made with ❤️ by [JIJO JOHN](https://jijojohn.me)**
*"Building an OS from scratch, one line at a time."*
diff --git a/drivers/gpu/virtio_gpu.c b/drivers/gpu/virtio_gpu.c
new file mode 100644
index 0000000..c167bf3
--- /dev/null
+++ b/drivers/gpu/virtio_gpu.c
@@ -0,0 +1,462 @@
+/*
+ * Vib-OS - virtio-gpu Driver (Simplified)
+ *
+ * Implements virtio-gpu for hardware-accelerated graphics in QEMU.
+ * Compatible with the simple PCI API.
+ */
+
+#include "drivers/pci.h"
+#include "mm/pmm.h"
+#include "mm/vmm.h"
+#include "printk.h"
+#include "types.h"
+
+/* ===================================================================== */
+/* Virtio Configuration Space */
+/* ===================================================================== */
+
+/* Virtio Configuration Offsets (from BAR for modern devices) */
+#define VIRTIO_PCI_CAP_COMMON_CFG 1
+#define VIRTIO_PCI_CAP_NOTIFY_CFG 2
+#define VIRTIO_PCI_CAP_ISR_CFG 3
+#define VIRTIO_PCI_CAP_DEVICE_CFG 4
+
+/* Common configuration offsets */
+#define VIRTIO_PCI_COMMON_DFSELECT 0x00
+#define VIRTIO_PCI_COMMON_DF 0x04
+#define VIRTIO_PCI_COMMON_GFSELECT 0x08
+#define VIRTIO_PCI_COMMON_GF 0x0C
+#define VIRTIO_PCI_COMMON_MSIX 0x10
+#define VIRTIO_PCI_COMMON_NUMQ 0x12
+#define VIRTIO_PCI_COMMON_STATUS 0x14
+#define VIRTIO_PCI_COMMON_CFGGEN 0x15
+#define VIRTIO_PCI_COMMON_Q_SELECT 0x16
+#define VIRTIO_PCI_COMMON_Q_SIZE 0x18
+#define VIRTIO_PCI_COMMON_Q_MSIX 0x1A
+#define VIRTIO_PCI_COMMON_Q_ENABLE 0x1C
+#define VIRTIO_PCI_COMMON_Q_NOTIFY 0x1E
+#define VIRTIO_PCI_COMMON_Q_DESC 0x20
+#define VIRTIO_PCI_COMMON_Q_AVAIL 0x28
+#define VIRTIO_PCI_COMMON_Q_USED 0x30
+
+/* Device status bits */
+#define VIRTIO_STATUS_ACKNOWLEDGE 0x01
+#define VIRTIO_STATUS_DRIVER 0x02
+#define VIRTIO_STATUS_DRIVER_OK 0x04
+#define VIRTIO_STATUS_FEATURES_OK 0x08
+
+/* GPU Feature bits */
+#define VIRTIO_GPU_F_VIRGL (1 << 0) /* 3D support */
+#define VIRTIO_GPU_F_EDID (1 << 1) /* EDID */
+
+/* GPU command types */
+#define VIRTIO_GPU_CMD_GET_DISPLAY_INFO 0x0100
+#define VIRTIO_GPU_CMD_RESOURCE_CREATE_2D 0x0101
+#define VIRTIO_GPU_CMD_SET_SCANOUT 0x0103
+#define VIRTIO_GPU_CMD_RESOURCE_FLUSH 0x0104
+#define VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D 0x0105
+#define VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING 0x0106
+
+#define VIRTIO_GPU_RESP_OK_NODATA 0x1100
+#define VIRTIO_GPU_RESP_OK_DISPLAY_INFO 0x1101
+
+/* Maximum number of scanouts */
+#define VIRTIO_GPU_MAX_SCANOUTS 16
+
+/* ===================================================================== */
+/* Virtqueue Structures */
+/* ===================================================================== */
+
+typedef struct {
+ uint64_t addr;
+ uint32_t len;
+ uint16_t flags;
+ uint16_t next;
+} __attribute__((packed)) virtq_desc_t;
+
+typedef struct {
+ uint16_t flags;
+ uint16_t idx;
+ uint16_t ring[];
+} __attribute__((packed)) virtq_avail_t;
+
+typedef struct {
+ uint32_t id;
+ uint32_t len;
+} __attribute__((packed)) virtq_used_elem_t;
+
+typedef struct {
+ uint16_t flags;
+ uint16_t idx;
+ virtq_used_elem_t ring[];
+} __attribute__((packed)) virtq_used_t;
+
+/* ===================================================================== */
+/* GPU Command Structures */
+/* ===================================================================== */
+
+typedef struct {
+ uint32_t type;
+ uint32_t flags;
+ uint64_t fence_id;
+ uint32_t ctx_id;
+ uint32_t padding;
+} __attribute__((packed)) virtio_gpu_ctrl_hdr_t;
+
+typedef struct {
+ virtio_gpu_ctrl_hdr_t hdr;
+ uint32_t scanouts;
+ uint32_t padding;
+ struct {
+ uint32_t x, y, width, height;
+ uint32_t enabled;
+ uint32_t flags;
+ } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
+} __attribute__((packed)) virtio_gpu_display_info_t;
+
+/* ===================================================================== */
+/* Driver State */
+/* ===================================================================== */
+
+typedef struct {
+ pci_device_t *pci;
+ volatile uint8_t *common_cfg; /* Common config BAR */
+ volatile uint8_t *notify_base; /* Notify BAR */
+ volatile uint8_t *device_cfg; /* Device-specific config */
+ uint32_t notify_offset_mult;
+
+ /* Virtqueues */
+ virtq_desc_t *controlq_desc;
+ virtq_avail_t *controlq_avail;
+ virtq_used_t *controlq_used;
+ uint16_t controlq_size;
+ uint16_t controlq_last_used;
+
+ /* Display info */
+ uint32_t width;
+ uint32_t height;
+ bool has_virgl; /* 3D acceleration */
+ bool initialized;
+} virtio_gpu_device_t;
+
+static virtio_gpu_device_t vgpu_dev;
+
+/* ===================================================================== */
+/* MMIO Helpers */
+/* ===================================================================== */
+
+static inline void vgpu_write8(volatile uint8_t *base, uint32_t offset,
+ uint8_t val) {
+ *(volatile uint8_t *)(base + offset) = val;
+}
+
+static inline void vgpu_write16(volatile uint8_t *base, uint32_t offset,
+ uint16_t val) {
+ *(volatile uint16_t *)(base + offset) = val;
+}
+
+static inline void vgpu_write32(volatile uint8_t *base, uint32_t offset,
+ uint32_t val) {
+ *(volatile uint32_t *)(base + offset) = val;
+}
+
+static inline void vgpu_write64(volatile uint8_t *base, uint32_t offset,
+ uint64_t val) {
+ *(volatile uint64_t *)(base + offset) = val;
+}
+
+static inline uint8_t vgpu_read8(volatile uint8_t *base, uint32_t offset) {
+ return *(volatile uint8_t *)(base + offset);
+}
+
+static inline uint16_t vgpu_read16(volatile uint8_t *base, uint32_t offset) {
+ return *(volatile uint16_t *)(base + offset);
+}
+
+static inline uint32_t vgpu_read32(volatile uint8_t *base, uint32_t offset) {
+ return *(volatile uint32_t *)(base + offset);
+}
+
+/* ===================================================================== */
+/* Virtqueue Operations */
+/* ===================================================================== */
+
+static int vgpu_alloc_virtqueue(uint16_t size) {
+ /* Allocate descriptor table, available ring, and used ring */
+ size_t desc_size = sizeof(virtq_desc_t) * size;
+ size_t avail_size = sizeof(uint16_t) * (3 + size);
+ size_t used_size = sizeof(uint16_t) * 3 + sizeof(virtq_used_elem_t) * size;
+
+ size_t total = desc_size + avail_size + used_size;
+ total = (total + 4095) & ~4095; /* Page align */
+
+ void *mem = (void *)pmm_alloc_pages(total / 4096);
+ if (!mem)
+ return -1;
+
+ /* Zero the memory */
+ for (size_t i = 0; i < total; i++) {
+ ((uint8_t *)mem)[i] = 0;
+ }
+
+ vgpu_dev.controlq_desc = (virtq_desc_t *)mem;
+ vgpu_dev.controlq_avail = (virtq_avail_t *)((uint8_t *)mem + desc_size);
+ vgpu_dev.controlq_used =
+ (virtq_used_t *)((uint8_t *)mem + desc_size + avail_size);
+ vgpu_dev.controlq_size = size;
+ vgpu_dev.controlq_last_used = 0;
+
+ return 0;
+}
+
+/* ===================================================================== */
+/* Capability Parsing */
+/* ===================================================================== */
+
+/* Helper to read a BAR from config space, allocating if needed */
+static uint64_t vgpu_read_bar(pci_device_t *pci, uint8_t bar_num) {
+ uint16_t bar_offset = PCI_BAR0 + (bar_num * 4);
+ uint32_t bar_raw = pci_read32(pci->bus, pci->slot, pci->func, bar_offset);
+ uint32_t flags = bar_raw & 0xF;
+ bool is_64bit = (flags & 0x4);
+
+ /* Check if already assigned */
+ uint64_t addr = bar_raw & 0xFFFFFFF0;
+ if (is_64bit) {
+ uint32_t bar_high =
+ pci_read32(pci->bus, pci->slot, pci->func, bar_offset + 4);
+ addr |= ((uint64_t)bar_high << 32);
+ }
+
+ if (addr != 0) {
+ return addr;
+ }
+
+ /* Need to allocate - size the BAR */
+ pci_write32(pci->bus, pci->slot, pci->func, bar_offset, 0xFFFFFFFF);
+ uint32_t size_val = pci_read32(pci->bus, pci->slot, pci->func, bar_offset);
+ pci_write32(pci->bus, pci->slot, pci->func, bar_offset, bar_raw);
+
+ if (size_val == 0 || size_val == 0xFFFFFFFF) {
+ return 0;
+ }
+
+ uint32_t size_mask = size_val & 0xFFFFFFF0;
+ uint32_t size = (~size_mask) + 1;
+ if (size == 0)
+ size = 0x4000;
+
+ /* Use a safe MMIO address above what PCI init uses */
+ static uint64_t vgpu_mmio_base = 0x10100000;
+ vgpu_mmio_base = (vgpu_mmio_base + size - 1) & ~((uint64_t)size - 1);
+ addr = vgpu_mmio_base;
+
+ pci_write32(pci->bus, pci->slot, pci->func, bar_offset,
+ (uint32_t)addr | (flags & 0xF));
+ if (is_64bit) {
+ pci_write32(pci->bus, pci->slot, pci->func, bar_offset + 4,
+ (uint32_t)(addr >> 32));
+ }
+
+ vgpu_mmio_base += size;
+
+ printk("VGPU: Allocated BAR%d at 0x%llx (size 0x%x)\n", bar_num, addr, size);
+ return addr;
+}
+
+static int vgpu_parse_capabilities(pci_device_t *pci) {
+ /* Check if capabilities list exists */
+ uint16_t status = pci_read16(pci->bus, pci->slot, pci->func, PCI_STATUS);
+ if (!(status & PCI_STATUS_CAP_LIST)) {
+ printk("VGPU: No PCI capabilities list\n");
+ return -1;
+ }
+
+ /* Get first capability pointer */
+ uint8_t cap_ptr = pci_read8(pci->bus, pci->slot, pci->func, PCI_CAPABILITIES);
+ cap_ptr &= 0xFC; /* Mask lower 2 bits */
+
+ printk("VGPU: Parsing capabilities (first cap at 0x%02x)\n", cap_ptr);
+
+ /* Walk capabilities list */
+ int found_common = 0;
+ int ttl = 48;
+
+ while (cap_ptr && ttl-- > 0) {
+ uint8_t cap_id = pci_read8(pci->bus, pci->slot, pci->func, cap_ptr);
+
+ if (cap_id == PCI_CAP_ID_VNDR) { /* Vendor-specific = virtio */
+ uint8_t cfg_type = pci_read8(pci->bus, pci->slot, pci->func, cap_ptr + 3);
+ uint8_t bar_num = pci_read8(pci->bus, pci->slot, pci->func, cap_ptr + 4);
+ uint32_t offset = pci_read32(pci->bus, pci->slot, pci->func, cap_ptr + 8);
+
+ /* Read (or allocate) the BAR */
+ uint64_t bar_addr = vgpu_read_bar(pci, bar_num);
+
+ if (bar_addr == 0) {
+ cap_ptr = pci_read8(pci->bus, pci->slot, pci->func, cap_ptr + 1);
+ cap_ptr &= 0xFC;
+ continue;
+ }
+
+ volatile uint8_t *cfg_base = (volatile uint8_t *)(bar_addr + offset);
+
+ switch (cfg_type) {
+ case VIRTIO_PCI_CAP_COMMON_CFG:
+ vgpu_dev.common_cfg = cfg_base;
+ found_common = 1;
+ printk("VGPU: Found common config at BAR%d+0x%x\n", bar_num, offset);
+ break;
+ case VIRTIO_PCI_CAP_NOTIFY_CFG:
+ vgpu_dev.notify_base = cfg_base;
+ vgpu_dev.notify_offset_mult =
+ pci_read32(pci->bus, pci->slot, pci->func, cap_ptr + 16);
+ printk("VGPU: Found notify config at BAR%d+0x%x\n", bar_num, offset);
+ break;
+ case VIRTIO_PCI_CAP_DEVICE_CFG:
+ vgpu_dev.device_cfg = cfg_base;
+ printk("VGPU: Found device config at BAR%d+0x%x\n", bar_num, offset);
+ break;
+ }
+ }
+
+ cap_ptr = pci_read8(pci->bus, pci->slot, pci->func, cap_ptr + 1);
+ cap_ptr &= 0xFC;
+ }
+
+ return found_common ? 0 : -1;
+}
+
+/* ===================================================================== */
+/* Device Initialization */
+/* ===================================================================== */
+
+int virtio_gpu_init(pci_device_t *pci) {
+ if (!pci || vgpu_dev.initialized) {
+ return -1;
+ }
+
+ printk("VGPU: Initializing virtio-gpu driver\n");
+ printk("VGPU: Device at %02x:%02x.%x\n", pci->bus, pci->slot, pci->func);
+
+ vgpu_dev.pci = pci;
+
+ /* Enable PCI device */
+ pci_enable_device(pci);
+
+ /* Parse PCI capabilities to find virtio config areas */
+ if (vgpu_parse_capabilities(pci) < 0) {
+ printk("VGPU: Failed to parse capabilities\n");
+ return -1;
+ }
+
+ if (!vgpu_dev.common_cfg) {
+ printk("VGPU: Common config not found\n");
+ return -1;
+ }
+
+ /* Reset device */
+ vgpu_write8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS, 0);
+
+ /* Set ACKNOWLEDGE status */
+ vgpu_write8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS,
+ VIRTIO_STATUS_ACKNOWLEDGE);
+
+ /* Set DRIVER status */
+ uint8_t status = vgpu_read8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS);
+ vgpu_write8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS,
+ status | VIRTIO_STATUS_DRIVER);
+
+ /* Read features */
+ vgpu_write32(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_DFSELECT, 0);
+ uint32_t features = vgpu_read32(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_DF);
+
+ vgpu_dev.has_virgl = (features & VIRTIO_GPU_F_VIRGL) != 0;
+ printk("VGPU: Features: 0x%08x (virgl=%d)\n", features, vgpu_dev.has_virgl);
+
+ /* Accept features */
+ vgpu_write32(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_GFSELECT, 0);
+ vgpu_write32(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_GF, features);
+
+ /* Set FEATURES_OK */
+ status = vgpu_read8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS);
+ vgpu_write8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS,
+ status | VIRTIO_STATUS_FEATURES_OK);
+
+ /* Verify FEATURES_OK was set */
+ status = vgpu_read8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS);
+ if (!(status & VIRTIO_STATUS_FEATURES_OK)) {
+ printk("VGPU: Device did not accept features\n");
+ return -1;
+ }
+
+ /* Get number of queues */
+ uint16_t num_queues =
+ vgpu_read16(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_NUMQ);
+ printk("VGPU: Device has %d queues\n", num_queues);
+
+ if (num_queues < 1) {
+ printk("VGPU: No queues available\n");
+ return -1;
+ }
+
+ /* Set up control queue (queue 0) */
+ vgpu_write16(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_SELECT, 0);
+ uint16_t queue_size =
+ vgpu_read16(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_SIZE);
+ printk("VGPU: Control queue size: %d\n", queue_size);
+
+ if (queue_size > 256)
+ queue_size = 256; /* Limit for safety */
+
+ if (vgpu_alloc_virtqueue(queue_size) < 0) {
+ printk("VGPU: Failed to allocate virtqueue\n");
+ return -1;
+ }
+
+ /* Tell device about queue addresses */
+ vgpu_write64(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_DESC,
+ (uint64_t)vgpu_dev.controlq_desc);
+ vgpu_write64(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_AVAIL,
+ (uint64_t)vgpu_dev.controlq_avail);
+ vgpu_write64(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_USED,
+ (uint64_t)vgpu_dev.controlq_used);
+
+ /* Enable queue */
+ vgpu_write16(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_Q_ENABLE, 1);
+
+ /* Set DRIVER_OK */
+ status = vgpu_read8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS);
+ vgpu_write8(vgpu_dev.common_cfg, VIRTIO_PCI_COMMON_STATUS,
+ status | VIRTIO_STATUS_DRIVER_OK);
+
+ printk("VGPU: Driver initialized (status=0x%02x)\n",
+ status | VIRTIO_STATUS_DRIVER_OK);
+
+ /* Default display size */
+ vgpu_dev.width = 1024;
+ vgpu_dev.height = 768;
+ vgpu_dev.initialized = true;
+
+ printk("VGPU: virtio-gpu ready (%dx%d, 3D=%s)\n", vgpu_dev.width,
+ vgpu_dev.height, vgpu_dev.has_virgl ? "enabled" : "disabled");
+
+ return 0;
+}
+
+/* ===================================================================== */
+/* Public API */
+/* ===================================================================== */
+
+bool virtio_gpu_is_available(void) { return vgpu_dev.initialized; }
+
+bool virtio_gpu_has_3d(void) {
+ return vgpu_dev.initialized && vgpu_dev.has_virgl;
+}
+
+void virtio_gpu_get_display_size(uint32_t *width, uint32_t *height) {
+ if (width)
+ *width = vgpu_dev.initialized ? vgpu_dev.width : 0;
+ if (height)
+ *height = vgpu_dev.initialized ? vgpu_dev.height : 0;
+}
diff --git a/drivers/input/virtio_input.c b/drivers/input/virtio_input.c
index 18ed916..e617a07 100644
--- a/drivers/input/virtio_input.c
+++ b/drivers/input/virtio_input.c
@@ -1,100 +1,100 @@
/*
* Vib-OS - Virtio MMIO Mouse/Tablet Driver
- *
+ *
* Based on VibeOS implementation for QEMU virt machine.
* Uses virtio-tablet for absolute positioning (EV_ABS events).
*/
-#include "types.h"
#include "printk.h"
+#include "types.h"
/* ===================================================================== */
/* Virtio MMIO registers (QEMU virt machine) */
/* ===================================================================== */
-#define VIRTIO_MMIO_BASE 0x0a000000
-#define VIRTIO_MMIO_STRIDE 0x200
+#define VIRTIO_MMIO_BASE 0x0a000000
+#define VIRTIO_MMIO_STRIDE 0x200
-#define VIRTIO_MMIO_MAGIC 0x000
-#define VIRTIO_MMIO_VERSION 0x004
-#define VIRTIO_MMIO_DEVICE_ID 0x008
-#define VIRTIO_MMIO_VENDOR_ID 0x00c
+#define VIRTIO_MMIO_MAGIC 0x000
+#define VIRTIO_MMIO_VERSION 0x004
+#define VIRTIO_MMIO_DEVICE_ID 0x008
+#define VIRTIO_MMIO_VENDOR_ID 0x00c
#define VIRTIO_MMIO_DEVICE_FEATURES 0x010
#define VIRTIO_MMIO_DRIVER_FEATURES 0x020
-#define VIRTIO_MMIO_QUEUE_SEL 0x030
-#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
-#define VIRTIO_MMIO_QUEUE_NUM 0x038
-#define VIRTIO_MMIO_QUEUE_READY 0x044
-#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
+#define VIRTIO_MMIO_QUEUE_SEL 0x030
+#define VIRTIO_MMIO_QUEUE_NUM_MAX 0x034
+#define VIRTIO_MMIO_QUEUE_NUM 0x038
+#define VIRTIO_MMIO_QUEUE_READY 0x044
+#define VIRTIO_MMIO_QUEUE_NOTIFY 0x050
#define VIRTIO_MMIO_INTERRUPT_STATUS 0x060
-#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
-#define VIRTIO_MMIO_STATUS 0x070
-#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
+#define VIRTIO_MMIO_INTERRUPT_ACK 0x064
+#define VIRTIO_MMIO_STATUS 0x070
+#define VIRTIO_MMIO_QUEUE_DESC_LOW 0x080
#define VIRTIO_MMIO_QUEUE_DESC_HIGH 0x084
#define VIRTIO_MMIO_QUEUE_AVAIL_LOW 0x090
#define VIRTIO_MMIO_QUEUE_AVAIL_HIGH 0x094
-#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0
+#define VIRTIO_MMIO_QUEUE_USED_LOW 0x0a0
#define VIRTIO_MMIO_QUEUE_USED_HIGH 0x0a4
-#define VIRTIO_STATUS_ACK 1
-#define VIRTIO_STATUS_DRIVER 2
+#define VIRTIO_STATUS_ACK 1
+#define VIRTIO_STATUS_DRIVER 2
#define VIRTIO_STATUS_DRIVER_OK 4
#define VIRTIO_STATUS_FEATURES_OK 8
-#define VIRTIO_DEV_INPUT 18
+#define VIRTIO_DEV_INPUT 18
/* Linux input event types */
-#define EV_SYN 0x00
-#define EV_KEY 0x01
-#define EV_REL 0x02
-#define EV_ABS 0x03
+#define EV_SYN 0x00
+#define EV_KEY 0x01
+#define EV_REL 0x02
+#define EV_ABS 0x03
/* Absolute axis codes */
-#define ABS_X 0x00
-#define ABS_Y 0x01
+#define ABS_X 0x00
+#define ABS_Y 0x01
/* Button codes */
-#define BTN_LEFT 0x110
-#define BTN_RIGHT 0x111
-#define BTN_MIDDLE 0x112
+#define BTN_LEFT 0x110
+#define BTN_RIGHT 0x111
+#define BTN_MIDDLE 0x112
/* Virtio input config */
-#define VIRTIO_INPUT_CFG_SELECT 0x100
-#define VIRTIO_INPUT_CFG_SUBSEL 0x101
-#define VIRTIO_INPUT_CFG_SIZE 0x102
-#define VIRTIO_INPUT_CFG_DATA 0x108
+#define VIRTIO_INPUT_CFG_SELECT 0x100
+#define VIRTIO_INPUT_CFG_SUBSEL 0x101
+#define VIRTIO_INPUT_CFG_SIZE 0x102
+#define VIRTIO_INPUT_CFG_DATA 0x108
#define VIRTIO_INPUT_CFG_ID_NAME 0x01
/* Virtqueue structures */
typedef struct __attribute__((packed)) {
- uint64_t addr;
- uint32_t len;
- uint16_t flags;
- uint16_t next;
+ uint64_t addr;
+ uint32_t len;
+ uint16_t flags;
+ uint16_t next;
} virtq_desc_t;
typedef struct __attribute__((packed)) {
- uint16_t flags;
- uint16_t idx;
- uint16_t ring[16];
+ uint16_t flags;
+ uint16_t idx;
+ uint16_t ring[16];
} virtq_avail_t;
typedef struct __attribute__((packed)) {
- uint32_t id;
- uint32_t len;
+ uint32_t id;
+ uint32_t len;
} virtq_used_elem_t;
typedef struct __attribute__((packed)) {
- uint16_t flags;
- uint16_t idx;
- virtq_used_elem_t ring[16];
+ uint16_t flags;
+ uint16_t idx;
+ virtq_used_elem_t ring[16];
} virtq_used_t;
/* Input event structure */
typedef struct __attribute__((packed)) {
- uint16_t type;
- uint16_t code;
- uint32_t value;
+ uint16_t type;
+ uint16_t code;
+ uint32_t value;
} virtio_input_event_t;
#define QUEUE_SIZE 16
@@ -116,7 +116,7 @@ static uint8_t queue_mem[4096] __attribute__((aligned(4096)));
static virtio_input_event_t event_bufs[QUEUE_SIZE] __attribute__((aligned(16)));
/* Mouse state */
-static int mouse_x = 16384; /* Raw 0-32767 */
+static int mouse_x = 16384; /* Raw 0-32767 */
static int mouse_y = 16384;
static uint8_t mouse_buttons = 0;
@@ -128,26 +128,94 @@ static virtq_used_t *kbd_used = 0;
static virtio_input_event_t *kbd_events = 0;
static uint16_t kbd_last_used_idx = 0;
static uint8_t kbd_queue_mem[4096] __attribute__((aligned(4096)));
-static virtio_input_event_t kbd_event_bufs[QUEUE_SIZE] __attribute__((aligned(16)));
+static virtio_input_event_t kbd_event_bufs[QUEUE_SIZE]
+ __attribute__((aligned(16)));
/* Keyboard callback */
static void (*gui_key_callback)(int key) = 0;
-/* Scancode to ASCII (basic US keyboard layout) */
-static const char scancode_to_ascii[128] = {
- 0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\b',
- '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
- 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '`',
- 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', 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
+/* Modifier key states */
+static int shift_held = 0;
+static int ctrl_held = 0;
+
+/* Linux keycode to ASCII mapping (not PS/2 scancodes!) */
+/* virtio-keyboard sends Linux KEY_* codes, not PS/2 scancodes */
+static const char keycode_to_ascii[128] = {
+ 0, 27, '1', '2',
+ '3', '4', '5', '6', /* 0-7 */
+ '7', '8', '9', '0',
+ '-', '=', '\b', '\t', /* 8-15: KEY_7..KEY_TAB */
+ 'q', 'w', 'e', 'r',
+ 't', 'y', 'u', 'i', /* 16-23: KEY_Q..KEY_I */
+ 'o', 'p', '[', ']',
+ '\n', 0, 'a', 's', /* 24-31: KEY_O..KEY_S */
+ 'd', 'f', 'g', 'h',
+ 'j', 'k', 'l', ';', /* 32-39: KEY_D..KEY_SEMICOLON */
+ '\'', '`', 0, '\\',
+ 'z', 'x', 'c', 'v', /* 40-47: KEY_APOSTROPHE..KEY_V */
+ 'b', 'n', 'm', ',',
+ '.', '/', 0, '*', /* 48-55: KEY_B..KEY_KPASTERISK */
+ 0, ' ', 0, 0,
+ 0, 0, 0, 0, /* 56-63: KEY_LEFTALT..KEY_F5 */
+ 0, 0, 0, 0,
+ 0, 0, 0, '7', /* 64-71: KEY_F6..KEY_KP7 */
+ '8', '9', '-', '4',
+ '5', '6', '+', '1', /* 72-79: KEY_KP8..KEY_KP1 */
+ '2', '3', '0', '.',
+ 0, 0, 0, 0, /* 80-87: KEY_KP2..KEY_F12 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 88-95 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 96-103 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 104-111 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 112-119 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0 /* 120-127 */
+};
+
+/* Shifted keycode to ASCII mapping for symbols */
+static const char keycode_to_ascii_shifted[128] = {
+ 0, 27, '!', '@',
+ '#', '$', '%', '^', /* 0-7: shift+1 = !, shift+2 = @, etc */
+ '&', '*', '(', ')',
+ '_', '+', '\b', '\t', /* 8-15: shift+- = _, shift+= = + */
+ 'Q', 'W', 'E', 'R',
+ 'T', 'Y', 'U', 'I', /* 16-23: uppercase letters */
+ 'O', 'P', '{', '}',
+ '\n', 0, 'A', 'S', /* 24-31: shift+[ = {, shift+] = } */
+ 'D', 'F', 'G', 'H',
+ 'J', 'K', 'L', ':', /* 32-39: shift+; = : */
+ '"', '~', 0, '|',
+ 'Z', 'X', 'C', 'V', /* 40-47: shift+' = ", shift+` = ~, shift+\ = | */
+ 'B', 'N', 'M', '<',
+ '>', '?', 0, '*', /* 48-55: shift+, = <, shift+. = >, shift+/ = ? */
+ 0, ' ', 0, 0,
+ 0, 0, 0, 0, /* 56-63 */
+ 0, 0, 0, 0,
+ 0, 0, 0, '7', /* 64-71 */
+ '8', '9', '-', '4',
+ '5', '6', '+', '1', /* 72-79 */
+ '2', '3', '0', '.',
+ 0, 0, 0, 0, /* 80-87 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 88-95 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 96-103 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 104-111 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, /* 112-119 */
+ 0, 0, 0, 0,
+ 0, 0, 0, 0 /* 120-127 */
};
/* Key callback (forward declaration) */
static void (*key_callback)(int key) = 0;
/* Screen dimensions */
-#define SCREEN_WIDTH 1024
+#define SCREEN_WIDTH 1024
#define SCREEN_HEIGHT 768
/* ===================================================================== */
@@ -156,22 +224,22 @@ static void (*key_callback)(int key) = 0;
static void mmio_barrier(void) {
#ifdef ARCH_ARM64
- asm volatile("dsb sy" ::: "memory");
+ asm volatile("dsb sy" ::: "memory");
#elif defined(ARCH_X86_64) || defined(ARCH_X86)
- asm volatile("mfence" ::: "memory");
+ asm volatile("mfence" ::: "memory");
#endif
}
static uint32_t mmio_read32(volatile uint32_t *addr) {
- uint32_t val = *addr;
- mmio_barrier();
- return val;
+ uint32_t val = *addr;
+ mmio_barrier();
+ return val;
}
static void mmio_write32(volatile uint32_t *addr, uint32_t val) {
- mmio_barrier();
- *addr = val;
- mmio_barrier();
+ mmio_barrier();
+ *addr = val;
+ mmio_barrier();
}
/* ===================================================================== */
@@ -179,37 +247,41 @@ static void mmio_write32(volatile uint32_t *addr, uint32_t val) {
/* ===================================================================== */
static volatile uint32_t *find_virtio_tablet(void) {
- for (int i = 0; i < 32; i++) {
- volatile uint32_t *base = (volatile uint32_t *)(uintptr_t)(VIRTIO_MMIO_BASE + i * VIRTIO_MMIO_STRIDE);
- volatile uint8_t *base8 = (volatile uint8_t *)(uintptr_t)(VIRTIO_MMIO_BASE + i * VIRTIO_MMIO_STRIDE);
-
- uint32_t magic = mmio_read32(base + VIRTIO_MMIO_MAGIC/4);
- uint32_t device_id = mmio_read32(base + VIRTIO_MMIO_DEVICE_ID/4);
-
- if (magic != 0x74726976 || device_id != VIRTIO_DEV_INPUT) {
- continue;
- }
-
- /* Check device name for "Tablet" */
- base8[VIRTIO_INPUT_CFG_SELECT] = VIRTIO_INPUT_CFG_ID_NAME;
- base8[VIRTIO_INPUT_CFG_SUBSEL] = 0;
- mmio_barrier();
-
- uint8_t size = base8[VIRTIO_INPUT_CFG_SIZE];
- char name[32] = {0};
- for (int j = 0; j < 31 && j < size; j++) {
- name[j] = base8[VIRTIO_INPUT_CFG_DATA + j];
- }
-
- printk(KERN_INFO "MOUSE: Found input device: %s\n", name);
-
- /* Look for "Tablet" */
- if (name[0] == 'Q' && name[5] == 'V' && name[12] == 'T') {
- return base;
- }
+ for (int i = 0; i < 32; i++) {
+ volatile uint32_t *base =
+ (volatile uint32_t *)(uintptr_t)(VIRTIO_MMIO_BASE +
+ i * VIRTIO_MMIO_STRIDE);
+ volatile uint8_t *base8 =
+ (volatile uint8_t *)(uintptr_t)(VIRTIO_MMIO_BASE +
+ i * VIRTIO_MMIO_STRIDE);
+
+ uint32_t magic = mmio_read32(base + VIRTIO_MMIO_MAGIC / 4);
+ uint32_t device_id = mmio_read32(base + VIRTIO_MMIO_DEVICE_ID / 4);
+
+ if (magic != 0x74726976 || device_id != VIRTIO_DEV_INPUT) {
+ continue;
+ }
+
+ /* Check device name for "Tablet" */
+ base8[VIRTIO_INPUT_CFG_SELECT] = VIRTIO_INPUT_CFG_ID_NAME;
+ base8[VIRTIO_INPUT_CFG_SUBSEL] = 0;
+ mmio_barrier();
+
+ uint8_t size = base8[VIRTIO_INPUT_CFG_SIZE];
+ char name[32] = {0};
+ for (int j = 0; j < 31 && j < size; j++) {
+ name[j] = base8[VIRTIO_INPUT_CFG_DATA + j];
+ }
+
+ printk(KERN_INFO "MOUSE: Found input device: %s\n", name);
+
+ /* Look for "Tablet" */
+ if (name[0] == 'Q' && name[5] == 'V' && name[12] == 'T') {
+ return base;
}
-
- return 0;
+ }
+
+ return 0;
}
/* ===================================================================== */
@@ -217,49 +289,53 @@ static volatile uint32_t *find_virtio_tablet(void) {
/* ===================================================================== */
void mouse_poll(void) {
- if (!mouse_base || !used) {
- return;
- }
-
- mmio_barrier();
- uint16_t current_used = used->idx;
-
- while (last_used_idx != current_used) {
- uint16_t idx = last_used_idx % QUEUE_SIZE;
- uint32_t desc_idx = used->ring[idx].id;
-
- virtio_input_event_t *ev = &events[desc_idx];
-
- /* Process event */
- if (ev->type == EV_ABS) {
- if (ev->code == ABS_X) {
- mouse_x = ev->value;
- } else if (ev->code == ABS_Y) {
- mouse_y = ev->value;
- }
- } else if (ev->type == EV_KEY) {
- int pressed = (ev->value != 0);
- if (ev->code == BTN_LEFT) {
- if (pressed) mouse_buttons |= 1;
- else mouse_buttons &= ~1;
- } else if (ev->code == BTN_RIGHT) {
- if (pressed) mouse_buttons |= 2;
- else mouse_buttons &= ~2;
- }
- }
-
- /* Re-add descriptor to available ring */
- uint16_t avail_idx = avail->idx % QUEUE_SIZE;
- avail->ring[avail_idx] = desc_idx;
- avail->idx++;
-
- last_used_idx++;
+ if (!mouse_base || !used) {
+ return;
+ }
+
+ mmio_barrier();
+ uint16_t current_used = used->idx;
+
+ while (last_used_idx != current_used) {
+ uint16_t idx = last_used_idx % QUEUE_SIZE;
+ uint32_t desc_idx = used->ring[idx].id;
+
+ virtio_input_event_t *ev = &events[desc_idx];
+
+ /* Process event */
+ if (ev->type == EV_ABS) {
+ if (ev->code == ABS_X) {
+ mouse_x = ev->value;
+ } else if (ev->code == ABS_Y) {
+ mouse_y = ev->value;
+ }
+ } else if (ev->type == EV_KEY) {
+ int pressed = (ev->value != 0);
+ if (ev->code == BTN_LEFT) {
+ if (pressed)
+ mouse_buttons |= 1;
+ else
+ mouse_buttons &= ~1;
+ } else if (ev->code == BTN_RIGHT) {
+ if (pressed)
+ mouse_buttons |= 2;
+ else
+ mouse_buttons &= ~2;
+ }
}
-
- /* Notify device */
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NOTIFY/4, 0);
- mmio_write32(mouse_base + VIRTIO_MMIO_INTERRUPT_ACK/4,
- mmio_read32(mouse_base + VIRTIO_MMIO_INTERRUPT_STATUS/4));
+
+ /* Re-add descriptor to available ring */
+ uint16_t avail_idx = avail->idx % QUEUE_SIZE;
+ avail->ring[avail_idx] = desc_idx;
+ avail->idx++;
+
+ last_used_idx++;
+ }
+
+ /* Notify device */
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NOTIFY / 4, 0);
+ mmio_write32(mouse_base + VIRTIO_MMIO_INTERRUPT_ACK / 4,
+ mmio_read32(mouse_base + VIRTIO_MMIO_INTERRUPT_STATUS / 4));
}
/* ===================================================================== */
@@ -267,16 +343,18 @@ void mouse_poll(void) {
/* ===================================================================== */
void mouse_get_position(int *x, int *y) {
- mouse_poll();
-
- /* Scale from 0-32767 to screen dimensions */
- if (x) *x = (mouse_x * SCREEN_WIDTH) / 32768;
- if (y) *y = (mouse_y * SCREEN_HEIGHT) / 32768;
+ mouse_poll();
+
+ /* Scale from 0-32767 to screen dimensions */
+ if (x)
+ *x = (mouse_x * SCREEN_WIDTH) / 32768;
+ if (y)
+ *y = (mouse_y * SCREEN_HEIGHT) / 32768;
}
int mouse_get_buttons(void) {
- mouse_poll();
- return mouse_buttons;
+ mouse_poll();
+ return mouse_buttons;
}
/* ===================================================================== */
@@ -284,92 +362,101 @@ int mouse_get_buttons(void) {
/* ===================================================================== */
int mouse_init(void) {
- printk(KERN_INFO "MOUSE: Initializing virtio-tablet...\n");
-
- mouse_base = find_virtio_tablet();
- if (!mouse_base) {
- printk(KERN_WARNING "MOUSE: No virtio tablet found\n");
- return -1;
- }
-
- /* Reset device */
- mmio_write32(mouse_base + VIRTIO_MMIO_STATUS/4, 0);
- while (mmio_read32(mouse_base + VIRTIO_MMIO_STATUS/4) != 0) {
- asm volatile("nop");
- }
-
- /* Acknowledge */
- mmio_write32(mouse_base + VIRTIO_MMIO_STATUS/4, VIRTIO_STATUS_ACK);
- mmio_write32(mouse_base + VIRTIO_MMIO_STATUS/4, VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER);
-
- /* Accept no special features */
- mmio_write32(mouse_base + VIRTIO_MMIO_DRIVER_FEATURES/4, 0);
- mmio_write32(mouse_base + VIRTIO_MMIO_STATUS/4,
- VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER | VIRTIO_STATUS_FEATURES_OK);
-
- /* Setup queue 0 */
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_SEL/4, 0);
-
- uint32_t max_queue = mmio_read32(mouse_base + VIRTIO_MMIO_QUEUE_NUM_MAX/4);
- if (max_queue < QUEUE_SIZE) {
- printk(KERN_WARNING "MOUSE: Queue too small\n");
- return -1;
- }
-
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NUM/4, QUEUE_SIZE);
-
- /* Setup queue memory */
- desc = (virtq_desc_t *)queue_mem;
- avail = (virtq_avail_t *)(queue_mem + QUEUE_SIZE * sizeof(virtq_desc_t));
- used = (virtq_used_t *)(queue_mem + 2048);
- events = event_bufs;
-
- /* Set queue addresses */
- uint64_t desc_addr = (uint64_t)(uintptr_t)desc;
- uint64_t avail_addr = (uint64_t)(uintptr_t)avail;
- uint64_t used_addr = (uint64_t)(uintptr_t)used;
-
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_DESC_LOW/4, (uint32_t)desc_addr);
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_DESC_HIGH/4, (uint32_t)(desc_addr >> 32));
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_AVAIL_LOW/4, (uint32_t)avail_addr);
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH/4, (uint32_t)(avail_addr >> 32));
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_USED_LOW/4, (uint32_t)used_addr);
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_USED_HIGH/4, (uint32_t)(used_addr >> 32));
-
- /* Initialize descriptors */
- for (int i = 0; i < QUEUE_SIZE; i++) {
- desc[i].addr = (uint64_t)(uintptr_t)&events[i];
- desc[i].len = sizeof(virtio_input_event_t);
- desc[i].flags = DESC_F_WRITE;
- desc[i].next = 0;
- }
-
- /* Fill available ring */
- avail->flags = 0;
- for (int i = 0; i < QUEUE_SIZE; i++) {
- avail->ring[i] = i;
- }
- avail->idx = QUEUE_SIZE;
-
- /* Queue ready */
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_READY/4, 1);
-
- /* Driver OK */
- mmio_write32(mouse_base + VIRTIO_MMIO_STATUS/4,
- VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER | VIRTIO_STATUS_FEATURES_OK | VIRTIO_STATUS_DRIVER_OK);
-
- /* Notify device */
- mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NOTIFY/4, 0);
-
- /* Check status */
- uint32_t status = mmio_read32(mouse_base + VIRTIO_MMIO_STATUS/4);
- if (status & 0x40) {
- printk(KERN_WARNING "MOUSE: Device reported failure!\n");
- return -1;
- }
-
- printk(KERN_INFO "MOUSE: Virtio tablet initialized!\n");
- return 0;
+ printk(KERN_INFO "MOUSE: Initializing virtio-tablet...\n");
+
+ mouse_base = find_virtio_tablet();
+ if (!mouse_base) {
+ printk(KERN_WARNING "MOUSE: No virtio tablet found\n");
+ return -1;
+ }
+
+ /* Reset device */
+ mmio_write32(mouse_base + VIRTIO_MMIO_STATUS / 4, 0);
+ while (mmio_read32(mouse_base + VIRTIO_MMIO_STATUS / 4) != 0) {
+ asm volatile("nop");
+ }
+
+ /* Acknowledge */
+ mmio_write32(mouse_base + VIRTIO_MMIO_STATUS / 4, VIRTIO_STATUS_ACK);
+ mmio_write32(mouse_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER);
+
+ /* Accept no special features */
+ mmio_write32(mouse_base + VIRTIO_MMIO_DRIVER_FEATURES / 4, 0);
+ mmio_write32(mouse_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER |
+ VIRTIO_STATUS_FEATURES_OK);
+
+ /* Setup queue 0 */
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_SEL / 4, 0);
+
+ uint32_t max_queue = mmio_read32(mouse_base + VIRTIO_MMIO_QUEUE_NUM_MAX / 4);
+ if (max_queue < QUEUE_SIZE) {
+ printk(KERN_WARNING "MOUSE: Queue too small\n");
+ return -1;
+ }
+
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NUM / 4, QUEUE_SIZE);
+
+ /* Setup queue memory */
+ desc = (virtq_desc_t *)queue_mem;
+ avail = (virtq_avail_t *)(queue_mem + QUEUE_SIZE * sizeof(virtq_desc_t));
+ used = (virtq_used_t *)(queue_mem + 2048);
+ events = event_bufs;
+
+ /* Set queue addresses */
+ uint64_t desc_addr = (uint64_t)(uintptr_t)desc;
+ uint64_t avail_addr = (uint64_t)(uintptr_t)avail;
+ uint64_t used_addr = (uint64_t)(uintptr_t)used;
+
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_DESC_LOW / 4,
+ (uint32_t)desc_addr);
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_DESC_HIGH / 4,
+ (uint32_t)(desc_addr >> 32));
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_AVAIL_LOW / 4,
+ (uint32_t)avail_addr);
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH / 4,
+ (uint32_t)(avail_addr >> 32));
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_USED_LOW / 4,
+ (uint32_t)used_addr);
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_USED_HIGH / 4,
+ (uint32_t)(used_addr >> 32));
+
+ /* Initialize descriptors */
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ desc[i].addr = (uint64_t)(uintptr_t)&events[i];
+ desc[i].len = sizeof(virtio_input_event_t);
+ desc[i].flags = DESC_F_WRITE;
+ desc[i].next = 0;
+ }
+
+ /* Fill available ring */
+ avail->flags = 0;
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ avail->ring[i] = i;
+ }
+ avail->idx = QUEUE_SIZE;
+
+ /* Queue ready */
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_READY / 4, 1);
+
+ /* Driver OK */
+ mmio_write32(mouse_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER |
+ VIRTIO_STATUS_FEATURES_OK | VIRTIO_STATUS_DRIVER_OK);
+
+ /* Notify device */
+ mmio_write32(mouse_base + VIRTIO_MMIO_QUEUE_NOTIFY / 4, 0);
+
+ /* Check status */
+ uint32_t status = mmio_read32(mouse_base + VIRTIO_MMIO_STATUS / 4);
+ if (status & 0x40) {
+ printk(KERN_WARNING "MOUSE: Device reported failure!\n");
+ return -1;
+ }
+
+ printk(KERN_INFO "MOUSE: Virtio tablet initialized!\n");
+ return 0;
}
/* ===================================================================== */
@@ -377,195 +464,246 @@ int mouse_init(void) {
/* ===================================================================== */
static volatile uint32_t *find_virtio_keyboard(void) {
- for (int i = 0; i < 32; i++) {
- volatile uint32_t *base = (volatile uint32_t *)(uintptr_t)(VIRTIO_MMIO_BASE + i * VIRTIO_MMIO_STRIDE);
- volatile uint8_t *base8 = (volatile uint8_t *)(uintptr_t)(VIRTIO_MMIO_BASE + i * VIRTIO_MMIO_STRIDE);
-
- uint32_t magic = mmio_read32(base + VIRTIO_MMIO_MAGIC/4);
- uint32_t device_id = mmio_read32(base + VIRTIO_MMIO_DEVICE_ID/4);
-
- if (magic != 0x74726976 || device_id != VIRTIO_DEV_INPUT) {
- continue;
- }
-
- /* Check device name for "Keyboard" */
- base8[VIRTIO_INPUT_CFG_SELECT] = VIRTIO_INPUT_CFG_ID_NAME;
- base8[VIRTIO_INPUT_CFG_SUBSEL] = 0;
- mmio_barrier();
-
- uint8_t size = base8[VIRTIO_INPUT_CFG_SIZE];
- char name[32] = {0};
- for (int j = 0; j < 31 && j < size; j++) {
- name[j] = base8[VIRTIO_INPUT_CFG_DATA + j];
- }
-
- printk(KERN_INFO "KEYBOARD: Checking device: %s\n", name);
-
- /* Look for "Keyboard" or "keyboard" anywhere in name */
- int found_kbd = 0;
- for (int j = 0; name[j] && name[j+7]; j++) {
- if ((name[j] == 'K' || name[j] == 'k') &&
- (name[j+1] == 'e' || name[j+1] == 'E') &&
- (name[j+2] == 'y' || name[j+2] == 'Y')) {
- found_kbd = 1;
- break;
- }
- }
-
- if (found_kbd) {
- printk(KERN_INFO "KEYBOARD: Found: %s\n", name);
- return base;
- }
+ for (int i = 0; i < 32; i++) {
+ volatile uint32_t *base =
+ (volatile uint32_t *)(uintptr_t)(VIRTIO_MMIO_BASE +
+ i * VIRTIO_MMIO_STRIDE);
+ volatile uint8_t *base8 =
+ (volatile uint8_t *)(uintptr_t)(VIRTIO_MMIO_BASE +
+ i * VIRTIO_MMIO_STRIDE);
+
+ uint32_t magic = mmio_read32(base + VIRTIO_MMIO_MAGIC / 4);
+ uint32_t device_id = mmio_read32(base + VIRTIO_MMIO_DEVICE_ID / 4);
+
+ if (magic != 0x74726976 || device_id != VIRTIO_DEV_INPUT) {
+ continue;
+ }
+
+ /* Check device name for "Keyboard" */
+ base8[VIRTIO_INPUT_CFG_SELECT] = VIRTIO_INPUT_CFG_ID_NAME;
+ base8[VIRTIO_INPUT_CFG_SUBSEL] = 0;
+ mmio_barrier();
+
+ uint8_t size = base8[VIRTIO_INPUT_CFG_SIZE];
+ char name[32] = {0};
+ for (int j = 0; j < 31 && j < size; j++) {
+ name[j] = base8[VIRTIO_INPUT_CFG_DATA + j];
+ }
+
+ printk(KERN_INFO "KEYBOARD: Checking device: %s\n", name);
+
+ /* Look for "Keyboard" or "keyboard" anywhere in name */
+ int found_kbd = 0;
+ for (int j = 0; name[j] && name[j + 7]; j++) {
+ if ((name[j] == 'K' || name[j] == 'k') &&
+ (name[j + 1] == 'e' || name[j + 1] == 'E') &&
+ (name[j + 2] == 'y' || name[j + 2] == 'Y')) {
+ found_kbd = 1;
+ break;
+ }
+ }
+
+ if (found_kbd) {
+ printk(KERN_INFO "KEYBOARD: Found: %s\n", name);
+ return base;
}
-
- return 0;
+ }
+
+ return 0;
}
static void keyboard_poll(void) {
- if (!kbd_base || !kbd_used) {
- return;
- }
-
- mmio_barrier();
- uint16_t current_used = kbd_used->idx;
-
- while (kbd_last_used_idx != current_used) {
- uint16_t idx = kbd_last_used_idx % QUEUE_SIZE;
- uint32_t desc_idx = kbd_used->ring[idx].id;
-
- virtio_input_event_t *ev = &kbd_events[desc_idx];
-
- /* Process keyboard event */
- if (ev->type == EV_KEY && ev->value == 1) { /* Key press only */
- int processed = 0;
- int vibe_key = 0;
-
- /* Manual mapping for Special Keys */
- if (ev->code == 103) vibe_key = 0x100; /* KEY_UP */
- else if (ev->code == 108) vibe_key = 0x101; /* KEY_DOWN */
- else if (ev->code == 105) vibe_key = 0x102; /* KEY_LEFT */
- else if (ev->code == 106) vibe_key = 0x103; /* KEY_RIGHT */
- else if (ev->code == 29) vibe_key = 0x109; /* CTRL (Left) */
- else if (ev->code == 97) vibe_key = 0x109; /* CTRL (Right) */
- else if (ev->code == 42) vibe_key = 0x10A; /* SHIFT (Left) */
- else if (ev->code == 54) vibe_key = 0x10A; /* SHIFT (Right) */
- else if (ev->code == 28) vibe_key = '\n'; /* Enter */
- else if (ev->code == 57) vibe_key = ' '; /* Space */
- else if (ev->code == 1) vibe_key = 27; /* Esc */
-
- if (vibe_key) {
- if (key_callback) key_callback(vibe_key);
- if (gui_key_callback) gui_key_callback(vibe_key);
- processed = 1;
- }
+ if (!kbd_base || !kbd_used) {
+ return;
+ }
+
+ mmio_barrier();
+ uint16_t current_used = kbd_used->idx;
+
+ while (kbd_last_used_idx != current_used) {
+ uint16_t idx = kbd_last_used_idx % QUEUE_SIZE;
+ uint32_t desc_idx = kbd_used->ring[idx].id;
+
+ virtio_input_event_t *ev = &kbd_events[desc_idx];
+
+ /* Process keyboard event */
+ if (ev->type == EV_KEY) {
+ /* Track shift key state */
+ if (ev->code == 42 || ev->code == 54) { /* Left or Right Shift */
+ shift_held = (ev->value != 0); /* 1 = pressed, 0 = released */
+ }
+
+ /* Track Ctrl key state */
+ if (ev->code == 29 || ev->code == 97) { /* Left or Right Ctrl */
+ ctrl_held = (ev->value != 0); /* 1 = pressed, 0 = released */
+ }
+
+ if (ev->value == 1) { /* Key press only */
+ int processed = 0;
+ int vibe_key = 0;
+
+ /* Manual mapping for Special Keys */
+ if (ev->code == 103)
+ vibe_key = 0x100; /* KEY_UP */
+ else if (ev->code == 108)
+ vibe_key = 0x101; /* KEY_DOWN */
+ else if (ev->code == 105)
+ vibe_key = 0x102; /* KEY_LEFT */
+ else if (ev->code == 106)
+ vibe_key = 0x103; /* KEY_RIGHT */
+ else if (ev->code == 29 || ev->code == 97)
+ processed = 1; /* Don't send ctrl as a key, just track state */
+ else if (ev->code == 42 || ev->code == 54)
+ processed = 1; /* Don't send shift as a key, just track state */
+ else if (ev->code == 28)
+ vibe_key = '\n'; /* Enter */
+ else if (ev->code == 57)
+ vibe_key = ' '; /* Space */
+ else if (ev->code == 1)
+ vibe_key = 27; /* Esc */
+
+ if (vibe_key) {
+ if (key_callback)
+ key_callback(vibe_key);
+ if (gui_key_callback)
+ gui_key_callback(vibe_key);
+ processed = 1;
+ }
- if (!processed && ev->code < 128) {
- char ascii = scancode_to_ascii[ev->code];
- /* Send to KAPI callback (direct handling) */
- if (key_callback && ascii) {
- key_callback(ascii);
- }
- /* Send to GUI callback (if registered) */
- if (gui_key_callback && ev->code < 128) {
- gui_key_callback(ev->code);
- }
+ if (!processed && ev->code < 128) {
+ char ascii;
+
+ /* Handle Ctrl+key combinations */
+ if (ctrl_held) {
+ /* Ctrl+letter generates control character (1-26) */
+ char base = keycode_to_ascii[ev->code];
+ if (base >= 'a' && base <= 'z') {
+ ascii = base - 'a' + 1; /* Ctrl+a=1, Ctrl+c=3, Ctrl+v=22, etc */
+ } else if (base >= 'A' && base <= 'Z') {
+ ascii = base - 'A' + 1;
+ } else {
+ ascii = 0; /* Don't process other Ctrl combinations */
}
+ } else if (shift_held) {
+ ascii = keycode_to_ascii_shifted[ev->code];
+ } else {
+ ascii = keycode_to_ascii[ev->code];
+ }
+
+ /* Send ASCII to both callbacks */
+ if (key_callback && ascii) {
+ key_callback(ascii);
+ }
+ /* Send ASCII to GUI callback too (not raw keycode!) */
+ if (gui_key_callback && ascii) {
+ gui_key_callback(ascii);
+ }
}
-
- /* Re-add descriptor to available ring */
- uint16_t avail_idx = kbd_avail->idx % QUEUE_SIZE;
- kbd_avail->ring[avail_idx] = desc_idx;
- kbd_avail->idx++;
-
- kbd_last_used_idx++;
+ }
}
-
- /* Notify device */
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NOTIFY/4, 0);
- mmio_write32(kbd_base + VIRTIO_MMIO_INTERRUPT_ACK/4,
- mmio_read32(kbd_base + VIRTIO_MMIO_INTERRUPT_STATUS/4));
+
+ /* Re-add descriptor to available ring */
+ uint16_t avail_idx = kbd_avail->idx % QUEUE_SIZE;
+ kbd_avail->ring[avail_idx] = desc_idx;
+ kbd_avail->idx++;
+
+ kbd_last_used_idx++;
+ }
+
+ /* Notify device */
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NOTIFY / 4, 0);
+ mmio_write32(kbd_base + VIRTIO_MMIO_INTERRUPT_ACK / 4,
+ mmio_read32(kbd_base + VIRTIO_MMIO_INTERRUPT_STATUS / 4));
}
static int keyboard_init(void) {
- printk(KERN_INFO "KEYBOARD: Initializing virtio-keyboard...\n");
-
- kbd_base = find_virtio_keyboard();
- if (!kbd_base) {
- printk(KERN_WARNING "KEYBOARD: No virtio keyboard found\n");
- return -1;
- }
-
- /* Reset device */
- mmio_write32(kbd_base + VIRTIO_MMIO_STATUS/4, 0);
- while (mmio_read32(kbd_base + VIRTIO_MMIO_STATUS/4) != 0) {
- asm volatile("nop");
- }
-
- /* Acknowledge */
- mmio_write32(kbd_base + VIRTIO_MMIO_STATUS/4, VIRTIO_STATUS_ACK);
- mmio_write32(kbd_base + VIRTIO_MMIO_STATUS/4, VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER);
-
- /* Accept no special features */
- mmio_write32(kbd_base + VIRTIO_MMIO_DRIVER_FEATURES/4, 0);
- mmio_write32(kbd_base + VIRTIO_MMIO_STATUS/4,
- VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER | VIRTIO_STATUS_FEATURES_OK);
-
- /* Setup queue 0 */
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_SEL/4, 0);
-
- uint32_t max_queue = mmio_read32(kbd_base + VIRTIO_MMIO_QUEUE_NUM_MAX/4);
- if (max_queue < QUEUE_SIZE) {
- printk(KERN_WARNING "KEYBOARD: Queue too small\n");
- return -1;
- }
-
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NUM/4, QUEUE_SIZE);
-
- /* Setup queue memory */
- kbd_desc = (virtq_desc_t *)kbd_queue_mem;
- kbd_avail = (virtq_avail_t *)(kbd_queue_mem + QUEUE_SIZE * sizeof(virtq_desc_t));
- kbd_used = (virtq_used_t *)(kbd_queue_mem + 2048);
- kbd_events = kbd_event_bufs;
-
- /* Set queue addresses */
- uint64_t desc_addr = (uint64_t)(uintptr_t)kbd_desc;
- uint64_t avail_addr = (uint64_t)(uintptr_t)kbd_avail;
- uint64_t used_addr = (uint64_t)(uintptr_t)kbd_used;
-
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_DESC_LOW/4, (uint32_t)desc_addr);
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_DESC_HIGH/4, (uint32_t)(desc_addr >> 32));
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_AVAIL_LOW/4, (uint32_t)avail_addr);
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH/4, (uint32_t)(avail_addr >> 32));
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_USED_LOW/4, (uint32_t)used_addr);
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_USED_HIGH/4, (uint32_t)(used_addr >> 32));
-
- /* Initialize descriptors */
- for (int i = 0; i < QUEUE_SIZE; i++) {
- kbd_desc[i].addr = (uint64_t)(uintptr_t)&kbd_events[i];
- kbd_desc[i].len = sizeof(virtio_input_event_t);
- kbd_desc[i].flags = DESC_F_WRITE;
- kbd_desc[i].next = 0;
- }
-
- /* Fill available ring */
- kbd_avail->flags = 0;
- for (int i = 0; i < QUEUE_SIZE; i++) {
- kbd_avail->ring[i] = i;
- }
- kbd_avail->idx = QUEUE_SIZE;
-
- /* Queue ready */
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_READY/4, 1);
-
- /* Driver OK */
- mmio_write32(kbd_base + VIRTIO_MMIO_STATUS/4,
- VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER | VIRTIO_STATUS_FEATURES_OK | VIRTIO_STATUS_DRIVER_OK);
-
- /* Notify device */
- mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NOTIFY/4, 0);
-
- printk(KERN_INFO "KEYBOARD: Virtio keyboard initialized!\n");
- return 0;
+ printk(KERN_INFO "KEYBOARD: Initializing virtio-keyboard...\n");
+
+ kbd_base = find_virtio_keyboard();
+ if (!kbd_base) {
+ printk(KERN_WARNING "KEYBOARD: No virtio keyboard found\n");
+ return -1;
+ }
+
+ /* Reset device */
+ mmio_write32(kbd_base + VIRTIO_MMIO_STATUS / 4, 0);
+ while (mmio_read32(kbd_base + VIRTIO_MMIO_STATUS / 4) != 0) {
+ asm volatile("nop");
+ }
+
+ /* Acknowledge */
+ mmio_write32(kbd_base + VIRTIO_MMIO_STATUS / 4, VIRTIO_STATUS_ACK);
+ mmio_write32(kbd_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER);
+
+ /* Accept no special features */
+ mmio_write32(kbd_base + VIRTIO_MMIO_DRIVER_FEATURES / 4, 0);
+ mmio_write32(kbd_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER |
+ VIRTIO_STATUS_FEATURES_OK);
+
+ /* Setup queue 0 */
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_SEL / 4, 0);
+
+ uint32_t max_queue = mmio_read32(kbd_base + VIRTIO_MMIO_QUEUE_NUM_MAX / 4);
+ if (max_queue < QUEUE_SIZE) {
+ printk(KERN_WARNING "KEYBOARD: Queue too small\n");
+ return -1;
+ }
+
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NUM / 4, QUEUE_SIZE);
+
+ /* Setup queue memory */
+ kbd_desc = (virtq_desc_t *)kbd_queue_mem;
+ kbd_avail =
+ (virtq_avail_t *)(kbd_queue_mem + QUEUE_SIZE * sizeof(virtq_desc_t));
+ kbd_used = (virtq_used_t *)(kbd_queue_mem + 2048);
+ kbd_events = kbd_event_bufs;
+
+ /* Set queue addresses */
+ uint64_t desc_addr = (uint64_t)(uintptr_t)kbd_desc;
+ uint64_t avail_addr = (uint64_t)(uintptr_t)kbd_avail;
+ uint64_t used_addr = (uint64_t)(uintptr_t)kbd_used;
+
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_DESC_LOW / 4, (uint32_t)desc_addr);
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_DESC_HIGH / 4,
+ (uint32_t)(desc_addr >> 32));
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_AVAIL_LOW / 4,
+ (uint32_t)avail_addr);
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH / 4,
+ (uint32_t)(avail_addr >> 32));
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_USED_LOW / 4, (uint32_t)used_addr);
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_USED_HIGH / 4,
+ (uint32_t)(used_addr >> 32));
+
+ /* Initialize descriptors */
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ kbd_desc[i].addr = (uint64_t)(uintptr_t)&kbd_events[i];
+ kbd_desc[i].len = sizeof(virtio_input_event_t);
+ kbd_desc[i].flags = DESC_F_WRITE;
+ kbd_desc[i].next = 0;
+ }
+
+ /* Fill available ring */
+ kbd_avail->flags = 0;
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ kbd_avail->ring[i] = i;
+ }
+ kbd_avail->idx = QUEUE_SIZE;
+
+ /* Queue ready */
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_READY / 4, 1);
+
+ /* Driver OK */
+ mmio_write32(kbd_base + VIRTIO_MMIO_STATUS / 4,
+ VIRTIO_STATUS_ACK | VIRTIO_STATUS_DRIVER |
+ VIRTIO_STATUS_FEATURES_OK | VIRTIO_STATUS_DRIVER_OK);
+
+ /* Notify device */
+ mmio_write32(kbd_base + VIRTIO_MMIO_QUEUE_NOTIFY / 4, 0);
+
+ printk(KERN_INFO "KEYBOARD: Virtio keyboard initialized!\n");
+ return 0;
}
/* ===================================================================== */
@@ -573,32 +711,32 @@ static int keyboard_init(void) {
/* ===================================================================== */
int input_init(void) {
- printk(KERN_INFO "INPUT: Initializing input system\n");
- mouse_init();
- keyboard_init();
- printk(KERN_INFO "INPUT: Ready\n");
- return 0;
+ printk(KERN_INFO "INPUT: Initializing input system\n");
+ mouse_init();
+ keyboard_init();
+ printk(KERN_INFO "INPUT: Ready\n");
+ return 0;
}
void input_set_key_callback(void (*callback)(int key)) {
- key_callback = callback;
+ key_callback = callback;
}
void input_set_gui_key_callback(void (*callback)(int key)) {
- gui_key_callback = callback;
+ gui_key_callback = callback;
}
void input_poll(void) {
- /* Poll UART for keyboard input */
- extern int uart_getc_nonblock(void);
- int c = uart_getc_nonblock();
- if (c >= 0 && key_callback) {
- key_callback(c);
- }
-
- /* Poll virtio keyboard */
- keyboard_poll();
-
- /* Poll mouse */
- mouse_poll();
+ /* Poll UART for keyboard input */
+ extern int uart_getc_nonblock(void);
+ int c = uart_getc_nonblock();
+ if (c >= 0 && key_callback) {
+ key_callback(c);
+ }
+
+ /* Poll virtio keyboard */
+ keyboard_poll();
+
+ /* Poll mouse */
+ mouse_poll();
}
diff --git a/drivers/nvme/ans.c b/drivers/nvme/ans.c
index f3f879e..d731e67 100644
--- a/drivers/nvme/ans.c
+++ b/drivers/nvme/ans.c
@@ -1,37 +1,37 @@
/*
* UnixOS Kernel - Apple NVMe Driver (ANS)
- *
+ *
* Based on Asahi Linux apple_nvme driver.
* Supports Apple's proprietary NVMe implementation on M-series chips.
*/
+#include "mm/vmm.h"
#include "printk.h"
#include "types.h"
-#include "mm/vmm.h"
/* ===================================================================== */
/* ANS (Apple NVMe Storage) Definitions */
/* ===================================================================== */
/* MMIO base addresses from device tree */
-#define ANS_BASE 0x27BCC0000UL /* M2 NVMe base */
-#define ANS_SIZE 0x40000UL /* 256KB */
+#define ANS_BASE 0x27BCC0000UL /* M2 NVMe base */
+#define ANS_SIZE 0x40000UL /* 256KB */
/* ANS register offsets */
-#define ANS_CTRL 0x0000
-#define ANS_STATUS 0x0004
-#define ANS_VERSION 0x0008
-#define ANS_BOOT_STATUS 0x1300
-#define ANS_MAX_PEND_CMDS 0x1308
-#define ANS_UNK_CTRL 0x24008
+#define ANS_CTRL 0x0000
+#define ANS_STATUS 0x0004
+#define ANS_VERSION 0x0008
+#define ANS_BOOT_STATUS 0x1300
+#define ANS_MAX_PEND_CMDS 0x1308
+#define ANS_UNK_CTRL 0x24008
/* NVMe standard registers (starts at offset 0x0) after ANS init */
-#define NVME_CAP 0x0000
-#define NVME_CC 0x0014
-#define NVME_CSTS 0x001C
-#define NVME_AQA 0x0024
-#define NVME_ASQ 0x0028
-#define NVME_ACQ 0x0030
+#define NVME_CAP 0x0000
+#define NVME_CC 0x0014
+#define NVME_CSTS 0x001C
+#define NVME_AQA 0x0024
+#define NVME_ASQ 0x0028
+#define NVME_ACQ 0x0030
/* ===================================================================== */
/* Driver State */
@@ -41,146 +41,139 @@ static volatile uint32_t *ans_regs = NULL;
static bool ans_initialized = false;
/* Submission and Completion queues */
-#define ANS_QUEUE_DEPTH 256
+#define ANS_QUEUE_DEPTH 256
struct nvme_sq_entry {
- uint32_t cdw0; /* Command dword 0 */
- uint32_t nsid; /* Namespace ID */
- uint32_t cdw2;
- uint32_t cdw3;
- uint64_t mptr; /* Metadata pointer */
- uint64_t prp1; /* PRP Entry 1 */
- uint64_t prp2; /* PRP Entry 2 */
- uint32_t cdw10;
- uint32_t cdw11;
- uint32_t cdw12;
- uint32_t cdw13;
- uint32_t cdw14;
- uint32_t cdw15;
+ uint32_t cdw0; /* Command dword 0 */
+ uint32_t nsid; /* Namespace ID */
+ uint32_t cdw2;
+ uint32_t cdw3;
+ uint64_t mptr; /* Metadata pointer */
+ uint64_t prp1; /* PRP Entry 1 */
+ uint64_t prp2; /* PRP Entry 2 */
+ uint32_t cdw10;
+ uint32_t cdw11;
+ uint32_t cdw12;
+ uint32_t cdw13;
+ uint32_t cdw14;
+ uint32_t cdw15;
};
struct nvme_cq_entry {
- uint32_t result;
- uint32_t rsvd;
- uint16_t sq_head;
- uint16_t sq_id;
- uint16_t cid;
- uint16_t status;
+ uint32_t result;
+ uint32_t rsvd;
+ uint16_t sq_head;
+ uint16_t sq_id;
+ uint16_t cid;
+ uint16_t status;
};
/* ===================================================================== */
/* MMIO Helpers */
/* ===================================================================== */
-static inline uint32_t ans_read32(uint32_t offset)
-{
- if (!ans_regs) return 0;
- return ans_regs[offset / 4];
+static inline uint32_t ans_read32(uint32_t offset) {
+ if (!ans_regs)
+ return 0;
+ return ans_regs[offset / 4];
}
-static inline void ans_write32(uint32_t offset, uint32_t val)
-{
- if (!ans_regs) return;
- ans_regs[offset / 4] = val;
+static inline void ans_write32(uint32_t offset, uint32_t val) {
+ if (!ans_regs)
+ return;
+ ans_regs[offset / 4] = val;
}
/* ===================================================================== */
/* Initialization */
/* ===================================================================== */
-int ans_nvme_init(void)
-{
- printk(KERN_INFO "ANS: Initializing Apple NVMe controller\n");
-
- #ifdef __QEMU__
- printk(KERN_INFO "ANS: Running in QEMU, using virtio-blk instead\n");
- return 0;
- #endif
-
- /* Map ANS registers */
- vmm_map_range(ANS_BASE, ANS_BASE, ANS_SIZE, VM_DEVICE);
- ans_regs = (volatile uint32_t *)ANS_BASE;
-
- /* Check boot status */
- uint32_t boot_status = ans_read32(ANS_BOOT_STATUS);
- printk(KERN_INFO "ANS: Boot status: 0x%x\n", boot_status);
-
- /* Wait for ANS to be ready */
- int timeout = 1000;
- while (!(ans_read32(ANS_BOOT_STATUS) & 0x1) && timeout > 0) {
- timeout--;
- }
-
- if (timeout == 0) {
- printk(KERN_ERR "ANS: Timeout waiting for controller\n");
- return -1;
- }
-
- /* Configure NVMe controller */
- uint64_t cap = ((uint64_t)ans_read32(NVME_CAP + 4) << 32) |
- ans_read32(NVME_CAP);
- printk(KERN_INFO "ANS: NVMe CAP: 0x%llx\n", (unsigned long long)cap);
-
- ans_initialized = true;
- printk(KERN_INFO "ANS: NVMe controller initialized\n");
-
- return 0;
+int ans_nvme_init(void) {
+ printk(KERN_INFO "ANS: Initializing Apple NVMe controller\n");
+
+#ifdef __QEMU__
+ printk(KERN_INFO "ANS: Running in QEMU, using virtio-blk instead\n");
+ return 0;
+#endif
+
+ /* Map ANS registers */
+ vmm_map_range(ANS_BASE, ANS_BASE, ANS_SIZE, VM_DEVICE);
+ ans_regs = (volatile uint32_t *)ANS_BASE;
+
+ /* Check boot status */
+ uint32_t boot_status = ans_read32(ANS_BOOT_STATUS);
+ printk(KERN_INFO "ANS: Boot status: 0x%x\n", boot_status);
+
+ /* Wait for ANS to be ready */
+ int timeout = 1000;
+ while (!(ans_read32(ANS_BOOT_STATUS) & 0x1) && timeout > 0) {
+ timeout--;
+ }
+
+ if (timeout == 0) {
+ printk(KERN_ERR "ANS: Timeout waiting for controller\n");
+ return -1;
+ }
+
+ /* Configure NVMe controller */
+ uint64_t cap =
+ ((uint64_t)ans_read32(NVME_CAP + 4) << 32) | ans_read32(NVME_CAP);
+ printk(KERN_INFO "ANS: NVMe CAP: 0x%llx\n", (unsigned long long)cap);
+
+ ans_initialized = true;
+ printk(KERN_INFO "ANS: NVMe controller initialized\n");
+
+ return 0;
}
/* ===================================================================== */
/* Block Operations */
/* ===================================================================== */
-int ans_read_blocks(uint64_t lba, uint32_t count, void *buffer)
-{
- if (!ans_initialized) return -1;
-
- (void)lba;
- (void)count;
- (void)buffer;
-
- /* TODO: Submit NVMe read command */
- printk(KERN_DEBUG "ANS: Read LBA %llu, count %u\n",
- (unsigned long long)lba, count);
-
- return 0;
+int ans_read_blocks(uint64_t lba, uint32_t count, void *buffer) {
+ if (!ans_initialized)
+ return -1;
+
+ (void)lba;
+ (void)count;
+ (void)buffer;
+
+ /* Stub - NVMe read not implemented */
+ return 0;
}
-int ans_write_blocks(uint64_t lba, uint32_t count, const void *buffer)
-{
- if (!ans_initialized) return -1;
-
- (void)lba;
- (void)count;
- (void)buffer;
-
- /* TODO: Submit NVMe write command */
- printk(KERN_DEBUG "ANS: Write LBA %llu, count %u\n",
- (unsigned long long)lba, count);
-
- return 0;
+int ans_write_blocks(uint64_t lba, uint32_t count, const void *buffer) {
+ if (!ans_initialized)
+ return -1;
+
+ (void)lba;
+ (void)count;
+ (void)buffer;
+
+ /* Stub - NVMe write not implemented */
+ return 0;
}
/* ===================================================================== */
/* Power Management */
/* ===================================================================== */
-int ans_suspend(void)
-{
- if (!ans_initialized) return 0;
-
- printk(KERN_INFO "ANS: Suspending NVMe controller\n");
- /* TODO: Flush caches, disable controller */
-
+int ans_suspend(void) {
+ if (!ans_initialized)
return 0;
+
+ printk(KERN_INFO "ANS: Suspending NVMe controller\n");
+ /* Stub - flush/disable not implemented */
+
+ return 0;
}
-int ans_resume(void)
-{
- if (!ans_initialized) return 0;
-
- printk(KERN_INFO "ANS: Resuming NVMe controller\n");
- /* TODO: Re-initialize controller */
-
+int ans_resume(void) {
+ if (!ans_initialized)
return 0;
+
+ printk(KERN_INFO "ANS: Resuming NVMe controller\n");
+ /* Stub - re-init not implemented */
+
+ return 0;
}
diff --git a/drivers/video/ramfb.c b/drivers/video/ramfb.c
index d8703ea..d452c21 100644
--- a/drivers/video/ramfb.c
+++ b/drivers/video/ramfb.c
@@ -1,56 +1,56 @@
/*
* Vib-OS - QEMU ramfb Display Driver
- *
+ *
* Implements the ramfb (RAM framebuffer) protocol for QEMU display.
* This uses QEMU's fw_cfg interface to configure a simple framebuffer.
*/
-#include "types.h"
#include "printk.h"
+#include "types.h"
/* ===================================================================== */
/* QEMU fw_cfg Interface (ARM64 MMIO) */
/* ===================================================================== */
/* fw_cfg MMIO base address on ARM virt machine */
-#define FW_CFG_BASE 0x09020000UL
+#define FW_CFG_BASE 0x09020000UL
/* fw_cfg registers */
-#define FW_CFG_DATA 0x00
-#define FW_CFG_SELECTOR 0x08
-#define FW_CFG_DMA 0x10
+#define FW_CFG_DATA 0x00
+#define FW_CFG_SELECTOR 0x08
+#define FW_CFG_DMA 0x10
/* fw_cfg selectors */
-#define FW_CFG_SIGNATURE 0x0000
-#define FW_CFG_ID 0x0001
-#define FW_CFG_FILE_DIR 0x0019
+#define FW_CFG_SIGNATURE 0x0000
+#define FW_CFG_ID 0x0001
+#define FW_CFG_FILE_DIR 0x0019
/* ramfb config file name */
-#define RAMFB_CFG_FILE "etc/ramfb"
+#define RAMFB_CFG_FILE "etc/ramfb"
/* ===================================================================== */
/* ramfb Configuration Structure */
/* ===================================================================== */
/* DRM fourcc format codes */
-#define DRM_FORMAT_XRGB8888 0x34325258 /* XR24 little-endian */
-#define DRM_FORMAT_RGB888 0x34324752 /* RG24 */
+#define DRM_FORMAT_XRGB8888 0x34325258 /* XR24 little-endian */
+#define DRM_FORMAT_RGB888 0x34324752 /* RG24 */
struct ramfb_cfg {
- uint64_t addr; /* Framebuffer physical address (big-endian) */
- uint32_t fourcc; /* Pixel format (big-endian) */
- uint32_t flags; /* Flags (big-endian) */
- uint32_t width; /* Width in pixels (big-endian) */
- uint32_t height; /* Height in pixels (big-endian) */
- uint32_t stride; /* Bytes per line (big-endian) */
+ uint64_t addr; /* Framebuffer physical address (big-endian) */
+ uint32_t fourcc; /* Pixel format (big-endian) */
+ uint32_t flags; /* Flags (big-endian) */
+ uint32_t width; /* Width in pixels (big-endian) */
+ uint32_t height; /* Height in pixels (big-endian) */
+ uint32_t stride; /* Bytes per line (big-endian) */
} __attribute__((packed));
/* fw_cfg file directory entry */
struct fw_cfg_file {
- uint32_t size;
- uint16_t select;
- uint16_t reserved;
- char name[56];
+ uint32_t size;
+ uint16_t select;
+ uint16_t reserved;
+ char name[56];
} __attribute__((packed));
/* ===================================================================== */
@@ -58,16 +58,16 @@ struct fw_cfg_file {
/* ===================================================================== */
static inline uint16_t bswap16(uint16_t x) {
- return ((x & 0xFF) << 8) | ((x >> 8) & 0xFF);
+ return ((x & 0xFF) << 8) | ((x >> 8) & 0xFF);
}
static inline uint32_t bswap32(uint32_t x) {
- return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) |
- ((x >> 8) & 0xFF00) | ((x >> 24) & 0xFF);
+ return ((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x >> 8) & 0xFF00) |
+ ((x >> 24) & 0xFF);
}
static inline uint64_t bswap64(uint64_t x) {
- return ((uint64_t)bswap32(x & 0xFFFFFFFF) << 32) | bswap32(x >> 32);
+ return ((uint64_t)bswap32(x & 0xFFFFFFFF) << 32) | bswap32(x >> 32);
}
/* ===================================================================== */
@@ -76,30 +76,26 @@ static inline uint64_t bswap64(uint64_t x) {
static volatile uint8_t *fw_cfg_base = (volatile uint8_t *)FW_CFG_BASE;
-static void fw_cfg_select(uint16_t key)
-{
- *(volatile uint16_t *)(fw_cfg_base + FW_CFG_SELECTOR) = bswap16(key);
+static void fw_cfg_select(uint16_t key) {
+ *(volatile uint16_t *)(fw_cfg_base + FW_CFG_SELECTOR) = bswap16(key);
}
-static uint8_t fw_cfg_read8(void)
-{
- return *(volatile uint8_t *)(fw_cfg_base + FW_CFG_DATA);
+static uint8_t fw_cfg_read8(void) {
+ return *(volatile uint8_t *)(fw_cfg_base + FW_CFG_DATA);
}
-static void fw_cfg_read(void *buf, size_t len)
-{
- uint8_t *p = (uint8_t *)buf;
- for (size_t i = 0; i < len; i++) {
- p[i] = fw_cfg_read8();
- }
+static void fw_cfg_read(void *buf, size_t len) {
+ uint8_t *p = (uint8_t *)buf;
+ for (size_t i = 0; i < len; i++) {
+ p[i] = fw_cfg_read8();
+ }
}
-static void fw_cfg_write(const void *buf, size_t len)
-{
- const uint8_t *p = (const uint8_t *)buf;
- for (size_t i = 0; i < len; i++) {
- *(volatile uint8_t *)(fw_cfg_base + FW_CFG_DATA) = p[i];
- }
+static void fw_cfg_write(const void *buf, size_t len) {
+ const uint8_t *p = (const uint8_t *)buf;
+ for (size_t i = 0; i < len; i++) {
+ *(volatile uint8_t *)(fw_cfg_base + FW_CFG_DATA) = p[i];
+ }
}
/* ===================================================================== */
@@ -109,106 +105,102 @@ static void fw_cfg_write(const void *buf, size_t len)
static uint16_t ramfb_selector = 0;
/* Find the ramfb config file in fw_cfg */
-static int ramfb_find_cfg(void)
-{
- uint32_t count;
-
- /* Read file directory */
- fw_cfg_select(FW_CFG_FILE_DIR);
- fw_cfg_read(&count, sizeof(count));
- count = bswap32(count);
-
- printk(KERN_DEBUG "RAMFB: fw_cfg has %u files\n", count);
-
- for (uint32_t i = 0; i < count && i < 100; i++) {
- struct fw_cfg_file entry;
- fw_cfg_read(&entry, sizeof(entry));
-
- /* Check for ramfb config */
- if (entry.name[0] == 'e' && entry.name[1] == 't' &&
- entry.name[2] == 'c' && entry.name[3] == '/' &&
- entry.name[4] == 'r' && entry.name[5] == 'a' &&
- entry.name[6] == 'm' && entry.name[7] == 'f' &&
- entry.name[8] == 'b') {
- ramfb_selector = bswap16(entry.select);
- printk(KERN_INFO "RAMFB: Found at selector 0x%04x\n", ramfb_selector);
- return 0;
- }
+static int ramfb_find_cfg(void) {
+ uint32_t count;
+
+ /* Read file directory */
+ fw_cfg_select(FW_CFG_FILE_DIR);
+ fw_cfg_read(&count, sizeof(count));
+ count = bswap32(count);
+
+ for (uint32_t i = 0; i < count && i < 100; i++) {
+ struct fw_cfg_file entry;
+ fw_cfg_read(&entry, sizeof(entry));
+
+ /* Check for ramfb config */
+ if (entry.name[0] == 'e' && entry.name[1] == 't' && entry.name[2] == 'c' &&
+ entry.name[3] == '/' && entry.name[4] == 'r' && entry.name[5] == 'a' &&
+ entry.name[6] == 'm' && entry.name[7] == 'f' && entry.name[8] == 'b') {
+ ramfb_selector = bswap16(entry.select);
+ printk(KERN_INFO "RAMFB: Found at selector 0x%04x\n", ramfb_selector);
+ return 0;
}
-
- printk(KERN_ERR "RAMFB: Config file not found\n");
- return -1;
+ }
+
+ printk(KERN_ERR "RAMFB: Config file not found\n");
+ return -1;
}
/* Configure ramfb with our framebuffer */
-int ramfb_setup(uint64_t fb_addr, uint32_t width, uint32_t height, uint32_t stride)
-{
- printk(KERN_INFO "RAMFB: Configuring display %ux%u\n", width, height);
-
- /* Find the ramfb config selector */
- if (ramfb_selector == 0) {
- if (ramfb_find_cfg() < 0) {
- return -1;
- }
+int ramfb_setup(uint64_t fb_addr, uint32_t width, uint32_t height,
+ uint32_t stride) {
+ printk(KERN_INFO "RAMFB: Configuring display %ux%u\n", width, height);
+
+ /* Find the ramfb config selector */
+ if (ramfb_selector == 0) {
+ if (ramfb_find_cfg() < 0) {
+ return -1;
}
-
- /* Prepare configuration (all values big-endian) */
- static struct ramfb_cfg cfg __attribute__((aligned(4096)));
- cfg.addr = bswap64(fb_addr);
- cfg.fourcc = bswap32(DRM_FORMAT_XRGB8888);
- cfg.flags = 0;
- cfg.width = bswap32(width);
- cfg.height = bswap32(height);
- cfg.stride = bswap32(stride);
-
- /* Use DMA for write - required by modern QEMU */
- static volatile struct {
- uint32_t control;
- uint32_t length;
- uint64_t address;
- } __attribute__((packed, aligned(4096))) dma;
-
- /* FW_CFG_DMA_CTL_SELECT = 0x08, FW_CFG_DMA_CTL_WRITE = 0x10 */
- /* Control = (selector << 16) | SELECT | WRITE */
- dma.control = bswap32((ramfb_selector << 16) | 0x08 | 0x10);
- dma.length = bswap32(sizeof(cfg));
- dma.address = bswap64((uint64_t)(uintptr_t)&cfg);
-
- /* Trigger DMA write by writing address to DMA register */
- volatile uint64_t *dma_reg = (volatile uint64_t *)(fw_cfg_base + FW_CFG_DMA);
- uint64_t dma_addr = (uint64_t)(uintptr_t)&dma;
- *dma_reg = bswap64(dma_addr);
-
- /* Small delay for DMA to complete */
- for (volatile int i = 0; i < 100000; i++) { }
-
- printk(KERN_INFO "RAMFB: Display configured at 0x%lx (DMA)\n", (unsigned long)fb_addr);
-
- return 0;
+ }
+
+ /* Prepare configuration (all values big-endian) */
+ static struct ramfb_cfg cfg __attribute__((aligned(4096)));
+ cfg.addr = bswap64(fb_addr);
+ cfg.fourcc = bswap32(DRM_FORMAT_XRGB8888);
+ cfg.flags = 0;
+ cfg.width = bswap32(width);
+ cfg.height = bswap32(height);
+ cfg.stride = bswap32(stride);
+
+ /* Use DMA for write - required by modern QEMU */
+ static volatile struct {
+ uint32_t control;
+ uint32_t length;
+ uint64_t address;
+ } __attribute__((packed, aligned(4096))) dma;
+
+ /* FW_CFG_DMA_CTL_SELECT = 0x08, FW_CFG_DMA_CTL_WRITE = 0x10 */
+ /* Control = (selector << 16) | SELECT | WRITE */
+ dma.control = bswap32((ramfb_selector << 16) | 0x08 | 0x10);
+ dma.length = bswap32(sizeof(cfg));
+ dma.address = bswap64((uint64_t)(uintptr_t)&cfg);
+
+ /* Trigger DMA write by writing address to DMA register */
+ volatile uint64_t *dma_reg = (volatile uint64_t *)(fw_cfg_base + FW_CFG_DMA);
+ uint64_t dma_addr = (uint64_t)(uintptr_t)&dma;
+ *dma_reg = bswap64(dma_addr);
+
+ /* Small delay for DMA to complete */
+ for (volatile int i = 0; i < 100000; i++) {
+ }
+
+ printk(KERN_INFO "RAMFB: Display configured at 0x%lx (DMA)\n",
+ (unsigned long)fb_addr);
+
+ return 0;
}
/* ===================================================================== */
/* Public Interface */
/* ===================================================================== */
-int ramfb_init(uint32_t *framebuffer, uint32_t width, uint32_t height)
-{
- printk(KERN_INFO "RAMFB: Initializing QEMU ramfb display\n");
-
- /* Verify fw_cfg is available */
- fw_cfg_select(FW_CFG_SIGNATURE);
- char sig[4];
- fw_cfg_read(sig, 4);
-
- if (sig[0] != 'Q' || sig[1] != 'E' || sig[2] != 'M' || sig[3] != 'U') {
- printk(KERN_ERR "RAMFB: fw_cfg not available (sig=%c%c%c%c)\n",
- sig[0], sig[1], sig[2], sig[3]);
- return -1;
- }
-
- printk(KERN_INFO "RAMFB: fw_cfg detected\n");
-
- /* Configure ramfb with our framebuffer */
- uint32_t stride = width * 4; /* 32bpp */
- return ramfb_setup((uint64_t)(uintptr_t)framebuffer, width, height, stride);
+int ramfb_init(uint32_t *framebuffer, uint32_t width, uint32_t height) {
+ printk(KERN_INFO "RAMFB: Initializing QEMU ramfb display\n");
+
+ /* Verify fw_cfg is available */
+ fw_cfg_select(FW_CFG_SIGNATURE);
+ char sig[4];
+ fw_cfg_read(sig, 4);
+
+ if (sig[0] != 'Q' || sig[1] != 'E' || sig[2] != 'M' || sig[3] != 'U') {
+ printk(KERN_ERR "RAMFB: fw_cfg not available (sig=%c%c%c%c)\n", sig[0],
+ sig[1], sig[2], sig[3]);
+ return -1;
+ }
+
+ printk(KERN_INFO "RAMFB: fw_cfg detected\n");
+
+ /* Configure ramfb with our framebuffer */
+ uint32_t stride = width * 4; /* 32bpp */
+ return ramfb_setup((uint64_t)(uintptr_t)framebuffer, width, height, stride);
}
diff --git a/examples/calculator.nano b/examples/calculator.nano
new file mode 100644
index 0000000..e585047
--- /dev/null
+++ b/examples/calculator.nano
@@ -0,0 +1,41 @@
+// Simple Calculator in NanoLang for Vib-OS
+// Run with: run calculator.nano
+
+fn add(a: int, b: int) -> int {
+ return a + b;
+}
+
+fn subtract(a: int, b: int) -> int {
+ return a - b;
+}
+
+fn multiply(a: int, b: int) -> int {
+ return a * b;
+}
+
+fn divide(a: int, b: int) -> int {
+ if b == 0 {
+ print("Error: Division by zero!");
+ return 0;
+ }
+ return a / b;
+}
+
+fn main() {
+ print("NanoLang Calculator Demo");
+ print("------------------------");
+
+ let x = 42;
+ let y = 7;
+
+ print("x = 42, y = 7");
+ print("");
+
+ print("add(x, y) = " + add(x, y));
+ print("subtract(x, y) = " + subtract(x, y));
+ print("multiply(x, y) = " + multiply(x, y));
+ print("divide(x, y) = " + divide(x, y));
+
+ print("");
+ print("Calculator demo complete!");
+}
diff --git a/examples/fibonacci.py b/examples/fibonacci.py
new file mode 100644
index 0000000..d001092
--- /dev/null
+++ b/examples/fibonacci.py
@@ -0,0 +1,30 @@
+# Fibonacci Sequence in Python for Vib-OS
+# Run with: run fibonacci.py
+
+def fibonacci(n):
+ """Generate first n Fibonacci numbers"""
+ if n <= 0:
+ return []
+ elif n == 1:
+ return [0]
+
+ fib = [0, 1]
+ for i in range(2, n):
+ fib.append(fib[i-1] + fib[i-2])
+ return fib
+
+def main():
+ print("Fibonacci Sequence Generator")
+ print("-" * 30)
+
+ count = 10
+ sequence = fibonacci(count)
+
+ print(f"First {count} Fibonacci numbers:")
+ for i, num in enumerate(sequence):
+ print(f" F({i}) = {num}")
+
+ print(f"\nSum: {sum(sequence)}")
+
+if __name__ == "__main__":
+ main()
diff --git a/examples/hello.cpp b/examples/hello.cpp
new file mode 100644
index 0000000..50c454f
--- /dev/null
+++ b/examples/hello.cpp
@@ -0,0 +1,11 @@
+// C++ Hello World for vib-OS
+// Compile with: aarch64-none-elf-g++ -nostdlib -ffreestanding hello.cpp -o
+// hello
+
+extern "C" void puts(const char *str);
+
+extern "C" int main() {
+ puts("Hello from C++!");
+ puts("This is a C++ program running on Vib-OS");
+ return 0;
+}
diff --git a/examples/hello.nano b/examples/hello.nano
new file mode 100644
index 0000000..b10031a
--- /dev/null
+++ b/examples/hello.nano
@@ -0,0 +1,34 @@
+// Hello World in NanoLang for Vib-OS
+// Run with: run hello.nano
+// Compile with: nanoc hello.nano -o hello
+
+// NanoLang is a minimal, LLM-friendly language
+// that transpiles to C for native performance
+
+fn greet(name: str) -> str {
+ return "Hello, " + name + "!";
+}
+
+fn factorial(n: int) -> int {
+ if n <= 1 {
+ return 1;
+ }
+ return n * factorial(n - 1);
+}
+
+fn main() {
+ print("========================================");
+ print(" Welcome to Vib-OS NanoLang Demo");
+ print("========================================");
+
+ let message = greet("Vib-OS User");
+ print(message);
+
+ // Factorial demo
+ let num = 5;
+ let result = factorial(num);
+ print("Factorial of 5 = " + result);
+
+ print("");
+ print("NanoLang is working on Vib-OS!");
+}
diff --git a/examples/hello.py b/examples/hello.py
new file mode 100644
index 0000000..6cb7bbd
--- /dev/null
+++ b/examples/hello.py
@@ -0,0 +1,23 @@
+# Hello World in Python for Vib-OS
+# Run with: run hello.py
+
+def greet(name):
+ return f"Hello, {name}!"
+
+def main():
+ print("=" * 40)
+ print(" Welcome to Vib-OS Python Demo")
+ print("=" * 40)
+
+ message = greet("Vib-OS User")
+ print(message)
+
+ # Simple calculation demo
+ numbers = [1, 2, 3, 4, 5]
+ total = sum(numbers)
+ print(f"Sum of {numbers} = {total}")
+
+ print("\nPython is working on Vib-OS!")
+
+if __name__ == "__main__":
+ main()
diff --git a/kernel/arch/arm64/arch.c b/kernel/arch/arm64/arch.c
index 7ddb9a4..1aa073d 100644
--- a/kernel/arch/arm64/arch.c
+++ b/kernel/arch/arm64/arch.c
@@ -173,96 +173,6 @@ void smp_init(void)
*/
}
-/* ===================================================================== */
-/* Userspace Entry */
-/* ===================================================================== */
-
-/**
- * arch_enter_userspace - Jump to userspace execution (EL0)
- * @entry: Entry point address in userspace
- * @sp: User stack pointer
- * @argc: Argument count (passed in x0)
- * @argv: Argument vector pointer (passed in x1)
- *
- * This function sets up the CPU state to execute at EL0 (userspace)
- * and uses ERET to jump there. It does not return.
- */
-void arch_enter_userspace(uint64_t entry, uint64_t sp, uint64_t argc, uint64_t argv)
-{
- printk(KERN_INFO "ARM64: Entering userspace at 0x%llx, sp=0x%llx\n",
- (unsigned long long)entry, (unsigned long long)sp);
-
- /*
- * Set up SPSR_EL1 for EL0:
- * - M[3:0] = 0b0000 (EL0t - EL0 with SP_EL0)
- * - DAIF cleared (interrupts enabled)
- * - NZCV = 0
- */
- uint64_t spsr = 0; /* EL0t mode, interrupts enabled */
-
- asm volatile(
- /* Set ELR_EL1 to user entry point */
- "msr elr_el1, %[entry]\n"
-
- /* Set SPSR_EL1 for EL0 execution */
- "msr spsr_el1, %[spsr]\n"
-
- /* Set SP_EL0 (user stack pointer) */
- "msr sp_el0, %[sp]\n"
-
- /* Set up arguments in x0, x1 */
- "mov x0, %[argc]\n"
- "mov x1, %[argv]\n"
-
- /* Clear other general-purpose registers for security */
- "mov x2, #0\n"
- "mov x3, #0\n"
- "mov x4, #0\n"
- "mov x5, #0\n"
- "mov x6, #0\n"
- "mov x7, #0\n"
- "mov x8, #0\n"
- "mov x9, #0\n"
- "mov x10, #0\n"
- "mov x11, #0\n"
- "mov x12, #0\n"
- "mov x13, #0\n"
- "mov x14, #0\n"
- "mov x15, #0\n"
- "mov x16, #0\n"
- "mov x17, #0\n"
- "mov x18, #0\n"
- "mov x19, #0\n"
- "mov x20, #0\n"
- "mov x21, #0\n"
- "mov x22, #0\n"
- "mov x23, #0\n"
- "mov x24, #0\n"
- "mov x25, #0\n"
- "mov x26, #0\n"
- "mov x27, #0\n"
- "mov x28, #0\n"
- "mov x29, #0\n" /* Frame pointer */
- "mov x30, #0\n" /* Link register */
-
- /* Ensure all changes take effect */
- "isb\n"
-
- /* Jump to userspace */
- "eret\n"
- :
- : [entry] "r" (entry),
- [sp] "r" (sp),
- [spsr] "r" (spsr),
- [argc] "r" (argc),
- [argv] "r" (argv)
- : "memory"
- );
-
- /* Should never reach here */
- __builtin_unreachable();
-}
-
/* ===================================================================== */
/* Early Initialization */
/* ===================================================================== */
diff --git a/kernel/assets/dock_icons/calculator.svg b/kernel/assets/dock_icons/calculator.svg
new file mode 100644
index 0000000..8ef2e9d
--- /dev/null
+++ b/kernel/assets/dock_icons/calculator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/clock.svg b/kernel/assets/dock_icons/clock.svg
new file mode 100644
index 0000000..ea3f5e5
--- /dev/null
+++ b/kernel/assets/dock_icons/clock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/dock_calculator.png b/kernel/assets/dock_icons/dock_calculator.png
new file mode 100644
index 0000000..4f6f3d4
Binary files /dev/null and b/kernel/assets/dock_icons/dock_calculator.png differ
diff --git a/kernel/assets/dock_icons/dock_clock.png b/kernel/assets/dock_icons/dock_clock.png
new file mode 100644
index 0000000..27bfd62
Binary files /dev/null and b/kernel/assets/dock_icons/dock_clock.png differ
diff --git a/kernel/assets/dock_icons/dock_doom.png b/kernel/assets/dock_icons/dock_doom.png
new file mode 100644
index 0000000..ea9bed6
Binary files /dev/null and b/kernel/assets/dock_icons/dock_doom.png differ
diff --git a/kernel/assets/dock_icons/dock_folder.png b/kernel/assets/dock_icons/dock_folder.png
new file mode 100644
index 0000000..508f350
Binary files /dev/null and b/kernel/assets/dock_icons/dock_folder.png differ
diff --git a/kernel/assets/dock_icons/dock_help.png b/kernel/assets/dock_icons/dock_help.png
new file mode 100644
index 0000000..27bfd62
Binary files /dev/null and b/kernel/assets/dock_icons/dock_help.png differ
diff --git a/kernel/assets/dock_icons/dock_notes.png b/kernel/assets/dock_icons/dock_notes.png
new file mode 100644
index 0000000..3d5fb52
Binary files /dev/null and b/kernel/assets/dock_icons/dock_notes.png differ
diff --git a/kernel/assets/dock_icons/dock_settings.png b/kernel/assets/dock_icons/dock_settings.png
new file mode 100644
index 0000000..e0707aa
Binary files /dev/null and b/kernel/assets/dock_icons/dock_settings.png differ
diff --git a/kernel/assets/dock_icons/dock_snake.png b/kernel/assets/dock_icons/dock_snake.png
new file mode 100644
index 0000000..e8e75c2
Binary files /dev/null and b/kernel/assets/dock_icons/dock_snake.png differ
diff --git a/kernel/assets/dock_icons/dock_terminal.png b/kernel/assets/dock_icons/dock_terminal.png
new file mode 100644
index 0000000..89c6071
Binary files /dev/null and b/kernel/assets/dock_icons/dock_terminal.png differ
diff --git a/kernel/assets/dock_icons/dock_web.png b/kernel/assets/dock_icons/dock_web.png
new file mode 100644
index 0000000..27bfd62
Binary files /dev/null and b/kernel/assets/dock_icons/dock_web.png differ
diff --git a/kernel/assets/dock_icons/doom.svg b/kernel/assets/dock_icons/doom.svg
new file mode 100644
index 0000000..8fdafa9
--- /dev/null
+++ b/kernel/assets/dock_icons/doom.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/folder.svg b/kernel/assets/dock_icons/folder.svg
new file mode 100644
index 0000000..134458b
--- /dev/null
+++ b/kernel/assets/dock_icons/folder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/help.svg b/kernel/assets/dock_icons/help.svg
new file mode 100644
index 0000000..51fddd8
--- /dev/null
+++ b/kernel/assets/dock_icons/help.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/notes.svg b/kernel/assets/dock_icons/notes.svg
new file mode 100644
index 0000000..4197ddd
--- /dev/null
+++ b/kernel/assets/dock_icons/notes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/settings.svg b/kernel/assets/dock_icons/settings.svg
new file mode 100644
index 0000000..19c2726
--- /dev/null
+++ b/kernel/assets/dock_icons/settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/snake.svg b/kernel/assets/dock_icons/snake.svg
new file mode 100644
index 0000000..669a57a
--- /dev/null
+++ b/kernel/assets/dock_icons/snake.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/terminal.svg b/kernel/assets/dock_icons/terminal.svg
new file mode 100644
index 0000000..af459c0
--- /dev/null
+++ b/kernel/assets/dock_icons/terminal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/dock_icons/web.svg b/kernel/assets/dock_icons/web.svg
new file mode 100644
index 0000000..0a0586d
--- /dev/null
+++ b/kernel/assets/dock_icons/web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/icons.c b/kernel/assets/icons.c
new file mode 100644
index 0000000..cf203a0
--- /dev/null
+++ b/kernel/assets/icons.c
@@ -0,0 +1,186 @@
+/*
+ * Embedded PNG icons for vib-OS GUI
+ * These icons are decoded at runtime using the tPNG decoder
+ */
+
+#include "types.h"
+
+/* =========================================================== */
+/* Toolbar Icon: Previous (chevron left) */
+/* =========================================================== */
+const unsigned char toolbar_icon_prev_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x74, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0x31, 0x0e, 0x80,
+ 0x20, 0x10, 0x44, 0x51, 0xc6, 0xfb, 0xdf, 0xf9, 0xdb, 0x52, 0xe1, 0xce,
+ 0xb0, 0x24, 0x16, 0x6c, 0x6b, 0xf2, 0x5f, 0x54, 0xd8, 0x31, 0xee, 0x9c,
+ 0x1e, 0x80, 0xd5, 0xf3, 0xa7, 0x23, 0xce, 0x02, 0x89, 0x01, 0xa6, 0xa8,
+ 0x24, 0xb5, 0x02, 0x14, 0xe3, 0x11, 0x80, 0x11, 0xb7, 0x01, 0xcc, 0xb8,
+ 0x05, 0x10, 0xc4, 0xcb, 0x00, 0x61, 0xbc, 0x04, 0xb0, 0x11, 0x6f, 0xbb,
+ 0x4c, 0x2d, 0x6f, 0x40, 0x88, 0x7c, 0x02, 0x9a, 0x3e, 0x4b, 0x82, 0x94,
+ 0x7e, 0xb2, 0x36, 0x90, 0xf2, 0x31, 0x55, 0x88, 0x58, 0x17, 0x4d, 0x01,
+ 0x62, 0xaf, 0x0a, 0x99, 0x48, 0xb4, 0xec, 0x64, 0x20, 0xf1, 0xba, 0xd6,
+ 0xe6, 0xe9, 0x2a, 0x0f, 0x27, 0xe3, 0xbf, 0x98, 0x17, 0x3b, 0xff, 0x54,
+ 0x05, 0xa8, 0xa1, 0xd5, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_prev_png_len = 173;
+
+/* =========================================================== */
+/* Toolbar Icon: Next (chevron right) */
+/* =========================================================== */
+const unsigned char toolbar_icon_next_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x60, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0x41, 0x0e, 0x80,
+ 0x20, 0x0c, 0x04, 0xd0, 0xd2, 0xfb, 0xdf, 0xb9, 0x5e, 0x54, 0xd8, 0x05,
+ 0x8d, 0x07, 0x13, 0x3d, 0xf8, 0x2f, 0x6a, 0xa6, 0x8b, 0x8d, 0x8a, 0x9b,
+ 0x20, 0xad, 0x01, 0xa4, 0x29, 0x95, 0x20, 0x21, 0x80, 0x62, 0x5c, 0x03,
+ 0x30, 0xf1, 0x6c, 0x00, 0x11, 0x4f, 0x07, 0x90, 0xf1, 0x74, 0x00, 0x2d,
+ 0xef, 0x86, 0xc4, 0xcc, 0x01, 0x64, 0xfc, 0x05, 0x08, 0x0b, 0x11, 0xe4,
+ 0x5b, 0x02, 0xc8, 0xf8, 0x95, 0xdf, 0x00, 0x62, 0x6e, 0xcc, 0x80, 0x38,
+ 0x56, 0x04, 0xb8, 0xdb, 0x0c, 0xd8, 0xf3, 0x23, 0xb0, 0xe7, 0x07, 0x87,
+ 0x03, 0x3c, 0xc5, 0xa7, 0xb2, 0x15, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_next_png_len = 155;
+
+/* =========================================================== */
+/* Toolbar Icon: Rotate Clockwise */
+/* =========================================================== */
+const unsigned char toolbar_icon_rotate_cw_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x7d, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0xbf, 0x0a, 0x80,
+ 0x30, 0x0c, 0x04, 0xe0, 0xc4, 0xf7, 0x7f, 0xe7, 0xba, 0x58, 0x49, 0xfe,
+ 0x14, 0x07, 0x37, 0x5d, 0xbc, 0x6f, 0x28, 0x24, 0x97, 0xa3, 0x8a, 0x4e,
+ 0x02, 0x90, 0x45, 0x24, 0x93, 0xd9, 0x30, 0x00, 0xb1, 0xbe, 0x00, 0x30,
+ 0xe3, 0x35, 0x80, 0x3a, 0x5e, 0x02, 0xe8, 0xe3, 0x25, 0x80, 0x32, 0x5e,
+ 0x07, 0x26, 0xe3, 0xa7, 0x40, 0x13, 0x6f, 0x9e, 0xde, 0x20, 0xbf, 0x8f,
+ 0x00, 0xf2, 0x33, 0x50, 0x05, 0x0e, 0xbc, 0x1e, 0x00, 0x58, 0x7c, 0x23,
+ 0x60, 0xf0, 0x96, 0x00, 0x90, 0x7e, 0xaa, 0xfc, 0x00, 0x62, 0x2f, 0xa5,
+ 0xe4, 0x27, 0x92, 0x00, 0xaa, 0xa0, 0x66, 0xde, 0x9a, 0xed, 0x53, 0xb0,
+ 0xe4, 0x32, 0x52, 0x2c, 0x0f, 0xf3, 0x0f, 0x33, 0x62, 0x4e, 0xdd, 0x05,
+ 0x88, 0x85, 0xde, 0x15, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_rotate_cw_png_len = 180;
+
+/* =========================================================== */
+/* Toolbar Icon: Rotate Counter-Clockwise */
+/* =========================================================== */
+const unsigned char toolbar_icon_rotate_ccw_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x77, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0xc1, 0x0a, 0x80,
+ 0x20, 0x10, 0x04, 0xd0, 0x5d, 0xff, 0xff, 0x9f, 0xeb, 0xd2, 0xb2, 0x4b,
+ 0x6e, 0x87, 0x20, 0xba, 0xf4, 0x5e, 0xc2, 0x8c, 0x7b, 0x13, 0xf5, 0x08,
+ 0x40, 0x16, 0x91, 0x4c, 0x66, 0x3b, 0x01, 0xc4, 0x7a, 0x02, 0xc0, 0x8d,
+ 0xd7, 0x00, 0xfa, 0x78, 0x09, 0xa0, 0x8c, 0xb7, 0x80, 0xc9, 0xf8, 0x69,
+ 0xd0, 0x80, 0x0b, 0xbc, 0xe7, 0x74, 0xb5, 0xfb, 0x02, 0xbe, 0xfb, 0x0e,
+ 0x00, 0xa8, 0x71, 0x30, 0xcc, 0x14, 0x23, 0x00, 0x88, 0x4e, 0x02, 0x80,
+ 0xf8, 0xab, 0xf2, 0x03, 0x88, 0xf5, 0x60, 0xff, 0x0d, 0x00, 0xbc, 0x73,
+ 0x0a, 0x48, 0xe7, 0x55, 0x40, 0x86, 0x17, 0x9e, 0xa7, 0x16, 0xb5, 0xa7,
+ 0x28, 0x05, 0x6c, 0xcd, 0x08, 0x90, 0xe9, 0x1d, 0xe2, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_rotate_ccw_png_len = 172;
+
+/* =========================================================== */
+/* Toolbar Icon: Zoom In */
+/* =========================================================== */
+const unsigned char toolbar_icon_zoom_in_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x8e, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0xc1, 0x0d, 0x80,
+ 0x30, 0x0c, 0x04, 0xc0, 0x73, 0xfe, 0x7f, 0x67, 0x4a, 0x05, 0x21, 0x1c,
+ 0x52, 0x25, 0x5e, 0x80, 0xdc, 0x4b, 0x94, 0x93, 0x6d, 0xa5, 0xae, 0x76,
+ 0x00, 0xb2, 0x88, 0x64, 0x32, 0xcb, 0x03, 0x10, 0xeb, 0x0f, 0x00, 0x37,
+ 0xde, 0x02, 0xa8, 0xe3, 0x35, 0x80, 0x3e, 0x5e, 0x03, 0xe8, 0xe3, 0x35,
+ 0x80, 0x39, 0x5e, 0x07, 0xd8, 0xc7, 0x9b, 0x52, 0xcf, 0xbf, 0x8b, 0x7e,
+ 0xd2, 0x01, 0xb6, 0xb8, 0x93, 0x7d, 0x00, 0xf2, 0x3e, 0x7e, 0x4b, 0x44,
+ 0x8c, 0xe7, 0xd3, 0x52, 0x02, 0x88, 0x1e, 0x5d, 0xce, 0x26, 0x00, 0x62,
+ 0x2d, 0xd0, 0x00, 0x38, 0xd8, 0x23, 0x80, 0x04, 0x6f, 0xbb, 0x0d, 0xc0,
+ 0x3c, 0xdd, 0x01, 0xc4, 0x7e, 0x1d, 0x5b, 0xc8, 0xf9, 0xb8, 0xfe, 0x24,
+ 0xf8, 0x1b, 0xd7, 0x5f, 0xca, 0x02, 0x6c, 0xf7, 0x44, 0x00, 0xf1, 0x19,
+ 0x6c, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+ 0x82};
+const unsigned int toolbar_icon_zoom_in_png_len = 197;
+
+/* =========================================================== */
+/* Toolbar Icon: Zoom Out */
+/* =========================================================== */
+const unsigned char toolbar_icon_zoom_out_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x80, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd3, 0xc1, 0x09, 0x80,
+ 0x30, 0x14, 0x04, 0xd0, 0x49, 0xfe, 0xff, 0x9d, 0x6b, 0xa5, 0x42, 0x22,
+ 0x69, 0x50, 0xbc, 0x88, 0xfb, 0x0e, 0x19, 0xe6, 0x30, 0x10, 0x74, 0x14,
+ 0x80, 0x2c, 0x22, 0x99, 0xcc, 0x4e, 0x02, 0x88, 0xf5, 0x05, 0x80, 0x1b,
+ 0xaf, 0x01, 0xd4, 0xf1, 0x1a, 0x40, 0x1f, 0xaf, 0x01, 0x8c, 0xf1, 0x3a,
+ 0xc0, 0x3a, 0x5e, 0x16, 0x90, 0x72, 0x57, 0xc0, 0x73, 0x1d, 0xbb, 0x17,
+ 0xc0, 0xe6, 0xce, 0x0a, 0x02, 0xf9, 0xae, 0x20, 0x17, 0x8c, 0x37, 0x4a,
+ 0x01, 0x20, 0x7e, 0x74, 0x59, 0x5a, 0x00, 0x88, 0x3d, 0x40, 0x02, 0xe0,
+ 0x66, 0xf7, 0x00, 0x32, 0x3c, 0xf5, 0x36, 0x00, 0xf9, 0x74, 0x8b, 0xf4,
+ 0xeb, 0xfb, 0x4f, 0xc2, 0x2f, 0xb9, 0xbf, 0x72, 0x3b, 0xa0, 0xf5, 0x45,
+ 0x00, 0xb1, 0x5f, 0x54, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
+ 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_zoom_out_png_len = 183;
+
+/* =========================================================== */
+/* Toolbar Icon: Fit to Window */
+/* =========================================================== */
+const unsigned char toolbar_icon_fit_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x79, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0xbd, 0x0d, 0x80,
+ 0x30, 0x10, 0x44, 0xe1, 0xc3, 0xff, 0x3f, 0x53, 0x52, 0x01, 0x09, 0x85,
+ 0x15, 0xc9, 0x05, 0x90, 0x5b, 0xf9, 0xec, 0x15, 0x67, 0x4d, 0x14, 0x9d,
+ 0x04, 0x20, 0x8b, 0x48, 0x26, 0xb3, 0x7d, 0x00, 0x62, 0xbd, 0x01, 0xe0,
+ 0xc6, 0x73, 0x00, 0x75, 0xbc, 0x04, 0xd0, 0xc7, 0x4b, 0x00, 0x7d, 0x3c,
+ 0x07, 0x50, 0xc6, 0x6b, 0x00, 0xfb, 0x78, 0x0d, 0x60, 0xde, 0x6f, 0xeb,
+ 0x19, 0x50, 0xe6, 0x0a, 0xf8, 0x6e, 0x38, 0x18, 0x86, 0x01, 0x00, 0x08,
+ 0xdf, 0x13, 0x00, 0xd2, 0x4f, 0x97, 0xbf, 0x00, 0xc4, 0x5e, 0xa5, 0x02,
+ 0x50, 0x09, 0xa5, 0xd9, 0xce, 0xb9, 0xa5, 0xf0, 0xc9, 0x39, 0xff, 0x0c,
+ 0x00, 0xbc, 0xb8, 0x0d, 0x10, 0xfb, 0x43, 0x14, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_fit_png_len = 176;
+
+/* =========================================================== */
+/* Toolbar Icon: Fullscreen */
+/* =========================================================== */
+const unsigned char toolbar_icon_fullscreen_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x55, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0xc1, 0x0d, 0x00,
+ 0x20, 0x08, 0x04, 0x41, 0xfb, 0xef, 0xdc, 0x10, 0x0b, 0xc0, 0x31, 0x51,
+ 0x9c, 0xa9, 0x61, 0x62, 0x42, 0x08, 0x40, 0x16, 0x91, 0x4c, 0x66, 0x8b,
+ 0x01, 0xc4, 0xfa, 0x02, 0xc0, 0x8d, 0x6f, 0x01, 0xd4, 0xf1, 0x2d, 0x80,
+ 0x3e, 0xbe, 0x05, 0x90, 0xf1, 0x4d, 0x00, 0xb3, 0x78, 0x0a, 0xa0, 0x22,
+ 0x9f, 0x01, 0x80, 0x0b, 0x2f, 0xce, 0x51, 0xdc, 0xb3, 0x3e, 0x60, 0x67,
+ 0x02, 0xf0, 0xc4, 0x3d, 0x00, 0x82, 0x48, 0x28, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82};
+const unsigned int toolbar_icon_fullscreen_png_len = 140;
+
+/* =========================================================== */
+/* Icon data arrays for easy access */
+/* =========================================================== */
+const unsigned char *toolbar_icon_png_data[8] = {
+ toolbar_icon_prev_png, toolbar_icon_next_png,
+ toolbar_icon_rotate_cw_png, toolbar_icon_rotate_ccw_png,
+ toolbar_icon_zoom_in_png, toolbar_icon_zoom_out_png,
+ toolbar_icon_fit_png, toolbar_icon_fullscreen_png,
+};
+
+const unsigned int toolbar_icon_png_sizes[8] = {
+ toolbar_icon_prev_png_len, toolbar_icon_next_png_len,
+ toolbar_icon_rotate_cw_png_len, toolbar_icon_rotate_ccw_png_len,
+ toolbar_icon_zoom_in_png_len, toolbar_icon_zoom_out_png_len,
+ toolbar_icon_fit_png_len, toolbar_icon_fullscreen_png_len,
+};
+
+#define NUM_TOOLBAR_ICONS 8
diff --git a/kernel/assets/icons.h b/kernel/assets/icons.h
new file mode 100644
index 0000000..221a5b0
--- /dev/null
+++ b/kernel/assets/icons.h
@@ -0,0 +1,26 @@
+/*
+ * Embedded PNG icons header for vib-OS GUI
+ */
+
+#ifndef KERNEL_ICONS_H
+#define KERNEL_ICONS_H
+
+#include "types.h"
+
+/* Toolbar icons (24x24 RGB PNG) */
+extern const unsigned char *toolbar_icon_png_data[8];
+extern const unsigned int toolbar_icon_png_sizes[8];
+
+#define NUM_TOOLBAR_ICONS 8
+
+/* Icon indices */
+#define ICON_PREV 0
+#define ICON_NEXT 1
+#define ICON_ROTATE_CW 2
+#define ICON_ROTATE_CCW 3
+#define ICON_ZOOM_IN 4
+#define ICON_ZOOM_OUT 5
+#define ICON_FIT 6
+#define ICON_FULLSCREEN 7
+
+#endif /* KERNEL_ICONS_H */
diff --git a/kernel/assets/icons/chevron-left.svg b/kernel/assets/icons/chevron-left.svg
new file mode 100644
index 0000000..747d46d
--- /dev/null
+++ b/kernel/assets/icons/chevron-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/icons/chevron-right.svg b/kernel/assets/icons/chevron-right.svg
new file mode 100644
index 0000000..258de41
--- /dev/null
+++ b/kernel/assets/icons/chevron-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/icons/icon_fit.inc b/kernel/assets/icons/icon_fit.inc
new file mode 100644
index 0000000..a4e6786
--- /dev/null
+++ b/kernel/assets/icons/icon_fit.inc
@@ -0,0 +1,18 @@
+unsigned char icon_fit_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x77, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x94, 0x39, 0x12, 0x80,
+ 0x30, 0x0c, 0x03, 0x2d, 0x0f, 0xff, 0xff, 0xb2, 0x68, 0x98, 0x14, 0x0c,
+ 0xe0, 0x43, 0x01, 0x9a, 0xa8, 0x4c, 0xa1, 0xf5, 0x15, 0x99, 0x2d, 0xfd,
+ 0x2d, 0x9c, 0x1f, 0x48, 0x52, 0x36, 0x05, 0x86, 0xaf, 0xdb, 0xcb, 0xda,
+ 0x2a, 0xd5, 0x44, 0xba, 0xea, 0x3e, 0xec, 0x80, 0xe2, 0xc8, 0x3c, 0x53,
+ 0x39, 0x05, 0xc8, 0x63, 0x07, 0x33, 0x20, 0xe1, 0x88, 0x20, 0x42, 0x52,
+ 0x57, 0x84, 0x03, 0x52, 0x59, 0x78, 0x09, 0xd0, 0x35, 0x97, 0xfe, 0x01,
+ 0x93, 0xe3, 0x72, 0xc5, 0x9c, 0x09, 0x48, 0x0b, 0x80, 0xc2, 0xe2, 0xdb,
+ 0x23, 0x42, 0x12, 0x22, 0x65, 0x11, 0x12, 0x10, 0x39, 0xec, 0x10, 0x5c,
+ 0xd7, 0x6d, 0xd8, 0xcd, 0x88, 0xed, 0x4f, 0xe2, 0x7a, 0xc9, 0x22, 0xed,
+ 0xac, 0xe8, 0x34, 0x22, 0xa4, 0x13, 0x5b, 0x44, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_fit_png_len = 176;
diff --git a/kernel/assets/icons/icon_fit.png b/kernel/assets/icons/icon_fit.png
new file mode 100644
index 0000000..aa66826
Binary files /dev/null and b/kernel/assets/icons/icon_fit.png differ
diff --git a/kernel/assets/icons/icon_fullscreen.inc b/kernel/assets/icons/icon_fullscreen.inc
new file mode 100644
index 0000000..3fbe75c
--- /dev/null
+++ b/kernel/assets/icons/icon_fullscreen.inc
@@ -0,0 +1,15 @@
+unsigned char icon_fullscreen_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x53, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0x63, 0x60, 0x18, 0x05, 0x03,
+ 0x0d, 0x18, 0x91, 0x39, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x57, 0x31, 0x23,
+ 0x23, 0x23, 0xa9, 0x6a, 0x99, 0x18, 0x68, 0x0c, 0x58, 0xf0, 0xd9, 0x8e,
+ 0x0f, 0xe0, 0x52, 0x83, 0xee, 0x33, 0x9a, 0xfb, 0x80, 0x69, 0xd4, 0x82,
+ 0x51, 0x40, 0x7d, 0x00, 0x4a, 0xc7, 0x84, 0x72, 0x29, 0x29, 0x7a, 0x47,
+ 0x93, 0x29, 0x41, 0x30, 0xf4, 0x83, 0x88, 0x05, 0x97, 0x04, 0xb6, 0x94,
+ 0xc4, 0x48, 0x42, 0x7d, 0x40, 0x37, 0x1f, 0x30, 0x0c, 0x79, 0x00, 0x00,
+ 0x2e, 0x98, 0x24, 0x10, 0x14, 0xfd, 0xe2, 0x1c, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_fullscreen_png_len = 140;
diff --git a/kernel/assets/icons/icon_fullscreen.png b/kernel/assets/icons/icon_fullscreen.png
new file mode 100644
index 0000000..e75da34
Binary files /dev/null and b/kernel/assets/icons/icon_fullscreen.png differ
diff --git a/kernel/assets/icons/icon_next.inc b/kernel/assets/icons/icon_next.inc
new file mode 100644
index 0000000..d405a04
--- /dev/null
+++ b/kernel/assets/icons/icon_next.inc
@@ -0,0 +1,16 @@
+unsigned char icon_next_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x62, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd5, 0x31, 0x0e, 0xc0,
+ 0x20, 0x0c, 0x43, 0xd1, 0xa4, 0xf7, 0xbf, 0xf3, 0x67, 0x45, 0x5d, 0xb0,
+ 0x0d, 0xaa, 0x54, 0x09, 0xef, 0xf9, 0x6f, 0x4c, 0xd5, 0xdd, 0x2f, 0x06,
+ 0x90, 0xde, 0x3e, 0x6a, 0x9c, 0x10, 0x59, 0x02, 0xdd, 0xdd, 0x6f, 0xec,
+ 0x28, 0xb0, 0x8b, 0x48, 0xc0, 0x0e, 0x22, 0x03, 0x29, 0x62, 0x01, 0x09,
+ 0x62, 0x03, 0x2e, 0x12, 0x01, 0x0e, 0x12, 0x03, 0x4c, 0xd1, 0x19, 0x3b,
+ 0x02, 0x20, 0xc6, 0x23, 0x00, 0x23, 0x6e, 0x03, 0x98, 0x71, 0x0b, 0x20,
+ 0x88, 0xcb, 0x00, 0x61, 0x5c, 0x02, 0xd8, 0x88, 0x7f, 0xf2, 0x0f, 0xee,
+ 0x6a, 0xb5, 0x01, 0x60, 0xec, 0x48, 0x0f, 0x92, 0x8b, 0xfb, 0xf9, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_next_png_len = 155;
diff --git a/kernel/assets/icons/icon_next.png b/kernel/assets/icons/icon_next.png
new file mode 100644
index 0000000..5410e8b
Binary files /dev/null and b/kernel/assets/icons/icon_next.png differ
diff --git a/kernel/assets/icons/icon_prev.inc b/kernel/assets/icons/icon_prev.inc
new file mode 100644
index 0000000..037cef8
--- /dev/null
+++ b/kernel/assets/icons/icon_prev.inc
@@ -0,0 +1,18 @@
+unsigned char icon_prev_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x74, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0xd4, 0x31, 0x0e, 0x80,
+ 0x20, 0x10, 0x44, 0x51, 0xc6, 0xfb, 0xdf, 0xf9, 0xdb, 0x52, 0xe1, 0xce,
+ 0xb0, 0x24, 0x16, 0x6c, 0x6b, 0xf2, 0x5f, 0x54, 0xd8, 0x31, 0xee, 0x9c,
+ 0x1e, 0x80, 0xd5, 0xf3, 0xa7, 0x23, 0xce, 0x02, 0x89, 0x01, 0xa6, 0xa8,
+ 0x24, 0xb5, 0x02, 0x14, 0xe3, 0x11, 0x80, 0x11, 0xb7, 0x01, 0xcc, 0xb8,
+ 0x05, 0x10, 0xc4, 0xcb, 0x00, 0x61, 0xbc, 0x04, 0xb0, 0x11, 0x6f, 0xbb,
+ 0x4c, 0x2d, 0x6f, 0x40, 0x88, 0x7c, 0x02, 0x9a, 0x3e, 0x4b, 0x82, 0x94,
+ 0x7e, 0xb2, 0x36, 0x90, 0xf2, 0x31, 0x55, 0x88, 0x58, 0x17, 0x4d, 0x01,
+ 0x62, 0xaf, 0x0a, 0x99, 0x48, 0xb4, 0xec, 0x64, 0x20, 0xf1, 0xba, 0xd6,
+ 0xe6, 0xe9, 0x2a, 0x0f, 0x27, 0xe3, 0xbf, 0x98, 0x17, 0x3b, 0xff, 0x54,
+ 0x05, 0xa8, 0xa1, 0xd5, 0x14, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_prev_png_len = 173;
diff --git a/kernel/assets/icons/icon_prev.png b/kernel/assets/icons/icon_prev.png
new file mode 100644
index 0000000..5a13a24
Binary files /dev/null and b/kernel/assets/icons/icon_prev.png differ
diff --git a/kernel/assets/icons/icon_rotate_ccw.inc b/kernel/assets/icons/icon_rotate_ccw.inc
new file mode 100644
index 0000000..8bbf399
--- /dev/null
+++ b/kernel/assets/icons/icon_rotate_ccw.inc
@@ -0,0 +1,18 @@
+unsigned char icon_rotate_ccw_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x73, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x95, 0x51, 0x0a, 0xc0,
+ 0x20, 0x0c, 0x43, 0x8d, 0xf7, 0xbf, 0x73, 0xf6, 0xe3, 0x60, 0x30, 0xdb,
+ 0x46, 0x2d, 0xb8, 0x81, 0xef, 0x3b, 0x6d, 0x1a, 0x90, 0x58, 0xca, 0x61,
+ 0x37, 0x50, 0x85, 0x24, 0xf9, 0x1a, 0x06, 0xc2, 0x79, 0xcc, 0x2c, 0x1e,
+ 0x31, 0x82, 0xba, 0x18, 0x9d, 0x25, 0x4f, 0x8d, 0x65, 0x52, 0x4d, 0x67,
+ 0x25, 0x7e, 0xa3, 0x77, 0x50, 0x68, 0x30, 0x02, 0x1c, 0x93, 0xaa, 0x0c,
+ 0x42, 0x48, 0x63, 0x91, 0x92, 0xc0, 0x4b, 0x11, 0x1a, 0x60, 0xe1, 0x7a,
+ 0xc9, 0x60, 0x95, 0xff, 0x1b, 0xa4, 0xc1, 0xc6, 0xb7, 0x12, 0x50, 0xe8,
+ 0xa1, 0x5b, 0x67, 0x69, 0xdd, 0x27, 0x18, 0x75, 0x8d, 0xd2, 0x45, 0xfb,
+ 0xda, 0x34, 0xeb, 0x3f, 0x38, 0x94, 0x88, 0x0b, 0x8d, 0x2a, 0x40, 0x19,
+ 0x92, 0x17, 0x47, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
+ 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_rotate_ccw_png_len = 172;
diff --git a/kernel/assets/icons/icon_rotate_ccw.png b/kernel/assets/icons/icon_rotate_ccw.png
new file mode 100644
index 0000000..0695299
Binary files /dev/null and b/kernel/assets/icons/icon_rotate_ccw.png differ
diff --git a/kernel/assets/icons/icon_rotate_cw.inc b/kernel/assets/icons/icon_rotate_cw.inc
new file mode 100644
index 0000000..c65fb2f
--- /dev/null
+++ b/kernel/assets/icons/icon_rotate_cw.inc
@@ -0,0 +1,18 @@
+unsigned char icon_rotate_cw_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x7b, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x95, 0x4b, 0x0e, 0x80,
+ 0x30, 0x08, 0x44, 0x19, 0xe3, 0xfd, 0xaf, 0x8c, 0x1b, 0x17, 0x04, 0x41,
+ 0x3e, 0xad, 0x69, 0x4c, 0xfa, 0xd6, 0xc3, 0x0c, 0x85, 0x84, 0x12, 0x6d,
+ 0x56, 0x83, 0xac, 0x90, 0x99, 0xf9, 0x51, 0x0c, 0x84, 0xf5, 0xe8, 0x18,
+ 0x57, 0x82, 0x90, 0x35, 0x87, 0x61, 0xa2, 0xc3, 0x2d, 0xcd, 0x11, 0x99,
+ 0xe3, 0xc6, 0xec, 0xae, 0x3b, 0x22, 0x69, 0x4e, 0x41, 0x03, 0x51, 0xe8,
+ 0x19, 0x75, 0xe0, 0x21, 0x8d, 0x32, 0x7b, 0x22, 0x29, 0x2e, 0x15, 0x28,
+ 0x74, 0xad, 0xbb, 0x83, 0x2e, 0x50, 0x23, 0x9a, 0x1e, 0xa0, 0xf9, 0x7f,
+ 0xc0, 0x27, 0x8b, 0x5e, 0xff, 0x82, 0xea, 0x2b, 0xf8, 0x45, 0x37, 0xed,
+ 0x16, 0xc1, 0x3b, 0x27, 0x23, 0xdd, 0x0d, 0x5f, 0x53, 0x49, 0xf7, 0x3f,
+ 0xd8, 0x50, 0xc4, 0x05, 0xd2, 0xe4, 0x50, 0x04, 0x4d, 0xda, 0x61, 0x2f,
+ 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_rotate_cw_png_len = 180;
diff --git a/kernel/assets/icons/icon_rotate_cw.png b/kernel/assets/icons/icon_rotate_cw.png
new file mode 100644
index 0000000..bf4f16b
Binary files /dev/null and b/kernel/assets/icons/icon_rotate_cw.png differ
diff --git a/kernel/assets/icons/icon_zoom_in.inc b/kernel/assets/icons/icon_zoom_in.inc
new file mode 100644
index 0000000..8bbe8d1
--- /dev/null
+++ b/kernel/assets/icons/icon_zoom_in.inc
@@ -0,0 +1,20 @@
+unsigned char icon_zoom_in_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x8c, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x93, 0xdb, 0x0e, 0xc0,
+ 0x10, 0x10, 0x44, 0x8d, 0xf8, 0xff, 0x5f, 0x9e, 0xa6, 0x09, 0x89, 0xa0,
+ 0x7b, 0x41, 0xa3, 0x0f, 0x3d, 0x8f, 0xcb, 0xce, 0xec, 0x85, 0x10, 0x7e,
+ 0x4e, 0x03, 0xed, 0x02, 0x49, 0x76, 0x49, 0x80, 0x9a, 0x57, 0x88, 0x5e,
+ 0x71, 0x29, 0xee, 0xe2, 0x16, 0x91, 0x0c, 0x96, 0x4c, 0x46, 0x02, 0x6c,
+ 0x62, 0x56, 0x93, 0x6e, 0x44, 0x25, 0x49, 0x9b, 0x33, 0xf2, 0xb9, 0x66,
+ 0x22, 0xee, 0x60, 0x07, 0x49, 0x3a, 0x1c, 0x55, 0x67, 0xed, 0xf0, 0x1b,
+ 0x1d, 0xa0, 0xaa, 0xd2, 0x5b, 0xf9, 0x63, 0x07, 0xd6, 0xe5, 0xd1, 0xfa,
+ 0x18, 0x66, 0x04, 0x58, 0x99, 0x4f, 0x1b, 0xb4, 0x42, 0x12, 0x92, 0x49,
+ 0x9c, 0x49, 0x44, 0xc6, 0x52, 0x88, 0x6b, 0x61, 0x23, 0xb4, 0x71, 0x2d,
+ 0x3f, 0x53, 0x28, 0x9d, 0x6c, 0xf9, 0x07, 0x10, 0x4c, 0xb6, 0x7d, 0x34,
+ 0x18, 0x77, 0xb2, 0x0c, 0xdf, 0x14, 0x3f, 0xc2, 0x05, 0x60, 0xf5, 0x73,
+ 0xf3, 0xfd, 0x66, 0xba, 0x22, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82
+};
+unsigned int icon_zoom_in_png_len = 197;
diff --git a/kernel/assets/icons/icon_zoom_in.png b/kernel/assets/icons/icon_zoom_in.png
new file mode 100644
index 0000000..f97ecfd
Binary files /dev/null and b/kernel/assets/icons/icon_zoom_in.png differ
diff --git a/kernel/assets/icons/icon_zoom_out.inc b/kernel/assets/icons/icon_zoom_out.inc
new file mode 100644
index 0000000..8463cd4
--- /dev/null
+++ b/kernel/assets/icons/icon_zoom_out.inc
@@ -0,0 +1,19 @@
+unsigned char icon_zoom_out_png[] = {
+ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
+ 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x18,
+ 0x08, 0x06, 0x00, 0x00, 0x00, 0xe0, 0x77, 0x3d, 0xf8, 0x00, 0x00, 0x00,
+ 0x7e, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x53, 0x5b, 0x0a, 0xc0,
+ 0x30, 0x08, 0x6b, 0xca, 0xee, 0x7f, 0xe5, 0x8c, 0xc1, 0x06, 0x83, 0x8d,
+ 0xa8, 0xd5, 0xe1, 0xcf, 0xf2, 0xd9, 0x6a, 0xe2, 0x23, 0x8e, 0xf1, 0xa3,
+ 0x1b, 0xb0, 0x02, 0x48, 0xf2, 0x91, 0x04, 0x98, 0x79, 0x17, 0x66, 0x94,
+ 0x5c, 0xbd, 0x87, 0x70, 0x90, 0x28, 0x81, 0x94, 0x88, 0x87, 0x80, 0xab,
+ 0x22, 0x91, 0x44, 0x3a, 0x62, 0xe5, 0x0e, 0x2a, 0xb0, 0xa9, 0x4f, 0x55,
+ 0x9d, 0xd7, 0x49, 0xbd, 0x1d, 0x20, 0xe0, 0xf7, 0x36, 0x17, 0x4d, 0x55,
+ 0x79, 0xc5, 0xa1, 0xc9, 0x11, 0x78, 0x89, 0xd4, 0x28, 0xe7, 0x4a, 0x22,
+ 0x4e, 0x78, 0x0a, 0x49, 0x2f, 0x91, 0x37, 0xf2, 0xb7, 0x82, 0xd2, 0x36,
+ 0x85, 0xd1, 0x49, 0xc9, 0x1d, 0x40, 0x88, 0x94, 0x1d, 0x1a, 0x9c, 0x3b,
+ 0x49, 0x83, 0x5f, 0x92, 0xb7, 0x60, 0x07, 0xf2, 0x27, 0x73, 0xd8, 0xe0,
+ 0x2e, 0xa7, 0x24, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x42, 0x60, 0x82
+};
+unsigned int icon_zoom_out_png_len = 183;
diff --git a/kernel/assets/icons/icon_zoom_out.png b/kernel/assets/icons/icon_zoom_out.png
new file mode 100644
index 0000000..e115592
Binary files /dev/null and b/kernel/assets/icons/icon_zoom_out.png differ
diff --git a/kernel/assets/icons/rotate-ccw.svg b/kernel/assets/icons/rotate-ccw.svg
new file mode 100644
index 0000000..ade5dc4
--- /dev/null
+++ b/kernel/assets/icons/rotate-ccw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/assets/icons/rotate-cw.svg b/kernel/assets/icons/rotate-cw.svg
new file mode 100644
index 0000000..83dca35
--- /dev/null
+++ b/kernel/assets/icons/rotate-cw.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/kernel/core/main.c b/kernel/core/main.c
index c7410bc..21cde5b 100644
--- a/kernel/core/main.c
+++ b/kernel/core/main.c
@@ -1,19 +1,20 @@
/*
* UnixOS Kernel - Main Entry Point
- *
+ *
* This is the C entry point called from boot.S after basic
* hardware initialization is complete.
*/
-#include "types.h"
-#include "printk.h"
+#include "arch/arch.h"
+#include "drivers/pci.h"
+#include "drivers/uart.h"
+#include "fs/vfs.h"
#include "media/seed_assets.h"
#include "mm/pmm.h"
#include "mm/vmm.h"
+#include "printk.h"
#include "sched/sched.h"
-#include "arch/arch.h"
-#include "drivers/uart.h"
-#include "fs/vfs.h"
+#include "types.h"
/* Kernel version */
#define VIBOS_VERSION_MAJOR 0
@@ -34,262 +35,364 @@ static void start_init_process(void);
/*
* kernel_main - Main kernel entry point
* @dtb: Pointer to device tree blob passed by bootloader
- *
+ *
* This function never returns. After initialization, it either:
* 1. Starts the init process and enters the scheduler
* 2. Panics if initialization fails
*/
-void kernel_main(void *dtb)
-{
- /* Initialize early console for debugging */
- uart_early_init();
-
- /* Print boot banner */
- print_banner();
-
- printk("DEBUG: After banner\n");
-
- (void)dtb; /* Suppress unused warning */
- (void)__kernel_start;
- (void)__kernel_end;
-
- printk("DEBUG: About to call init_subsystems\n");
-
- /* Initialize all kernel subsystems */
- init_subsystems(dtb);
-
- printk("DEBUG: After init_subsystems\n");
- printk(KERN_INFO "All subsystems initialized successfully\n");
- printk(KERN_INFO "Starting init process...\n\n");
-
- /* Start the first userspace process */
- start_init_process();
-
- /* This point should never be reached */
- panic("kernel_main returned unexpectedly!");
+void kernel_main(void *dtb) {
+ /* Initialize early console for debugging */
+ uart_early_init();
+
+ /* Print boot banner */
+ print_banner();
+
+ (void)dtb; /* Suppress unused warning */
+ (void)__kernel_start;
+ (void)__kernel_end;
+
+ /* Initialize all kernel subsystems */
+ init_subsystems(dtb);
+
+ printk(KERN_INFO "All subsystems initialized successfully\n");
+ printk(KERN_INFO "Starting init process...\n\n");
+
+ /* Start the first userspace process */
+ start_init_process();
+
+ /* This point should never be reached */
+ panic("kernel_main returned unexpectedly!");
}
/*
* print_banner - Display kernel boot banner
*/
-static void print_banner(void)
-{
- printk("\n");
- printk(" _ _ ___ ____ \n");
- printk(" __ _(_)| |__ / _ \\/ ___| \n");
- printk(" \\ \\ / / || '_ \\ | | | \\___ \\ \n");
- printk(" \\ V /| || |_) | | |_| |___) |\n");
- printk(" \\_/ |_||_.__/ \\___/|____/ \n");
- printk("\n");
- printk("Vib-OS v%d.%d.%d - ARM64 with GUI\n",
- VIBOS_VERSION_MAJOR,
- VIBOS_VERSION_MINOR,
- VIBOS_VERSION_PATCH);
- printk("A Unix-like operating system for ARM64\n");
- printk("Copyright (c) 2026 Vib-OS Project\n");
- printk("\n");
+static void print_banner(void) {
+ printk("\n");
+ printk(" _ _ ___ ____ \n");
+ printk(" __ _(_)| |__ / _ \\/ ___| \n");
+ printk(" \\ \\ / / || '_ \\ | | | \\___ \\ \n");
+ printk(" \\ V /| || |_) | | |_| |___) |\n");
+ printk(" \\_/ |_||_.__/ \\___/|____/ \n");
+ printk("\n");
+ printk("Vib-OS v%d.%d.%d - ARM64 with GUI\n", VIBOS_VERSION_MAJOR,
+ VIBOS_VERSION_MINOR, VIBOS_VERSION_PATCH);
+ printk("A Unix-like operating system for ARM64\n");
+ printk("Copyright (c) 2026 Vib-OS Project\n");
+ printk("\n");
}
/*
* init_subsystems - Initialize all kernel subsystems
* @dtb: Device tree blob for hardware discovery
*/
-static void init_subsystems(void *dtb)
-{
- int ret;
-
- /* ================================================================= */
- /* Phase 1: Core Hardware */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Phase 1: Core Hardware\n");
-
- /* Parse device tree for hardware information */
- printk(KERN_INFO " Parsing device tree...\n");
- (void)dtb; /* TODO: dtb_parse(dtb); */
-
- /* Initialize interrupt controller */
- printk(KERN_INFO " Initializing interrupt controller...\n");
- arch_irq_init();
-
- /* Initialize system timer */
- printk(KERN_INFO " Initializing timer...\n");
- arch_timer_init();
-
- /* ================================================================= */
- /* Phase 2: Memory Management */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Phase 2: Memory Management\n");
-
- /* Initialize physical memory manager */
- printk(KERN_INFO " Initializing physical memory manager...\n");
- ret = pmm_init();
- if (ret < 0) {
- panic("Failed to initialize physical memory manager!");
- }
- printk(KERN_INFO " About to init VMM...\n");
+static void init_subsystems(void *dtb) {
+ int ret;
- /* Initialize virtual memory manager */
- printk(KERN_INFO " Initializing virtual memory manager...\n");
- ret = vmm_init();
- if (ret < 0) {
- panic("Failed to initialize virtual memory manager!");
- }
-
- /* Initialize kernel heap */
- printk(KERN_INFO " Initializing kernel heap...\n");
- extern void kmalloc_init(void);
- kmalloc_init();
-
- /* ================================================================= */
- /* Phase 3: Process Management */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Phase 3: Process Management\n");
-
- /* Initialize scheduler */
- printk(KERN_INFO " Initializing scheduler...\n");
- sched_init();
-
- /* Initialize SMP (multiprocessor support) */
- printk(KERN_INFO " Initializing SMP...\n");
- extern void smp_init(void);
- smp_init();
-
- /* Initialize process subsystem */
- printk(KERN_INFO " Initializing process subsystem...\n");
- extern void process_init(void);
- process_init();
-
- /* ================================================================= */
- /* Phase 4: Filesystems */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Phase 4: Filesystems\n");
-
- /* Initialize Virtual Filesystem */
- printk(KERN_INFO " Initializing VFS...\n");
- /* Initialize Virtual Filesystem */
- printk(KERN_INFO " Initializing VFS...\n");
- vfs_init();
-
- /* Initialize and Register RamFS */
- printk(KERN_INFO " Initializing RamFS...\n");
- extern int ramfs_init(void);
- ramfs_init();
-
- /* Mount root filesystem */
- printk(KERN_INFO " Mounting root filesystem...\n");
- if (vfs_mount("ramfs", "/", "ramfs", 0, NULL) != 0) {
- panic("Failed to mount root filesystem!");
- }
-
- /* Populate filesystem with sample data */
- extern int ramfs_create_dir(const char *path, mode_t mode);
- extern int ramfs_create_file(const char *path, mode_t mode, const char *content);
- extern int ramfs_create_file_bytes(const char *path, mode_t mode, const uint8_t *data, size_t size);
-
- ramfs_create_dir("Documents", 0755);
- ramfs_create_dir("Downloads", 0755);
- ramfs_create_dir("Pictures", 0755);
- ramfs_create_dir("System", 0755);
- ramfs_create_file("readme.txt", 0644, "Welcome to Vib-OS!\nThis is a real file in RamFS.");
- ramfs_create_file("todo.txt", 0644, "- Implement Browser\n- Fix Bugs\n- Sleep");
- ramfs_create_file_bytes("sample.mp3", 0644, vib_seed_mp3, vib_seed_mp3_len);
-
- /* Add baseline JPEG images to Pictures directory */
- extern const unsigned char bootstrap_landscape_jpg[];
- extern const unsigned int bootstrap_landscape_jpg_len;
- extern const unsigned char bootstrap_portrait_jpg[];
- extern const unsigned int bootstrap_portrait_jpg_len;
- extern const unsigned char bootstrap_square_jpg[];
- extern const unsigned int bootstrap_square_jpg_len;
- extern const unsigned char bootstrap_wallpaper_jpg[];
- extern const unsigned int bootstrap_wallpaper_jpg_len;
- /* Real photos from the internet */
- extern const unsigned char bootstrap_nature_jpg[];
- extern const unsigned int bootstrap_nature_jpg_len;
- extern const unsigned char bootstrap_city_jpg[];
- extern const unsigned int bootstrap_city_jpg_len;
- extern const unsigned char bootstrap_httpbin_jpg[];
- extern const unsigned int bootstrap_httpbin_jpg_len;
-
- ramfs_create_file_bytes("Pictures/landscape.jpg", 0644, bootstrap_landscape_jpg, bootstrap_landscape_jpg_len);
- ramfs_create_file_bytes("Pictures/portrait.jpg", 0644, bootstrap_portrait_jpg, bootstrap_portrait_jpg_len);
- ramfs_create_file_bytes("Pictures/square.jpg", 0644, bootstrap_square_jpg, bootstrap_square_jpg_len);
- ramfs_create_file_bytes("Pictures/wallpaper.jpg", 0644, bootstrap_wallpaper_jpg, bootstrap_wallpaper_jpg_len);
- /* Real photos */
- ramfs_create_file_bytes("Pictures/nature.jpg", 0644, bootstrap_nature_jpg, bootstrap_nature_jpg_len);
- ramfs_create_file_bytes("Pictures/city.jpg", 0644, bootstrap_city_jpg, bootstrap_city_jpg_len);
- ramfs_create_file_bytes("Pictures/pig.jpg", 0644, bootstrap_httpbin_jpg, bootstrap_httpbin_jpg_len);
-
- /* Mount proc, sys, dev (placeholders) */
- printk(KERN_INFO " Mounting procfs...\n");
- printk(KERN_INFO " Mounting sysfs...\n");
- printk(KERN_INFO " Mounting devfs...\n");
-
- /* ================================================================= */
- /* Phase 5: Device Drivers & GUI */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Phase 5: Device Drivers\n");
-
- /* Initialize framebuffer driver */
- printk(KERN_INFO " Loading framebuffer driver...\n");
- extern int fb_init(void);
- extern void fb_get_info(uint32_t **buffer, uint32_t *width, uint32_t *height);
- fb_init();
-
- /* Initialize GUI windowing system */
- printk(KERN_INFO " Initializing GUI...\n");
- extern int gui_init(uint32_t *framebuffer, uint32_t width, uint32_t height, uint32_t pitch);
- extern struct window *gui_create_window(const char *title, int x, int y, int w, int h);
- extern void gui_compose(void);
- extern void gui_draw_cursor(void);
-
- uint32_t *fb_buffer;
- uint32_t fb_width, fb_height;
- fb_get_info(&fb_buffer, &fb_width, &fb_height);
-
- if (fb_buffer) {
- gui_init(fb_buffer, fb_width, fb_height, fb_width * 4);
-
- /* Create demo windows */
+ /* ================================================================= */
+ /* Phase 1: Core Hardware */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Phase 1: Core Hardware\n");
+
+ /* Parse device tree for hardware information */
+ printk(KERN_INFO " Parsing device tree...\n");
+ (void)dtb; /* TODO: dtb_parse(dtb); */
+
+ /* Initialize interrupt controller */
+ printk(KERN_INFO " Initializing interrupt controller...\n");
+ arch_irq_init();
+
+ /* Initialize system timer */
+ printk(KERN_INFO " Initializing timer...\n");
+ arch_timer_init();
+
+ /* ================================================================= */
+ /* Phase 2: Memory Management */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Phase 2: Memory Management\n");
+
+ /* Initialize physical memory manager */
+ printk(KERN_INFO " Initializing physical memory manager...\n");
+ ret = pmm_init();
+ if (ret < 0) {
+ panic("Failed to initialize physical memory manager!");
+ }
+ printk(KERN_INFO " About to init VMM...\n");
+
+ /* Initialize virtual memory manager */
+ printk(KERN_INFO " Initializing virtual memory manager...\n");
+ ret = vmm_init();
+ if (ret < 0) {
+ panic("Failed to initialize virtual memory manager!");
+ }
+
+ /* Initialize kernel heap */
+ printk(KERN_INFO " Initializing kernel heap...\n");
+ extern void kmalloc_init(void);
+ kmalloc_init();
+
+ /* ================================================================= */
+ /* Phase 3: Process Management */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Phase 3: Process Management\n");
+
+ /* Initialize scheduler */
+ printk(KERN_INFO " Initializing scheduler...\n");
+ sched_init();
+
+ /* Initialize process subsystem */
+ printk(KERN_INFO " Initializing process subsystem...\n");
+ extern void process_init(void);
+ process_init();
+
+ /* ================================================================= */
+ /* Phase 4: Filesystems */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Phase 4: Filesystems\n");
+
+ /* Initialize Virtual Filesystem */
+ printk(KERN_INFO " Initializing VFS...\n");
+ /* Initialize Virtual Filesystem */
+ printk(KERN_INFO " Initializing VFS...\n");
+ vfs_init();
+
+ /* Initialize and Register RamFS */
+ printk(KERN_INFO " Initializing RamFS...\n");
+ extern int ramfs_init(void);
+ ramfs_init();
+
+ /* Mount root filesystem */
+ printk(KERN_INFO " Mounting root filesystem...\n");
+ if (vfs_mount("ramfs", "/", "ramfs", 0, NULL) != 0) {
+ panic("Failed to mount root filesystem!");
+ }
+
+ /* Populate filesystem with sample data */
+ extern int ramfs_create_dir(const char *path, mode_t mode);
+ extern int ramfs_create_file(const char *path, mode_t mode,
+ const char *content);
+ extern int ramfs_create_file_bytes(const char *path, mode_t mode,
+ const uint8_t *data, size_t size);
+
+ ramfs_create_dir("Documents", 0755);
+ ramfs_create_dir("Downloads", 0755);
+ ramfs_create_dir("Pictures", 0755);
+ ramfs_create_dir("System", 0755);
+ ramfs_create_dir("Desktop", 0755);
+
+ /* Seed Desktop with sample files and folders */
+ ramfs_create_file("/Desktop/notes.txt", 0644,
+ "Welcome to Vib-OS!\n\nThis is your desktop - right-click "
+ "for options!\n");
+ ramfs_create_file("/Desktop/readme.txt", 0644,
+ "Vib-OS Desktop Manager\n\n- Double-click to open files\n- "
+ "Right-click for context menu\n");
+
+ /* Create a subfolder on Desktop */
+ extern int vfs_mkdir(const char *path, mode_t mode);
+ vfs_mkdir("/Desktop/Projects", 0755);
+ ramfs_create_file("readme.txt", 0644,
+ "Welcome to Vib-OS!\nThis is a real file in RamFS.");
+ ramfs_create_file("todo.txt", 0644,
+ "- Implement Browser\n- Fix Bugs\n- Sleep");
+ ramfs_create_file_bytes("sample.mp3", 0644, vib_seed_mp3, vib_seed_mp3_len);
+
+ /* Add baseline JPEG images to Pictures directory */
+ extern const unsigned char bootstrap_landscape_jpg[];
+ extern const unsigned int bootstrap_landscape_jpg_len;
+ extern const unsigned char bootstrap_portrait_jpg[];
+ extern const unsigned int bootstrap_portrait_jpg_len;
+ extern const unsigned char bootstrap_square_jpg[];
+ extern const unsigned int bootstrap_square_jpg_len;
+ extern const unsigned char bootstrap_wallpaper_jpg[];
+ extern const unsigned int bootstrap_wallpaper_jpg_len;
+ /* Real photos from the internet */
+ extern const unsigned char bootstrap_nature_jpg[];
+ extern const unsigned int bootstrap_nature_jpg_len;
+ extern const unsigned char bootstrap_city_jpg[];
+ extern const unsigned int bootstrap_city_jpg_len;
+ extern const unsigned char bootstrap_httpbin_jpg[];
+ extern const unsigned int bootstrap_httpbin_jpg_len;
+
+ /* HD Wallpapers (high quality) */
+ extern const unsigned char hd_wallpaper_landscape_jpg[];
+ extern const unsigned int hd_wallpaper_landscape_jpg_len;
+ extern const unsigned char hd_wallpaper_nature_jpg[];
+ extern const unsigned int hd_wallpaper_nature_jpg_len;
+ extern const unsigned char hd_wallpaper_city_jpg[];
+ extern const unsigned int hd_wallpaper_city_jpg_len;
+
+ /* Use HD wallpapers for main images */
+ ramfs_create_file_bytes("Pictures/landscape.jpg", 0644,
+ hd_wallpaper_landscape_jpg,
+ hd_wallpaper_landscape_jpg_len);
+ ramfs_create_file_bytes("Pictures/portrait.jpg", 0644, bootstrap_portrait_jpg,
+ bootstrap_portrait_jpg_len);
+ ramfs_create_file_bytes("Pictures/square.jpg", 0644, bootstrap_square_jpg,
+ bootstrap_square_jpg_len);
+ ramfs_create_file_bytes("Pictures/wallpaper.jpg", 0644,
+ bootstrap_wallpaper_jpg, bootstrap_wallpaper_jpg_len);
+ /* HD Photos */
+ ramfs_create_file_bytes("Pictures/nature.jpg", 0644, hd_wallpaper_nature_jpg,
+ hd_wallpaper_nature_jpg_len);
+ ramfs_create_file_bytes("Pictures/city.jpg", 0644, hd_wallpaper_city_jpg,
+ hd_wallpaper_city_jpg_len);
+ ramfs_create_file_bytes("Pictures/pig.jpg", 0644, bootstrap_httpbin_jpg,
+ bootstrap_httpbin_jpg_len);
+
+ /* Add PNG test image to Pictures */
+ extern const unsigned char bootstrap_test_png[];
+ extern const unsigned int bootstrap_test_png_len;
+ ramfs_create_file_bytes("Pictures/test.png", 0644, bootstrap_test_png,
+ bootstrap_test_png_len);
+
+ /* Mount proc, sys, dev (placeholders) */
+ printk(KERN_INFO " Mounting procfs...\n");
+
+ /* Create examples directory with language demo files */
+ ramfs_create_dir("examples", 0755);
+
+ /* Python demo files */
+ ramfs_create_file("examples/hello.py", 0644,
+ "# Hello World in Python for Vib-OS\n"
+ "# Run with: run hello.py\n\n"
+ "def greet(name):\n"
+ " return 'Hello, ' + name + '!'\n\n"
+ "def main():\n"
+ " print('Welcome to Vib-OS Python Demo')\n"
+ " message = greet('Vib-OS User')\n"
+ " print(message)\n\n"
+ "if __name__ == '__main__':\n"
+ " main()\n");
+
+ ramfs_create_file("examples/fibonacci.py", 0644,
+ "# Fibonacci Sequence in Python\n"
+ "# Run with: run fibonacci.py\n\n"
+ "def fibonacci(n):\n"
+ " if n <= 0: return []\n"
+ " fib = [0, 1]\n"
+ " for i in range(2, n):\n"
+ " fib.append(fib[i-1] + fib[i-2])\n"
+ " return fib\n\n"
+ "print(fibonacci(10))\n");
+
+ /* NanoLang demo files */
+ ramfs_create_file("examples/hello.nano", 0644,
+ "// Hello World in NanoLang\n"
+ "// Run with: run hello.nano\n\n"
+ "fn greet(name: str) -> str {\n"
+ " return 'Hello, ' + name + '!';\n"
+ "}\n\n"
+ "fn main() {\n"
+ " print('Welcome to NanoLang');\n"
+ " let msg = greet('Vib-OS');\n"
+ " print(msg);\n"
+ "}\n");
+
+ ramfs_create_file("examples/calculator.nano", 0644,
+ "// Calculator in NanoLang\n"
+ "fn add(a: int, b: int) -> int { return a + b; }\n"
+ "fn main() {\n"
+ " print('42 + 7 = ');\n"
+ " print(add(42, 7));\n"
+ "}\n");
+
+ printk(KERN_INFO " Mounting sysfs...\n");
+ printk(KERN_INFO " Mounting devfs...\n");
+
+ /* ================================================================= */
+ /* Phase 5: Device Drivers & GUI */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Phase 5: Device Drivers\n");
+
+ /* Initialize framebuffer driver */
+ printk(KERN_INFO " Loading framebuffer driver...\n");
+ extern int fb_init(void);
+ extern void fb_get_info(uint32_t **buffer, uint32_t *width, uint32_t *height);
+ fb_init();
+
+ /* Initialize GUI windowing system */
+ printk(KERN_INFO " Initializing GUI...\n");
+ extern int gui_init(uint32_t *framebuffer, uint32_t width, uint32_t height,
+ uint32_t pitch);
+ extern struct window *gui_create_window(const char *title, int x, int y,
+ int w, int h);
+ extern void gui_compose(void);
+ extern void gui_draw_cursor(void);
+
+ uint32_t *fb_buffer;
+ uint32_t fb_width, fb_height;
+ fb_get_info(&fb_buffer, &fb_width, &fb_height);
+
+ if (fb_buffer) {
+ gui_init(fb_buffer, fb_width, fb_height, fb_width * 4);
+
+ /* Create demo windows with working terminal */
extern struct window *gui_create_file_manager(int x, int y);
gui_create_window("Terminal", 50, 50, 400, 300);
+
+ /* Create and set active terminal so keyboard input works */
+ {
+ extern struct terminal *term_create(int x, int y, int cols, int rows);
+ extern void term_set_active(struct terminal * term);
+ struct terminal *term = term_create(52, 80, 48, 15);
+ if (term) {
+ term_set_active(term);
+ }
+ }
+
gui_create_file_manager(200, 100);
-
- /* Compose and display desktop */
- gui_compose();
- gui_draw_cursor();
-
- printk(KERN_INFO " GUI desktop ready!\\n");
+
+ /* Compose and display desktop */
+ gui_compose();
+ gui_draw_cursor();
+
+ printk(KERN_INFO " GUI desktop ready!\n");
+ }
+
+ /* Initialize PCI bus and detect devices (including Audio) */
+ printk(KERN_INFO " Initializing PCI bus...\n");
+ extern void pci_init(void);
+ pci_init();
+
+ /* Initialize GPU driver (virtio-gpu for QEMU acceleration) */
+ printk(KERN_INFO " Initializing GPU driver...\n");
+ extern int virtio_gpu_init(pci_device_t * pci);
+ extern pci_device_t *pci_find_device(uint16_t vendor, uint16_t device);
+ pci_device_t *gpu = pci_find_device(0x1AF4, 0x1050); /* virtio-gpu */
+ if (gpu) {
+ if (virtio_gpu_init(gpu) == 0) {
+ printk(KERN_INFO " GPU: virtio-gpu initialized with 3D acceleration\n");
+ } else {
+ printk(KERN_INFO " GPU: virtio-gpu init failed\n");
}
-
- /* Initialize PCI bus and detect devices (including Audio) */
- printk(KERN_INFO " Initializing PCI bus...\n");
- extern void pci_init(void);
- pci_init();
-
- printk(KERN_INFO " Loading keyboard driver...\n");
- printk(KERN_INFO " Loading NVMe driver...\n");
- printk(KERN_INFO " Loading USB driver...\n");
- printk(KERN_INFO " Loading network driver...\n");
- extern void tcpip_init(void);
- extern int virtio_net_init(void);
- tcpip_init();
- virtio_net_init();
-
- /* ================================================================= */
- /* Phase 6: Enable Interrupts */
- /* ================================================================= */
-
- printk(KERN_INFO "[INIT] Enabling interrupts...\n");
- /* Enable interrupts */
- arch_irq_enable();
-
- printk(KERN_INFO "[INIT] Kernel initialization complete!\n\n");
+ } else {
+ printk(KERN_INFO " GPU: No virtio-gpu found (software rendering)\n");
+ }
+
+ printk(KERN_INFO " Loading keyboard driver...\n");
+ printk(KERN_INFO " Loading NVMe driver...\n");
+ printk(KERN_INFO " Loading USB driver...\n");
+ printk(KERN_INFO " Loading network driver...\n");
+ extern void tcpip_init(void);
+ extern int virtio_net_init(void);
+ tcpip_init();
+ virtio_net_init();
+
+ /* ================================================================= */
+ /* Phase 6: Enable Interrupts */
+ /* ================================================================= */
+
+ printk(KERN_INFO "[INIT] Enabling interrupts...\n");
+ /* Enable interrupts */
+ arch_irq_enable();
+
+ printk(KERN_INFO "[INIT] Kernel initialization complete!\n\n");
}
/*
@@ -301,138 +404,129 @@ static void *g_active_terminal = 0;
/* Keyboard callback wrapper */
/* Keyboard callback wrapper */
-static void keyboard_handler(int key)
-{
- extern void gui_handle_key_event(int key);
- gui_handle_key_event(key);
-
- /* Also send to KAPI input buffer for non-windowed apps (e.g. Doom) */
- extern void kapi_sys_key_event(int key);
- kapi_sys_key_event(key);
+static void keyboard_handler(int key) {
+ /* gui_handle_key_event is now called via gui_key_callback, not here */
+
+ /* Send to KAPI input buffer for non-windowed apps (e.g. Doom) */
+ extern void kapi_sys_key_event(int key);
+ kapi_sys_key_event(key);
}
-static void start_init_process(void)
-{
- /* Create and start init process */
- printk(KERN_INFO "Executing /sbin/init...\n");
-
- printk(KERN_INFO "Init process started (placeholder)\n");
- printk(KERN_INFO "System ready.\n\n");
-
- /* Set up input handling */
- extern int input_init(void);
+static void start_init_process(void) {
+ /* Create and start init process */
+ printk(KERN_INFO "Executing /sbin/init...\n");
+
+ printk(KERN_INFO "Init process started (placeholder)\n");
+ printk(KERN_INFO "System ready.\n\n");
+
+ /* Set up input handling */
+ extern int input_init(void);
+ extern void input_poll(void);
+ extern void input_set_key_callback(void (*callback)(int key));
+ extern void gui_compose(void);
+ extern void gui_draw_cursor(void);
+
+ input_init();
+
+ /* Connect keyboard input to terminal */
+ input_set_key_callback(keyboard_handler);
+
+ printk(KERN_INFO "GUI: Event loop started - type in terminal!\\n");
+
+ /* Initial render */
+ gui_compose();
+ gui_draw_cursor();
+
+ /* Main GUI event loop with proper flicker-free refresh */
+ uint32_t frame = 0;
+ int last_mx = 0, last_my = 0;
+ int last_buttons = 0;
+ int needs_redraw = 1; /* Initial draw */
+ int cursor_only = 0; /* Only cursor needs updating */
+
+ /* Timer for periodic auto-refresh (33ms = 30 FPS for responsive UI) */
+ uint64_t last_refresh = arch_timer_get_ms();
+ const uint64_t REFRESH_MS = 33; /* 30 FPS - responsive mouse */
+
+ while (1) {
+ /* Poll virtio input devices (keyboard/mouse) - MUST call this! */
+ input_poll();
+
+ /* Poll for keyboard input from UART as well */
+ extern int uart_getc_nonblock(void);
+ extern void gui_handle_key_event(int key);
+ int c = uart_getc_nonblock();
+ if (c >= 0) {
+ /* Route to focused window */
+ gui_handle_key_event(c);
+ needs_redraw = 1;
+ }
+
+ /* Poll input system (Keyboard & Mouse) */
extern void input_poll(void);
- extern void input_set_key_callback(void (*callback)(int key));
- extern void gui_compose(void);
- extern void gui_draw_cursor(void);
-
- input_init();
-
- /* Connect keyboard input to terminal */
- input_set_key_callback(keyboard_handler);
-
- printk(KERN_INFO "GUI: Event loop started - type in terminal!\\n");
-
- /* Initial render */
- gui_compose();
- gui_draw_cursor();
-
- /* Main GUI event loop with proper flicker-free refresh */
- uint32_t frame = 0;
- int last_mx = 0, last_my = 0;
- int last_buttons = 0;
- int needs_redraw = 1; /* Initial draw */
- int cursor_only = 0; /* Only cursor needs updating */
-
- /* Timer for periodic auto-refresh (200ms = 5 FPS, flicker-free) */
- uint64_t last_refresh = arch_timer_get_ms();
- const uint64_t REFRESH_MS = 200; /* 5 FPS - smooth, no flicker */
-
- while (1) {
- /* Poll virtio input devices (keyboard/mouse) - MUST call this! */
- input_poll();
-
- /* Poll for keyboard input from UART as well */
- extern int uart_getc_nonblock(void);
- extern void gui_handle_key_event(int key);
- int c = uart_getc_nonblock();
- if (c >= 0) {
- /* Route to focused window */
- gui_handle_key_event(c);
- needs_redraw = 1;
- }
-
- /* Poll input system (Keyboard & Mouse) */
- extern void input_poll(void);
- input_poll();
-
- /* Get mouse state (updated by input_poll) */
- extern void mouse_get_position(int *x, int *y);
- extern int mouse_get_buttons(void);
- extern void gui_handle_mouse_event(int x, int y, int buttons);
-
- int mx, my;
- mouse_get_position(&mx, &my);
- int mbuttons = mouse_get_buttons();
-
- /* Check if mouse changed */
- if (mx != last_mx || my != last_my || mbuttons != last_buttons) {
- /* Only full redraw on button state change (click/release) or drag */
- if (mbuttons != last_buttons || (mbuttons && (mx != last_mx || my != last_my))) {
- gui_handle_mouse_event(mx, my, mbuttons);
- needs_redraw = 1;
- } else {
- /* Just cursor moved - update cursor only */
- cursor_only = 1;
- }
- last_mx = mx;
- last_my = my;
- last_buttons = mbuttons;
- }
-
- /* Periodic refresh for animations (5 FPS) */
- uint64_t now = arch_timer_get_ms();
- if (now - last_refresh >= REFRESH_MS) {
- last_refresh = now;
- needs_redraw = 1;
- }
-
- /* Redraw when needed - compose then swap */
- if (needs_redraw) {
- gui_compose();
- gui_draw_cursor();
- needs_redraw = 0;
- cursor_only = 0;
- } else if (cursor_only) {
- gui_draw_cursor();
- cursor_only = 0;
- }
-
- frame++;
- (void)frame;
-
- /* Yield to prevent 100% CPU, allows input polling */
- for (volatile int i = 0; i < 5000; i++) { }
+ input_poll();
+
+ /* Get mouse state (updated by input_poll) */
+ extern void mouse_get_position(int *x, int *y);
+ extern int mouse_get_buttons(void);
+ extern void gui_handle_mouse_event(int x, int y, int buttons);
+
+ int mx, my;
+ mouse_get_position(&mx, &my);
+ int mbuttons = mouse_get_buttons();
+
+ /* Check if mouse changed */
+ if (mx != last_mx || my != last_my || mbuttons != last_buttons) {
+ /* Always call mouse event handler for hover support */
+ gui_handle_mouse_event(mx, my, mbuttons);
+
+ /* Always redraw on mouse move - cursor is now composited */
+ needs_redraw = 1;
+
+ last_mx = mx;
+ last_my = my;
+ last_buttons = mbuttons;
+ }
+
+ /* Periodic refresh for animations (5 FPS) */
+ uint64_t now = arch_timer_get_ms();
+ if (now - last_refresh >= REFRESH_MS) {
+ last_refresh = now;
+ needs_redraw = 1;
+ }
+
+ /* Redraw when needed - compose includes cursor drawing */
+ if (needs_redraw) {
+ gui_compose(); /* Cursor is drawn inside compose, before blit */
+ needs_redraw = 0;
+ cursor_only = 0;
+ }
+
+ frame++;
+ (void)frame;
+
+ /* Short yield - allows input polling without slowing mouse */
+ for (volatile int i = 0; i < 500; i++) {
}
+ }
}
/*
* panic - Halt the system with an error message
* @msg: Error message to display
*/
-void panic(const char *msg)
-{
- /* Disable interrupts */
- arch_irq_disable();
-
- printk(KERN_EMERG "\n");
- printk(KERN_EMERG "============================================\n");
- printk(KERN_EMERG "KERNEL PANIC!\n");
- printk(KERN_EMERG "============================================\n");
- printk(KERN_EMERG "%s\n", msg);
- printk(KERN_EMERG "============================================\n");
- printk(KERN_EMERG "System halted.\n");
-
- /* Infinite loop */
- arch_halt();
+void panic(const char *msg) {
+ /* Disable interrupts */
+ arch_irq_disable();
+
+ printk(KERN_EMERG "\n");
+ printk(KERN_EMERG "============================================\n");
+ printk(KERN_EMERG "KERNEL PANIC!\n");
+ printk(KERN_EMERG "============================================\n");
+ printk(KERN_EMERG "%s\n", msg);
+ printk(KERN_EMERG "============================================\n");
+ printk(KERN_EMERG "System halted.\n");
+
+ /* Infinite loop */
+ arch_halt();
}
diff --git a/kernel/core/process.c b/kernel/core/process.c
index 2ec0e68..faaf62e 100644
--- a/kernel/core/process.c
+++ b/kernel/core/process.c
@@ -7,11 +7,13 @@
*/
#include "process.h"
-#include "../include/loader/elf.h"
+#include "../include/arch/arch.h"
#include "../include/fs/vfs_compat.h"
+#include "../include/loader/elf.h"
#include "../include/mm/kmalloc.h"
#include "../include/printk.h"
-#include "../include/arch/arch.h"
+#include "../include/sync/spinlock.h"
+#include "../include/mm/aslr.h"
/* Forward declare strncpy and strlen from our kernel */
extern char *strncpy(char *dst, const char *src, size_t n);
@@ -34,16 +36,20 @@ extern kapi_t *kapi_get(void);
// Process table
static process_t proc_table[MAX_PROCESSES];
-static int current_pid = -1; // -1 means kernel/shell is running
+static int current_pid = -1; // -1 means kernel/shell is running
static int next_pid = 1;
+// Spinlock protecting process table access
+static DEFINE_SPINLOCK(proc_table_lock);
+
// Current process pointer - used by IRQ handler for preemption
// NULL means kernel is running (no process to save to)
process_t *current_process = NULL;
// Kernel context - saved when switching from kernel to a process
// This allows us to return to kernel (e.g., desktop running via process_exec)
-// Global (not static) so vectors.S can access it for kernel->process IRQ switches
+// Global (not static) so vectors.S can access it for kernel->process IRQ
+// switches
cpu_context_t kernel_context;
// Program load address - grows upward as we load programs
@@ -62,602 +68,630 @@ static void process_entry_wrapper(void);
static void kill_children(int parent_pid);
void process_init(void) {
- // Clear process table
- for (int i = 0; i < MAX_PROCESSES; i++) {
- proc_table[i].state = PROC_STATE_FREE;
- proc_table[i].pid = 0;
- // Also clear context to prevent garbage
- memset(&proc_table[i].context, 0, sizeof(cpu_context_t));
- }
- current_pid = -1;
- current_process = NULL;
- next_pid = 1;
-
- // Programs load right after the heap
- program_base = ALIGN_64K(PROGRAM_LOAD_BASE);
- next_load_addr = program_base;
-
- printf("[PROC] Process subsystem initialized (max %d processes)\n", MAX_PROCESSES);
- printf("[PROC] Program load area: 0x%lx+\n", program_base);
- printf("[PROC] kernel_context at: 0x%lx\n", (uint64_t)&kernel_context);
+ // Clear process table
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ proc_table[i].state = PROC_STATE_FREE;
+ proc_table[i].pid = 0;
+ // Also clear context to prevent garbage
+ memset(&proc_table[i].context, 0, sizeof(cpu_context_t));
+ }
+ current_pid = -1;
+ current_process = NULL;
+ next_pid = 1;
+
+ // Programs load right after the heap
+ program_base = ALIGN_64K(PROGRAM_LOAD_BASE);
+ next_load_addr = program_base;
+
+ printf("[PROC] Process subsystem initialized (max %d processes)\n",
+ MAX_PROCESSES);
+ printf("[PROC] Program load area: 0x%lx+\n", program_base);
+ printf("[PROC] kernel_context at: 0x%lx\n", (uint64_t)&kernel_context);
}
-// Find a free slot in the process table
-static int find_free_slot(void) {
- for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].state == PROC_STATE_FREE) {
- return i;
- }
+// Find a free slot in the process table (caller must hold proc_table_lock)
+static int find_free_slot_unlocked(void) {
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ if (proc_table[i].state == PROC_STATE_FREE) {
+ return i;
}
- return -1;
+ }
+ return -1;
}
process_t *process_current(void) {
- if (current_pid < 0) return NULL;
- return &proc_table[current_pid];
+ if (current_pid < 0)
+ return NULL;
+ return &proc_table[current_pid];
}
process_t *process_get(int pid) {
- for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].pid == pid && proc_table[i].state != PROC_STATE_FREE) {
- return &proc_table[i];
- }
- }
- return NULL;
+ uint64_t flags = spin_lock_irqsave(&proc_table_lock);
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ if (proc_table[i].pid == pid && proc_table[i].state != PROC_STATE_FREE) {
+ spin_unlock_irqrestore(&proc_table_lock, flags);
+ return &proc_table[i];
+ }
+ }
+ spin_unlock_irqrestore(&proc_table_lock, flags);
+ return NULL;
}
// Get pointer to current_process pointer (for assembly IRQ handler)
-process_t **process_get_current_ptr(void) {
- return ¤t_process;
-}
+process_t **process_get_current_ptr(void) { return ¤t_process; }
int process_count_ready(void) {
- int count = 0;
- for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].state == PROC_STATE_READY ||
- proc_table[i].state == PROC_STATE_RUNNING) {
- count++;
- }
- }
- return count;
+ uint64_t flags = spin_lock_irqsave(&proc_table_lock);
+ int count = 0;
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ if (proc_table[i].state == PROC_STATE_READY ||
+ proc_table[i].state == PROC_STATE_RUNNING) {
+ count++;
+ }
+ }
+ spin_unlock_irqrestore(&proc_table_lock, flags);
+ return count;
}
int process_get_info(int index, char *name, int name_size, int *state) {
- if (index < 0 || index >= MAX_PROCESSES) return 0;
- process_t *p = &proc_table[index];
- if (p->state == PROC_STATE_FREE) return 0;
-
- // Copy name
- if (name && name_size > 0) {
- int len = strlen(p->name);
- if (len >= name_size) len = name_size - 1;
- for (int i = 0; i < len; i++) name[i] = p->name[i];
- name[len] = '\0';
- }
-
- // Return state
- if (state) *state = (int)p->state;
-
- return p->pid; /* Return actual PID instead of just 1 */
-}
+ if (index < 0 || index >= MAX_PROCESSES)
+ return 0;
+ process_t *p = &proc_table[index];
+ if (p->state == PROC_STATE_FREE)
+ return 0;
-/* Get all processes as an array (for process manager) */
-int process_list(int *pids, char names[][PROCESS_NAME_MAX], int *states, int max_count) {
- int count = 0;
- for (int i = 0; i < MAX_PROCESSES && count < max_count; i++) {
- if (proc_table[i].state != PROC_STATE_FREE) {
- if (pids) pids[count] = proc_table[i].pid;
- if (names) {
- int len = strlen(proc_table[i].name);
- if (len >= PROCESS_NAME_MAX) len = PROCESS_NAME_MAX - 1;
- for (int j = 0; j < len; j++) names[count][j] = proc_table[i].name[j];
- names[count][len] = '\0';
- }
- if (states) states[count] = (int)proc_table[i].state;
- count++;
- }
- }
- return count;
+ // Copy name
+ if (name && name_size > 0) {
+ int len = strlen(p->name);
+ if (len >= name_size)
+ len = name_size - 1;
+ for (int i = 0; i < len; i++)
+ name[i] = p->name[i];
+ name[len] = '\0';
+ }
+
+ // Return state
+ if (state)
+ *state = (int)p->state;
+
+ return 1;
}
// Create a new process (load the binary but don't start it)
int process_create(const char *path, int argc, char **argv) {
- (void)argc;
- (void)argv;
-
- // Find free slot
- int slot = find_free_slot();
- if (slot < 0) {
- printf("[PROC] No free process slots\n");
- return -1;
- }
-
- // Look up file
- vfs_node_t *file = vfs_lookup(path);
- if (!file) {
- printf("[PROC] File not found: %s\n", path);
- return -1;
- }
-
- if (vfs_is_dir(file)) {
- printf("[PROC] Cannot exec directory: %s\n", path);
- return -1;
- }
-
- size_t size = file->size;
- if (size == 0) {
- printf("[PROC] File is empty: %s\n", path);
- return -1;
- }
+ (void)argc;
+ (void)argv;
+
+ // Find free slot (with locking)
+ uint64_t flags = spin_lock_irqsave(&proc_table_lock);
+ int slot = find_free_slot_unlocked();
+ if (slot < 0) {
+ spin_unlock_irqrestore(&proc_table_lock, flags);
+ printf("[PROC] No free process slots\n");
+ return -1;
+ }
+ // Reserve the slot immediately
+ proc_table[slot].state = PROC_STATE_READY;
+ proc_table[slot].pid = next_pid++;
+ spin_unlock_irqrestore(&proc_table_lock, flags);
+
+ // Look up file
+ vfs_node_t *file = vfs_lookup(path);
+ if (!file) {
+ printf("[PROC] File not found: %s\n", path);
+ return -1;
+ }
- // Read the ELF file
- char *data = malloc(size);
- if (!data) {
- printf("[PROC] Out of memory reading %s\n", path);
- return -1;
- }
+ if (vfs_is_dir(file)) {
+ printf("[PROC] Cannot exec directory: %s\n", path);
+ return -1;
+ }
- int bytes = vfs_read(file, data, size, 0);
- if (bytes != (int)size) {
- printf("[PROC] Failed to read %s\n", path);
- free(data);
- return -1;
- }
+ size_t size = file->size;
+ if (size == 0) {
+ printf("[PROC] File is empty: %s\n", path);
+ return -1;
+ }
- // Calculate how much memory the program needs
- uint64_t prog_size = elf_calc_size(data, size);
- if (prog_size == 0) {
- int err = elf_validate(data, size);
- printf("[PROC] Invalid ELF: %s (err=%d, size=%d)\n", path, err, (int)size);
- uint8_t *b = (uint8_t*)data;
- printf("[PROC] Header: %02x %02x %02x %02x %02x %02x %02x %02x\n",
- b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
- free(data);
- return -1;
- }
+ // Read the ELF file
+ char *data = malloc(size);
+ if (!data) {
+ printf("[PROC] Out of memory reading %s\n", path);
+ return -1;
+ }
- // Align load address
- uint64_t load_addr = ALIGN_64K(next_load_addr);
+ int bytes = vfs_read(file, data, size, 0);
+ if (bytes != (int)size) {
+ printf("[PROC] Failed to read %s\n", path);
+ free(data);
+ return -1;
+ }
+
+ // Calculate how much memory the program needs
+ uint64_t prog_size = elf_calc_size(data, size);
+ if (prog_size == 0) {
+ int err = elf_validate(data, size);
+ printf("[PROC] Invalid ELF: %s (err=%d, size=%d)\n", path, err, (int)size);
+ uint8_t *b = (uint8_t *)data;
+ printf("[PROC] Header: %02x %02x %02x %02x %02x %02x %02x %02x\n", b[0],
+ b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
+ free(data);
+ return -1;
+ }
- // Load the ELF at this address
- elf_load_info_t info;
- if (elf_load_at(data, size, load_addr, &info) != 0) {
- printf("[PROC] Failed to load ELF: %s\n", path);
- free(data);
- return -1;
- }
+ // Align load address with ASLR randomization
+ uint64_t aslr_offset = aslr_exec_offset();
+ uint64_t load_addr = ALIGN_64K(next_load_addr + aslr_offset);
+ // Load the ELF at this address
+ elf_load_info_t info;
+ if (elf_load_at(data, size, load_addr, &info) != 0) {
+ printf("[PROC] Failed to load ELF: %s\n", path);
free(data);
+ return -1;
+ }
+
+ free(data);
+
+ // Update next load address for future programs
+ next_load_addr = ALIGN_64K(load_addr + info.load_size + 0x10000);
+
+ // Set up process structure
+ process_t *proc = &proc_table[slot];
+ proc->pid = next_pid++;
+ strncpy(proc->name, path, PROCESS_NAME_MAX - 1);
+ proc->name[PROCESS_NAME_MAX - 1] = '\0';
+ proc->state = PROC_STATE_READY;
+ proc->load_base = info.load_base;
+ proc->load_size = info.load_size;
+ proc->entry = info.entry;
+ proc->parent_pid = current_pid;
+ proc->exit_status = 0;
+
+ // Allocate stack
+ proc->stack_size = PROCESS_STACK_SIZE;
+ proc->stack_base = malloc(proc->stack_size);
+ if (!proc->stack_base) {
+ printf("[PROC] Failed to allocate stack\n");
+ proc->state = PROC_STATE_FREE;
+ return -1;
+ }
- // Update next load address for future programs
- next_load_addr = ALIGN_64K(load_addr + info.load_size + 0x10000);
-
- // Set up process structure
- process_t *proc = &proc_table[slot];
- proc->pid = next_pid++;
- strncpy(proc->name, path, PROCESS_NAME_MAX - 1);
- proc->name[PROCESS_NAME_MAX - 1] = '\0';
- proc->state = PROC_STATE_READY;
- proc->load_base = info.load_base;
- proc->load_size = info.load_size;
- proc->entry = info.entry;
- proc->parent_pid = current_pid;
- proc->exit_status = 0;
-
- // Allocate stack
- proc->stack_size = PROCESS_STACK_SIZE;
- proc->stack_base = malloc(proc->stack_size);
- if (!proc->stack_base) {
- printf("[PROC] Failed to allocate stack\n");
- proc->state = PROC_STATE_FREE;
- return -1;
- }
+ // Initialize context
+ // Stack grows down, SP starts at top (aligned to 16 bytes)
+ uint64_t stack_top =
+ ((uint64_t)proc->stack_base + proc->stack_size) & ~0xFULL;
- // Initialize context
- // Stack grows down, SP starts at top (aligned to 16 bytes)
- uint64_t stack_top = ((uint64_t)proc->stack_base + proc->stack_size) & ~0xFULL;
+ // Set up initial context for preemptive scheduling
+ // pc = entry wrapper, parameters in callee-saved registers x19-x22
+ memset(&proc->context, 0, sizeof(cpu_context_t));
+ arch_context_set_sp(&proc->context, stack_top);
+ arch_context_set_pc(&proc->context,
+ (uint64_t)process_entry_wrapper); // Start here
- // Set up initial context for preemptive scheduling
- // pc = entry wrapper, parameters in callee-saved registers x19-x22
- memset(&proc->context, 0, sizeof(cpu_context_t));
- arch_context_set_sp(&proc->context, stack_top);
- arch_context_set_pc(&proc->context, (uint64_t)process_entry_wrapper); // Start here
-
#ifdef ARCH_ARM64
- arch_context_set_flags(&proc->context, 0x3c5); // EL1h, DAIF masked (IRQs disabled initially)
- // Pass arguments via callee-saved registers
- proc->context.x[19] = proc->entry; // x19 = entry point
- proc->context.x[20] = (uint64_t)kapi_get(); // x20 = kapi pointer
- proc->context.x[21] = (uint64_t)argc; // x21 = argc
- proc->context.x[22] = (uint64_t)argv; // x22 = argv
+ arch_context_set_flags(&proc->context,
+ 0x3c5); // EL1h, DAIF masked (IRQs disabled initially)
+ // Pass arguments via callee-saved registers
+ proc->context.x[19] = proc->entry; // x19 = entry point
+ proc->context.x[20] = (uint64_t)kapi_get(); // x20 = kapi pointer
+ proc->context.x[21] = (uint64_t)argc; // x21 = argc
+ proc->context.x[22] = (uint64_t)argv; // x22 = argv
#elif defined(ARCH_X86_64)
- arch_context_set_flags(&proc->context, 0x202); // IF (interrupts enabled)
- // Pass arguments via callee-saved registers (similar to ARM64)
- proc->context.r12 = proc->entry; // r12 = entry point
- proc->context.r13 = (uint64_t)kapi_get(); // r13 = kapi pointer
- proc->context.r14 = (uint64_t)argc; // r14 = argc
- proc->context.r15 = (uint64_t)argv; // r15 = argv
+ arch_context_set_flags(&proc->context, 0x202); // IF (interrupts enabled)
+ // Pass arguments via callee-saved registers (similar to ARM64)
+ proc->context.r12 = proc->entry; // r12 = entry point
+ proc->context.r13 = (uint64_t)kapi_get(); // r13 = kapi pointer
+ proc->context.r14 = (uint64_t)argc; // r14 = argc
+ proc->context.r15 = (uint64_t)argv; // r15 = argv
#elif defined(ARCH_X86)
- arch_context_set_flags(&proc->context, 0x202); // IF (interrupts enabled)
- // x86 32-bit: pass via stack or registers (TBD)
+ arch_context_set_flags(&proc->context, 0x202); // IF (interrupts enabled)
+ // x86 32-bit: pass via stack or registers (TBD)
#endif
- // printf("[PROC] Created process '%s' pid=%d at 0x%lx-0x%lx (slot %d)\n",
- // proc->name, proc->pid, proc->load_base, proc->load_base + proc->load_size, slot);
- // printf("[PROC] Stack at 0x%lx-0x%lx\n",
- // (uint64_t)proc->stack_base, (uint64_t)proc->stack_base + proc->stack_size);
+ // printf("[PROC] Created process '%s' pid=%d at 0x%lx-0x%lx (slot %d)\n",
+ // proc->name, proc->pid, proc->load_base, proc->load_base +
+ // proc->load_size, slot);
+ // printf("[PROC] Stack at 0x%lx-0x%lx\n",
+ // (uint64_t)proc->stack_base, (uint64_t)proc->stack_base +
+ // proc->stack_size);
- return proc->pid;
+ return proc->pid;
}
// Entry wrapper - called when a new process is switched to for the first time
// Architecture-specific implementation
#ifdef ARCH_ARM64
-// Parameters passed in callee-saved registers x19-x22 (preserved across context switch)
-// x19 = entry, x20 = kapi, x21 = argc, x22 = argv
+// Parameters passed in callee-saved registers x19-x22 (preserved across context
+// switch) x19 = entry, x20 = kapi, x21 = argc, x22 = argv
static void __attribute__((naked)) process_entry_wrapper(void) {
- asm volatile(
- "mov x0, x20\n" // x0 = kapi
- "mov x1, x21\n" // x1 = argc
- "mov x2, x22\n" // x2 = argv
- "blr x19\n" // Call entry(kapi, argc, argv)
- "bl process_exit\n" // Exit with return value
- "1: b 1b\n" // Should never reach here
- ::: "memory"
- );
+ asm volatile("mov x0, x20\n" // x0 = kapi
+ "mov x1, x21\n" // x1 = argc
+ "mov x2, x22\n" // x2 = argv
+ "blr x19\n" // Call entry(kapi, argc, argv)
+ "bl process_exit\n" // Exit with return value
+ "1: b 1b\n" // Should never reach here
+ ::
+ : "memory");
}
#elif defined(ARCH_X86_64)
// Parameters passed in callee-saved registers r12-r15
// r12 = entry, r13 = kapi, r14 = argc, r15 = argv
static void __attribute__((naked)) process_entry_wrapper(void) {
- asm volatile(
- "movq %%r13, %%rdi\n" // rdi = kapi (1st arg)
- "movq %%r14, %%rsi\n" // rsi = argc (2nd arg)
- "movq %%r15, %%rdx\n" // rdx = argv (3rd arg)
- "callq *%%r12\n" // Call entry(kapi, argc, argv)
- "movq %%rax, %%rdi\n" // rdi = exit status
- "callq process_exit\n" // Exit
- "1: jmp 1b\n" // Should never reach here
- ::: "memory"
- );
+ asm volatile("movq %%r13, %%rdi\n" // rdi = kapi (1st arg)
+ "movq %%r14, %%rsi\n" // rsi = argc (2nd arg)
+ "movq %%r15, %%rdx\n" // rdx = argv (3rd arg)
+ "callq *%%r12\n" // Call entry(kapi, argc, argv)
+ "movq %%rax, %%rdi\n" // rdi = exit status
+ "callq process_exit\n" // Exit
+ "1: jmp 1b\n" // Should never reach here
+ ::
+ : "memory");
}
#elif defined(ARCH_X86)
// x86 32-bit implementation (TBD)
static void process_entry_wrapper(void) {
- // TODO: Implement for x86
- process_exit(0);
+ // TODO: Implement for x86
+ process_exit(0);
}
#endif
// Start a process (make it runnable)
int process_start(int pid) {
- process_t *proc = process_get(pid);
- if (!proc) return -1;
+ process_t *proc = process_get(pid);
+ if (!proc)
+ return -1;
- if (proc->state != PROC_STATE_READY) {
- printf("[PROC] Process %d not ready (state=%d)\n", pid, proc->state);
- return -1;
- }
+ if (proc->state != PROC_STATE_READY) {
+ printf("[PROC] Process %d not ready (state=%d)\n", pid, proc->state);
+ return -1;
+ }
- printf("[PROC] Started '%s' pid=%d\n", proc->name, pid);
- return 0; // Already ready, scheduler will pick it up
+ printf("[PROC] Started '%s' pid=%d\n", proc->name, pid);
+ return 0; // Already ready, scheduler will pick it up
}
// Exit current process
void process_exit(int status) {
- // Disable IRQs during exit to prevent race with preemption
- arch_irq_disable();
-
- if (current_pid < 0) {
- printf("[PROC] Exit called with no current process!\n");
- arch_irq_enable();
- return;
- }
-
- int slot = current_pid;
- process_t *proc = &proc_table[slot];
- printf("[PROC] Process '%s' (pid %d) exited with status %d\n",
- proc->name, proc->pid, status);
-
- // Kill all children of this process before exiting
- kill_children(proc->pid);
-
- proc->exit_status = status;
- proc->state = PROC_STATE_ZOMBIE;
-
- // Free stack - but we're still on it! Don't free yet.
- // The stack will be freed when the slot is reused.
-
- // Mark slot as free (simple cleanup for now)
- proc->state = PROC_STATE_FREE;
-
- // We're done with this process - switch back to kernel context
- // This MUST not return - we context switch away
- current_pid = -1;
- current_process = NULL;
-
- // Debug: verify kernel_context before switching
- printf("[PROC] Switching to kernel_context: pc=0x%llx sp=0x%llx\n",
- (unsigned long long)arch_context_get_pc(&kernel_context),
- (unsigned long long)arch_context_get_sp(&kernel_context));
-
- // Sanity check kernel_context
- // Note: kernel code is in flash at 0x0, stack is near 0x5f000000
- if (arch_context_get_pc(&kernel_context) == 0 || arch_context_get_sp(&kernel_context) == 0) {
- printf("[PROC] ERROR: kernel_context appears corrupted!\n");
- printf("[PROC] This indicates memory corruption during process execution\n");
- while(1); // Hang instead of crashing
- }
-
- // Switch directly back to kernel context
- // This will resume in process_exec_args() or process_schedule()
- // wherever the kernel was waiting
- // IRQs will be re-enabled when kernel re-enables them
- switch_context(&proc->context, &kernel_context);
-
- // Should never reach here
- printf("[PROC] ERROR: process_exit returned!\n");
- while(1);
+ // Disable IRQs during exit to prevent race with preemption
+ arch_irq_disable();
+
+ if (current_pid < 0) {
+ printf("[PROC] Exit called with no current process!\n");
+ arch_irq_enable();
+ return;
+ }
+
+ int slot = current_pid;
+ process_t *proc = &proc_table[slot];
+ printf("[PROC] Process '%s' (pid %d) exited with status %d\n", proc->name,
+ proc->pid, status);
+
+ // Kill all children of this process before exiting
+ kill_children(proc->pid);
+
+ proc->exit_status = status;
+ proc->state = PROC_STATE_ZOMBIE;
+
+ // Free stack - but we're still on it! Don't free yet.
+ // The stack will be freed when the slot is reused.
+
+ // Mark slot as free (simple cleanup for now)
+ proc->state = PROC_STATE_FREE;
+
+ // We're done with this process - switch back to kernel context
+ // This MUST not return - we context switch away
+ current_pid = -1;
+ current_process = NULL;
+
+ // Debug: verify kernel_context before switching
+ printf("[PROC] Switching to kernel_context: pc=0x%llx sp=0x%llx\n",
+ (unsigned long long)arch_context_get_pc(&kernel_context),
+ (unsigned long long)arch_context_get_sp(&kernel_context));
+
+ // Sanity check kernel_context
+ // Note: kernel code is in flash at 0x0, stack is near 0x5f000000
+ if (arch_context_get_pc(&kernel_context) == 0 ||
+ arch_context_get_sp(&kernel_context) == 0) {
+ printf("[PROC] ERROR: kernel_context appears corrupted!\n");
+ printf(
+ "[PROC] This indicates memory corruption during process execution\n");
+ while (1)
+ ; // Hang instead of crashing
+ }
+
+ // Switch directly back to kernel context
+ // This will resume in process_exec_args() or process_schedule()
+ // wherever the kernel was waiting
+ // IRQs will be re-enabled when kernel re-enables them
+ switch_context(&proc->context, &kernel_context);
+
+ // Should never reach here
+ printf("[PROC] ERROR: process_exit returned!\n");
+ while (1)
+ ;
}
// Yield - voluntarily give up CPU
void process_yield(void) {
- if (current_pid >= 0) {
- // Mark current process as ready
- process_t *proc = &proc_table[current_pid];
- proc->state = PROC_STATE_READY;
- }
- // Always try to schedule - even from kernel context
- // This lets programs started via process_exec() yield to spawned children
- process_schedule();
+ if (current_pid >= 0) {
+ // Mark current process as ready
+ process_t *proc = &proc_table[current_pid];
+ proc->state = PROC_STATE_READY;
+ }
+ // Always try to schedule - even from kernel context
+ // This lets programs started via process_exec() yield to spawned children
+ process_schedule();
}
// Simple round-robin scheduler (for voluntary transitions like process_exec)
void process_schedule(void) {
- // Disable IRQs during scheduling to prevent race with preemption
- arch_irq_disable();
-
- int old_pid = current_pid;
- process_t *old_proc = (old_pid >= 0) ? &proc_table[old_pid] : NULL;
-
- // Find next runnable process (round-robin)
- int start = (old_pid >= 0) ? old_pid + 1 : 0;
- int next = -1;
-
- for (int i = 0; i < MAX_PROCESSES; i++) {
- int idx = (start + i) % MAX_PROCESSES;
- if (proc_table[idx].state == PROC_STATE_READY) {
- next = idx;
- break;
- }
- }
-
- if (next < 0) {
- // No runnable processes
- if (old_pid >= 0 && old_proc->state == PROC_STATE_RUNNING) {
- // Current process still running, keep it
- arch_irq_enable();
- return;
- }
- // Return to kernel (if we were in a process, switch back to kernel)
- if (old_pid >= 0) {
- current_pid = -1;
- current_process = NULL;
- switch_context(&old_proc->context, &kernel_context);
- // When we return here, IRQs will be re-enabled below
- }
- // Already in kernel with nothing to run - sleep until next interrupt
- arch_irq_enable();
- arch_idle();
- return;
- }
-
- if (next == old_pid && old_proc && old_proc->state == PROC_STATE_RUNNING) {
- // Same process and it's running - nothing to switch
- arch_irq_enable();
- return;
- }
-
- if (next == old_pid && old_proc && old_proc->state == PROC_STATE_READY) {
- // Process yielded but it's the only one - sleep until interrupt
- old_proc->state = PROC_STATE_RUNNING;
- arch_irq_enable();
- arch_idle();
- return;
- }
-
- // Switch to new process
- process_t *new_proc = &proc_table[next];
-
- if (old_proc && old_proc->state == PROC_STATE_RUNNING) {
- old_proc->state = PROC_STATE_READY;
- }
-
- new_proc->state = PROC_STATE_RUNNING;
- current_pid = next;
- current_process = new_proc;
-
- // Context switch!
- // If old_pid == -1, we're switching FROM kernel context
- // IRQs stay disabled - new process will enable them (entry_wrapper or return path)
- cpu_context_t *old_ctx = (old_pid >= 0) ? &old_proc->context : &kernel_context;
-
- // Debug: if switching from kernel, verify kernel_context after we return
- int was_kernel = (old_pid < 0);
-
- switch_context(old_ctx, &new_proc->context);
-
- // We return here when someone switches back to us
- // Verify kernel_context wasn't corrupted during process execution
- if (was_kernel) {
- if (arch_context_get_pc(&kernel_context) < 0x40000000 || arch_context_get_sp(&kernel_context) < 0x40000000) {
- printf("[PROC] WARNING: kernel_context corrupted after process ran!\n");
- printf("[PROC] pc=0x%llx sp=0x%llx\n",
- (unsigned long long)arch_context_get_pc(&kernel_context),
- (unsigned long long)arch_context_get_sp(&kernel_context));
- }
- }
-
- arch_irq_enable(); // Re-enable IRQs
+ // Disable IRQs during scheduling to prevent race with preemption
+ arch_irq_disable();
+
+ int old_pid = current_pid;
+ process_t *old_proc = (old_pid >= 0) ? &proc_table[old_pid] : NULL;
+
+ // Find next runnable process (round-robin)
+ int start = (old_pid >= 0) ? old_pid + 1 : 0;
+ int next = -1;
+
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ int idx = (start + i) % MAX_PROCESSES;
+ if (proc_table[idx].state == PROC_STATE_READY) {
+ next = idx;
+ break;
+ }
+ }
+
+ if (next < 0) {
+ // No runnable processes
+ if (old_pid >= 0 && old_proc->state == PROC_STATE_RUNNING) {
+ // Current process still running, keep it
+ arch_irq_enable();
+ return;
+ }
+ // Return to kernel (if we were in a process, switch back to kernel)
+ if (old_pid >= 0) {
+ current_pid = -1;
+ current_process = NULL;
+ switch_context(&old_proc->context, &kernel_context);
+ // When we return here, IRQs will be re-enabled below
+ }
+ // Already in kernel with nothing to run - sleep until next interrupt
+ arch_irq_enable();
+ arch_idle();
+ return;
+ }
+
+ if (next == old_pid && old_proc && old_proc->state == PROC_STATE_RUNNING) {
+ // Same process and it's running - nothing to switch
+ arch_irq_enable();
+ return;
+ }
+
+ if (next == old_pid && old_proc && old_proc->state == PROC_STATE_READY) {
+ // Process yielded but it's the only one - sleep until interrupt
+ old_proc->state = PROC_STATE_RUNNING;
+ arch_irq_enable();
+ arch_idle();
+ return;
+ }
+
+ // Switch to new process
+ process_t *new_proc = &proc_table[next];
+
+ if (old_proc && old_proc->state == PROC_STATE_RUNNING) {
+ old_proc->state = PROC_STATE_READY;
+ }
+
+ new_proc->state = PROC_STATE_RUNNING;
+ current_pid = next;
+ current_process = new_proc;
+
+ // Context switch!
+ // If old_pid == -1, we're switching FROM kernel context
+ // IRQs stay disabled - new process will enable them (entry_wrapper or return
+ // path)
+ cpu_context_t *old_ctx =
+ (old_pid >= 0) ? &old_proc->context : &kernel_context;
+
+ // Debug: if switching from kernel, verify kernel_context after we return
+ int was_kernel = (old_pid < 0);
+
+ switch_context(old_ctx, &new_proc->context);
+
+ // We return here when someone switches back to us
+ // Verify kernel_context wasn't corrupted during process execution
+ if (was_kernel) {
+ if (arch_context_get_pc(&kernel_context) < 0x40000000 ||
+ arch_context_get_sp(&kernel_context) < 0x40000000) {
+ printf("[PROC] WARNING: kernel_context corrupted after process ran!\n");
+ printf("[PROC] pc=0x%llx sp=0x%llx\n",
+ (unsigned long long)arch_context_get_pc(&kernel_context),
+ (unsigned long long)arch_context_get_sp(&kernel_context));
+ }
+ }
+
+ arch_irq_enable(); // Re-enable IRQs
}
// Execute and wait - creates a real process and waits for it to finish
int process_exec_args(const char *path, int argc, char **argv) {
- // Create the process
- int pid = process_create(path, argc, argv);
- if (pid < 0) {
- return pid; // Error already printed
- }
-
- // Start it
- process_start(pid);
-
- // Find the slot for this process
- int slot = -1;
- for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].pid == pid) {
- slot = i;
- break;
- }
- }
-
- if (slot < 0) {
- printf("[PROC] exec: process disappeared?\n");
- return -1;
- }
+ // Create the process
+ int pid = process_create(path, argc, argv);
+ if (pid < 0) {
+ return pid; // Error already printed
+ }
+
+ // Start it
+ process_start(pid);
+
+ // Find the slot for this process
+ int slot = -1;
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ if (proc_table[i].pid == pid) {
+ slot = i;
+ break;
+ }
+ }
+
+ if (slot < 0) {
+ printf("[PROC] exec: process disappeared?\n");
+ return -1;
+ }
- // Wait for it to finish by yielding until it's done
- // The process is READY, we need to run the scheduler to let it execute
- while (proc_table[slot].state != PROC_STATE_FREE &&
- proc_table[slot].state != PROC_STATE_ZOMBIE) {
- process_schedule();
- }
+ // Wait for it to finish by yielding until it's done
+ // The process is READY, we need to run the scheduler to let it execute
+ while (proc_table[slot].state != PROC_STATE_FREE &&
+ proc_table[slot].state != PROC_STATE_ZOMBIE) {
+ process_schedule();
+ }
- int result = proc_table[slot].exit_status;
- printf("[PROC] Process '%s' (pid %d) finished with status %d\n", path, pid, result);
- return result;
+ int result = proc_table[slot].exit_status;
+ printf("[PROC] Process '%s' (pid %d) finished with status %d\n", path, pid,
+ result);
+ return result;
}
int process_exec(const char *path) {
- char *argv[1] = { (char *)path };
- return process_exec_args(path, 1, argv);
+ char *argv[1] = {(char *)path};
+ return process_exec_args(path, 1, argv);
}
// Called from IRQ handler for preemptive scheduling
// Just updates current_process - IRQ handler does the actual context switch
void process_schedule_from_irq(void) {
- // Check how many processes are ready to run
- int ready_count = process_count_ready();
+ // Check how many processes are ready to run
+ int ready_count = process_count_ready();
+
+ // If kernel is running (current_pid == -1), we should switch to ANY ready
+ // process If a process is running, we only switch if there's another ready
+ // process
+ if (current_pid >= 0 && ready_count <= 1) {
+ return; // Only one process, no point switching
+ }
+ if (current_pid < 0 && ready_count == 0) {
+ return; // Kernel running, no processes to switch to
+ }
+
+ // Find next runnable process (round-robin)
+ int old_slot = current_pid;
+ int start = (old_slot >= 0) ? old_slot + 1 : 0;
+
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ int idx = (start + i) % MAX_PROCESSES;
+ if (proc_table[idx].state == PROC_STATE_READY) {
+ // Found a different process to switch to
+ if (idx != old_slot) {
+ // Safety check: verify process has valid context
+ process_t *new_proc = &proc_table[idx];
+ if (arch_context_get_sp(&new_proc->context) == 0 ||
+ arch_context_get_pc(&new_proc->context) == 0) {
+ continue; // Skip invalid process
+ }
- // If kernel is running (current_pid == -1), we should switch to ANY ready process
- // If a process is running, we only switch if there's another ready process
- if (current_pid >= 0 && ready_count <= 1) {
- return; // Only one process, no point switching
- }
- if (current_pid < 0 && ready_count == 0) {
- return; // Kernel running, no processes to switch to
- }
+ // Mark old process as ready (it was running)
+ if (old_slot >= 0 && proc_table[old_slot].state == PROC_STATE_RUNNING) {
+ proc_table[old_slot].state = PROC_STATE_READY;
+ }
- // Find next runnable process (round-robin)
- int old_slot = current_pid;
- int start = (old_slot >= 0) ? old_slot + 1 : 0;
+ // Switch to new process
+ proc_table[idx].state = PROC_STATE_RUNNING;
+ current_pid = idx;
+ current_process = new_proc;
- for (int i = 0; i < MAX_PROCESSES; i++) {
- int idx = (start + i) % MAX_PROCESSES;
- if (proc_table[idx].state == PROC_STATE_READY) {
- // Found a different process to switch to
- if (idx != old_slot) {
- // Safety check: verify process has valid context
- process_t *new_proc = &proc_table[idx];
- if (arch_context_get_sp(&new_proc->context) == 0 || arch_context_get_pc(&new_proc->context) == 0) {
- continue; // Skip invalid process
- }
-
- // Mark old process as ready (it was running)
- if (old_slot >= 0 && proc_table[old_slot].state == PROC_STATE_RUNNING) {
- proc_table[old_slot].state = PROC_STATE_READY;
- }
-
- // Switch to new process
- proc_table[idx].state = PROC_STATE_RUNNING;
- current_pid = idx;
- current_process = new_proc;
-
- // Memory barrier to ensure current_process is visible to IRQ handler
- arch_dsb();
- }
- return;
- }
+ // Memory barrier to ensure current_process is visible to IRQ handler
+ arch_dsb();
+ }
+ return;
}
+ }
}
-// Kill all children of a process (recursive)
+// Kill all children of a process (iterative to prevent stack overflow)
static void kill_children(int parent_pid) {
+ // Use a work stack to avoid recursion - max depth is MAX_PROCESSES
+ int work_stack[MAX_PROCESSES];
+ int stack_top = 0;
+
+ // Push initial parent
+ work_stack[stack_top++] = parent_pid;
+
+ while (stack_top > 0) {
+ int current_parent = work_stack[--stack_top];
+
+ // Find and process all children of current_parent
for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].state != PROC_STATE_FREE &&
- proc_table[i].parent_pid == parent_pid) {
- int child_pid = proc_table[i].pid;
- // First kill grandchildren recursively
- kill_children(child_pid);
- // Then kill this child (skip if it's current process)
- if (i != current_pid) {
- printf("[PROC] Killing child '%s' (pid %d, parent %d)\n",
- proc_table[i].name, child_pid, parent_pid);
- if (proc_table[i].stack_base) {
- free(proc_table[i].stack_base);
- proc_table[i].stack_base = NULL;
- }
- proc_table[i].state = PROC_STATE_FREE;
- proc_table[i].pid = 0;
- }
+ if (proc_table[i].state != PROC_STATE_FREE &&
+ proc_table[i].parent_pid == current_parent) {
+ int child_pid = proc_table[i].pid;
+
+ // Push child to stack so its children get processed too
+ if (stack_top < MAX_PROCESSES) {
+ work_stack[stack_top++] = child_pid;
+ }
+
+ // Kill this child (skip if it's current process)
+ if (i != current_pid) {
+ printf("[PROC] Killing child '%s' (pid %d, parent %d)\n",
+ proc_table[i].name, child_pid, current_parent);
+ if (proc_table[i].stack_base) {
+ free(proc_table[i].stack_base);
+ proc_table[i].stack_base = NULL;
+ }
+ proc_table[i].state = PROC_STATE_FREE;
+ proc_table[i].pid = 0;
}
+ }
}
+ }
}
// Kill a process by PID
int process_kill(int pid) {
- // Don't allow killing kernel (pid would be invalid anyway)
- if (pid <= 0) {
- printf("[PROC] Cannot kill pid %d\n", pid);
- return -1;
- }
+ // Don't allow killing kernel (pid would be invalid anyway)
+ if (pid <= 0) {
+ printf("[PROC] Cannot kill pid %d\n", pid);
+ return -1;
+ }
- // Find the process
- int slot = -1;
- for (int i = 0; i < MAX_PROCESSES; i++) {
- if (proc_table[i].pid == pid && proc_table[i].state != PROC_STATE_FREE) {
- slot = i;
- break;
- }
+ // Find the process
+ int slot = -1;
+ for (int i = 0; i < MAX_PROCESSES; i++) {
+ if (proc_table[i].pid == pid && proc_table[i].state != PROC_STATE_FREE) {
+ slot = i;
+ break;
}
+ }
- if (slot < 0) {
- printf("[PROC] Process %d not found\n", pid);
- return -1;
- }
+ if (slot < 0) {
+ printf("[PROC] Process %d not found\n", pid);
+ return -1;
+ }
- process_t *proc = &proc_table[slot];
+ process_t *proc = &proc_table[slot];
- // Don't allow killing the current process this way - use exit() instead
- if (slot == current_pid) {
- printf("[PROC] Cannot kill current process (use exit)\n");
- return -1;
- }
+ // Don't allow killing the current process this way - use exit() instead
+ if (slot == current_pid) {
+ printf("[PROC] Cannot kill current process (use exit)\n");
+ return -1;
+ }
- printf("[PROC] Killing process '%s' (pid %d)\n", proc->name, pid);
+ printf("[PROC] Killing process '%s' (pid %d)\n", proc->name, pid);
- // First kill all children of this process
- kill_children(pid);
+ // First kill all children of this process
+ kill_children(pid);
- // Free the process memory
- if (proc->stack_base) {
- free(proc->stack_base);
- proc->stack_base = NULL;
- }
+ // Free the process memory
+ if (proc->stack_base) {
+ free(proc->stack_base);
+ proc->stack_base = NULL;
+ }
- // Mark slot as free
- proc->state = PROC_STATE_FREE;
- proc->pid = 0;
+ // Mark slot as free
+ proc->state = PROC_STATE_FREE;
+ proc->pid = 0;
- return 0;
+ return 0;
}
diff --git a/kernel/drivers/audio/intel_hda.c b/kernel/drivers/audio/intel_hda.c
index f76e718..bc6b071 100644
--- a/kernel/drivers/audio/intel_hda.c
+++ b/kernel/drivers/audio/intel_hda.c
@@ -2,11 +2,11 @@
* Vib-OS - Intel HDA Audio Driver Implementation
*/
-#include "types.h"
-#include "printk.h"
#include "drivers/intel_hda.h"
#include "drivers/pci.h"
#include "mm/kmalloc.h"
+#include "printk.h"
+#include "types.h"
/* Helper prototypes */
void *memset(void *s, int c, size_t n);
@@ -22,508 +22,547 @@ static uint8_t hda_stream_tag = 1;
static uint32_t stream_base = 0;
/* Reg Access Helpers */
-static uint32_t hda_read32(uint32_t offset) {
- return hda_regs[offset / 4];
-}
+static uint32_t hda_read32(uint32_t offset) { return hda_regs[offset / 4]; }
static void hda_write32(uint32_t offset, uint32_t val) {
- hda_regs[offset / 4] = val;
+ hda_regs[offset / 4] = val;
}
static uint16_t hda_read16(uint32_t offset) {
- volatile uint16_t *regs16 = (volatile uint16_t *)hda_regs;
- return regs16[offset / 2];
+ volatile uint16_t *regs16 = (volatile uint16_t *)hda_regs;
+ return regs16[offset / 2];
}
static void hda_write16(uint32_t offset, uint16_t val) {
- volatile uint16_t *regs16 = (volatile uint16_t *)hda_regs;
- regs16[offset / 2] = val;
+ volatile uint16_t *regs16 = (volatile uint16_t *)hda_regs;
+ regs16[offset / 2] = val;
}
static uint8_t hda_read8(uint32_t offset) {
- volatile uint8_t *regs8 = (volatile uint8_t *)hda_regs;
- return regs8[offset];
+ volatile uint8_t *regs8 = (volatile uint8_t *)hda_regs;
+ return regs8[offset];
}
static void hda_write8(uint32_t offset, uint8_t val) {
- volatile uint8_t *regs8 = (volatile uint8_t *)hda_regs;
- regs8[offset] = val;
+ volatile uint8_t *regs8 = (volatile uint8_t *)hda_regs;
+ regs8[offset] = val;
}
-static uint16_t hda_build_format(uint32_t sample_rate, uint8_t channels, uint8_t bits_per_sample)
-{
- /* HDA SDnFMT:
- * [14] base rate (1 = 44.1k, 0 = 48k)
- * [13:11] multiplier (mult - 1)
- * [10:8] divider (div - 1)
- * [7:4] channels - 1
- * [3:0] bits per sample code (0=8,1=16,2=20,3=24,4=32)
- */
- struct rate_map {
- uint32_t rate;
- uint8_t base_44;
- uint8_t mult;
- uint8_t div;
- };
- static const struct rate_map rates[] = {
- { 8000, 0, 1, 6 },
- { 11025, 1, 1, 4 },
- { 16000, 0, 1, 3 },
- { 22050, 1, 1, 2 },
- { 32000, 0, 1, 2 },
- { 44100, 1, 1, 1 },
- { 48000, 0, 1, 1 },
- { 88200, 1, 2, 1 },
- { 96000, 0, 2, 1 },
- { 176400, 1, 4, 1 },
- { 192000, 0, 4, 1 }
- };
- uint8_t base_44 = 0;
- uint8_t mult = 1;
- uint8_t div = 1;
- for (size_t i = 0; i < sizeof(rates) / sizeof(rates[0]); i++) {
- if (rates[i].rate == sample_rate) {
- base_44 = rates[i].base_44;
- mult = rates[i].mult;
- div = rates[i].div;
- break;
- }
+static uint16_t hda_build_format(uint32_t sample_rate, uint8_t channels,
+ uint8_t bits_per_sample) {
+ /* HDA SDnFMT:
+ * [14] base rate (1 = 44.1k, 0 = 48k)
+ * [13:11] multiplier (mult - 1)
+ * [10:8] divider (div - 1)
+ * [7:4] channels - 1
+ * [3:0] bits per sample code (0=8,1=16,2=20,3=24,4=32)
+ */
+ struct rate_map {
+ uint32_t rate;
+ uint8_t base_44;
+ uint8_t mult;
+ uint8_t div;
+ };
+ static const struct rate_map rates[] = {
+ {8000, 0, 1, 6}, {11025, 1, 1, 4}, {16000, 0, 1, 3}, {22050, 1, 1, 2},
+ {32000, 0, 1, 2}, {44100, 1, 1, 1}, {48000, 0, 1, 1}, {88200, 1, 2, 1},
+ {96000, 0, 2, 1}, {176400, 1, 4, 1}, {192000, 0, 4, 1}};
+ uint8_t base_44 = 0;
+ uint8_t mult = 1;
+ uint8_t div = 1;
+ for (size_t i = 0; i < sizeof(rates) / sizeof(rates[0]); i++) {
+ if (rates[i].rate == sample_rate) {
+ base_44 = rates[i].base_44;
+ mult = rates[i].mult;
+ div = rates[i].div;
+ break;
}
+ }
- uint8_t bits_code = 1; /* Default 16-bit */
- switch (bits_per_sample) {
- case 8: bits_code = 0; break;
- case 16: bits_code = 1; break;
- case 20: bits_code = 2; break;
- case 24: bits_code = 3; break;
- case 32: bits_code = 4; break;
- default: bits_code = 1; break;
- }
+ uint8_t bits_code = 1; /* Default 16-bit */
+ switch (bits_per_sample) {
+ case 8:
+ bits_code = 0;
+ break;
+ case 16:
+ bits_code = 1;
+ break;
+ case 20:
+ bits_code = 2;
+ break;
+ case 24:
+ bits_code = 3;
+ break;
+ case 32:
+ bits_code = 4;
+ break;
+ default:
+ bits_code = 1;
+ break;
+ }
- if (channels == 0) channels = 1;
- if (channels > 16) channels = 16;
+ if (channels == 0)
+ channels = 1;
+ if (channels > 16)
+ channels = 16;
- uint16_t fmt = 0;
- fmt |= (base_44 ? (1 << 14) : 0);
- fmt |= ((uint16_t)(mult - 1) & 0x7) << 11;
- fmt |= ((uint16_t)(div - 1) & 0x7) << 8;
- fmt |= ((uint16_t)(channels - 1) & 0xF) << 4;
- fmt |= (uint16_t)(bits_code & 0xF);
- return fmt;
+ uint16_t fmt = 0;
+ fmt |= (base_44 ? (1 << 14) : 0);
+ fmt |= ((uint16_t)(mult - 1) & 0x7) << 11;
+ fmt |= ((uint16_t)(div - 1) & 0x7) << 8;
+ fmt |= ((uint16_t)(channels - 1) & 0xF) << 4;
+ fmt |= (uint16_t)(bits_code & 0xF);
+ return fmt;
}
void intel_hda_init(pci_device_t *pci_dev) {
- printk("HDA: Initializing...\n");
-
- /* Map BAR0 (Using identity map for now) */
- hda_regs = (volatile uint32_t *)pci_dev->bar0;
-
- if (!hda_regs) {
- printk("HDA: Error - BAR0 is 0\n");
- return;
- }
+ printk("HDA: Initializing...\n");
+
+ /* Map BAR0 (Using identity map for now) */
+ hda_regs = (volatile uint32_t *)pci_dev->bar0;
+
+ if (!hda_regs) {
+ printk("HDA: Error - BAR0 is 0\n");
+ return;
+ }
+
+ /* Enable Bus Master and Memory Space in PCI Command Register */
+ uint32_t cmd =
+ pci_read32(pci_dev->bus, pci_dev->slot, pci_dev->func, PCI_COMMAND);
+ pci_write32(pci_dev->bus, pci_dev->slot, pci_dev->func, PCI_COMMAND,
+ cmd | PCI_CMD_BUS_MASTER | PCI_CMD_MEM);
+ printk("HDA: Enabled Bus Master/Mem (Cmd: %x)\n",
+ cmd | PCI_CMD_BUS_MASTER | PCI_CMD_MEM);
+
+ /* 1. Reset Controller */
+ printk("HDA: Resetting controller...\n");
+ uint32_t gctl = hda_read32(HDA_GCTL);
+ hda_write32(HDA_GCTL, gctl & ~1); /* Clear CRST */
+
+ /* Wait for bit to clear */
+ int timeout = 10000;
+ while ((hda_read32(HDA_GCTL) & 1) && timeout-- > 0)
+ ;
+ if (timeout <= 0)
+ printk("HDA: Reset timeout (clear)!\n");
+
+ hda_write32(HDA_GCTL, gctl | 1); /* Set CRST */
+ /* Wait for bit to set */
+ timeout = 10000;
+ while (!(hda_read32(HDA_GCTL) & 1) && timeout-- > 0)
+ ;
+ if (timeout <= 0)
+ printk("HDA: Reset timeout (set)!\n");
+
+ /* Wait for codecs to report state */
+ /* In QEMU, this should happen quickly */
+ timeout = 10000;
+ while (!(hda_read16(HDA_STATESTS)) && timeout-- > 0)
+ ;
+ uint16_t statests = hda_read16(HDA_STATESTS);
+ printk("HDA: Reset complete. STATESTS=0x%04x\n", statests);
+
+ /* 2. Allocate CORB/RIRB */
+ /* CORB: 256 entries * 4 bytes = 1024 bytes */
+ /* RIRB: 256 entries * 8 bytes = 2048 bytes */
+ /* Implementations must support 256 entries.
+ Note: Alignment requirements - 128 bytes */
+
+ /* 2. Allocate CORB/RIRB with 128-byte alignment */
+ /* CORB: 1024 bytes. RIRB: 2048 bytes. */
+
+ void *raw_corb = kmalloc(1024 + 128);
+ corb_buffer = (uint32_t *)(((uint64_t)raw_corb + 127) & ~127ULL);
+
+ void *raw_rirb = kmalloc(2048 + 128);
+ rirb_buffer = (uint64_t *)(((uint64_t)raw_rirb + 127) & ~127ULL);
+
+ /* Zero buffers */
+ memset(corb_buffer, 0, 1024);
+ memset(rirb_buffer, 0, 2048);
+
+ /* Set Base Addresses (Assuming 32-bit pointers for now) */
+ hda_write32(HDA_CORBLBASE, (uint32_t)(uint64_t)corb_buffer);
+ hda_write32(HDA_CORBUBASE, (uint32_t)((uint64_t)corb_buffer >> 32));
+
+ hda_write32(HDA_RIRBLBASE, (uint32_t)(uint64_t)rirb_buffer);
+ hda_write32(HDA_RIRBUBASE, (uint32_t)((uint64_t)rirb_buffer >> 32));
+
+ /* Reset WP */
+ hda_write16(HDA_CORBWP, 0);
+ hda_write16(HDA_RIRBWP, 0x8000); /* Reset RIRB WP (bit 15 is reset) */
+
+ /* Set Size: 256 entries (Encoded as 0x02) */
+ hda_write8(HDA_CORBSIZE, 0x02);
+ hda_write8(HDA_RIRBSIZE, 0x02);
+
+ /* Enable CORB/RIRB */
+ hda_write8(HDA_CORBCTL, 0x02); /* Run */
+ hda_write8(HDA_RIRBCTL, 0x02 | 0x01); /* Run + Interrupt */
+
+ printk("HDA: CORB/RIRB initialized. Checking functionality...\n");
+
+ /* 3. Discover Streams */
+ uint16_t gcap = hda_read16(HDA_GCAP);
+ uint8_t iss = (gcap >> 8) & 0xF; /* Input Streams */
+ uint8_t oss = (gcap >> 12) & 0xF; /* Output Streams */
+ uint8_t bss = (gcap >> 3) & 0x1F; /* Bidirectional Streams */
+
+ printk("HDA: Capabilities: ISS=%d, OSS=%d, BSS=%d\n", iss, oss, bss);
- /* Enable Bus Master and Memory Space in PCI Command Register */
- uint32_t cmd = pci_read32(pci_dev->bus, pci_dev->slot, pci_dev->func, PCI_COMMAND);
- pci_write32(pci_dev->bus, pci_dev->slot, pci_dev->func, PCI_COMMAND, cmd | PCI_CMD_BUS_MASTER | PCI_CMD_MEM);
- printk("HDA: Enabled Bus Master/Mem (Cmd: %x)\n", cmd | PCI_CMD_BUS_MASTER | PCI_CMD_MEM);
-
- /* 1. Reset Controller */
- printk("HDA: Resetting controller...\n");
- uint32_t gctl = hda_read32(HDA_GCTL);
- hda_write32(HDA_GCTL, gctl & ~1); /* Clear CRST */
-
- /* Wait for bit to clear */
- int timeout = 10000;
- while((hda_read32(HDA_GCTL) & 1) && timeout-- > 0);
- if (timeout <= 0) printk("HDA: Reset timeout (clear)!\n");
-
- hda_write32(HDA_GCTL, gctl | 1); /* Set CRST */
- /* Wait for bit to set */
- timeout = 10000;
- while(!(hda_read32(HDA_GCTL) & 1) && timeout-- > 0);
- if (timeout <= 0) printk("HDA: Reset timeout (set)!\n");
-
- /* Wait for codecs to report state */
- /* In QEMU, this should happen quickly */
- timeout = 10000;
- while(!(hda_read16(HDA_STATESTS)) && timeout-- > 0);
- uint16_t statests = hda_read16(HDA_STATESTS);
- printk("HDA: Reset complete. STATESTS=0x%04x\n", statests);
-
- /* 2. Allocate CORB/RIRB */
- /* CORB: 256 entries * 4 bytes = 1024 bytes */
- /* RIRB: 256 entries * 8 bytes = 2048 bytes */
- /* Implementations must support 256 entries.
- Note: Alignment requirements - 128 bytes */
-
- /* 2. Allocate CORB/RIRB with 128-byte alignment */
- /* CORB: 1024 bytes. RIRB: 2048 bytes. */
-
- void *raw_corb = kmalloc(1024 + 128);
- corb_buffer = (uint32_t *)(((uint64_t)raw_corb + 127) & ~127ULL);
-
- void *raw_rirb = kmalloc(2048 + 128);
- rirb_buffer = (uint64_t *)(((uint64_t)raw_rirb + 127) & ~127ULL);
-
- /* Zero buffers */
- memset(corb_buffer, 0, 1024);
- memset(rirb_buffer, 0, 2048);
-
- /* Set Base Addresses (Assuming 32-bit pointers for now) */
- hda_write32(HDA_CORBLBASE, (uint32_t)(uint64_t)corb_buffer);
- hda_write32(HDA_CORBUBASE, (uint32_t)((uint64_t)corb_buffer >> 32));
-
- hda_write32(HDA_RIRBLBASE, (uint32_t)(uint64_t)rirb_buffer);
- hda_write32(HDA_RIRBUBASE, (uint32_t)((uint64_t)rirb_buffer >> 32));
-
- /* Reset WP */
- hda_write16(HDA_CORBWP, 0);
- hda_write16(HDA_RIRBWP, 0x8000); /* Reset RIRB WP (bit 15 is reset) */
-
- /* Set Size: 256 entries (Encoded as 0x02) */
- hda_write8(HDA_CORBSIZE, 0x02);
- hda_write8(HDA_RIRBSIZE, 0x02);
-
- /* Enable CORB/RIRB */
- hda_write8(HDA_CORBCTL, 0x02); /* Run */
- hda_write8(HDA_RIRBCTL, 0x02 | 0x01); /* Run + Interrupt */
-
- printk("HDA: CORB/RIRB initialized. Checking functionality...\n");
-
- /* 3. Discover Streams */
- uint16_t gcap = hda_read16(HDA_GCAP);
- uint8_t iss = (gcap >> 8) & 0xF; /* Input Streams */
- uint8_t oss = (gcap >> 12) & 0xF; /* Output Streams */
- uint8_t bss = (gcap >> 3) & 0x1F; /* Bidirectional Streams */
-
- printk("HDA: Capabilities: ISS=%d, OSS=%d, BSS=%d\n", iss, oss, bss);
-
- /* Calculate Output Stream Offset */
- /* Registers start at 0x80. Input streams are first. */
- /* Stride is 0x20 bytes */
- uint32_t output_stream_offset = 0x80 + (iss * 0x20);
- printk("HDA: Output Stream 0 offset: 0x%x\n", output_stream_offset);
- stream_base = output_stream_offset;
-
- /* 4. Configure Codec (QEMU HDA-Duplex usually at Address 0) */
- /* We need to send verbs via CORB and check RIRB.
- Check CORBRP.
- To send:
- 1. Write Verb to CORB[WritePtr + 1]
- 2. WritePtr++
- 3. Write WritePtr to CORBWP reg
-
- Verb Format:
- CAd (4) | NodeID (8) | Payload (20)
- Payload = VerbID (12) | Param (8) - or similar depending on size
-
- Common Verbs:
- F00: Get Parameter
- 705: Set Pin Control
- 3A0: Set Amp Gain/Mute
-
- QEMU Defaults:
- Node 0 (Root) -> 1 (FG) -> 2 (DAC) -> 4 (Pin Complex / Line Out)
- */
-
- /* Simple sync verb sender helper (inline for now) */
- #define HDA_VERB(cad, nid, vid, payload) \
- ((uint32_t)(cad) << 28 | (uint32_t)(nid) << 20 | (uint32_t)(vid) << 8 | (payload))
-
- printk("HDA: Configuring Codec...\n");
-
- /* Variables for manual verb construction */
- uint16_t wp;
-
- /* 1. Reset Node 0 (Root) - often not needed */
-
- /* 2. Audio Function Group (Node 1) - Power State D0 */
- /* Verb 705: Set Power State. Payload 0 = D0 */
- /* HDA_VERB(0, 1, 0x705, 0x00) */
- wp = hda_read16(HDA_CORBWP) & 0xFF; wp++;
- corb_buffer[wp] = 0x00170500;
- hda_write16(HDA_CORBWP, wp);
-
- /* 3. Audio Output / DAC (Node 2) */
- /* Set Power D0 */
- wp++; corb_buffer[wp] = 0x00270500;
- /* Set Amp Gain/Mute (Verb 3) - Set Output Left/Right, Unmute, Gain 0 */
- /* 0x3 (Set Amp) | 0xB0 (Output, Left/Right, Unmute) | 0x7F (Max Gain) */
- /* Payload = 0xB07F for Verb 3A0? -> 0x3A0 B07F? No, usually 0x3 + payload.
- Standard Verb 3: Set Amp Gain.
- Vid=3. Payload=rrr.
- Wait, let's use 4-bit verb syntax?
- Nibble 3 = 0x3. Payload 16 bits?
- Cmd = 0x0023B07F
- */
- wp++; corb_buffer[wp] = 0x0023B07F; /* DAC Unmute, Max Gain */
-
- /* Also set format for DAC to match? Default usually works. */
- /* Set Converter Stream/Channel (Verb 706) */
- /* Stream 1, Channel 0 -> Payload 0x10 */
- /* Note: We used Stream Descriptor 0... wait.
- SD0 maps to Stream ID 1?
- Usually default map is straightforward.
- /* 3. Output Converter (Node 2) */
- /* Set Stream Tag to 1, Channel 0. Verb 706. Payload 0x10 */
- wp++; corb_buffer[wp] = 0x00270610;
-
- /* Unmute Output Amp (Left/Right) - Set Gain to Max (0x7F) */
- /* Verb 3A0 (Set Amp Gain). Payload: Index 0 (out), Left(0x80)|Right(0x40)=0, Gain=0x7F */
- /* Actually: 0x3 (Set Amp), Index 0, B07F = Set Left/Right Output Amp to 0 (Unmute) + 0x7F (Max Gain) */
- /* HDA Spec: 3 = Set Amp Gain/Mute. Payload:
- Bit 15: Set Output (1) / Input (0)
- Bit 14: Set Input (1) / Output (0) ... wait.
- Payload for Set Amp Gain (0x3):
- 15: Set Left
- 14: Set Right
- 13: Set Input/Output (1=Input, 0=Output) - Wait, for Output Amp it is 0?
- 12: Set Mute (1=Mute, 0=Unmute)
- 0-6: Gain
-
- Let's use 0x002 3 A0 7F -> 0x0023B07F
- But we want Unmute (Bit 7 of payload in 'Set Amp' verb which is 0x3 from invalid verbs list?)
-
- Better Verb: 0x705 (Power)
- Let's use the standard "Set Amp Gain/Mute" verb: 0x3
- Node 2:
- Payoad: 0xB07F
- B = 1011. 1 (Set Left), 0 (Set Right - NO), 1 (Input/Output?), 1 (Mute?)
-
- Let's stick to simplest:
- Verb 0x706: Stream 1.
-
- CORRECT VERB for Widget Control: 0x707 (Pin Widget Control).
- For DAC (Node 2), we just need Format and Stream.
- */
-
- /* 4. Pin Complex (Node 4 - Line Out) */
- /* Power D0 */
- wp++; corb_buffer[wp] = 0x00470500;
-
- /* Pin Control: Out Enable (0x40) + Headphone (0x80) => 0xC0 */
- wp++; corb_buffer[wp] = 0x004707C0;
-
- /* Unmute Pin Widget Amp (Output) just in case */
- wp++; corb_buffer[wp] = 0x0043B07F; /* Set Amp Gain: Out, Left/Right, Unmute, Max */
-
- /* EAPD Enable (External Amp) */
- wp++; corb_buffer[wp] = 0x00470C02;
-
- /* Flush CORB Buffer to RAM before notifying hardware */
- {
- uint64_t start = (uint64_t)corb_buffer;
- uint64_t end = start + 256 * 4; /* Max CORB size usually 256 entries */
- uint64_t cache_line_size = 64;
- start = start & ~(cache_line_size - 1);
- while (start < end) {
+ /* Calculate Output Stream Offset */
+ /* Registers start at 0x80. Input streams are first. */
+ /* Stride is 0x20 bytes */
+ uint32_t output_stream_offset = 0x80 + (iss * 0x20);
+ printk("HDA: Output Stream 0 offset: 0x%x\n", output_stream_offset);
+ stream_base = output_stream_offset;
+
+/* 4. Configure Codec (QEMU HDA-Duplex usually at Address 0) */
+/* We need to send verbs via CORB and check RIRB.
+ Check CORBRP.
+ To send:
+ 1. Write Verb to CORB[WritePtr + 1]
+ 2. WritePtr++
+ 3. Write WritePtr to CORBWP reg
+
+ Verb Format:
+ CAd (4) | NodeID (8) | Payload (20)
+ Payload = VerbID (12) | Param (8) - or similar depending on size
+
+ Common Verbs:
+ F00: Get Parameter
+ 705: Set Pin Control
+ 3A0: Set Amp Gain/Mute
+
+ QEMU Defaults:
+ Node 0 (Root) -> 1 (FG) -> 2 (DAC) -> 4 (Pin Complex / Line Out)
+*/
+
+/* Simple sync verb sender helper (inline for now) */
+#define HDA_VERB(cad, nid, vid, payload) \
+ ((uint32_t)(cad) << 28 | (uint32_t)(nid) << 20 | (uint32_t)(vid) << 8 | \
+ (payload))
+
+ printk("HDA: Configuring Codec...\n");
+
+ /* Variables for manual verb construction */
+ uint16_t wp;
+
+ /* 1. Reset Node 0 (Root) - often not needed */
+
+ /* 2. Audio Function Group (Node 1) - Power State D0 */
+ /* Verb 705: Set Power State. Payload 0 = D0 */
+ /* HDA_VERB(0, 1, 0x705, 0x00) */
+ wp = hda_read16(HDA_CORBWP) & 0xFF;
+ wp++;
+ corb_buffer[wp] = 0x00170500;
+ hda_write16(HDA_CORBWP, wp);
+
+ /* 3. Audio Output / DAC (Node 2) */
+ /* Set Power D0 */
+ wp++;
+ corb_buffer[wp] = 0x00270500;
+ /* Set Amp Gain/Mute (Verb 3) - Set Output Left/Right, Unmute, Gain 0 */
+ /* 0x3 (Set Amp) | 0xB0 (Output, Left/Right, Unmute) | 0x7F (Max Gain) */
+ /* Payload = 0xB07F for Verb 3A0? -> 0x3A0 B07F? No, usually 0x3 + payload.
+ Standard Verb 3: Set Amp Gain.
+ Vid=3. Payload=rrr.
+ Wait, let's use 4-bit verb syntax?
+ Nibble 3 = 0x3. Payload 16 bits?
+ Cmd = 0x0023B07F
+ */
+ wp++;
+ corb_buffer[wp] = 0x0023B07F; /* DAC Unmute, Max Gain */
+
+ /* Also set format for DAC to match? Default usually works. */
+ /* Set Converter Stream/Channel (Verb 706) */
+ /* Stream 1, Channel 0 -> Payload 0x10 */
+ /* Note: We used Stream Descriptor 0... wait.
+ SD0 maps to Stream ID 1?
+ Usually default map is straightforward.
+ /* 3. Output Converter (Node 2) */
+ /* Set Stream Tag to 1, Channel 0. Verb 706. Payload 0x10 */
+ wp++;
+ corb_buffer[wp] = 0x00270610;
+
+ /* Unmute Output Amp (Left/Right) - Set Gain to Max (0x7F) */
+ /* Verb 3A0 (Set Amp Gain). Payload: Index 0 (out), Left(0x80)|Right(0x40)=0,
+ * Gain=0x7F */
+ /* Actually: 0x3 (Set Amp), Index 0, B07F = Set Left/Right Output Amp to 0
+ * (Unmute) + 0x7F (Max Gain) */
+ /* HDA Spec: 3 = Set Amp Gain/Mute. Payload:
+ Bit 15: Set Output (1) / Input (0)
+ Bit 14: Set Input (1) / Output (0) ... wait.
+ Payload for Set Amp Gain (0x3):
+ 15: Set Left
+ 14: Set Right
+ 13: Set Input/Output (1=Input, 0=Output) - Wait, for Output Amp it is 0?
+ 12: Set Mute (1=Mute, 0=Unmute)
+ 0-6: Gain
+
+ Let's use 0x002 3 A0 7F -> 0x0023B07F
+ But we want Unmute (Bit 7 of payload in 'Set Amp' verb which is 0x3 from
+ invalid verbs list?)
+
+ Better Verb: 0x705 (Power)
+ Let's use the standard "Set Amp Gain/Mute" verb: 0x3
+ Node 2:
+ Payoad: 0xB07F
+ B = 1011. 1 (Set Left), 0 (Set Right - NO), 1 (Input/Output?), 1 (Mute?)
+
+ Let's stick to simplest:
+ Verb 0x706: Stream 1.
+
+ CORRECT VERB for Widget Control: 0x707 (Pin Widget Control).
+ For DAC (Node 2), we just need Format and Stream.
+ */
+
+ /* 4. Pin Complex (Node 4 - Line Out) */
+ /* Power D0 */
+ wp++;
+ corb_buffer[wp] = 0x00470500;
+
+ /* Pin Control: Out Enable (0x40) + Headphone (0x80) => 0xC0 */
+ wp++;
+ corb_buffer[wp] = 0x004707C0;
+
+ /* Unmute Pin Widget Amp (Output) just in case */
+ wp++;
+ corb_buffer[wp] = 0x0043B07F; /* Set Amp Gain: Out, Left/Right, Unmute, Max */
+
+ /* EAPD Enable (External Amp) */
+ wp++;
+ corb_buffer[wp] = 0x00470C02;
+
+ /* Flush CORB Buffer to RAM before notifying hardware */
+ {
+ uint64_t start = (uint64_t)corb_buffer;
+ uint64_t end = start + 256 * 4; /* Max CORB size usually 256 entries */
+ uint64_t cache_line_size = 64;
+ start = start & ~(cache_line_size - 1);
+ while (start < end) {
#ifdef ARCH_ARM64
- asm volatile("dc civac, %0" :: "r" (start));
+ asm volatile("dc civac, %0" ::"r"(start));
#elif defined(ARCH_X86_64) || defined(ARCH_X86)
- asm volatile("clflush (%0)" :: "r"(start) : "memory");
+ asm volatile("clflush (%0)" ::"r"(start) : "memory");
#endif
- start += cache_line_size;
- }
+ start += cache_line_size;
+ }
#ifdef ARCH_ARM64
- asm volatile("dsb sy");
+ asm volatile("dsb sy");
#elif defined(ARCH_X86_64) || defined(ARCH_X86)
- asm volatile("mfence" ::: "memory");
+ asm volatile("mfence" ::: "memory");
#endif
- }
-
- hda_write16(HDA_CORBWP, wp);
-
- printk("HDA: Codec Configured (Node 2 Stream=1, Node 4 Out).\n");
-
- /* Test Tone: Square Wave (48kHz, 16-bit, Stereo) */
- uint32_t test_samples = 48000 / 2; /* 0.5 sec */
- int16_t *test_buf = (int16_t *)kmalloc(test_samples * 2 * 2);
- for(uint32_t i=0; i max_size) {
- size = max_size;
- samples = size / (channels * 2);
+int intel_hda_play_pcm(const void *data, uint32_t samples, uint8_t channels,
+ uint32_t sample_rate) {
+ if (!hda_regs)
+ return -1;
+
+ /* Initialize ring buffer on first use */
+ if (hda_init_ring_buffer() != 0)
+ return -1;
+
+ /* Calculate size in bytes (16-bit = 2 bytes) */
+ uint32_t size = samples * channels * 2;
+
+ /* Limit to available ring buffer space */
+ uint32_t max_size = HDA_RING_BUFFER_SIZE / 2; /* Don't fill more than half */
+ if (size > max_size) {
+ size = max_size;
+ samples = size / (channels * 2);
+ }
+
+ uint32_t ctl_offset = stream_base + HDA_SD_CTL;
+
+ /* If not already playing, initialize stream */
+ if (!audio_playing) {
+ /* 1. Reset Stream properly */
+ hda_write32(ctl_offset, 0);
+ for (int timeout = 0; timeout < 1000; timeout++) {
+ if (!(hda_read32(ctl_offset) & HDA_SD_CTL_RUN))
+ break;
}
-
- uint32_t ctl_offset = stream_base + HDA_SD_CTL;
-
- /* If not already playing, initialize stream */
- if (!audio_playing) {
- /* 1. Reset Stream properly */
- hda_write32(ctl_offset, 0);
- for(int timeout=0; timeout<1000; timeout++) {
- if (!(hda_read32(ctl_offset) & HDA_SD_CTL_RUN)) break;
- }
-
- /* Set SRST (Bit 0) and Wait */
- hda_write32(ctl_offset, 1);
- for(int timeout=0; timeout<1000; timeout++) {
- if (hda_read32(ctl_offset) & 1) break;
- }
-
- /* Clear SRST and Wait */
- hda_write32(ctl_offset, 0);
- for(int timeout=0; timeout<1000; timeout++) {
- if (!(hda_read32(ctl_offset) & 1)) break;
- }
-
- ring_write_pos = 0;
+
+ /* Set SRST (Bit 0) and Wait */
+ hda_write32(ctl_offset, 1);
+ for (int timeout = 0; timeout < 1000; timeout++) {
+ if (hda_read32(ctl_offset) & 1)
+ break;
}
-
- /* Copy data to ring buffer */
- memcpy(dma_buffer + ring_write_pos, data, size);
- ring_write_pos = (ring_write_pos + size) % HDA_RING_BUFFER_SIZE;
-
- /* Flush data cache for DMA coherency */
- hda_flush_cache(dma_buffer, HDA_RING_BUFFER_SIZE);
- hda_flush_cache(bdl, HDA_RING_NUM_ENTRIES * sizeof(hda_bdl_entry_t));
-
- if (!audio_playing) {
- /* Enable Global Interrupts (GIE) */
- hda_write32(HDA_INTCTL, 0x80000000 | 0x40000000);
-
- /* Program Stream Registers with ring buffer */
- hda_write32(stream_base + HDA_SD_BDLPL, (uint32_t)(uint64_t)bdl);
- hda_write32(stream_base + HDA_SD_BDLPU, (uint32_t)((uint64_t)bdl >> 32));
- hda_write32(stream_base + HDA_SD_CBL, HDA_RING_BUFFER_SIZE);
- hda_write16(stream_base + HDA_SD_LVI, (uint16_t)(HDA_RING_NUM_ENTRIES - 1));
-
- /* Set Format: sample rate/channels */
- uint16_t fmt = hda_build_format(sample_rate, channels, 16);
- hda_write16(stream_base + HDA_SD_FMT, fmt);
-
- /* Codec Format Setup */
- hda_write32(HDA_ICOI, 0x00220000 | fmt);
- hda_write16(HDA_ICIS, 0x1);
- for(int i=0; i<1000; i++) if(!(hda_read16(HDA_ICIS) & 1)) break;
-
- /* Start Stream */
- hda_write32(HDA_SSYNC, 0);
- hda_write8(stream_base + HDA_SD_STS, 0x1C);
-
- /* Enable RUN with stream tag */
- hda_write32(ctl_offset, HDA_SD_CTL_RUN | HDA_SD_CTL_IOCE | ((uint32_t)hda_stream_tag << 20));
-
- audio_playing = 1;
- printk("HDA: Audio stream started (ring buffer mode)\n");
+
+ /* Clear SRST and Wait */
+ hda_write32(ctl_offset, 0);
+ for (int timeout = 0; timeout < 1000; timeout++) {
+ if (!(hda_read32(ctl_offset) & 1))
+ break;
}
-
- /* Calculate playback time based on sample rate */
- uint32_t playback_ms = (samples * 1000) / sample_rate;
-
- /* Non-blocking wait: short delay to allow DMA to start, then return */
- /* For truly async audio, we'd use interrupts. For now, brief wait. */
- for(volatile int w = 0; w < (int)(playback_ms * 10000); w++);
-
- return samples;
+
+ ring_write_pos = 0;
+ }
+
+ /* Copy data to ring buffer with proper wrap-around handling */
+ uint32_t space_to_end = HDA_RING_BUFFER_SIZE - ring_write_pos;
+ if (size <= space_to_end) {
+ /* Fits without wrap */
+ memcpy(dma_buffer + ring_write_pos, data, size);
+ } else {
+ /* Needs to wrap around */
+ memcpy(dma_buffer + ring_write_pos, data, space_to_end);
+ memcpy(dma_buffer, (const uint8_t *)data + space_to_end,
+ size - space_to_end);
+ }
+ ring_write_pos = (ring_write_pos + size) % HDA_RING_BUFFER_SIZE;
+
+ /* Flush data cache for DMA coherency */
+ hda_flush_cache(dma_buffer, HDA_RING_BUFFER_SIZE);
+ hda_flush_cache(bdl, HDA_RING_NUM_ENTRIES * sizeof(hda_bdl_entry_t));
+
+ if (!audio_playing) {
+ /* Enable Global Interrupts (GIE) */
+ hda_write32(HDA_INTCTL, 0x80000000 | 0x40000000);
+
+ /* Program Stream Registers with ring buffer */
+ hda_write32(stream_base + HDA_SD_BDLPL, (uint32_t)(uint64_t)bdl);
+ hda_write32(stream_base + HDA_SD_BDLPU, (uint32_t)((uint64_t)bdl >> 32));
+ hda_write32(stream_base + HDA_SD_CBL, HDA_RING_BUFFER_SIZE);
+ hda_write16(stream_base + HDA_SD_LVI, (uint16_t)(HDA_RING_NUM_ENTRIES - 1));
+
+ /* Set Format: sample rate/channels */
+ uint16_t fmt = hda_build_format(sample_rate, channels, 16);
+ hda_write16(stream_base + HDA_SD_FMT, fmt);
+
+ /* Codec Format Setup */
+ hda_write32(HDA_ICOI, 0x00220000 | fmt);
+ hda_write16(HDA_ICIS, 0x1);
+ for (int i = 0; i < 1000; i++)
+ if (!(hda_read16(HDA_ICIS) & 1))
+ break;
+
+ /* Start Stream */
+ hda_write32(HDA_SSYNC, 0);
+ hda_write8(stream_base + HDA_SD_STS, 0x1C);
+
+ /* Enable RUN with stream tag */
+ hda_write32(ctl_offset, HDA_SD_CTL_RUN | HDA_SD_CTL_IOCE |
+ ((uint32_t)hda_stream_tag << 20));
+
+ audio_playing = 1;
+ printk("HDA: Audio stream started (ring buffer mode)\n");
+ }
+
+ /* Calculate playback time based on sample rate */
+ uint32_t playback_ms = (samples * 1000) / sample_rate;
+
+ /* Non-blocking wait: short delay to allow DMA to start, then return */
+ /* For truly async audio, we'd use interrupts. For now, brief wait. */
+ for (volatile int w = 0; w < (int)(playback_ms * 10000); w++)
+ ;
+
+ return samples;
}
/* Stop audio playback */
-void intel_hda_stop(void)
-{
- if (!hda_regs || !audio_playing) return;
-
- uint32_t ctl_offset = stream_base + HDA_SD_CTL;
- hda_write32(ctl_offset, 0);
- audio_playing = 0;
- ring_write_pos = 0;
- ring_play_pos = 0;
-
- printk("HDA: Audio stream stopped\n");
+void intel_hda_stop(void) {
+ if (!hda_regs || !audio_playing)
+ return;
+
+ uint32_t ctl_offset = stream_base + HDA_SD_CTL;
+ hda_write32(ctl_offset, 0);
+ audio_playing = 0;
+ ring_write_pos = 0;
+ ring_play_pos = 0;
+
+ printk("HDA: Audio stream stopped\n");
}
/* Check if audio is currently playing */
-int intel_hda_is_playing(void)
-{
- return audio_playing;
-}
+int intel_hda_is_playing(void) { return audio_playing; }
diff --git a/kernel/drivers/pci/pci.c b/kernel/drivers/pci/pci.c
index 5b2c6be..dd1b5a9 100644
--- a/kernel/drivers/pci/pci.c
+++ b/kernel/drivers/pci/pci.c
@@ -1,108 +1,162 @@
/*
* Vib-OS - PCI Driver Implementation
- *
- * Scans ECAM to find devices.
+ *
+ * Scans ECAM to find devices. Supports virtio-gpu and Intel HDA.
*/
-#include "types.h"
-#include "printk.h"
#include "drivers/pci.h"
#include "drivers/intel_hda.h"
+#include "printk.h"
+#include "types.h"
+
+/* Device list */
+static pci_device_t device_pool[16];
+static int device_count = 0;
+static pci_device_t *device_list = NULL;
+
+/* MMIO allocation for unassigned BARs */
+static uint64_t next_mmio_base = 0x10000000;
/* Helper to calculate ECAM address */
/* Bus 8 bits, Device 5 bits, Function 3 bits, Offset 12 bits */
-static volatile uint32_t *pci_ecam_addr(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset) {
- uint64_t addr = PCI_ECAM_BASE |
- ((uint64_t)bus << 20) |
- ((uint64_t)slot << 15) |
- ((uint64_t)func << 12) |
- (offset & 0xFFF);
- return (volatile uint32_t *)addr;
+static volatile uint32_t *pci_ecam_addr(uint8_t bus, uint8_t slot, uint8_t func,
+ uint8_t offset) {
+ uint64_t addr = PCI_ECAM_BASE | ((uint64_t)bus << 20) |
+ ((uint64_t)slot << 15) | ((uint64_t)func << 12) |
+ (offset & 0xFFF);
+ return (volatile uint32_t *)addr;
}
uint32_t pci_read32(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset) {
- volatile uint32_t *addr = pci_ecam_addr(bus, slot, func, offset);
- return *addr;
+ volatile uint32_t *addr = pci_ecam_addr(bus, slot, func, offset);
+ return *addr;
+}
+
+void pci_write32(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset,
+ uint32_t value) {
+ volatile uint32_t *addr = pci_ecam_addr(bus, slot, func, offset);
+ *addr = value;
}
-void pci_write32(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint32_t value) {
- volatile uint32_t *addr = pci_ecam_addr(bus, slot, func, offset);
- *addr = value;
+/* Find a device by vendor/device ID */
+pci_device_t *pci_find_device(uint16_t vendor, uint16_t device) {
+ pci_device_t *dev = device_list;
+ while (dev) {
+ if (dev->vendor_id == vendor && dev->device_id == device) {
+ return dev;
+ }
+ dev = dev->next;
+ }
+ return NULL;
+}
+
+/* Allocate BAR if unassigned */
+static uint64_t pci_alloc_bar(uint8_t bus, uint8_t slot, uint8_t func,
+ uint8_t bar_offset) {
+ uint32_t bar_raw = pci_read32(bus, slot, func, bar_offset);
+ uint32_t flags = bar_raw & 0xF;
+
+ /* Check if BAR is already assigned with valid address */
+ if ((bar_raw & 0xFFFFFFF0) != 0 && bar_raw != 0xFFFFFFFF) {
+ return bar_raw & 0xFFFFFFF0;
+ }
+
+ /* BAR is unassigned - try to size and allocate */
+ pci_write32(bus, slot, func, bar_offset, 0xFFFFFFFF);
+ uint32_t size_val = pci_read32(bus, slot, func, bar_offset);
+ pci_write32(bus, slot, func, bar_offset, bar_raw); /* Restore */
+
+ /* Check if BAR responds to sizing */
+ if (size_val == 0 || size_val == 0xFFFFFFFF) {
+ return 0; /* BAR not implemented */
+ }
+
+ /* Calculate size from response */
+ uint32_t size_mask = size_val & 0xFFFFFFF0;
+ uint32_t size = (~size_mask) + 1;
+ if (size == 0 || size > 0x10000000)
+ size = 0x4000; /* Default to 16KB if invalid */
+
+ /* Check if 64-bit BAR */
+ bool is_64bit = (flags & 0x4);
+
+ /* Align allocation */
+ next_mmio_base = (next_mmio_base + size - 1) & ~(size - 1);
+ uint64_t addr = next_mmio_base;
+
+ /* Write new address */
+ pci_write32(bus, slot, func, bar_offset, (uint32_t)addr | (flags & 0xF));
+
+ /* Handle 64-bit BAR */
+ if (is_64bit) {
+ pci_write32(bus, slot, func, bar_offset + 4, (uint32_t)(addr >> 32));
+ }
+
+ next_mmio_base += size;
+
+ printk("PCI: [%02x:%02x.%x] BAR@0x%02x allocated at 0x%llx (size 0x%x)\n",
+ bus, slot, func, bar_offset, addr, size);
+ return addr;
}
void pci_init(void) {
- printk("PCI: Initializing High ECAM scan at 0x%llx...\n", PCI_ECAM_BASE);
-
- /* Brute force scan of Bus 0 */
- /* QEMU virt usually puts devices on Bus 0 */
- for (int slot = 0; slot < 32; slot++) {
- /* Check vendor */
- uint32_t vendor_dev = pci_read32(0, slot, 0, PCI_VENDOR_ID);
- uint16_t vendor = vendor_dev & 0xFFFF;
- uint16_t device = (vendor_dev >> 16) & 0xFFFF;
-
- if (vendor != 0xFFFF && vendor != 0x0000) {
- printk("PCI: Found %04x:%04x at 00:%02x.0\n", vendor, device, slot);
-
- /* Check if it's Intel HDA */
- if (vendor == HDA_VENDOR_ID && device == HDA_DEVICE_ID) {
- printk("PCI: Found Inteal HDA Audio Controller!\n");
-
- /* Create device struct */
- pci_device_t pci_dev;
- pci_dev.bus = 0;
- pci_dev.slot = slot;
- pci_dev.func = 0;
- pci_dev.vendor_id = vendor;
- pci_dev.device_id = device;
-
- /* Read BAR0 */
- uint32_t bar0_raw = pci_read32(0, slot, 0, PCI_BAR0);
- uint32_t flags = bar0_raw & 0xF;
-
- /* If BAR0 is unassigned (0) or we want to force allocation */
- if ((bar0_raw & 0xFFFFFFF0) == 0) {
- printk("PCI: Unassigned BAR0 for device %02x (Flags %x). Allocating...\n", slot, flags);
-
- static uint32_t next_mmio_base = 0x10000000;
-
- /* Size the BAR */
- pci_write32(0, slot, 0, PCI_BAR0, 0xFFFFFFFF);
- uint32_t size_val = pci_read32(0, slot, 0, PCI_BAR0);
- uint32_t size_mask = size_val & 0xFFFFFFF0;
- uint32_t size = (~size_mask) + 1;
-
- /* Restore flags or check type */
- bool is_64bit = (bar0_raw & 0x4);
-
- if (size == 0 || size > 0x10000000) size = 0x4000;
-
- printk("PCI: Size needed: %x bytes (64-bit: %d)\n", size, is_64bit);
-
- /* Write address */
- pci_write32(0, slot, 0, PCI_BAR0, next_mmio_base);
- if (is_64bit) {
- pci_write32(0, slot, 0, PCI_BAR1, 0x00000000);
- }
-
- pci_dev.bar0 = next_mmio_base;
-
- next_mmio_base += size;
- if (next_mmio_base % 0x1000) next_mmio_base = (next_mmio_base + 0x1000) & ~0xFFF;
- } else {
- pci_dev.bar0 = bar0_raw & 0xFFFFFFF0;
- }
-
- /* Read Interrupt Line */
- uint32_t irq_line = pci_read32(0, slot, 0, PCI_INTERRUPT);
- pci_dev.irq = irq_line & 0xFF;
-
- printk("PCI: HDA BAR0=0x%llx, IRQ=%d\n", pci_dev.bar0, pci_dev.irq);
-
- /* Initialize HDA */
- intel_hda_init(&pci_dev);
- }
- }
+ printk("PCI: Initializing High ECAM scan at 0x%llx...\n", PCI_ECAM_BASE);
+
+ /* Brute force scan of Bus 0 */
+ /* QEMU virt usually puts devices on Bus 0 */
+ for (int slot = 0; slot < 32; slot++) {
+ /* Check vendor */
+ uint32_t vendor_dev = pci_read32(0, slot, 0, PCI_VENDOR_ID);
+ uint16_t vendor = vendor_dev & 0xFFFF;
+ uint16_t device = (vendor_dev >> 16) & 0xFFFF;
+
+ if (vendor != 0xFFFF && vendor != 0x0000) {
+ printk("PCI: Found %04x:%04x at 00:%02x.0\n", vendor, device, slot);
+
+ /* Allocate device from pool */
+ if (device_count >= 16) {
+ printk("PCI: Device pool full!\n");
+ continue;
+ }
+
+ pci_device_t *pci_dev = &device_pool[device_count++];
+ pci_dev->bus = 0;
+ pci_dev->slot = slot;
+ pci_dev->func = 0;
+ pci_dev->vendor_id = vendor;
+ pci_dev->device_id = device;
+
+ /* Read class info */
+ uint32_t class_rev = pci_read32(0, slot, 0, PCI_CLASS_REV);
+ pci_dev->class_code = (class_rev >> 24) & 0xFF;
+ pci_dev->subclass = (class_rev >> 16) & 0xFF;
+
+ /* Read BAR0 */
+ pci_dev->bar0 = pci_alloc_bar(0, slot, 0, PCI_BAR0);
+ pci_dev->bar1 = pci_alloc_bar(0, slot, 0, PCI_BAR1);
+ pci_dev->bar2 = pci_alloc_bar(0, slot, 0, PCI_BAR2);
+
+ /* Read Interrupt Line */
+ uint32_t irq_line = pci_read32(0, slot, 0, PCI_INTERRUPT);
+ pci_dev->irq = irq_line & 0xFF;
+
+ /* Add to linked list */
+ pci_dev->next = device_list;
+ device_list = pci_dev;
+
+ /* Check if it's Intel HDA */
+ if (vendor == HDA_VENDOR_ID && device == HDA_DEVICE_ID) {
+ printk("PCI: Found Inteal HDA Audio Controller!\n");
+ printk("PCI: HDA BAR0=0x%llx, IRQ=%d\n", pci_dev->bar0, pci_dev->irq);
+ intel_hda_init(pci_dev);
+ }
+
+ /* Check if it's virtio-gpu */
+ if (vendor == PCI_VENDOR_VIRTIO && device == PCI_DEVICE_VIRTIO_GPU) {
+ printk("PCI: Found virtio-gpu device!\n");
+ printk("PCI: virtio-gpu BAR0=0x%llx\n", pci_dev->bar0);
+ }
}
- printk("PCI: Scan complete.\n");
+ }
+ printk("PCI: Scan complete (%d devices found).\n", device_count);
}
diff --git a/kernel/fs/ramfs.c b/kernel/fs/ramfs.c
index 3529c1f..d29e90e 100644
--- a/kernel/fs/ramfs.c
+++ b/kernel/fs/ramfs.c
@@ -410,12 +410,67 @@ static int ramfs_rename(struct inode *old_dir, struct dentry *old_dentry,
return 0;
}
+static int ramfs_unlink(struct inode *dir, struct dentry *dentry)
+{
+ struct ramfs_inode *ram_dir = (struct ramfs_inode *)dir->i_private;
+ struct ramfs_inode *target = ramfs_lookup_child(ram_dir, dentry->d_name);
+
+ if (!target) return -ENOENT;
+
+ /* Must be a file, not a directory */
+ if (S_ISDIR(target->mode)) return -EISDIR;
+
+ /* Remove from parent's child list */
+ struct ramfs_inode **prev = &ram_dir->children;
+ while (*prev) {
+ if (*prev == target) {
+ *prev = target->sibling;
+ break;
+ }
+ prev = &((*prev)->sibling);
+ }
+
+ /* Free the inode and its data */
+ ramfs_free_inode(target);
+
+ return 0;
+}
+
+static int ramfs_rmdir(struct inode *dir, struct dentry *dentry)
+{
+ struct ramfs_inode *ram_dir = (struct ramfs_inode *)dir->i_private;
+ struct ramfs_inode *target = ramfs_lookup_child(ram_dir, dentry->d_name);
+
+ if (!target) return -ENOENT;
+
+ /* Must be a directory */
+ if (!S_ISDIR(target->mode)) return -ENOTDIR;
+
+ /* Directory must be empty */
+ if (target->children) return -ENOTEMPTY;
+
+ /* Remove from parent's child list */
+ struct ramfs_inode **prev = &ram_dir->children;
+ while (*prev) {
+ if (*prev == target) {
+ *prev = target->sibling;
+ break;
+ }
+ prev = &((*prev)->sibling);
+ }
+
+ /* Free the inode */
+ ramfs_free_inode(target);
+
+ return 0;
+}
+
static struct inode_operations ramfs_inode_ops = {
.lookup = ramfs_lookup,
.create = ramfs_create,
.mkdir = ramfs_mkdir,
- .rmdir = NULL,
- .unlink = NULL,
+ .rmdir = ramfs_rmdir,
+ .unlink = ramfs_unlink,
.rename = ramfs_rename,
};
@@ -508,14 +563,32 @@ int ramfs_init(void)
/* Helper: Create a file in ramfs */
/* ===================================================================== */
+/* Forward declaration */
+static struct ramfs_inode *ramfs_get_parent_dir(const char *path, char *filename);
+
int ramfs_create_file(const char *path, mode_t mode, const char *content)
{
if (!ramfs_sb.root) {
return -ENOENT;
}
- /* For now, just create in root */
- struct ramfs_inode *file = ramfs_alloc_inode(S_IFREG | mode, path);
+ /* Parse path to find parent directory and filename */
+ char filename[RAMFS_MAX_NAME + 1];
+ struct ramfs_inode *parent = ramfs_get_parent_dir(path, filename);
+ if (!parent) {
+ /* Try root if no parent found */
+ parent = ramfs_sb.root;
+ int i = 0;
+ const char *start = path;
+ if (*start == '/') start++;
+ while (start[i] && i < RAMFS_MAX_NAME) {
+ filename[i] = start[i];
+ i++;
+ }
+ filename[i] = '\0';
+ }
+
+ struct ramfs_inode *file = ramfs_alloc_inode(S_IFREG | mode, filename);
if (!file) {
return -ENOMEM;
}
@@ -535,7 +608,7 @@ int ramfs_create_file(const char *path, mode_t mode, const char *content)
}
}
- ramfs_add_child(ramfs_sb.root, file);
+ ramfs_add_child(parent, file);
printk(KERN_INFO "RAMFS: Created file '%s'\n", path);
@@ -545,6 +618,9 @@ int ramfs_create_file(const char *path, mode_t mode, const char *content)
/* Helper to find or create parent directory from path */
static struct ramfs_inode *ramfs_get_parent_dir(const char *path, char *filename)
{
+ /* Skip leading slash */
+ if (*path == '/') path++;
+
/* Find last '/' in path */
const char *last_slash = NULL;
for (const char *p = path; *p; p++) {
@@ -552,7 +628,7 @@ static struct ramfs_inode *ramfs_get_parent_dir(const char *path, char *filename
}
if (!last_slash) {
- /* No directory, just filename - use root */
+ /* No directory component, just filename - use root */
int i = 0;
while (path[i] && i < RAMFS_MAX_NAME) {
filename[i] = path[i];
@@ -562,7 +638,7 @@ static struct ramfs_inode *ramfs_get_parent_dir(const char *path, char *filename
return ramfs_sb.root;
}
- /* Extract directory name */
+ /* Extract directory name (first component) */
char dirname[RAMFS_MAX_NAME + 1];
int len = last_slash - path;
if (len > RAMFS_MAX_NAME) len = RAMFS_MAX_NAME;
@@ -580,7 +656,7 @@ static struct ramfs_inode *ramfs_get_parent_dir(const char *path, char *filename
}
filename[i] = '\0';
- /* Find directory */
+ /* Find directory (looking for just first component for now) */
struct ramfs_inode *dir = ramfs_lookup_child(ramfs_sb.root, dirname);
if (!dir) {
return NULL;
diff --git a/kernel/fs/vfs.c b/kernel/fs/vfs.c
index 1523500..1bdbf9b 100644
--- a/kernel/fs/vfs.c
+++ b/kernel/fs/vfs.c
@@ -24,79 +24,75 @@ static struct dentry *root_dentry = NULL;
/* Helper functions */
/* ===================================================================== */
-static struct file_system_type *find_filesystem(const char *name)
-{
- struct file_system_type *fs = file_systems;
- while (fs) {
- /* Compare names */
- const char *a = fs->name;
- const char *b = name;
- while (*a && *b && *a == *b) {
- a++;
- b++;
- }
- if (*a == '\0' && *b == '\0') {
- return fs;
- }
- fs = fs->next;
+static struct file_system_type *find_filesystem(const char *name) {
+ struct file_system_type *fs = file_systems;
+ while (fs) {
+ /* Compare names */
+ const char *a = fs->name;
+ const char *b = name;
+ while (*a && *b && *a == *b) {
+ a++;
+ b++;
}
- return NULL;
+ if (*a == '\0' && *b == '\0') {
+ return fs;
+ }
+ fs = fs->next;
+ }
+ return NULL;
}
-static int path_compare(const char *a, const char *b)
-{
- while (*a && *b && *a == *b) {
- a++;
- b++;
- }
- return *a - *b;
+static int path_compare(const char *a, const char *b) {
+ while (*a && *b && *a == *b) {
+ a++;
+ b++;
+ }
+ return *a - *b;
}
/* ===================================================================== */
/* VFS initialization */
/* ===================================================================== */
-void vfs_init(void)
-{
- printk(KERN_INFO "VFS: Initializing virtual filesystem\n");
-
- /* Clear mount table */
- for (int i = 0; i < MAX_MOUNTS; i++) {
- mounts[i] = NULL;
- }
-
- /* TODO: Register built-in filesystems */
- /* register_filesystem(&ramfs_type); */
- /* register_filesystem(&procfs_type); */
- /* register_filesystem(&sysfs_type); */
- /* register_filesystem(&devfs_type); */
-
- printk(KERN_INFO "VFS: Initialized\n");
+void vfs_init(void) {
+ printk(KERN_INFO "VFS: Initializing virtual filesystem\n");
+
+ /* Clear mount table */
+ for (int i = 0; i < MAX_MOUNTS; i++) {
+ mounts[i] = NULL;
+ }
+
+ /* TODO: Register built-in filesystems */
+ /* register_filesystem(&ramfs_type); */
+ /* register_filesystem(&procfs_type); */
+ /* register_filesystem(&sysfs_type); */
+ /* register_filesystem(&devfs_type); */
+
+ printk(KERN_INFO "VFS: Initialized\n");
}
/* ===================================================================== */
/* Filesystem registration */
/* ===================================================================== */
-int register_filesystem(struct file_system_type *fs)
-{
- if (!fs || !fs->name) {
- return -EINVAL;
- }
-
- /* Check for duplicate */
- if (find_filesystem(fs->name)) {
- printk(KERN_WARNING "VFS: Filesystem '%s' already registered\n", fs->name);
- return -EBUSY;
- }
-
- /* Add to list */
- fs->next = file_systems;
- file_systems = fs;
-
- printk(KERN_INFO "VFS: Registered filesystem '%s'\n", fs->name);
-
- return 0;
+int register_filesystem(struct file_system_type *fs) {
+ if (!fs || !fs->name) {
+ return -EINVAL;
+ }
+
+ /* Check for duplicate */
+ if (find_filesystem(fs->name)) {
+ printk(KERN_WARNING "VFS: Filesystem '%s' already registered\n", fs->name);
+ return -EBUSY;
+ }
+
+ /* Add to list */
+ fs->next = file_systems;
+ file_systems = fs;
+
+ printk(KERN_INFO "VFS: Registered filesystem '%s'\n", fs->name);
+
+ return 0;
}
/* ===================================================================== */
@@ -109,347 +105,478 @@ int register_filesystem(struct file_system_type *fs)
/* Path lookup */
/* ===================================================================== */
-static struct dentry *vfs_lookup_path(const char *path, const char **filename)
-{
- if (!root_dentry) return NULL;
-
- struct dentry *curr = root_dentry;
- char *p = (char *)path;
-
- /* Skip leading / */
- while (*p == '/') p++;
-
- if (*p == '\0') {
- if (filename) *filename = NULL;
- return curr;
+static struct dentry *vfs_lookup_path(const char *path, const char **filename) {
+ if (!root_dentry)
+ return NULL;
+
+ struct dentry *curr = root_dentry;
+ char *p = (char *)path;
+
+ /* Skip leading / */
+ while (*p == '/')
+ p++;
+
+ if (*p == '\0') {
+ if (filename)
+ *filename = NULL;
+ return curr;
+ }
+
+ static char buf[NAME_MAX + 1];
+
+ while (*p) {
+ /* Extract next component */
+ int len = 0;
+ char *start = p;
+ while (*p && *p != '/') {
+ if (len < NAME_MAX)
+ buf[len++] = *p;
+ p++;
}
-
- static char buf[NAME_MAX + 1];
-
- while (*p) {
- /* Extract next component */
- int len = 0;
- char *start = p;
- while (*p && *p != '/') {
- if (len < NAME_MAX) buf[len++] = *p;
- p++;
- }
- buf[len] = '\0';
-
- while (*p == '/') p++;
-
- /* If this is the last component, return parent and filename */
- if (*p == '\0' && filename) {
- *filename = start; /* Pointer into original string - careful */
- /* Actually, we need to copy it because original might be const */
- /* But caller usually passes non-const or we can just return curr */
- /* Better design: return parent dentry and pointer to last component in path */
- return curr; /* curr is the directory containing the file */
- /* Wait, this logic is tricky. Let's do simple traversal */
- }
-
- /* Lookup child */
- if (!curr->d_inode || !curr->d_inode->i_op || !curr->d_inode->i_op->lookup) {
- return NULL;
- }
-
- struct dentry target;
- for(int i=0; i<=len; i++) target.d_name[i] = buf[i];
-
- /* In this simplified VFS, lookup populates the dentry if found */
- /* We need to allocate a real dentry to return/store */
- /* For now, simplified: rely on ramfs creating the inode and we assume we traverse */
-
- /* Simple hack for ramfs traversal without full dcache: */
- /* We construct a dummy dentry, pass to lookup. If lookup populates d_inode, we proceed. */
-
- /* Allocate a dentry to be safe/consistent */
- struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- if (!child) return NULL;
-
- for(int i=0; i<=len; i++) child->d_name[i] = buf[i];
- child->d_parent = curr;
- child->d_sb = curr->d_sb;
-
- if (curr->d_inode->i_op->lookup(curr->d_inode, child) != NULL) {
- /* If it returns a dentry, use it */
- /* (Not implemented in ramfs, it returns NULL on success with populated pointer) */
- }
-
- if (!child->d_inode) {
- /* Not found */
- kfree(child);
- return NULL;
- }
-
- curr = child;
+ buf[len] = '\0';
+
+ while (*p == '/')
+ p++;
+
+ /* If this is the last component, return parent and filename */
+ if (*p == '\0' && filename) {
+ *filename = start; /* Pointer into original string - careful */
+ /* Actually, we need to copy it because original might be const */
+ /* But caller usually passes non-const or we can just return curr */
+ /* Better design: return parent dentry and pointer to last component in
+ * path */
+ return curr; /* curr is the directory containing the file */
+ /* Wait, this logic is tricky. Let's do simple traversal */
}
-
- if (filename) *filename = NULL;
- return curr;
+
+ /* Lookup child */
+ if (!curr->d_inode || !curr->d_inode->i_op ||
+ !curr->d_inode->i_op->lookup) {
+ return NULL;
+ }
+
+ struct dentry target;
+ for (int i = 0; i <= len; i++)
+ target.d_name[i] = buf[i];
+
+ /* In this simplified VFS, lookup populates the dentry if found */
+ /* We need to allocate a real dentry to return/store */
+ /* For now, simplified: rely on ramfs creating the inode and we assume we
+ * traverse */
+
+ /* Simple hack for ramfs traversal without full dcache: */
+ /* We construct a dummy dentry, pass to lookup. If lookup populates d_inode,
+ * we proceed. */
+
+ /* Allocate a dentry to be safe/consistent */
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ if (!child)
+ return NULL;
+
+ for (int i = 0; i <= len; i++)
+ child->d_name[i] = buf[i];
+ child->d_parent = curr;
+ child->d_sb = curr->d_sb;
+
+ if (curr->d_inode->i_op->lookup(curr->d_inode, child) != NULL) {
+ /* If it returns a dentry, use it */
+ /* (Not implemented in ramfs, it returns NULL on success with populated
+ * pointer) */
+ }
+
+ if (!child->d_inode) {
+ /* Not found */
+ kfree(child);
+ return NULL;
+ }
+
+ curr = child;
+ }
+
+ if (filename)
+ *filename = NULL;
+ return curr;
}
/* Helper to find parent and last component */
-static struct dentry *vfs_lookup_parent(const char *path, char *name_buf)
-{
- if (!root_dentry) return NULL;
-
- struct dentry *curr = root_dentry;
- char *p = (char *)path;
-
- /* Skip leading / */
- while (*p == '/') p++;
-
- if (*p == '\0') return NULL; /* Root has no parent */
-
- static char buf[NAME_MAX + 1];
-
- while (*p) {
- /* Extract next component */
- int len = 0;
- while (*p && *p != '/') {
- if (len < NAME_MAX) buf[len++] = *p;
- p++;
- }
- buf[len] = '\0';
-
- while (*p == '/') p++;
-
- if (*p == '\0') {
- /* This was the last component */
- if (name_buf) {
- for(int i=0; i<=len; i++) name_buf[i] = buf[i];
- }
- return curr;
- }
-
- /* Traverse down */
- if (!curr->d_inode || !curr->d_inode->i_op || !curr->d_inode->i_op->lookup) {
- return NULL;
- }
-
- struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- if (!child) return NULL;
-
- for(int i=0; i<=len; i++) child->d_name[i] = buf[i];
-
- /* Assume success for now (lookup populates child->d_inode) */
- curr->d_inode->i_op->lookup(curr->d_inode, child);
-
- if (!child->d_inode) {
- kfree(child);
- return NULL;
- }
- curr = child;
- }
-
+static struct dentry *vfs_lookup_parent(const char *path, char *name_buf) {
+ if (!root_dentry)
return NULL;
-}
-/* Redefine vfs_open with lookup */
-struct file *vfs_open(const char *path, int flags, mode_t mode)
-{
- /* Special case for root */
- if (path[0] == '/' && path[1] == '\0') {
- struct file *f = kzalloc(sizeof(struct file), GFP_KERNEL);
- f->f_dentry = root_dentry;
- f->f_op = root_dentry->d_inode->i_fop;
- f->private_data = root_dentry->d_inode->i_private;
- f->f_mode = mode;
- f->f_flags = flags;
- f->f_count.counter = 1;
- return f;
+ struct dentry *curr = root_dentry;
+ char *p = (char *)path;
+
+ /* Skip leading / */
+ while (*p == '/')
+ p++;
+
+ if (*p == '\0')
+ return NULL; /* Root has no parent */
+
+ static char buf[NAME_MAX + 1];
+
+ while (*p) {
+ /* Extract next component */
+ int len = 0;
+ while (*p && *p != '/') {
+ if (len < NAME_MAX)
+ buf[len++] = *p;
+ p++;
}
-
- char name[NAME_MAX + 1];
- struct dentry *parent = vfs_lookup_parent(path, name);
-
- if (!parent) {
- /* Try full lookup (might be exact match on an intermediate node? Unlikely for open) */
- /* Or file exists in root */
- if (root_dentry) parent = root_dentry;
-
- /* Extract name from /name */
- const char *p = path;
- while (*p == '/') p++;
- int i = 0;
- while (*p && *p != '/') {
- if (i < NAME_MAX) name[i++] = *p;
- p++;
- }
- name[i] = '\0';
- if (*p != '\0') return NULL; /* Path had more components but parent lookup failed */
+ buf[len] = '\0';
+
+ while (*p == '/')
+ p++;
+
+ if (*p == '\0') {
+ /* This was the last component */
+ if (name_buf) {
+ for (int i = 0; i <= len; i++)
+ name_buf[i] = buf[i];
+ }
+ return curr;
}
-
- /* Now look for the file in parent */
- struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- for(int i=0; id_name[i] = name[i];
-
- if (parent->d_inode && parent->d_inode->i_op && parent->d_inode->i_op->lookup) {
- parent->d_inode->i_op->lookup(parent->d_inode, child);
+
+ /* Traverse down */
+ if (!curr->d_inode || !curr->d_inode->i_op ||
+ !curr->d_inode->i_op->lookup) {
+ return NULL;
}
-
+
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ if (!child)
+ return NULL;
+
+ for (int i = 0; i <= len; i++)
+ child->d_name[i] = buf[i];
+
+ /* Assume success for now (lookup populates child->d_inode) */
+ curr->d_inode->i_op->lookup(curr->d_inode, child);
+
if (!child->d_inode) {
- /* Check O_CREAT */
- if (flags & O_CREAT) {
- /* Create it */
- if (parent->d_inode->i_op->create) {
- int ret = parent->d_inode->i_op->create(parent->d_inode, child, mode);
- if (ret != 0) {
- kfree(child);
- return NULL;
- }
- }
- } else {
- kfree(child);
- return NULL;
- }
+ kfree(child);
+ return NULL;
}
-
+ curr = child;
+ }
+
+ return NULL;
+}
+
+/* Redefine vfs_open with lookup */
+struct file *vfs_open(const char *path, int flags, mode_t mode) {
+ /* Special case for root */
+ if (path[0] == '/' && path[1] == '\0') {
struct file *f = kzalloc(sizeof(struct file), GFP_KERNEL);
- if (!f) return NULL;
-
- f->f_dentry = child;
- f->f_op = child->d_inode->i_fop;
- f->private_data = child->d_inode->i_private;
+ f->f_dentry = root_dentry;
+ f->f_op = root_dentry->d_inode->i_fop;
+ f->private_data = root_dentry->d_inode->i_private;
f->f_mode = mode;
f->f_flags = flags;
f->f_count.counter = 1;
-
- if (f->f_op && f->f_op->open) {
- f->f_op->open(child->d_inode, f);
- }
-
return f;
+ }
+
+ char name[NAME_MAX + 1];
+ struct dentry *parent = vfs_lookup_parent(path, name);
+
+ if (!parent) {
+ /* Try full lookup (might be exact match on an intermediate node? Unlikely
+ * for open) */
+ /* Or file exists in root */
+ if (root_dentry)
+ parent = root_dentry;
+
+ /* Extract name from /name */
+ const char *p = path;
+ while (*p == '/')
+ p++;
+ int i = 0;
+ while (*p && *p != '/') {
+ if (i < NAME_MAX)
+ name[i++] = *p;
+ p++;
+ }
+ name[i] = '\0';
+ if (*p != '\0')
+ return NULL; /* Path had more components but parent lookup failed */
+ }
+
+ /* Now look for the file in parent */
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ for (int i = 0; i < NAME_MAX && name[i]; i++)
+ child->d_name[i] = name[i];
+
+ if (parent->d_inode && parent->d_inode->i_op &&
+ parent->d_inode->i_op->lookup) {
+ parent->d_inode->i_op->lookup(parent->d_inode, child);
+ }
+
+ if (!child->d_inode) {
+ /* Check O_CREAT */
+ if (flags & O_CREAT) {
+ /* Create it */
+ if (parent->d_inode->i_op->create) {
+ int ret = parent->d_inode->i_op->create(parent->d_inode, child, mode);
+ if (ret != 0) {
+ kfree(child);
+ return NULL;
+ }
+ }
+ } else {
+ kfree(child);
+ return NULL;
+ }
+ }
+
+ struct file *f = kzalloc(sizeof(struct file), GFP_KERNEL);
+ if (!f)
+ return NULL;
+
+ f->f_dentry = child;
+ f->f_op = child->d_inode->i_fop;
+ f->private_data = child->d_inode->i_private;
+ f->f_mode = mode;
+ f->f_flags = flags;
+ f->f_count.counter = 1;
+
+ if (f->f_op && f->f_op->open) {
+ f->f_op->open(child->d_inode, f);
+ }
+
+ return f;
}
-int vfs_create(const char *path, mode_t mode)
-{
- char name[NAME_MAX + 1];
- struct dentry *parent = vfs_lookup_parent(path, name);
- if (!parent) return -ENOENT;
-
- struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- for(int i=0; id_name[i] = name[i];
-
- if (!parent->d_inode->i_op || !parent->d_inode->i_op->create) return -EPERM;
-
- return parent->d_inode->i_op->create(parent->d_inode, child, mode);
+int vfs_create(const char *path, mode_t mode) {
+ char name[NAME_MAX + 1];
+ struct dentry *parent = vfs_lookup_parent(path, name);
+ if (!parent)
+ return -ENOENT;
+
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ for (int i = 0; i < NAME_MAX && name[i]; i++)
+ child->d_name[i] = name[i];
+
+ if (!parent->d_inode->i_op || !parent->d_inode->i_op->create)
+ return -EPERM;
+
+ return parent->d_inode->i_op->create(parent->d_inode, child, mode);
}
-int vfs_mkdir(const char *path, mode_t mode)
-{
- char name[NAME_MAX + 1];
- struct dentry *parent = vfs_lookup_parent(path, name);
- if (!parent) return -ENOENT;
-
- struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- for(int i=0; id_name[i] = name[i];
-
- if (!parent->d_inode->i_op || !parent->d_inode->i_op->mkdir) return -EPERM;
-
- return parent->d_inode->i_op->mkdir(parent->d_inode, child, mode);
+int vfs_mkdir(const char *path, mode_t mode) {
+ char name[NAME_MAX + 1];
+ struct dentry *parent = vfs_lookup_parent(path, name);
+ if (!parent)
+ return -ENOENT;
+
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ for (int i = 0; i < NAME_MAX && name[i]; i++)
+ child->d_name[i] = name[i];
+
+ if (!parent->d_inode->i_op || !parent->d_inode->i_op->mkdir)
+ return -EPERM;
+
+ return parent->d_inode->i_op->mkdir(parent->d_inode, child, mode);
}
-int vfs_readdir(struct file *file, void *ctx, int (*filldir)(void *, const char *, int, loff_t, ino_t, unsigned))
-{
- if (!file || !file->f_op || !file->f_op->readdir) {
- return -EINVAL;
- }
- return file->f_op->readdir(file, ctx, filldir);
+int vfs_readdir(struct file *file, void *ctx,
+ int (*filldir)(void *, const char *, int, loff_t, ino_t,
+ unsigned)) {
+ if (!file || !file->f_op || !file->f_op->readdir) {
+ return -EINVAL;
+ }
+ return file->f_op->readdir(file, ctx, filldir);
}
-int vfs_close(struct file *file)
-{
- if (!file) return -EBADF;
- if (file->f_op && file->f_op->release && file->f_dentry) {
- file->f_op->release(file->f_dentry->d_inode, file);
- }
- file->f_count.counter--;
- /* TODO: free if 0 */
- return 0;
+int vfs_close(struct file *file) {
+ if (!file)
+ return -EBADF;
+ if (file->f_op && file->f_op->release && file->f_dentry) {
+ file->f_op->release(file->f_dentry->d_inode, file);
+ }
+ file->f_count.counter--;
+ if (file->f_count.counter <= 0) {
+ kfree(file);
+ }
+ return 0;
}
-ssize_t vfs_read(struct file *file, char *buf, size_t count)
-{
- if (!file) return -EBADF;
- if (!buf) return -EFAULT;
- if (!file->f_op || !file->f_op->read) return -EINVAL;
- return file->f_op->read(file, buf, count, &file->f_pos);
+ssize_t vfs_read(struct file *file, char *buf, size_t count) {
+ if (!file)
+ return -EBADF;
+ if (!buf)
+ return -EFAULT;
+ if (!file->f_op || !file->f_op->read)
+ return -EINVAL;
+ return file->f_op->read(file, buf, count, &file->f_pos);
}
-ssize_t vfs_write(struct file *file, const char *buf, size_t count)
-{
- if (!file) return -EBADF;
- if (!buf) return -EFAULT;
- if (!file->f_op || !file->f_op->write) return -EINVAL;
- return file->f_op->write(file, buf, count, &file->f_pos);
+ssize_t vfs_write(struct file *file, const char *buf, size_t count) {
+ if (!file)
+ return -EBADF;
+ if (!buf)
+ return -EFAULT;
+ if (!file->f_op || !file->f_op->write)
+ return -EINVAL;
+ return file->f_op->write(file, buf, count, &file->f_pos);
}
-loff_t vfs_lseek(struct file *file, loff_t offset, int whence)
-{
- if (!file) return -EBADF;
- loff_t new_pos;
- struct inode *inode = file->f_dentry ? file->f_dentry->d_inode : NULL;
-
- switch (whence) {
- case SEEK_SET: new_pos = offset; break;
- case SEEK_CUR: new_pos = file->f_pos + offset; break;
- case SEEK_END:
- if (!inode) return -EINVAL;
- new_pos = inode->i_size + offset;
- break;
- default: return -EINVAL;
- }
- if (new_pos < 0) return -EINVAL;
- file->f_pos = new_pos;
- return new_pos;
+loff_t vfs_lseek(struct file *file, loff_t offset, int whence) {
+ if (!file)
+ return -EBADF;
+ loff_t new_pos;
+ struct inode *inode = file->f_dentry ? file->f_dentry->d_inode : NULL;
+
+ switch (whence) {
+ case SEEK_SET:
+ new_pos = offset;
+ break;
+ case SEEK_CUR:
+ new_pos = file->f_pos + offset;
+ break;
+ case SEEK_END:
+ if (!inode)
+ return -EINVAL;
+ new_pos = inode->i_size + offset;
+ break;
+ default:
+ return -EINVAL;
+ }
+ if (new_pos < 0)
+ return -EINVAL;
+ file->f_pos = new_pos;
+ return new_pos;
}
-int vfs_rmdir(const char *path) { (void)path; return -ENOSYS; }
-int vfs_unlink(const char *path) { (void)path; return -ENOSYS; }
-int vfs_rename(const char *old, const char *new)
-{
- char old_name_buf[NAME_MAX + 1];
- struct dentry *old_parent = vfs_lookup_parent(old, old_name_buf);
- if (!old_parent) return -ENOENT;
-
- char new_name_buf[NAME_MAX + 1];
- struct dentry *new_parent = vfs_lookup_parent(new, new_name_buf);
- if (!new_parent) return -ENOENT;
-
- /* Lookup full old dentry */
- struct dentry *old_child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- int i;
- for(i=0; id_name[i] = old_name_buf[i];
- old_child->d_name[i] = '\0';
-
- if (old_parent->d_inode->i_op && old_parent->d_inode->i_op->lookup) {
- old_parent->d_inode->i_op->lookup(old_parent->d_inode, old_child);
- }
-
- if (!old_child->d_inode) {
- kfree(old_child);
- return -ENOENT;
- }
-
- /* Construct new dentry pattern */
- struct dentry *new_child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
- for(i=0; id_name[i] = new_name_buf[i];
- new_child->d_name[i] = '\0';
-
- /* Check if operation supported */
- if (!old_parent->d_inode->i_op || !old_parent->d_inode->i_op->rename) {
- kfree(old_child);
- kfree(new_child);
- return -EPERM; /* Should be ENOSYS/EPERM */
- }
-
- int ret = old_parent->d_inode->i_op->rename(old_parent->d_inode, old_child, new_parent->d_inode, new_child);
-
+int vfs_rmdir(const char *path) {
+ char name[NAME_MAX + 1];
+ struct dentry *parent = vfs_lookup_parent(path, name);
+ if (!parent)
+ return -ENOENT;
+
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ if (!child)
+ return -ENOMEM;
+
+ int i;
+ for (i = 0; i < NAME_MAX && name[i]; i++)
+ child->d_name[i] = name[i];
+ child->d_name[i] = '\0';
+
+ /* Lookup the target */
+ if (parent->d_inode->i_op && parent->d_inode->i_op->lookup) {
+ parent->d_inode->i_op->lookup(parent->d_inode, child);
+ }
+
+ if (!child->d_inode) {
+ kfree(child);
+ return -ENOENT;
+ }
+
+ /* Must be a directory */
+ if (!S_ISDIR(child->d_inode->i_mode)) {
+ kfree(child);
+ return -ENOTDIR;
+ }
+
+ /* Check if rmdir operation is supported */
+ if (!parent->d_inode->i_op || !parent->d_inode->i_op->rmdir) {
+ kfree(child);
+ return -EPERM;
+ }
+
+ int ret = parent->d_inode->i_op->rmdir(parent->d_inode, child);
+ kfree(child);
+ return ret;
+}
+
+int vfs_unlink(const char *path) {
+ char name[NAME_MAX + 1];
+ struct dentry *parent = vfs_lookup_parent(path, name);
+ if (!parent)
+ return -ENOENT;
+
+ struct dentry *child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ if (!child)
+ return -ENOMEM;
+
+ int i;
+ for (i = 0; i < NAME_MAX && name[i]; i++)
+ child->d_name[i] = name[i];
+ child->d_name[i] = '\0';
+
+ /* Lookup the target */
+ if (parent->d_inode->i_op && parent->d_inode->i_op->lookup) {
+ parent->d_inode->i_op->lookup(parent->d_inode, child);
+ }
+
+ if (!child->d_inode) {
+ kfree(child);
+ return -ENOENT;
+ }
+
+ /* Must not be a directory (use rmdir for that) */
+ if (S_ISDIR(child->d_inode->i_mode)) {
+ kfree(child);
+ return -EISDIR;
+ }
+
+ /* Check if unlink operation is supported */
+ if (!parent->d_inode->i_op || !parent->d_inode->i_op->unlink) {
+ kfree(child);
+ return -EPERM;
+ }
+
+ int ret = parent->d_inode->i_op->unlink(parent->d_inode, child);
+ kfree(child);
+ return ret;
+}
+int vfs_rename(const char *old, const char *new) {
+ char old_name_buf[NAME_MAX + 1];
+ struct dentry *old_parent = vfs_lookup_parent(old, old_name_buf);
+ if (!old_parent)
+ return -ENOENT;
+
+ char new_name_buf[NAME_MAX + 1];
+ struct dentry *new_parent = vfs_lookup_parent(new, new_name_buf);
+ if (!new_parent)
+ return -ENOENT;
+
+ /* Lookup full old dentry */
+ struct dentry *old_child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ int i;
+ for (i = 0; i < NAME_MAX && old_name_buf[i]; i++)
+ old_child->d_name[i] = old_name_buf[i];
+ old_child->d_name[i] = '\0';
+
+ if (old_parent->d_inode->i_op && old_parent->d_inode->i_op->lookup) {
+ old_parent->d_inode->i_op->lookup(old_parent->d_inode, old_child);
+ }
+
+ if (!old_child->d_inode) {
+ kfree(old_child);
+ return -ENOENT;
+ }
+
+ /* Construct new dentry pattern */
+ struct dentry *new_child = kzalloc(sizeof(struct dentry), GFP_KERNEL);
+ for (i = 0; i < NAME_MAX && new_name_buf[i]; i++)
+ new_child->d_name[i] = new_name_buf[i];
+ new_child->d_name[i] = '\0';
+
+ /* Check if operation supported */
+ if (!old_parent->d_inode->i_op || !old_parent->d_inode->i_op->rename) {
kfree(old_child);
kfree(new_child);
- return ret;
+ return -EPERM; /* Should be ENOSYS/EPERM */
+ }
+
+ int ret = old_parent->d_inode->i_op->rename(old_parent->d_inode, old_child,
+ new_parent->d_inode, new_child);
+
+ kfree(old_child);
+ kfree(new_child);
+ return ret;
}
/* ===================================================================== */
@@ -457,76 +584,74 @@ int vfs_rename(const char *old, const char *new)
/* ===================================================================== */
int vfs_mount(const char *source, const char *target, const char *fstype,
- unsigned long flags, const void *data)
-{
- (void)flags;
- (void)data;
-
- printk(KERN_INFO "VFS: mount('%s', '%s', '%s')\n", source, target, fstype);
-
- /* Find filesystem type */
- struct file_system_type *fs = find_filesystem(fstype);
- if (!fs) {
- printk(KERN_ERR "VFS: Unknown filesystem type '%s'\n", fstype);
- return -ENODEV;
- }
-
- /* Check mount limit */
- if (mount_count >= MAX_MOUNTS) {
- return -ENOMEM;
- }
-
- /* Call filesystem's mount function */
- if (!fs->mount) {
- return -ENOSYS;
- }
-
- struct super_block *sb = fs->mount(fs, flags, source, (void *)data);
- if (!sb) {
- return -EIO;
- }
-
- /* Create mount structure */
- /* TODO: Allocate properly */
- static struct vfsmount mount_pool[MAX_MOUNTS];
- struct vfsmount *mnt = &mount_pool[mount_count];
-
- mnt->mnt_root = sb->s_root;
- mnt->mnt_sb = sb;
- mnt->mnt_mountpoint = NULL; /* TODO: Find target dentry */
- mnt->mnt_parent = root_mount;
-
- /* Copy device name */
- int i;
- for (i = 0; i < 63 && source[i]; i++) {
- mnt->mnt_devname[i] = source[i];
- }
- mnt->mnt_devname[i] = '\0';
-
- mounts[mount_count++] = mnt;
-
- /* If mounting root, set root_mount */
- if (path_compare(target, "/") == 0) {
- root_mount = mnt;
- root_dentry = sb->s_root;
- }
-
- printk(KERN_INFO "VFS: Mounted '%s' on '%s'\n", source, target);
-
- return 0;
+ unsigned long flags, const void *data) {
+ (void)flags;
+ (void)data;
+
+ printk(KERN_INFO "VFS: mount('%s', '%s', '%s')\n", source, target, fstype);
+
+ /* Find filesystem type */
+ struct file_system_type *fs = find_filesystem(fstype);
+ if (!fs) {
+ printk(KERN_ERR "VFS: Unknown filesystem type '%s'\n", fstype);
+ return -ENODEV;
+ }
+
+ /* Check mount limit */
+ if (mount_count >= MAX_MOUNTS) {
+ return -ENOMEM;
+ }
+
+ /* Call filesystem's mount function */
+ if (!fs->mount) {
+ return -ENOSYS;
+ }
+
+ struct super_block *sb = fs->mount(fs, flags, source, (void *)data);
+ if (!sb) {
+ return -EIO;
+ }
+
+ /* Create mount structure */
+ /* TODO: Allocate properly */
+ static struct vfsmount mount_pool[MAX_MOUNTS];
+ struct vfsmount *mnt = &mount_pool[mount_count];
+
+ mnt->mnt_root = sb->s_root;
+ mnt->mnt_sb = sb;
+ mnt->mnt_mountpoint = NULL; /* TODO: Find target dentry */
+ mnt->mnt_parent = root_mount;
+
+ /* Copy device name */
+ int i;
+ for (i = 0; i < 63 && source[i]; i++) {
+ mnt->mnt_devname[i] = source[i];
+ }
+ mnt->mnt_devname[i] = '\0';
+
+ mounts[mount_count++] = mnt;
+
+ /* If mounting root, set root_mount */
+ if (path_compare(target, "/") == 0) {
+ root_mount = mnt;
+ root_dentry = sb->s_root;
+ }
+
+ printk(KERN_INFO "VFS: Mounted '%s' on '%s'\n", source, target);
+
+ return 0;
}
-int vfs_umount(const char *target)
-{
- printk(KERN_INFO "VFS: umount('%s')\n", target);
-
- /* Find mount point */
- for (int i = 0; i < mount_count; i++) {
- if (mounts[i] && mounts[i]->mnt_root) {
- /* TODO: Compare mount point */
- /* For now, just mark as unmounted */
- }
+int vfs_umount(const char *target) {
+ printk(KERN_INFO "VFS: umount('%s')\n", target);
+
+ /* Find mount point */
+ for (int i = 0; i < mount_count; i++) {
+ if (mounts[i] && mounts[i]->mnt_root) {
+ /* TODO: Compare mount point */
+ /* For now, just mark as unmounted */
}
-
- return -ENOSYS;
+ }
+
+ return -ENOSYS;
}
diff --git a/kernel/gui/app.c b/kernel/gui/app.c
index c1cd5b1..2ee7ecf 100644
--- a/kernel/gui/app.c
+++ b/kernel/gui/app.c
@@ -1,22 +1,24 @@
/*
* Vib-OS - Application Framework
- *
+ *
* Base framework for GUI applications.
*/
-#include "types.h"
-#include "printk.h"
#include "mm/kmalloc.h"
+#include "printk.h"
+#include "types.h"
/* Forward declarations */
struct window;
struct terminal;
-extern struct window *gui_create_window(const char *title, int x, int y, int w, int h);
+extern struct window *gui_create_window(const char *title, int x, int y, int w,
+ int h);
extern void gui_destroy_window(struct window *win);
extern void gui_focus_window(struct window *win);
extern void gui_draw_rect(int x, int y, int w, int h, uint32_t color);
-extern void gui_draw_string(int x, int y, const char *str, uint32_t fg, uint32_t bg);
+extern void gui_draw_string(int x, int y, const char *str, uint32_t fg,
+ uint32_t bg);
extern struct terminal *term_create(int x, int y, int cols, int rows);
extern void term_render(struct terminal *term);
@@ -25,31 +27,31 @@ extern void term_render(struct terminal *term);
/* ===================================================================== */
typedef enum {
- APP_TYPE_TERMINAL,
- APP_TYPE_FILE_MANAGER,
- APP_TYPE_TEXT_EDITOR,
- APP_TYPE_IMAGE_VIEWER,
- APP_TYPE_BROWSER,
- APP_TYPE_SETTINGS,
- APP_TYPE_CALCULATOR,
- APP_TYPE_PAINT,
- APP_TYPE_HELP,
- APP_TYPE_CUSTOM
+ APP_TYPE_TERMINAL,
+ APP_TYPE_FILE_MANAGER,
+ APP_TYPE_TEXT_EDITOR,
+ APP_TYPE_IMAGE_VIEWER,
+ APP_TYPE_BROWSER,
+ APP_TYPE_SETTINGS,
+ APP_TYPE_CALCULATOR,
+ APP_TYPE_PAINT,
+ APP_TYPE_HELP,
+ APP_TYPE_CUSTOM
} app_type_t;
struct application {
- int id;
- char name[64];
- char icon[32];
- app_type_t type;
- struct window *main_window;
- void *app_data;
-
- /* Lifecycle callbacks */
- int (*on_init)(struct application *app);
- void (*on_update)(struct application *app);
- void (*on_draw)(struct application *app);
- void (*on_exit)(struct application *app);
+ int id;
+ char name[64];
+ char icon[32];
+ app_type_t type;
+ struct window *main_window;
+ void *app_data;
+
+ /* Lifecycle callbacks */
+ int (*on_init)(struct application *app);
+ void (*on_update)(struct application *app);
+ void (*on_draw)(struct application *app);
+ void (*on_exit)(struct application *app);
};
#define MAX_APPS 32
@@ -61,357 +63,381 @@ static int app_count = 0;
/* ===================================================================== */
/* Terminal Application */
-static int terminal_init(struct application *app)
-{
- app->main_window = gui_create_window("Terminal", 100, 100, 656, 424);
- if (!app->main_window) return -1;
-
- struct terminal *term = term_create(102 + 2, 100 + 30, 80, 24);
- app->app_data = term;
-
- return 0;
+static int terminal_init(struct application *app) {
+ app->main_window = gui_create_window("Terminal", 100, 100, 656, 424);
+ if (!app->main_window)
+ return -1;
+
+ struct terminal *term = term_create(102 + 2, 100 + 30, 80, 24);
+ app->app_data = term;
+
+ /* Set as active terminal so keyboard input works */
+ extern void term_set_active(struct terminal * term);
+ term_set_active(term);
+
+ return 0;
}
-static void terminal_draw(struct application *app)
-{
- if (app->app_data) {
- term_render(app->app_data);
- }
+static void terminal_draw(struct application *app) {
+ if (app->app_data) {
+ term_render(app->app_data);
+ }
}
/* File Manager Application */
-static int file_manager_init(struct application *app)
-{
- app->main_window = gui_create_window("Files", 200, 150, 600, 400);
- return 0;
+static int file_manager_init(struct application *app) {
+ app->main_window = gui_create_window("Files", 200, 150, 600, 400);
+ return 0;
}
-static void file_manager_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- /* TODO: Draw file list */
- gui_draw_string(210, 190, "/ (Root)", 0xCDD6F4, 0x1E1E2E);
- gui_draw_string(210, 210, " bin/", 0x89B4FA, 0x1E1E2E);
- gui_draw_string(210, 230, " etc/", 0x89B4FA, 0x1E1E2E);
- gui_draw_string(210, 250, " home/", 0x89B4FA, 0x1E1E2E);
- gui_draw_string(210, 270, " usr/", 0x89B4FA, 0x1E1E2E);
- gui_draw_string(210, 290, " var/", 0x89B4FA, 0x1E1E2E);
+static void file_manager_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ /* TODO: Draw file list */
+ gui_draw_string(210, 190, "/ (Root)", 0xCDD6F4, 0x1E1E2E);
+ gui_draw_string(210, 210, " bin/", 0x89B4FA, 0x1E1E2E);
+ gui_draw_string(210, 230, " etc/", 0x89B4FA, 0x1E1E2E);
+ gui_draw_string(210, 250, " home/", 0x89B4FA, 0x1E1E2E);
+ gui_draw_string(210, 270, " usr/", 0x89B4FA, 0x1E1E2E);
+ gui_draw_string(210, 290, " var/", 0x89B4FA, 0x1E1E2E);
}
/* Settings Application */
-static int settings_init(struct application *app)
-{
- app->main_window = gui_create_window("Settings", 250, 100, 500, 400);
- return 0;
+static int settings_init(struct application *app) {
+ app->main_window = gui_create_window("Settings", 250, 100, 500, 400);
+ return 0;
}
-static void settings_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- int y = 140;
- gui_draw_string(260, y, "Display", 0xCDD6F4, 0x1E1E2E); y += 30;
- gui_draw_string(270, y, "Resolution: 1920x1080", 0x808080, 0x1E1E2E); y += 20;
-
- y += 20;
- gui_draw_string(260, y, "Sound", 0xCDD6F4, 0x1E1E2E); y += 30;
- gui_draw_string(270, y, "Volume: 80%", 0x808080, 0x1E1E2E); y += 20;
-
- y += 20;
- gui_draw_string(260, y, "Network", 0xCDD6F4, 0x1E1E2E); y += 30;
- gui_draw_string(270, y, "Status: Connected", 0x808080, 0x1E1E2E); y += 20;
-
- y += 20;
- gui_draw_string(260, y, "About", 0xCDD6F4, 0x1E1E2E); y += 30;
- gui_draw_string(270, y, "Vib-OS v0.3.0", 0x808080, 0x1E1E2E); y += 20;
- gui_draw_string(270, y, "ARM64 Operating System", 0x808080, 0x1E1E2E);
+static void settings_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ int y = 140;
+ gui_draw_string(260, y, "Display", 0xCDD6F4, 0x1E1E2E);
+ y += 30;
+ gui_draw_string(270, y, "Resolution: 1920x1080", 0x808080, 0x1E1E2E);
+ y += 20;
+
+ y += 20;
+ gui_draw_string(260, y, "Sound", 0xCDD6F4, 0x1E1E2E);
+ y += 30;
+ gui_draw_string(270, y, "Volume: 80%", 0x808080, 0x1E1E2E);
+ y += 20;
+
+ y += 20;
+ gui_draw_string(260, y, "Network", 0xCDD6F4, 0x1E1E2E);
+ y += 30;
+ gui_draw_string(270, y, "Status: Connected", 0x808080, 0x1E1E2E);
+ y += 20;
+
+ y += 20;
+ gui_draw_string(260, y, "About", 0xCDD6F4, 0x1E1E2E);
+ y += 30;
+ gui_draw_string(270, y, "Vib-OS v0.3.0", 0x808080, 0x1E1E2E);
+ y += 20;
+ gui_draw_string(270, y, "ARM64 Operating System", 0x808080, 0x1E1E2E);
}
/* Simple Text Editor */
-static int editor_init(struct application *app)
-{
- app->main_window = gui_create_window("Text Editor", 150, 80, 700, 500);
- return 0;
+static int editor_init(struct application *app) {
+ app->main_window = gui_create_window("Text Editor", 150, 80, 700, 500);
+ return 0;
}
-static void editor_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- /* Toolbar */
- gui_draw_rect(152, 112, 696, 30, 0x313244);
- gui_draw_string(160, 118, "File Edit View Help", 0xCDD6F4, 0x313244);
-
- /* Status bar */
- gui_draw_rect(152, 550, 696, 24, 0x313244);
- gui_draw_string(160, 554, "Line 1, Col 1 | UTF-8", 0x808080, 0x313244);
+static void editor_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ /* Toolbar */
+ gui_draw_rect(152, 112, 696, 30, 0x313244);
+ gui_draw_string(160, 118, "File Edit View Help", 0xCDD6F4, 0x313244);
+
+ /* Status bar */
+ gui_draw_rect(152, 550, 696, 24, 0x313244);
+ gui_draw_string(160, 554, "Line 1, Col 1 | UTF-8", 0x808080, 0x313244);
}
/* Calculator Application */
typedef struct {
- long value;
- long pending;
- char op;
- int clear_next;
+ long value;
+ long pending;
+ char op;
+ int clear_next;
} calc_state_t;
static calc_state_t calc_state = {0, 0, 0, 0};
-static int calculator_init(struct application *app)
-{
- app->main_window = gui_create_window("Calculator", 300, 100, 200, 270);
- calc_state.value = 0;
- calc_state.pending = 0;
- calc_state.op = 0;
- calc_state.clear_next = 0;
- return 0;
+static int calculator_init(struct application *app) {
+ app->main_window = gui_create_window("Calculator", 300, 100, 200, 270);
+ calc_state.value = 0;
+ calc_state.pending = 0;
+ calc_state.op = 0;
+ calc_state.clear_next = 0;
+ return 0;
}
-static void long_to_str(long val, char *buf)
-{
- int idx = 0;
- char tmp[20];
- int is_neg = 0;
-
- if (val < 0) {
- is_neg = 1;
- val = -val;
- }
-
- if (val == 0) {
- buf[0] = '0';
- buf[1] = '\0';
- return;
- }
-
- while (val > 0 && idx < 18) {
- tmp[idx++] = '0' + (val % 10);
- val /= 10;
- }
-
- int bidx = 0;
- if (is_neg) buf[bidx++] = '-';
- while (idx > 0) {
- buf[bidx++] = tmp[--idx];
- }
- buf[bidx] = '\0';
+static void long_to_str(long val, char *buf) {
+ int idx = 0;
+ char tmp[20];
+ int is_neg = 0;
+
+ if (val < 0) {
+ is_neg = 1;
+ val = -val;
+ }
+
+ if (val == 0) {
+ buf[0] = '0';
+ buf[1] = '\0';
+ return;
+ }
+
+ while (val > 0 && idx < 18) {
+ tmp[idx++] = '0' + (val % 10);
+ val /= 10;
+ }
+
+ int bidx = 0;
+ if (is_neg)
+ buf[bidx++] = '-';
+ while (idx > 0) {
+ buf[bidx++] = tmp[--idx];
+ }
+ buf[bidx] = '\0';
}
-static void calculator_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- int base_x = 302; /* Window x + border */
- int base_y = 132; /* Window y + titlebar + border */
-
- /* Display */
- gui_draw_rect(base_x + 4, base_y, 190, 30, 0xFFFFFF);
-
- char display[20];
- long_to_str(calc_state.value, display);
- int len = 0;
- while (display[len]) len++;
- gui_draw_string(base_x + 190 - len * 8, base_y + 8, display, 0x000000, 0xFFFFFF);
-
- /* Button labels */
- static const char *btns[4][4] = {
- {"7", "8", "9", "/"},
- {"4", "5", "6", "*"},
- {"1", "2", "3", "-"},
- {"C", "0", "=", "+"}
- };
-
- int btn_w = 42;
- int btn_h = 36;
- int pad = 4;
-
- for (int row = 0; row < 4; row++) {
- for (int col = 0; col < 4; col++) {
- int bx = base_x + pad + col * (btn_w + pad);
- int by = base_y + 36 + row * (btn_h + pad);
-
- /* Button color */
- uint32_t bg = 0xE0E0E0;
- uint32_t fg = 0x000000;
- char c = btns[row][col][0];
- if (c == '/' || c == '*' || c == '-' || c == '+') {
- bg = 0xFF9500; /* Orange for operators */
- fg = 0xFFFFFF;
- } else if (c == 'C') {
- bg = 0xAAAAAA;
- }
-
- gui_draw_rect(bx, by, btn_w, btn_h, bg);
- gui_draw_string(bx + (btn_w - 8) / 2, by + (btn_h - 16) / 2, btns[row][col], fg, bg);
- }
+static void calculator_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ int base_x = 302; /* Window x + border */
+ int base_y = 132; /* Window y + titlebar + border */
+
+ /* Display */
+ gui_draw_rect(base_x + 4, base_y, 190, 30, 0xFFFFFF);
+
+ char display[20];
+ long_to_str(calc_state.value, display);
+ int len = 0;
+ while (display[len])
+ len++;
+ gui_draw_string(base_x + 190 - len * 8, base_y + 8, display, 0x000000,
+ 0xFFFFFF);
+
+ /* Button labels */
+ static const char *btns[4][4] = {{"7", "8", "9", "/"},
+ {"4", "5", "6", "*"},
+ {"1", "2", "3", "-"},
+ {"C", "0", "=", "+"}};
+
+ int btn_w = 42;
+ int btn_h = 36;
+ int pad = 4;
+
+ for (int row = 0; row < 4; row++) {
+ for (int col = 0; col < 4; col++) {
+ int bx = base_x + pad + col * (btn_w + pad);
+ int by = base_y + 36 + row * (btn_h + pad);
+
+ /* Button color */
+ uint32_t bg = 0xE0E0E0;
+ uint32_t fg = 0x000000;
+ char c = btns[row][col][0];
+ if (c == '/' || c == '*' || c == '-' || c == '+') {
+ bg = 0xFF9500; /* Orange for operators */
+ fg = 0xFFFFFF;
+ } else if (c == 'C') {
+ bg = 0xAAAAAA;
+ }
+
+ gui_draw_rect(bx, by, btn_w, btn_h, bg);
+ gui_draw_string(bx + (btn_w - 8) / 2, by + (btn_h - 16) / 2,
+ btns[row][col], fg, bg);
}
+ }
}
/* Paint Application */
-static int paint_init(struct application *app)
-{
- app->main_window = gui_create_window("Paint", 150, 80, 500, 400);
- return 0;
+static int paint_init(struct application *app) {
+ app->main_window = gui_create_window("Paint", 150, 80, 500, 400);
+ return 0;
}
-static void paint_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- int base_x = 152;
- int base_y = 112;
-
- /* Canvas area */
- gui_draw_rect(base_x + 4, base_y + 40, 490, 320, 0xFFFFFF);
-
- /* Toolbar */
- gui_draw_rect(base_x + 4, base_y, 490, 36, 0x404040);
- gui_draw_string(base_x + 10, base_y + 10, "Brush: [O] Line: [/] Rect: [#] Color: ", 0xFFFFFF, 0x404040);
-
- /* Color palette */
- int colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x000000};
- for (int i = 0; i < 5; i++) {
- gui_draw_rect(base_x + 360 + i * 24, base_y + 6, 20, 20, colors[i]);
- }
-
- /* Instructions */
- gui_draw_string(base_x + 150, base_y + 180, "Click and drag to draw!", 0x888888, 0xFFFFFF);
+static void paint_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ int base_x = 152;
+ int base_y = 112;
+
+ /* Canvas area */
+ gui_draw_rect(base_x + 4, base_y + 40, 490, 320, 0xFFFFFF);
+
+ /* Toolbar */
+ gui_draw_rect(base_x + 4, base_y, 490, 36, 0x404040);
+ gui_draw_string(base_x + 10, base_y + 10,
+ "Brush: [O] Line: [/] Rect: [#] Color: ", 0xFFFFFF,
+ 0x404040);
+
+ /* Color palette */
+ int colors[] = {0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x000000};
+ for (int i = 0; i < 5; i++) {
+ gui_draw_rect(base_x + 360 + i * 24, base_y + 6, 20, 20, colors[i]);
+ }
+
+ /* Instructions */
+ gui_draw_string(base_x + 150, base_y + 180, "Click and drag to draw!",
+ 0x888888, 0xFFFFFF);
}
/* Help Application */
-static int help_init(struct application *app)
-{
- app->main_window = gui_create_window("Help", 200, 100, 400, 350);
- return 0;
+static int help_init(struct application *app) {
+ app->main_window = gui_create_window("Help", 200, 100, 400, 350);
+ return 0;
}
-static void help_draw(struct application *app)
-{
- if (!app->main_window) return;
-
- int base_x = 202;
- int base_y = 132;
- int y = base_y;
-
- gui_draw_string(base_x + 10, y, "Vib-OS Help", 0x89B4FA, 0x1E1E2E); y += 24;
- gui_draw_string(base_x + 10, y, "================", 0x89B4FA, 0x1E1E2E); y += 24;
-
- gui_draw_string(base_x + 10, y, "Mouse:", 0xF9E2AF, 0x1E1E2E); y += 20;
- gui_draw_string(base_x + 20, y, "- Click dock icons to launch apps", 0xCDD6F4, 0x1E1E2E); y += 16;
- gui_draw_string(base_x + 20, y, "- Drag window title bars to move", 0xCDD6F4, 0x1E1E2E); y += 16;
- gui_draw_string(base_x + 20, y, "- Click window close button to exit", 0xCDD6F4, 0x1E1E2E); y += 24;
-
- gui_draw_string(base_x + 10, y, "Terminal:", 0xF9E2AF, 0x1E1E2E); y += 20;
- gui_draw_string(base_x + 20, y, "- Type 'help' for commands", 0xCDD6F4, 0x1E1E2E); y += 16;
- gui_draw_string(base_x + 20, y, "- Type 'neofetch' for system info", 0xCDD6F4, 0x1E1E2E); y += 24;
-
- gui_draw_string(base_x + 10, y, "Dock Apps:", 0xF9E2AF, 0x1E1E2E); y += 20;
- gui_draw_string(base_x + 20, y, "Terminal, Files, Calculator, Paint", 0xCDD6F4, 0x1E1E2E); y += 24;
-
- gui_draw_string(base_x + 10, y, "Copyright 2026 Vib-OS Project", 0x585B70, 0x1E1E2E);
+static void help_draw(struct application *app) {
+ if (!app->main_window)
+ return;
+
+ int base_x = 202;
+ int base_y = 132;
+ int y = base_y;
+
+ gui_draw_string(base_x + 10, y, "Vib-OS Help", 0x89B4FA, 0x1E1E2E);
+ y += 24;
+ gui_draw_string(base_x + 10, y, "================", 0x89B4FA, 0x1E1E2E);
+ y += 24;
+
+ gui_draw_string(base_x + 10, y, "Mouse:", 0xF9E2AF, 0x1E1E2E);
+ y += 20;
+ gui_draw_string(base_x + 20, y, "- Click dock icons to launch apps", 0xCDD6F4,
+ 0x1E1E2E);
+ y += 16;
+ gui_draw_string(base_x + 20, y, "- Drag window title bars to move", 0xCDD6F4,
+ 0x1E1E2E);
+ y += 16;
+ gui_draw_string(base_x + 20, y, "- Click window close button to exit",
+ 0xCDD6F4, 0x1E1E2E);
+ y += 24;
+
+ gui_draw_string(base_x + 10, y, "Terminal:", 0xF9E2AF, 0x1E1E2E);
+ y += 20;
+ gui_draw_string(base_x + 20, y, "- Type 'help' for commands", 0xCDD6F4,
+ 0x1E1E2E);
+ y += 16;
+ gui_draw_string(base_x + 20, y, "- Type 'neofetch' for system info", 0xCDD6F4,
+ 0x1E1E2E);
+ y += 24;
+
+ gui_draw_string(base_x + 10, y, "Dock Apps:", 0xF9E2AF, 0x1E1E2E);
+ y += 20;
+ gui_draw_string(base_x + 20, y, "Terminal, Files, Calculator, Paint",
+ 0xCDD6F4, 0x1E1E2E);
+ y += 24;
+
+ gui_draw_string(base_x + 10, y, "Copyright 2026 Vib-OS Project", 0x585B70,
+ 0x1E1E2E);
}
/* ===================================================================== */
/* Application Launcher */
/* ===================================================================== */
-struct application *app_launch(const char *name, app_type_t type)
-{
- if (app_count >= MAX_APPS) {
- printk(KERN_ERR "APP: Max applications reached\n");
- return NULL;
- }
-
- struct application *app = &apps[app_count++];
- app->id = app_count;
-
- for (int i = 0; i < 63 && name[i]; i++) {
- app->name[i] = name[i];
- app->name[i + 1] = '\0';
- }
-
- app->type = type;
- app->app_data = NULL;
-
- /* Set up callbacks based on type */
- switch (type) {
- case APP_TYPE_TERMINAL:
- app->on_init = terminal_init;
- app->on_draw = terminal_draw;
- break;
- case APP_TYPE_FILE_MANAGER:
- app->on_init = file_manager_init;
- app->on_draw = file_manager_draw;
- break;
- case APP_TYPE_SETTINGS:
- app->on_init = settings_init;
- app->on_draw = settings_draw;
- break;
- case APP_TYPE_TEXT_EDITOR:
- app->on_init = editor_init;
- app->on_draw = editor_draw;
- break;
- case APP_TYPE_CALCULATOR:
- app->on_init = calculator_init;
- app->on_draw = calculator_draw;
- break;
- case APP_TYPE_PAINT:
- app->on_init = paint_init;
- app->on_draw = paint_draw;
- break;
- case APP_TYPE_HELP:
- app->on_init = help_init;
- app->on_draw = help_draw;
- break;
- default:
- break;
- }
-
- /* Initialize */
- if (app->on_init) {
- if (app->on_init(app) < 0) {
- app_count--;
- return NULL;
- }
+struct application *app_launch(const char *name, app_type_t type) {
+ if (app_count >= MAX_APPS) {
+ printk(KERN_ERR "APP: Max applications reached\n");
+ return NULL;
+ }
+
+ struct application *app = &apps[app_count++];
+ app->id = app_count;
+
+ for (int i = 0; i < 63 && name[i]; i++) {
+ app->name[i] = name[i];
+ app->name[i + 1] = '\0';
+ }
+
+ app->type = type;
+ app->app_data = NULL;
+
+ /* Set up callbacks based on type */
+ switch (type) {
+ case APP_TYPE_TERMINAL:
+ app->on_init = terminal_init;
+ app->on_draw = terminal_draw;
+ break;
+ case APP_TYPE_FILE_MANAGER:
+ app->on_init = file_manager_init;
+ app->on_draw = file_manager_draw;
+ break;
+ case APP_TYPE_SETTINGS:
+ app->on_init = settings_init;
+ app->on_draw = settings_draw;
+ break;
+ case APP_TYPE_TEXT_EDITOR:
+ app->on_init = editor_init;
+ app->on_draw = editor_draw;
+ break;
+ case APP_TYPE_CALCULATOR:
+ app->on_init = calculator_init;
+ app->on_draw = calculator_draw;
+ break;
+ case APP_TYPE_PAINT:
+ app->on_init = paint_init;
+ app->on_draw = paint_draw;
+ break;
+ case APP_TYPE_HELP:
+ app->on_init = help_init;
+ app->on_draw = help_draw;
+ break;
+ default:
+ break;
+ }
+
+ /* Initialize */
+ if (app->on_init) {
+ if (app->on_init(app) < 0) {
+ app_count--;
+ return NULL;
}
-
- printk(KERN_INFO "APP: Launched '%s'\n", name);
-
- return app;
+ }
+
+ printk(KERN_INFO "APP: Launched '%s'\n", name);
+
+ return app;
}
-void app_close(struct application *app)
-{
- if (!app) return;
-
- if (app->on_exit) {
- app->on_exit(app);
- }
-
- if (app->main_window) {
- gui_destroy_window(app->main_window);
- }
-
- app->id = 0;
+void app_close(struct application *app) {
+ if (!app)
+ return;
+
+ if (app->on_exit) {
+ app->on_exit(app);
+ }
+
+ if (app->main_window) {
+ gui_destroy_window(app->main_window);
+ }
+
+ app->id = 0;
}
-void app_update_all(void)
-{
- for (int i = 0; i < app_count; i++) {
- if (apps[i].id > 0 && apps[i].on_update) {
- apps[i].on_update(&apps[i]);
- }
+void app_update_all(void) {
+ for (int i = 0; i < app_count; i++) {
+ if (apps[i].id > 0 && apps[i].on_update) {
+ apps[i].on_update(&apps[i]);
}
+ }
}
-void app_draw_all(void)
-{
- for (int i = 0; i < app_count; i++) {
- if (apps[i].id > 0 && apps[i].on_draw) {
- apps[i].on_draw(&apps[i]);
- }
+void app_draw_all(void) {
+ for (int i = 0; i < app_count; i++) {
+ if (apps[i].id > 0 && apps[i].on_draw) {
+ apps[i].on_draw(&apps[i]);
}
+ }
}
/* ===================================================================== */
@@ -419,83 +445,79 @@ void app_draw_all(void)
/* ===================================================================== */
struct launcher_item {
- char name[32];
- char icon[32];
- app_type_t type;
- int x, y;
+ char name[32];
+ char icon[32];
+ app_type_t type;
+ int x, y;
};
#define MAX_LAUNCHER_ITEMS 16
static struct launcher_item launcher_items[MAX_LAUNCHER_ITEMS];
static int launcher_count = 0;
-void launcher_add_item(const char *name, const char *icon, app_type_t type)
-{
- if (launcher_count >= MAX_LAUNCHER_ITEMS) return;
-
- struct launcher_item *item = &launcher_items[launcher_count];
-
- for (int i = 0; i < 31 && name[i]; i++) {
- item->name[i] = name[i];
- item->name[i + 1] = '\0';
- }
-
- for (int i = 0; i < 31 && icon[i]; i++) {
- item->icon[i] = icon[i];
- item->icon[i + 1] = '\0';
- }
-
- item->type = type;
-
- /* Position on desktop grid */
- item->x = 20 + (launcher_count % 6) * 100;
- item->y = 20 + (launcher_count / 6) * 100;
-
- launcher_count++;
+void launcher_add_item(const char *name, const char *icon, app_type_t type) {
+ if (launcher_count >= MAX_LAUNCHER_ITEMS)
+ return;
+
+ struct launcher_item *item = &launcher_items[launcher_count];
+
+ for (int i = 0; i < 31 && name[i]; i++) {
+ item->name[i] = name[i];
+ item->name[i + 1] = '\0';
+ }
+
+ for (int i = 0; i < 31 && icon[i]; i++) {
+ item->icon[i] = icon[i];
+ item->icon[i + 1] = '\0';
+ }
+
+ item->type = type;
+
+ /* Position on desktop grid */
+ item->x = 20 + (launcher_count % 6) * 100;
+ item->y = 20 + (launcher_count / 6) * 100;
+
+ launcher_count++;
}
-void launcher_draw(void)
-{
- for (int i = 0; i < launcher_count; i++) {
- struct launcher_item *item = &launcher_items[i];
-
- /* Draw icon background */
- gui_draw_rect(item->x, item->y, 64, 64, 0x313244);
-
- /* Draw icon (placeholder) */
- gui_draw_string(item->x + 20, item->y + 24, item->icon, 0xFFFFFF, 0x313244);
-
- /* Draw name */
- gui_draw_string(item->x, item->y + 68, item->name, 0xCDD6F4, 0x1E1E2E);
- }
+void launcher_draw(void) {
+ for (int i = 0; i < launcher_count; i++) {
+ struct launcher_item *item = &launcher_items[i];
+
+ /* Draw icon background */
+ gui_draw_rect(item->x, item->y, 64, 64, 0x313244);
+
+ /* Draw icon (placeholder) */
+ gui_draw_string(item->x + 20, item->y + 24, item->icon, 0xFFFFFF, 0x313244);
+
+ /* Draw name */
+ gui_draw_string(item->x, item->y + 68, item->name, 0xCDD6F4, 0x1E1E2E);
+ }
}
-void launcher_handle_click(int x, int y)
-{
- for (int i = 0; i < launcher_count; i++) {
- struct launcher_item *item = &launcher_items[i];
-
- if (x >= item->x && x < item->x + 64 &&
- y >= item->y && y < item->y + 100) {
- app_launch(item->name, item->type);
- return;
- }
+void launcher_handle_click(int x, int y) {
+ for (int i = 0; i < launcher_count; i++) {
+ struct launcher_item *item = &launcher_items[i];
+
+ if (x >= item->x && x < item->x + 64 && y >= item->y && y < item->y + 100) {
+ app_launch(item->name, item->type);
+ return;
}
+ }
}
/* ===================================================================== */
/* Desktop Initialization */
/* ===================================================================== */
-void desktop_init(void)
-{
- printk(KERN_INFO "DESKTOP: Initializing desktop environment\n");
-
- /* Add desktop icons */
- launcher_add_item("Terminal", ">_", APP_TYPE_TERMINAL);
- launcher_add_item("Files", "[]", APP_TYPE_FILE_MANAGER);
- launcher_add_item("Editor", "=", APP_TYPE_TEXT_EDITOR);
- launcher_add_item("Settings", "@", APP_TYPE_SETTINGS);
-
- printk(KERN_INFO "DESKTOP: %d launcher items created\n", launcher_count);
+void desktop_init(void) {
+ printk(KERN_INFO "DESKTOP: Initializing desktop environment\n");
+
+ /* Add desktop icons */
+ launcher_add_item("Terminal", ">_", APP_TYPE_TERMINAL);
+ launcher_add_item("Files", "[]", APP_TYPE_FILE_MANAGER);
+ launcher_add_item("Editor", "=", APP_TYPE_TEXT_EDITOR);
+ launcher_add_item("Settings", "@", APP_TYPE_SETTINGS);
+
+ printk(KERN_INFO "DESKTOP: %d launcher items created\n", launcher_count);
}
diff --git a/kernel/gui/desktop.c b/kernel/gui/desktop.c
new file mode 100644
index 0000000..afd4301
--- /dev/null
+++ b/kernel/gui/desktop.c
@@ -0,0 +1,1432 @@
+/*
+ * Vib-OS - Desktop Manager
+ *
+ * macOS-style desktop with file/folder icons, right-click menus,
+ * sorting, stacking, and full file operations.
+ */
+
+#include "fs/vfs.h"
+#include "mm/kmalloc.h"
+#include "printk.h"
+#include "types.h"
+
+/* External GUI functions */
+extern void gui_draw_rect(int x, int y, int w, int h, uint32_t color);
+extern void gui_draw_rect_outline(int x, int y, int w, int h, uint32_t color,
+ int thickness);
+extern void gui_draw_string(int x, int y, const char *str, uint32_t fg,
+ uint32_t bg);
+extern void gui_draw_char(int x, int y, char c, uint32_t fg, uint32_t bg);
+extern void gui_draw_line(int x, int y, int x2, int y2, uint32_t color);
+
+/* External window functions */
+struct window; /* Forward declare */
+extern struct window *gui_create_window(const char *title, int x, int y, int w,
+ int h);
+extern struct window *gui_create_file_manager_path(int x, int y,
+ const char *path);
+extern uint32_t gui_get_screen_width(void);
+extern uint32_t gui_get_screen_height(void);
+extern void gui_open_image_viewer(const char *path);
+extern void gui_open_notepad(const char *path);
+extern void gui_set_window_userdata(struct window *win, void *data);
+
+/* External terminal functions */
+struct terminal; /* Forward declare */
+extern struct terminal *term_create(int x, int y, int cols, int rows);
+extern void term_set_active(struct terminal *term);
+extern void term_puts(struct terminal *term, const char *str);
+extern void term_execute_command(struct terminal *term, const char *cmd);
+extern void term_set_content_pos(struct terminal *t, int x, int y);
+
+/* Forward declarations */
+void desktop_sort_icons(void);
+void desktop_arrange_icons(void);
+
+/* ===================================================================== */
+/* Desktop Constants */
+/* ===================================================================== */
+
+#define DESKTOP_PATH "/Desktop"
+#define DESKTOP_ICON_SIZE 64
+#define DESKTOP_ICON_SPACING 90
+#define DESKTOP_ICON_PADDING 20
+#define DESKTOP_LABEL_HEIGHT 24
+#define DESKTOP_MAX_ICONS 128
+#define DESKTOP_START_X 20
+#define DESKTOP_START_Y 50 /* Below menu bar */
+
+/* Icon Types */
+#define ICON_TYPE_FILE 0
+#define ICON_TYPE_FOLDER 1
+#define ICON_TYPE_IMAGE 2
+#define ICON_TYPE_AUDIO 3
+#define ICON_TYPE_TEXT 4
+#define ICON_TYPE_APP 5
+#define ICON_TYPE_PYTHON 6
+#define ICON_TYPE_NANO 7
+
+/* Sort Modes */
+#define SORT_NAME 0
+#define SORT_DATE 1
+#define SORT_TYPE 2
+#define SORT_SIZE 3
+
+/* Colors */
+#define COLOR_ICON_SELECTED 0x0078D4
+#define COLOR_ICON_HOVER 0x3399FF
+#define COLOR_MENU_BG 0x2D2D2D
+#define COLOR_MENU_BORDER 0x5C5C5C
+#define COLOR_MENU_HOVER 0x0078D4 /* Bright blue hover like Windows */
+#define COLOR_MENU_TEXT 0xFFFFFF
+#define COLOR_LABEL_BG 0x00000080 /* Semi-transparent */
+
+/* ===================================================================== */
+/* Desktop Icon Structure */
+/* ===================================================================== */
+
+typedef struct desktop_icon {
+ char name[64];
+ char path[256];
+ int type;
+ int x, y; /* Position on desktop */
+ int grid_x, grid_y; /* Grid slot */
+ int selected;
+ int stacked; /* Part of a stack */
+ uint64_t size;
+ uint64_t mtime;
+} desktop_icon_t;
+
+/* ===================================================================== */
+/* Context Menu Structure */
+/* ===================================================================== */
+
+typedef struct menu_item {
+ char label[32];
+ int enabled;
+ int separator; /* Draw separator after this item */
+ void (*action)(void *ctx);
+} menu_item_t;
+
+typedef struct context_menu {
+ int x, y;
+ int width, height;
+ int visible;
+ int hover_index;
+ menu_item_t items[16];
+ int item_count;
+ void *context; /* Context data for actions */
+} context_menu_t;
+
+/* ===================================================================== */
+/* Desktop State */
+/* ===================================================================== */
+
+static desktop_icon_t desktop_icons[DESKTOP_MAX_ICONS];
+static int desktop_icon_count = 0;
+static int desktop_sort_mode = SORT_NAME;
+static int desktop_show_hidden = 0;
+static int desktop_stacks_enabled = 0;
+static int desktop_selected_count = 0;
+static int desktop_last_click_x = 0;
+static int desktop_last_click_y = 0;
+static uint64_t desktop_last_click_time = 0;
+
+/* Context menu */
+static context_menu_t ctx_menu = {0};
+
+/* Clipboard for copy/paste */
+static char clipboard_path[256] = {0};
+static int clipboard_is_cut = 0;
+
+/* Inline rename state (macOS-style) */
+static int rename_active = 0;
+static int rename_icon_idx = -1;
+static char rename_buffer[64] = {0};
+static int rename_cursor = 0;
+
+/* Dirty region tracking for performance */
+typedef struct dirty_rect {
+ int x, y, w, h;
+ int valid;
+} dirty_rect_t;
+
+static dirty_rect_t dirty_regions[32];
+static int dirty_count = 0;
+static int full_redraw_needed = 1;
+
+/* ===================================================================== */
+/* Helper Functions */
+/* ===================================================================== */
+
+static int str_cmp(const char *a, const char *b) {
+ while (*a && *b && *a == *b) {
+ a++;
+ b++;
+ }
+ return (unsigned char)*a - (unsigned char)*b;
+}
+
+static int str_cmp_nocase(const char *a, const char *b) {
+ while (*a && *b) {
+ char ca = (*a >= 'A' && *a <= 'Z') ? *a + 32 : *a;
+ char cb = (*b >= 'A' && *b <= 'Z') ? *b + 32 : *b;
+ if (ca != cb)
+ return ca - cb;
+ a++;
+ b++;
+ }
+ return (unsigned char)*a - (unsigned char)*b;
+}
+
+static void str_copy(char *dst, const char *src, int max) {
+ int i = 0;
+ while (src[i] && i < max - 1) {
+ dst[i] = src[i];
+ i++;
+ }
+ dst[i] = '\0';
+}
+
+static int str_ends_with(const char *str, const char *suffix) {
+ int len_str = 0, len_suf = 0;
+ while (str[len_str])
+ len_str++;
+ while (suffix[len_suf])
+ len_suf++;
+ if (len_suf > len_str)
+ return 0;
+
+ for (int i = 0; i < len_suf; i++) {
+ char a = str[len_str - len_suf + i];
+ char b = suffix[i];
+ if (a >= 'A' && a <= 'Z')
+ a += 32;
+ if (b >= 'A' && b <= 'Z')
+ b += 32;
+ if (a != b)
+ return 0;
+ }
+ return 1;
+}
+
+static int get_icon_type(const char *name, int is_dir) {
+ if (is_dir)
+ return ICON_TYPE_FOLDER;
+ if (str_ends_with(name, ".jpg") || str_ends_with(name, ".jpeg") ||
+ str_ends_with(name, ".png") || str_ends_with(name, ".bmp"))
+ return ICON_TYPE_IMAGE;
+ if (str_ends_with(name, ".mp3") || str_ends_with(name, ".wav") ||
+ str_ends_with(name, ".ogg"))
+ return ICON_TYPE_AUDIO;
+ if (str_ends_with(name, ".txt") || str_ends_with(name, ".md") ||
+ str_ends_with(name, ".c") || str_ends_with(name, ".h"))
+ return ICON_TYPE_TEXT;
+ if (str_ends_with(name, ".py"))
+ return ICON_TYPE_PYTHON;
+ if (str_ends_with(name, ".nano"))
+ return ICON_TYPE_NANO;
+ if (str_ends_with(name, ".app") || str_ends_with(name, ".exe"))
+ return ICON_TYPE_APP;
+ return ICON_TYPE_FILE;
+}
+
+/* ===================================================================== */
+/* Dirty Region Tracking */
+/* ===================================================================== */
+
+void desktop_mark_dirty(int x, int y, int w, int h) {
+ if (dirty_count < 32) {
+ dirty_regions[dirty_count].x = x;
+ dirty_regions[dirty_count].y = y;
+ dirty_regions[dirty_count].w = w;
+ dirty_regions[dirty_count].h = h;
+ dirty_regions[dirty_count].valid = 1;
+ dirty_count++;
+ } else {
+ /* Too many dirty regions, trigger full redraw */
+ full_redraw_needed = 1;
+ }
+
+ /* Also notify the compositor to update this region */
+ extern void compositor_mark_dirty(int x, int y, int w, int h);
+ compositor_mark_dirty(x, y, w, h);
+}
+
+void desktop_mark_full_redraw(void) {
+ full_redraw_needed = 1;
+ dirty_count = 0;
+}
+
+int desktop_needs_redraw(void) { return full_redraw_needed || dirty_count > 0; }
+
+void desktop_clear_dirty(void) {
+ dirty_count = 0;
+ full_redraw_needed = 0;
+}
+
+/* ===================================================================== */
+/* Desktop Icon Drawing */
+/* ===================================================================== */
+
+static void draw_folder_icon(int x, int y, int size, uint32_t color) {
+ int w = size;
+ int h = size * 3 / 4;
+ int tab_w = w / 3;
+ int tab_h = h / 6;
+ int y_start = y + (size - h) / 2;
+
+ /* Folder tab */
+ gui_draw_rect(x, y_start, tab_w, tab_h, color);
+
+ /* Folder body */
+ gui_draw_rect(x, y_start + tab_h - 2, w, h - tab_h + 2, color);
+
+ /* Darker front */
+ gui_draw_rect(x + 2, y_start + tab_h + h / 4, w - 4, h / 2,
+ (color & 0xFEFEFE) >> 1);
+}
+
+static void draw_file_icon(int x, int y, int size, uint32_t color) {
+ int w = size * 3 / 4;
+ int h = size;
+ int fold = size / 4;
+ int x_start = x + (size - w) / 2;
+
+ /* Main document */
+ gui_draw_rect(x_start, y, w - fold, h, color);
+ gui_draw_rect(x_start + w - fold, y + fold, fold, h - fold, color);
+
+ /* Folded corner */
+ gui_draw_rect(x_start + w - fold, y, fold, fold, (color & 0xFEFEFE) >> 1);
+
+ /* Lines on document */
+ uint32_t line_color = (color & 0xFEFEFE) >> 1;
+ for (int i = 0; i < 4; i++) {
+ int ly = y + h / 3 + i * (h / 8);
+ gui_draw_rect(x_start + 4, ly, w - fold - 8, 2, line_color);
+ }
+}
+
+static void draw_image_icon(int x, int y, int size) {
+ /* Blue background with mountain/sun */
+ gui_draw_rect(x + 4, y + 4, size - 8, size - 8, 0x87CEEB);
+
+ /* Sun */
+ gui_draw_rect(x + size - 20, y + 10, 10, 10, 0xFFD700);
+
+ /* Mountain */
+ for (int i = 0; i < 20; i++) {
+ int mw = i * 2;
+ gui_draw_rect(x + size / 2 - mw / 2, y + size - 15 - i, mw, 1, 0x228B22);
+ }
+}
+
+static void draw_audio_icon(int x, int y, int size) {
+ /* Music note */
+ int cx = x + size / 2;
+ int cy = y + size / 2;
+
+ /* Note head */
+ gui_draw_rect(cx - 8, cy + 10, 12, 8, 0xFF6B6B);
+ gui_draw_rect(cx + 4, cy + 5, 12, 8, 0xFF6B6B);
+
+ /* Note stem */
+ gui_draw_rect(cx + 2, cy - 15, 3, 28, 0x333333);
+ gui_draw_rect(cx + 14, cy - 20, 3, 28, 0x333333);
+
+ /* Flag */
+ gui_draw_rect(cx + 5, cy - 15, 12, 3, 0x333333);
+}
+
+static void draw_desktop_icon(desktop_icon_t *icon) {
+ int x = icon->x;
+ int y = icon->y;
+ int icon_idx = -1;
+
+ /* Find icon index */
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (&desktop_icons[i] == icon) {
+ icon_idx = i;
+ break;
+ }
+ }
+
+ /* Selection highlight */
+ if (icon->selected) {
+ gui_draw_rect(x - 4, y - 4, DESKTOP_ICON_SIZE + 8,
+ DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT + 8,
+ COLOR_ICON_SELECTED);
+ }
+
+ /* Draw icon based on type */
+ switch (icon->type) {
+ case ICON_TYPE_FOLDER:
+ draw_folder_icon(x, y, DESKTOP_ICON_SIZE, 0x4FC3F7);
+ break;
+ case ICON_TYPE_IMAGE:
+ draw_image_icon(x, y, DESKTOP_ICON_SIZE);
+ break;
+ case ICON_TYPE_AUDIO:
+ draw_audio_icon(x, y, DESKTOP_ICON_SIZE);
+ break;
+ case ICON_TYPE_TEXT:
+ draw_file_icon(x, y, DESKTOP_ICON_SIZE, 0xFFFFFF);
+ break;
+ default:
+ draw_file_icon(x, y, DESKTOP_ICON_SIZE, 0xE0E0E0);
+ break;
+ }
+
+ /* Draw label with background */
+ int label_x = x + DESKTOP_ICON_SIZE / 2;
+ int label_y = y + DESKTOP_ICON_SIZE + 4;
+
+ /* Check if this icon is being renamed */
+ if (rename_active && icon_idx == rename_icon_idx) {
+ /* Draw editable text box for rename (macOS style) */
+ int buf_len = 0;
+ while (rename_buffer[buf_len])
+ buf_len++;
+ int edit_width = (buf_len + 2) * 8;
+ if (edit_width < 80)
+ edit_width = 80;
+ int edit_x = label_x - edit_width / 2;
+
+ /* White edit box with blue border */
+ gui_draw_rect(edit_x - 2, label_y - 2, edit_width + 4, 18, 0x0078D4);
+ gui_draw_rect(edit_x, label_y, edit_width, 14, 0xFFFFFF);
+
+ /* Text */
+ gui_draw_string(edit_x + 2, label_y + 2, rename_buffer, 0x000000, 0xFFFFFF);
+
+ /* Cursor */
+ int cursor_x = edit_x + 2 + rename_cursor * 8;
+ gui_draw_rect(cursor_x, label_y + 1, 2, 12, 0x000000);
+ } else {
+ /* Normal label display */
+ char display_name[16];
+ int len = 0;
+ while (icon->name[len] && len < 12) {
+ display_name[len] = icon->name[len];
+ len++;
+ }
+ if (icon->name[len]) {
+ display_name[len++] = '.';
+ display_name[len++] = '.';
+ }
+ display_name[len] = '\0';
+
+ /* Center label */
+ int text_width = len * 8;
+ int text_x = label_x - text_width / 2;
+
+ /* Label background */
+ gui_draw_rect(text_x - 2, label_y, text_width + 4, 14, 0x000000);
+
+ /* Label text */
+ gui_draw_string(text_x, label_y + 2, display_name, 0xFFFFFF, 0x000000);
+ }
+}
+
+/* ===================================================================== */
+/* Context Menu */
+/* ===================================================================== */
+
+/* Forward declarations for menu actions */
+static void menu_action_open(void *ctx);
+static void menu_action_open_with(void *ctx);
+static void menu_action_new_folder(void *ctx);
+static void menu_action_new_file(void *ctx);
+static void menu_action_new_shortcut(void *ctx);
+static void menu_action_rename(void *ctx);
+static void menu_action_delete(void *ctx);
+static void menu_action_copy(void *ctx);
+static void menu_action_cut(void *ctx);
+static void menu_action_paste(void *ctx);
+static void menu_action_paste_shortcut(void *ctx);
+static void menu_action_properties(void *ctx);
+static void menu_action_sort_name(void *ctx);
+static void menu_action_sort_date(void *ctx);
+static void menu_action_sort_type(void *ctx);
+static void menu_action_sort_size(void *ctx);
+static void menu_action_refresh(void *ctx);
+static void menu_action_view_icons(void *ctx);
+static void menu_action_view_list(void *ctx);
+static void menu_action_select_all(void *ctx);
+static void menu_action_personalize(void *ctx);
+static void menu_action_display_settings(void *ctx);
+static void menu_action_terminal_here(void *ctx);
+static void menu_action_change_background(void *ctx);
+
+static void ctx_menu_add_item(const char *label, void (*action)(void *),
+ int enabled) {
+ if (ctx_menu.item_count >= 16)
+ return;
+ menu_item_t *item = &ctx_menu.items[ctx_menu.item_count++];
+ str_copy(item->label, label, 32);
+ item->action = action;
+ item->enabled = enabled;
+ item->separator = 0;
+}
+
+static void ctx_menu_add_separator(void) {
+ if (ctx_menu.item_count > 0) {
+ ctx_menu.items[ctx_menu.item_count - 1].separator = 1;
+ }
+}
+
+void desktop_show_context_menu(int x, int y, int on_icon) {
+ ctx_menu.item_count = 0;
+ ctx_menu.x = x;
+ ctx_menu.y = y;
+ ctx_menu.hover_index = -1;
+ ctx_menu.visible = 1;
+
+ printk(KERN_INFO "MENU: Showing context menu at %d,%d visible=%d\n", x, y,
+ ctx_menu.visible);
+
+ if (on_icon) {
+ /* Context menu for selected file/folder - only working items */
+ ctx_menu_add_item("Open", menu_action_open, 1);
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Cut", menu_action_cut, 1);
+ ctx_menu_add_item("Copy", menu_action_copy, 1);
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Delete", menu_action_delete, 1);
+ ctx_menu_add_item("Rename", menu_action_rename,
+ desktop_selected_count == 1);
+ } else {
+ /* Context menu for desktop background - only working items */
+ ctx_menu_add_item("New Folder", menu_action_new_folder, 1);
+ ctx_menu_add_item("New Text Document", menu_action_new_file, 1);
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Paste", menu_action_paste, clipboard_path[0] != '\0');
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Sort by Name", menu_action_sort_name, 1);
+ ctx_menu_add_item("Sort by Type", menu_action_sort_type, 1);
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Refresh", menu_action_refresh, 1);
+ ctx_menu_add_item("Open Terminal", menu_action_terminal_here, 1);
+ ctx_menu_add_separator();
+ ctx_menu_add_item("Change Background", menu_action_change_background, 1);
+ }
+
+ /* Calculate menu size */
+ ctx_menu.width = 160;
+ ctx_menu.height = ctx_menu.item_count * 24 + 8;
+
+ /* Add space for separators */
+ for (int i = 0; i < ctx_menu.item_count; i++) {
+ if (ctx_menu.items[i].separator) {
+ ctx_menu.height += 8;
+ }
+ }
+
+ /* Ensure menu stays on screen */
+ uint32_t screen_w = gui_get_screen_width();
+ uint32_t screen_h = gui_get_screen_height();
+
+ if (x + ctx_menu.width > (int)screen_w) {
+ ctx_menu.x = screen_w - ctx_menu.width - 4;
+ }
+ if (y + ctx_menu.height > (int)screen_h - 70) {
+ ctx_menu.y = screen_h - 70 - ctx_menu.height - 4;
+ }
+
+ desktop_mark_dirty(ctx_menu.x, ctx_menu.y, ctx_menu.width + 4,
+ ctx_menu.height + 4);
+}
+
+void desktop_hide_context_menu(void) {
+ if (ctx_menu.visible) {
+ desktop_mark_dirty(ctx_menu.x, ctx_menu.y, ctx_menu.width + 4,
+ ctx_menu.height + 4);
+ ctx_menu.visible = 0;
+ }
+}
+
+void draw_context_menu(void) {
+ if (!ctx_menu.visible)
+ return;
+
+ int x = ctx_menu.x;
+ int y = ctx_menu.y;
+ int w = ctx_menu.width;
+
+ /* Shadow */
+ gui_draw_rect(x + 4, y + 4, w, ctx_menu.height, 0x000000);
+
+ /* Background */
+ gui_draw_rect(x, y, w, ctx_menu.height, COLOR_MENU_BG);
+ gui_draw_rect_outline(x, y, w, ctx_menu.height, COLOR_MENU_BORDER, 1);
+
+ /* Items */
+ int item_y = y + 4;
+ for (int i = 0; i < ctx_menu.item_count; i++) {
+ menu_item_t *item = &ctx_menu.items[i];
+
+ /* Hover highlight */
+ if (i == ctx_menu.hover_index && item->enabled) {
+ gui_draw_rect(x + 2, item_y, w - 4, 22, COLOR_MENU_HOVER);
+ }
+
+ /* Text */
+ uint32_t text_color = item->enabled ? COLOR_MENU_TEXT : 0x808080;
+ gui_draw_string(x + 12, item_y + 4, item->label, text_color,
+ (i == ctx_menu.hover_index && item->enabled)
+ ? COLOR_MENU_HOVER
+ : COLOR_MENU_BG);
+
+ item_y += 24;
+
+ /* Separator */
+ if (item->separator) {
+ gui_draw_line(x + 8, item_y, x + w - 8, item_y, 0x555555);
+ item_y += 8;
+ }
+ }
+}
+
+int desktop_context_menu_click(int mx, int my) {
+ if (!ctx_menu.visible)
+ return 0;
+
+ /* Check if click is inside menu */
+ if (mx < ctx_menu.x || mx >= ctx_menu.x + ctx_menu.width || my < ctx_menu.y ||
+ my >= ctx_menu.y + ctx_menu.height) {
+ desktop_hide_context_menu();
+ return 1; /* Consumed click to close menu */
+ }
+
+ /* Find clicked item */
+ int item_y = ctx_menu.y + 4;
+ for (int i = 0; i < ctx_menu.item_count; i++) {
+ menu_item_t *item = &ctx_menu.items[i];
+
+ if (my >= item_y && my < item_y + 24) {
+ if (item->enabled && item->action) {
+ item->action(ctx_menu.context);
+ }
+ desktop_hide_context_menu();
+ return 1;
+ }
+
+ item_y += 24;
+ if (item->separator)
+ item_y += 8;
+ }
+
+ return 1;
+}
+
+int desktop_context_menu_hover(int mx, int my) {
+ if (!ctx_menu.visible)
+ return 0;
+
+ int old_hover = ctx_menu.hover_index;
+ ctx_menu.hover_index = -1;
+
+ if (mx >= ctx_menu.x && mx < ctx_menu.x + ctx_menu.width &&
+ my >= ctx_menu.y && my < ctx_menu.y + ctx_menu.height) {
+
+ int item_y = ctx_menu.y + 4;
+ for (int i = 0; i < ctx_menu.item_count; i++) {
+ if (my >= item_y && my < item_y + 24) {
+ ctx_menu.hover_index = i;
+ break;
+ }
+ item_y += 24;
+ if (ctx_menu.items[i].separator)
+ item_y += 8;
+ }
+ }
+
+ if (old_hover != ctx_menu.hover_index) {
+ desktop_mark_dirty(ctx_menu.x, ctx_menu.y, ctx_menu.width + 4,
+ ctx_menu.height + 4);
+ }
+
+ return ctx_menu.visible;
+}
+
+/* ===================================================================== */
+/* Desktop File Operations */
+/* ===================================================================== */
+
+static int dir_scan_callback(void *ctx, const char *name, int len,
+ loff_t offset, ino_t ino, unsigned type);
+
+void desktop_refresh(void) {
+ /* Clear current icons */
+ desktop_icon_count = 0;
+ desktop_selected_count = 0;
+
+ /* Ensure Desktop directory exists */
+ struct file *dir = vfs_open(DESKTOP_PATH, O_RDONLY, 0);
+ if (!dir) {
+ /* Create Desktop directory */
+ vfs_mkdir(DESKTOP_PATH, 0755);
+ dir = vfs_open(DESKTOP_PATH, O_RDONLY, 0);
+ }
+
+ if (dir) {
+ /* vfs_readdir(file, ctx, filldir) */
+ vfs_readdir(dir, NULL, dir_scan_callback);
+ vfs_close(dir);
+ }
+
+ /* Sort icons */
+ desktop_sort_icons();
+
+ /* Arrange in grid */
+ desktop_arrange_icons();
+
+ desktop_mark_full_redraw();
+ printk(KERN_INFO "DESKTOP: Found %d items on desktop\n", desktop_icon_count);
+}
+
+static int dir_scan_callback(void *ctx, const char *name, int len,
+ loff_t offset, ino_t ino, unsigned type) {
+ (void)ctx;
+ (void)offset;
+ (void)ino;
+
+ /* Skip . and .. */
+ if (name[0] == '.' && (len == 1 || (len == 2 && name[1] == '.'))) {
+ return 0;
+ }
+
+ /* Skip hidden files unless enabled */
+ if (!desktop_show_hidden && name[0] == '.') {
+ return 0;
+ }
+
+ if (desktop_icon_count >= DESKTOP_MAX_ICONS) {
+ return -1; /* Stop scanning */
+ }
+
+ desktop_icon_t *icon = &desktop_icons[desktop_icon_count];
+
+ /* Copy name */
+ int i = 0;
+ while (i < len && i < 63) {
+ icon->name[i] = name[i];
+ i++;
+ }
+ icon->name[i] = '\0';
+
+ /* Build full path */
+ str_copy(icon->path, DESKTOP_PATH, 256);
+ int plen = 0;
+ while (icon->path[plen])
+ plen++;
+ icon->path[plen++] = '/';
+ i = 0;
+ while (i < len && plen < 255) {
+ icon->path[plen++] = name[i++];
+ }
+ icon->path[plen] = '\0';
+
+ /* Determine type */
+ int is_dir = (type == 4); /* DT_DIR */
+ icon->type = get_icon_type(icon->name, is_dir);
+
+ icon->selected = 0;
+ icon->stacked = 0;
+ icon->size = 0;
+ icon->mtime = 0;
+
+ desktop_icon_count++;
+ return 0;
+}
+
+void desktop_sort_icons(void) {
+ /* Simple bubble sort */
+ for (int i = 0; i < desktop_icon_count - 1; i++) {
+ for (int j = 0; j < desktop_icon_count - i - 1; j++) {
+ desktop_icon_t *a = &desktop_icons[j];
+ desktop_icon_t *b = &desktop_icons[j + 1];
+ int swap = 0;
+
+ switch (desktop_sort_mode) {
+ case SORT_NAME:
+ swap = str_cmp_nocase(a->name, b->name) > 0;
+ break;
+ case SORT_TYPE:
+ if (a->type != b->type) {
+ swap = a->type > b->type;
+ } else {
+ swap = str_cmp_nocase(a->name, b->name) > 0;
+ }
+ break;
+ case SORT_DATE:
+ swap = a->mtime < b->mtime;
+ break;
+ case SORT_SIZE:
+ swap = a->size < b->size;
+ break;
+ }
+
+ if (swap) {
+ desktop_icon_t tmp = *a;
+ *a = *b;
+ *b = tmp;
+ }
+ }
+ }
+}
+
+void desktop_arrange_icons(void) {
+ /* Arrange icons in a grid from top-left */
+ int x = DESKTOP_START_X;
+ int y = DESKTOP_START_Y;
+ int max_y = 600; /* Approximate, should use screen height */
+
+ for (int i = 0; i < desktop_icon_count; i++) {
+ desktop_icons[i].x = x;
+ desktop_icons[i].y = y;
+ desktop_icons[i].grid_x = x / DESKTOP_ICON_SPACING;
+ desktop_icons[i].grid_y = y / DESKTOP_ICON_SPACING;
+
+ y += DESKTOP_ICON_SPACING;
+ if (y + DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT > max_y) {
+ y = DESKTOP_START_Y;
+ x += DESKTOP_ICON_SPACING;
+ }
+ }
+}
+
+/* ===================================================================== */
+/* Menu Actions */
+/* ===================================================================== */
+
+static void menu_action_open(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ printk(KERN_INFO "DESKTOP: Opening %s\n", desktop_icons[i].path);
+
+ if (desktop_icons[i].type == ICON_TYPE_FOLDER) {
+ /* Open folder in file manager */
+ gui_create_file_manager_path(200, 100, desktop_icons[i].path);
+ } else if (desktop_icons[i].type == ICON_TYPE_IMAGE) {
+ gui_open_image_viewer(desktop_icons[i].path);
+ } else if (desktop_icons[i].type == ICON_TYPE_TEXT) {
+ gui_open_notepad(desktop_icons[i].path);
+ } else if (desktop_icons[i].type == ICON_TYPE_AUDIO) {
+ /* Play audio file */
+ printk(KERN_INFO "DESKTOP: Playing audio %s\n", desktop_icons[i].path);
+ } else if (desktop_icons[i].type == ICON_TYPE_PYTHON ||
+ desktop_icons[i].type == ICON_TYPE_NANO) {
+ /* Python/NanoLang - open terminal and run */
+ static int py_spawn_x = 150;
+ static int py_spawn_y = 120;
+
+ struct window *win =
+ gui_create_window("Terminal", py_spawn_x, py_spawn_y, 500, 350);
+ if (win) {
+ int cx = py_spawn_x + 2;
+ int cy = py_spawn_y + 30;
+ struct terminal *term = term_create(cx, cy, 60, 18);
+ if (term) {
+ gui_set_window_userdata(win, term);
+ term_set_active(term);
+ term_set_content_pos(term, cx, cy);
+
+ char run_cmd[300] = "run ";
+ int j = 4;
+ for (int k = 0; desktop_icons[i].path[k] && j < 298; k++) {
+ run_cmd[j++] = desktop_icons[i].path[k];
+ }
+ run_cmd[j] = '\0';
+ term_execute_command(term, run_cmd);
+ term_puts(term, "\n\033[32mvib-os\033[0m:\033[34m~\033[0m$ ");
+ }
+ }
+ py_spawn_x = (py_spawn_x + 40) % 300 + 100;
+ py_spawn_y = (py_spawn_y + 35) % 200 + 80;
+ } else {
+ /* Default: try to open as text */
+ gui_open_notepad(desktop_icons[i].path);
+ }
+ }
+ }
+}
+
+static void menu_action_open_with(void *ctx) {
+ (void)ctx;
+ printk(KERN_INFO "DESKTOP: Open with... (not implemented)\n");
+}
+
+static void menu_action_new_folder(void *ctx) {
+ (void)ctx;
+ static int folder_num = 1;
+ char name[64];
+ char path[256];
+
+ /* Generate unique name */
+ while (1) {
+ /* Build name */
+ char num_str[16];
+ int n = folder_num++;
+ int idx = 0;
+ if (n == 0) {
+ num_str[idx++] = '0';
+ } else {
+ char tmp[16];
+ int ti = 0;
+ while (n > 0) {
+ tmp[ti++] = '0' + (n % 10);
+ n /= 10;
+ }
+ while (ti > 0) {
+ num_str[idx++] = tmp[--ti];
+ }
+ }
+ num_str[idx] = '\0';
+
+ str_copy(name, "New Folder ", 64);
+ int i = 11;
+ int j = 0;
+ while (num_str[j] && i < 63) {
+ name[i++] = num_str[j++];
+ }
+ name[i] = '\0';
+
+ /* Build path */
+ str_copy(path, DESKTOP_PATH, 256);
+ int plen = 0;
+ while (path[plen])
+ plen++;
+ path[plen++] = '/';
+ i = 0;
+ while (name[i] && plen < 255) {
+ path[plen++] = name[i++];
+ }
+ path[plen] = '\0';
+
+ /* Check if exists */
+ struct file *f = vfs_open(path, O_RDONLY, 0);
+ if (!f)
+ break;
+ vfs_close(f);
+ }
+
+ /* Create folder */
+ if (vfs_mkdir(path, 0755) == 0) {
+ printk(KERN_INFO "DESKTOP: Created folder %s\n", path);
+ desktop_refresh();
+ }
+}
+
+static void menu_action_new_file(void *ctx) {
+ (void)ctx;
+ static int file_num = 1;
+ char name[64];
+ char path[256];
+
+ /* Generate unique name */
+ while (1) {
+ char num_str[16];
+ int n = file_num++;
+ int idx = 0;
+ if (n == 0) {
+ num_str[idx++] = '0';
+ } else {
+ char tmp[16];
+ int ti = 0;
+ while (n > 0) {
+ tmp[ti++] = '0' + (n % 10);
+ n /= 10;
+ }
+ while (ti > 0) {
+ num_str[idx++] = tmp[--ti];
+ }
+ }
+ num_str[idx] = '\0';
+
+ str_copy(name, "New File ", 64);
+ int i = 9;
+ int j = 0;
+ while (num_str[j] && i < 59) {
+ name[i++] = num_str[j++];
+ }
+ name[i++] = '.';
+ name[i++] = 't';
+ name[i++] = 'x';
+ name[i++] = 't';
+ name[i] = '\0';
+
+ str_copy(path, DESKTOP_PATH, 256);
+ int plen = 0;
+ while (path[plen])
+ plen++;
+ path[plen++] = '/';
+ i = 0;
+ while (name[i] && plen < 255) {
+ path[plen++] = name[i++];
+ }
+ path[plen] = '\0';
+
+ struct file *f = vfs_open(path, O_RDONLY, 0);
+ if (!f)
+ break;
+ vfs_close(f);
+ }
+
+ /* Create file */
+ struct file *f = vfs_open(path, O_CREAT | O_WRONLY, 0644);
+ if (f) {
+ vfs_close(f);
+ printk(KERN_INFO "DESKTOP: Created file %s\n", path);
+ desktop_refresh();
+ }
+}
+
+static void menu_action_rename(void *ctx) {
+ (void)ctx;
+ /* Find selected icon and start inline rename */
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ rename_active = 1;
+ rename_icon_idx = i;
+ str_copy(rename_buffer, desktop_icons[i].name, 64);
+ rename_cursor = 0;
+ while (rename_buffer[rename_cursor])
+ rename_cursor++;
+ desktop_mark_dirty(desktop_icons[i].x - 10,
+ desktop_icons[i].y + DESKTOP_ICON_SIZE,
+ DESKTOP_ICON_SIZE + 40, DESKTOP_LABEL_HEIGHT + 10);
+ break;
+ }
+ }
+}
+
+static void menu_action_delete(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ printk(KERN_INFO "DESKTOP: Deleting %s\n", desktop_icons[i].path);
+ vfs_unlink(desktop_icons[i].path);
+ }
+ }
+ desktop_refresh();
+}
+
+static void menu_action_copy(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ str_copy(clipboard_path, desktop_icons[i].path, 256);
+ clipboard_is_cut = 0;
+ printk(KERN_INFO "DESKTOP: Copied %s\n", clipboard_path);
+ break; /* Only copy first selected */
+ }
+ }
+}
+
+static void menu_action_cut(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ str_copy(clipboard_path, desktop_icons[i].path, 256);
+ clipboard_is_cut = 1;
+ printk(KERN_INFO "DESKTOP: Cut %s\n", clipboard_path);
+ break;
+ }
+ }
+}
+
+static void menu_action_paste(void *ctx) {
+ (void)ctx;
+ if (clipboard_path[0] == '\0')
+ return;
+
+ /* Extract filename from path */
+ const char *filename = clipboard_path;
+ for (const char *p = clipboard_path; *p; p++) {
+ if (*p == '/')
+ filename = p + 1;
+ }
+
+ /* Build destination path */
+ char dest[256];
+ str_copy(dest, DESKTOP_PATH, 256);
+ int plen = 0;
+ while (dest[plen])
+ plen++;
+ dest[plen++] = '/';
+ int i = 0;
+ while (filename[i] && plen < 255) {
+ dest[plen++] = filename[i++];
+ }
+ dest[plen] = '\0';
+
+ printk(KERN_INFO "DESKTOP: Paste %s -> %s\n", clipboard_path, dest);
+
+ /* File copy/move not implemented */
+
+ if (clipboard_is_cut) {
+ /* vfs_rename(clipboard_path, dest); */
+ clipboard_path[0] = '\0';
+ }
+
+ desktop_refresh();
+}
+
+static void menu_action_sort_name(void *ctx) {
+ (void)ctx;
+ desktop_sort_mode = SORT_NAME;
+ desktop_sort_icons();
+ desktop_arrange_icons();
+ desktop_mark_full_redraw();
+}
+
+static void menu_action_sort_date(void *ctx) {
+ (void)ctx;
+ desktop_sort_mode = SORT_DATE;
+ desktop_sort_icons();
+ desktop_arrange_icons();
+ desktop_mark_full_redraw();
+}
+
+static void menu_action_sort_type(void *ctx) {
+ (void)ctx;
+ desktop_sort_mode = SORT_TYPE;
+ desktop_sort_icons();
+ desktop_arrange_icons();
+ desktop_mark_full_redraw();
+}
+
+static void menu_action_refresh(void *ctx) {
+ (void)ctx;
+ desktop_refresh();
+}
+
+static void menu_action_new_shortcut(void *ctx) {
+ (void)ctx;
+ printk(KERN_INFO "DESKTOP: Create shortcut (not implemented)\n");
+}
+
+static void menu_action_paste_shortcut(void *ctx) {
+ (void)ctx;
+ printk(KERN_INFO "DESKTOP: Paste shortcut (not implemented)\n");
+}
+
+static void menu_action_properties(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ printk(KERN_INFO "DESKTOP: Properties for %s\n", desktop_icons[i].name);
+ printk(KERN_INFO " Type: %d\n", desktop_icons[i].type);
+ printk(KERN_INFO " Path: %s\n", desktop_icons[i].path);
+ break;
+ }
+ }
+}
+
+static void menu_action_sort_size(void *ctx) {
+ (void)ctx;
+ desktop_sort_mode = SORT_SIZE;
+ desktop_sort_icons();
+ desktop_arrange_icons();
+ desktop_mark_full_redraw();
+}
+
+static void menu_action_view_icons(void *ctx) {
+ (void)ctx;
+ printk(KERN_INFO "DESKTOP: View as icons\n");
+}
+
+static void menu_action_view_list(void *ctx) {
+ (void)ctx;
+ printk(KERN_INFO "DESKTOP: View as list\n");
+}
+
+static void menu_action_select_all(void *ctx) {
+ (void)ctx;
+ for (int i = 0; i < desktop_icon_count; i++) {
+ desktop_icons[i].selected = 1;
+ }
+ desktop_selected_count = desktop_icon_count;
+ desktop_mark_full_redraw();
+}
+
+static void menu_action_personalize(void *ctx) {
+ (void)ctx;
+ gui_create_window("Settings", 200, 100, 400, 350);
+}
+
+static void menu_action_display_settings(void *ctx) {
+ (void)ctx;
+ gui_create_window("Display Settings", 200, 100, 400, 300);
+}
+
+static void menu_action_terminal_here(void *ctx) {
+ (void)ctx;
+ struct window *win = gui_create_window("Terminal", 200, 100, 450, 320);
+
+ /* Create and set active terminal */
+ struct terminal *term = term_create(202, 130, 55, 16);
+ if (win && term) {
+ gui_set_window_userdata(win, term);
+ term_set_active(term);
+ }
+}
+
+static void menu_action_change_background(void *ctx) {
+ (void)ctx;
+ /* Open Background Settings window */
+ extern struct window *gui_create_window(const char *title, int x, int y,
+ int w, int h);
+ gui_create_window("Background Settings", 150, 100, 400, 350);
+}
+
+/* ===================================================================== */
+/* Desktop Event Handling */
+/* ===================================================================== */
+
+desktop_icon_t *desktop_icon_at(int x, int y) {
+ for (int i = 0; i < desktop_icon_count; i++) {
+ desktop_icon_t *icon = &desktop_icons[i];
+ if (x >= icon->x && x < icon->x + DESKTOP_ICON_SIZE && y >= icon->y &&
+ y < icon->y + DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT) {
+ return icon;
+ }
+ }
+ return NULL;
+}
+
+void desktop_select_icon(desktop_icon_t *icon, int add_to_selection) {
+ if (!add_to_selection) {
+ /* Clear other selections */
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ desktop_icons[i].selected = 0;
+ desktop_mark_dirty(desktop_icons[i].x - 4, desktop_icons[i].y - 4,
+ DESKTOP_ICON_SIZE + 8,
+ DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT + 8);
+ }
+ }
+ desktop_selected_count = 0;
+ }
+
+ if (icon && !icon->selected) {
+ icon->selected = 1;
+ desktop_selected_count++;
+ desktop_mark_dirty(icon->x - 4, icon->y - 4, DESKTOP_ICON_SIZE + 8,
+ DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT + 8);
+ }
+}
+
+void desktop_clear_selection(void) {
+ for (int i = 0; i < desktop_icon_count; i++) {
+ if (desktop_icons[i].selected) {
+ desktop_icons[i].selected = 0;
+ desktop_mark_dirty(desktop_icons[i].x - 4, desktop_icons[i].y - 4,
+ DESKTOP_ICON_SIZE + 8,
+ DESKTOP_ICON_SIZE + DESKTOP_LABEL_HEIGHT + 8);
+ }
+ }
+ desktop_selected_count = 0;
+}
+
+int desktop_handle_click(int x, int y, int button, int shift_held) {
+ /* Right click - context menu */
+ if (button == 2) { /* Right button */
+ desktop_icon_t *icon = desktop_icon_at(x, y);
+ if (icon) {
+ if (!icon->selected) {
+ desktop_select_icon(icon, 0);
+ }
+ desktop_show_context_menu(x, y, 1);
+ } else {
+ desktop_clear_selection();
+ desktop_show_context_menu(x, y, 0);
+ }
+ return 1;
+ }
+
+ /* Left click */
+ if (button == 1) {
+ /* Check context menu first */
+ if (ctx_menu.visible) {
+ return desktop_context_menu_click(x, y);
+ }
+
+ desktop_icon_t *icon = desktop_icon_at(x, y);
+
+ if (icon) {
+
+ desktop_select_icon(icon, shift_held);
+ } else {
+ /* Clicked on empty space */
+ desktop_clear_selection();
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+int desktop_handle_double_click(int x, int y) {
+ desktop_icon_t *icon = desktop_icon_at(x, y);
+ if (icon) {
+ menu_action_open(NULL);
+ return 1;
+ }
+ return 0;
+}
+
+/* ===================================================================== */
+/* Inline Rename (macOS-style) */
+/* ===================================================================== */
+
+int desktop_is_renaming(void) { return rename_active; }
+
+static void desktop_commit_rename(void) {
+ if (!rename_active || rename_icon_idx < 0 ||
+ rename_icon_idx >= desktop_icon_count)
+ return;
+
+ desktop_icon_t *icon = &desktop_icons[rename_icon_idx];
+
+ /* Only rename if name actually changed and is non-empty */
+ if (rename_buffer[0] && str_cmp(icon->name, rename_buffer) != 0) {
+ /* Build new path */
+ char new_path[256];
+ str_copy(new_path, DESKTOP_PATH, 256);
+ int len = 0;
+ while (new_path[len])
+ len++;
+ new_path[len++] = '/';
+ str_copy(new_path + len, rename_buffer, 256 - len);
+
+ /* Perform rename via VFS */
+ extern int vfs_rename(const char *oldpath, const char *newpath);
+ int ret = vfs_rename(icon->path, new_path);
+
+ if (ret == 0) {
+ /* Update icon data */
+ str_copy(icon->name, rename_buffer, 64);
+ str_copy(icon->path, new_path, 256);
+ printk(KERN_INFO "DESKTOP: Renamed to %s\n", rename_buffer);
+ } else {
+ printk(KERN_ERR "DESKTOP: Rename failed: %d\n", ret);
+ }
+ }
+
+ /* Mark dirty and reset state */
+ desktop_mark_dirty(icon->x - 10, icon->y + DESKTOP_ICON_SIZE,
+ DESKTOP_ICON_SIZE + 60, DESKTOP_LABEL_HEIGHT + 10);
+ rename_active = 0;
+ rename_icon_idx = -1;
+ rename_buffer[0] = '\0';
+ rename_cursor = 0;
+}
+
+static void desktop_cancel_rename(void) {
+ if (!rename_active || rename_icon_idx < 0)
+ return;
+
+ desktop_icon_t *icon = &desktop_icons[rename_icon_idx];
+ desktop_mark_dirty(icon->x - 10, icon->y + DESKTOP_ICON_SIZE,
+ DESKTOP_ICON_SIZE + 60, DESKTOP_LABEL_HEIGHT + 10);
+ rename_active = 0;
+ rename_icon_idx = -1;
+ rename_buffer[0] = '\0';
+ rename_cursor = 0;
+}
+
+int desktop_handle_key(int key) {
+ /* Handle keyboard events during rename */
+ if (!rename_active)
+ return 0; /* Not renaming, don't consume key */
+
+ if (key == '\n' || key == '\r') {
+ /* Enter - commit rename */
+ desktop_commit_rename();
+ return 1;
+ }
+
+ if (key == 27) { /* Escape */
+ desktop_cancel_rename();
+ return 1;
+ }
+
+ if (key == 127 || key == 8) { /* Backspace/Delete */
+ if (rename_cursor > 0) {
+ rename_cursor--;
+ /* Shift characters left */
+ int i = rename_cursor;
+ while (rename_buffer[i]) {
+ rename_buffer[i] = rename_buffer[i + 1];
+ i++;
+ }
+ desktop_mark_dirty(desktop_icons[rename_icon_idx].x - 10,
+ desktop_icons[rename_icon_idx].y + DESKTOP_ICON_SIZE,
+ DESKTOP_ICON_SIZE + 60, DESKTOP_LABEL_HEIGHT + 10);
+ }
+ return 1;
+ }
+
+ /* Printable character */
+ if (key >= 32 && key < 127) {
+ int len = 0;
+ while (rename_buffer[len])
+ len++;
+ if (len < 62) { /* Leave room for null terminator */
+ /* Shift characters right to make room */
+ for (int i = len; i >= rename_cursor; i--) {
+ rename_buffer[i + 1] = rename_buffer[i];
+ }
+ rename_buffer[rename_cursor] = (char)key;
+ rename_cursor++;
+ desktop_mark_dirty(desktop_icons[rename_icon_idx].x - 10,
+ desktop_icons[rename_icon_idx].y + DESKTOP_ICON_SIZE,
+ DESKTOP_ICON_SIZE + 60, DESKTOP_LABEL_HEIGHT + 10);
+ }
+ return 1;
+ }
+
+ return 1; /* Consume other keys during rename */
+}
+
+/* ===================================================================== */
+/* Desktop Drawing */
+/* ===================================================================== */
+
+void desktop_draw_icons(void) {
+ for (int i = 0; i < desktop_icon_count; i++) {
+ draw_desktop_icon(&desktop_icons[i]);
+ }
+
+ /* Draw context menu on top */
+ draw_context_menu();
+}
+
+/* ===================================================================== */
+/* Initialization */
+/* ===================================================================== */
+
+void desktop_manager_init(void) {
+ printk(KERN_INFO "DESKTOP: Initializing desktop manager\n");
+
+ desktop_icon_count = 0;
+ desktop_selected_count = 0;
+ ctx_menu.visible = 0;
+ clipboard_path[0] = '\0';
+
+ /* Load desktop contents */
+ desktop_refresh();
+}
+
+/* ===================================================================== */
+/* Public Getters */
+/* ===================================================================== */
+
+int desktop_get_icon_count(void) { return desktop_icon_count; }
+
+int desktop_is_context_menu_visible(void) { return ctx_menu.visible; }
diff --git a/kernel/gui/desktop.h b/kernel/gui/desktop.h
new file mode 100644
index 0000000..5e79e37
--- /dev/null
+++ b/kernel/gui/desktop.h
@@ -0,0 +1,45 @@
+/*
+ * Vib-OS - Desktop Manager Header
+ */
+
+#ifndef _DESKTOP_H
+#define _DESKTOP_H
+
+#include "types.h"
+
+/* Initialize desktop manager */
+void desktop_manager_init(void);
+
+/* Refresh desktop from filesystem */
+void desktop_refresh(void);
+
+/* Sort and arrange icons */
+void desktop_sort_icons(void);
+void desktop_arrange_icons(void);
+
+/* Event handling */
+int desktop_handle_click(int x, int y, int button, int shift_held);
+int desktop_handle_double_click(int x, int y);
+int desktop_handle_key(int key); /* Returns 1 if consumed */
+int desktop_context_menu_hover(int mx, int my);
+int desktop_context_menu_click(int mx, int my);
+int desktop_is_renaming(void);
+
+/* Drawing */
+void desktop_draw_icons(void);
+
+/* Dirty region tracking */
+void desktop_mark_dirty(int x, int y, int w, int h);
+void desktop_mark_full_redraw(void);
+int desktop_needs_redraw(void);
+void desktop_clear_dirty(void);
+
+/* State queries */
+int desktop_get_icon_count(void);
+int desktop_is_context_menu_visible(void);
+
+/* Context menu */
+void desktop_show_context_menu(int x, int y, int on_icon);
+void desktop_hide_context_menu(void);
+
+#endif /* _DESKTOP_H */
diff --git a/kernel/gui/dock_icons.h b/kernel/gui/dock_icons.h
new file mode 100644
index 0000000..98c4052
--- /dev/null
+++ b/kernel/gui/dock_icons.h
@@ -0,0 +1,529 @@
+/* Solid Filled Dock Icons (48x48 RGBA) */
+#ifndef DOCK_ICONS_H
+#define DOCK_ICONS_H
+#include "types.h"
+#define DOCK_ICON_BITMAP_SIZE 48
+
+static const uint32_t dock_icon_terminal[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_folder[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_calculator[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_notes[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFC8C8C8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_settings[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_clock[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_doom[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_snake[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_help[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t dock_icon_web[2304] = {
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+};
+
+static const uint32_t* dock_icons[] = {
+ dock_icon_terminal,
+ dock_icon_folder,
+ dock_icon_calculator,
+ dock_icon_notes,
+ dock_icon_settings,
+ dock_icon_clock,
+ dock_icon_doom,
+ dock_icon_snake,
+ dock_icon_help,
+ dock_icon_web,
+};
+#endif
\ No newline at end of file
diff --git a/kernel/gui/generate_toolbar_icons.py b/kernel/gui/generate_toolbar_icons.py
new file mode 100644
index 0000000..7440c0e
--- /dev/null
+++ b/kernel/gui/generate_toolbar_icons.py
@@ -0,0 +1,197 @@
+#!/usr/bin/env python3
+"""
+Convert toolbar PNG icons to C arrays for vib-OS kernel.
+Icons should be 24x24 RGBA PNGs in the same directory.
+"""
+
+import os
+import sys
+
+try:
+ from PIL import Image
+except ImportError:
+ print("PIL not found. Installing...")
+ os.system("pip3 install pillow")
+ from PIL import Image
+
+ICON_SIZE = 24
+
+# Icon names for toolbar
+ICONS = [
+ ("icon_prev", "prev.png"),
+ ("icon_next", "next.png"),
+ ("icon_rotate_cw", "rotate_cw.png"),
+ ("icon_rotate_ccw", "rotate_ccw.png"),
+ ("icon_zoom_in", "zoom_in.png"),
+ ("icon_zoom_out", "zoom_out.png"),
+ ("icon_fit", "fit.png"),
+ ("icon_fullscreen", "fullscreen.png"),
+]
+
+def render_chevron_left(size):
+ """Generate left chevron icon programmatically"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ # Draw anti-aliased chevron
+ cx, cy = size // 2, size // 2
+ points = [(cx + 4, cy - 7), (cx - 4, cy), (cx + 4, cy + 7)]
+ draw.line(points, fill=(255, 255, 255, 255), width=3)
+ return img
+
+def render_chevron_right(size):
+ """Generate right chevron icon programmatically"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ cx, cy = size // 2, size // 2
+ points = [(cx - 4, cy - 7), (cx + 4, cy), (cx - 4, cy + 7)]
+ draw.line(points, fill=(255, 255, 255, 255), width=3)
+ return img
+
+def render_rotate_cw(size):
+ """Generate clockwise rotation icon"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ # Draw arc
+ draw.arc([4, 4, size-4, size-4], 45, 315, fill=(255, 255, 255, 255), width=2)
+ # Arrow head at end of arc
+ draw.polygon([(size-6, 6), (size-3, 10), (size-10, 8)], fill=(255, 255, 255, 255))
+ return img
+
+def render_rotate_ccw(size):
+ """Generate counter-clockwise rotation icon"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ # Draw arc
+ draw.arc([4, 4, size-4, size-4], 225, 495, fill=(255, 255, 255, 255), width=2)
+ # Arrow head
+ draw.polygon([(6, 6), (10, 3), (8, 10)], fill=(255, 255, 255, 255))
+ return img
+
+def render_zoom_in(size):
+ """Generate zoom in (+) icon"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ cx, cy = size // 2, size // 2
+ # Plus sign
+ draw.line([(cx - 6, cy), (cx + 6, cy)], fill=(255, 255, 255, 255), width=3)
+ draw.line([(cx, cy - 6), (cx, cy + 6)], fill=(255, 255, 255, 255), width=3)
+ return img
+
+def render_zoom_out(size):
+ """Generate zoom out (-) icon"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ cx, cy = size // 2, size // 2
+ # Minus sign
+ draw.line([(cx - 6, cy), (cx + 6, cy)], fill=(255, 255, 255, 255), width=3)
+ return img
+
+def render_fit(size):
+ """Generate fit-to-window icon (box with corners)"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ # Box outline
+ draw.rectangle([4, 4, size-5, size-5], outline=(255, 255, 255, 255), width=2)
+ # Diagonal arrows pointing inward
+ draw.line([(4, 4), (10, 10)], fill=(255, 255, 255, 255), width=2)
+ draw.line([(size-5, size-5), (size-11, size-11)], fill=(255, 255, 255, 255), width=2)
+ return img
+
+def render_fullscreen(size):
+ """Generate fullscreen icon (4 corners)"""
+ from PIL import ImageDraw
+ img = Image.new('RGBA', (size, size), (0, 0, 0, 0))
+ draw = ImageDraw.Draw(img)
+ # Top-left corner
+ draw.line([(2, 8), (2, 2), (8, 2)], fill=(255, 255, 255, 255), width=2)
+ # Top-right corner
+ draw.line([(size-9, 2), (size-3, 2), (size-3, 8)], fill=(255, 255, 255, 255), width=2)
+ # Bottom-left corner
+ draw.line([(2, size-9), (2, size-3), (8, size-3)], fill=(255, 255, 255, 255), width=2)
+ # Bottom-right corner
+ draw.line([(size-9, size-3), (size-3, size-3), (size-3, size-9)], fill=(255, 255, 255, 255), width=2)
+ return img
+
+def image_to_c_array(img, name):
+ """Convert PIL image to C array of RGBA values"""
+ img = img.convert('RGBA')
+ pixels = list(img.getdata())
+
+ lines = [f"/* {name} - {img.width}x{img.height} RGBA icon */"]
+ lines.append(f"static const uint32_t {name}[{img.width * img.height}] = {{")
+
+ for y in range(img.height):
+ row = []
+ for x in range(img.width):
+ r, g, b, a = pixels[y * img.width + x]
+ # Pack as ARGB: 0xAARRGGBB
+ pixel = (a << 24) | (r << 16) | (g << 8) | b
+ row.append(f"0x{pixel:08X}")
+ lines.append(" " + ", ".join(row) + ",")
+
+ lines.append("};")
+ return "\n".join(lines)
+
+def main():
+ size = ICON_SIZE
+
+ # Generate icons programmatically
+ icons = [
+ ("toolbar_icon_prev", render_chevron_left(size)),
+ ("toolbar_icon_next", render_chevron_right(size)),
+ ("toolbar_icon_rotate_cw", render_rotate_cw(size)),
+ ("toolbar_icon_rotate_ccw", render_rotate_ccw(size)),
+ ("toolbar_icon_zoom_in", render_zoom_in(size)),
+ ("toolbar_icon_zoom_out", render_zoom_out(size)),
+ ("toolbar_icon_fit", render_fit(size)),
+ ("toolbar_icon_fullscreen", render_fullscreen(size)),
+ ]
+
+ # Generate C header
+ output = []
+ output.append("/*")
+ output.append(" * Toolbar Icons for vib-OS Image Viewer")
+ output.append(" * Auto-generated 24x24 RGBA icons")
+ output.append(" */")
+ output.append("")
+ output.append("#ifndef TOOLBAR_ICONS_H")
+ output.append("#define TOOLBAR_ICONS_H")
+ output.append("")
+ output.append("#include \"types.h\"")
+ output.append("")
+ output.append(f"#define TOOLBAR_ICON_SIZE {size}")
+ output.append("")
+
+ for name, img in icons:
+ output.append(image_to_c_array(img, name))
+ output.append("")
+
+ # Array of pointers for easy access
+ output.append("/* Icon array for toolbar */")
+ output.append("static const uint32_t* toolbar_icons[] = {")
+ for name, _ in icons:
+ output.append(f" {name},")
+ output.append("};")
+ output.append("")
+ output.append("#define TOOLBAR_ICON_PREV 0")
+ output.append("#define TOOLBAR_ICON_NEXT 1")
+ output.append("#define TOOLBAR_ICON_ROTATE_CW 2")
+ output.append("#define TOOLBAR_ICON_ROTATE_CCW 3")
+ output.append("#define TOOLBAR_ICON_ZOOM_IN 4")
+ output.append("#define TOOLBAR_ICON_ZOOM_OUT 5")
+ output.append("#define TOOLBAR_ICON_FIT 6")
+ output.append("#define TOOLBAR_ICON_FULLSCREEN 7")
+ output.append("")
+ output.append("#endif /* TOOLBAR_ICONS_H */")
+
+ print("\n".join(output))
+
+if __name__ == "__main__":
+ main()
diff --git a/kernel/gui/icons.h b/kernel/gui/icons.h
index 03ea018..ec169bf 100644
--- a/kernel/gui/icons.h
+++ b/kernel/gui/icons.h
@@ -1,6 +1,6 @@
/*
* Vib-OS Dock Icons
- *
+ *
* 32x32 bitmaps for dock icons
* 0 = transparent, 1 = black
*/
@@ -10,398 +10,497 @@
/* Terminal icon */
static const unsigned char icon_term[32 * 32] = {
- 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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,0,1,1,0,0,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,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,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,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,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,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,
- 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 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, 1,
+ 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1,
+ 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0,
+ 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0,
+ 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1,
+ 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,
+ 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 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, 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,
};
/* Files/Folder icon */
static const unsigned char icon_files[32 * 32] = {
- 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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,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,1,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,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,1,0,0,0,
- 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,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,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,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,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,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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 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, 1, 1, 0, 0, 0, 0,
+ 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0,
+ 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0,
+ 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0,
+ 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 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,
+ 1, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 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, 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, 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, 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, 0, 0,
};
/* Calculator icon */
static const unsigned char icon_calc[32 * 32] = {
- 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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,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,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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
+ 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+ 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,
+ 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1,
+ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0,
+ 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0,
+ 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1,
+ 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1,
+ 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1,
+ 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
+ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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,
+ 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, 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,
};
/* Paint/Edit icon - paintbrush */
static const unsigned char icon_edit[32 * 32] = {
- 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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,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,0,1,1,1,1,1,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,1,1,1,0,0,1,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,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,1,1,1,0,0,0,1,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,1,1,0,0,0,1,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,1,1,0,0,1,1,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,1,1,1,1,1,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,0,1,1,1,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,0,0,0,1,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,
- 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,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,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,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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 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, 0, 1, 1, 1, 1, 1, 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, 1, 1, 1, 0, 0, 1, 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, 1, 1,
+ 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 1, 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, 1, 1, 0, 0, 1, 1, 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, 1, 1, 1, 1, 1,
+ 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, 0, 1, 1, 1, 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, 0, 0, 0, 1, 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, 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, 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, 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, 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,
};
/* Help icon - question mark */
static const unsigned char icon_help[32 * 32] = {
- 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,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,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,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,0,0,0,1,1,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,0,0,1,1,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,0,0,1,1,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,0,0,1,1,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,0,0,1,1,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,0,0,1,1,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,0,0,1,1,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,0,0,0,1,1,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,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,1,1,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,0,0,0,1,1,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,0,0,0,1,1,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,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,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,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,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,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,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,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,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,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,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,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, 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, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 1, 1, 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, 0, 0,
+ 1, 1, 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, 0, 0, 1, 1, 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, 0, 0, 1, 1, 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, 0, 0, 1, 1, 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, 0, 0, 1,
+ 1, 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, 0, 0, 1, 1, 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, 0, 0, 0, 1, 1, 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, 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, 1, 1, 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, 0, 0, 0, 1, 1, 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, 0, 0, 0, 1, 1, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0,
};
/* Settings icon - gear */
static const unsigned char icon_settings[32 * 32] = {
- 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,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,1,1,1,1,1,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,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,
- 0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,
- 0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,
- 0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,
- 0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,
- 0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,
- 0,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,0,0,0,
- 0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,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,1,1,1,1,1,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,1,1,1,1,1,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,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,0,0,0,0,0,0,0,0,0,0,0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1,
+ 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,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1,
+ 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0,
+ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
+ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
+ 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
/* Clock icon */
static const unsigned char icon_clock[32 * 32] = {
- 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,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,
- 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,
- 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
- 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,
- 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
- 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
- 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,
- 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,
- 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,
- 0,1,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,1,1,0,
- 0,1,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,1,1,0,
- 0,1,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,1,1,0,
- 0,1,1,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,1,1,1,0,
- 0,0,1,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,1,1,0,0,
- 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,
- 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,
- 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,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,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,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,
+ 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, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 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, 1, 1, 0, 0, 1, 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, 1, 1,
+ 0, 0, 1, 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, 1, 1, 0, 0, 1, 1, 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, 1, 1, 1, 0, 0, 0, 1, 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, 1, 1, 0, 0, 0, 0, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 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,
};
/* DOOM icon - demon/monster face */
static const unsigned char icon_doom[32 * 32] = {
- 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,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,
- 0,0,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,0,
- 0,0,1,1,1,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,0,
- 0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,1,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,0,1,1,1,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,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,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,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, 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, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1,
+ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0,
+ 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 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, 0, 1, 1, 1, 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, 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, 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, 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,
};
/* Notepad icon - document with lines */
static const unsigned char icon_notepad[32 * 32] = {
- 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,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,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,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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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,
+ 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, 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,
};
/* Snake game icon */
static const unsigned char icon_snake[32 * 32] = {
- 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,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,1,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,1,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,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,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,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,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,0,0,0,0,1,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,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,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,
- 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, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 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, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 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, 0, 0, 1, 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, 0,
+ 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 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, 0,
+ 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 1, 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, 0, 0,
+ 0, 0, 1, 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, 0, 0, 0, 0, 1, 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, 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, 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, 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,
};
/* Browser icon - Globe */
static const unsigned char icon_browser[32 * 32] = {
- 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,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
- 0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
- 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
- 0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,
- 0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,
- 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
/* Icon array for dock - 10 icons */
@@ -420,16 +519,108 @@ static const unsigned char *dock_icons_bmp[] = {
#define NUM_DOCK_ICONS_DEFINED 10
-#define ICON_TERM 0
-#define ICON_FILES 1
-#define ICON_CALC 2
-#define ICON_NOTEPAD 3
+#define ICON_TERM 0
+#define ICON_FILES 1
+#define ICON_CALC 2
+#define ICON_NOTEPAD 3
#define ICON_SETTINGS 4
-#define ICON_CLOCK 5
-#define ICON_DOOM 6
-#define ICON_SNAKE 7
-#define ICON_HELP 8
-#define ICON_BROWSER 9
+#define ICON_CLOCK 5
+#define ICON_DOOM 6
+#define ICON_SNAKE 7
+#define ICON_HELP 8
+#define ICON_BROWSER 9
-#endif
+/* Python file icon - snake shape */
+static const unsigned char icon_python[32 * 32] = {
+ 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, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
+ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
+ 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+/* NanoLang file icon - N with angle brackets */
+static const unsigned char icon_nano[32 * 32] = {
+ 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
+ 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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,
+ 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, 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,
+};
+
+#define ICON_PYTHON 10
+#define ICON_NANO 11
+#endif
diff --git a/kernel/gui/terminal.c b/kernel/gui/terminal.c
index c5ebb2b..1de7683 100644
--- a/kernel/gui/terminal.c
+++ b/kernel/gui/terminal.c
@@ -1,13 +1,13 @@
/*
* Vib-OS - Terminal Emulator
- *
+ *
* VT100-compatible terminal emulator for the GUI.
*/
-#include "types.h"
-#include "printk.h"
-#include "mm/kmalloc.h"
#include "media/media.h"
+#include "mm/kmalloc.h"
+#include "printk.h"
+#include "types.h"
/* Forward declare window type */
struct window;
@@ -15,36 +15,37 @@ struct window;
/* External GUI functions */
extern void gui_draw_rect(int x, int y, int w, int h, uint32_t color);
extern void gui_draw_char(int x, int y, char c, uint32_t fg, uint32_t bg);
-extern struct window *gui_create_window(const char *title, int x, int y, int w, int h);
+extern struct window *gui_create_window(const char *title, int x, int y, int w,
+ int h);
/* ===================================================================== */
/* Terminal Configuration */
/* ===================================================================== */
-#define TERM_COLS 80
-#define TERM_ROWS 24
-#define TERM_CHAR_W 8
-#define TERM_CHAR_H 16
-#define TERM_PADDING 4
+#define TERM_COLS 80
+#define TERM_ROWS 24
+#define TERM_CHAR_W 8
+#define TERM_CHAR_H 16
+#define TERM_PADDING 4
/* Terminal colors (VT100/ANSI) */
static const uint32_t term_colors[16] = {
- 0x1E1E2E, /* 0 - Black (background) */
- 0xF38BA8, /* 1 - Red */
- 0xA6E3A1, /* 2 - Green */
- 0xF9E2AF, /* 3 - Yellow */
- 0x89B4FA, /* 4 - Blue */
- 0xCBA6F7, /* 5 - Magenta */
- 0x94E2D5, /* 6 - Cyan */
- 0xCDD6F4, /* 7 - White (foreground) */
- 0x585B70, /* 8 - Bright Black */
- 0xF38BA8, /* 9 - Bright Red */
- 0xA6E3A1, /* 10 - Bright Green */
- 0xF9E2AF, /* 11 - Bright Yellow */
- 0x89B4FA, /* 12 - Bright Blue */
- 0xCBA6F7, /* 13 - Bright Magenta */
- 0x94E2D5, /* 14 - Bright Cyan */
- 0xFFFFFF, /* 15 - Bright White */
+ 0x1E1E2E, /* 0 - Black (background) */
+ 0xF38BA8, /* 1 - Red */
+ 0xA6E3A1, /* 2 - Green */
+ 0xF9E2AF, /* 3 - Yellow */
+ 0x89B4FA, /* 4 - Blue */
+ 0xCBA6F7, /* 5 - Magenta */
+ 0x94E2D5, /* 6 - Cyan */
+ 0xCDD6F4, /* 7 - White (foreground) */
+ 0x585B70, /* 8 - Bright Black */
+ 0xF38BA8, /* 9 - Bright Red */
+ 0xA6E3A1, /* 10 - Bright Green */
+ 0xF9E2AF, /* 11 - Bright Yellow */
+ 0x89B4FA, /* 12 - Bright Blue */
+ 0xCBA6F7, /* 13 - Bright Magenta */
+ 0x94E2D5, /* 14 - Bright Cyan */
+ 0xFFFFFF, /* 15 - Bright White */
};
/* ===================================================================== */
@@ -52,48 +53,54 @@ static const uint32_t term_colors[16] = {
/* ===================================================================== */
struct terminal {
- /* Character buffer */
- char *chars;
- uint8_t *fg_colors;
- uint8_t *bg_colors;
-
- /* Dimensions */
- int cols;
- int rows;
-
- /* Cursor */
- int cursor_x;
- int cursor_y;
- bool cursor_visible;
- bool cursor_blink;
-
- /* Current colors */
- uint8_t current_fg;
- uint8_t current_bg;
-
- /* Escape sequence state */
- bool in_escape;
- char escape_buf[32];
- int escape_len;
-
- /* Scrollback */
- int scroll_offset;
-
- /* Associated window */
- struct window *window;
- int content_x, content_y;
-
- /* Input buffer */
- char input_buf[256];
- int input_len;
- int input_pos;
-
- /* Shell process */
- int shell_pid;
- int pty_fd;
-
- /* Current Working Directory */
- char cwd[256];
+ /* Character buffer */
+ char *chars;
+ uint8_t *fg_colors;
+ uint8_t *bg_colors;
+
+ /* Dimensions */
+ int cols;
+ int rows;
+
+ /* Cursor */
+ int cursor_x;
+ int cursor_y;
+ bool cursor_visible;
+ bool cursor_blink;
+
+ /* Current colors */
+ uint8_t current_fg;
+ uint8_t current_bg;
+
+ /* Escape sequence state */
+ bool in_escape;
+ char escape_buf[32];
+ int escape_len;
+
+ /* Scrollback */
+ int scroll_offset;
+
+ /* Associated window */
+ struct window *window;
+ int content_x, content_y;
+
+ /* Input buffer */
+ char input_buf[256];
+ int input_len;
+ int input_pos;
+
+ /* Shell process */
+ int shell_pid;
+ int pty_fd;
+
+ /* Current Working Directory */
+ char cwd[256];
+
+/* Command history */
+#define TERM_HISTORY_SIZE 32
+#define TERM_HISTORY_LEN 128
+ char history[32][128];
+ int history_count;
};
static struct terminal *active_terminal = NULL;
@@ -102,702 +109,1181 @@ static struct terminal *active_terminal = NULL;
/* Terminal Buffer Operations */
/* ===================================================================== */
-static void term_clear_line(struct terminal *term, int row)
-{
- for (int col = 0; col < term->cols; col++) {
- int idx = row * term->cols + col;
- term->chars[idx] = ' ';
- term->fg_colors[idx] = term->current_fg;
- term->bg_colors[idx] = term->current_bg;
- }
+static void term_clear_line(struct terminal *term, int row) {
+ for (int col = 0; col < term->cols; col++) {
+ int idx = row * term->cols + col;
+ term->chars[idx] = ' ';
+ term->fg_colors[idx] = term->current_fg;
+ term->bg_colors[idx] = term->current_bg;
+ }
}
-static void term_scroll_up(struct terminal *term)
-{
- /* Move all lines up by one */
- for (int row = 0; row < term->rows - 1; row++) {
- for (int col = 0; col < term->cols; col++) {
- int src = (row + 1) * term->cols + col;
- int dst = row * term->cols + col;
- term->chars[dst] = term->chars[src];
- term->fg_colors[dst] = term->fg_colors[src];
- term->bg_colors[dst] = term->bg_colors[src];
- }
+static void term_scroll_up(struct terminal *term) {
+ /* Move all lines up by one */
+ for (int row = 0; row < term->rows - 1; row++) {
+ for (int col = 0; col < term->cols; col++) {
+ int src = (row + 1) * term->cols + col;
+ int dst = row * term->cols + col;
+ term->chars[dst] = term->chars[src];
+ term->fg_colors[dst] = term->fg_colors[src];
+ term->bg_colors[dst] = term->bg_colors[src];
}
-
- /* Clear last line */
- term_clear_line(term, term->rows - 1);
+ }
+
+ /* Clear last line */
+ term_clear_line(term, term->rows - 1);
}
-static void term_newline(struct terminal *term)
-{
- term->cursor_x = 0;
- term->cursor_y++;
-
- if (term->cursor_y >= term->rows) {
- term_scroll_up(term);
- term->cursor_y = term->rows - 1;
- }
+static void term_newline(struct terminal *term) {
+ term->cursor_x = 0;
+ term->cursor_y++;
+
+ if (term->cursor_y >= term->rows) {
+ term_scroll_up(term);
+ term->cursor_y = term->rows - 1;
+ }
}
/* ===================================================================== */
/* Escape Sequence Processing */
/* ===================================================================== */
-static void term_process_escape(struct terminal *term)
-{
- if (term->escape_len < 1) return;
-
- /* CSI sequences start with [ */
- if (term->escape_buf[0] == '[') {
- char *seq = term->escape_buf + 1;
- char cmd = term->escape_buf[term->escape_len - 1];
-
- int params[8] = {0};
- int param_count = 0;
- int num = 0;
- bool in_num = false;
-
- for (int i = 0; i < term->escape_len - 1 && param_count < 8; i++) {
- char c = seq[i];
- if (c >= '0' && c <= '9') {
- num = num * 10 + (c - '0');
- in_num = true;
- } else if (c == ';') {
- if (in_num) params[param_count++] = num;
- num = 0;
- in_num = false;
- }
+static void term_process_escape(struct terminal *term) {
+ if (term->escape_len < 1)
+ return;
+
+ /* CSI sequences start with [ */
+ if (term->escape_buf[0] == '[') {
+ char *seq = term->escape_buf + 1;
+ char cmd = term->escape_buf[term->escape_len - 1];
+
+ int params[8] = {0};
+ int param_count = 0;
+ int num = 0;
+ bool in_num = false;
+
+ for (int i = 0; i < term->escape_len - 1 && param_count < 8; i++) {
+ char c = seq[i];
+ if (c >= '0' && c <= '9') {
+ num = num * 10 + (c - '0');
+ in_num = true;
+ } else if (c == ';') {
+ if (in_num)
+ params[param_count++] = num;
+ num = 0;
+ in_num = false;
+ }
+ }
+ if (in_num)
+ params[param_count++] = num;
+
+ switch (cmd) {
+ case 'A': /* Cursor Up */
+ term->cursor_y -= (params[0] > 0) ? params[0] : 1;
+ if (term->cursor_y < 0)
+ term->cursor_y = 0;
+ break;
+
+ case 'B': /* Cursor Down */
+ term->cursor_y += (params[0] > 0) ? params[0] : 1;
+ if (term->cursor_y >= term->rows)
+ term->cursor_y = term->rows - 1;
+ break;
+
+ case 'C': /* Cursor Forward */
+ term->cursor_x += (params[0] > 0) ? params[0] : 1;
+ if (term->cursor_x >= term->cols)
+ term->cursor_x = term->cols - 1;
+ break;
+
+ case 'D': /* Cursor Back */
+ term->cursor_x -= (params[0] > 0) ? params[0] : 1;
+ if (term->cursor_x < 0)
+ term->cursor_x = 0;
+ break;
+
+ case 'H': /* Cursor Position */
+ case 'f':
+ term->cursor_y = (params[0] > 0) ? params[0] - 1 : 0;
+ term->cursor_x = (param_count > 1 && params[1] > 0) ? params[1] - 1 : 0;
+ if (term->cursor_y >= term->rows)
+ term->cursor_y = term->rows - 1;
+ if (term->cursor_x >= term->cols)
+ term->cursor_x = term->cols - 1;
+ break;
+
+ case 'J': /* Erase Display */
+ if (params[0] == 2) {
+ /* Clear entire screen */
+ for (int row = 0; row < term->rows; row++) {
+ term_clear_line(term, row);
}
- if (in_num) params[param_count++] = num;
-
- switch (cmd) {
- case 'A': /* Cursor Up */
- term->cursor_y -= (params[0] > 0) ? params[0] : 1;
- if (term->cursor_y < 0) term->cursor_y = 0;
- break;
-
- case 'B': /* Cursor Down */
- term->cursor_y += (params[0] > 0) ? params[0] : 1;
- if (term->cursor_y >= term->rows) term->cursor_y = term->rows - 1;
- break;
-
- case 'C': /* Cursor Forward */
- term->cursor_x += (params[0] > 0) ? params[0] : 1;
- if (term->cursor_x >= term->cols) term->cursor_x = term->cols - 1;
- break;
-
- case 'D': /* Cursor Back */
- term->cursor_x -= (params[0] > 0) ? params[0] : 1;
- if (term->cursor_x < 0) term->cursor_x = 0;
- break;
-
- case 'H': /* Cursor Position */
- case 'f':
- term->cursor_y = (params[0] > 0) ? params[0] - 1 : 0;
- term->cursor_x = (param_count > 1 && params[1] > 0) ? params[1] - 1 : 0;
- if (term->cursor_y >= term->rows) term->cursor_y = term->rows - 1;
- if (term->cursor_x >= term->cols) term->cursor_x = term->cols - 1;
- break;
-
- case 'J': /* Erase Display */
- if (params[0] == 2) {
- /* Clear entire screen */
- for (int row = 0; row < term->rows; row++) {
- term_clear_line(term, row);
- }
- term->cursor_x = 0;
- term->cursor_y = 0;
- }
- break;
-
- case 'K': /* Erase Line */
- for (int col = term->cursor_x; col < term->cols; col++) {
- int idx = term->cursor_y * term->cols + col;
- term->chars[idx] = ' ';
- }
- break;
-
- case 'm': /* SGR - Select Graphic Rendition */
- for (int i = 0; i < param_count; i++) {
- int p = params[i];
- if (p == 0) {
- term->current_fg = 7;
- term->current_bg = 0;
- } else if (p >= 30 && p <= 37) {
- term->current_fg = p - 30;
- } else if (p >= 40 && p <= 47) {
- term->current_bg = p - 40;
- } else if (p >= 90 && p <= 97) {
- term->current_fg = p - 90 + 8;
- } else if (p >= 100 && p <= 107) {
- term->current_bg = p - 100 + 8;
- }
- }
- break;
+ term->cursor_x = 0;
+ term->cursor_y = 0;
+ }
+ break;
+
+ case 'K': /* Erase Line */
+ for (int col = term->cursor_x; col < term->cols; col++) {
+ int idx = term->cursor_y * term->cols + col;
+ term->chars[idx] = ' ';
+ }
+ break;
+
+ case 'm': /* SGR - Select Graphic Rendition */
+ for (int i = 0; i < param_count; i++) {
+ int p = params[i];
+ if (p == 0) {
+ term->current_fg = 7;
+ term->current_bg = 0;
+ } else if (p >= 30 && p <= 37) {
+ term->current_fg = p - 30;
+ } else if (p >= 40 && p <= 47) {
+ term->current_bg = p - 40;
+ } else if (p >= 90 && p <= 97) {
+ term->current_fg = p - 90 + 8;
+ } else if (p >= 100 && p <= 107) {
+ term->current_bg = p - 100 + 8;
}
+ }
+ break;
}
-
- term->in_escape = false;
- term->escape_len = 0;
+ }
+
+ term->in_escape = false;
+ term->escape_len = 0;
}
/* ===================================================================== */
/* Character Output */
/* ===================================================================== */
-void term_putc(struct terminal *term, char c)
-{
- if (term->in_escape) {
- term->escape_buf[term->escape_len++] = c;
-
- /* Check for end of escape sequence */
- if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '~') {
- term_process_escape(term);
- } else if (term->escape_len >= 31) {
- term->in_escape = false;
- term->escape_len = 0;
- }
- return;
- }
-
- switch (c) {
- case '\033': /* ESC */
- term->in_escape = true;
- term->escape_len = 0;
- break;
-
- case '\n':
- term_newline(term);
- break;
-
- case '\r':
- term->cursor_x = 0;
- break;
-
- case '\b':
- if (term->cursor_x > 0) {
- term->cursor_x--;
- }
- break;
-
- case '\t':
- term->cursor_x = (term->cursor_x + 8) & ~7;
- if (term->cursor_x >= term->cols) {
- term_newline(term);
- }
- break;
-
- default:
- if (c >= 32 && c < 127) {
- int idx = term->cursor_y * term->cols + term->cursor_x;
- term->chars[idx] = c;
- term->fg_colors[idx] = term->current_fg;
- term->bg_colors[idx] = term->current_bg;
-
- term->cursor_x++;
- if (term->cursor_x >= term->cols) {
- term_newline(term);
- }
- }
- break;
+void term_putc(struct terminal *term, char c) {
+ if (term->in_escape) {
+ term->escape_buf[term->escape_len++] = c;
+
+ /* Check for end of escape sequence */
+ if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '~') {
+ term_process_escape(term);
+ } else if (term->escape_len >= 31) {
+ term->in_escape = false;
+ term->escape_len = 0;
}
-}
+ return;
+ }
+
+ switch (c) {
+ case '\033': /* ESC */
+ term->in_escape = true;
+ term->escape_len = 0;
+ break;
+
+ case '\n':
+ term_newline(term);
+ break;
+
+ case '\r':
+ term->cursor_x = 0;
+ break;
-void term_puts(struct terminal *term, const char *str)
-{
- while (*str) {
- term_putc(term, *str++);
+ case '\b':
+ if (term->cursor_x > 0) {
+ term->cursor_x--;
}
+ break;
+
+ case '\t':
+ term->cursor_x = (term->cursor_x + 8) & ~7;
+ if (term->cursor_x >= term->cols) {
+ term_newline(term);
+ }
+ break;
+
+ default:
+ if (c >= 32 && c < 127) {
+ int idx = term->cursor_y * term->cols + term->cursor_x;
+ term->chars[idx] = c;
+ term->fg_colors[idx] = term->current_fg;
+ term->bg_colors[idx] = term->current_bg;
+
+ term->cursor_x++;
+ if (term->cursor_x >= term->cols) {
+ term_newline(term);
+ }
+ }
+ break;
+ }
+}
+
+void term_puts(struct terminal *term, const char *str) {
+ while (*str) {
+ term_putc(term, *str++);
+ }
}
/* ===================================================================== */
/* Rendering */
/* ===================================================================== */
-void term_render(struct terminal *term)
-{
- if (!term) return;
-
- int base_x = term->content_x + TERM_PADDING;
- int base_y = term->content_y + TERM_PADDING;
-
- /* Draw background */
- gui_draw_rect(term->content_x, term->content_y,
- term->cols * TERM_CHAR_W + TERM_PADDING * 2,
- term->rows * TERM_CHAR_H + TERM_PADDING * 2,
- term_colors[0]);
-
- /* Draw characters */
- for (int row = 0; row < term->rows; row++) {
- for (int col = 0; col < term->cols; col++) {
- int idx = row * term->cols + col;
- char c = term->chars[idx];
- uint32_t fg = term_colors[term->fg_colors[idx] & 0xF];
- uint32_t bg = term_colors[term->bg_colors[idx] & 0xF];
-
- int x = base_x + col * TERM_CHAR_W;
- int y = base_y + row * TERM_CHAR_H;
-
- gui_draw_char(x, y, c, fg, bg);
- }
- }
-
- /* Draw cursor */
- if (term->cursor_visible) {
- int x = base_x + term->cursor_x * TERM_CHAR_W;
- int y = base_y + term->cursor_y * TERM_CHAR_H;
- gui_draw_rect(x, y, TERM_CHAR_W, TERM_CHAR_H, term_colors[7]);
+void term_render(struct terminal *term) {
+ if (!term)
+ return;
+
+ int base_x = term->content_x + TERM_PADDING;
+ int base_y = term->content_y + TERM_PADDING;
+
+ /* Draw background */
+ gui_draw_rect(term->content_x, term->content_y,
+ term->cols * TERM_CHAR_W + TERM_PADDING * 2,
+ term->rows * TERM_CHAR_H + TERM_PADDING * 2, term_colors[0]);
+
+ /* Draw characters */
+ for (int row = 0; row < term->rows; row++) {
+ for (int col = 0; col < term->cols; col++) {
+ int idx = row * term->cols + col;
+ char c = term->chars[idx];
+ uint32_t fg = term_colors[term->fg_colors[idx] & 0xF];
+ uint32_t bg = term_colors[term->bg_colors[idx] & 0xF];
+
+ int x = base_x + col * TERM_CHAR_W;
+ int y = base_y + row * TERM_CHAR_H;
+
+ gui_draw_char(x, y, c, fg, bg);
}
+ }
+
+ /* Draw cursor */
+ if (term->cursor_visible) {
+ int x = base_x + term->cursor_x * TERM_CHAR_W;
+ int y = base_y + term->cursor_y * TERM_CHAR_H;
+ gui_draw_rect(x, y, TERM_CHAR_W, TERM_CHAR_H, term_colors[7]);
+ }
}
/* ===================================================================== */
/* Shell Command Execution */
/* ===================================================================== */
-static int str_starts_with(const char *str, const char *prefix)
-{
- while (*prefix) {
- if (*str++ != *prefix++) return 0;
- }
- return 1;
+static int str_starts_with(const char *str, const char *prefix) {
+ while (*prefix) {
+ if (*str++ != *prefix++)
+ return 0;
+ }
+ return 1;
}
-static char to_lower(char c)
-{
- if (c >= 'A' && c <= 'Z') return (char)(c + 32);
- return c;
+static char to_lower(char c) {
+ if (c >= 'A' && c <= 'Z')
+ return (char)(c + 32);
+ return c;
}
-static int str_ends_with_ci(const char *str, const char *suffix)
-{
- if (!str || !suffix) return 0;
- int slen = 0;
- int suflen = 0;
- while (str[slen]) slen++;
- while (suffix[suflen]) suflen++;
- if (suflen == 0 || slen < suflen) return 0;
- for (int i = 0; i < suflen; i++) {
- if (to_lower(str[slen - suflen + i]) != to_lower(suffix[i])) return 0;
- }
- return 1;
+static int str_ends_with_ci(const char *str, const char *suffix) {
+ if (!str || !suffix)
+ return 0;
+ int slen = 0;
+ int suflen = 0;
+ while (str[slen])
+ slen++;
+ while (suffix[suflen])
+ suflen++;
+ if (suflen == 0 || slen < suflen)
+ return 0;
+ for (int i = 0; i < suflen; i++) {
+ if (to_lower(str[slen - suflen + i]) != to_lower(suffix[i]))
+ return 0;
+ }
+ return 1;
+}
+
+static void build_path(struct terminal *term, const char *input, char *out,
+ int out_size) {
+ if (!term || !input || !out || out_size <= 0)
+ return;
+ while (*input == ' ')
+ input++;
+ int len = 0;
+ while (input[len] && input[len] != '\n')
+ len++;
+
+ if (len == 0) {
+ out[0] = '\0';
+ return;
+ }
+
+ if (input[0] == '/') {
+ int i = 0;
+ while (i < len && i < out_size - 1) {
+ out[i] = input[i];
+ i++;
+ }
+ out[i] = '\0';
+ return;
+ }
+
+ int idx = 0;
+ int cwd_len = 0;
+ while (term->cwd[cwd_len])
+ cwd_len++;
+ for (int i = 0; i < cwd_len && idx < out_size - 1; i++) {
+ out[idx++] = term->cwd[i];
+ }
+ if (idx == 0) {
+ out[idx++] = '/';
+ } else if (out[idx - 1] != '/' && idx < out_size - 1) {
+ out[idx++] = '/';
+ }
+ for (int i = 0; i < len && idx < out_size - 1; i++) {
+ out[idx++] = input[i];
+ }
+ out[idx] = '\0';
+}
+
+#include "fs/vfs.h"
+
+/* Helper for ls command */
+static int ls_callback(void *ctx, const char *name, int len, loff_t offset,
+ ino_t ino, unsigned type) {
+ struct terminal *term = (struct terminal *)ctx;
+
+ char buf[256];
+ int i;
+ for (i = 0; i < len && i < 255; i++)
+ buf[i] = name[i];
+ buf[i] = '\0';
+
+ /* Type >> 12. 4 = DIR, 8 = REG */
+ /* Check if directory */
+ if (type == 4) {
+ term_puts(term, "\033[1;34m"); /* Bright Blue */
+ term_puts(term, buf);
+ term_puts(term, "/\033[0m ");
+ } else {
+ term_puts(term, buf);
+ term_puts(term, " ");
+ }
+ return 0;
}
-static void build_path(struct terminal *term, const char *input, char *out, int out_size)
-{
- if (!term || !input || !out || out_size <= 0) return;
- while (*input == ' ') input++;
+void term_execute_command(struct terminal *term, const char *cmd) {
+ /* Skip leading whitespace */
+ while (*cmd == ' ')
+ cmd++;
+
+ if (*cmd == '\0')
+ return;
+
+ /* Built-in commands */
+ if (str_starts_with(cmd, "clear")) {
+ for (int row = 0; row < term->rows; row++) {
+ term_clear_line(term, row);
+ }
+ term->cursor_x = 0;
+ term->cursor_y = 0;
+ } else if (str_starts_with(cmd, "help")) {
+ term_puts(term, "\033[1;36mVib-OS Terminal v2.0\033[0m\n");
+ term_puts(term, "\033[33mFile Commands:\033[0m\n");
+ term_puts(term, " ls - List directory contents\n");
+ term_puts(term, " cd - Change directory\n");
+ term_puts(term, " pwd - Print working directory\n");
+ term_puts(term, " cat - Display file contents\n");
+ term_puts(term, " touch - Create empty file\n");
+ term_puts(term, " mkdir - Create directory\n");
+ term_puts(term, " rmdir - Remove empty directory\n");
+ term_puts(term, " rm - Remove file\n");
+ term_puts(term, "\033[33mMedia Commands:\033[0m\n");
+ term_puts(term, " play - Play MP3 audio\n");
+ term_puts(term, " view - View JPEG image\n");
+ term_puts(term, " sound - Test audio output\n");
+ term_puts(term, "\033[33mLanguages:\033[0m\n");
+ term_puts(term, " run - Execute file (.py/.nano)\n");
+ term_puts(term, " languages - List supported languages\n");
+ term_puts(term, " man - Manual pages (nanoc,python,cpp)\n");
+ term_puts(term, "\033[33mSystem:\033[0m\n");
+ term_puts(term, " neofetch - System info\n");
+ term_puts(term, " uname - Show OS info\n");
+ term_puts(term, " id - Show user/group info\n");
+ term_puts(term, " hostname - Show hostname\n");
+ term_puts(term, " history - Show command history\n");
+ term_puts(term, " free - Memory usage\n");
+ term_puts(term, " ps - Process list\n");
+ term_puts(term, " clear - Clear screen\n");
+ term_puts(term, " help - This help message\n");
+ term_puts(term, "\033[33mNetwork:\033[0m\n");
+ term_puts(term, " ping - Ping a host\n");
+ term_puts(term, " ifconfig - Show network interfaces\n");
+ term_puts(term, " netstat - Show connections\n");
+ term_puts(term, " nslookup - DNS lookup\n");
+ term_puts(term, " curl/wget - HTTP request\n");
+ } else if (str_starts_with(cmd, "ls")) {
+ const char *path = term->cwd[0] ? term->cwd : "/";
+ struct file *dir = vfs_open(path, O_RDONLY, 0);
+ if (dir) {
+ vfs_readdir(dir, term, ls_callback);
+ vfs_close(dir);
+ term_puts(term, "\n");
+ } else {
+ term_puts(term, "ls: Failed to open root directory\n");
+ }
+ } else if (str_starts_with(cmd, "pwd")) {
+ if (term->cwd[0])
+ term_puts(term, term->cwd);
+ else
+ term_puts(term, "/");
+ term_puts(term, "\n");
+ } else if (str_starts_with(cmd, "cd ")) {
+ char *path = (char *)cmd + 3;
+ while (*path == ' ')
+ path++;
+
+ /* Remove newline if present */
int len = 0;
- while (input[len] && input[len] != '\n') len++;
+ while (path[len] && path[len] != '\n')
+ len++;
+ path[len] = '\0';
- if (len == 0) {
- out[0] = '\0';
- return;
+ if (len == 0)
+ return;
+
+ /* Handle relative paths manually for now or use vfs_lookup if absolute */
+ char target[256];
+ if (path[0] == '/') {
+ int i = 0;
+ while (path[i] && i < 255) {
+ target[i] = path[i];
+ i++;
+ }
+ target[i] = '\0';
+ } else {
+ /* Append to CWD */
+ int i = 0;
+ while (term->cwd[i]) {
+ target[i] = term->cwd[i];
+ i++;
+ }
+ if (i > 0 && target[i - 1] != '/')
+ target[i++] = '/';
+ int j = 0;
+ while (path[j] && i < 255) {
+ target[i++] = path[j++];
+ }
+ target[i] = '\0';
}
- if (input[0] == '/') {
- int i = 0;
- while (i < len && i < out_size - 1) {
- out[i] = input[i];
- i++;
- }
- out[i] = '\0';
- return;
+ /* Verify path exists and is dir */
+ struct file *dir = vfs_open(target, O_RDONLY, 0);
+ if (dir) {
+ /* Success */
+ int i = 0;
+ while (target[i]) {
+ term->cwd[i] = target[i];
+ i++;
+ }
+ term->cwd[i] = '\0';
+ vfs_close(dir);
+ } else {
+ term_puts(term, "cd: No such directory: ");
+ term_puts(term, path);
+ term_puts(term, "\n");
+ }
+ } else if (str_starts_with(cmd, "cat")) {
+ term_puts(term, "cat: No such file or directory\n");
+ } else if (str_starts_with(cmd, "echo ")) {
+ term_puts(term, cmd + 5);
+ term_puts(term, "\n");
+ } else if (str_starts_with(cmd, "uname")) {
+ term_puts(term, "Vib-OS 0.5.0 ARM64 aarch64\n");
+ } else if (str_starts_with(cmd, "date")) {
+ term_puts(term, "Thu Jan 16 21:35:00 EST 2026\n");
+ } else if (str_starts_with(cmd, "uptime")) {
+ term_puts(term, " 21:35:00 up 0 min, 1 user, load: 0.00, 0.00, 0.00\n");
+ } else if (str_starts_with(cmd, "free")) {
+ term_puts(term, " total used free\n");
+ term_puts(term, "Mem: 252 MB 12 MB 240 MB\n");
+ term_puts(term, "Swap: 0 MB 0 MB 0 MB\n");
+ } else if (str_starts_with(cmd, "ps")) {
+ term_puts(term, " PID TTY TIME CMD\n");
+ term_puts(term, " 1 ? 00:00:00 init\n");
+ term_puts(term, " 2 ? 00:00:00 kthread\n");
+ term_puts(term, " 10 tty1 00:00:00 shell\n");
+ } else if (str_starts_with(cmd, "whoami")) {
+ term_puts(term, "root\n");
+ } else if (str_starts_with(cmd, "neofetch")) {
+ term_puts(term, "\033[36m");
+ term_puts(term, " _ _ ___ ____ \n");
+ term_puts(term, " __ _(_)| |__ / _ \\/ ___| \n");
+ term_puts(term, " \\ \\ / / || '_ \\ | | | \\___ \\ \n");
+ term_puts(term, " \\ V /| || |_) | | |_| |___) |\n");
+ term_puts(term, " \\_/ |_||_.__/ \\___/|____/ \n");
+ term_puts(term, "\033[0m\n");
+ term_puts(term, "\033[33mOS:\033[0m Vib-OS 0.5.0\n");
+ term_puts(term, "\033[33mHost:\033[0m QEMU ARM Virtual Machine\n");
+ term_puts(term, "\033[33mKernel:\033[0m 0.5.0-arm64\n");
+ term_puts(term, "\033[33mUptime:\033[0m 0 mins\n");
+ term_puts(term, "\033[33mShell:\033[0m vsh 1.0\n");
+ term_puts(term, "\033[33mMemory:\033[0m 12 MB / 252 MB\n");
+ term_puts(term, "\033[33mCPU:\033[0m ARM Cortex-A72 (max)\n");
+ term_puts(term, "\033[33mGPU:\033[0m QEMU ramfb 1024x768\n");
+ } else if (str_starts_with(cmd, "exit")) {
+ term_puts(term, "\033[33mGoodbye!\033[0m\n");
+ } else if (str_starts_with(cmd, "play ")) {
+ char path[256];
+ build_path(term, cmd + 5, path, sizeof(path));
+ if (!path[0]) {
+ term_puts(term, "play: missing file\n");
+ return;
}
- int idx = 0;
- int cwd_len = 0;
- while (term->cwd[cwd_len]) cwd_len++;
- for (int i = 0; i < cwd_len && idx < out_size - 1; i++) {
- out[idx++] = term->cwd[i];
+ if (!str_ends_with_ci(path, ".mp3")) {
+ term_puts(term, "play: only .mp3 supported\n");
+ return;
}
- if (idx == 0) {
- out[idx++] = '/';
- } else if (out[idx - 1] != '/' && idx < out_size - 1) {
- out[idx++] = '/';
+
+ uint8_t *data = NULL;
+ size_t size = 0;
+ if (media_load_file(path, &data, &size) != 0) {
+ term_puts(term, "play: failed to read file\n");
+ return;
}
- for (int i = 0; i < len && idx < out_size - 1; i++) {
- out[idx++] = input[i];
+
+ media_audio_t audio;
+ if (media_decode_mp3(data, size, &audio) != 0) {
+ media_free_file(data);
+ term_puts(term, "play: decode failed\n");
+ return;
}
- out[idx] = '\0';
-}
+ media_free_file(data);
-#include "fs/vfs.h"
+ extern int intel_hda_play_pcm(const void *data, uint32_t samples,
+ uint8_t channels, uint32_t sample_rate);
+ intel_hda_play_pcm(audio.samples, audio.sample_count, audio.channels,
+ audio.sample_rate);
+ media_free_audio(&audio);
+ } else if (str_starts_with(cmd, "view ")) {
+ char path[256];
+ build_path(term, cmd + 5, path, sizeof(path));
+ if (!path[0]) {
+ term_puts(term, "view: missing file\n");
+ return;
+ }
-/* Helper for ls command */
-static int ls_callback(void *ctx, const char *name, int len, loff_t offset, ino_t ino, unsigned type)
-{
- struct terminal *term = (struct terminal *)ctx;
-
- char buf[256];
- int i;
- for (i = 0; i < len && i < 255; i++) buf[i] = name[i];
- buf[i] = '\0';
-
- /* Type >> 12. 4 = DIR, 8 = REG */
- /* Check if directory */
- if (type == 4) {
- term_puts(term, "\033[1;34m"); /* Bright Blue */
- term_puts(term, buf);
- term_puts(term, "/\033[0m ");
+ if (!str_ends_with_ci(path, ".jpg") && !str_ends_with_ci(path, ".jpeg")) {
+ term_puts(term, "view: only .jpg/.jpeg supported\n");
+ return;
+ }
+
+ extern void gui_open_image_viewer(const char *path);
+ gui_open_image_viewer(path);
+ } else if (str_starts_with(cmd, "sound")) {
+ term_puts(term, "Playing test tone (440Hz Square Wave)...\n");
+
+ extern int intel_hda_play_pcm(const void *data, uint32_t samples,
+ uint8_t channels, uint32_t sample_rate);
+
+ uint32_t samples = 48000; /* 1 second */
+ int16_t *buf = (int16_t *)kmalloc(samples * 4);
+ if (buf) {
+ for (uint32_t i = 0; i < samples; i++) {
+ int16_t val = (i % 100) < 50 ? 8000 : -8000;
+ buf[i * 2] = val;
+ buf[i * 2 + 1] = val;
+ }
+ intel_hda_play_pcm(buf, samples, 2, 48000);
+ /* Don't free immediately as DMA keeps using it, slight leak for test is
+ * fine or we need a callback */
} else {
- term_puts(term, buf);
- term_puts(term, " ");
+ term_puts(term, "Error: memory allocation failed\n");
}
- return 0;
-}
+ } else if (str_starts_with(cmd, "ping ")) {
+ term_puts(term, "Pinging ");
+ term_puts(term, cmd + 5);
+ term_puts(term, "...\n");
-static void term_execute_command(struct terminal *term, const char *cmd)
-{
- /* Skip leading whitespace */
- while (*cmd == ' ') cmd++;
-
- if (*cmd == '\0') return;
-
- /* Built-in commands */
- if (str_starts_with(cmd, "clear")) {
- for (int row = 0; row < term->rows; row++) {
- term_clear_line(term, row);
- }
- term->cursor_x = 0;
- term->cursor_y = 0;
+ char *ip_str = (char *)cmd + 5;
+ uint32_t ip = 0;
+ int octet = 0;
+ int shift = 24;
+
+ while (*ip_str) {
+ if (*ip_str == '.') {
+ ip |= (octet << shift);
+ shift -= 8;
+ octet = 0;
+ } else if (*ip_str >= '0' && *ip_str <= '9') {
+ octet = octet * 10 + (*ip_str - '0');
+ }
+ ip_str++;
}
- else if (str_starts_with(cmd, "help")) {
- term_puts(term, "\033[1;36mVib-OS Terminal v1.0\033[0m\n");
- term_puts(term, "\033[33mBuilt-in Commands:\033[0m\n");
- term_puts(term, " help - Show this help message\n");
- term_puts(term, " clear - Clear the terminal screen\n");
- term_puts(term, " ls - List directory contents (Real VFS)\n");
- term_puts(term, " pwd - Print working directory\n");
- term_puts(term, " cd - Change directory\n");
- term_puts(term, " cat - Display file contents\n");
- term_puts(term, " browser - Launch Web Browser\n");
- term_puts(term, " ping - Ping remote host\n");
- term_puts(term, " sound - Test audio output\n");
- term_puts(term, " play - Play MP3 audio\n");
- term_puts(term, " view - View JPEG image\n");
- term_puts(term, " neofetch - System info\n");
- }
- else if (str_starts_with(cmd, "ls")) {
- const char *path = term->cwd[0] ? term->cwd : "/";
- struct file *dir = vfs_open(path, O_RDONLY, 0);
- if (dir) {
- vfs_readdir(dir, term, ls_callback);
- vfs_close(dir);
- term_puts(term, "\n");
- } else {
- term_puts(term, "ls: Failed to open root directory\n");
- }
+ ip |= (octet << shift);
+
+ /* 0x0A000202 */
+ // term_printf("IP: %08x\n", ip);
+
+ extern int icmp_send_echo(uint32_t dest_ip, uint16_t id, uint16_t seq);
+ icmp_send_echo(ip, 1, 1);
+ term_puts(term, "Packet sent.\n");
+ } else if (str_starts_with(cmd, "browser")) {
+ term_puts(term, "Starting Browser...\n");
+ gui_create_window("Browser", 150, 100, 600, 450);
+ } else if (str_starts_with(cmd, "cat ")) {
+ char path[256];
+ build_path(term, cmd + 4, path, sizeof(path));
+ if (!path[0]) {
+ term_puts(term, "cat: missing file\n");
+ return;
+ }
+ struct file *f = vfs_open(path, O_RDONLY, 0);
+ if (f) {
+ char buf[512];
+ int n;
+ while ((n = vfs_read(f, buf, sizeof(buf) - 1)) > 0) {
+ buf[n] = '\0';
+ term_puts(term, buf);
+ }
+ vfs_close(f);
+ term_puts(term, "\n");
+ } else {
+ term_puts(term, "cat: ");
+ term_puts(term, path);
+ term_puts(term, ": No such file\n");
}
- else if (str_starts_with(cmd, "pwd")) {
- if (term->cwd[0])
- term_puts(term, term->cwd);
- else
- term_puts(term, "/");
+ /* touch command handled later with better implementation */
+ } else if (str_starts_with(cmd, "mkdir_placeholder")) {
+ /* placeholder removed - mkdir implemented below */
+ } else if (str_starts_with(cmd, "rm_placeholder")) {
+ /* placeholder removed - rm implemented below */
+ } else if (str_starts_with(cmd, "man ")) {
+ const char *topic = cmd + 4;
+ while (*topic == ' ')
+ topic++;
+ if (str_starts_with(topic, "nanoc") || str_starts_with(topic, "nano")) {
+ term_puts(term, "\033[1;36mNANOC(1) - NanoLang Compiler\033[0m\n\n");
+ term_puts(term, "SYNOPSIS: nanoc -o