Compare commits

...

6 Commits

Author SHA1 Message Date
jb
e2def09d77 loading png textures and reading obj uv coordinates 2025-07-27 19:00:58 -07:00
jb
541c4dec44 nuclear option 2025-07-26 20:04:50 -07:00
jb
6991731160 textures rendering, but not quite working 2025-07-20 07:20:11 -07:00
jb
7a91b72708 refactor to plain x/y 2025-07-16 23:53:19 -07:00
jb
5b8347afaa kind of working, but segfault on f22 2025-07-16 23:11:59 -07:00
jb
7b9d3422d5 checkpoint before triangle int refactor 2025-07-16 22:43:49 -07:00
26 changed files with 2378 additions and 893 deletions

View File

@ -11,6 +11,9 @@ add_executable(${PROJECT_NAME} scripts/main.c
scripts/mesh.c
scripts/triangle.c
scripts/light.c
scripts/texture.c
scripts/swap.c
scripts/upng.c
scripts/display.c)
# --- SDL2 SETUP ---

View File

@ -1,46 +1,48 @@
# Blender v2.76 (sub 0) OBJ File: ''
# www.blender.org
# cube.obj
#
mtllib cube.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
o cube
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v 1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v 1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 1.000000 0.333333
vt 1.000000 0.666667
vt 0.666667 0.666667
vt 0.666667 0.333333
vt 0.666667 0.000000
vt 0.000000 0.333333
vt 0.000000 0.000000
vt 0.333333 0.000000
vt 0.333333 1.000000
vt 0.000000 1.000000
vt 0.000000 0.666667
vt 0.333333 0.333333
vt 0.333333 0.666667
v 1.000000 1.000000 -1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
vt 1.000000 0.000000
vn 0.000000 -1.000000 0.000000
vt 0.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.000000 0.000000 1.000000
vn 0.000000 1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -0.000000 0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
usemtl Material
s off
f 2/1/1 3/2/1 4/3/1
f 8/1/2 7/4/2 6/5/2
f 5/6/3 6/7/3 2/8/3
f 6/8/4 7/5/4 3/4/4
f 3/9/5 7/10/5 8/11/5
f 1/12/6 4/13/6 8/11/6
f 1/4/1 2/1/1 4/3/1
f 5/14/2 8/1/2 6/5/2
f 1/12/3 5/6/3 2/8/3
f 2/12/4 6/8/4 3/4/4
f 4/13/5 3/9/5 8/11/5
f 5/6/6 1/12/6 8/11/6
vn 0.000000 -1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -1.000000 0.000000 0.000000
g cube
usemtl cube
s 1
f 1/1/1 2/2/1 3/3/1
f 3/3/1 2/2/1 4/4/1
s 2
f 3/1/2 4/2/2 5/3/2
f 5/3/2 4/2/2 6/4/2
s 3
f 5/4/3 6/3/3 7/2/3
f 7/2/3 6/3/3 8/1/3
s 4
f 7/1/4 8/2/4 1/3/4
f 1/3/4 8/2/4 2/4/4
s 5
f 2/1/5 8/2/5 4/3/5
f 4/3/5 8/2/5 6/4/5
s 6
f 7/1/6 1/2/6 5/3/6
f 5/3/6 1/2/6 3/4/6

BIN
assets/cube.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

View File

@ -18,8 +18,8 @@ void* array_hold(void* array, int count, int item_size) {
return array;
} else {
int needed_size = ARRAY_OCCUPIED(array) + count;
int double_curr = ARRAY_CAPACITY(array) * 2;
int capacity = needed_size > double_curr ? needed_size : double_curr;
int float_curr = ARRAY_CAPACITY(array) * 2;
int capacity = needed_size > float_curr ? needed_size : float_curr;
int occupied = needed_size;
int raw_size = sizeof(int) * 2 + item_size * capacity;
int* base = (int*)realloc(ARRAY_RAW_DATA(array), raw_size);
@ -37,4 +37,4 @@ void array_free(void* array) {
if (array != NULL) {
free(ARRAY_RAW_DATA(array));
}
}
}

View File

@ -11,4 +11,4 @@ void* array_hold(void* array, int count, int item_size);
int array_length(void* array);
void array_free(void* array);
#endif
#endif

View File

@ -1,9 +1,5 @@
#include "display.h"
#include <math.h>
#include <stdio.h>
#include "triangle.h"
#include "display.h"
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
uint32_t* color_buffer = NULL;
@ -20,8 +16,8 @@ bool initialize_window(void) {
// Set width and height of the SDL window with the max screen resolution
SDL_DisplayMode display_mode;
SDL_GetCurrentDisplayMode(0, &display_mode);
window_width = 800;//display_mode.w;
window_height = 800;//display_mode.h;
window_width = display_mode.w;
window_height = display_mode.h;
// Create a SDL Window
window = SDL_CreateWindow(
@ -30,7 +26,7 @@ bool initialize_window(void) {
SDL_WINDOWPOS_CENTERED,
window_width,
window_height,
0//SDL_WINDOW_BORDERLESS
SDL_WINDOW_BORDERLESS
);
if (!window) {
fprintf(stderr, "Error creating SDL window.\n");
@ -61,33 +57,11 @@ void draw_pixel(int x, int y, uint32_t color) {
}
}
void draw_rect(int x, int y, int width, int height, uint32_t color) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int current_x = x + i;
int current_y = y + j;
draw_pixel(current_x, current_y, color);
}
}
}
void draw_triangle_old(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
draw_line(x0, y0, x1, y1, color);
draw_line(x1, y1, x2, y2, color);
draw_line(x2, y2, x0, y0, color);
}
void draw_triangle(triangle_t triangle, uint32_t color) {
draw_line(triangle.points[0].x, triangle.points[0].y, triangle.points[1].x, triangle.points[1].y, color);
draw_line(triangle.points[1].x, triangle.points[1].y, triangle.points[2].x, triangle.points[2].y, color);
draw_line(triangle.points[2].x, triangle.points[2].y, triangle.points[0].x, triangle.points[0].y, color);
}
void draw_line(int x0, int y0, int x1, int y1, uint32_t color) {
int delta_x = (x1 - x0);
int delta_y = (y1 - y0);
int longest_side_length = abs(delta_x) > abs(delta_y) ? abs(delta_x) : abs(delta_y);
int longest_side_length = (abs(delta_x) >= abs(delta_y)) ? abs(delta_x) : abs(delta_y);
float x_inc = delta_x / (float)longest_side_length;
float y_inc = delta_y / (float)longest_side_length;
@ -100,7 +74,16 @@ void draw_line(int x0, int y0, int x1, int y1, uint32_t color) {
current_x += x_inc;
current_y += y_inc;
}
}
void draw_rect(int x, int y, int width, int height, uint32_t color) {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int current_x = x + i;
int current_y = y + j;
draw_pixel(current_x, current_y, color);
}
}
}
void render_color_buffer(void) {

View File

@ -5,11 +5,23 @@
#include <stdbool.h>
#include <SDL.h>
#include "triangle.h"
#define FPS 30
#define FPS 60
#define FRAME_TARGET_TIME (1000 / FPS)
enum cull_method {
CULL_NONE,
CULL_BACKFACE
};
enum render_method {
RENDER_WIRE,
RENDER_WIRE_VERTEX,
RENDER_FILL_TRIANGLE,
RENDER_FILL_TRIANGLE_WIRE,
RENDER_TEXTURED,
RENDER_TEXTURED_WIRE
};
extern SDL_Window* window;
extern SDL_Renderer* renderer;
extern uint32_t* color_buffer;
@ -17,28 +29,12 @@ extern SDL_Texture* color_buffer_texture;
extern int window_width;
extern int window_height;
enum render_methods {
RENDER_WIRE_VERTEX,
RENDER_WIRE,
RENDER_FILL_TRIANGLE,
RENDER_FILL_TRIANGLE_LINE,
};
enum cull_methods {
CULL_NONE,
CULL_BACKFACE,
};
typedef uint32_t color_t;
bool initialize_window(void);
bool initialize_window(void);
void draw_grid(void);
void draw_pixel(int x, int y, uint32_t color);
void draw_line(int x0, int y0, int x1, int y1, uint32_t color);
void draw_rect(int x, int y, int width, int height, uint32_t color);
void draw_triangle(triangle_t triangle, uint32_t color);
void draw_triangle_old(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color);
void render_color_buffer(void);
void render_color_buffer(void);
void clear_color_buffer(uint32_t color);
void destroy_window(void);

View File

@ -1,13 +1,22 @@
#include <stdint.h>
#include "light.h"
uint32_t light_apply_intensity(uint32_t original_color, float p) {
if (p < 0) p = 0;
if (p > 1) p = 1;
light_t light = {
.direction = { 0, 0, 1 }
};
///////////////////////////////////////////////////////////////////////////////
// Change color based on a percentage factor to represent light intensity
///////////////////////////////////////////////////////////////////////////////
uint32_t light_apply_intensity(uint32_t original_color, float percentage_factor) {
if (percentage_factor < 0) percentage_factor = 0;
if (percentage_factor > 1) percentage_factor = 1;
uint32_t a = (original_color & 0xFF000000);
uint32_t r = (original_color & 0x00FF0000) * p;
uint32_t g = (original_color & 0x0000FF00) * p;
uint32_t b = (original_color & 0x000000FF) * p;
uint32_t r = (original_color & 0x00FF0000) * percentage_factor;
uint32_t g = (original_color & 0x0000FF00) * percentage_factor;
uint32_t b = (original_color & 0x000000FF) * percentage_factor;
return (a | (r & 0x00FF0000) | (g & 0x0000FF00) | (b & 0x000000FF));
}
uint32_t new_color = a | (r & 0x00FF0000) | (g & 0x0000FF00) | (b & 0x000000FF);
return new_color;
}

View File

@ -8,7 +8,8 @@ typedef struct {
vec3_t direction;
} light_t;
uint32_t light_apply_intensity(uint32_t original_color, float p);
extern light_t light;
uint32_t light_apply_intensity(uint32_t original_color, float percentage_factor);
#endif

View File

@ -1,77 +1,74 @@
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include <SDL.h>
#include "display.h"
#include "mesh.h"
#include "vector.h"
#include "array.h"
#include "display.h"
#include "vector.h"
#include "matrix.h"
#include "light.h"
#include "triangle.h"
#include "texture.h"
#include "mesh.h"
#define STEP 0.075
uint32_t colors[12] = {
0xFF6A2EFF, // purple
0xFFE9C46A, // sand yellow
0xFF2A9D8F, // teal green
0xFFF4A261, // orange
0xFF264653, // dark blue-grey
0xFFB5838D, // mauve
0xFFD7263D, // red
0xFF38A3A5, // turquoise
0xFF757575, // grey
0xFF70C1B3, // light green-blue
0xFFFFC300, // yellow
0xFF5D2E8C // deep purple
};
triangle_t* triangles_to_render = NULL; //[N_MESH_FACES];
vec3_t camera_position = { 0, 0, 0 };
mat4_t proj_matrix;
light_t light = { .direction = { .x = 0, .y = 0, .z = 1 }};
///////////////////////////////////////////////////////////////////////////////
// Array of triangles that should be rendered frame by frame
///////////////////////////////////////////////////////////////////////////////
triangle_t* triangles_to_render = NULL;
int render_method, cull_method;
///////////////////////////////////////////////////////////////////////////////
// Global variables for execution status and game loop
///////////////////////////////////////////////////////////////////////////////
bool is_running = false;
int previous_frame_time = 0;
int cull_method = CULL_BACKFACE;
int render_method = RENDER_FILL_TRIANGLE;
bool sort_faces = true;
uint32_t previous_frame_time = 0;
vec3_t camera_position = { .x = 0, .y = 0, .z = 0 };
mat4_t proj_matrix;
///////////////////////////////////////////////////////////////////////////////
// Setup function to initialize variables and game objects
///////////////////////////////////////////////////////////////////////////////
void setup(void) {
// Initialize render mode and triangle culling method
render_method = RENDER_TEXTURED_WIRE;
cull_method = CULL_BACKFACE;
// Allocate the required memory in bytes to hold the color buffer
color_buffer = (uint32_t*) malloc(sizeof(uint32_t) * window_width * window_height);
color_buffer = (uint32_t*)malloc(sizeof(uint32_t) * window_width * window_height);
// Creating a SDL texture that is used to display the color buffer
color_buffer_texture = SDL_CreateTexture(
renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_RGBA32,
SDL_TEXTUREACCESS_STREAMING,
window_width,
window_height
);
float fov = M_PI / 3;
// Initialize the perspective projection matrix
float fov = M_PI / 3.0; // the same as 180/3, or 60deg
float aspect = (float)window_height / (float)window_width;
float znear = 0.0f;
float zfar = 100.0f;
float znear = 0.1;
float zfar = 100.0;
proj_matrix = mat4_make_perspective(fov, aspect, znear, zfar);
// load cube mesh data
load_file("..\\assets\\f22.obj");
//load_cube_mesh_data();
// Manually load the hardcoded texture data from the static array
//mesh_texture = (uint32_t*)REDBRICK_TEXTURE;
//texture_width = 64;
//texture_height = 64;
load_png_texture_data("../assets/cube.png");
// Loads the vertex and face values for the mesh data structure
//load_cube_mesh_data();
load_obj_file_data("../assets/cube.obj");
}
///////////////////////////////////////////////////////////////////////////////
// Poll system events and handle keyboard input
///////////////////////////////////////////////////////////////////////////////
void process_input(void) {
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
is_running = false;
@ -79,144 +76,113 @@ void process_input(void) {
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
is_running = false;
//break;
if (event.key.keysym.sym == SDLK_UP)
mesh.rotation.z += STEP;
if (event.key.keysym.sym == SDLK_LEFT)
mesh.rotation.x += STEP;
if (event.key.keysym.sym == SDLK_RIGHT)
mesh.rotation.y += STEP;
break;
case SDL_KEYUP:
SDL_Keycode key = event.key.keysym.sym;
if (key == SDLK_c) {
cull_method = !cull_method;
}
if (key == SDLK_s) {
sort_faces = !sort_faces;
}
if (key == SDLK_1) {
if (event.key.keysym.sym == SDLK_1)
render_method = RENDER_WIRE_VERTEX;
}
if (key == SDLK_2) {
if (event.key.keysym.sym == SDLK_2)
render_method = RENDER_WIRE;
}
if (key == SDLK_3) {
if (event.key.keysym.sym == SDLK_3)
render_method = RENDER_FILL_TRIANGLE;
}
if (key == SDLK_4) {
render_method = RENDER_FILL_TRIANGLE_LINE;
}
if (event.key.keysym.sym == SDLK_4)
render_method = RENDER_FILL_TRIANGLE_WIRE;
if (event.key.keysym.sym == SDLK_5)
render_method = RENDER_TEXTURED;
if (event.key.keysym.sym == SDLK_6)
render_method = RENDER_TEXTURED_WIRE;
if (event.key.keysym.sym == SDLK_c)
cull_method = CULL_BACKFACE;
if (event.key.keysym.sym == SDLK_d)
cull_method = CULL_NONE;
break;
}
}
////////////////////////////////////////////////////////////////////////////////
// Function that receives a 3D vector and returns a projected 2D point
////////////////////////////////////////////////////////////////////////////////
vec2_t project(vec3_t point) {
float fov_factor = 1; // placeholder
vec2_t projected_point = {
.x = roundf((fov_factor * point.x) / point.z),
.y = roundf((fov_factor * point.y) / point.z),
};
return projected_point;
}
///////////////////////////////////////////////////////////////////////////////
// Update function frame by frame with a fixed time step
///////////////////////////////////////////////////////////////////////////////
void update(void) {
//while (!SDL_TICKS_PASSED(SDL_GetTicks(), previous_frame_time + FRAME_TARGET_TIME));
// Wait some time until the reach the target frame time in milliseconds
int time_to_wait = FRAME_TARGET_TIME - (SDL_GetTicks() - previous_frame_time);
// only delay execution if we are running too fast
// Only delay execution if we are running too fast
if (time_to_wait > 0 && time_to_wait <= FRAME_TARGET_TIME) {
SDL_Delay(time_to_wait);
}
previous_frame_time = SDL_GetTicks();
//mesh.rotation.y += 0.01f;
mesh.rotation.x -= 0.01f;
//mesh.rotation.z += 0.01f;
// Initialize the array of triangles to render
triangles_to_render = NULL;
//mesh.translation.x += 0.004f;
mesh.translation.z = 5.0f;
// Change the mesh scale, rotation, and translation values per animation frame
mesh.rotation.x += 0.000;
mesh.rotation.y += 0.003;
mesh.rotation.z += 0.000;
mesh.translation.z = 5.0;
//mesh.scale.x += 0.002f;
//mesh.scale.y += 0.002f;
// create scale matrix that will be used
// Create scale, rotation, and translation matrices that will be used to multiply the mesh vertices
mat4_t scale_matrix = mat4_make_scale(mesh.scale.x, mesh.scale.y, mesh.scale.z);
// create translation matrix
mat4_t translation_matrix = mat4_make_translation(mesh.translation.x, mesh.translation.y, mesh.translation.z);
// create rotation matrices
mat4_t rotation_matrix_x = mat4_make_rotation_x(mesh.rotation.x);
mat4_t rotation_matrix_y = mat4_make_rotation_y(mesh.rotation.y);
mat4_t rotation_matrix_z = mat4_make_rotation_z(mesh.rotation.z);
// create world matrix
mat4_t world_matrix = mat4_identity();
world_matrix = mat4_mul_mat4(&scale_matrix, &world_matrix);
world_matrix = mat4_mul_mat4(&rotation_matrix_x, &world_matrix);
world_matrix = mat4_mul_mat4(&rotation_matrix_y, &world_matrix);
world_matrix = mat4_mul_mat4(&rotation_matrix_z, &world_matrix);
world_matrix = mat4_mul_mat4(&translation_matrix, &world_matrix);
triangles_to_render = NULL;
// Loop all triangle faces of our mesh
int num_faces = array_length(mesh.faces);
for (int i = 0; i < num_faces; i++) {
face_t mesh_face = mesh.faces[i];
vec3_t face_vertices[3];
face_vertices[0] = mesh.vertices[mesh_face.a - 1];
face_vertices[1] = mesh.vertices[mesh_face.b - 1];
face_vertices[2] = mesh.vertices[mesh_face.c - 1];
face_vertices[0] = mesh.vertices[mesh_face.a];
face_vertices[1] = mesh.vertices[mesh_face.b];
face_vertices[2] = mesh.vertices[mesh_face.c];
vec4_t transformed_vertices[3];
// Loop all three vertices of this current face and apply transformations
for (int j = 0; j < 3; j++) {
vec4_t transformed_vertex = vec4_from_vec3(face_vertices[j]);
// use matrix to scale original matrix
transformed_vertex = mat4_multiply_vec4(world_matrix, transformed_vertex);
// Create a World Matrix combining scale, rotation, and translation matrices
mat4_t world_matrix = mat4_identity();
// save translated vertex in the array of transformed vertices
// Order matters: First scale, then rotate, then translate. [T]*[R]*[S]*v
world_matrix = mat4_mul_mat4(scale_matrix, world_matrix);
world_matrix = mat4_mul_mat4(rotation_matrix_z, world_matrix);
world_matrix = mat4_mul_mat4(rotation_matrix_y, world_matrix);
world_matrix = mat4_mul_mat4(rotation_matrix_x, world_matrix);
world_matrix = mat4_mul_mat4(translation_matrix, world_matrix);
// Multiply the world matrix by the original vector
transformed_vertex = mat4_mul_vec4(world_matrix, transformed_vertex);
// Save transformed vertex in the array of transformed vertices
transformed_vertices[j] = transformed_vertex;
}
vec3_t vector_a = vec3_from_vec4(transformed_vertices[0]); /* A */
vec3_t vector_b = vec3_from_vec4(transformed_vertices[1]); /* / \ */
vec3_t vector_c = vec3_from_vec4(transformed_vertices[2]); /* C---B */
// Get individual vectors from A, B, and C vertices to compute normal
vec3_t vector_a = vec3_from_vec4(transformed_vertices[0]); /* A */
vec3_t vector_b = vec3_from_vec4(transformed_vertices[1]); /* / \ */
vec3_t vector_c = vec3_from_vec4(transformed_vertices[2]); /* C---B */
// get the vector subtraction of B-A and C-A
vec3_t vector_ab = vec3_subtract(vector_b, vector_a);
vec3_t vector_ac = vec3_subtract(vector_c, vector_a);
// Get the vector subtraction of B-A and C-A
vec3_t vector_ab = vec3_sub(vector_b, vector_a);
vec3_t vector_ac = vec3_sub(vector_c, vector_a);
vec3_normalize(&vector_ab);
vec3_normalize(&vector_ac);
// compute the face normal using the cross product to find perpindicular
// Compute the face normal (using cross product to find perpendicular)
vec3_t normal = vec3_cross(vector_ab, vector_ac);
vec3_normalize(&normal);
// Find the vector between vertex A in the triangle and the camera origin
vec3_t camera_ray = vec3_sub(camera_position, vector_a);
// Calculate how aligned the camera ray is with the face normal (using dot product)
float dot_normal_camera = vec3_dot(normal, camera_ray);
// Backface culling test to see if the current face should be projected
if (cull_method == CULL_BACKFACE) {
// check backface culling
// find the vector between a point in the triangle and the camera origin
vec3_t camera_ray = vec3_subtract(camera_position, vector_a);
// calculate how aligned the camera ray is with the face normal
float dot_normal_camera = vec3_dot(normal, camera_ray);
// Backface culling, bypassing triangles that are looking away from the camera
if (dot_normal_camera < 0) {
continue;
}
@ -224,101 +190,117 @@ void update(void) {
vec4_t projected_points[3];
// Loop all three vertices to perform projection
for (int j = 0; j < 3; j++) {
// project the current vertex
// Project the current vertex
projected_points[j] = mat4_mul_vec4_project(proj_matrix, transformed_vertices[j]);
// Flip vertically since the y values of the 3D mesh grow bottom->up and in screen space y values grow top->down
projected_points[j].y *= -1;
// Scale into the view
projected_points[j].x *= (window_width / 2.0);
projected_points[j].y *= (window_height / 2.0);
// invert y to account for flipped screen y coordinates
projected_points[j].y *= -1;
// Translate the projected points to the middle of the screen
projected_points[j].x += (window_width / 2.0);
projected_points[j].y += (window_height / 2.0);
//projected_triangle.points[j] = projected_point;
}
// calculate color using normal and light direction, then invert
float dot_color_p = -vec3_dot(normal, light.direction);
// Calculate the average depth for each face based on the vertices after transformation
float avg_depth = (transformed_vertices[0].z + transformed_vertices[1].z + transformed_vertices[2].z) / 3.0;
color_t flat_shaded_color = light_apply_intensity(0xFFFFFFFF, dot_color_p);
// Calculate the shade intensity based on how aliged is the normal with the flipped light direction ray
float light_intensity_factor = -vec3_dot(normal, light.direction);
// Calculate the triangle color based on the light angle
uint32_t triangle_color = light_apply_intensity(mesh_face.color, light_intensity_factor);
// calculate the average depth of the triangle
float avg_depth = (transformed_vertices[0].z + transformed_vertices[1].z + transformed_vertices[2].z) / 3.0f;
#define FUNC3 roundf
triangle_t projected_triangle = {
.points = {
{ FUNC3(projected_points[0].x), FUNC3(projected_points[0].y) },
{ FUNC3(projected_points[1].x), FUNC3(projected_points[1].y) },
{ FUNC3(projected_points[2].x), FUNC3(projected_points[2].y) },
{ projected_points[0].x, projected_points[0].y, projected_points[0].z, projected_points[0].w },
{ projected_points[1].x, projected_points[1].y, projected_points[1].z, projected_points[1].w },
{ projected_points[2].x, projected_points[2].y, projected_points[2].z, projected_points[2].w },
},
.color = flat_shaded_color,
.average_depth = avg_depth,
.texcoords = {
{ mesh_face.a_uv.u, mesh_face.a_uv.v },
{ mesh_face.b_uv.u, mesh_face.b_uv.v },
{ mesh_face.c_uv.u, mesh_face.c_uv.v }
},
.color = triangle_color,
.avg_depth = avg_depth
};
//vec2_t midpoint = triangle_midpoint(projected_triangle);
//draw_rect(midpoint.x, midpoint.y, 10, 10, 0xFFFF0000);
// save the projected triangle in the array of triangles
// Save the projected triangle in the array of triangles to render
array_push(triangles_to_render, projected_triangle);
}
triangle_t normal_triangle;
// Sort the triangles to render by their avg_depth
int num_triangles = array_length(triangles_to_render);
for (int i = 0; i < num_triangles; i++) {
for (int j = i; j < num_triangles; j++) {
if (triangles_to_render[i].avg_depth < triangles_to_render[j].avg_depth) {
// Swap the triangles positions in the array
triangle_t temp = triangles_to_render[i];
triangles_to_render[i] = triangles_to_render[j];
triangles_to_render[j] = temp;
}
}
}
}
int depth_comp(const void* a, const void* b) {
triangle_t arg_a = *(const triangle_t*)a;
triangle_t arg_b = *(const triangle_t*)b;
if (arg_a.average_depth > arg_b.average_depth) return -1;
if (arg_a.average_depth < arg_b.average_depth) return 1;
return 0;
}
///////////////////////////////////////////////////////////////////////////////
// Render function to draw objects on the display
///////////////////////////////////////////////////////////////////////////////
void render(void) {
SDL_RenderClear(renderer);
draw_grid();
//uint32_t colors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFF757500, 0xFF007575, 0xFF750075 };
// Loop all projected points and render them
size_t arr_length = array_length(triangles_to_render);
// sort triangles
if (sort_faces) qsort(triangles_to_render, arr_length, sizeof(triangle_t), depth_comp);
for (int i = 0; i < arr_length; i++) {
// Loop all projected triangles and render them
int num_triangles = array_length(triangles_to_render);
for (int i = 0; i < num_triangles; i++) {
triangle_t triangle = triangles_to_render[i];
switch (render_method) {
case RENDER_WIRE:
draw_triangle(triangle, 0x0000ff);
break;
case RENDER_WIRE_VERTEX:
draw_triangle(triangle, 0x0000ff);
draw_rect(triangle.points[0].x, triangle.points[0].y, 3, 3, 0xFFFFFF00);
draw_rect(triangle.points[1].x, triangle.points[1].y, 3, 3, 0xFFFFFF00);
draw_rect(triangle.points[2].x, triangle.points[2].y, 3, 3, 0xFFFFFF00);
break;
case RENDER_FILL_TRIANGLE:
draw_filled_triangle(triangle);
break;
case RENDER_FILL_TRIANGLE_LINE:
draw_filled_triangle(triangle);
draw_triangle(triangle, 0x0000ff);
break;
default:
break;
// Draw filled triangle
if (render_method == RENDER_FILL_TRIANGLE || render_method == RENDER_FILL_TRIANGLE_WIRE) {
draw_filled_triangle(
triangle.points[0].x, triangle.points[0].y, // vertex A
triangle.points[1].x, triangle.points[1].y, // vertex B
triangle.points[2].x, triangle.points[2].y, // vertex C
triangle.color
);
}
// Draw textured triangle
if (render_method == RENDER_TEXTURED || render_method == RENDER_TEXTURED_WIRE) {
draw_textured_triangle(
triangle.points[0].x, triangle.points[0].y, triangle.points[0].z, triangle.points[0].w, triangle.texcoords[0].u, triangle.texcoords[0].v, // vertex A
triangle.points[1].x, triangle.points[1].y, triangle.points[1].z, triangle.points[1].w, triangle.texcoords[1].u, triangle.texcoords[1].v, // vertex B
triangle.points[2].x, triangle.points[2].y, triangle.points[2].z, triangle.points[2].w, triangle.texcoords[2].u, triangle.texcoords[2].v, // vertex C
mesh_texture
);
}
// Draw triangle wireframe
if (render_method == RENDER_WIRE || render_method == RENDER_WIRE_VERTEX || render_method == RENDER_FILL_TRIANGLE_WIRE || render_method == RENDER_TEXTURED_WIRE) {
draw_triangle(
triangle.points[0].x, triangle.points[0].y, // vertex A
triangle.points[1].x, triangle.points[1].y, // vertex B
triangle.points[2].x, triangle.points[2].y, // vertex C
0xFFFFFFFF
);
}
// Draw triangle vertex points
if (render_method == RENDER_WIRE_VERTEX) {
draw_rect(triangle.points[0].x - 3, triangle.points[0].y - 3, 6, 6, 0xFFFF0000); // vertex A
draw_rect(triangle.points[1].x - 3, triangle.points[1].y - 3, 6, 6, 0xFFFF0000); // vertex B
draw_rect(triangle.points[2].x - 3, triangle.points[2].y - 3, 6, 6, 0xFFFF0000); // vertex C
}
}
//vec2_t m = triangle_midpoint(t);
//draw_rect(m.x, m.y, 10, 10, 0xFFFF0000);
//draw_line(10, 10, 500, 500, 0x00FF00);
// Clear the array of triangles to render every frame loop
array_free(triangles_to_render);
render_color_buffer();
@ -328,13 +310,20 @@ void render(void) {
SDL_RenderPresent(renderer);
}
///////////////////////////////////////////////////////////////////////////////
// Free the memory that was dynamically allocated by the program
///////////////////////////////////////////////////////////////////////////////
void free_resources(void) {
free(color_buffer);
array_free(mesh.faces);
array_free(mesh.vertices);
upng_free(png_texture);
}
int main(int argc, char *argv[]) {
///////////////////////////////////////////////////////////////////////////////
// Main function
///////////////////////////////////////////////////////////////////////////////
int main(int argv, char* args[]) {
is_running = initialize_window();
setup();

View File

@ -1,41 +0,0 @@
#include <SDL.h>
int main(int argc, char* args []) {
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow("Blank Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_SHOWN);
if (window == nullptr) {
SDL_Log("Failed to create window: %s", SDL_GetError());
return 1;
}
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == nullptr) {
SDL_Log("Failed to create renderer: %s", SDL_GetError());
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
bool running = true;
SDL_Event event;
while (running) {
// Close window with any input
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_MOUSEBUTTONDOWN) {
running = false;
break;
}
}
SDL_SetRenderDrawColor(renderer, 100, 100, 180, 255); // Set the background color to purple
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
}
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}

View File

@ -1,172 +0,0 @@
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <SDL.h>
bool is_running = false;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
uint32_t* color_buffer = NULL;
SDL_Texture* color_buffer_texture = NULL;
int window_width = 800;
int window_height = 600;
bool initialize_window(void) {
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
fprintf(stderr, "Error initializing SDL.\n");
return false;
}
// Set width and height of the SDL window with the max screen resolution
SDL_DisplayMode display_mode;
SDL_GetCurrentDisplayMode(0, &display_mode);
window_width = display_mode.w;
window_height = display_mode.h;
// Create a SDL Window
window = SDL_CreateWindow(
NULL,
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
window_width,
window_height,
SDL_WINDOW_BORDERLESS
);
if (!window) {
fprintf(stderr, "Error creating SDL window.\n");
return false;
}
// Create a SDL renderer
renderer = SDL_CreateRenderer(window, -1, 0);
if (!renderer) {
fprintf(stderr, "Error creating SDL renderer.\n");
return false;
}
return true;
}
void setup(void) {
// Allocate the required memory in bytes to hold the color buffer
color_buffer = (uint32_t*) malloc(sizeof(uint32_t) * window_width * window_height);
// Creating a SDL texture that is used to display the color buffer
color_buffer_texture = SDL_CreateTexture(
renderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
window_width,
window_height
);
}
void process_input(void) {
SDL_Event event;
SDL_PollEvent(&event);
switch (event.type) {
case SDL_QUIT:
is_running = false;
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
is_running = false;
break;
}
}
void update(void) {
// TODO:
}
void draw_rect(int xpos, int ypos, int width, int height, uint32_t color) {
for (int y = ypos; y < (ypos + height); y++) {
for (int x = xpos; x < (xpos + width); x++) {
color_buffer[(window_width * y) + x] = color;
}
}
}
void draw_grid(void) {
// TODO:
uint32_t color = 0xc0c0c0;
bool draw_line = false;
int grid_spacing = 40;
/*for (int y = 0; y < window_height; y++) {
draw_line = !(y % grid_spacing);
for (int x = 0; x < window_width; x++) {
if (draw_line || !(x % grid_spacing)) {
color_buffer[(window_width * y) + x] = color;
}
}
}*/
for (int y = 0; y < window_height; y = y + grid_spacing) {
for (int x = 0; x < window_width; x++) {
color_buffer[(window_width * y) + x] = color;
}
}
for (int x = 0; x < window_width; x = x + grid_spacing) {
for (int y = 0; y < window_height; y++) {
color_buffer[(window_width * y) + x] = color;
}
}
}
void render_color_buffer(void) {
SDL_UpdateTexture(
color_buffer_texture,
NULL,
color_buffer,
(int)(window_width * sizeof(uint32_t))
);
SDL_RenderCopy(renderer, color_buffer_texture, NULL, NULL);
}
void clear_color_buffer(uint32_t color) {
for (int y = 0; y < window_height; y++) {
for (int x = 0; x < window_width; x++) {
color_buffer[(window_width * y) + x] = color;
}
}
}
void render(void) {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
draw_grid();
draw_rect(20, 120, 150, 100, 0xFFFF00);
render_color_buffer();
clear_color_buffer(0xFF000000);
SDL_RenderPresent(renderer);
}
void destroy_window(void) {
free(color_buffer);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
int main(int argc, char *argv[]) {
is_running = initialize_window();
setup();
while (is_running) {
process_input();
update();
render();
}
destroy_window();
return 0;
}

View File

@ -1,139 +1,131 @@
#include <math.h>
#include "matrix.h"
mat4_t mat4_identity(void) {
// | 1 0 0 0 |
// | 0 1 0 0 |
// | 0 0 1 0 |
// | 0 0 0 1 |
mat4_t m = {{
{ 1, 0, 0, 0},
{ 0, 1, 0, 0},
{ 0, 0, 1, 0},
{ 0, 0, 0, 1},
{ 1, 0, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 0, 1, 0 },
{ 0, 0, 0, 1 }
}};
return m;
}
mat4_t mat4_make_scale(float sx, float sy, float sz) {
// | sx 0 0 0 |
// | 0 sy 0 0 |
// | 0 0 sz 0 |
// | 0 0 0 1 |
mat4_t m = mat4_identity();
m.m[0][0] *= sx;
m.m[1][1] *= sy;
m.m[2][2] *= sz;
m.m[0][0] = sx;
m.m[1][1] = sy;
m.m[2][2] = sz;
return m;
}
mat4_t mat4_make_translation(float tx, float ty, float tz) {
/*
* 1 0 0 tx
* 0 1 0 ty
* 0 0 1 tz
* 0 0 0 1
*/
// | 1 0 0 tx |
// | 0 1 0 ty |
// | 0 0 1 tz |
// | 0 0 0 1 |
mat4_t m = mat4_identity();
m.m[0][3] = tx;
m.m[1][3] = ty;
m.m[2][3] = tz;
return m;
}
mat4_t mat4_make_rotation_y(float ra) {
/*
* cos 0 -sin 0
* 0 1 0 0
* sin 0 cos 0
* 0 0 0 1
*/
const float cosine = cosf(ra);
const float sine = sinf(ra);
mat4_t mat4_make_rotation_x(float angle) {
float c = cos(angle);
float s = sin(angle);
// | 1 0 0 0 |
// | 0 c -s 0 |
// | 0 s c 0 |
// | 0 0 0 1 |
mat4_t m = mat4_identity();
m.m[0][0] = cosine;
m.m[0][2] = -sine;
m.m[2][0] = sine;
m.m[2][2] = cosine;
m.m[1][1] = c;
m.m[1][2] = -s;
m.m[2][1] = s;
m.m[2][2] = c;
return m;
}
mat4_t mat4_make_rotation_x(float ra) {
/*
* 1 0 0 0
* 0 cos sin 0
* 0 -sin cos 0
* 0 0 0 1
*/
const float cosine = cosf(ra);
const float sine = sinf(ra);
mat4_t mat4_make_rotation_y(float angle) {
float c = cos(angle);
float s = sin(angle);
// | c 0 s 0 |
// | 0 1 0 0 |
// | -s 0 c 0 |
// | 0 0 0 1 |
mat4_t m = mat4_identity();
m.m[1][1] = cosine;
m.m[1][2] = sine;
m.m[2][1] = -sine;
m.m[2][2] = cosine;
m.m[0][0] = c;
m.m[0][2] = s;
m.m[2][0] = -s;
m.m[2][2] = c;
return m;
}
mat4_t mat4_make_rotation_z(float ra) {
/*
* cos sin 0 0
* -sin cos 0 0
* 0 0 1 0
* 0 0 0 1
*/
const float cosine = cosf(ra);
const float sine = sinf(ra);
mat4_t mat4_make_rotation_z(float angle) {
float c = cos(angle);
float s = sin(angle);
// | c -s 0 0 |
// | s c 0 0 |
// | 0 0 1 0 |
// | 0 0 0 1 |
mat4_t m = mat4_identity();
m.m[0][0] = cosine;
m.m[0][1] = sine;
m.m[1][0] = -sine;
m.m[1][1] = cosine;
m.m[0][0] = c;
m.m[0][1] = -s;
m.m[1][0] = s;
m.m[1][1] = c;
return m;
}
vec4_t mat4_multiply_vec4(mat4_t m, vec4_t v) {
vec4_t ret = {};
ret.x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3] * v.w;
ret.y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3] * v.w;
ret.z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3] * v.w;
ret.w = m.m[3][0] * v.x + m.m[3][1] * v.y + m.m[3][2] * v.z + m.m[3][3] * v.w;
return ret;
vec4_t mat4_mul_vec4(mat4_t m, vec4_t v) {
vec4_t result;
result.x = m.m[0][0] * v.x + m.m[0][1] * v.y + m.m[0][2] * v.z + m.m[0][3] * v.w;
result.y = m.m[1][0] * v.x + m.m[1][1] * v.y + m.m[1][2] * v.z + m.m[1][3] * v.w;
result.z = m.m[2][0] * v.x + m.m[2][1] * v.y + m.m[2][2] * v.z + m.m[2][3] * v.w;
result.w = m.m[3][0] * v.x + m.m[3][1] * v.y + m.m[3][2] * v.z + m.m[3][3] * v.w;
return result;
}
mat4_t mat4_mul_mat4(mat4_t* a, mat4_t* b) {
mat4_t ret = {};
for (int r = 0; r < 4; r++) {
for (int c = 0; c < 4; c++) {
ret.m[r][c] = (a->m[r][0] * b->m[0][c]) + (a->m[r][1] * b->m[1][c]) + (a->m[r][2] * b->m[2][c]) + (a->m[r][3] * b->m[3][c]);
mat4_t mat4_mul_mat4(mat4_t a, mat4_t b) {
mat4_t m;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
m.m[i][j] = a.m[i][0] * b.m[0][j] + a.m[i][1] * b.m[1][j] + a.m[i][2] * b.m[2][j] + a.m[i][3] * b.m[3][j];
}
}
return ret;
return m;
}
mat4_t mat4_make_perspective(float fov, float aspect, float znear, float zfar) {
// | (h/w)*1/tan(fov/2) 0 0 0 |
// | 0 1/tan(fov/2) 0 0 |
// | 0 0 zf/(zf-zn) (-zf*zn)/(zf-zn) |
// | 0 0 1 0 |
mat4_t m = {{{ 0 }}};
m.m[0][0] = aspect * (1 / tanf(fov / 2));
m.m[1][1] = 1 / tanf(fov / 2);
m.m[0][0] = aspect * (1 / tan(fov / 2));
m.m[1][1] = 1 / tan(fov / 2);
m.m[2][2] = zfar / (zfar - znear);
m.m[2][3] = (-zfar * znear) / (zfar - znear);
m.m[3][2] = 1.0f;
m.m[3][2] = 1.0;
return m;
}
vec4_t mat4_mul_vec4_project(mat4_t mat_proj, vec4_t v) {
// multiply the projection matrix by our original vector
vec4_t result = mat4_multiply_vec4(mat_proj, v);
vec4_t result = mat4_mul_vec4(mat_proj, v);
// perform perspective divide with original z-value
// perform perspective divide with original z-value that is now stored in w
if (result.w != 0.0) {
result.x /= result.w;
result.y /= result.w;
result.z /= result.w;
}
return result;
}
}

View File

@ -1,23 +1,21 @@
#ifndef MATRIX_H
#define MATRIX_H
#include <math.h>
#include "vector.h"
typedef struct mat4_t mat4_t;
struct mat4_t {
typedef struct {
float m[4][4];
};
} mat4_t;
mat4_t mat4_identity(void);
mat4_t mat4_make_scale(float sx, float sy, float sz);
mat4_t mat4_make_translation(float tx, float ty, float tz);
mat4_t mat4_make_rotation_x(float ra);
mat4_t mat4_make_rotation_y(float ra);
mat4_t mat4_make_rotation_z(float ra);
mat4_t mat4_mul_mat4(mat4_t* a, mat4_t* b);
vec4_t mat4_multiply_vec4(mat4_t m, vec4_t v);
mat4_t mat4_make_rotation_x(float angle);
mat4_t mat4_make_rotation_y(float angle);
mat4_t mat4_make_rotation_z(float angle);
mat4_t mat4_make_perspective(float fov, float aspect, float znear, float zfar);
vec4_t mat4_mul_vec4(mat4_t m, vec4_t v);
mat4_t mat4_mul_mat4(mat4_t a, mat4_t b);
vec4_t mat4_mul_vec4_project(mat4_t mat_proj, vec4_t v);
#endif
#endif

View File

@ -1,19 +1,14 @@
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "mesh.h"
#include <stdlib.h>
#include "array.h"
#include "mesh.h"
mesh_t mesh = {
.vertices = NULL,
.faces = NULL,
.rotation = { 0, 0, 0 },
.scale = { 1.0, 1.0, 1.0 },
.translation = { 0, 0, 0 },
.translation = { 0, 0, 0 }
};
vec3_t cube_vertices[N_CUBE_VERTICES] = {
@ -29,81 +24,78 @@ vec3_t cube_vertices[N_CUBE_VERTICES] = {
face_t cube_faces[N_CUBE_FACES] = {
// front
{ .a = 1, .b = 2, .c = 3 , .color = COLOR_ORANGE},
{ .a = 1, .b = 3, .c = 4, .color = COLOR_ORANGE},
{ .a = 1, .b = 2, .c = 3, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 1, .b = 3, .c = 4, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
// right
{ .a = 4, .b = 3, .c = 5, .color = COLOR_TEAL_GREEN },
{ .a = 4, .b = 5, .c = 6, .color = COLOR_TEAL_GREEN},
{ .a = 4, .b = 3, .c = 5, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 4, .b = 5, .c = 6, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
// back
{ .a = 6, .b = 5, .c = 7, .color = COLOR_RED },
{ .a = 6, .b = 7, .c = 8, .color = COLOR_RED },
{ .a = 6, .b = 5, .c = 7, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 6, .b = 7, .c = 8, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
// left
{ .a = 8, .b = 7, .c = 2, .color = COLOR_PURPLE },
{ .a = 8, .b = 2, .c = 1, .color = COLOR_PURPLE },
{ .a = 8, .b = 7, .c = 2, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 8, .b = 2, .c = 1, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
// top
{ .a = 2, .b = 7, .c = 5, .color = COLOR_GREY },
{ .a = 2, .b = 5, .c = 3, .color = COLOR_GREY },
{ .a = 2, .b = 7, .c = 5, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 2, .b = 5, .c = 3, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF },
// bottom
{ .a = 6, .b = 8, .c = 1, .color = COLOR_LIGHT_GREEN_BLUE },
{ .a = 6, .b = 1, .c = 4, .color = COLOR_LIGHT_GREEN_BLUE }
{ .a = 6, .b = 8, .c = 1, .a_uv = { 0, 1 }, .b_uv = { 0, 0 }, .c_uv = { 1, 0 }, .color = 0xFFFFFFFF },
{ .a = 6, .b = 1, .c = 4, .a_uv = { 0, 1 }, .b_uv = { 1, 0 }, .c_uv = { 1, 1 }, .color = 0xFFFFFFFF }
};
void load_cube_mesh_data(void) {
for (int i = 0; i < N_CUBE_VERTICES; i++) {
array_push(mesh.vertices, cube_vertices[i]);
vec3_t cube_vertex = cube_vertices[i];
array_push(mesh.vertices, cube_vertex);
}
for (int i = 0; i < N_CUBE_FACES; i++) {
array_push(mesh.faces, cube_faces[i]);
face_t cube_face = cube_faces[i];
array_push(mesh.faces, cube_face);
}
}
void parse_face(const char* buffer, face_t* face) {
char temp_a[64], temp_b[64], temp_c[64];
sscanf(buffer, "f %63s %63s %63s", temp_a, temp_b, temp_c);
void load_obj_file_data(char* filename) {
FILE* file;
file = fopen(filename, "r");
char line[1024];
char* token;
tex2_t* textcoords = NULL;
token = strtok(temp_a, "/");
face->a = token ? atoi(token) : -1;
token = strtok(temp_b, "/");
face->b = token ? atoi(token) : -1;
token = strtok(temp_c, "/");
face->c = token ? atoi(token) : -1;
}
void load_file(const char* filename) {
FILE* fp;
char* tok;
fp = fopen(filename, "r");
if (fp == NULL) {
exit(EXIT_FAILURE);
}
char buffer[MAX_LEN];
while (fgets(buffer, MAX_LEN, fp)) {
if (strncmp(buffer, "v ", 2) == 0) {
while (fgets(line, 1024, file)) {
// Vertex information
if (strncmp(line, "v ", 2) == 0) {
vec3_t vertex;
sscanf(buffer, "v %f %f %f", &vertex.x, &vertex.y, &vertex.z);
sscanf(line, "v %f %f %f", &vertex.x, &vertex.y, &vertex.z);
array_push(mesh.vertices, vertex);
} else if (strncmp(buffer, "f ", 2) == 0) {
face_t face;
parse_face(buffer, &face);
array_push(mesh.faces, face);
}
printf("\n");
// texture coordinate information
if (strncmp(line, "vt ", 3) == 0) {
tex2_t textcoord;
sscanf(line, "vt %f %f", &textcoord.u, &textcoord.v);
array_push(textcoords, textcoord);
}
// Face information
if (strncmp(line, "f ", 2) == 0) {
int vertex_indices[3];
int texture_indices[3];
int normal_indices[3];
sscanf(
line, "f %d/%d/%d %d/%d/%d %d/%d/%d",
&vertex_indices[0], &texture_indices[0], &normal_indices[0],
&vertex_indices[1], &texture_indices[1], &normal_indices[1],
&vertex_indices[2], &texture_indices[2], &normal_indices[2]
);
face_t face = {
.a = vertex_indices[0] - 1,
.b = vertex_indices[1] - 1,
.c = vertex_indices[2] - 1,
.a_uv = textcoords[texture_indices[0] - 1],
.b_uv = textcoords[texture_indices[1] - 1],
.c_uv = textcoords[texture_indices[2] - 1],
.color = 0xFFFFFFFF
};
array_push(mesh.faces, face);
}
}
fflush(stdout);
fclose(fp);
}
array_free(textcoords);
}

View File

@ -7,40 +7,23 @@
#define N_CUBE_VERTICES 8
#define N_CUBE_FACES (6 * 2) // 6 cube faces, 2 triangles per face
#define MAX_LEN 256
extern vec3_t cube_vertices[N_CUBE_VERTICES];
extern face_t cube_faces[N_CUBE_FACES];
typedef enum {
COLOR_PURPLE = 0xFF6A2EFF,
COLOR_SAND_YELLOW = 0xFFE9C46A,
COLOR_TEAL_GREEN = 0xFF2A9D8F,
COLOR_ORANGE = 0xFFF4A261,
COLOR_DARK_BLUE_GREY = 0xFF264653,
COLOR_MAUVE = 0xFFB5838D,
COLOR_RED = 0xFFD7263D,
COLOR_TURQUOISE = 0xFF38A3A5,
COLOR_GREY = 0xFF757575,
COLOR_LIGHT_GREEN_BLUE = 0xFF70C1B3,
COLOR_YELLOW = 0xFFFFC300,
COLOR_DEEP_PURPLE = 0xFF5D2E8C
} color_enum_t;
typedef struct mesh_t mesh_t;
struct mesh_t {
vec3_t* vertices;
face_t* faces;
vec3_t rotation;
vec3_t scale;
vec3_t translation;
};
////////////////////////////////////////////////////////////////////////////////
// Define a struct for dynamic size meshes, with array of vertices and faces
////////////////////////////////////////////////////////////////////////////////
typedef struct {
vec3_t* vertices; // dynamic array of vertices
face_t* faces; // dynamic array of faces
vec3_t rotation; // rotation with x, y, and z values
vec3_t scale; // scale with x, y, and z values
vec3_t translation; // translation with x, y, and z values
} mesh_t;
extern mesh_t mesh;
void parse_face(const char* buffer, face_t* face);
void load_cube_mesh_data(void);
void load_file(const char* filename);
void load_obj_file_data(char* filename);
#endif

13
scripts/swap.c Normal file
View File

@ -0,0 +1,13 @@
#include "swap.h"
void int_swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
void float_swap(float* a, float* b) {
float tmp = *a;
*a = *b;
*b = tmp;
}

7
scripts/swap.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef SWAP_H
#define SWAP_H
void int_swap(int* a, int* b);
void float_swap(float* a, float* b);
#endif

90
scripts/texture.c Normal file
View File

@ -0,0 +1,90 @@
#include <stdio.h>
#include "texture.h"
int texture_width = 64;
int texture_height = 64;
upng_t* png_texture = NULL;
uint32_t* mesh_texture = NULL;
const uint8_t REDBRICK_TEXTURE[] = {
0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff,
0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff,
0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0x64, 0x64, 0x64, 0xff, 0x64, 0x64, 0x64, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff,
0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff,
0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff,
0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff,
0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff,
0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff,
0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff,
0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x34, 0x34, 0x34, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x34, 0x34, 0x34, 0xff, 0x34, 0x34, 0x34, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x34, 0x34, 0x34, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x54, 0x54, 0x54, 0xff, 0x64, 0x64, 0x64, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x54, 0x54, 0x54, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x64, 0x64, 0x64, 0xff, 0x64, 0x64, 0x64, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff,
0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xb0, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x64, 0x64, 0x64, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x64, 0x64, 0x64, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x40, 0xff,
0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0x64, 0x64, 0x64, 0xff, 0x54, 0x54, 0x54, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff,
0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x38, 0x38, 0x38, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x34, 0x34, 0x34, 0xff, 0x38, 0x38, 0x38, 0xff, 0x34, 0x34, 0x34, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x64, 0x64, 0x64, 0xff, 0x64, 0x64, 0x64, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x30, 0x30, 0x30, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x30, 0x30, 0x30, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff,
0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xec, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff, 0x00, 0x00, 0xbc, 0xff,
0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x34, 0x34, 0x34, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff,
0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff,
0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff,
0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff,
0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xd4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff,
0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x98, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x7c, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x88, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xc8, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x64, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x70, 0xff,
0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x20, 0x20, 0x20, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0xa4, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x40, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff, 0x00, 0x00, 0x4c, 0xff,
0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x34, 0x34, 0x34, 0xff, 0x34, 0x34, 0x34, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x20, 0x20, 0x20, 0xff, 0x2c, 0x2c, 0x2c, 0xff, 0x2c, 0x2c, 0x2c, 0xff,
0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x38, 0x38, 0x38, 0xff, 0x54, 0x54, 0x54, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x40, 0x40, 0x40, 0xff, 0x38, 0x38, 0x38, 0xff, 0x40, 0x40, 0x40, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff, 0x48, 0x48, 0x48, 0xff,
0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff, 0x54, 0x54, 0x54, 0xff,
};
void load_png_texture_data(char* filename) {
//upng_t * upng;
png_texture = upng_new_from_file(filename);
if (png_texture != NULL) {
upng_decode(png_texture);
if (upng_get_error(png_texture) == UPNG_EOK) {
mesh_texture = (uint32_t*)upng_get_buffer(png_texture);
texture_height = upng_get_height(png_texture);
texture_width = upng_get_width(png_texture);
}
}
}

22
scripts/texture.h Normal file
View File

@ -0,0 +1,22 @@
#ifndef TEXTURE_H
#define TEXTURE_H
#include <stdint.h>
#include "upng.h"
typedef struct {
float u;
float v;
} tex2_t;
extern int texture_width;
extern int texture_height;
extern const uint8_t REDBRICK_TEXTURE[];
extern uint32_t* mesh_texture;
extern upng_t* png_texture;
void load_png_texture_data(char* filename);
#endif

View File

@ -1,94 +1,327 @@
#include "display.h"
#include "swap.h"
#include "triangle.h"
#include <math.h>
///////////////////////////////////////////////////////////////////////////////
// Draw a filled a triangle with a flat bottom
///////////////////////////////////////////////////////////////////////////////
//
// (x0,y0)
// / \
// / \
// / \
// / \
// / \
// (x1,y1)------(x2,y2)
//
///////////////////////////////////////////////////////////////////////////////
void fill_flat_bottom_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
// Find the two slopes (two triangle legs)
float inv_slope_1 = (float)(x1 - x0) / (y1 - y0);
float inv_slope_2 = (float)(x2 - x0) / (y2 - y0);
#include "display.h"
// Start x_start and x_end from the top vertex (x0,y0)
float x_start = x0;
float x_end = x0;
// TODO: Create implementation for triangle.h functions
int compare_vec2_t(const void* a, const void* b) {
const vec2_t* arg1 = (const vec2_t*)a;
const vec2_t* arg2 = (const vec2_t*)b;
if (arg1->y < arg2->y) return -1;
if (arg1->y > arg2->y) return 1;
return 0;
}
#define FUNC (int)ceilf
#define FUNC2 (int)floorf
uint32_t invert_rgb(uint32_t color) {
uint32_t a = color & 0xFF000000; // Alpha channel
uint32_t rgb = color & 0x00FFFFFF; // RGB channels
rgb = ~rgb & 0x00FFFFFF; // Invert RGB only
return a | rgb;
}
void fill_flat_bottom_triangle(const triangle_t* triangle, color_t color) {
float inv_slope_1 = (triangle->points[1].x - triangle->points[0].x) / (triangle->points[1].y - triangle->points[0].y);
float inv_slope_2 = (triangle->points[2].x - triangle->points[0].x) / (triangle->points[2].y - triangle->points[0].y);;
float x_start = triangle->points[0].x, x_end = triangle->points[0].x;
for (int x = FUNC(triangle->points[0].y); x <= FUNC2(triangle->points[2].y); x++) {
//draw_rect((int)triangle->points[0].x, i, 1, 1, 0xFFFF0000);
draw_line(FUNC(x_start), x, FUNC2(x_end), x, color);
// Loop all the scanlines from top to bottom
for (int y = y0; y <= y2; y++) {
draw_line(x_start, y, x_end, y, color);
x_start += inv_slope_1;
x_end += inv_slope_2;
}
}
void fill_flat_top_triangle(const triangle_t* triangle, color_t color) {
float inv_slope_1 = (triangle->points[2].x - triangle->points[0].x) / (triangle->points[2].y - triangle->points[0].y);
float inv_slope_2 = (triangle->points[2].x - triangle->points[1].x) / (triangle->points[2].y - triangle->points[1].y);;
///////////////////////////////////////////////////////////////////////////////
// Draw a filled a triangle with a flat top
///////////////////////////////////////////////////////////////////////////////
//
// (x0,y0)------(x1,y1)
// \ /
// \ /
// \ /
// \ /
// \ /
// (x2,y2)
//
///////////////////////////////////////////////////////////////////////////////
void fill_flat_top_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
// Find the two slopes (two triangle legs)
float inv_slope_1 = (float)(x2 - x0) / (y2 - y0);
float inv_slope_2 = (float)(x2 - x1) / (y2 - y1);
float x_start = triangle->points[2].x, x_end = triangle->points[2].x;
// Start x_start and x_end from the bottom vertex (x2,y2)
float x_start = x2;
float x_end = x2;
for (int y = FUNC2(triangle->points[2].y); y >= FUNC(triangle->points[0].y); y--) {
//draw_rect((int)triangle->points[0].x, i, 1, 1, 0xFFFF0000);
draw_line(FUNC(x_start), y, FUNC2(x_end), y, color);
// Loop all the scanlines from bottom to top
for (int y = y2; y >= y0; y--) {
draw_line(x_start, y, x_end, y, color);
x_start -= inv_slope_1;
x_end -= inv_slope_2;
}
}
void draw_filled_triangle(triangle_t triangle) {
// sort by y
int temp = 0, min_idx = 0, mid_idx = 1, max_idx = 2;
if (triangle.points[min_idx].y > triangle.points[mid_idx].y) {
temp = min_idx; min_idx = mid_idx; mid_idx = temp;
///////////////////////////////////////////////////////////////////////////////
// Draw a filled triangle with the flat-top/flat-bottom method
// We split the original triangle in two, half flat-bottom and half flat-top
///////////////////////////////////////////////////////////////////////////////
//
// (x0,y0)
// / \
// / \
// / \
// / \
// / \
// (x1,y1)------(Mx,My)
// \_ \
// \_ \
// \_ \
// \_ \
// \ \
// \_ \
// \_\
// \
// (x2,y2)
//
///////////////////////////////////////////////////////////////////////////////
void draw_filled_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
// We need to sort the vertices by y-coordinate ascending (y0 < y1 < y2)
if (y0 > y1) {
int_swap(&y0, &y1);
int_swap(&x0, &x1);
}
if (triangle.points[min_idx].y > triangle.points[max_idx].y) {
temp = min_idx; min_idx = max_idx; max_idx = temp;
if (y1 > y2) {
int_swap(&y1, &y2);
int_swap(&x1, &x2);
}
if (triangle.points[mid_idx].y > triangle.points[max_idx].y) {
temp = mid_idx; mid_idx = max_idx; max_idx = temp;
if (y0 > y1) {
int_swap(&y0, &y1);
int_swap(&x0, &x1);
}
color_t color = triangle.color ? triangle.color : 0xFF00FF00; // Default to 0xFF00FF00 if not setr; // Default color if not set
if (y1 == y2) {
// Draw flat-bottom triangle
fill_flat_bottom_triangle(x0, y0, x1, y1, x2, y2, color);
} else if (y0 == y1) {
// Draw flat-top triangle
fill_flat_top_triangle(x0, y0, x1, y1, x2, y2, color);
} else {
// Calculate the new vertex (Mx,My) using triangle similarity
int My = y1;
int Mx = (((x2 - x0) * (y1 - y0)) / (y2 - y0)) + x0;
if (triangle.points[mid_idx].y == triangle.points[max_idx].y) {
fill_flat_bottom_triangle(&triangle, color);
} else if (triangle.points[min_idx].y == triangle.points[mid_idx].y) {
fill_flat_top_triangle(&triangle, color);
// Draw flat-bottom triangle
fill_flat_bottom_triangle(x0, y0, x1, y1, Mx, My, color);
// Draw flat-top triangle
fill_flat_top_triangle(x1, y1, Mx, My, x2, y2, color);
}
}
///////////////////////////////////////////////////////////////////////////////
// Draw a triangle using three raw line calls
///////////////////////////////////////////////////////////////////////////////
void draw_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color) {
draw_line(x0, y0, x1, y1, color);
draw_line(x1, y1, x2, y2, color);
draw_line(x2, y2, x0, y0, color);
}
///////////////////////////////////////////////////////////////////////////////
// Return the barycentric weights alpha, beta, and gamma for point p
///////////////////////////////////////////////////////////////////////////////
//
// (B)
// /|\
// / | \
// / | \
// / (P) \
// / / \ \
// / / \ \
// // \\
// (A)------------(C)
//
///////////////////////////////////////////////////////////////////////////////
vec3_t barycentric_weights(vec2_t a, vec2_t b, vec2_t c, vec2_t p) {
// Find the vectors between the vertices ABC and point p
vec2_t ac = vec2_sub(c, a);
vec2_t ab = vec2_sub(b, a);
vec2_t ap = vec2_sub(p, a);
vec2_t pc = vec2_sub(c, p);
vec2_t pb = vec2_sub(b, p);
// Compute the area of the full parallegram/triangle ABC using 2D cross product
float area_parallelogram_abc = (ac.x * ab.y - ac.y * ab.x); // || AC x AB ||
// Alpha is the area of the small parallelogram/triangle PBC divided by the area of the full parallelogram/triangle ABC
float alpha = (pc.x * pb.y - pc.y * pb.x) / area_parallelogram_abc;
// Beta is the area of the small parallelogram/triangle APC divided by the area of the full parallelogram/triangle ABC
float beta = (ac.x * ap.y - ac.y * ap.x) / area_parallelogram_abc;
// Weight gamma is easily found since barycentric coordinates always add up to 1.0
float gamma = 1 - alpha - beta;
vec3_t weights = { alpha, beta, gamma };
return weights;
}
///////////////////////////////////////////////////////////////////////////////
// Function to draw the textured pixel at position x and y using interpolation
///////////////////////////////////////////////////////////////////////////////
void draw_texel(
int x, int y, uint32_t* texture,
vec4_t point_a, vec4_t point_b, vec4_t point_c,
tex2_t a_uv, tex2_t b_uv, tex2_t c_uv
) {
vec2_t p = { x, y };
vec2_t a = vec2_from_vec4(point_a);
vec2_t b = vec2_from_vec4(point_b);
vec2_t c = vec2_from_vec4(point_c);
// Calculate the barycentric coordinates of our point 'p' inside the triangle
vec3_t weights = barycentric_weights(a, b, c, p);
float alpha = weights.x;
float beta = weights.y;
float gamma = weights.z;
// Variables to store the interpolated values of U, V, and also 1/w for the current pixel
float interpolated_u;
float interpolated_v;
float interpolated_reciprocal_w;
// Perform the interpolation of all U/w and V/w values using barycentric weights and a factor of 1/w
interpolated_u = (a_uv.u / point_a.w) * alpha + (b_uv.u / point_b.w) * beta + (c_uv.u / point_c.w) * gamma;
interpolated_v = (a_uv.v / point_a.w) * alpha + (b_uv.v / point_b.w) * beta + (c_uv.v / point_c.w) * gamma;
// Also interpolate the value of 1/w for the current pixel
interpolated_reciprocal_w = (1 / point_a.w) * alpha + (1 / point_b.w) * beta + (1 / point_c.w) * gamma;
// Now we can divide back both interpolated values by 1/w
interpolated_u /= interpolated_reciprocal_w;
interpolated_v /= interpolated_reciprocal_w;
// Map the UV coordinate to the full texture width and height
int tex_x = abs((int)(interpolated_u * texture_width));
int tex_y = abs((int)(interpolated_v * texture_height));
draw_pixel(x, y, texture[(texture_width * tex_y) + tex_x]);
}
///////////////////////////////////////////////////////////////////////////////
// Draw a textured triangle based on a texture array of colors.
// We split the original triangle in two, half flat-bottom and half flat-top.
///////////////////////////////////////////////////////////////////////////////
//
// v0
// /\
// / \
// / \
// / \
// v1--------\
// \_ \
// \_ \
// \_ \
// \_ \
// \\
// \
// v2
//
///////////////////////////////////////////////////////////////////////////////
void draw_textured_triangle(
int x0, int y0, float z0, float w0, float u0, float v0,
int x1, int y1, float z1, float w1, float u1, float v1,
int x2, int y2, float z2, float w2, float u2, float v2,
uint32_t* texture
) {
// We need to sort the vertices by y-coordinate ascending (y0 < y1 < y2)
if (y0 > y1) {
int_swap(&y0, &y1);
int_swap(&x0, &x1);
float_swap(&z0, &z1);
float_swap(&w0, &w1);
float_swap(&u0, &u1);
float_swap(&v0, &v1);
}
if (y1 > y2) {
int_swap(&y1, &y2);
int_swap(&x1, &x2);
float_swap(&z1, &z2);
float_swap(&w1, &w2);
float_swap(&u1, &u2);
float_swap(&v1, &v2);
}
if (y0 > y1) {
int_swap(&y0, &y1);
int_swap(&x0, &x1);
float_swap(&z0, &z1);
float_swap(&w0, &w1);
float_swap(&u0, &u1);
float_swap(&v0, &v1);
}
// flip v component to account for inverted uv coordinates (where v grows downwrds)
v0 = 1.0f - v0;
v1 = 1.0f - v1;
v2 = 1.0f - v2;
vec2_t midpoint;
midpoint.y = triangle.points[mid_idx].y;
midpoint.x = (((triangle.points[max_idx].x - triangle.points[min_idx].x) * (triangle.points[mid_idx].y - triangle.points[min_idx].y)) / (triangle.points[max_idx].y - triangle.points[min_idx].y)) + triangle.points[min_idx].x;
// Create vector points and texture coords after we sort the vertices
vec4_t point_a = { x0, y0, z0, w0 };
vec4_t point_b = { x1, y1, z1, w1 };
vec4_t point_c = { x2, y2, z2, w2 };
tex2_t a_uv = { u0, v0 };
tex2_t b_uv = { u1, v1 };
tex2_t c_uv = { u2, v2 };
triangle_t flat_top, flat_bottom;
///////////////////////////////////////////////////////
// Render the upper part of the triangle (flat-bottom)
///////////////////////////////////////////////////////
float inv_slope_1 = 0;
float inv_slope_2 = 0;
flat_bottom.points[0] = triangle.points[min_idx];
flat_bottom.points[1] = triangle.points[mid_idx];
flat_bottom.points[2] = midpoint;
if (y1 - y0 != 0) inv_slope_1 = (float)(x1 - x0) / abs(y1 - y0);
if (y2 - y0 != 0) inv_slope_2 = (float)(x2 - x0) / abs(y2 - y0);
flat_top.points[0] = triangle.points[mid_idx];
flat_top.points[1] = midpoint;
flat_top.points[2] = triangle.points[max_idx];
if (y1 - y0 != 0) {
for (int y = y0; y <= y1; y++) {
int x_start = x1 + (y - y1) * inv_slope_1;
int x_end = x0 + (y - y0) * inv_slope_2;
fill_flat_bottom_triangle(&flat_bottom, color);
fill_flat_top_triangle(&flat_top, (color));
if (x_end < x_start) {
int_swap(&x_start, &x_end); // swap if x_start is to the right of x_end
}
}
for (int x = x_start; x < x_end; x++) {
// Draw our pixel with the color that comes from the texture
draw_texel(x, y, texture, point_a, point_b, point_c, a_uv, b_uv, c_uv);
}
}
}
///////////////////////////////////////////////////////
// Render the bottom part of the triangle (flat-top)
///////////////////////////////////////////////////////
inv_slope_1 = 0;
inv_slope_2 = 0;
if (y2 - y1 != 0) inv_slope_1 = (float)(x2 - x1) / abs(y2 - y1);
if (y2 - y0 != 0) inv_slope_2 = (float)(x2 - x0) / abs(y2 - y0);
if (y2 - y1 != 0) {
for (int y = y1; y <= y2; y++) {
int x_start = x1 + (y - y1) * inv_slope_1;
int x_end = x0 + (y - y0) * inv_slope_2;
if (x_end < x_start) {
int_swap(&x_start, &x_end); // swap if x_start is to the right of x_end
}
for (int x = x_start; x < x_end; x++) {
// Draw our pixel with the color that comes from the texture
draw_texel(x, y, texture, point_a, point_b, point_c, a_uv, b_uv, c_uv);
}
}
}
}

View File

@ -2,28 +2,34 @@
#define TRIANGLE_H
#include <stdint.h>
#include "texture.h"
#include "vector.h"
typedef uint32_t color_t;
typedef struct {
int a;
int b;
int c;
color_t color;
tex2_t a_uv;
tex2_t b_uv;
tex2_t c_uv;
uint32_t color;
} face_t;
typedef struct {
int x;
int y;
} int_vec2_t;
typedef struct {
vec2_t points[3];
color_t color;
float average_depth;
vec4_t points[3];
tex2_t texcoords[3];
uint32_t color;
float avg_depth;
} triangle_t;
void draw_filled_triangle(triangle_t triangle);
void draw_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color);
void draw_filled_triangle(int x0, int y0, int x1, int y1, int x2, int y2, uint32_t color);
void draw_textured_triangle(
int x0, int y0, float z0, float w0, float u0, float v0,
int x1, int y1, float z1, float w1, float u1, float v1,
int x2, int y2, float z2, float w2, float u2, float v2,
uint32_t* texture
);
#endif

1281
scripts/upng.c Normal file

File diff suppressed because it is too large Load Diff

81
scripts/upng.h Normal file
View File

@ -0,0 +1,81 @@
/*
uPNG -- derived from LodePNG version 20100808
Copyright (c) 2005-2010 Lode Vandevenne
Copyright (c) 2010 Sean Middleditch
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
*/
#if !defined(UPNG_H)
#define UPNG_H
typedef enum upng_error {
UPNG_EOK = 0, /* success (no error) */
UPNG_ENOMEM = 1, /* memory allocation failed */
UPNG_ENOTFOUND = 2, /* resource not found (file missing) */
UPNG_ENOTPNG = 3, /* image data does not have a PNG header */
UPNG_EMALFORMED = 4, /* image data is not a valid PNG image */
UPNG_EUNSUPPORTED = 5, /* critical PNG chunk type is not supported */
UPNG_EUNINTERLACED = 6, /* image interlacing is not supported */
UPNG_EUNFORMAT = 7, /* image color format is not supported */
UPNG_EPARAM = 8 /* invalid parameter to method call */
} upng_error;
typedef enum upng_format {
UPNG_BADFORMAT,
UPNG_RGB8,
UPNG_RGB16,
UPNG_RGBA8,
UPNG_RGBA16,
UPNG_LUMINANCE1,
UPNG_LUMINANCE2,
UPNG_LUMINANCE4,
UPNG_LUMINANCE8,
UPNG_LUMINANCE_ALPHA1,
UPNG_LUMINANCE_ALPHA2,
UPNG_LUMINANCE_ALPHA4,
UPNG_LUMINANCE_ALPHA8
} upng_format;
typedef struct upng_t upng_t;
upng_t* upng_new_from_bytes (const unsigned char* buffer, unsigned long size);
upng_t* upng_new_from_file (const char* path);
void upng_free (upng_t* upng);
upng_error upng_header (upng_t* upng);
upng_error upng_decode (upng_t* upng);
upng_error upng_get_error (const upng_t* upng);
unsigned upng_get_error_line (const upng_t* upng);
unsigned upng_get_width (const upng_t* upng);
unsigned upng_get_height (const upng_t* upng);
unsigned upng_get_bpp (const upng_t* upng);
unsigned upng_get_bitdepth (const upng_t* upng);
unsigned upng_get_components (const upng_t* upng);
unsigned upng_get_pixelsize (const upng_t* upng);
upng_format upng_get_format (const upng_t* upng);
const unsigned char* upng_get_buffer (const upng_t* upng);
unsigned upng_get_size (const upng_t* upng);
#endif /*defined(UPNG_H)*/

View File

@ -1,143 +1,158 @@
#include <math.h>
#include "vector.h"
#include <math.h>
// TODO: Implementation of all vector functions
vec3_t vec3_rotate_x(vec3_t v, float angle) {
return (vec3_t) {
.x = v.x,
.y = v.y * cos(angle) - v.z * sin(angle),
.z = v.y * sin(angle) + v.z * cos(angle),
};
///////////////////////////////////////////////////////////////////////////////
// Implementations of Vector 2 functions
///////////////////////////////////////////////////////////////////////////////
float vec2_length(vec2_t v) {
return sqrt(v.x * v.x + v.y * v.y);
}
vec3_t vec3_rotate_y(vec3_t v, float angle) {
return (vec3_t) {
.x = v.x * cos(angle) - v.z * sin(angle),
.y = v.y,
.z = v.x * sin(angle) + v.z * cos(angle),
};
}
vec3_t vec3_rotate_z(vec3_t v, float angle) {
return (vec3_t) {
.x = v.x * cos(angle) - v.y * sin(angle),
.y = v.x * sin(angle) + v.y * cos(angle),
.z = v.z,
};
}
float vec2_length(const vec2_t vector) {
return sqrt((vector.x * vector.x) + (vector.y * vector.y));
}
vec2_t vec2_add(const vec2_t a, const vec2_t b) {
return (vec2_t) {
vec2_t vec2_add(vec2_t a, vec2_t b) {
vec2_t result = {
.x = a.x + b.x,
.y = a.y + b.y,
.y = a.y + b.y
};
return result;
}
vec2_t vec2_subtract(const vec2_t a, const vec2_t b) {
return (vec2_t) {
vec2_t vec2_sub(vec2_t a, vec2_t b) {
vec2_t result = {
.x = a.x - b.x,
.y = a.y - b.y,
.y = a.y - b.y
};
return result;
}
vec2_t vec2_multiply(const vec2_t vector, float scalar) {
return (vec2_t) {
.x = vector.x * scalar,
.y = vector.y * scalar,
vec2_t vec2_mul(vec2_t v, float factor) {
vec2_t result = {
.x = v.x * factor,
.y = v.y * factor
};
return result;
}
vec2_t vec2_divide(const vec2_t vector, float scalar) {
return (vec2_t) {
.x = vector.x / scalar,
.y = vector.y / scalar,
vec2_t vec2_div(vec2_t v, float factor) {
vec2_t result = {
.x = v.x / factor,
.y = v.y / factor
};
return result;
}
float vec2_dot(const vec2_t a, const vec2_t b) {
float vec2_dot(vec2_t a, vec2_t b) {
return (a.x * b.x) + (a.y * b.y);
}
float vec3_length(const vec3_t vector) {
return sqrtf((vector.x * vector.x) + (vector.y * vector.y) + (vector.z * vector.z));
void vec2_normalize(vec2_t* v) {
float length = sqrt(v->x * v->x + v->y * v->y);
v->x /= length;
v->y /= length;
}
void vec2_normalize(vec2_t* vertex) {
float length = vec2_length(*vertex);
vertex->x /= length;
vertex->y /= length;
///////////////////////////////////////////////////////////////////////////////
// Implementations of Vector 3 functions
///////////////////////////////////////////////////////////////////////////////
float vec3_length(vec3_t v) {
return sqrt(v.x * v.x + v.y * v.y + v.z * v.z);
}
vec3_t vec3_add(const vec3_t a, const vec3_t b) {
return (vec3_t) {
vec3_t vec3_add(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.x + b.x,
.y = a.y + b.y,
.z = a.z + b.z,
.z = a.z + b.z
};
return result;
}
vec3_t vec3_subtract(const vec3_t a, const vec3_t b) {
return (vec3_t) {
vec3_t vec3_sub(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.x - b.x,
.y = a.y - b.y,
.z = a.z - b.z,
.z = a.z - b.z
};
return result;
}
vec3_t vec3_multiply(const vec3_t vector, const float scalar) {
return (vec3_t) {
.x = vector.x * scalar,
.y = vector.y * scalar,
.z = vector.z * scalar,
vec3_t vec3_mul(vec3_t v, float factor) {
vec3_t result = {
.x = v.x * factor,
.y = v.y * factor,
.z = v.z * factor
};
return result;
}
vec3_t vec3_divide(const vec3_t vector, const float scalar) {
return (vec3_t) {
.x = vector.x / scalar,
.y = vector.y / scalar,
.z = vector.z / scalar,
vec3_t vec3_div(vec3_t v, float factor) {
vec3_t result = {
.x = v.x / factor,
.y = v.y / factor,
.z = v.z / factor
};
return result;
}
vec3_t vec3_cross(const vec3_t a, const vec3_t b) {
return (vec3_t) {
vec3_t vec3_cross(vec3_t a, vec3_t b) {
vec3_t result = {
.x = a.y * b.z - a.z * b.y,
.y = a.z * b.x - a.x * b.z,
.z = a.x * b.y - a.y * b.x,
.z = a.x * b.y - a.y * b.x
};
return result;
}
float vec3_dot(const vec3_t a, const vec3_t b) {
float vec3_dot(vec3_t a, vec3_t b) {
return (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
}
void vec3_normalize(vec3_t* vertex) {
float length = vec3_length(*vertex);
vertex->x /= length;
vertex->y /= length;
vertex->z /= length;
void vec3_normalize(vec3_t* v) {
float length = sqrt(v->x * v->x + v->y * v->y + v->z * v->z);
v->x /= length;
v->y /= length;
v->z /= length;
}
vec3_t vec3_rotate_x(vec3_t v, float angle) {
vec3_t rotated_vector = {
.x = v.x,
.y = v.y * cos(angle) - v.z * sin(angle),
.z = v.y * sin(angle) + v.z * cos(angle)
};
return rotated_vector;
}
vec4_t vec4_from_vec3(vec3_t vertex) {
vec4_t ret;
ret.x = vertex.x;
ret.y = vertex.y;
ret.z = vertex.z;
ret.w = 1;
vec3_t vec3_rotate_y(vec3_t v, float angle) {
vec3_t rotated_vector = {
.x = v.x * cos(angle) + v.z * sin(angle),
.y = v.y,
.z = -v.x * sin(angle) + v.z * cos(angle)
};
return rotated_vector;
}
return ret;
vec3_t vec3_rotate_z(vec3_t v, float angle) {
vec3_t rotated_vector = {
.x = v.x * cos(angle) - v.y * sin(angle),
.y = v.x * sin(angle) + v.y * cos(angle),
.z = v.z
};
return rotated_vector;
}
///////////////////////////////////////////////////////////////////////////////
// Implementations of Vector conversion functions
///////////////////////////////////////////////////////////////////////////////
vec4_t vec4_from_vec3(vec3_t v) {
vec4_t result = { v.x, v.y, v.z, 1.0 };
return result;
}
vec3_t vec3_from_vec4(vec4_t v) {
return (vec3_t) {
.x = v.x,
.y = v.y,
.z = v.z,
};
}
vec3_t result = { v.x, v.y, v.z };
return result;
}
vec2_t vec2_from_vec4(vec4_t v) {
vec2_t result = { v.x, v.y };
return result;
}

View File

@ -2,45 +2,47 @@
#define VECTOR_H
typedef struct {
float x;
float y;
float x, y;
} vec2_t;
typedef struct {
float x;
float y;
float z;
float x, y, z;
} vec3_t;
typedef struct {
float x, y, z, w;
} vec4_t;
// TODO: Add functions to manipulate vectors 2D and 3D
// ...
////////////////////////////////////////////////////////////////////////////////
// Vector 2 functions
////////////////////////////////////////////////////////////////////////////////
float vec2_length(vec2_t v);
vec2_t vec2_add(vec2_t a, vec2_t b);
vec2_t vec2_sub(vec2_t a, vec2_t b);
vec2_t vec2_mul(vec2_t v, float factor);
vec2_t vec2_div(vec2_t v, float factor);
void vec2_normalize(vec2_t* v);
////////////////////////////////////////////////////////////////////////////////
// Vector 3 functions
////////////////////////////////////////////////////////////////////////////////
float vec3_length(vec3_t v);
vec3_t vec3_add(vec3_t a, vec3_t b);
vec3_t vec3_sub(vec3_t a, vec3_t b);
vec3_t vec3_mul(vec3_t v, float factor);
vec3_t vec3_div(vec3_t v, float factor);
vec3_t vec3_cross(vec3_t a, vec3_t b);
float vec3_dot(vec3_t a, vec3_t b);
void vec3_normalize(vec3_t* v);
vec3_t vec3_rotate_x(vec3_t v, float angle);
vec3_t vec3_rotate_y(vec3_t v, float angle);
vec3_t vec3_rotate_z(vec3_t v, float angle);
vec2_t vec2_add(const vec2_t a, const vec2_t b);
vec2_t vec2_subtract(const vec2_t a, const vec2_t b);
vec2_t vec2_multiply(const vec2_t vector, float scalar);
vec2_t vec2_divide(const vec2_t vector, float scalar);
float vec2_length(const vec2_t vector);
float vec2_dot(const vec2_t a, const vec2_t b);
void vec2_normalize(vec2_t* vertex);
vec3_t vec3_add(const vec3_t a, const vec3_t b);
vec3_t vec3_subtract(const vec3_t a, const vec3_t b);
vec3_t vec3_multiply(const vec3_t vector, const float scalar);
vec3_t vec3_divide(const vec3_t vector, const float scalar);
vec3_t vec3_cross(const vec3_t a, const vec3_t b);
float vec3_length(const vec3_t vector);
float vec3_dot(const vec3_t a, const vec3_t b);
void vec3_normalize(vec3_t* vertex);
vec4_t vec4_from_vec3(vec3_t vertex);
////////////////////////////////////////////////////////////////////////////////
// Vector conversion functions
////////////////////////////////////////////////////////////////////////////////
vec4_t vec4_from_vec3(vec3_t v);
vec3_t vec3_from_vec4(vec4_t v);
vec2_t vec2_from_vec4(vec4_t v);
#endif