From 0f8d5f8ce7660b8579b78715bc033fb7a0a8177f Mon Sep 17 00:00:00 2001 From: slinky55 Date: Wed, 10 Jun 2026 09:39:37 -0400 Subject: [PATCH] moved stuff around --- .gitignore | 4 +- boot.ld => boot/boot.ld | 0 boot.s => boot/boot.s | 0 kernel.ld => kernel/kernel.ld | 0 kmain.c => kernel/kmain.c | 2 + prekernel.s => kernel/prekernel.s | 71 ++++++++---------------------- makefile | 57 +++++++++++++++--------- os.img | Bin 0 -> 1474560 bytes 8 files changed, 58 insertions(+), 76 deletions(-) rename boot.ld => boot/boot.ld (100%) rename boot.s => boot/boot.s (100%) rename kernel.ld => kernel/kernel.ld (100%) rename kmain.c => kernel/kmain.c (88%) rename prekernel.s => kernel/prekernel.s (58%) create mode 100644 os.img diff --git a/.gitignore b/.gitignore index 35f5f6c..e0cdc8a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ isodir sysroot .idea -.vscode \ No newline at end of file +.vscode + +build \ No newline at end of file diff --git a/boot.ld b/boot/boot.ld similarity index 100% rename from boot.ld rename to boot/boot.ld diff --git a/boot.s b/boot/boot.s similarity index 100% rename from boot.s rename to boot/boot.s diff --git a/kernel.ld b/kernel/kernel.ld similarity index 100% rename from kernel.ld rename to kernel/kernel.ld diff --git a/kmain.c b/kernel/kmain.c similarity index 88% rename from kmain.c rename to kernel/kmain.c index 95dc8f6..2ecaf08 100644 --- a/kmain.c +++ b/kernel/kmain.c @@ -1,6 +1,8 @@ #include extern void halt(); +extern void idt_load(); +extern void reboot(); typedef struct { uint16_t offset_low; diff --git a/prekernel.s b/kernel/prekernel.s similarity index 58% rename from prekernel.s rename to kernel/prekernel.s index bd24ae0..22b95f7 100644 --- a/prekernel.s +++ b/kernel/prekernel.s @@ -10,9 +10,9 @@ kernel_size: .long _end - _start everything: - mov $0x1000, %ax - mov %ax, %es - mov %ax, %ds + mov $0x1000, %ax + mov %ax, %es + mov %ax, %ds # reset disk mov $0, %ah @@ -20,9 +20,9 @@ everything: # stop the cursor mov $1, %ah - mov $0,%cl - mov $0x20,%ch - int $0x11 + mov $0,%cl + mov $0x20,%ch + int $0x11 # get the system memory, if this call fails then halt clc @@ -35,9 +35,9 @@ everything: add %ax, %bx mov %bx, total_mem_mb-_start - # vga text mode - mov $0x0003, %ax - int $0x10 + # vga text mode + mov $0x0003, %ax + int $0x10 enable_a20: #enable the a20 gate @@ -46,19 +46,19 @@ enable_a20: outb %al, $0x92 prep_protected: cli - lgdt (gdt_init-_start) + lgdt gdt_init-_start mov %cr0, %eax or $0x01, %eax mov %eax, %cr0 # protected bit set - ljmpl $8, $protected + ljmpl $8, $protected halt16: jmp halt16 .code32 protected: - mov $2*8, %ax - mov %ax, %es + mov $16, %ax + mov %ax, %es mov %ax, %ds mov %ax, %ss mov $5*8, %ax @@ -70,49 +70,14 @@ protected: mov $0xFFF0, %bp ljmpl $8, $kmain -.align 4 -.global video_info_struct -video_info_struct: - .word 0 - .byte 0,0 - .word 0,0,0,0 - .long 0 -.global video_xbytes -video_xbytes: - .word 0 -.global video_xres -video_xres: - .word 0 -.global video_yres -video_yres: - .word 0 - .byte 0,0,0,0,0,0,0,0,0 - .byte 0,0,0,0,0,0,0,0,0 -.global video_buffer -video_buffer: - .long 0 - .long 0 - .word 0 - .word 0 - .byte 0,0,0,0,0,0,0,0,0,0 - .long 0 -.rept 190 - .byte 0 -.endr - # some assembly stubs we can call from the kernel .global idt_load .extern idtr idt_load: - lidt (idtr) + lidt idtr ret -.global gdt_load -gdt_load: - lgdt (gdt_init) - ret - .global reboot reboot: cli @@ -135,10 +100,10 @@ halt: gdt: .word 0,0,0,0 .word 0xffff, 0x0000, 0x9a00, 0x00cf - .word 0xffff, 0x0000, 0x9200, 0x00cf - .word 0xffff, 0x0000, 0xfa00, 0x00cf - .word 0xffff, 0x0000, 0xf200, 0x00cf - .word 0x0068, (tss-_start), 0x8901, 0x00cf + .word 0xffff, 0x0000, 0x9200, 0x00cf + .word 0xffff, 0x0000, 0xfa00, 0x00cf + .word 0xffff, 0x0000, 0xf200, 0x00cf + .word 0x0068, (tss-_start), 0x8901, 0x00cf gdt_init: .word gdt_init-gdt .long gdt diff --git a/makefile b/makefile index 5c34316..a5dd749 100644 --- a/makefile +++ b/makefile @@ -5,38 +5,51 @@ OBJCOPY = i686-elf-objcopy CFLAGS = -m32 -ffreestanding -O2 -Wall -Wextra -nostdlib ASFLAGS = -m32 +BOOT_DIR := boot +KERNEL_DIR := kernel +BUILD_DIR := build + +BOOT_BIN := $(BUILD_DIR)/boot.bin +KERNEL_BIN := $(BUILD_DIR)/kernel.bin +IMAGE := os.img + .PHONY: all clean run -all: os.img +all: $(IMAGE) -boot.o: boot.s - $(CC) $(ASFLAGS) -c boot.s -o boot.o +$(BUILD_DIR)/%.o: $(BOOT_DIR)/%.s | $(BUILD_DIR) + $(CC) $(ASFLAGS) -c $< -o $@ -boot.elf: boot.o boot.ld - $(LD) -T boot.ld -o boot.elf boot.o +$(BUILD_DIR)/%.o: $(KERNEL_DIR)/%.s | $(BUILD_DIR) + $(CC) $(ASFLAGS) -c $< -o $@ -boot.bin: boot.elf - $(OBJCOPY) -O binary boot.elf boot.bin +$(BUILD_DIR)/%.o: $(KERNEL_DIR)/%.c | $(BUILD_DIR) + $(CC) $(CFLAGS) -c $< -o $@ -prekernel.o: prekernel.s - $(CC) $(ASFLAGS) -c prekernel.s -o prekernel.o +$(BUILD_DIR)/boot.elf: $(BUILD_DIR)/boot.o $(BOOT_DIR)/boot.ld + $(LD) -T $(BOOT_DIR)/boot.ld -o $@ $(BUILD_DIR)/boot.o -kmain.o: kmain.c - $(CC) $(CFLAGS) -c kmain.c -o kmain.o +$(BOOT_BIN): $(BUILD_DIR)/boot.elf + $(OBJCOPY) -O binary $< $@ -kernel.elf: prekernel.o kmain.o kernel.ld - $(LD) -T kernel.ld -o kernel.elf prekernel.o kmain.o +KERNEL_OBJS := $(BUILD_DIR)/prekernel.o $(BUILD_DIR)/kmain.o -kernel.bin: kernel.elf - $(OBJCOPY) -O binary kernel.elf kernel.bin +$(BUILD_DIR)/kernel.elf: $(KERNEL_OBJS) $(KERNEL_DIR)/kernel.ld + $(LD) -T $(KERNEL_DIR)/kernel.ld -o $@ $(KERNEL_OBJS) -os.img: boot.bin kernel.bin - dd if=boot.bin of=os.img bs=512 count=1 - dd if=kernel.bin of=os.img bs=512 seek=1 - truncate -s 1440k os.img +$(KERNEL_BIN): $(BUILD_DIR)/kernel.elf + $(OBJCOPY) -O binary $< $@ -run: os.img - qemu-system-i386 -drive format=raw,file=os.img +$(BUILD_DIR): + mkdir -p $(BUILD_DIR) + +$(IMAGE): $(BOOT_BIN) $(KERNEL_BIN) + dd if=$(BOOT_BIN) of=$@ bs=512 count=1 + dd if=$(KERNEL_BIN) of=$@ bs=512 seek=1 + truncate -s 1440k $@ + +run: $(IMAGE) + qemu-system-i386 -drive format=raw,file=$(IMAGE) clean: - rm -f *.o *.elf *.bin os.img + rm -rf $(BUILD_DIR) $(IMAGE) diff --git a/os.img b/os.img new file mode 100644 index 0000000000000000000000000000000000000000..54a213dac05e552ead54ef79626c957730ecb4ef GIT binary patch literal 1474560 zcmeIwJ5Ll*6ae5eC=r#gYfw52p&(XhW$2{z5BL{GTMcv*5<>$1 z-4G1T21-f_V^(O0S`Z|xv%D;9DZiP_+?)G2_vSliyEUs^+CO-{R@y98$`PfFPrHq= zuG#F%LiWBre!W_XTIW(*t+Th|UW|3T&c^!Zva!4KSviWO%EyRj`P$`p7mFSA*E zb$UJ<_&W08T^z1X&t(IvBX65WH;>uej)-FZMWfODd(KPX!R$`g|FH%yM;xWMw0V^M zWHFX|YS;GiY?qUI?Z%VG)%um{&c$S9{O0c{Ux-@q+f;kY_o@9t(zO+Zo=Q5pmK1s` z>Gs1&qAhj~({eFNmAu9_((GMV(O&bKWTri$D`PdWPCmD#6lisaEGr^Cr{s% zlkwB}A5#rQcBZUDfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N u0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5)0hrnML?6On< literal 0 HcmV?d00001