From 4a6c56d36d36d7bd395b9a4163451a200e9a2f9f Mon Sep 17 00:00:00 2001 From: Katajisto Date: Sat, 4 Oct 2025 22:47:36 +0300 Subject: [PATCH] work on ground rendering and tacoma integration --- .zed/debug.json | 14 + game/game.jai | 21 +- libtacoma.so | Bin 791976 -> 791976 bytes log_nvprosample.txt | 353 +++- modules/Tacoma/libtacoma.so | Bin 791976 -> 791976 bytes src/editor/level_editor.jai | 79 +- src/editor/tacoma.jai | 81 +- src/editor/textureDebugger.jai | 32 +- src/editor/trile_editor.jai | 3 + src/main.jai | 16 +- src/pipelines.jai | 108 +- src/platform_specific/common.jai | 24 +- src/rendering/groundplane.jai | 6 +- src/rendering/rendering.jai | 26 + src/shaders/jai/shader_plane.jai | 3050 ++++++++++-------------------- src/shaders/shader_plane.glsl | 180 +- src/trile.jai | 1 + src/ui/ui.jai | 35 +- src/world.jai | 12 +- walloc.o | Bin 2888 -> 0 bytes 20 files changed, 1700 insertions(+), 2341 deletions(-) create mode 100644 .zed/debug.json delete mode 100755 walloc.o diff --git a/.zed/debug.json b/.zed/debug.json new file mode 100644 index 0000000..e2f13ac --- /dev/null +++ b/.zed/debug.json @@ -0,0 +1,14 @@ +[ + { + "label": "Debug Jai", + "adapter": "CodeLLDB", + // Request: + "request": "launch", + "program": "first", + "cwd": "$ZED_WORKTREE_ROOT", + "build": { + "command": "jai", + "args": ["first.jai"] + } + } +] diff --git a/game/game.jai b/game/game.jai index 581d3dc..eb4902f 100644 --- a/game/game.jai +++ b/game/game.jai @@ -7,31 +7,32 @@ cam : Camera = .{ far = 2000.0, near = 1.0, target = .{0.0, 0.0, 0.0}, - position = .{0.0, 0.0, 0.0} + position = .{3.0, 5.0, 3.0} }; +world : World; + #scope_export game_init :: () { + world.ground[500][500] = .GRASS; + world.ground[500][501] = .GRASS; + world.ground[500][499] = .GRASS; + world.ground[499][500] = .GRASS; + world.ground[500][500] = .GRASS; + world.ground[501][500] = .GRASS; } game_tick :: () { - speed := 0.1; - - forward := Vector3.{1.0, 0.0, 0.0}; - - char_pos += speed * forward; - - cam.position = char_pos; - cam.target = char_pos + forward; } game_draw :: () { + if !is_in_reflection_pass then update_image_from_ground(*world, *gPipelines.plane.bind.images[1]); if is_in_reflection_pass { cam.position.y *= -1; cam.target.y *= -1; } draw_sky(*cam); - if !is_in_reflection_pass then draw_ground_plane(*cam); + if !is_in_reflection_pass then draw_ground_plane(*cam, *world.conf); if is_in_reflection_pass { cam.position.y *= -1; cam.target.y *= -1; diff --git a/libtacoma.so b/libtacoma.so index 650be3f3b3855ef1548aedf30abd0e8d33bed29a..c7dca50ba7b9d44d7db02f42fc67948af692dce5 100755 GIT binary patch delta 149 zcmZ3n+F-?MgAF&BMA&9s^ATZw7cjH)E_0gl>xr9xZd=^^hN=Ax6C)6VXl5X00b*7l zW&>h&Am-TqhKcippa}yQ{5s6Q0Ky;uW;;XKKpI6HtY-TQ5l#zc7Lby56$wrt=Gv|z I!QJu~0Ktthy8r+H delta 149 zcmZ3n+F-?MgAF&BM2yW}X}vZ)`%eGY%`@K^N=kpH7j0{P!_@wUi4llFG&2yh05K~N zvjH(X5OZvQ!^C+)&?GG_&7Ohb*I^JwVmm|G&S>IbHQQf^a9S|4fRwbWNN@r%*LD>N H?v}p*4SPGv diff --git a/log_nvprosample.txt b/log_nvprosample.txt index 9782aff..9d298da 100644 --- a/log_nvprosample.txt +++ b/log_nvprosample.txt @@ -24,7 +24,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -51,7 +51,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -78,7 +78,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -105,7 +105,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -132,7 +132,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -159,7 +159,7 @@ VK_KHR_deferred_host_operations VK_KHR_acceleration_structure VK_KHR_ray_query -BLAS Compaction: 0.0MB -> 0.0MB (0.0MB saved, 41.3% smaller) +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) _______________ Vulkan Version: - available: 1.4.309 @@ -169,4 +169,343 @@ Used Instance Layers : VK_LAYER_KHRONOS_validation Used Instance Extensions : -__________________ \ No newline at end of file +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query + +BLAS Compaction: 0.2MB -> 0.1MB (0.2MB saved, 65.8% smaller) +_______________ +Vulkan Version: + - available: 1.4.309 + - requesting: 1.3.0 +______________________ +Used Instance Layers : +VK_LAYER_KHRONOS_validation + +Used Instance Extensions : +____________________ +Devices : 1 +0: AMD Radeon RX 6950 XT + - Compatible +Compatible physical devices found : 1 +Using Device: + - Device Name : AMD Radeon RX 6950 XT + - Vendor : AMD + - Driver Version : 2.0.341 + - API Version : 1.4.308 + - Device Type : Discrete GPU +________________________ +Used Device Extensions : +VK_KHR_deferred_host_operations +VK_KHR_acceleration_structure +VK_KHR_ray_query diff --git a/modules/Tacoma/libtacoma.so b/modules/Tacoma/libtacoma.so index 650be3f3b3855ef1548aedf30abd0e8d33bed29a..c7dca50ba7b9d44d7db02f42fc67948af692dce5 100755 GIT binary patch delta 149 zcmZ3n+F-?MgAF&BMA&9s^ATZw7cjH)E_0gl>xr9xZd=^^hN=Ax6C)6VXl5X00b*7l zW&>h&Am-TqhKcippa}yQ{5s6Q0Ky;uW;;XKKpI6HtY-TQ5l#zc7Lby56$wrt=Gv|z I!QJu~0Ktthy8r+H delta 149 zcmZ3n+F-?MgAF&BM2yW}X}vZ)`%eGY%`@K^N=kpH7j0{P!_@wUi4llFG&2yh05K~N zvjH(X5OZvQ!^C+)&?GG_&7Ohb*I^JwVmm|G&S>IbHQQf^a9S|4fRwbWNN@r%*LD>N H?v}p*4SPGv diff --git a/src/editor/level_editor.jai b/src/editor/level_editor.jai index a55c256..5c07710 100644 --- a/src/editor/level_editor.jai +++ b/src/editor/level_editor.jai @@ -86,6 +86,8 @@ get_level_editor_camera :: () -> Camera { tick_level_editor_camera :: () { if console_open_ignore_input then return; + world.ground[500][500] = .GRASS; + if get_time() - lastInputTime > CAMERA_INACTIVE_TIME_TO_ORBIT { // idle rotating camera cameraRotation += cast(float) delta_time; } @@ -136,7 +138,7 @@ tick_level_editor_camera :: () { editY = max(editY - 1, 0); } - if input_button_states[Key_Code.MOUSE_BUTTON_RIGHT] & .DOWN { + if get_mouse_state(Key_Code.MOUSE_BUTTON_RIGHT) & .DOWN { if mouse2Active { lastInputTime = get_time(); diff := mouse2ActivationPosition - Vector2.{input_mouse_x, input_mouse_y}; @@ -156,7 +158,7 @@ tick_level_editor_camera :: () { } - if input_button_states[Key_Code.MOUSE_BUTTON_MIDDLE] & .DOWN { + if get_mouse_state(Key_Code.MOUSE_BUTTON_MIDDLE) & .DOWN { if mouse3Active { lastInputTime = get_time(); diff := mouse3ActivationPosition - Vector2.{input_mouse_x, input_mouse_y}; @@ -179,15 +181,16 @@ draw_tacoma_tab :: (theme: *GR.Overall_Theme, total_r: GR.Rect) { #if HAS_TACOMA { if GR.button(r, "Render with Tacoma", *theme.button_theme) { cam := get_level_editor_camera(); - test_gen(tacomaResolution, tacomaResolution, .{tacomaExposure, tacomaContrast, tacomaSaturation}, .{cam.target, cam.position, tacomaSamples, true}, world.conf); + gen_reference(tacomaResolution, tacomaResolution, .{tacomaExposure, tacomaContrast, tacomaSaturation}, .{cam.target, cam.position, tacomaSamples, true}, world); } r.y += r.h; if current_screenshot.valid { aspect := cast(float)current_screenshot.width / cast(float)current_screenshot.height; r.h = r.w / aspect; - uiTex := Ui_Texture.{*current_screenshot.image}; - set_shader_for_images(*uiTex); + uiTex := New(Ui_Texture,, temp); + uiTex.tex = *current_screenshot.image; + set_shader_for_images(uiTex); immediate_quad(.{r.x, r.y}, .{r.x + r.w, r.y}, .{r.x + r.w, r.y + r.h}, .{r.x, r.y + r.h}); set_shader_for_color(); r.y += r.h; @@ -221,12 +224,65 @@ draw_tacoma_tab :: (theme: *GR.Overall_Theme, total_r: GR.Rect) { } } -handle_tool_click :: (x: int, y: int, z: int) { - if editor_current_trile != null then add_trile(editor_current_trile.name, cast(float)x, cast(float)y, cast(float)z); -} +#scope_file + +Edit_Mode :: enum { + TRILES; + GROUND; +} + +groundType : Ground_Tile; +editMode : Edit_Mode; #scope_export +draw_tools_tab :: (theme: *GR.Overall_Theme, total_r: GR.Rect) { + r := total_r; + r.h = ui_h(3,0); + r.w = r.w/2.0; + if GR.button(r, "Edit triles", *t_button_selectable(theme, editMode == .TRILES)) { + editMode = .TRILES; + } + r.x += r.w; + if GR.button(r, "Edit ground", *t_button_selectable(theme, editMode == .GROUND)) { + editMode = .GROUND; + } + r.x -= r.w; + r.w *= 2.0; + r.y += r.h * 1.5; + if editMode == .GROUND { + if GR.button(r, "Grass", *t_button_selectable(theme, groundType == .GRASS)) { + groundType = .GRASS; + } + r.y += r.h; + if GR.button(r, "Water", *t_button_selectable(theme, groundType == .WATER)) { + groundType = .WATER; + } + r.y += r.h; + if GR.button(r, "Sand", *t_button_selectable(theme, groundType == .WATER)) { + groundType = .SAND; + } + } +} + +handle_tool_click :: (x: int, y: int, z: int) { + if editMode == { + case .TRILES; + if editor_current_trile != null then add_trile(editor_current_trile.name, cast(float)x, cast(float)y, cast(float)z); + case .GROUND; + + + + ray := get_mouse_ray(*get_level_editor_camera()); + hit, point := ray_plane_collision_point(ray, 0, 100); + print("ground point: %\n"); + if hit { + world.ground[floor(point.y).(int) + 500][floor(point.x).(int) + 500] = groundType; + } + } + +} + add_trile :: (name: string, x: float, y: float, z: float) { loose_float_comp :: (a: float, b: float) -> bool { @@ -275,7 +331,7 @@ tick_level_editor :: () { trile_preview_y = editY; trile_preview_z = xx floor(point.y); - if input_button_states[Key_Code.MOUSE_BUTTON_LEFT] & .START { + if get_mouse_state(Key_Code.MOUSE_BUTTON_LEFT) & .START { handle_tool_click(xx floor(point.x), xx editY, xx floor(point.y)); } } @@ -328,7 +384,7 @@ draw_world_triles :: (cam: *Camera, world: *World) { draw_level_editor :: () { cam := get_level_editor_camera(); - update_image_from_ground(*world, *gPipelines.plane.bind.images[2]); + if !is_in_reflection_pass then update_image_from_ground(*world, *gPipelines.plane.bind.images[1]); draw_sky(*get_level_editor_camera(), *world.conf); if !is_in_reflection_pass then draw_ground_plane(*get_level_editor_camera(), *world.conf); draw_world_triles(*cam, *world); @@ -336,6 +392,7 @@ draw_level_editor :: () { draw_level_editor_ui :: (theme: *GR.Overall_Theme) { r := GR.get_rect(0, ui_h(5,0), ui_w(20, 20), ui_h(95, 0)); + ui_add_mouse_occluder(r); draw_bg_rectangle(r, theme); tab_r := r; tab_r.h = ui_h(3,0); @@ -355,6 +412,8 @@ draw_level_editor_ui :: (theme: *GR.Overall_Theme) { r.y += tab_r.h; if current_tab == { + case .TOOLS; + draw_tools_tab(theme, r); case .TACOMA; draw_tacoma_tab(theme, r); case .INFO; diff --git a/src/editor/tacoma.jai b/src/editor/tacoma.jai index 6ad90db..1206f59 100644 --- a/src/editor/tacoma.jai +++ b/src/editor/tacoma.jai @@ -45,58 +45,55 @@ post_process_pipeline :: (color: Vector3, post_process: Post_Process) -> Vector3 return lerp(vec3(grayscale), sdr, post_process.saturation); } -test_gen :: (w: s32, h: s32, postprocess: Post_Process, conf: Tacoma.Gen_Config, worldConf: World_Config) { - trile := get_trile("test"); +gen_reference :: (w: s32, h: s32, postprocess: Post_Process, conf: Tacoma.Gen_Config, world: World) { + // Trile BLASes. + trile_list : [..]Tacoma.Trile_Data; + trile_list.allocator = temp; + // BLAS instances to create TLAS. + world_triles : [..]Tacoma.World_Trile; + world_triles.allocator = temp; - ttrile : Tacoma.Trile_Data; - for x: 0..15 { - for y: 0..15 { - for z: 0..15 { - ttrile.trixels[x][y][z] = .{ - trile.trixels[x][y][z].empty, - trile.trixels[x][y][z].material.color, - material_encode_to_float(trile.trixels[x][y][z].material) - }; + for world.positions { + trile := get_trile(it.trileName); + ttrile : Tacoma.Trile_Data; + for x: 0..15 { + for y: 0..15 { + for z: 0..15 { + ttrile.trixels[x][y][z] = .{ + trile.trixels[x][y][z].empty, + trile.trixels[x][y][z].material.color, + material_encode_to_float(trile.trixels[x][y][z].material) + }; + } } } + gfx := get_trile_gfx(it.trileName); + ttrile.vertices = gfx.vertices.data; + ttrile.vertexCount = cast(s32) (gfx.vertices.count / 3); + array_add(*trile_list, ttrile); + + for pos: it.positions { + array_add(*world_triles, Tacoma.World_Trile.{cast(s32)it_index, pos.xyz}); + } } - gfx := get_trile_gfx("test"); - ttrile.vertices = gfx.vertices.data; - ttrile.vertexCount = cast(s32) (gfx.vertices.count / 3); - - trile_list : [1]Tacoma.Trile_Data; - trile_list[0] = ttrile; sky : Tacoma.Sky_Config; - sky.skyBase = worldConf.skyBase; - sky.skyTop = worldConf.skyTop; - sky.sunDisk = worldConf.sunDisk; - sky.horizonHalo = worldConf.horizonHalo; - sky.sunHalo = worldConf.sunHalo; - sky.sunLightColor = worldConf.sunLightColor; - sky.sunPosition = worldConf.sunPosition; - sky.sunIntensity = worldConf.sunIntensity; - sky.skyIntensity = worldConf.skyIntensity; + sky.skyBase = world.conf.skyBase; + sky.skyTop = world.conf.skyTop; + sky.sunDisk = world.conf.sunDisk; + sky.horizonHalo = world.conf.horizonHalo; + sky.sunHalo = world.conf.sunHalo; + sky.sunLightColor = world.conf.sunLightColor; + sky.sunPosition = world.conf.sunPosition; + sky.sunIntensity = world.conf.sunIntensity; + sky.skyIntensity = world.conf.skyIntensity; - ts : Tacoma.Trile_Set = .{trile_list.data, trile_list.count}; + blases : Tacoma.Trile_Set = .{trile_list.data, cast(s32)trile_list.count}; + tlas : Tacoma.World = .{world_triles.data, cast(s32)world_triles.count}; - wTrile : Tacoma.World_Trile = .{ - 0, - .{1.0, 0.0, 0.0} - }; - - wTrile2 : Tacoma.World_Trile = .{ - 0, - .{0.0, 1.0, 1.0} - }; - - triles : [2]Tacoma.World_Trile = .[wTrile, wTrile2]; - - world : Tacoma.World = .{triles.data, 2}; - - ptr := Tacoma.do_gen("./modules/Tacoma/", w, h, sky, ts, world, conf); + ptr := Tacoma.do_gen("./modules/Tacoma/", w, h, sky, blases, tlas, conf); data := cast(*float) talloc(w*h*4*size_of(float)); memcpy(data, ptr, w*h*4*4); for 0..(w*h) { diff --git a/src/editor/textureDebugger.jai b/src/editor/textureDebugger.jai index c7d9110..507ec1b 100644 --- a/src/editor/textureDebugger.jai +++ b/src/editor/textureDebugger.jai @@ -2,24 +2,46 @@ subwindow : GR.Subwindow_Info; subwindow_initted : bool = false; +// @Hack: This is probably kinda a bad idea, I don't really know atm how else to get the theme into the subwindow. +theme_ptr : GR.Overall_Theme; current_pipeline : s32 = 0; current_slot : s32 = 0; pipeline_names : []string = .["arbtri", "trixel", "sky", "trile", "plane"]; slot_names : []string = .["Slot 1","Slot 2","Slot 3","Slot 4","Slot 5","Slot 6","Slot 7","Slot 8"]; - draw_subwindow_texture_debug :: (state: *GR.Subwindow_State, r: GR.Rect, data: *void) { r2 := r; r2.h = ui_h(5,0); r2.w = r.w * 0.75; - GR.dropdown(r2, pipeline_names, *current_pipeline, null); + GR.dropdown(r2, pipeline_names, *current_pipeline, *theme_ptr.dropdown_theme); r2.x += r2.w; r2.w = r.w * 0.25; - GR.dropdown(r2, slot_names, *current_slot, null); + GR.dropdown(r2, slot_names, *current_slot, *theme_ptr.dropdown_theme); - r2.h = r.h - r2.h; r2.y = r.y + r2.h; + r2.h = r.h - r2.h; + r2.x = r.x; + r2.w = r.w; + + uiTex := New(Ui_Texture ,,temp); + + bind : sg_bindings; + if current_pipeline == { + case 0; bind = gPipelines.arbtri.bind; + case 1; bind = gPipelines.trixel.bind; + case 2; bind = gPipelines.sky.bind; + case 3; bind = gPipelines.trile.bind; + case 4; bind = gPipelines.plane.bind; + } + + uiTex.tex = bind.images[current_slot]; + + if uiTex.tex.id != INVALID_ID { + set_shader_for_images(uiTex); + immediate_quad(.{r2.x, r2.y}, .{r2.x + r2.w, r2.y}, .{r2.x + r2.w, r2.y + r2.h}, .{r2.x, r2.y + r2.h}); + set_shader_for_color(); + } immediate_flush(); } @@ -35,10 +57,12 @@ toggle_texdebug :: () { draw_texture_debugger :: (theme: *GR.Overall_Theme) { if !subwindow.open then return; if !subwindow_initted { + theme_ptr = theme; r := GR.get_rect(ui_w(40, 0), ui_w(40, 0), ui_h(50,0), ui_h(50,0)); subwindow.rect = r; subwindow.draw = draw_subwindow_texture_debug; subwindow.title_text = "Texture Debugger"; + subwindow.open = false; subwindow_initted = true; } if subwindow.open { // The Subwindow starts open, but pressing the Close button can close it. diff --git a/src/editor/trile_editor.jai b/src/editor/trile_editor.jai index 951f9e2..7d4a303 100644 --- a/src/editor/trile_editor.jai +++ b/src/editor/trile_editor.jai @@ -259,6 +259,8 @@ draw_trile_editor :: () { } draw_trile :: () { + if is_in_reflection_pass then return; // We don't want to double update the buffer. + if editor_current_trile == null then return; cam := get_trile_editor_camera(); @@ -372,6 +374,7 @@ trile_editor_shortcuts :: () { draw_trile_editor_ui :: (theme: *GR.Overall_Theme) { r := GR.get_rect(0, ui_h(5,0), ui_w(20, 20), ui_h(95, 0)); + ui_add_mouse_occluder(r); draw_bg_rectangle(r, theme); tab_r := r; tab_r.h = ui_h(3,0); diff --git a/src/main.jai b/src/main.jai index f78ed9f..b41779b 100644 --- a/src/main.jai +++ b/src/main.jai @@ -32,7 +32,7 @@ last_frame_time : float64; delta\ _time : float64; V_MAJOR :: 0; -V_MINOR :: 4; +V_MINOR :: 5; state: struct { pass_action_clear : sg_pass_action; @@ -119,6 +119,7 @@ init_after_asset_pack :: () { is_in_reflection_pass : bool = false; frame :: () { + check_and_handle_window_resize(); delta_time = get_time() - last_frame_time; last_frame_time = get_time(); @@ -140,14 +141,14 @@ frame :: () { for event: Input.events_this_frame { GR.getrect_handle_event(event); } - + sgl_defaults(); sgl_matrix_mode_projection(); sgl_ortho(0.0, sapp_widthf(), sapp_heightf(), 0.0, -1.0, +1.0); tick_ui(); - sg_begin_pass(*(sg_pass.{ action = gPipelines.plane.pass_action, attachments = gPipelines.plane.attachments})); + sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, attachments = gPipelines.plane.attachments})); is_in_reflection_pass = true; draw_editor(); if !in_editor_view then game_draw(); @@ -157,14 +158,7 @@ frame :: () { sg_begin_pass(*(sg_pass.{ action = state.pass_action_clear, swapchain = cast,force(sg_swapchain) sglue_swapchain() })); draw_editor(); if !in_editor_view then game_draw(); - - - uiTex := Ui_Texture.{gPipelines.plane.bind.images[0]}; - set_shader_for_images(*uiTex); - r := GR.Rect.{0,0,500,500}; - immediate_quad(.{r.x, r.y}, .{r.x + r.w, r.y}, .{r.x + r.w, r.y + r.h}, .{r.x, r.y + r.h}); - set_shader_for_color(); - + ui_clear_mouse_occluders(); ui_pass(); sg_end_pass(); sg_commit(); diff --git a/src/pipelines.jai b/src/pipelines.jai index 78d3f66..1420f32 100644 --- a/src/pipelines.jai +++ b/src/pipelines.jai @@ -12,7 +12,7 @@ gPipelines : struct { // Arbitrary triangle rendering for rendering 2D things on the screen. // Used for UI rendering. arbtri : Pipeline_Binding; - + // Trixel rendering. Used for Trile editor rendering, in-game triles are rendered from // generated meshes. trixel : Pipeline_Binding; @@ -47,13 +47,15 @@ Position_Color :: struct { } create_trixel_pipeline :: () { + platconf := get_plat_conf(); + pipeline: sg_pipeline_desc; shader_desc := trixel_shader_desc(sg_query_backend()); pipeline.shader = sg_make_shader(*shader_desc); pipeline.layout.buffers[0].stride = 4*3; pipeline.layout.buffers[1].stride = 4*3; pipeline.layout.buffers[2].step_func = .PER_INSTANCE; - + pipeline.layout.attrs[ATTR_trixel_position] = .{ format = .FLOAT3, buffer_index = 0 }; pipeline.layout.attrs[ATTR_trixel_normal] = .{ format = .FLOAT3, buffer_index = 1 }; pipeline.layout.attrs[ATTR_trixel_inst] = .{ format = .FLOAT4, buffer_index = 2 }; @@ -73,6 +75,8 @@ create_trixel_pipeline :: () { } }; + pipeline.sample_count = platconf.sample_count; + vertices : [24]Vector3 = .[ .{-TRIXEL_SIZE/2, -TRIXEL_SIZE/2, TRIXEL_SIZE/2}, @@ -132,7 +136,7 @@ create_trixel_pipeline :: () { i : u16 = 0; indices : [36]u16; - + while i < 36 { indices[i] = 4*k; indices[i + 1] = 4*k + 1; @@ -144,12 +148,12 @@ create_trixel_pipeline :: () { i += 6; } - + pipeline.color_count = 1; pipeline.colors[0] = color_state; gPipelines.trixel.pipeline = sg_make_pipeline(*pipeline); - + ibuffer := sg_buffer_desc.{ type = .INDEXBUFFER, data = .{ ptr = indices.data, size = 36 * 2 } }; vbuffer := sg_buffer_desc.{ data = .{ ptr = vertices.data, size = 24 * 3 * 4 } }; nbuffer := sg_buffer_desc.{ data = .{ ptr = normals.data, size = 24 * 3 * 4 } }; @@ -162,6 +166,7 @@ create_trixel_pipeline :: () { } create_trile_pipeline :: () { + platconf := get_plat_conf(); pipeline: sg_pipeline_desc; shader_desc := trile_shader_desc(sg_query_backend()); pipeline.shader = sg_make_shader(*shader_desc); @@ -171,7 +176,7 @@ create_trile_pipeline :: () { pipeline.layout.buffers[3].step_func = .PER_INSTANCE; instance_buffer := sg_buffer_desc.{ usage = .STREAM, size = 16 * 4096 * 4 * 4}; - + pipeline.layout.attrs[ATTR_trile_position] = .{ format = .FLOAT3, buffer_index = 0 }; pipeline.layout.attrs[ATTR_trile_normal] = .{ format = .FLOAT3, buffer_index = 1 }; pipeline.layout.attrs[ATTR_trile_centre] = .{ format = .FLOAT3, buffer_index = 2 }; @@ -180,6 +185,7 @@ create_trile_pipeline :: () { write_enabled = true, compare = .LESS_EQUAL, }; + pipeline.sample_count = platconf.sample_count; color_state := sg_color_target_state.{ pixel_format = .RGBA8, @@ -205,11 +211,13 @@ create_trile_pipeline :: () { } create_sky_pipeline :: () { + platconf := get_plat_conf(); pipeline: sg_pipeline_desc; shader_desc := sky_shader_desc(sg_query_backend()); pipeline.shader = sg_make_shader(*shader_desc); pipeline.layout.buffers[0].stride = 4*3; - + pipeline.sample_count = platconf.sample_count; + pipeline.layout.attrs[ATTR_sky_position] = .{ format = .FLOAT3, buffer_index = 0 }; pipeline.index_type = .UINT16; pipeline.depth = .{ @@ -258,7 +266,7 @@ create_sky_pipeline :: () { i : u16 = 0; indices : [36]u16; - + while i < 36 { indices[i] = 4*k; indices[i + 1] = 4*k + 1; @@ -270,12 +278,12 @@ create_sky_pipeline :: () { i += 6; } - + pipeline.color_count = 1; pipeline.colors[0] = color_state; gPipelines.sky.pipeline = sg_make_pipeline(*pipeline); - + ibuffer := sg_buffer_desc.{ type = .INDEXBUFFER, data = .{ ptr = indices.data, size = 36 * 2 } }; vbuffer := sg_buffer_desc.{ data = .{ ptr = vertices.data, size = 24 * 3 * 4 } }; @@ -284,8 +292,13 @@ create_sky_pipeline :: () { } // @ToDo: This needs to be redone when the window is resized; -create_plane_pipeline_reflection_image :: (binding: *sg_bindings) { - reflection_img := sg_alloc_image(); +create_plane_pipeline_reflection_images :: () { + platconf := get_plat_conf(); + binding := *gPipelines.plane.bind; + if binding.images[4].id != INVALID_ID then sg_destroy_image(binding.images[4]); + if binding.images[5].id != INVALID_ID then sg_destroy_image(binding.images[5]); + if binding.images[0].id != INVALID_ID then sg_destroy_image(binding.images[0]); + w, h := get_window_size(); img_desc := sg_image_desc.{ width = w, @@ -296,26 +309,45 @@ create_plane_pipeline_reflection_image :: (binding: *sg_bindings) { depth_desc := sg_image_desc.{ width = w, height = h, - pixel_format = .DEPTH, + pixel_format = .DEPTH_STENCIL, render_target = true, }; + binding.images[4] = sg_make_image(*img_desc); + img_desc.sample_count = 1; binding.images[0] = sg_make_image(*img_desc); - binding.images[1] = sg_make_image(*depth_desc); + binding.images[5] = sg_make_image(*depth_desc); + attachmentsDesc : sg_attachments_desc; + if platconf.sample_count > 1 { + attachmentsDesc = .{ + colors[0].image = gPipelines.plane.bind.images[4], + resolves[0].image = gPipelines.plane.bind.images[0], + depth_stencil.image = gPipelines.plane.bind.images[5], + }; + } else { + attachmentsDesc = .{ + colors[0].image = gPipelines.plane.bind.images[0], + depth_stencil.image = gPipelines.plane.bind.images[5], + }; + } + + sg_destroy_attachments(gPipelines.plane.attachments); + gPipelines.plane.attachments = sg_make_attachments(*attachmentsDesc); } create_plane_pipeline :: () { + platconf := get_plat_conf(); pipeline: sg_pipeline_desc; shader_desc := plane_shader_desc(sg_query_backend()); pipeline.shader = sg_make_shader(*shader_desc); pipeline.layout.buffers[0].stride = 4*3; - + pipeline.layout.attrs[ATTR_plane_position] = .{ format = .FLOAT3, buffer_index = 0 }; pipeline.index_type = .UINT16; pipeline.depth = .{ write_enabled = true, compare = .LESS_EQUAL, - pixel_format = .DEPTH, + pixel_format = .DEPTH_STENCIL }; color_state := sg_color_target_state.{ @@ -338,27 +370,23 @@ create_plane_pipeline :: () { 0, 1, 2, 0, 2, 3, ]; - + + pipeline.sample_count = platconf.sample_count; + pipeline.color_count = 1; pipeline.colors[0] = color_state; gPipelines.plane.pipeline = sg_make_pipeline(*pipeline); - + ibuffer := sg_buffer_desc.{ type = .INDEXBUFFER, data = .{ ptr = indices.data, size = 6 * 2 } }; vbuffer := sg_buffer_desc.{ data = .{ ptr = vertices.data, size = 4 * 3 * 4 } }; gPipelines.plane.bind.index_buffer = sg_make_buffer(*ibuffer); gPipelines.plane.bind.vertex_buffers[0] = sg_make_buffer(*vbuffer); - create_plane_pipeline_reflection_image(*gPipelines.plane.bind); + create_plane_pipeline_reflection_images(); - attachmentsDesc := sg_attachments_desc.{ - colors[0].image = gPipelines.plane.bind.images[0], - depth_stencil.image = gPipelines.plane.bind.images[1], - }; - gPipelines.plane.attachments = sg_make_attachments(*attachmentsDesc); - gPipelines.plane.pass_action = .{ colors[0] = .{ load_action = .CLEAR, clear_value = .{ 0.25, 0.25, 0.25, 1.0 } }, }; @@ -369,31 +397,37 @@ create_plane_pipeline :: () { min_filter = .NEAREST, mag_filter = .NEAREST, })); + + gPipelines.plane.bind.samplers[1] = sg_make_sampler(*(sg_sampler_desc.{ + wrap_u = .CLAMP_TO_EDGE, + wrap_v = .CLAMP_TO_EDGE, + min_filter = .NEAREST, + mag_filter = .NEAREST, + })); - materialdata : [1000*1000*4]u8; - imgdata : sg_image_data; - imgdata.subimage[0][0] = .{materialdata.data, materialdata.count}; ground_img_desc := sg_image_desc.{ - width = 1000, - height = 1000, - pixel_format = .RGBA8, + width = 1000, + height = 1000, + pixel_format = .RGBA8, render_target = false, - sample_count = 1, - data = imgdata + sample_count = 1, + usage = .DYNAMIC, }; - - gPipelines.plane.bind.images[2] = sg_make_image(*ground_img_desc); + + gPipelines.plane.bind.images[1] = sg_make_image(*ground_img_desc); } create_arbtri_pipeline :: () { + platconf := get_plat_conf(); pipeline: sg_pipeline_desc; shader_desc := triangle_shader_desc(sg_query_backend()); pipeline.shader = sg_make_shader(*shader_desc); - + pipeline.layout.attrs[ATTR_triangle_position] = .{ format = .FLOAT3 }; pipeline.layout.attrs[ATTR_triangle_color0] = .{ format = .FLOAT4 }; pipeline.layout.attrs[ATTR_triangle_uv] = .{ format = .FLOAT2 }; + pipeline.sample_count = platconf.sample_count; color_state := sg_color_target_state.{ pixel_format = .RGBA8, @@ -408,7 +442,7 @@ create_arbtri_pipeline :: () { pipeline.colors[0] = color_state; gPipelines.arbtri.pipeline = sg_make_pipeline(*pipeline); - + buffer := sg_buffer_desc.{ usage = .DYNAMIC, size = size_of(type_of(gArbtriMem)) }; gPipelines.arbtri.bind.vertex_buffers[0] = sg_make_buffer(*buffer); gPipelines.arbtri.bind.samplers[0] = sg_make_sampler(*(sg_sampler_desc.{ diff --git a/src/platform_specific/common.jai b/src/platform_specific/common.jai index 6077522..cc7e643 100644 --- a/src/platform_specific/common.jai +++ b/src/platform_specific/common.jai @@ -16,6 +16,7 @@ temporary_storage: Temporary_Storage; temporary_storage_data: [TEMPORARY_STORAGE_SIZE] u8 #align 64; sapp_init :: () { + platconf := get_plat_conf(); default_context.temporary_storage = *temporary_storage; temporary_storage.data = temporary_storage_data.data; temporary_storage.size = temporary_storage_data.count; @@ -37,7 +38,7 @@ sapp_init :: () { window_title = wi.title, // icon = .{ sokol_default = true }, logger = .{ func = slog_func }, - sample_count = 4, + sample_count = platconf.sample_count, })); } } @@ -62,3 +63,24 @@ cleanup_plat :: () #c_call { cleanup(); } +Platform_Conf :: struct { + sample_count: s32; +} + +get_plat_conf :: () -> Platform_Conf { + #if OS == .WASM { + return .{ + sample_count = 1, + }; + } + #if OS == .LINUX { + return .{ + sample_count = 4, + }; + } + #if OS == .MACOS { + return .{ + sample_count = 4, + }; + } +} diff --git a/src/rendering/groundplane.jai b/src/rendering/groundplane.jai index 4a6a8a0..46b0b71 100644 --- a/src/rendering/groundplane.jai +++ b/src/rendering/groundplane.jai @@ -21,9 +21,5 @@ draw_ground_plane :: (cam: *Camera, worldConfig: *World_Config = null) { sg_apply_uniforms(UB_plane_world_config, *(sg_range.{ptr = *world_conf, size = size_of(type_of(world_conf))})); sg_apply_uniforms(UB_plane_data, *(sg_range.{ptr = *plane_data, size = size_of(type_of(plane_data))})); - if wc.planeType == 1 { - sg_draw(0, 6, 1); - } else { - sg_draw(0, 6, 128); - } + sg_draw(0, 6, 1); } diff --git a/src/rendering/rendering.jai b/src/rendering/rendering.jai index 09fc7e1..2614ec1 100644 --- a/src/rendering/rendering.jai +++ b/src/rendering/rendering.jai @@ -1,2 +1,28 @@ #load "groundplane.jai"; #load "sky.jai"; + +#scope_file + +initted : bool; +old_w : int; +old_h : int; + +on_window_resize :: () { + create_plane_pipeline_reflection_images(); +} + +#scope_export + +check_and_handle_window_resize :: () { + w,h := get_window_size(); + if !initted { + old_w = w; + old_h = h; + initted = true; + return; + } + if w != old_w || h != old_h { + old_w = w; old_h = h; + on_window_resize(); + } +} diff --git a/src/shaders/jai/shader_plane.jai b/src/shaders/jai/shader_plane.jai index 65540bc..abfce75 100644 --- a/src/shaders/jai/shader_plane.jai +++ b/src/shaders/jai/shader_plane.jai @@ -18,30 +18,46 @@ Uniform block 'plane_vs_params': Jai struct: Plane_Vs_Params Bind slot: UB_plane_vs_params => 0 - Uniform block 'plane_world_config': - Jai struct: Plane_World_Config - Bind slot: UB_plane_world_config => 1 Uniform block 'plane_data': Jai struct: Plane_Data Bind slot: UB_plane_data => 2 + Uniform block 'plane_world_config': + Jai struct: Plane_World_Config + Bind slot: UB_plane_world_config => 1 Image 'reftex': Image type: ._2D Sample type: .FLOAT Multisampled: false Bind slot: IMG_reftex => 0 + Image 'groundtex': + Image type: ._2D + Sample type: .FLOAT + Multisampled: false + Bind slot: IMG_groundtex => 1 Sampler 'refsmp': Type: .FILTERING Bind slot: SMP_refsmp => 0 + Sampler 'groundsmp': + Type: .FILTERING + Bind slot: SMP_groundsmp => 1 */ ATTR_plane_position :: 0; UB_plane_vs_params :: 0; -UB_plane_world_config :: 1; UB_plane_data :: 2; +UB_plane_world_config :: 1; IMG_reftex :: 0; +IMG_groundtex :: 1; SMP_refsmp :: 0; +SMP_groundsmp :: 1; Plane_Vs_Params :: struct { mvp: [16]float; }; +Plane_Data :: struct { + screen_w: s32; + screen_h: s32; + is_reflection_pass: s32; + _: [4]u8; +}; Plane_World_Config :: struct { skyBase: [3]float; _: [4]u8; @@ -66,12 +82,6 @@ Plane_World_Config :: struct { grassDensity: float; _: [4]u8; }; -Plane_Data :: struct { - screen_w: s32; - screen_h: s32; - is_reflection_pass: s32; - _: [4]u8; -}; /* #version 430 @@ -82,10 +92,9 @@ Plane_Data :: struct { void main() { - vec3 _16 = position.xyz * 1000.0; - float _35 = _16.x; - gl_Position = mat4(plane_vs_params[0], plane_vs_params[1], plane_vs_params[2], plane_vs_params[3]) * vec4(_35, float(gl_InstanceID) * 0.006000000052154064178466796875, _16.z, 1.0); - pos = vec4(_35, _16.yz, 1.0); + vec4 _37 = vec4(position.xyz * 1000.0, 1.0); + gl_Position = mat4(plane_vs_params[0], plane_vs_params[1], plane_vs_params[2], plane_vs_params[3]) * _37; + pos = _37; idx = gl_InstanceID; } @@ -102,30 +111,24 @@ vs_plane_source_glsl430 := u8.[ 0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x66,0x6c, 0x61,0x74,0x20,0x6f,0x75,0x74,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x3b,0x0a, 0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x31,0x36,0x20,0x3d,0x20,0x70,0x6f, - 0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30, - 0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x33,0x35,0x20,0x3d,0x20,0x5f,0x31,0x36,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61, - 0x74,0x34,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61, - 0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f, - 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65, - 0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x70, - 0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33, - 0x5d,0x29,0x20,0x2a,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x33,0x35,0x2c,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x28,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65, - 0x49,0x44,0x29,0x20,0x2a,0x20,0x30,0x2e,0x30,0x30,0x36,0x30,0x30,0x30,0x30,0x30, - 0x30,0x30,0x35,0x32,0x31,0x35,0x34,0x30,0x36,0x34,0x31,0x37,0x38,0x34,0x36,0x36, - 0x37,0x39,0x36,0x38,0x37,0x35,0x2c,0x20,0x5f,0x31,0x36,0x2e,0x7a,0x2c,0x20,0x31, - 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x76, - 0x65,0x63,0x34,0x28,0x5f,0x33,0x35,0x2c,0x20,0x5f,0x31,0x36,0x2e,0x79,0x7a,0x2c, - 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x64,0x78,0x20,0x3d, - 0x20,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x44,0x3b,0x0a, - 0x7d,0x0a,0x0a,0x00, + 0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x33,0x37,0x20,0x3d,0x20,0x76,0x65, + 0x63,0x34,0x28,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20, + 0x2a,0x20,0x31,0x30,0x30,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20, + 0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f, + 0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65, + 0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x70, + 0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32, + 0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61, + 0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e, + 0x63,0x65,0x49,0x44,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 430 + uniform ivec4 plane_data[1]; struct plane_world_config { vec3 skyBase; @@ -145,672 +148,303 @@ vs_plane_source_glsl430 := u8.[ float grassDensity; }; - uniform plane_world_config _207; + uniform plane_world_config _313; - uniform ivec4 plane_data[1]; layout(binding = 16) uniform sampler2D reftex_refsmp; + layout(binding = 17) uniform sampler2D groundtex_groundsmp; - layout(location = 0) out vec4 frag_color; layout(location = 0) in vec4 pos; + layout(location = 0) out vec4 frag_color; layout(location = 1) flat in int idx; - float random(vec2 st) - { - return fract(sin(dot(st, vec2(12.98980045318603515625, 78.233001708984375))) * 43758.546875); - } - - float _noise(vec2 st) - { - vec2 _110 = floor(st); - vec2 _113 = fract(st); - vec2 param = _110; - float _118 = random(param); - vec2 param_1 = _110 + vec2(1.0, 0.0); - float _125 = random(param_1); - vec2 param_2 = _110 + vec2(0.0, 1.0); - vec2 param_3 = _110 + vec2(1.0); - vec2 _148 = (_113 * _113) * (vec2(3.0) - (_113 * 2.0)); - float _152 = _148.x; - float _158 = _148.y; - return (mix(_118, _125, _152) + (((random(param_2) - _118) * _158) * (1.0 - _152))) + (((random(param_3) - _125) * _152) * _158); - } - uint murmurHash12(inout uvec2 src) { src *= uvec2(1540483477u); src ^= (src >> uvec2(24u)); src *= uvec2(1540483477u); - uint _66 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; - uint _73 = (_66 ^ (_66 >> 13u)) * 1540483477u; - return _73 ^ (_73 >> 15u); + uint _64 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; + uint _71 = (_64 ^ (_64 >> 13u)) * 1540483477u; + return _71 ^ (_71 >> 15u); } float hash12(vec2 src) { uvec2 param = floatBitsToUint(src); - uint _86 = murmurHash12(param); - return uintBitsToFloat((_86 & 8388607u) | 1065353216u) - 1.0; + uint _84 = murmurHash12(param); + return uintBitsToFloat((_84 & 8388607u) | 1065353216u) - 1.0; } - vec3 wave(vec4 wave_1, vec3 p, inout vec3 tangent, inout vec3 binormal) + vec3 get_ground_sample(vec4 pos_1, float dirX, float dirY) { - float _188 = 6.282000064849853515625 / wave_1.w; - vec2 _196 = normalize(vec2(wave_1.x, wave_1.y)); - float _216 = _188 * (dot(_196, p.xz) - (_207.time * 0.20000000298023223876953125)); - float _220 = wave_1.z / _188; - float _222 = _196.x; - float _223 = -_222; - float _229 = sin(_216); - float _230 = wave_1.z * _229; - float _236 = cos(_216); - float _237 = wave_1.z * _236; - float _243 = _196.y; - float _249 = (_223 * _243) * _230; - tangent += vec3((_223 * _222) * _230, _222 * _237, _249); - binormal += vec3(_249, _243 * _237, ((-_243) * _243) * _230); - float _290 = _220 * _236; - return vec3(_222 * _290, _220 * _229, _243 * _290); + vec4 _166 = texelFetch(groundtex_groundsmp, ivec2(int(floor(pos_1.x + dirX) + 500.0), int(floor(pos_1.z + dirY) + 500.0)), 0); + vec2 param = pos_1.xz; + vec2 param_1 = pos_1.xz; + if (_166.z == 1.0) + { + return texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x), int(float(plane_data[0].y) - gl_FragCoord.y)), 0).xyz * vec3(0.0, 0.800000011920928955078125, 0.800000011920928955078125); + } + else + { + if (_166.x == 1.0) + { + return vec3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param)); + } + else + { + return vec3(0.4000000059604644775390625, 0.800000011920928955078125, 0.300000011920928955078125) * mix(0.800000011920928955078125, 1.0, hash12(param_1)); + } + } + } + + int sign2(float x) + { + if (x < 0.0) + { + return -1; + } + return 1; } void main() { - if (_207.planeType == 1) + vec4 _220 = round(pos * 16.0) * vec4(0.0625); + vec2 _235 = _220.xz - vec2(floor(_220.x) + 0.5, floor(_220.z) + 0.5); + float _239 = _235.x; + float _245 = _235.y; + vec4 param = _220; + float param_1 = 0.0; + float param_2 = 0.0; + float param_3 = _239; + vec4 param_4 = _220; + float param_5 = float(sign2(param_3)); + float param_6 = 0.0; + float param_7 = _245; + vec4 param_8 = _220; + float param_9 = 0.0; + float param_10 = float(sign2(param_7)); + float param_11 = _239; + float param_12 = _245; + vec4 param_13 = _220; + float param_14 = float(sign2(param_11)); + float param_15 = float(sign2(param_12)); + vec3 _297 = vec3(smoothstep(0.20000000298023223876953125, 0.5, abs(_239)) * 0.5); + vec3 _304 = mix(get_ground_sample(param_8, param_9, param_10), get_ground_sample(param_13, param_14, param_15), _297); + if (_313.planeType == 1) { - frag_color = texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x), int(float(plane_data[0].y) - gl_FragCoord.y)), 0) * vec4(0.89999997615814208984375, 0.89999997615814208984375, 1.0, 1.0); + frag_color = vec4(mix(mix(get_ground_sample(param, param_1, param_2), get_ground_sample(param_4, param_5, param_6), _297), _304, vec3(smoothstep(0.20000000298023223876953125, 0.5, abs(_245)) * 0.5)), 1.0); } else { - vec2 _363 = pos.xz * _207.grassDensity; - float _365 = _363.y; - float _371 = _363.x + (sin(_365) * 0.5); - vec2 _756 = vec2(_371, _365 + (sin(_371) * 0.5)); - vec2 ruohokeskus = round(_756); - vec2 param = _756 * vec2(0.0199999995529651641845703125); - float _390 = _noise(param); - vec2 _395 = _756 * vec2(0.00200000009499490261077880859375); - vec2 param_1 = _395; - float _397 = _noise(param_1); - vec2 param_2 = _395; - float _403 = _noise(param_2); - float noiseval_plantti = _403; - if (_403 < 0.89999997615814208984375) - { - noiseval_plantti = 0.0; - } - else - { - noiseval_plantti = (noiseval_plantti - 0.89999997615814208984375) * 10.0; - } - vec2 param_3 = _756.yx * vec2(0.001428571413271129131317138671875); - float _420 = _noise(param_3); - int is_water = 0; - float is_water_coast = 1.0; - float coast_multiplier = 0.0; - if (_420 > 0.89999997615814208984375) - { - is_water = 1; - if (_420 < 0.930000007152557373046875) - { - is_water_coast = (_420 - 0.89999997615814208984375) * 33.33300018310546875; - } - } - if (_420 > 0.800000011920928955078125) - { - coast_multiplier = (_420 - 0.800000011920928955078125) * 10.0; - } - vec2 param_4 = ruohokeskus; - float rand = (hash12(param_4) - 0.4000000059604644775390625) + (0.4000000059604644775390625 * _397); - vec2 param_5 = round(_363 * 10.0); - vec4 _476 = vec4(vec3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param_5)), 1.0); - if (is_water == 1) - { - vec4 param_6 = vec4(1.0, 0.5, 0.100000001490116119384765625, 0.89999997615814208984375); - vec3 param_7 = pos.xyz; - vec3 param_8 = vec3(1.0, 0.0, 0.0); - vec3 param_9 = vec3(0.0, 0.0, 1.0); - vec3 _496 = wave(param_6, param_7, param_8, param_9); - vec3 _507 = normalize(cross(normalize(param_9), normalize(param_8))); - vec2 _512 = _507.xz * 0.004999999888241291046142578125; - bool _551 = idx > 0; - bool _559; - if (!_551) - { - _559 = plane_data[0].z == 1; - } - else - { - _559 = _551; - } - if (_559) - { - discard; - } - float _599 = smoothstep(0.0, 0.89999997615814208984375, is_water_coast); - frag_color = vec4(min(vec3(1.0), vec3(mix(1.0, 0.800000011920928955078125, _599)) + ((_207.sunLightColor * (min(max(max(dot(normalize(_207.sunPosition), _507), 0.0), 0.100000001490116119384765625), 1.0) * _207.sunIntensity)) * 0.100000001490116119384765625)), 1.0) * mix(_476, texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x + float(int(clamp(_512.x, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(plane_data[0].x)))), int(float(plane_data[0].y + int(clamp(_512.y, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(plane_data[0].y))) - gl_FragCoord.y)), 0), vec4(_599)); - } - else - { - float _620 = float(idx); - float _621 = 0.0078125 * _620; - float _624 = rand; - float _627 = max(0.0, _624 - mix(0.0, 1.0, coast_multiplier)); - rand = _627; - vec2 _736 = ruohokeskus; - _736.x = _736.x + ((sin(_207.time * 1.2000000476837158203125) * 0.20000000298023223876953125) * _621); - ruohokeskus = _736; - bool _647 = idx > 0; - if (_647 && (_627 < 0.20000000298023223876953125)) - { - discard; - } - bool _666; - if (_647) - { - _666 = ((rand - _621) * 0.5) < length(_736 - _756); - } - else - { - _666 = _647; - } - if (_666) - { - discard; - } - else - { - if (idx == 0) - { - frag_color = mix(vec4(_397 * 0.5, 0.20000000298023223876953125 + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), _476, vec4(coast_multiplier)); - } - else - { - float _711 = (_620 * 0.015625) + 0.4000000059604644775390625; - frag_color = mix(mix(vec4(_397 * 0.5, min(1.0, _621 + 0.20000000298023223876953125) + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), vec4(_621, _620 * 0.0023437500931322574615478515625, 0.0, 1.0), vec4(noiseval_plantti)), vec4(_711, _711, 0.0, 1.0), vec4(coast_multiplier)); - } - } - } + frag_color = vec4(_304, 1.0); } } */ fs_plane_source_glsl430 := u8.[ - 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x73,0x74, - 0x72,0x75,0x63,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64, - 0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65, - 0x63,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x76,0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48, - 0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75, - 0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, - 0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74, - 0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73, - 0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x6b,0x79,0x49,0x6e,0x74,0x65,0x6e,0x73, - 0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73, - 0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20, - 0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79, - 0x70,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69, - 0x6d,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x72, - 0x61,0x73,0x73,0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, - 0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f, - 0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x20,0x5f,0x32,0x30,0x37,0x3b, - 0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x69,0x76,0x65,0x63,0x34,0x20, - 0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x31,0x5d,0x3b,0x0a,0x6c, + 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x34,0x33,0x30,0x0a,0x0a,0x75,0x6e, + 0x69,0x66,0x6f,0x72,0x6d,0x20,0x69,0x76,0x65,0x63,0x34,0x20,0x70,0x6c,0x61,0x6e, + 0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x72,0x75,0x63, + 0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f, + 0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, + 0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63, + 0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65, + 0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x76,0x65,0x63,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x48,0x61, + 0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e, + 0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x75,0x6e,0x49, + 0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x73,0x6b,0x79,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x43,0x6c,0x6f, + 0x75,0x64,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73, + 0x50,0x6c,0x61,0x6e,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69,0x6d,0x65,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x72,0x61,0x73,0x73, + 0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69, + 0x66,0x6f,0x72,0x6d,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64, + 0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x20,0x5f,0x33,0x31,0x33,0x3b,0x0a,0x0a,0x6c, 0x61,0x79,0x6f,0x75,0x74,0x28,0x62,0x69,0x6e,0x64,0x69,0x6e,0x67,0x20,0x3d,0x20, 0x31,0x36,0x29,0x20,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x73,0x61,0x6d,0x70, 0x6c,0x65,0x72,0x32,0x44,0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66, - 0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63, - 0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76, - 0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a, - 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20, - 0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73, - 0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f, - 0x6e,0x20,0x3d,0x20,0x31,0x29,0x20,0x66,0x6c,0x61,0x74,0x20,0x69,0x6e,0x20,0x69, - 0x6e,0x74,0x20,0x69,0x64,0x78,0x3b,0x0a,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72, - 0x61,0x6e,0x64,0x6f,0x6d,0x28,0x76,0x65,0x63,0x32,0x20,0x73,0x74,0x29,0x0a,0x7b, - 0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x66,0x72,0x61,0x63, - 0x74,0x28,0x73,0x69,0x6e,0x28,0x64,0x6f,0x74,0x28,0x73,0x74,0x2c,0x20,0x76,0x65, - 0x63,0x32,0x28,0x31,0x32,0x2e,0x39,0x38,0x39,0x38,0x30,0x30,0x34,0x35,0x33,0x31, - 0x38,0x36,0x30,0x33,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x37,0x38,0x2e,0x32, - 0x33,0x33,0x30,0x30,0x31,0x37,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x29, - 0x29,0x20,0x2a,0x20,0x34,0x33,0x37,0x35,0x38,0x2e,0x35,0x34,0x36,0x38,0x37,0x35, - 0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x6e,0x6f,0x69, - 0x73,0x65,0x28,0x76,0x65,0x63,0x32,0x20,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x31,0x31,0x30,0x20,0x3d,0x20,0x66,0x6c, - 0x6f,0x6f,0x72,0x28,0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63, - 0x32,0x20,0x5f,0x31,0x31,0x33,0x20,0x3d,0x20,0x66,0x72,0x61,0x63,0x74,0x28,0x73, - 0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72, - 0x61,0x6d,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x31,0x38,0x20,0x3d,0x20,0x72,0x61,0x6e,0x64, - 0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76, - 0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x31, - 0x31,0x30,0x20,0x2b,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30, - 0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x31,0x32,0x35,0x20,0x3d,0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b, - 0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, - 0x33,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x76,0x65,0x63,0x32,0x28, - 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f, - 0x31,0x34,0x38,0x20,0x3d,0x20,0x28,0x5f,0x31,0x31,0x33,0x20,0x2a,0x20,0x5f,0x31, - 0x31,0x33,0x29,0x20,0x2a,0x20,0x28,0x76,0x65,0x63,0x32,0x28,0x33,0x2e,0x30,0x29, - 0x20,0x2d,0x20,0x28,0x5f,0x31,0x31,0x33,0x20,0x2a,0x20,0x32,0x2e,0x30,0x29,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x35,0x32, - 0x20,0x3d,0x20,0x5f,0x31,0x34,0x38,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x35,0x38,0x20,0x3d,0x20,0x5f,0x31,0x34,0x38, - 0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x28, - 0x6d,0x69,0x78,0x28,0x5f,0x31,0x31,0x38,0x2c,0x20,0x5f,0x31,0x32,0x35,0x2c,0x20, - 0x5f,0x31,0x35,0x32,0x29,0x20,0x2b,0x20,0x28,0x28,0x28,0x72,0x61,0x6e,0x64,0x6f, - 0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29,0x20,0x2d,0x20,0x5f,0x31,0x31, - 0x38,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x38,0x29,0x20,0x2a,0x20,0x28,0x31,0x2e, - 0x30,0x20,0x2d,0x20,0x5f,0x31,0x35,0x32,0x29,0x29,0x29,0x20,0x2b,0x20,0x28,0x28, - 0x28,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29, - 0x20,0x2d,0x20,0x5f,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x32,0x29, - 0x20,0x2a,0x20,0x5f,0x31,0x35,0x38,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x75,0x69,0x6e, - 0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31,0x32,0x28,0x69, - 0x6e,0x6f,0x75,0x74,0x20,0x75,0x76,0x65,0x63,0x32,0x20,0x73,0x72,0x63,0x29,0x0a, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a,0x3d,0x20,0x75,0x76,0x65, - 0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x5e,0x3d,0x20,0x28,0x73,0x72,0x63, - 0x20,0x3e,0x3e,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x32,0x34,0x75,0x29,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a,0x3d,0x20,0x75,0x76,0x65,0x63, - 0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x36,0x36,0x20,0x3d,0x20,0x28, - 0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36,0x37,0x33,0x39,0x75,0x20,0x5e,0x20,0x73, - 0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34, - 0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x79,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x37,0x33,0x20,0x3d,0x20,0x28,0x5f,0x36, - 0x36,0x20,0x5e,0x20,0x28,0x5f,0x36,0x36,0x20,0x3e,0x3e,0x20,0x31,0x33,0x75,0x29, - 0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x5f,0x37,0x33,0x20, - 0x5e,0x20,0x28,0x5f,0x37,0x33,0x20,0x3e,0x3e,0x20,0x31,0x35,0x75,0x29,0x3b,0x0a, - 0x7d,0x0a,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28, - 0x76,0x65,0x63,0x32,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x75,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x55,0x69,0x6e,0x74,0x28,0x73,0x72, - 0x63,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x38,0x36, - 0x20,0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31,0x32,0x28, - 0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75, - 0x72,0x6e,0x20,0x75,0x69,0x6e,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x46,0x6c,0x6f, - 0x61,0x74,0x28,0x28,0x5f,0x38,0x36,0x20,0x26,0x20,0x38,0x33,0x38,0x38,0x36,0x30, - 0x37,0x75,0x29,0x20,0x7c,0x20,0x31,0x30,0x36,0x35,0x33,0x35,0x33,0x32,0x31,0x36, - 0x75,0x29,0x20,0x2d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x65,0x63, - 0x33,0x20,0x77,0x61,0x76,0x65,0x28,0x76,0x65,0x63,0x34,0x20,0x77,0x61,0x76,0x65, - 0x5f,0x31,0x2c,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x2c,0x20,0x69,0x6e,0x6f,0x75, - 0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x74,0x61,0x6e,0x67,0x65,0x6e,0x74,0x2c,0x20, - 0x69,0x6e,0x6f,0x75,0x74,0x20,0x76,0x65,0x63,0x33,0x20,0x62,0x69,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x5f,0x31,0x38,0x38,0x20,0x3d,0x20,0x36,0x2e,0x32,0x38,0x32,0x30,0x30,0x30, - 0x30,0x36,0x34,0x38,0x34,0x39,0x38,0x35,0x33,0x35,0x31,0x35,0x36,0x32,0x35,0x20, - 0x2f,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x76,0x65,0x63,0x32,0x20,0x5f,0x31,0x39,0x36,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d, - 0x61,0x6c,0x69,0x7a,0x65,0x28,0x76,0x65,0x63,0x32,0x28,0x77,0x61,0x76,0x65,0x5f, - 0x31,0x2e,0x78,0x2c,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x79,0x29,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x31,0x36,0x20, - 0x3d,0x20,0x5f,0x31,0x38,0x38,0x20,0x2a,0x20,0x28,0x64,0x6f,0x74,0x28,0x5f,0x31, - 0x39,0x36,0x2c,0x20,0x70,0x2e,0x78,0x7a,0x29,0x20,0x2d,0x20,0x28,0x5f,0x32,0x30, - 0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30, - 0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39, - 0x35,0x33,0x31,0x32,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x32,0x32,0x30,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31, - 0x2e,0x7a,0x20,0x2f,0x20,0x5f,0x31,0x38,0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x32,0x20,0x3d,0x20,0x5f,0x31,0x39,0x36, - 0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32, - 0x32,0x33,0x20,0x3d,0x20,0x2d,0x5f,0x32,0x32,0x32,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x39,0x20,0x3d,0x20,0x73,0x69,0x6e, - 0x28,0x5f,0x32,0x31,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x32,0x33,0x30,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e, - 0x7a,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x36,0x20,0x3d,0x20,0x63,0x6f,0x73,0x28,0x5f, - 0x32,0x31,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x32,0x33,0x37,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x7a,0x20, - 0x2a,0x20,0x5f,0x32,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x32,0x34,0x33,0x20,0x3d,0x20,0x5f,0x31,0x39,0x36,0x2e,0x79,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x34,0x39,0x20, - 0x3d,0x20,0x28,0x5f,0x32,0x32,0x33,0x20,0x2a,0x20,0x5f,0x32,0x34,0x33,0x29,0x20, - 0x2a,0x20,0x5f,0x32,0x33,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x74,0x61,0x6e,0x67, - 0x65,0x6e,0x74,0x20,0x2b,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x28,0x5f,0x32,0x32, - 0x33,0x20,0x2a,0x20,0x5f,0x32,0x32,0x32,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30, - 0x2c,0x20,0x5f,0x32,0x32,0x32,0x20,0x2a,0x20,0x5f,0x32,0x33,0x37,0x2c,0x20,0x5f, - 0x32,0x34,0x39,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x62,0x69,0x6e,0x6f,0x72,0x6d, - 0x61,0x6c,0x20,0x2b,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x32,0x34,0x39,0x2c, - 0x20,0x5f,0x32,0x34,0x33,0x20,0x2a,0x20,0x5f,0x32,0x33,0x37,0x2c,0x20,0x28,0x28, - 0x2d,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a,0x20,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a, - 0x20,0x5f,0x32,0x33,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x32,0x39,0x30,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x20,0x2a,0x20, - 0x5f,0x32,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e, - 0x20,0x76,0x65,0x63,0x33,0x28,0x5f,0x32,0x32,0x32,0x20,0x2a,0x20,0x5f,0x32,0x39, - 0x30,0x2c,0x20,0x5f,0x32,0x32,0x30,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x2c,0x20, - 0x5f,0x32,0x34,0x33,0x20,0x2a,0x20,0x5f,0x32,0x39,0x30,0x29,0x3b,0x0a,0x7d,0x0a, - 0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x32,0x30,0x37,0x2e,0x70,0x6c,0x61,0x6e, - 0x65,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63, - 0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65,0x74,0x63, - 0x68,0x28,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c, - 0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72, - 0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28, - 0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61, - 0x5b,0x30,0x5d,0x2e,0x79,0x29,0x20,0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67, - 0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79,0x29,0x29,0x2c,0x20,0x30,0x29,0x20,0x2a,0x20, - 0x76,0x65,0x63,0x34,0x28,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36, - 0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20, - 0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34, - 0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20, - 0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, - 0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x33,0x36,0x33,0x20,0x3d,0x20,0x70, - 0x6f,0x73,0x2e,0x78,0x7a,0x20,0x2a,0x20,0x5f,0x32,0x30,0x37,0x2e,0x67,0x72,0x61, - 0x73,0x73,0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x36,0x35,0x20,0x3d,0x20, - 0x5f,0x33,0x36,0x33,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x37,0x31,0x20,0x3d,0x20,0x5f,0x33,0x36, - 0x33,0x2e,0x78,0x20,0x2b,0x20,0x28,0x73,0x69,0x6e,0x28,0x5f,0x33,0x36,0x35,0x29, - 0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x35,0x36,0x20,0x3d,0x20,0x76,0x65,0x63, - 0x32,0x28,0x5f,0x33,0x37,0x31,0x2c,0x20,0x5f,0x33,0x36,0x35,0x20,0x2b,0x20,0x28, - 0x73,0x69,0x6e,0x28,0x5f,0x33,0x37,0x31,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20, - 0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x20,0x3d,0x20,0x72,0x6f, - 0x75,0x6e,0x64,0x28,0x5f,0x37,0x35,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20, - 0x5f,0x37,0x35,0x36,0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x31, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34, - 0x31,0x38,0x34,0x35,0x37,0x30,0x33,0x31,0x32,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x39,0x30,0x20, - 0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x33, - 0x39,0x35,0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x20,0x2a,0x20,0x76,0x65,0x63,0x32, - 0x28,0x30,0x2e,0x30,0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x39,0x34,0x39, - 0x39,0x34,0x39,0x30,0x32,0x36,0x31,0x30,0x37,0x37,0x38,0x38,0x30,0x38,0x35,0x39, - 0x33,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65, - 0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x33,0x39, - 0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x5f,0x33,0x39,0x37,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20, - 0x5f,0x33,0x39,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x34,0x30,0x33,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73, - 0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76, - 0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x5f,0x34,0x30, - 0x33,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f, - 0x34,0x30,0x33,0x20,0x3c,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37, - 0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f, - 0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20, + 0x73,0x6d,0x70,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x62,0x69,0x6e,0x64, + 0x69,0x6e,0x67,0x20,0x3d,0x20,0x31,0x37,0x29,0x20,0x75,0x6e,0x69,0x66,0x6f,0x72, + 0x6d,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x67,0x72,0x6f,0x75, + 0x6e,0x64,0x74,0x65,0x78,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x3b, + 0x0a,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f, + 0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x69,0x6e,0x20,0x76,0x65,0x63,0x34,0x20,0x70, + 0x6f,0x73,0x3b,0x0a,0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74, + 0x69,0x6f,0x6e,0x20,0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x76,0x65,0x63, + 0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x6c,0x61, + 0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20, + 0x31,0x29,0x20,0x66,0x6c,0x61,0x74,0x20,0x69,0x6e,0x20,0x69,0x6e,0x74,0x20,0x69, + 0x64,0x78,0x3b,0x0a,0x0a,0x75,0x69,0x6e,0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72, + 0x48,0x61,0x73,0x68,0x31,0x32,0x28,0x69,0x6e,0x6f,0x75,0x74,0x20,0x75,0x76,0x65, + 0x63,0x32,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72, + 0x63,0x20,0x2a,0x3d,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34, + 0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63, + 0x20,0x5e,0x3d,0x20,0x28,0x73,0x72,0x63,0x20,0x3e,0x3e,0x20,0x75,0x76,0x65,0x63, + 0x32,0x28,0x32,0x34,0x75,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63, + 0x20,0x2a,0x3d,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38, + 0x33,0x34,0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74, + 0x20,0x5f,0x36,0x34,0x20,0x3d,0x20,0x28,0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36, + 0x37,0x33,0x39,0x75,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20, + 0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73, + 0x72,0x63,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f, + 0x37,0x31,0x20,0x3d,0x20,0x28,0x5f,0x36,0x34,0x20,0x5e,0x20,0x28,0x5f,0x36,0x34, + 0x20,0x3e,0x3e,0x20,0x31,0x33,0x75,0x29,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30, + 0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6e,0x20,0x5f,0x37,0x31,0x20,0x5e,0x20,0x28,0x5f,0x37,0x31,0x20,0x3e, + 0x3e,0x20,0x31,0x35,0x75,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x76,0x65,0x63,0x32,0x20,0x73,0x72,0x63, + 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x75,0x76,0x65,0x63,0x32,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x42,0x69,0x74,0x73,0x54, + 0x6f,0x55,0x69,0x6e,0x74,0x28,0x73,0x72,0x63,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x75,0x69,0x6e,0x74,0x20,0x5f,0x38,0x34,0x20,0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75, + 0x72,0x48,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x75,0x69,0x6e,0x74,0x42, + 0x69,0x74,0x73,0x54,0x6f,0x46,0x6c,0x6f,0x61,0x74,0x28,0x28,0x5f,0x38,0x34,0x20, + 0x26,0x20,0x38,0x33,0x38,0x38,0x36,0x30,0x37,0x75,0x29,0x20,0x7c,0x20,0x31,0x30, + 0x36,0x35,0x33,0x35,0x33,0x32,0x31,0x36,0x75,0x29,0x20,0x2d,0x20,0x31,0x2e,0x30, + 0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x65,0x63,0x33,0x20,0x67,0x65,0x74,0x5f,0x67,0x72, + 0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x76,0x65,0x63,0x34, + 0x20,0x70,0x6f,0x73,0x5f,0x31,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69, + 0x72,0x58,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x72,0x59,0x29,0x0a, + 0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x31,0x36,0x36,0x20, + 0x3d,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65,0x74,0x63,0x68,0x28,0x67,0x72,0x6f, + 0x75,0x6e,0x64,0x74,0x65,0x78,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70, + 0x2c,0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x6f, + 0x72,0x28,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78,0x20,0x2b,0x20,0x64,0x69,0x72,0x58, + 0x29,0x20,0x2b,0x20,0x35,0x30,0x30,0x2e,0x30,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28, + 0x66,0x6c,0x6f,0x6f,0x72,0x28,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x7a,0x20,0x2b,0x20, + 0x64,0x69,0x72,0x59,0x29,0x20,0x2b,0x20,0x35,0x30,0x30,0x2e,0x30,0x29,0x29,0x2c, + 0x20,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78,0x7a,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78,0x7a,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x36,0x36,0x2e,0x7a,0x20,0x3d,0x3d,0x20,0x31, + 0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65, + 0x74,0x63,0x68,0x28,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d, + 0x70,0x2c,0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f, + 0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e, + 0x74,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61, + 0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79,0x29,0x20,0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72, + 0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79,0x29,0x29,0x2c,0x20,0x30,0x29,0x2e, + 0x78,0x79,0x7a,0x20,0x2a,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x30,0x2c,0x20, + 0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32, + 0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x38,0x30, + 0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35, + 0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x36,0x36,0x2e,0x78, + 0x20,0x3d,0x3d,0x20,0x31,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x38,0x30,0x30, + 0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30, + 0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39, + 0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37, + 0x35,0x2c,0x20,0x30,0x2e,0x35,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e, + 0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39, + 0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x68, + 0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x29,0x3b,0x0a,0x20, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x69,0x73, - 0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x28, - 0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69, - 0x20,0x2d,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35, - 0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x20,0x2a,0x20, - 0x31,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x2e,0x79,0x78,0x20,0x2a, - 0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x30,0x31,0x34,0x32,0x38,0x35,0x37, - 0x31,0x34,0x31,0x33,0x32,0x37,0x31,0x31,0x32,0x39,0x31,0x33,0x31,0x33,0x31,0x37, - 0x31,0x33,0x38,0x36,0x37,0x31,0x38,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x32,0x30,0x20,0x3d, - 0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x73, - 0x5f,0x77,0x61,0x74,0x65,0x72,0x20,0x3d,0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x73,0x5f,0x77,0x61,0x74, - 0x65,0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x31,0x2e,0x30,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x63,0x6f, - 0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72,0x20,0x3d, - 0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66, - 0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x3e,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39, - 0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33, - 0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73,0x5f,0x77,0x61,0x74, - 0x65,0x72,0x20,0x3d,0x20,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x3c,0x20,0x30, - 0x2e,0x39,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x31,0x35,0x32,0x35,0x35,0x37, - 0x33,0x37,0x33,0x30,0x34,0x36,0x38,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65, - 0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x28,0x5f,0x34,0x32,0x30,0x20, - 0x2d,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38, - 0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x20,0x2a,0x20,0x33, - 0x33,0x2e,0x33,0x33,0x33,0x30,0x30,0x30,0x31,0x38,0x33,0x31,0x30,0x35,0x34,0x36, - 0x38,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x3e,0x20, - 0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32, - 0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69, - 0x65,0x72,0x20,0x3d,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x2d,0x20,0x30,0x2e,0x38, - 0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35, - 0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x31,0x30,0x2e,0x30,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20, - 0x3d,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x61,0x6e, - 0x64,0x20,0x3d,0x20,0x28,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x34,0x29,0x20,0x2d,0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36, - 0x32,0x35,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36, - 0x32,0x35,0x20,0x2a,0x20,0x5f,0x33,0x39,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35, - 0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64,0x28,0x5f,0x33,0x36,0x33,0x20,0x2a,0x20, - 0x31,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, - 0x65,0x63,0x34,0x20,0x5f,0x34,0x37,0x36,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28, - 0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31, - 0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c, - 0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30, - 0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c,0x20,0x30,0x2e,0x35, - 0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30, - 0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31, - 0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x73,0x5f, - 0x77,0x61,0x74,0x65,0x72,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d, - 0x20,0x76,0x65,0x63,0x34,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20, - 0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31, - 0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x2c,0x20,0x30, - 0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32, - 0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x37,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x31, - 0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x30, - 0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20, - 0x5f,0x34,0x39,0x36,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x36,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x38,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63, - 0x33,0x20,0x5f,0x35,0x30,0x37,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, - 0x7a,0x65,0x28,0x63,0x72,0x6f,0x73,0x73,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, - 0x7a,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x2c,0x20,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x29, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76, - 0x65,0x63,0x32,0x20,0x5f,0x35,0x31,0x32,0x20,0x3d,0x20,0x5f,0x35,0x30,0x37,0x2e, - 0x78,0x7a,0x20,0x2a,0x20,0x30,0x2e,0x30,0x30,0x34,0x39,0x39,0x39,0x39,0x39,0x39, - 0x38,0x38,0x38,0x32,0x34,0x31,0x32,0x39,0x31,0x30,0x34,0x36,0x31,0x34,0x32,0x35, - 0x37,0x38,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x35,0x35,0x31,0x20,0x3d,0x20,0x69, - 0x64,0x78,0x20,0x3e,0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x35,0x35,0x39,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x21, - 0x5f,0x35,0x35,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x5f,0x35,0x35,0x39,0x20,0x3d,0x20,0x70,0x6c,0x61,0x6e,0x65, - 0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x7a,0x20,0x3d,0x3d,0x20,0x31,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35, - 0x35,0x39,0x20,0x3d,0x20,0x5f,0x35,0x35,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x35,0x35,0x39,0x29,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x69,0x73, - 0x63,0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x35,0x39,0x39,0x20,0x3d,0x20,0x73,0x6d,0x6f, - 0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x38, - 0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38, - 0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65,0x72, - 0x5f,0x63,0x6f,0x61,0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20, - 0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x6e,0x28,0x76,0x65,0x63,0x33,0x28, - 0x31,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x6d,0x69,0x78,0x28,0x31, - 0x2e,0x30,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39, - 0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20, - 0x5f,0x35,0x39,0x39,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x5f,0x32,0x30,0x37,0x2e, - 0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x20,0x2a,0x20, - 0x28,0x6d,0x69,0x6e,0x28,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74, - 0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x5f,0x32,0x30,0x37,0x2e, - 0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x2c,0x20,0x5f,0x35, - 0x30,0x37,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30, - 0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33, - 0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x20, - 0x2a,0x20,0x5f,0x32,0x30,0x37,0x2e,0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73, - 0x69,0x74,0x79,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30, - 0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37, - 0x36,0x35,0x36,0x32,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x20,0x2a,0x20, - 0x6d,0x69,0x78,0x28,0x5f,0x34,0x37,0x36,0x2c,0x20,0x74,0x65,0x78,0x65,0x6c,0x46, - 0x65,0x74,0x63,0x68,0x28,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73, - 0x6d,0x70,0x2c,0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c, - 0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x20,0x2b,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x74,0x28,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f, - 0x35,0x31,0x32,0x2e,0x78,0x2c,0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32, - 0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32, - 0x32,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e, - 0x78,0x29,0x29,0x29,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74, - 0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79, - 0x20,0x2b,0x20,0x69,0x6e,0x74,0x28,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f,0x35,0x31, - 0x32,0x2e,0x79,0x2c,0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39,0x39, - 0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38,0x35, - 0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39, - 0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38, - 0x35,0x31,0x35,0x36,0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28, - 0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79,0x29, - 0x29,0x29,0x20,0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72, - 0x64,0x2e,0x79,0x29,0x29,0x2c,0x20,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x5f,0x35,0x39,0x39,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x30,0x20, - 0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x64,0x78,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x36,0x32,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x30,0x37,0x38,0x31,0x32,0x35, - 0x20,0x2a,0x20,0x5f,0x36,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x34,0x20, - 0x3d,0x20,0x72,0x61,0x6e,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x37,0x20,0x3d, - 0x20,0x6d,0x61,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x32,0x34,0x20,0x2d, - 0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x63, - 0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72,0x29, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72, - 0x61,0x6e,0x64,0x20,0x3d,0x20,0x5f,0x36,0x32,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x33, - 0x36,0x20,0x3d,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33, - 0x36,0x2e,0x78,0x20,0x3d,0x20,0x5f,0x37,0x33,0x36,0x2e,0x78,0x20,0x2b,0x20,0x28, - 0x28,0x73,0x69,0x6e,0x28,0x5f,0x32,0x30,0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a, - 0x20,0x31,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x37,0x36,0x38,0x33,0x37, - 0x31,0x35,0x38,0x32,0x30,0x33,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x30,0x2e,0x32, - 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33, - 0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x5f,0x36,0x32, - 0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x20,0x3d,0x20,0x5f,0x37, - 0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x36,0x34,0x37,0x20,0x3d,0x20,0x69,0x64,0x78,0x20, - 0x3e,0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x34,0x37,0x20,0x26,0x26,0x20,0x28,0x5f,0x36, - 0x32,0x37,0x20,0x3c,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32, - 0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32, - 0x35,0x29,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x36,0x36,0x36,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, - 0x5f,0x36,0x34,0x37,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x5f,0x36,0x36,0x36,0x20,0x3d,0x20,0x28,0x28,0x72,0x61,0x6e, - 0x64,0x20,0x2d,0x20,0x5f,0x36,0x32,0x31,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29, - 0x20,0x3c,0x20,0x6c,0x65,0x6e,0x67,0x74,0x68,0x28,0x5f,0x37,0x33,0x36,0x20,0x2d, - 0x20,0x5f,0x37,0x35,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x5f,0x36,0x36,0x36,0x20,0x3d,0x20,0x5f,0x36,0x34,0x37, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28, - 0x5f,0x36,0x36,0x36,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x64, - 0x78,0x20,0x3d,0x3d,0x20,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72, - 0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x76, - 0x65,0x63,0x34,0x28,0x5f,0x33,0x39,0x37,0x20,0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20, - 0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33, - 0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x20,0x2b,0x20,0x28, - 0x5f,0x33,0x39,0x30,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, - 0x31,0x32,0x35,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35, - 0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x5f,0x34,0x37,0x36,0x2c, - 0x20,0x76,0x65,0x63,0x34,0x28,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74, - 0x69,0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x31, - 0x31,0x20,0x3d,0x20,0x28,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e,0x30,0x31, - 0x35,0x36,0x32,0x35,0x29,0x20,0x2b,0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75, + 0x72,0x6e,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30, 0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30, - 0x36,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, - 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x6d,0x69,0x78,0x28,0x76,0x65, - 0x63,0x34,0x28,0x5f,0x33,0x39,0x37,0x20,0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20,0x6d, - 0x69,0x6e,0x28,0x31,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x32,0x31,0x20,0x2b,0x20,0x30, - 0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32, - 0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x20,0x2b,0x20,0x28, - 0x5f,0x33,0x39,0x30,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, - 0x31,0x32,0x35,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35, - 0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x5f,0x36,0x32,0x31,0x2c,0x20,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e,0x30, - 0x30,0x32,0x33,0x34,0x33,0x37,0x35,0x30,0x30,0x39,0x33,0x31,0x33,0x32,0x32,0x35, - 0x37,0x34,0x36,0x31,0x35,0x34,0x37,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20, - 0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69, - 0x29,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x37,0x31,0x31,0x2c,0x20,0x5f, - 0x37,0x31,0x31,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20, - 0x76,0x65,0x63,0x34,0x28,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69, - 0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, + 0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31, + 0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c, + 0x20,0x30,0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, + 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x6d, + 0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32, + 0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x31, + 0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x31,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, + 0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x69,0x6e,0x74,0x20,0x73,0x69,0x67, + 0x6e,0x32,0x28,0x66,0x6c,0x6f,0x61,0x74,0x20,0x78,0x29,0x0a,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x66,0x20,0x28,0x78,0x20,0x3c,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20, + 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6e,0x20,0x2d,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x31,0x3b,0x0a,0x7d,0x0a,0x0a,0x76, + 0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x32,0x30,0x20,0x3d,0x20,0x72,0x6f,0x75, + 0x6e,0x64,0x28,0x70,0x6f,0x73,0x20,0x2a,0x20,0x31,0x36,0x2e,0x30,0x29,0x20,0x2a, + 0x20,0x76,0x65,0x63,0x34,0x28,0x30,0x2e,0x30,0x36,0x32,0x35,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x32,0x33,0x35,0x20,0x3d,0x20,0x5f, + 0x32,0x32,0x30,0x2e,0x78,0x7a,0x20,0x2d,0x20,0x76,0x65,0x63,0x32,0x28,0x66,0x6c, + 0x6f,0x6f,0x72,0x28,0x5f,0x32,0x32,0x30,0x2e,0x78,0x29,0x20,0x2b,0x20,0x30,0x2e, + 0x35,0x2c,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x5f,0x32,0x32,0x30,0x2e,0x7a,0x29, + 0x20,0x2b,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x5f,0x32,0x33,0x39,0x20,0x3d,0x20,0x5f,0x32,0x33,0x35,0x2e,0x78, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x34,0x35, + 0x20,0x3d,0x20,0x5f,0x32,0x33,0x35,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76, + 0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x30, + 0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x32,0x33,0x39,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d, + 0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x36,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f, + 0x32,0x34,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20, + 0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x29, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x31,0x31,0x20,0x3d,0x20,0x5f,0x32,0x33,0x39,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x32, + 0x20,0x3d,0x20,0x5f,0x32,0x34,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63, + 0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x33,0x20,0x3d,0x20,0x5f,0x32,0x32, + 0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x31,0x34,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69, + 0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x31,0x29,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x31,0x35,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32, + 0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x32,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x39,0x37,0x20,0x3d,0x20,0x76,0x65,0x63, + 0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x32, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33, + 0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20, + 0x61,0x62,0x73,0x28,0x5f,0x32,0x33,0x39,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x33,0x30,0x34, + 0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e, + 0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38, + 0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x31,0x30,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64, + 0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x33, + 0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x34,0x2c,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x35,0x29,0x2c,0x20,0x5f,0x32,0x39,0x37,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x33,0x31,0x33,0x2e,0x70,0x6c,0x61,0x6e,0x65, + 0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28,0x6d, + 0x69,0x78,0x28,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61, + 0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29,0x2c,0x20,0x67, + 0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65, + 0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x35,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x2c,0x20,0x5f,0x32,0x39, + 0x37,0x29,0x2c,0x20,0x5f,0x33,0x30,0x34,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x73, + 0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x32,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36, + 0x39,0x35,0x33,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x61,0x62,0x73, + 0x28,0x5f,0x32,0x34,0x35,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29,0x2c, + 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20, + 0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d, + 0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x33,0x30,0x34,0x2c,0x20,0x31,0x2e,0x30,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #version 300 es @@ -822,10 +456,9 @@ fs_plane_source_glsl430 := u8.[ void main() { - vec3 _16 = position.xyz * 1000.0; - float _35 = _16.x; - gl_Position = mat4(plane_vs_params[0], plane_vs_params[1], plane_vs_params[2], plane_vs_params[3]) * vec4(_35, float(gl_InstanceID) * 0.006000000052154064178466796875, _16.z, 1.0); - pos = vec4(_35, _16.yz, 1.0); + vec4 _37 = vec4(position.xyz * 1000.0, 1.0); + gl_Position = mat4(plane_vs_params[0], plane_vs_params[1], plane_vs_params[2], plane_vs_params[3]) * _37; + pos = _37; idx = gl_InstanceID; } @@ -839,32 +472,27 @@ vs_plane_source_glsl300es := u8.[ 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x6f,0x75,0x74,0x20,0x76,0x65,0x63, 0x34,0x20,0x70,0x6f,0x73,0x3b,0x0a,0x66,0x6c,0x61,0x74,0x20,0x6f,0x75,0x74,0x20, 0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x3b,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d, - 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x33, - 0x20,0x5f,0x31,0x36,0x20,0x3d,0x20,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e, - 0x78,0x79,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x35,0x20,0x3d,0x20,0x5f,0x31, - 0x36,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69, - 0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28,0x70,0x6c,0x61,0x6e, - 0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x30,0x5d,0x2c,0x20, + 0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x76,0x65,0x63,0x34, + 0x20,0x5f,0x33,0x37,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x70,0x6f,0x73,0x69, + 0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x30,0x2e, + 0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x67,0x6c,0x5f, + 0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x6d,0x61,0x74,0x34,0x28, 0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b, - 0x31,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72, - 0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73, - 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20,0x2a,0x20,0x76,0x65, - 0x63,0x34,0x28,0x5f,0x33,0x35,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x67,0x6c, - 0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x44,0x29,0x20,0x2a,0x20,0x30, - 0x2e,0x30,0x30,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x32,0x31,0x35,0x34, - 0x30,0x36,0x34,0x31,0x37,0x38,0x34,0x36,0x36,0x37,0x39,0x36,0x38,0x37,0x35,0x2c, - 0x20,0x5f,0x31,0x36,0x2e,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x70,0x6f,0x73,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x33,0x35, - 0x2c,0x20,0x5f,0x31,0x36,0x2e,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x69,0x64,0x78,0x20,0x3d,0x20,0x67,0x6c,0x5f,0x49,0x6e,0x73, - 0x74,0x61,0x6e,0x63,0x65,0x49,0x44,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x30,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72, + 0x61,0x6d,0x73,0x5b,0x31,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x76,0x73, + 0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x32,0x5d,0x2c,0x20,0x70,0x6c,0x61,0x6e, + 0x65,0x5f,0x76,0x73,0x5f,0x70,0x61,0x72,0x61,0x6d,0x73,0x5b,0x33,0x5d,0x29,0x20, + 0x2a,0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x70,0x6f,0x73,0x20,0x3d, + 0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x64,0x78,0x20,0x3d,0x20, + 0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x44,0x3b,0x0a,0x7d, + 0x0a,0x0a,0x00, ]; /* #version 300 es precision mediump float; precision highp int; + uniform ivec4 plane_data[1]; struct plane_world_config { highp vec3 skyBase; @@ -884,190 +512,94 @@ vs_plane_source_glsl300es := u8.[ highp float grassDensity; }; - uniform plane_world_config _207; + uniform plane_world_config _313; - uniform ivec4 plane_data[1]; uniform highp sampler2D reftex_refsmp; + uniform highp sampler2D groundtex_groundsmp; - layout(location = 0) out highp vec4 frag_color; in highp vec4 pos; + layout(location = 0) out highp vec4 frag_color; flat in int idx; - highp float random(highp vec2 st) - { - return fract(sin(dot(st, vec2(12.98980045318603515625, 78.233001708984375))) * 43758.546875); - } - - highp float _noise(highp vec2 st) - { - highp vec2 _110 = floor(st); - highp vec2 _113 = fract(st); - highp vec2 param = _110; - highp float _118 = random(param); - highp vec2 param_1 = _110 + vec2(1.0, 0.0); - highp float _125 = random(param_1); - highp vec2 param_2 = _110 + vec2(0.0, 1.0); - highp vec2 param_3 = _110 + vec2(1.0); - highp vec2 _148 = (_113 * _113) * (vec2(3.0) - (_113 * 2.0)); - highp float _152 = _148.x; - highp float _158 = _148.y; - return (mix(_118, _125, _152) + (((random(param_2) - _118) * _158) * (1.0 - _152))) + (((random(param_3) - _125) * _152) * _158); - } - uint murmurHash12(inout uvec2 src) { src *= uvec2(1540483477u); src ^= (src >> uvec2(24u)); src *= uvec2(1540483477u); - uint _66 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; - uint _73 = (_66 ^ (_66 >> 13u)) * 1540483477u; - return _73 ^ (_73 >> 15u); + uint _64 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; + uint _71 = (_64 ^ (_64 >> 13u)) * 1540483477u; + return _71 ^ (_71 >> 15u); } highp float hash12(highp vec2 src) { uvec2 param = floatBitsToUint(src); - uint _86 = murmurHash12(param); - return uintBitsToFloat((_86 & 8388607u) | 1065353216u) - 1.0; + uint _84 = murmurHash12(param); + return uintBitsToFloat((_84 & 8388607u) | 1065353216u) - 1.0; } - highp vec3 wave(highp vec4 wave_1, highp vec3 p, inout highp vec3 tangent, inout highp vec3 binormal) + highp vec3 get_ground_sample(highp vec4 pos_1, highp float dirX, highp float dirY) { - highp float _188 = 6.282000064849853515625 / wave_1.w; - highp vec2 _196 = normalize(vec2(wave_1.x, wave_1.y)); - highp float _216 = _188 * (dot(_196, p.xz) - (_207.time * 0.20000000298023223876953125)); - highp float _220 = wave_1.z / _188; - highp float _222 = _196.x; - highp float _223 = -_222; - highp float _229 = sin(_216); - highp float _230 = wave_1.z * _229; - highp float _236 = cos(_216); - highp float _237 = wave_1.z * _236; - highp float _243 = _196.y; - highp float _249 = (_223 * _243) * _230; - tangent += vec3((_223 * _222) * _230, _222 * _237, _249); - binormal += vec3(_249, _243 * _237, ((-_243) * _243) * _230); - highp float _290 = _220 * _236; - return vec3(_222 * _290, _220 * _229, _243 * _290); + highp vec4 _166 = texelFetch(groundtex_groundsmp, ivec2(int(floor(pos_1.x + dirX) + 500.0), int(floor(pos_1.z + dirY) + 500.0)), 0); + highp vec2 param = pos_1.xz; + highp vec2 param_1 = pos_1.xz; + if (_166.z == 1.0) + { + return texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x), int(float(plane_data[0].y) - gl_FragCoord.y)), 0).xyz * vec3(0.0, 0.800000011920928955078125, 0.800000011920928955078125); + } + else + { + if (_166.x == 1.0) + { + return vec3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param)); + } + else + { + return vec3(0.4000000059604644775390625, 0.800000011920928955078125, 0.300000011920928955078125) * mix(0.800000011920928955078125, 1.0, hash12(param_1)); + } + } + } + + int sign2(highp float x) + { + if (x < 0.0) + { + return -1; + } + return 1; } void main() { - if (_207.planeType == 1) + highp vec4 _220 = round(pos * 16.0) * vec4(0.0625); + highp vec2 _235 = _220.xz - vec2(floor(_220.x) + 0.5, floor(_220.z) + 0.5); + highp float _239 = _235.x; + highp float _245 = _235.y; + highp vec4 param = _220; + highp float param_1 = 0.0; + highp float param_2 = 0.0; + highp float param_3 = _239; + highp vec4 param_4 = _220; + highp float param_5 = float(sign2(param_3)); + highp float param_6 = 0.0; + highp float param_7 = _245; + highp vec4 param_8 = _220; + highp float param_9 = 0.0; + highp float param_10 = float(sign2(param_7)); + highp float param_11 = _239; + highp float param_12 = _245; + highp vec4 param_13 = _220; + highp float param_14 = float(sign2(param_11)); + highp float param_15 = float(sign2(param_12)); + highp vec3 _297 = vec3(smoothstep(0.20000000298023223876953125, 0.5, abs(_239)) * 0.5); + highp vec3 _304 = mix(get_ground_sample(param_8, param_9, param_10), get_ground_sample(param_13, param_14, param_15), _297); + if (_313.planeType == 1) { - frag_color = texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x), int(float(plane_data[0].y) - gl_FragCoord.y)), 0) * vec4(0.89999997615814208984375, 0.89999997615814208984375, 1.0, 1.0); + frag_color = vec4(mix(mix(get_ground_sample(param, param_1, param_2), get_ground_sample(param_4, param_5, param_6), _297), _304, vec3(smoothstep(0.20000000298023223876953125, 0.5, abs(_245)) * 0.5)), 1.0); } else { - highp vec2 _363 = pos.xz * _207.grassDensity; - highp float _365 = _363.y; - highp float _371 = _363.x + (sin(_365) * 0.5); - highp vec2 _756 = vec2(_371, _365 + (sin(_371) * 0.5)); - highp vec2 ruohokeskus = round(_756); - highp vec2 param = _756 * vec2(0.0199999995529651641845703125); - highp float _390 = _noise(param); - highp vec2 _395 = _756 * vec2(0.00200000009499490261077880859375); - highp vec2 param_1 = _395; - highp float _397 = _noise(param_1); - highp vec2 param_2 = _395; - highp float _403 = _noise(param_2); - highp float noiseval_plantti = _403; - if (_403 < 0.89999997615814208984375) - { - noiseval_plantti = 0.0; - } - else - { - noiseval_plantti = (noiseval_plantti - 0.89999997615814208984375) * 10.0; - } - highp vec2 param_3 = _756.yx * vec2(0.001428571413271129131317138671875); - highp float _420 = _noise(param_3); - int is_water = 0; - highp float is_water_coast = 1.0; - highp float coast_multiplier = 0.0; - if (_420 > 0.89999997615814208984375) - { - is_water = 1; - if (_420 < 0.930000007152557373046875) - { - is_water_coast = (_420 - 0.89999997615814208984375) * 33.33300018310546875; - } - } - if (_420 > 0.800000011920928955078125) - { - coast_multiplier = (_420 - 0.800000011920928955078125) * 10.0; - } - highp vec2 param_4 = ruohokeskus; - highp float rand = (hash12(param_4) - 0.4000000059604644775390625) + (0.4000000059604644775390625 * _397); - highp vec2 param_5 = round(_363 * 10.0); - highp vec4 _476 = vec4(vec3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param_5)), 1.0); - if (is_water == 1) - { - highp vec4 param_6 = vec4(1.0, 0.5, 0.100000001490116119384765625, 0.89999997615814208984375); - highp vec3 param_7 = pos.xyz; - highp vec3 param_8 = vec3(1.0, 0.0, 0.0); - highp vec3 param_9 = vec3(0.0, 0.0, 1.0); - highp vec3 _496 = wave(param_6, param_7, param_8, param_9); - highp vec3 _507 = normalize(cross(normalize(param_9), normalize(param_8))); - highp vec2 _512 = _507.xz * 0.004999999888241291046142578125; - bool _551 = idx > 0; - bool _559; - if (!_551) - { - _559 = plane_data[0].z == 1; - } - else - { - _559 = _551; - } - if (_559) - { - discard; - } - highp float _599 = smoothstep(0.0, 0.89999997615814208984375, is_water_coast); - frag_color = vec4(min(vec3(1.0), vec3(mix(1.0, 0.800000011920928955078125, _599)) + ((_207.sunLightColor * (min(max(max(dot(normalize(_207.sunPosition), _507), 0.0), 0.100000001490116119384765625), 1.0) * _207.sunIntensity)) * 0.100000001490116119384765625)), 1.0) * mix(_476, texelFetch(reftex_refsmp, ivec2(int(gl_FragCoord.x + float(int(clamp(_512.x, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(plane_data[0].x)))), int(float(plane_data[0].y + int(clamp(_512.y, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(plane_data[0].y))) - gl_FragCoord.y)), 0), vec4(_599)); - } - else - { - highp float _620 = float(idx); - highp float _621 = 0.0078125 * _620; - highp float _624 = rand; - highp float _627 = max(0.0, _624 - mix(0.0, 1.0, coast_multiplier)); - rand = _627; - highp vec2 _736 = ruohokeskus; - _736.x = _736.x + ((sin(_207.time * 1.2000000476837158203125) * 0.20000000298023223876953125) * _621); - ruohokeskus = _736; - bool _647 = idx > 0; - if (_647 && (_627 < 0.20000000298023223876953125)) - { - discard; - } - bool _666; - if (_647) - { - _666 = ((rand - _621) * 0.5) < length(_736 - _756); - } - else - { - _666 = _647; - } - if (_666) - { - discard; - } - else - { - if (idx == 0) - { - frag_color = mix(vec4(_397 * 0.5, 0.20000000298023223876953125 + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), _476, vec4(coast_multiplier)); - } - else - { - highp float _711 = (_620 * 0.015625) + 0.4000000059604644775390625; - frag_color = mix(mix(vec4(_397 * 0.5, min(1.0, _621 + 0.20000000298023223876953125) + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), vec4(_621, _620 * 0.0023437500931322574615478515625, 0.0, 1.0), vec4(noiseval_plantti)), vec4(_711, _711, 0.0, 1.0), vec4(coast_multiplier)); - } - } - } + frag_color = vec4(_304, 1.0); } } @@ -1076,511 +608,223 @@ fs_plane_source_glsl300es := u8.[ 0x23,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x33,0x30,0x30,0x20,0x65,0x73,0x0a, 0x70,0x72,0x65,0x63,0x69,0x73,0x69,0x6f,0x6e,0x20,0x6d,0x65,0x64,0x69,0x75,0x6d, 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x3b,0x0a,0x70,0x72,0x65,0x63,0x69,0x73,0x69, - 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x73, - 0x74,0x72,0x75,0x63,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c, - 0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73, - 0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33, - 0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e, - 0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, - 0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c, - 0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, - 0x63,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x6b, - 0x79,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x74,0x69,0x6d,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x72,0x61,0x73,0x73,0x44,0x65,0x6e,0x73, - 0x69,0x74,0x79,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d, - 0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e, - 0x66,0x69,0x67,0x20,0x5f,0x32,0x30,0x37,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f, - 0x72,0x6d,0x20,0x69,0x76,0x65,0x63,0x34,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64, - 0x61,0x74,0x61,0x5b,0x31,0x5d,0x3b,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20, + 0x6f,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x69,0x6e,0x74,0x3b,0x0a,0x0a,0x75, + 0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x69,0x76,0x65,0x63,0x34,0x20,0x70,0x6c,0x61, + 0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x31,0x5d,0x3b,0x0a,0x73,0x74,0x72,0x75, + 0x63,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63, + 0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73, + 0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x68,0x6f, + 0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x73,0x75,0x6e,0x48,0x61,0x6c, + 0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, + 0x33,0x20,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20, + 0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x75,0x6e, + 0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x6b,0x79,0x49,0x6e, + 0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74, + 0x20,0x68,0x61,0x73,0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x6c, + 0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69, + 0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69, + 0x6d,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x67,0x72,0x61,0x73,0x73,0x44,0x65,0x6e,0x73,0x69,0x74,0x79, + 0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x70,0x6c, + 0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67, + 0x20,0x5f,0x33,0x31,0x33,0x3b,0x0a,0x0a,0x75,0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20, 0x68,0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x32,0x44,0x20, - 0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d,0x70,0x3b,0x0a,0x0a, + 0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d,0x70,0x3b,0x0a,0x75, + 0x6e,0x69,0x66,0x6f,0x72,0x6d,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x73,0x61,0x6d, + 0x70,0x6c,0x65,0x72,0x32,0x44,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78, + 0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x3b,0x0a,0x0a,0x69,0x6e,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x3b,0x0a, 0x6c,0x61,0x79,0x6f,0x75,0x74,0x28,0x6c,0x6f,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20, 0x3d,0x20,0x30,0x29,0x20,0x6f,0x75,0x74,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76, 0x65,0x63,0x34,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x3b,0x0a, - 0x69,0x6e,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f, - 0x73,0x3b,0x0a,0x66,0x6c,0x61,0x74,0x20,0x69,0x6e,0x20,0x69,0x6e,0x74,0x20,0x69, - 0x64,0x78,0x3b,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, - 0x63,0x32,0x20,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74, - 0x75,0x72,0x6e,0x20,0x66,0x72,0x61,0x63,0x74,0x28,0x73,0x69,0x6e,0x28,0x64,0x6f, - 0x74,0x28,0x73,0x74,0x2c,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x32,0x2e,0x39,0x38, - 0x39,0x38,0x30,0x30,0x34,0x35,0x33,0x31,0x38,0x36,0x30,0x33,0x35,0x31,0x35,0x36, - 0x32,0x35,0x2c,0x20,0x37,0x38,0x2e,0x32,0x33,0x33,0x30,0x30,0x31,0x37,0x30,0x38, - 0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x29,0x29,0x20,0x2a,0x20,0x34,0x33,0x37,0x35, - 0x38,0x2e,0x35,0x34,0x36,0x38,0x37,0x35,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69, - 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65, - 0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x73,0x74,0x29,0x0a, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32, - 0x20,0x5f,0x31,0x31,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x73,0x74, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x32,0x20,0x5f,0x31,0x31,0x33,0x20,0x3d,0x20,0x66,0x72,0x61,0x63,0x74,0x28,0x73, - 0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65, - 0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x5f,0x31,0x31,0x38,0x20,0x3d,0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70, - 0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, - 0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20, - 0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x76,0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x2c, - 0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x32,0x35,0x20,0x3d,0x20,0x72,0x61, - 0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x76, - 0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x76, - 0x65,0x63,0x32,0x28,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x31,0x34,0x38,0x20,0x3d,0x20, - 0x28,0x5f,0x31,0x31,0x33,0x20,0x2a,0x20,0x5f,0x31,0x31,0x33,0x29,0x20,0x2a,0x20, - 0x28,0x76,0x65,0x63,0x32,0x28,0x33,0x2e,0x30,0x29,0x20,0x2d,0x20,0x28,0x5f,0x31, - 0x31,0x33,0x20,0x2a,0x20,0x32,0x2e,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x35,0x32, - 0x20,0x3d,0x20,0x5f,0x31,0x34,0x38,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x35,0x38,0x20, - 0x3d,0x20,0x5f,0x31,0x34,0x38,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6e,0x20,0x28,0x6d,0x69,0x78,0x28,0x5f,0x31,0x31,0x38,0x2c,0x20, - 0x5f,0x31,0x32,0x35,0x2c,0x20,0x5f,0x31,0x35,0x32,0x29,0x20,0x2b,0x20,0x28,0x28, - 0x28,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29, - 0x20,0x2d,0x20,0x5f,0x31,0x31,0x38,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x38,0x29, - 0x20,0x2a,0x20,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x31,0x35,0x32,0x29,0x29, - 0x29,0x20,0x2b,0x20,0x28,0x28,0x28,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x33,0x29,0x20,0x2d,0x20,0x5f,0x31,0x32,0x35,0x29,0x20,0x2a, - 0x20,0x5f,0x31,0x35,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x38,0x29,0x3b,0x0a, - 0x7d,0x0a,0x0a,0x75,0x69,0x6e,0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61, - 0x73,0x68,0x31,0x32,0x28,0x69,0x6e,0x6f,0x75,0x74,0x20,0x75,0x76,0x65,0x63,0x32, - 0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20, - 0x2a,0x3d,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33, - 0x34,0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x5e, - 0x3d,0x20,0x28,0x73,0x72,0x63,0x20,0x3e,0x3e,0x20,0x75,0x76,0x65,0x63,0x32,0x28, - 0x32,0x34,0x75,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a, + 0x66,0x6c,0x61,0x74,0x20,0x69,0x6e,0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x3b, + 0x0a,0x0a,0x75,0x69,0x6e,0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73, + 0x68,0x31,0x32,0x28,0x69,0x6e,0x6f,0x75,0x74,0x20,0x75,0x76,0x65,0x63,0x32,0x20, + 0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a, 0x3d,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34, - 0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f, - 0x36,0x36,0x20,0x3d,0x20,0x28,0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36,0x37,0x33, - 0x39,0x75,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20,0x31,0x35, - 0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73,0x72,0x63, - 0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x37,0x33, - 0x20,0x3d,0x20,0x28,0x5f,0x36,0x36,0x20,0x5e,0x20,0x28,0x5f,0x36,0x36,0x20,0x3e, - 0x3e,0x20,0x31,0x33,0x75,0x29,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38, - 0x33,0x34,0x37,0x37,0x75,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6e,0x20,0x5f,0x37,0x33,0x20,0x5e,0x20,0x28,0x5f,0x37,0x33,0x20,0x3e,0x3e,0x20, - 0x31,0x35,0x75,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x68,0x69,0x67,0x68, - 0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x75,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x55,0x69,0x6e,0x74,0x28, - 0x73,0x72,0x63,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f, - 0x38,0x36,0x20,0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31, - 0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6e,0x20,0x75,0x69,0x6e,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x46, - 0x6c,0x6f,0x61,0x74,0x28,0x28,0x5f,0x38,0x36,0x20,0x26,0x20,0x38,0x33,0x38,0x38, - 0x36,0x30,0x37,0x75,0x29,0x20,0x7c,0x20,0x31,0x30,0x36,0x35,0x33,0x35,0x33,0x32, - 0x31,0x36,0x75,0x29,0x20,0x2d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x77,0x61,0x76,0x65,0x28,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x77,0x61,0x76,0x65,0x5f,0x31, - 0x2c,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x2c,0x20, - 0x69,0x6e,0x6f,0x75,0x74,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33, - 0x20,0x74,0x61,0x6e,0x67,0x65,0x6e,0x74,0x2c,0x20,0x69,0x6e,0x6f,0x75,0x74,0x20, - 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x62,0x69,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x38,0x38,0x20,0x3d,0x20,0x36,0x2e, - 0x32,0x38,0x32,0x30,0x30,0x30,0x30,0x36,0x34,0x38,0x34,0x39,0x38,0x35,0x33,0x35, - 0x31,0x35,0x36,0x32,0x35,0x20,0x2f,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x77, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32, - 0x20,0x5f,0x31,0x39,0x36,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a, - 0x65,0x28,0x76,0x65,0x63,0x32,0x28,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x78,0x2c, - 0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x79,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x31, - 0x36,0x20,0x3d,0x20,0x5f,0x31,0x38,0x38,0x20,0x2a,0x20,0x28,0x64,0x6f,0x74,0x28, - 0x5f,0x31,0x39,0x36,0x2c,0x20,0x70,0x2e,0x78,0x7a,0x29,0x20,0x2d,0x20,0x28,0x5f, - 0x32,0x30,0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30, - 0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37, - 0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x30,0x20, - 0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x7a,0x20,0x2f,0x20,0x5f,0x31,0x38, - 0x38,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x32,0x32,0x32,0x20,0x3d,0x20,0x5f,0x31,0x39,0x36,0x2e,0x78, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x32,0x32,0x33,0x20,0x3d,0x20,0x2d,0x5f,0x32,0x32,0x32,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x32,0x32,0x39,0x20,0x3d,0x20,0x73,0x69,0x6e,0x28,0x5f,0x32,0x31,0x36,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x32,0x33,0x30,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e, - 0x7a,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x36,0x20,0x3d, - 0x20,0x63,0x6f,0x73,0x28,0x5f,0x32,0x31,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x37, - 0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x7a,0x20,0x2a,0x20,0x5f,0x32, - 0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x32,0x34,0x33,0x20,0x3d,0x20,0x5f,0x31,0x39,0x36,0x2e, - 0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x32,0x34,0x39,0x20,0x3d,0x20,0x28,0x5f,0x32,0x32,0x33,0x20, - 0x2a,0x20,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x74,0x61,0x6e,0x67,0x65,0x6e,0x74,0x20,0x2b,0x3d,0x20,0x76, - 0x65,0x63,0x33,0x28,0x28,0x5f,0x32,0x32,0x33,0x20,0x2a,0x20,0x5f,0x32,0x32,0x32, - 0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x2c,0x20,0x5f,0x32,0x32,0x32,0x20,0x2a, - 0x20,0x5f,0x32,0x33,0x37,0x2c,0x20,0x5f,0x32,0x34,0x39,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x62,0x69,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x2b,0x3d,0x20,0x76,0x65, - 0x63,0x33,0x28,0x5f,0x32,0x34,0x39,0x2c,0x20,0x5f,0x32,0x34,0x33,0x20,0x2a,0x20, - 0x5f,0x32,0x33,0x37,0x2c,0x20,0x28,0x28,0x2d,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a, - 0x20,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x32,0x39,0x30,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x20,0x2a,0x20,0x5f,0x32, - 0x33,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76, - 0x65,0x63,0x33,0x28,0x5f,0x32,0x32,0x32,0x20,0x2a,0x20,0x5f,0x32,0x39,0x30,0x2c, - 0x20,0x5f,0x32,0x32,0x30,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x2c,0x20,0x5f,0x32, - 0x34,0x33,0x20,0x2a,0x20,0x5f,0x32,0x39,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x76, - 0x6f,0x69,0x64,0x20,0x6d,0x61,0x69,0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x69,0x66,0x20,0x28,0x5f,0x32,0x30,0x37,0x2e,0x70,0x6c,0x61,0x6e,0x65,0x54, - 0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, - 0x6f,0x72,0x20,0x3d,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65,0x74,0x63,0x68,0x28, - 0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c,0x20,0x69, - 0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67, - 0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c, - 0x6f,0x61,0x74,0x28,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30, - 0x5d,0x2e,0x79,0x29,0x20,0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f, - 0x6f,0x72,0x64,0x2e,0x79,0x29,0x29,0x2c,0x20,0x30,0x29,0x20,0x2a,0x20,0x76,0x65, - 0x63,0x34,0x28,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35, - 0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x30,0x2e, - 0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30, - 0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e, + 0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x5e,0x3d, + 0x20,0x28,0x73,0x72,0x63,0x20,0x3e,0x3e,0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x32, + 0x34,0x75,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a,0x3d, + 0x20,0x75,0x76,0x65,0x63,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37, + 0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x36, + 0x34,0x20,0x3d,0x20,0x28,0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36,0x37,0x33,0x39, + 0x75,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20,0x31,0x35,0x34, + 0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e, + 0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x37,0x31,0x20, + 0x3d,0x20,0x28,0x5f,0x36,0x34,0x20,0x5e,0x20,0x28,0x5f,0x36,0x34,0x20,0x3e,0x3e, + 0x20,0x31,0x33,0x75,0x29,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38,0x33, + 0x34,0x37,0x37,0x75,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e, + 0x20,0x5f,0x37,0x31,0x20,0x5e,0x20,0x28,0x5f,0x37,0x31,0x20,0x3e,0x3e,0x20,0x31, + 0x35,0x75,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x32,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x75,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x55,0x69,0x6e,0x74,0x28,0x73, + 0x72,0x63,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x38, + 0x34,0x20,0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31,0x32, + 0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74, + 0x75,0x72,0x6e,0x20,0x75,0x69,0x6e,0x74,0x42,0x69,0x74,0x73,0x54,0x6f,0x46,0x6c, + 0x6f,0x61,0x74,0x28,0x28,0x5f,0x38,0x34,0x20,0x26,0x20,0x38,0x33,0x38,0x38,0x36, + 0x30,0x37,0x75,0x29,0x20,0x7c,0x20,0x31,0x30,0x36,0x35,0x33,0x35,0x33,0x32,0x31, + 0x36,0x75,0x29,0x20,0x2d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x68,0x69, + 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f, + 0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x6f,0x73,0x5f,0x31,0x2c,0x20,0x68,0x69,0x67, + 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x72,0x58,0x2c,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x64,0x69,0x72,0x59,0x29, + 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, + 0x34,0x20,0x5f,0x31,0x36,0x36,0x20,0x3d,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65, + 0x74,0x63,0x68,0x28,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x5f,0x67,0x72, + 0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x2c,0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69, + 0x6e,0x74,0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78, + 0x20,0x2b,0x20,0x64,0x69,0x72,0x58,0x29,0x20,0x2b,0x20,0x35,0x30,0x30,0x2e,0x30, + 0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x70,0x6f,0x73, + 0x5f,0x31,0x2e,0x7a,0x20,0x2b,0x20,0x64,0x69,0x72,0x59,0x29,0x20,0x2b,0x20,0x35, + 0x30,0x30,0x2e,0x30,0x29,0x29,0x2c,0x20,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78,0x7a,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x20,0x3d,0x20,0x70,0x6f,0x73,0x5f,0x31,0x2e,0x78,0x7a,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x36,0x36,0x2e,0x7a,0x20,0x3d, + 0x3d,0x20,0x31,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x74,0x65,0x78,0x65, + 0x6c,0x46,0x65,0x74,0x63,0x68,0x28,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65, + 0x66,0x73,0x6d,0x70,0x2c,0x20,0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28, + 0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x29,0x2c, + 0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c,0x61,0x6e,0x65, + 0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79,0x29,0x20,0x2d,0x20,0x67,0x6c, + 0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79,0x29,0x29,0x2c,0x20, + 0x30,0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e, + 0x30,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32, + 0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30, + 0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38, + 0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x36, + 0x36,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e, + 0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39, + 0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39, + 0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32, + 0x31,0x38,0x37,0x35,0x2c,0x20,0x30,0x2e,0x35,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78, + 0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, + 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30, + 0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72, + 0x65,0x74,0x75,0x72,0x6e,0x20,0x76,0x65,0x63,0x33,0x28,0x30,0x2e,0x34,0x30,0x30, + 0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35, + 0x33,0x39,0x30,0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30, + 0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31, + 0x32,0x35,0x2c,0x20,0x30,0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39, + 0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20, + 0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31, + 0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35, + 0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x31,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x69,0x6e,0x74,0x20, + 0x73,0x69,0x67,0x6e,0x32,0x28,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x20,0x78,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78, + 0x20,0x3c,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x2d,0x31,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6e,0x20,0x31,0x3b,0x0a,0x7d,0x0a,0x0a,0x76,0x6f,0x69,0x64,0x20,0x6d,0x61,0x69, + 0x6e,0x28,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x76,0x65,0x63,0x34,0x20,0x5f,0x32,0x32,0x30,0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e, + 0x64,0x28,0x70,0x6f,0x73,0x20,0x2a,0x20,0x31,0x36,0x2e,0x30,0x29,0x20,0x2a,0x20, + 0x76,0x65,0x63,0x34,0x28,0x30,0x2e,0x30,0x36,0x32,0x35,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x32,0x33, + 0x35,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x2e,0x78,0x7a,0x20,0x2d,0x20,0x76,0x65, + 0x63,0x32,0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x5f,0x32,0x32,0x30,0x2e,0x78,0x29, + 0x20,0x2b,0x20,0x30,0x2e,0x35,0x2c,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x5f,0x32, + 0x32,0x30,0x2e,0x7a,0x29,0x20,0x2b,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32, + 0x33,0x39,0x20,0x3d,0x20,0x5f,0x32,0x33,0x35,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x34, + 0x35,0x20,0x3d,0x20,0x5f,0x32,0x33,0x35,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67, + 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20, + 0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d, + 0x20,0x5f,0x32,0x33,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20, + 0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x33,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d, + 0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20, + 0x5f,0x32,0x34,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x5f, + 0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x30, + 0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x30,0x20,0x3d,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x37,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x31,0x20,0x3d, + 0x20,0x5f,0x32,0x33,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x32,0x20, + 0x3d,0x20,0x5f,0x32,0x34,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x33,0x20, + 0x3d,0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, + 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x34, + 0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x31,0x31,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68, + 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d, + 0x5f,0x31,0x35,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e, + 0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x32,0x29,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x32,0x39, + 0x37,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73, + 0x74,0x65,0x70,0x28,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39, + 0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35, + 0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x61,0x62,0x73,0x28,0x5f,0x32,0x33,0x39,0x29, + 0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x68,0x69, + 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x33,0x30,0x34,0x20,0x3d,0x20, + 0x6d,0x69,0x78,0x28,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73, + 0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x39,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x30, + 0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61, + 0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x33,0x2c,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x31,0x34,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x35,0x29,0x2c,0x20,0x5f,0x32,0x39,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69, + 0x66,0x20,0x28,0x5f,0x33,0x31,0x33,0x2e,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70, + 0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72, + 0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x6d,0x69,0x78,0x28,0x6d,0x69,0x78,0x28, + 0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c, + 0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f, + 0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x34,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x2c,0x20, + 0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x29,0x2c,0x20,0x5f,0x32,0x39,0x37,0x29,0x2c, + 0x20,0x5f,0x33,0x30,0x34,0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x73,0x6d,0x6f,0x6f, + 0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, + 0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x61,0x62,0x73,0x28,0x5f,0x32, + 0x34,0x35,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e, 0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c, 0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x33,0x36,0x33, - 0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x7a,0x20,0x2a,0x20,0x5f,0x32,0x30,0x37, - 0x2e,0x67,0x72,0x61,0x73,0x73,0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x33,0x36,0x35,0x20,0x3d,0x20,0x5f,0x33,0x36,0x33,0x2e,0x79, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x37,0x31,0x20,0x3d,0x20,0x5f,0x33,0x36, - 0x33,0x2e,0x78,0x20,0x2b,0x20,0x28,0x73,0x69,0x6e,0x28,0x5f,0x33,0x36,0x35,0x29, - 0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x35,0x36, - 0x20,0x3d,0x20,0x76,0x65,0x63,0x32,0x28,0x5f,0x33,0x37,0x31,0x2c,0x20,0x5f,0x33, - 0x36,0x35,0x20,0x2b,0x20,0x28,0x73,0x69,0x6e,0x28,0x5f,0x33,0x37,0x31,0x29,0x20, - 0x2a,0x20,0x30,0x2e,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x72,0x75,0x6f,0x68, - 0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64,0x28, - 0x5f,0x37,0x35,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20, - 0x3d,0x20,0x5f,0x37,0x35,0x36,0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e, - 0x30,0x31,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x35,0x35,0x32,0x39,0x36,0x35,0x31, - 0x36,0x34,0x31,0x38,0x34,0x35,0x37,0x30,0x33,0x31,0x32,0x35,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x33,0x39,0x30,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65, - 0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x33,0x39,0x35, - 0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x30, - 0x2e,0x30,0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x39,0x34,0x39,0x39,0x34, - 0x39,0x30,0x32,0x36,0x31,0x30,0x37,0x37,0x38,0x38,0x30,0x38,0x35,0x39,0x33,0x37, - 0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d, - 0x20,0x5f,0x33,0x39,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x39,0x37,0x20, - 0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70, - 0x20,0x76,0x65,0x63,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20, - 0x5f,0x33,0x39,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34,0x30,0x33,0x20,0x3d, - 0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70, - 0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x5f,0x34,0x30,0x33,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x30,0x33,0x20, - 0x3c,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38, - 0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e, - 0x74,0x74,0x69,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73, - 0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c, - 0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x28,0x6e,0x6f,0x69,0x73, - 0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x2d,0x20,0x30, - 0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32, - 0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x20,0x2a,0x20,0x31,0x30,0x2e,0x30, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x2e,0x79,0x78, - 0x20,0x2a,0x20,0x76,0x65,0x63,0x32,0x28,0x30,0x2e,0x30,0x30,0x31,0x34,0x32,0x38, - 0x35,0x37,0x31,0x34,0x31,0x33,0x32,0x37,0x31,0x31,0x32,0x39,0x31,0x33,0x31,0x33, - 0x31,0x37,0x31,0x33,0x38,0x36,0x37,0x31,0x38,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x34,0x32,0x30,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65,0x72,0x20,0x3d, - 0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65,0x72, - 0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69, - 0x65,0x72,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x3e,0x20,0x30,0x2e,0x38, - 0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38, - 0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73, - 0x5f,0x77,0x61,0x74,0x65,0x72,0x20,0x3d,0x20,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30, - 0x20,0x3c,0x20,0x30,0x2e,0x39,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x31,0x35, - 0x32,0x35,0x35,0x37,0x33,0x37,0x33,0x30,0x34,0x36,0x38,0x37,0x35,0x29,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73,0x5f, - 0x77,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x28,0x5f, - 0x34,0x32,0x30,0x20,0x2d,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37, - 0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29, - 0x20,0x2a,0x20,0x33,0x33,0x2e,0x33,0x33,0x33,0x30,0x30,0x30,0x31,0x38,0x33,0x31, - 0x30,0x35,0x34,0x36,0x38,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32, - 0x30,0x20,0x3e,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39, - 0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74, - 0x69,0x70,0x6c,0x69,0x65,0x72,0x20,0x3d,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x2d, - 0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, - 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x31, - 0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x72,0x75,0x6f,0x68, - 0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x72,0x61,0x6e, - 0x64,0x20,0x3d,0x20,0x28,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x34,0x29,0x20,0x2d,0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36, - 0x32,0x35,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36, - 0x32,0x35,0x20,0x2a,0x20,0x5f,0x33,0x39,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64,0x28,0x5f, - 0x33,0x36,0x33,0x20,0x2a,0x20,0x31,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20, - 0x5f,0x34,0x37,0x36,0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x76,0x65,0x63,0x33, - 0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, - 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x36, - 0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31,0x30,0x34, - 0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c,0x20,0x30,0x2e,0x35,0x29,0x20,0x2a,0x20, - 0x6d,0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39, - 0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20, - 0x31,0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x73,0x5f,0x77,0x61,0x74,0x65, - 0x72,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69, - 0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36, - 0x20,0x3d,0x20,0x76,0x65,0x63,0x34,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x35, - 0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30, - 0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x2c, - 0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31, - 0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76, - 0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x70,0x6f, - 0x73,0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d,0x20,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30, - 0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76, - 0x65,0x63,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x76,0x65, - 0x63,0x33,0x28,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x33,0x20,0x5f,0x34,0x39,0x36,0x20,0x3d, - 0x20,0x77,0x61,0x76,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x2c,0x20,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c, - 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63, - 0x33,0x20,0x5f,0x35,0x30,0x37,0x20,0x3d,0x20,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, - 0x7a,0x65,0x28,0x63,0x72,0x6f,0x73,0x73,0x28,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69, - 0x7a,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29,0x2c,0x20,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x29, - 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68, - 0x69,0x67,0x68,0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x35,0x31,0x32,0x20,0x3d, - 0x20,0x5f,0x35,0x30,0x37,0x2e,0x78,0x7a,0x20,0x2a,0x20,0x30,0x2e,0x30,0x30,0x34, - 0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x38,0x32,0x34,0x31,0x32,0x39,0x31,0x30, - 0x34,0x36,0x31,0x34,0x32,0x35,0x37,0x38,0x31,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x35, - 0x35,0x31,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x3e,0x20,0x30,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f, - 0x35,0x35,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x69,0x66,0x20,0x28,0x21,0x5f,0x35,0x35,0x31,0x29,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x35,0x39,0x20,0x3d, - 0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x7a, - 0x20,0x3d,0x3d,0x20,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x5f,0x35,0x35,0x39,0x20,0x3d,0x20,0x5f,0x35,0x35,0x31,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f, - 0x35,0x35,0x39,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x5f,0x35,0x39,0x39,0x20,0x3d,0x20,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73, - 0x74,0x65,0x70,0x28,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39, - 0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33, - 0x37,0x35,0x2c,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x61, - 0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x76,0x65, - 0x63,0x34,0x28,0x6d,0x69,0x6e,0x28,0x76,0x65,0x63,0x33,0x28,0x31,0x2e,0x30,0x29, - 0x2c,0x20,0x76,0x65,0x63,0x33,0x28,0x6d,0x69,0x78,0x28,0x31,0x2e,0x30,0x2c,0x20, - 0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32, - 0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x5f,0x35,0x39,0x39, - 0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x5f,0x32,0x30,0x37,0x2e,0x73,0x75,0x6e,0x4c, - 0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x20,0x2a,0x20,0x28,0x6d,0x69,0x6e, - 0x28,0x6d,0x61,0x78,0x28,0x6d,0x61,0x78,0x28,0x64,0x6f,0x74,0x28,0x6e,0x6f,0x72, - 0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x5f,0x32,0x30,0x37,0x2e,0x73,0x75,0x6e,0x50, - 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x2c,0x20,0x5f,0x35,0x30,0x37,0x29,0x2c, - 0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36, - 0x35,0x36,0x32,0x35,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x20,0x2a,0x20,0x5f,0x32, - 0x30,0x37,0x2e,0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x29, - 0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34, - 0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32, - 0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28, - 0x5f,0x34,0x37,0x36,0x2c,0x20,0x74,0x65,0x78,0x65,0x6c,0x46,0x65,0x74,0x63,0x68, - 0x28,0x72,0x65,0x66,0x74,0x65,0x78,0x5f,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c,0x20, - 0x69,0x76,0x65,0x63,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61, - 0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x78,0x20,0x2b,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x28,0x69,0x6e,0x74,0x28,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f,0x35,0x31,0x32,0x2e, - 0x78,0x2c,0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x37, - 0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38,0x35,0x31,0x35, - 0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38,0x35,0x31, - 0x35,0x36,0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c, - 0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x78,0x29,0x29,0x29, - 0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c,0x61, - 0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79,0x20,0x2b,0x20,0x69, - 0x6e,0x74,0x28,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f,0x35,0x31,0x32,0x2e,0x79,0x2c, - 0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x37,0x36, - 0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38,0x35,0x31,0x35,0x36,0x32, - 0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x37, - 0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32,0x38,0x35,0x31,0x35,0x36, - 0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x70,0x6c,0x61,0x6e, - 0x65,0x5f,0x64,0x61,0x74,0x61,0x5b,0x30,0x5d,0x2e,0x79,0x29,0x29,0x29,0x20,0x2d, - 0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79,0x29, - 0x29,0x2c,0x20,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x35,0x39,0x39, - 0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32, - 0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x64,0x78,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x31,0x20,0x3d,0x20,0x30, - 0x2e,0x30,0x30,0x37,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x36,0x32,0x30,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67, - 0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x34,0x20,0x3d,0x20, - 0x72,0x61,0x6e,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36, - 0x32,0x37,0x20,0x3d,0x20,0x6d,0x61,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x5f,0x36, - 0x32,0x34,0x20,0x2d,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e, - 0x30,0x2c,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c, - 0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x72,0x61,0x6e,0x64,0x20,0x3d,0x20,0x5f,0x36,0x32,0x37,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x68,0x69,0x67,0x68, - 0x70,0x20,0x76,0x65,0x63,0x32,0x20,0x5f,0x37,0x33,0x36,0x20,0x3d,0x20,0x72,0x75, - 0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x2e,0x78,0x20,0x3d,0x20, - 0x5f,0x37,0x33,0x36,0x2e,0x78,0x20,0x2b,0x20,0x28,0x28,0x73,0x69,0x6e,0x28,0x5f, - 0x32,0x30,0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a,0x20,0x31,0x2e,0x32,0x30,0x30, - 0x30,0x30,0x30,0x30,0x34,0x37,0x36,0x38,0x33,0x37,0x31,0x35,0x38,0x32,0x30,0x33, - 0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, - 0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x5f,0x36,0x32,0x31,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b, - 0x65,0x73,0x6b,0x75,0x73,0x20,0x3d,0x20,0x5f,0x37,0x33,0x36,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f, - 0x36,0x34,0x37,0x20,0x3d,0x20,0x69,0x64,0x78,0x20,0x3e,0x20,0x30,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f, - 0x36,0x34,0x37,0x20,0x26,0x26,0x20,0x28,0x5f,0x36,0x32,0x37,0x20,0x3c,0x20,0x30, - 0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32, - 0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x29,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x63, - 0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62, - 0x6f,0x6f,0x6c,0x20,0x5f,0x36,0x36,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x34,0x37,0x29,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x36, - 0x36,0x36,0x20,0x3d,0x20,0x28,0x28,0x72,0x61,0x6e,0x64,0x20,0x2d,0x20,0x5f,0x36, - 0x32,0x31,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x20,0x3c,0x20,0x6c,0x65,0x6e, - 0x67,0x74,0x68,0x28,0x5f,0x37,0x33,0x36,0x20,0x2d,0x20,0x5f,0x37,0x35,0x36,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f, - 0x36,0x36,0x36,0x20,0x3d,0x20,0x5f,0x36,0x34,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x36,0x36,0x29,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x64,0x69, - 0x73,0x63,0x61,0x72,0x64,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30, - 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c, - 0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x76,0x65,0x63,0x34,0x28,0x5f,0x33, - 0x39,0x37,0x20,0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20,0x30,0x2e,0x32,0x30,0x30,0x30, - 0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36, - 0x39,0x35,0x33,0x31,0x32,0x35,0x20,0x2b,0x20,0x28,0x5f,0x33,0x39,0x30,0x20,0x2a, - 0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32, - 0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x2c,0x20, - 0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31, - 0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x2c,0x20,0x31, - 0x2e,0x30,0x29,0x2c,0x20,0x5f,0x34,0x37,0x36,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72, - 0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x68,0x69,0x67,0x68,0x70,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x37,0x31, - 0x31,0x20,0x3d,0x20,0x28,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e,0x30,0x31, - 0x35,0x36,0x32,0x35,0x29,0x20,0x2b,0x20,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30, - 0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30, - 0x36,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, - 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x6d,0x69,0x78,0x28,0x76,0x65, - 0x63,0x34,0x28,0x5f,0x33,0x39,0x37,0x20,0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20,0x6d, - 0x69,0x6e,0x28,0x31,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x32,0x31,0x20,0x2b,0x20,0x30, - 0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32, - 0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x20,0x2b,0x20,0x28, - 0x5f,0x33,0x39,0x30,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, - 0x31,0x32,0x35,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35, - 0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x5f,0x36,0x32,0x31,0x2c,0x20,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e,0x30, - 0x30,0x32,0x33,0x34,0x33,0x37,0x35,0x30,0x30,0x39,0x33,0x31,0x33,0x32,0x32,0x35, - 0x37,0x34,0x36,0x31,0x35,0x34,0x37,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20, - 0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28, - 0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69, - 0x29,0x29,0x2c,0x20,0x76,0x65,0x63,0x34,0x28,0x5f,0x37,0x31,0x31,0x2c,0x20,0x5f, - 0x37,0x31,0x31,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20, - 0x76,0x65,0x63,0x34,0x28,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69, - 0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, + 0x63,0x34,0x28,0x5f,0x33,0x30,0x34,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x00, ]; /* #include @@ -1608,10 +852,9 @@ fs_plane_source_glsl300es := u8.[ vertex main0_out main0(main0_in in [[stage_in]], constant plane_vs_params& _28 [[buffer(0)]], uint gl_InstanceIndex [[instance_id]]) { main0_out out = {}; - float3 _16 = in.position.xyz * 1000.0; - float _35 = _16.x; - out.gl_Position = _28.mvp * float4(_35, float(int(gl_InstanceIndex)) * 0.006000000052154064178466796875, _16.z, 1.0); - out.pos = float4(_35, _16.yz, 1.0); + float4 _37 = float4(in.position.xyz * 1000.0, 1.0); + out.gl_Position = _28.mvp * _37; + out.pos = _37; out.idx = int(gl_InstanceIndex); return out; } @@ -1647,24 +890,17 @@ vs_plane_source_metal_macos := u8.[ 0x5b,0x5b,0x69,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x5f,0x69,0x64,0x5d,0x5d,0x29, 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74, 0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x31,0x36,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x70, - 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x31,0x30, - 0x30,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x33,0x35,0x20,0x3d,0x20,0x5f,0x31,0x36,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e, - 0x20,0x3d,0x20,0x5f,0x32,0x38,0x2e,0x6d,0x76,0x70,0x20,0x2a,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x34,0x28,0x5f,0x33,0x35,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69, - 0x6e,0x74,0x28,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x6e, - 0x64,0x65,0x78,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x30,0x30,0x36,0x30,0x30,0x30, - 0x30,0x30,0x30,0x30,0x35,0x32,0x31,0x35,0x34,0x30,0x36,0x34,0x31,0x37,0x38,0x34, - 0x36,0x36,0x37,0x39,0x36,0x38,0x37,0x35,0x2c,0x20,0x5f,0x31,0x36,0x2e,0x7a,0x2c, - 0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x70, - 0x6f,0x73,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x33,0x35,0x2c, - 0x20,0x5f,0x31,0x36,0x2e,0x79,0x7a,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x74, - 0x28,0x67,0x6c,0x5f,0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x6e,0x64,0x65, - 0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f, - 0x75,0x74,0x3b,0x0a,0x7d,0x0a,0x0a,0x00, + 0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x33,0x37,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x34,0x28,0x69,0x6e,0x2e,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x2e,0x78, + 0x79,0x7a,0x20,0x2a,0x20,0x31,0x30,0x30,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x67,0x6c,0x5f,0x50,0x6f, + 0x73,0x69,0x74,0x69,0x6f,0x6e,0x20,0x3d,0x20,0x5f,0x32,0x38,0x2e,0x6d,0x76,0x70, + 0x20,0x2a,0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e, + 0x70,0x6f,0x73,0x20,0x3d,0x20,0x5f,0x33,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x6f, + 0x75,0x74,0x2e,0x69,0x64,0x78,0x20,0x3d,0x20,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f, + 0x49,0x6e,0x73,0x74,0x61,0x6e,0x63,0x65,0x49,0x6e,0x64,0x65,0x78,0x29,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a, + 0x7d,0x0a,0x0a,0x00, ]; /* #pragma clang diagnostic ignored "-Wmissing-prototypes" @@ -1674,6 +910,13 @@ vs_plane_source_metal_macos := u8.[ using namespace metal; + struct plane_data + { + int screen_w; + int screen_h; + int is_reflection_pass; + }; + struct plane_world_config { float3 skyBase; @@ -1693,13 +936,6 @@ vs_plane_source_metal_macos := u8.[ float grassDensity; }; - struct plane_data - { - int screen_w; - int screen_h; - int is_reflection_pass; - }; - struct main0_out { float4 frag_color [[color(0)]]; @@ -1708,191 +944,93 @@ vs_plane_source_metal_macos := u8.[ struct main0_in { float4 pos [[user(locn0)]]; - int idx [[user(locn1)]]; }; - static inline __attribute__((always_inline)) - float random(thread const float2& st) - { - return fract(sin(dot(st, float2(12.98980045318603515625, 78.233001708984375))) * 43758.546875); - } - - static inline __attribute__((always_inline)) - float _noise(thread const float2& st) - { - float2 _110 = floor(st); - float2 _113 = fract(st); - float2 param = _110; - float _118 = random(param); - float2 param_1 = _110 + float2(1.0, 0.0); - float _125 = random(param_1); - float2 param_2 = _110 + float2(0.0, 1.0); - float2 param_3 = _110 + float2(1.0); - float2 _148 = (_113 * _113) * (float2(3.0) - (_113 * 2.0)); - float _152 = _148.x; - float _158 = _148.y; - return (mix(_118, _125, _152) + (((random(param_2) - _118) * _158) * (1.0 - _152))) + (((random(param_3) - _125) * _152) * _158); - } - static inline __attribute__((always_inline)) uint murmurHash12(thread uint2& src) { src *= uint2(1540483477u); src ^= (src >> uint2(24u)); src *= uint2(1540483477u); - uint _66 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; - uint _73 = (_66 ^ (_66 >> 13u)) * 1540483477u; - return _73 ^ (_73 >> 15u); + uint _64 = ((3744546739u ^ src.x) * 1540483477u) ^ src.y; + uint _71 = (_64 ^ (_64 >> 13u)) * 1540483477u; + return _71 ^ (_71 >> 15u); } static inline __attribute__((always_inline)) float hash12(thread const float2& src) { uint2 param = as_type(src); - uint _86 = murmurHash12(param); - return as_type((_86 & 8388607u) | 1065353216u) - 1.0; + uint _84 = murmurHash12(param); + return as_type((_84 & 8388607u) | 1065353216u) - 1.0; } static inline __attribute__((always_inline)) - float3 wave(thread const float4& wave_1, thread const float3& p, thread float3& tangent, thread float3& binormal, constant plane_world_config& _207) + float3 get_ground_sample(thread const float4& pos, thread const float& dirX, thread const float& dirY, texture2d reftex, sampler refsmp, thread float4& gl_FragCoord, constant plane_data& _145, texture2d groundtex, sampler groundsmp) { - float _188 = 6.282000064849853515625 / wave_1.w; - float2 _196 = fast::normalize(float2(wave_1.x, wave_1.y)); - float _216 = _188 * (dot(_196, p.xz) - (_207.time * 0.20000000298023223876953125)); - float _220 = wave_1.z / _188; - float _222 = _196.x; - float _223 = -_222; - float _229 = sin(_216); - float _230 = wave_1.z * _229; - float _236 = cos(_216); - float _237 = wave_1.z * _236; - float _243 = _196.y; - float _249 = (_223 * _243) * _230; - tangent += float3((_223 * _222) * _230, _222 * _237, _249); - binormal += float3(_249, _243 * _237, ((-_243) * _243) * _230); - float _290 = _220 * _236; - return float3(_222 * _290, _220 * _229, _243 * _290); - } - - fragment main0_out main0(main0_in in [[stage_in]], constant plane_world_config& _207 [[buffer(0)]], constant plane_data& _334 [[buffer(1)]], texture2d reftex [[texture(0)]], sampler refsmp [[sampler(0)]], float4 gl_FragCoord [[position]]) - { - main0_out out = {}; - if (_207.planeType == 1) + float4 _166 = groundtex.read(uint2(int2(int(floor(pos.x + dirX) + 500.0), int(floor(pos.z + dirY) + 500.0))), 0); + float2 param = pos.xz; + float2 param_1 = pos.xz; + if (_166.z == 1.0) { - out.frag_color = reftex.read(uint2(int2(int(gl_FragCoord.x), int(float(_334.screen_h) - gl_FragCoord.y))), 0) * float4(0.89999997615814208984375, 0.89999997615814208984375, 1.0, 1.0); + return reftex.read(uint2(int2(int(gl_FragCoord.x), int(float(_145.screen_h) - gl_FragCoord.y))), 0).xyz * float3(0.0, 0.800000011920928955078125, 0.800000011920928955078125); } else { - float2 _363 = in.pos.xz * _207.grassDensity; - float _365 = _363.y; - float _371 = _363.x + (sin(_365) * 0.5); - float2 _756 = float2(_371, _365 + (sin(_371) * 0.5)); - float2 ruohokeskus = round(_756); - float2 param = _756 * float2(0.0199999995529651641845703125); - float _390 = _noise(param); - float2 _395 = _756 * float2(0.00200000009499490261077880859375); - float2 param_1 = _395; - float _397 = _noise(param_1); - float2 param_2 = _395; - float _403 = _noise(param_2); - float noiseval_plantti = _403; - if (_403 < 0.89999997615814208984375) + if (_166.x == 1.0) { - noiseval_plantti = 0.0; + return float3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param)); } else { - noiseval_plantti = (noiseval_plantti - 0.89999997615814208984375) * 10.0; - } - float2 param_3 = _756.yx * float2(0.001428571413271129131317138671875); - float _420 = _noise(param_3); - int is_water = 0; - float is_water_coast = 1.0; - float coast_multiplier = 0.0; - if (_420 > 0.89999997615814208984375) - { - is_water = 1; - if (_420 < 0.930000007152557373046875) - { - is_water_coast = (_420 - 0.89999997615814208984375) * 33.33300018310546875; - } - } - if (_420 > 0.800000011920928955078125) - { - coast_multiplier = (_420 - 0.800000011920928955078125) * 10.0; - } - float2 param_4 = ruohokeskus; - float rand = (hash12(param_4) - 0.4000000059604644775390625) + (0.4000000059604644775390625 * _397); - float2 param_5 = round(_363 * 10.0); - float4 _476 = float4(float3(0.800000011920928955078125, 0.699999988079071044921875, 0.5) * mix(0.800000011920928955078125, 1.0, hash12(param_5)), 1.0); - if (is_water == 1) - { - float4 param_6 = float4(1.0, 0.5, 0.100000001490116119384765625, 0.89999997615814208984375); - float3 param_7 = in.pos.xyz; - float3 param_8 = float3(1.0, 0.0, 0.0); - float3 param_9 = float3(0.0, 0.0, 1.0); - float3 _496 = wave(param_6, param_7, param_8, param_9, _207); - float3 _507 = fast::normalize(cross(fast::normalize(param_9), fast::normalize(param_8))); - float2 _512 = _507.xz * 0.004999999888241291046142578125; - bool _551 = in.idx > 0; - bool _559; - if (!_551) - { - _559 = _334.is_reflection_pass == 1; - } - else - { - _559 = _551; - } - if (_559) - { - discard_fragment(); - } - float _599 = smoothstep(0.0, 0.89999997615814208984375, is_water_coast); - out.frag_color = float4(fast::min(float3(1.0), float3(mix(1.0, 0.800000011920928955078125, _599)) + ((_207.sunLightColor * (fast::min(fast::max(fast::max(dot(fast::normalize(float3(_207.sunPosition)), _507), 0.0), 0.100000001490116119384765625), 1.0) * _207.sunIntensity)) * 0.100000001490116119384765625)), 1.0) * mix(_476, reftex.read(uint2(int2(int(gl_FragCoord.x + float(int(fast::clamp(_512.x, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(_334.screen_w)))), int(float(_334.screen_h + int(fast::clamp(_512.y, -0.00999999977648258209228515625, 0.00999999977648258209228515625) * float(_334.screen_h))) - gl_FragCoord.y))), 0), float4(_599)); - } - else - { - float _620 = float(in.idx); - float _621 = 0.0078125 * _620; - float _624 = rand; - float _627 = fast::max(0.0, _624 - mix(0.0, 1.0, coast_multiplier)); - rand = _627; - float2 _736 = ruohokeskus; - _736.x = _736.x + ((sin(_207.time * 1.2000000476837158203125) * 0.20000000298023223876953125) * _621); - ruohokeskus = _736; - bool _647 = in.idx > 0; - if (_647 && (_627 < 0.20000000298023223876953125)) - { - discard_fragment(); - } - bool _666; - if (_647) - { - _666 = ((rand - _621) * 0.5) < length(_736 - _756); - } - else - { - _666 = _647; - } - if (_666) - { - discard_fragment(); - } - else - { - if (in.idx == 0) - { - out.frag_color = mix(float4(_397 * 0.5, 0.20000000298023223876953125 + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), _476, float4(coast_multiplier)); - } - else - { - float _711 = (_620 * 0.015625) + 0.4000000059604644775390625; - out.frag_color = mix(mix(float4(_397 * 0.5, fast::min(1.0, _621 + 0.20000000298023223876953125) + (_390 * 0.20000000298023223876953125), 0.100000001490116119384765625, 1.0), float4(_621, _620 * 0.0023437500931322574615478515625, 0.0, 1.0), float4(noiseval_plantti)), float4(_711, _711, 0.0, 1.0), float4(coast_multiplier)); - } - } + return float3(0.4000000059604644775390625, 0.800000011920928955078125, 0.300000011920928955078125) * mix(0.800000011920928955078125, 1.0, hash12(param_1)); } } + } + + static inline __attribute__((always_inline)) + int sign2(thread const float& x) + { + if (x < 0.0) + { + return -1; + } + return 1; + } + + fragment main0_out main0(main0_in in [[stage_in]], constant plane_data& _145 [[buffer(0)]], constant plane_world_config& _313 [[buffer(1)]], texture2d reftex [[texture(0)]], texture2d groundtex [[texture(1)]], sampler refsmp [[sampler(0)]], sampler groundsmp [[sampler(1)]], float4 gl_FragCoord [[position]]) + { + main0_out out = {}; + float4 _220 = round(in.pos * 16.0) * float4(0.0625); + float2 _235 = _220.xz - float2(floor(_220.x) + 0.5, floor(_220.z) + 0.5); + float _239 = _235.x; + float _245 = _235.y; + float4 param = _220; + float param_1 = 0.0; + float param_2 = 0.0; + float param_3 = _239; + float4 param_4 = _220; + float param_5 = float(sign2(param_3)); + float param_6 = 0.0; + float param_7 = _245; + float4 param_8 = _220; + float param_9 = 0.0; + float param_10 = float(sign2(param_7)); + float param_11 = _239; + float param_12 = _245; + float4 param_13 = _220; + float param_14 = float(sign2(param_11)); + float param_15 = float(sign2(param_12)); + float3 _297 = float3(smoothstep(0.20000000298023223876953125, 0.5, abs(_239)) * 0.5); + float3 _304 = mix(get_ground_sample(param_8, param_9, param_10, reftex, refsmp, gl_FragCoord, _145, groundtex, groundsmp), get_ground_sample(param_13, param_14, param_15, reftex, refsmp, gl_FragCoord, _145, groundtex, groundsmp), _297); + if (_313.planeType == 1) + { + out.frag_color = float4(mix(mix(get_ground_sample(param, param_1, param_2, reftex, refsmp, gl_FragCoord, _145, groundtex, groundsmp), get_ground_sample(param_4, param_5, param_6, reftex, refsmp, gl_FragCoord, _145, groundtex, groundsmp), _297), _304, float3(smoothstep(0.20000000298023223876953125, 0.5, abs(_245)) * 0.5)), 1.0); + } + else + { + out.frag_color = float4(_304, 1.0); + } return out; } @@ -1906,537 +1044,266 @@ fs_plane_source_metal_macos := u8.[ 0x0a,0x23,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x20,0x3c,0x73,0x69,0x6d,0x64,0x2f, 0x73,0x69,0x6d,0x64,0x2e,0x68,0x3e,0x0a,0x0a,0x75,0x73,0x69,0x6e,0x67,0x20,0x6e, 0x61,0x6d,0x65,0x73,0x70,0x61,0x63,0x65,0x20,0x6d,0x65,0x74,0x61,0x6c,0x3b,0x0a, - 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f, - 0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x6b,0x79,0x54, - 0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73, - 0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x75,0x6e,0x48,0x61, - 0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73, - 0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x70,0x61,0x63,0x6b,0x65,0x64,0x5f,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, - 0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73, - 0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73, - 0x6b,0x79,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e, - 0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74, - 0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69,0x6d,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x72,0x61,0x73,0x73,0x44,0x65,0x6e,0x73,0x69, - 0x74,0x79,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x70, - 0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x69,0x6e,0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x77,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x69,0x73,0x5f,0x72,0x65,0x66,0x6c,0x65, - 0x63,0x74,0x69,0x6f,0x6e,0x5f,0x70,0x61,0x73,0x73,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, + 0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61, + 0x74,0x61,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73,0x63,0x72, + 0x65,0x65,0x6e,0x5f,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x73, + 0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74, + 0x20,0x69,0x73,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x70, + 0x61,0x73,0x73,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63,0x74,0x20, + 0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66, + 0x69,0x67,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, + 0x73,0x6b,0x79,0x42,0x61,0x73,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x33,0x20,0x73,0x6b,0x79,0x54,0x6f,0x70,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x75,0x6e,0x44,0x69,0x73,0x6b,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x68,0x6f,0x72,0x69,0x7a, + 0x6f,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x33,0x20,0x73,0x75,0x6e,0x48,0x61,0x6c,0x6f,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43, + 0x6f,0x6c,0x6f,0x72,0x3b,0x0a,0x20,0x20,0x20,0x20,0x70,0x61,0x63,0x6b,0x65,0x64, + 0x5f,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74, + 0x69,0x6f,0x6e,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73, + 0x75,0x6e,0x49,0x6e,0x74,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20, + 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x73,0x6b,0x79,0x49,0x6e,0x74,0x65,0x6e,0x73, + 0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x68,0x61,0x73, + 0x43,0x6c,0x6f,0x75,0x64,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20, + 0x68,0x61,0x73,0x50,0x6c,0x61,0x6e,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x48,0x65,0x69,0x67,0x68,0x74,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x69,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79, + 0x70,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x74,0x69, + 0x6d,0x65,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x67,0x72, + 0x61,0x73,0x73,0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a, 0x73,0x74,0x72,0x75,0x63,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74, 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x66,0x72, 0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x5b,0x5b,0x63,0x6f,0x6c,0x6f,0x72, 0x28,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74,0x72,0x75,0x63, 0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x0a,0x7b,0x0a,0x20,0x20,0x20, 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x6f,0x73,0x20,0x5b,0x5b,0x75,0x73, - 0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x69,0x6e,0x74,0x20,0x69,0x64,0x78,0x20,0x5b,0x5b,0x75,0x73,0x65,0x72,0x28, - 0x6c,0x6f,0x63,0x6e,0x31,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a,0x0a,0x73,0x74, - 0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74, - 0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79, - 0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63, - 0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x26,0x20,0x73,0x74,0x29, - 0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x66,0x72, - 0x61,0x63,0x74,0x28,0x73,0x69,0x6e,0x28,0x64,0x6f,0x74,0x28,0x73,0x74,0x2c,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x31,0x32,0x2e,0x39,0x38,0x39,0x38,0x30,0x30, - 0x34,0x35,0x33,0x31,0x38,0x36,0x30,0x33,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20, - 0x37,0x38,0x2e,0x32,0x33,0x33,0x30,0x30,0x31,0x37,0x30,0x38,0x39,0x38,0x34,0x33, - 0x37,0x35,0x29,0x29,0x29,0x20,0x2a,0x20,0x34,0x33,0x37,0x35,0x38,0x2e,0x35,0x34, - 0x36,0x38,0x37,0x35,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63, - 0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62, - 0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e, - 0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x6e,0x6f, - 0x69,0x73,0x65,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x26,0x20,0x73,0x74,0x29,0x0a,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x31,0x31,0x30,0x20,0x3d, - 0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x31,0x31,0x33,0x20,0x3d,0x20,0x66,0x72, - 0x61,0x63,0x74,0x28,0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x31,0x38, - 0x20,0x3d,0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x29, + 0x65,0x72,0x28,0x6c,0x6f,0x63,0x6e,0x30,0x29,0x5d,0x5d,0x3b,0x0a,0x7d,0x3b,0x0a, + 0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f, + 0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c, + 0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x75,0x69, + 0x6e,0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31,0x32,0x28, + 0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x75,0x69,0x6e,0x74,0x32,0x26,0x20,0x73,0x72, + 0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a,0x3d,0x20, + 0x75,0x69,0x6e,0x74,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37, + 0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x5e,0x3d,0x20,0x28, + 0x73,0x72,0x63,0x20,0x3e,0x3e,0x20,0x75,0x69,0x6e,0x74,0x32,0x28,0x32,0x34,0x75, + 0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a,0x3d,0x20,0x75, + 0x69,0x6e,0x74,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x36,0x34,0x20, + 0x3d,0x20,0x28,0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36,0x37,0x33,0x39,0x75,0x20, + 0x5e,0x20,0x73,0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34, + 0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x79,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x37,0x31,0x20,0x3d,0x20, + 0x28,0x5f,0x36,0x34,0x20,0x5e,0x20,0x28,0x5f,0x36,0x34,0x20,0x3e,0x3e,0x20,0x31, + 0x33,0x75,0x29,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34,0x37, + 0x37,0x75,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x5f, + 0x37,0x31,0x20,0x5e,0x20,0x28,0x5f,0x37,0x31,0x20,0x3e,0x3e,0x20,0x31,0x35,0x75, + 0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c, + 0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f, + 0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65, + 0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28, + 0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x32,0x26,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x75,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x61,0x73, + 0x5f,0x74,0x79,0x70,0x65,0x3c,0x75,0x69,0x6e,0x74,0x32,0x3e,0x28,0x73,0x72,0x63, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x38,0x34,0x20, + 0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31,0x32,0x28,0x70, + 0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6e,0x20,0x61,0x73,0x5f,0x74,0x79,0x70,0x65,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e, + 0x28,0x28,0x5f,0x38,0x34,0x20,0x26,0x20,0x38,0x33,0x38,0x38,0x36,0x30,0x37,0x75, + 0x29,0x20,0x7c,0x20,0x31,0x30,0x36,0x35,0x33,0x35,0x33,0x32,0x31,0x36,0x75,0x29, + 0x20,0x2d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69, + 0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69, + 0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69, + 0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x67, + 0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65, + 0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x26,0x20,0x70,0x6f,0x73,0x2c,0x20,0x74,0x68,0x72,0x65,0x61, + 0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x26,0x20,0x64, + 0x69,0x72,0x58,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73, + 0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x26,0x20,0x64,0x69,0x72,0x59,0x2c,0x20,0x74, + 0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20, + 0x72,0x65,0x66,0x74,0x65,0x78,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20, + 0x72,0x65,0x66,0x73,0x6d,0x70,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x26,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f, + 0x6f,0x72,0x64,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x70,0x6c, + 0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x26,0x20,0x5f,0x31,0x34,0x35,0x2c,0x20, + 0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e, + 0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x2c,0x20,0x73,0x61,0x6d,0x70, + 0x6c,0x65,0x72,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x29,0x0a,0x7b, + 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x31,0x36,0x36, + 0x20,0x3d,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x2e,0x72,0x65,0x61, + 0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x69,0x6e,0x74,0x32,0x28,0x69,0x6e,0x74, + 0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x70,0x6f,0x73,0x2e,0x78,0x20,0x2b,0x20,0x64, + 0x69,0x72,0x58,0x29,0x20,0x2b,0x20,0x35,0x30,0x30,0x2e,0x30,0x29,0x2c,0x20,0x69, + 0x6e,0x74,0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x70,0x6f,0x73,0x2e,0x7a,0x20,0x2b, + 0x20,0x64,0x69,0x72,0x59,0x29,0x20,0x2b,0x20,0x35,0x30,0x30,0x2e,0x30,0x29,0x29, + 0x29,0x2c,0x20,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x7a, 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x32,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x32,0x35,0x20,0x3d, - 0x20,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x32,0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61,0x72,0x61,0x6d, - 0x5f,0x33,0x20,0x3d,0x20,0x5f,0x31,0x31,0x30,0x20,0x2b,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x28,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x20,0x5f,0x31,0x34,0x38,0x20,0x3d,0x20,0x28,0x5f,0x31,0x31,0x33, - 0x20,0x2a,0x20,0x5f,0x31,0x31,0x33,0x29,0x20,0x2a,0x20,0x28,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x28,0x33,0x2e,0x30,0x29,0x20,0x2d,0x20,0x28,0x5f,0x31,0x31,0x33,0x20, - 0x2a,0x20,0x32,0x2e,0x30,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x31,0x35,0x32,0x20,0x3d,0x20,0x5f,0x31,0x34,0x38,0x2e,0x78, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x35,0x38, - 0x20,0x3d,0x20,0x5f,0x31,0x34,0x38,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72, - 0x65,0x74,0x75,0x72,0x6e,0x20,0x28,0x6d,0x69,0x78,0x28,0x5f,0x31,0x31,0x38,0x2c, - 0x20,0x5f,0x31,0x32,0x35,0x2c,0x20,0x5f,0x31,0x35,0x32,0x29,0x20,0x2b,0x20,0x28, - 0x28,0x28,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32, - 0x29,0x20,0x2d,0x20,0x5f,0x31,0x31,0x38,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x38, - 0x29,0x20,0x2a,0x20,0x28,0x31,0x2e,0x30,0x20,0x2d,0x20,0x5f,0x31,0x35,0x32,0x29, - 0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x28,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x28,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x33,0x29,0x20,0x2d,0x20,0x5f,0x31,0x32,0x35,0x29,0x20, - 0x2a,0x20,0x5f,0x31,0x35,0x32,0x29,0x20,0x2a,0x20,0x5f,0x31,0x35,0x38,0x29,0x3b, - 0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e, - 0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28, - 0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29, - 0x0a,0x75,0x69,0x6e,0x74,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68, - 0x31,0x32,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x75,0x69,0x6e,0x74,0x32,0x26, - 0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20, - 0x2a,0x3d,0x20,0x75,0x69,0x6e,0x74,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33, - 0x34,0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x5e, - 0x3d,0x20,0x28,0x73,0x72,0x63,0x20,0x3e,0x3e,0x20,0x75,0x69,0x6e,0x74,0x32,0x28, - 0x32,0x34,0x75,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x73,0x72,0x63,0x20,0x2a, - 0x3d,0x20,0x75,0x69,0x6e,0x74,0x32,0x28,0x31,0x35,0x34,0x30,0x34,0x38,0x33,0x34, - 0x37,0x37,0x75,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f, - 0x36,0x36,0x20,0x3d,0x20,0x28,0x28,0x33,0x37,0x34,0x34,0x35,0x34,0x36,0x37,0x33, - 0x39,0x75,0x20,0x5e,0x20,0x73,0x72,0x63,0x2e,0x78,0x29,0x20,0x2a,0x20,0x31,0x35, - 0x34,0x30,0x34,0x38,0x33,0x34,0x37,0x37,0x75,0x29,0x20,0x5e,0x20,0x73,0x72,0x63, - 0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f,0x37,0x33, - 0x20,0x3d,0x20,0x28,0x5f,0x36,0x36,0x20,0x5e,0x20,0x28,0x5f,0x36,0x36,0x20,0x3e, - 0x3e,0x20,0x31,0x33,0x75,0x29,0x29,0x20,0x2a,0x20,0x31,0x35,0x34,0x30,0x34,0x38, - 0x33,0x34,0x37,0x37,0x75,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, - 0x6e,0x20,0x5f,0x37,0x33,0x20,0x5e,0x20,0x28,0x5f,0x37,0x33,0x20,0x3e,0x3e,0x20, - 0x31,0x35,0x75,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20, - 0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75, - 0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c, - 0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74,0x20,0x68,0x61,0x73,0x68, - 0x31,0x32,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x32,0x26,0x20,0x73,0x72,0x63,0x29,0x0a,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d, - 0x20,0x61,0x73,0x5f,0x74,0x79,0x70,0x65,0x3c,0x75,0x69,0x6e,0x74,0x32,0x3e,0x28, - 0x73,0x72,0x63,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x75,0x69,0x6e,0x74,0x20,0x5f, - 0x38,0x36,0x20,0x3d,0x20,0x6d,0x75,0x72,0x6d,0x75,0x72,0x48,0x61,0x73,0x68,0x31, - 0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x72,0x65, - 0x74,0x75,0x72,0x6e,0x20,0x61,0x73,0x5f,0x74,0x79,0x70,0x65,0x3c,0x66,0x6c,0x6f, - 0x61,0x74,0x3e,0x28,0x28,0x5f,0x38,0x36,0x20,0x26,0x20,0x38,0x33,0x38,0x38,0x36, - 0x30,0x37,0x75,0x29,0x20,0x7c,0x20,0x31,0x30,0x36,0x35,0x33,0x35,0x33,0x32,0x31, - 0x36,0x75,0x29,0x20,0x2d,0x20,0x31,0x2e,0x30,0x3b,0x0a,0x7d,0x0a,0x0a,0x73,0x74, - 0x61,0x74,0x69,0x63,0x20,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74, - 0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79, - 0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e,0x65,0x29,0x29,0x0a,0x66,0x6c,0x6f,0x61,0x74, - 0x33,0x20,0x77,0x61,0x76,0x65,0x28,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f, - 0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x26,0x20,0x77,0x61,0x76,0x65, - 0x5f,0x31,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20,0x70,0x2c,0x20,0x74,0x68,0x72,0x65, - 0x61,0x64,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x26,0x20,0x74,0x61,0x6e,0x67,0x65, - 0x6e,0x74,0x2c,0x20,0x74,0x68,0x72,0x65,0x61,0x64,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x33,0x26,0x20,0x62,0x69,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x2c,0x20,0x63,0x6f,0x6e, - 0x73,0x74,0x61,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c, - 0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x26,0x20,0x5f,0x32,0x30,0x37,0x29,0x0a, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x31,0x38,0x38, - 0x20,0x3d,0x20,0x36,0x2e,0x32,0x38,0x32,0x30,0x30,0x30,0x30,0x36,0x34,0x38,0x34, - 0x39,0x38,0x35,0x33,0x35,0x31,0x35,0x36,0x32,0x35,0x20,0x2f,0x20,0x77,0x61,0x76, - 0x65,0x5f,0x31,0x2e,0x77,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x32,0x20,0x5f,0x31,0x39,0x36,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e, - 0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28, - 0x77,0x61,0x76,0x65,0x5f,0x31,0x2e,0x78,0x2c,0x20,0x77,0x61,0x76,0x65,0x5f,0x31, - 0x2e,0x79,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x32,0x31,0x36,0x20,0x3d,0x20,0x5f,0x31,0x38,0x38,0x20,0x2a,0x20,0x28,0x64, - 0x6f,0x74,0x28,0x5f,0x31,0x39,0x36,0x2c,0x20,0x70,0x2e,0x78,0x7a,0x29,0x20,0x2d, - 0x20,0x28,0x5f,0x32,0x30,0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a,0x20,0x30,0x2e, - 0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32, - 0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x30,0x20,0x3d,0x20,0x77, - 0x61,0x76,0x65,0x5f,0x31,0x2e,0x7a,0x20,0x2f,0x20,0x5f,0x31,0x38,0x38,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x32,0x20,0x3d, - 0x20,0x5f,0x31,0x39,0x36,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x32,0x32,0x33,0x20,0x3d,0x20,0x2d,0x5f,0x32,0x32,0x32,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x32,0x39,0x20, - 0x3d,0x20,0x73,0x69,0x6e,0x28,0x5f,0x32,0x31,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x30,0x20,0x3d,0x20,0x77,0x61, - 0x76,0x65,0x5f,0x31,0x2e,0x7a,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x36,0x20,0x3d,0x20, - 0x63,0x6f,0x73,0x28,0x5f,0x32,0x31,0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x37,0x20,0x3d,0x20,0x77,0x61,0x76,0x65, - 0x5f,0x31,0x2e,0x7a,0x20,0x2a,0x20,0x5f,0x32,0x33,0x36,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x34,0x33,0x20,0x3d,0x20,0x5f,0x31, - 0x39,0x36,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x32,0x34,0x39,0x20,0x3d,0x20,0x28,0x5f,0x32,0x32,0x33,0x20,0x2a,0x20,0x5f, - 0x32,0x34,0x33,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x74,0x61,0x6e,0x67,0x65,0x6e,0x74,0x20,0x2b,0x3d,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x33,0x28,0x28,0x5f,0x32,0x32,0x33,0x20,0x2a,0x20,0x5f,0x32,0x32,0x32,0x29, - 0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x2c,0x20,0x5f,0x32,0x32,0x32,0x20,0x2a,0x20, - 0x5f,0x32,0x33,0x37,0x2c,0x20,0x5f,0x32,0x34,0x39,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x62,0x69,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x20,0x2b,0x3d,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x33,0x28,0x5f,0x32,0x34,0x39,0x2c,0x20,0x5f,0x32,0x34,0x33,0x20,0x2a, - 0x20,0x5f,0x32,0x33,0x37,0x2c,0x20,0x28,0x28,0x2d,0x5f,0x32,0x34,0x33,0x29,0x20, - 0x2a,0x20,0x5f,0x32,0x34,0x33,0x29,0x20,0x2a,0x20,0x5f,0x32,0x33,0x30,0x29,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x39,0x30,0x20, - 0x3d,0x20,0x5f,0x32,0x32,0x30,0x20,0x2a,0x20,0x5f,0x32,0x33,0x36,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, - 0x28,0x5f,0x32,0x32,0x32,0x20,0x2a,0x20,0x5f,0x32,0x39,0x30,0x2c,0x20,0x5f,0x32, - 0x32,0x30,0x20,0x2a,0x20,0x5f,0x32,0x32,0x39,0x2c,0x20,0x5f,0x32,0x34,0x33,0x20, - 0x2a,0x20,0x5f,0x32,0x39,0x30,0x29,0x3b,0x0a,0x7d,0x0a,0x0a,0x66,0x72,0x61,0x67, - 0x6d,0x65,0x6e,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d, - 0x61,0x69,0x6e,0x30,0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e, - 0x20,0x5b,0x5b,0x73,0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63, - 0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x77,0x6f, - 0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x26,0x20,0x5f,0x32,0x30,0x37, - 0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20, - 0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64, - 0x61,0x74,0x61,0x26,0x20,0x5f,0x33,0x33,0x34,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66, - 0x65,0x72,0x28,0x31,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65, - 0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x72,0x65,0x66,0x74,0x65,0x78, - 0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c, - 0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x72,0x65,0x66,0x73,0x6d,0x70,0x20, - 0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f, - 0x6f,0x72,0x64,0x20,0x5b,0x5b,0x70,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x5d,0x5d, - 0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75, - 0x74,0x20,0x6f,0x75,0x74,0x20,0x3d,0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x69,0x66,0x20,0x28,0x5f,0x32,0x30,0x37,0x2e,0x70,0x6c,0x61,0x6e,0x65,0x54,0x79, - 0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f, - 0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x2e,0x72, - 0x65,0x61,0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x69,0x6e,0x74,0x32,0x28,0x69, - 0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e, - 0x78,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x5f,0x33, - 0x33,0x34,0x2e,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x29,0x20,0x2d,0x20,0x67, - 0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79,0x29,0x29,0x29, - 0x2c,0x20,0x30,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x30,0x2e, - 0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30, - 0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39, - 0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33, - 0x37,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x32,0x20,0x5f,0x33,0x36,0x33,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x70,0x6f,0x73, - 0x2e,0x78,0x7a,0x20,0x2a,0x20,0x5f,0x32,0x30,0x37,0x2e,0x67,0x72,0x61,0x73,0x73, - 0x44,0x65,0x6e,0x73,0x69,0x74,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x33,0x36,0x35,0x20,0x3d,0x20,0x5f,0x33, - 0x36,0x33,0x2e,0x79,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x33,0x37,0x31,0x20,0x3d,0x20,0x5f,0x33,0x36,0x33,0x2e, - 0x78,0x20,0x2b,0x20,0x28,0x73,0x69,0x6e,0x28,0x5f,0x33,0x36,0x35,0x29,0x20,0x2a, - 0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x37,0x35,0x36,0x20,0x3d,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x28,0x5f,0x33,0x37,0x31,0x2c,0x20,0x5f,0x33,0x36,0x35,0x20,0x2b, - 0x20,0x28,0x73,0x69,0x6e,0x28,0x5f,0x33,0x37,0x31,0x29,0x20,0x2a,0x20,0x30,0x2e, - 0x35,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x20, - 0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64,0x28,0x5f,0x37,0x35,0x36,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x20,0x2a,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x32,0x28,0x30,0x2e,0x30,0x31,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x35, - 0x35,0x32,0x39,0x36,0x35,0x31,0x36,0x34,0x31,0x38,0x34,0x35,0x37,0x30,0x33,0x31, - 0x32,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x5f,0x33,0x39,0x30,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65, - 0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x33,0x39,0x35,0x20,0x3d,0x20,0x5f, - 0x37,0x35,0x36,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x30,0x2e,0x30, - 0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x39,0x34,0x39,0x39,0x34,0x39,0x30, - 0x32,0x36,0x31,0x30,0x37,0x37,0x38,0x38,0x30,0x38,0x35,0x39,0x33,0x37,0x35,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, - 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x5f,0x33,0x39,0x35,0x3b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x33,0x39,0x37,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x31,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66, - 0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x20,0x3d,0x20, - 0x5f,0x33,0x39,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c, - 0x6f,0x61,0x74,0x20,0x5f,0x34,0x30,0x33,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73, - 0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76, - 0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x5f,0x34,0x30, - 0x33,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f, - 0x34,0x30,0x33,0x20,0x3c,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37, - 0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f, - 0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6e,0x6f,0x69,0x73, - 0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69,0x20,0x3d,0x20,0x28, - 0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74,0x74,0x69, - 0x20,0x2d,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35, - 0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x20,0x2a,0x20, - 0x31,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x37,0x35,0x36,0x2e,0x79,0x78, - 0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x28,0x30,0x2e,0x30,0x30,0x31,0x34, - 0x32,0x38,0x35,0x37,0x31,0x34,0x31,0x33,0x32,0x37,0x31,0x31,0x32,0x39,0x31,0x33, - 0x31,0x33,0x31,0x37,0x31,0x33,0x38,0x36,0x37,0x31,0x38,0x37,0x35,0x29,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x34, - 0x32,0x30,0x20,0x3d,0x20,0x5f,0x6e,0x6f,0x69,0x73,0x65,0x28,0x70,0x61,0x72,0x61, - 0x6d,0x5f,0x33,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x6e, - 0x74,0x20,0x69,0x73,0x5f,0x77,0x61,0x74,0x65,0x72,0x20,0x3d,0x20,0x30,0x3b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x69,0x73, - 0x5f,0x77,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x31, - 0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69, - 0x65,0x72,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x3e,0x20,0x30,0x2e,0x38, - 0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38, - 0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73, - 0x5f,0x77,0x61,0x74,0x65,0x72,0x20,0x3d,0x20,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32,0x30, - 0x20,0x3c,0x20,0x30,0x2e,0x39,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x37,0x31,0x35, - 0x32,0x35,0x35,0x37,0x33,0x37,0x33,0x30,0x34,0x36,0x38,0x37,0x35,0x29,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x73,0x5f, - 0x77,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x20,0x3d,0x20,0x28,0x5f, - 0x34,0x32,0x30,0x20,0x2d,0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37, - 0x36,0x31,0x35,0x38,0x31,0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29, - 0x20,0x2a,0x20,0x33,0x33,0x2e,0x33,0x33,0x33,0x30,0x30,0x30,0x31,0x38,0x33,0x31, - 0x30,0x35,0x34,0x36,0x38,0x37,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x34,0x32, - 0x30,0x20,0x3e,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39, - 0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75,0x6c,0x74, - 0x69,0x70,0x6c,0x69,0x65,0x72,0x20,0x3d,0x20,0x28,0x5f,0x34,0x32,0x30,0x20,0x2d, - 0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, - 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x31, - 0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73, - 0x6b,0x75,0x73,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, - 0x61,0x74,0x20,0x72,0x61,0x6e,0x64,0x20,0x3d,0x20,0x28,0x68,0x61,0x73,0x68,0x31, - 0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x29,0x20,0x2d,0x20,0x30,0x2e,0x34, - 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37, - 0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x29,0x20,0x2b,0x20,0x28,0x30,0x2e,0x34, - 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37, - 0x37,0x35,0x33,0x39,0x30,0x36,0x32,0x35,0x20,0x2a,0x20,0x5f,0x33,0x39,0x37,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, - 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64, - 0x28,0x5f,0x33,0x36,0x33,0x20,0x2a,0x20,0x31,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x5f,0x34, - 0x37,0x36,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x66,0x6c,0x6f,0x61, - 0x74,0x33,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32, - 0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30, - 0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37,0x39,0x30,0x37,0x31, - 0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c,0x20,0x30,0x2e,0x35,0x29,0x20, - 0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31, + 0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x70,0x6f,0x73,0x2e,0x78,0x7a,0x3b,0x0a,0x20, + 0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x31,0x36,0x36,0x2e,0x7a,0x20,0x3d,0x3d, + 0x20,0x31,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x72,0x65,0x66,0x74,0x65, + 0x78,0x2e,0x72,0x65,0x61,0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x69,0x6e,0x74, + 0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f, + 0x72,0x64,0x2e,0x78,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74, + 0x28,0x5f,0x31,0x34,0x35,0x2e,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x29,0x20, + 0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2e,0x79, + 0x29,0x29,0x29,0x2c,0x20,0x30,0x29,0x2e,0x78,0x79,0x7a,0x20,0x2a,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30, + 0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37, + 0x38,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31, 0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35, - 0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61, - 0x72,0x61,0x6d,0x5f,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x69,0x73,0x5f,0x77,0x61, - 0x74,0x65,0x72,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x35, - 0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30, - 0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x2c, - 0x20,0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31, - 0x34,0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20, - 0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x70,0x6f,0x73, - 0x2e,0x78,0x79,0x7a,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38, - 0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30, - 0x2e,0x30,0x2c,0x20,0x30,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e, - 0x30,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, - 0x20,0x5f,0x34,0x39,0x36,0x20,0x3d,0x20,0x77,0x61,0x76,0x65,0x28,0x70,0x61,0x72, - 0x61,0x6d,0x5f,0x36,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x2c,0x20,0x70, - 0x61,0x72,0x61,0x6d,0x5f,0x38,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x2c, - 0x20,0x5f,0x32,0x30,0x37,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x35,0x30,0x37,0x20, - 0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a, - 0x65,0x28,0x63,0x72,0x6f,0x73,0x73,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f, - 0x72,0x6d,0x61,0x6c,0x69,0x7a,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x29, - 0x2c,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d,0x61,0x6c,0x69,0x7a, - 0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x29,0x29,0x29,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, - 0x20,0x5f,0x35,0x31,0x32,0x20,0x3d,0x20,0x5f,0x35,0x30,0x37,0x2e,0x78,0x7a,0x20, - 0x2a,0x20,0x30,0x2e,0x30,0x30,0x34,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x38, - 0x32,0x34,0x31,0x32,0x39,0x31,0x30,0x34,0x36,0x31,0x34,0x32,0x35,0x37,0x38,0x31, - 0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x35,0x35,0x31,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x69, - 0x64,0x78,0x20,0x3e,0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x35,0x35,0x39,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x21, - 0x5f,0x35,0x35,0x31,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x5f,0x35,0x35,0x39,0x20,0x3d,0x20,0x5f,0x33,0x33,0x34,0x2e, - 0x69,0x73,0x5f,0x72,0x65,0x66,0x6c,0x65,0x63,0x74,0x69,0x6f,0x6e,0x5f,0x70,0x61, - 0x73,0x73,0x20,0x3d,0x3d,0x20,0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x35,0x35,0x39,0x20,0x3d,0x20,0x5f,0x35,0x35, - 0x31,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20, - 0x28,0x5f,0x35,0x35,0x39,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x5f,0x66,0x72,0x61, - 0x67,0x6d,0x65,0x6e,0x74,0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x35,0x39,0x39,0x20,0x3d,0x20, - 0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x30,0x2c,0x20, - 0x30,0x2e,0x38,0x39,0x39,0x39,0x39,0x39,0x39,0x37,0x36,0x31,0x35,0x38,0x31,0x34, - 0x32,0x30,0x38,0x39,0x38,0x34,0x33,0x37,0x35,0x2c,0x20,0x69,0x73,0x5f,0x77,0x61, - 0x74,0x65,0x72,0x5f,0x63,0x6f,0x61,0x73,0x74,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67, - 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, - 0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x66,0x6c,0x6f,0x61,0x74,0x33, - 0x28,0x31,0x2e,0x30,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x6d,0x69, - 0x78,0x28,0x31,0x2e,0x30,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x65,0x6c,0x73, + 0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x69,0x66,0x20,0x28,0x5f,0x31,0x36,0x36,0x2e,0x78,0x20,0x3d,0x3d,0x20,0x31,0x2e, + 0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30, 0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32, - 0x35,0x2c,0x20,0x5f,0x35,0x39,0x39,0x29,0x29,0x20,0x2b,0x20,0x28,0x28,0x5f,0x32, - 0x30,0x37,0x2e,0x73,0x75,0x6e,0x4c,0x69,0x67,0x68,0x74,0x43,0x6f,0x6c,0x6f,0x72, - 0x20,0x2a,0x20,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x69,0x6e,0x28,0x66,0x61, - 0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61, - 0x78,0x28,0x64,0x6f,0x74,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6e,0x6f,0x72,0x6d, - 0x61,0x6c,0x69,0x7a,0x65,0x28,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28,0x5f,0x32,0x30, - 0x37,0x2e,0x73,0x75,0x6e,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x29,0x29,0x2c, - 0x20,0x5f,0x35,0x30,0x37,0x29,0x2c,0x20,0x30,0x2e,0x30,0x29,0x2c,0x20,0x30,0x2e, - 0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31, - 0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x29,0x2c,0x20,0x31,0x2e, - 0x30,0x29,0x20,0x2a,0x20,0x5f,0x32,0x30,0x37,0x2e,0x73,0x75,0x6e,0x49,0x6e,0x74, - 0x65,0x6e,0x73,0x69,0x74,0x79,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x31,0x30,0x30, - 0x30,0x30,0x30,0x30,0x30,0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33, - 0x38,0x34,0x37,0x36,0x35,0x36,0x32,0x35,0x29,0x29,0x2c,0x20,0x31,0x2e,0x30,0x29, - 0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x5f,0x34,0x37,0x36,0x2c,0x20,0x72,0x65,0x66, - 0x74,0x65,0x78,0x2e,0x72,0x65,0x61,0x64,0x28,0x75,0x69,0x6e,0x74,0x32,0x28,0x69, - 0x6e,0x74,0x32,0x28,0x69,0x6e,0x74,0x28,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43, - 0x6f,0x6f,0x72,0x64,0x2e,0x78,0x20,0x2b,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69, - 0x6e,0x74,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f, - 0x35,0x31,0x32,0x2e,0x78,0x2c,0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32, - 0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32, - 0x32,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x28,0x5f,0x33,0x33,0x34,0x2e,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x77,0x29, - 0x29,0x29,0x29,0x2c,0x20,0x69,0x6e,0x74,0x28,0x66,0x6c,0x6f,0x61,0x74,0x28,0x5f, - 0x33,0x33,0x34,0x2e,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x20,0x2b,0x20,0x69, - 0x6e,0x74,0x28,0x66,0x61,0x73,0x74,0x3a,0x3a,0x63,0x6c,0x61,0x6d,0x70,0x28,0x5f, - 0x35,0x31,0x32,0x2e,0x79,0x2c,0x20,0x2d,0x30,0x2e,0x30,0x30,0x39,0x39,0x39,0x39, - 0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32,0x32, - 0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20,0x30,0x2e,0x30,0x30,0x39,0x39,0x39, - 0x39,0x39,0x39,0x39,0x37,0x37,0x36,0x34,0x38,0x32,0x35,0x38,0x32,0x30,0x39,0x32, - 0x32,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x29,0x20,0x2a,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x28,0x5f,0x33,0x33,0x34,0x2e,0x73,0x63,0x72,0x65,0x65,0x6e,0x5f,0x68,0x29, - 0x29,0x29,0x20,0x2d,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72, - 0x64,0x2e,0x79,0x29,0x29,0x29,0x2c,0x20,0x30,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61, - 0x74,0x34,0x28,0x5f,0x35,0x39,0x39,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, + 0x35,0x2c,0x20,0x30,0x2e,0x36,0x39,0x39,0x39,0x39,0x39,0x39,0x38,0x38,0x30,0x37, + 0x39,0x30,0x37,0x31,0x30,0x34,0x34,0x39,0x32,0x31,0x38,0x37,0x35,0x2c,0x20,0x30, + 0x2e,0x35,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78,0x28,0x30,0x2e,0x38,0x30,0x30,0x30, + 0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37, + 0x38,0x31,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x68,0x61,0x73,0x68,0x31, + 0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c,0x73, 0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36, - 0x32,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x69,0x6e,0x2e,0x69,0x64, - 0x78,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x36,0x32,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30, - 0x30,0x37,0x38,0x31,0x32,0x35,0x20,0x2a,0x20,0x5f,0x36,0x32,0x30,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x20,0x5f,0x36,0x32,0x34,0x20,0x3d,0x20,0x72,0x61,0x6e,0x64,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20, - 0x5f,0x36,0x32,0x37,0x20,0x3d,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x61,0x78, - 0x28,0x30,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x32,0x34,0x20,0x2d,0x20,0x6d,0x69,0x78, - 0x28,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x2c,0x20,0x63,0x6f,0x61,0x73,0x74, - 0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x61,0x6e,0x64,0x20, - 0x3d,0x20,0x5f,0x36,0x32,0x37,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x37,0x33,0x36,0x20, - 0x3d,0x20,0x72,0x75,0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x5f,0x37,0x33,0x36,0x2e, - 0x78,0x20,0x3d,0x20,0x5f,0x37,0x33,0x36,0x2e,0x78,0x20,0x2b,0x20,0x28,0x28,0x73, - 0x69,0x6e,0x28,0x5f,0x32,0x30,0x37,0x2e,0x74,0x69,0x6d,0x65,0x20,0x2a,0x20,0x31, - 0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x34,0x37,0x36,0x38,0x33,0x37,0x31,0x35, - 0x38,0x32,0x30,0x33,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x33,0x28,0x30,0x2e,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33,0x39,0x30,0x36,0x32, + 0x35,0x2c,0x20,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32, + 0x30,0x39,0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x30, + 0x2e,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39,0x32,0x38, + 0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x6d,0x69,0x78, + 0x28,0x30,0x2e,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x39,0x32,0x30,0x39, + 0x32,0x38,0x39,0x35,0x35,0x30,0x37,0x38,0x31,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30, + 0x2c,0x20,0x68,0x61,0x73,0x68,0x31,0x32,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31, + 0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x7d,0x0a,0x7d,0x0a,0x0a,0x73,0x74,0x61,0x74,0x69,0x63,0x20,0x69,0x6e, + 0x6c,0x69,0x6e,0x65,0x20,0x5f,0x5f,0x61,0x74,0x74,0x72,0x69,0x62,0x75,0x74,0x65, + 0x5f,0x5f,0x28,0x28,0x61,0x6c,0x77,0x61,0x79,0x73,0x5f,0x69,0x6e,0x6c,0x69,0x6e, + 0x65,0x29,0x29,0x0a,0x69,0x6e,0x74,0x20,0x73,0x69,0x67,0x6e,0x32,0x28,0x74,0x68, + 0x72,0x65,0x61,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x26,0x20,0x78,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x78, + 0x20,0x3c,0x20,0x30,0x2e,0x30,0x29,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x2d,0x31,0x3b, + 0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72, + 0x6e,0x20,0x31,0x3b,0x0a,0x7d,0x0a,0x0a,0x66,0x72,0x61,0x67,0x6d,0x65,0x6e,0x74, + 0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6d,0x61,0x69,0x6e,0x30, + 0x28,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x69,0x6e,0x20,0x69,0x6e,0x20,0x5b,0x5b,0x73, + 0x74,0x61,0x67,0x65,0x5f,0x69,0x6e,0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74, + 0x61,0x6e,0x74,0x20,0x70,0x6c,0x61,0x6e,0x65,0x5f,0x64,0x61,0x74,0x61,0x26,0x20, + 0x5f,0x31,0x34,0x35,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x30,0x29, + 0x5d,0x5d,0x2c,0x20,0x63,0x6f,0x6e,0x73,0x74,0x61,0x6e,0x74,0x20,0x70,0x6c,0x61, + 0x6e,0x65,0x5f,0x77,0x6f,0x72,0x6c,0x64,0x5f,0x63,0x6f,0x6e,0x66,0x69,0x67,0x26, + 0x20,0x5f,0x33,0x31,0x33,0x20,0x5b,0x5b,0x62,0x75,0x66,0x66,0x65,0x72,0x28,0x31, + 0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78,0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66, + 0x6c,0x6f,0x61,0x74,0x3e,0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x20,0x5b,0x5b,0x74, + 0x65,0x78,0x74,0x75,0x72,0x65,0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x74,0x65,0x78, + 0x74,0x75,0x72,0x65,0x32,0x64,0x3c,0x66,0x6c,0x6f,0x61,0x74,0x3e,0x20,0x67,0x72, + 0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x20,0x5b,0x5b,0x74,0x65,0x78,0x74,0x75,0x72, + 0x65,0x28,0x31,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20, + 0x72,0x65,0x66,0x73,0x6d,0x70,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72, + 0x28,0x30,0x29,0x5d,0x5d,0x2c,0x20,0x73,0x61,0x6d,0x70,0x6c,0x65,0x72,0x20,0x67, + 0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x20,0x5b,0x5b,0x73,0x61,0x6d,0x70,0x6c, + 0x65,0x72,0x28,0x31,0x29,0x5d,0x5d,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20, + 0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x20,0x5b,0x5b,0x70, + 0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x5d,0x5d,0x29,0x0a,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x6d,0x61,0x69,0x6e,0x30,0x5f,0x6f,0x75,0x74,0x20,0x6f,0x75,0x74,0x20,0x3d, + 0x20,0x7b,0x7d,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20, + 0x5f,0x32,0x32,0x30,0x20,0x3d,0x20,0x72,0x6f,0x75,0x6e,0x64,0x28,0x69,0x6e,0x2e, + 0x70,0x6f,0x73,0x20,0x2a,0x20,0x31,0x36,0x2e,0x30,0x29,0x20,0x2a,0x20,0x66,0x6c, + 0x6f,0x61,0x74,0x34,0x28,0x30,0x2e,0x30,0x36,0x32,0x35,0x29,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32,0x20,0x5f,0x32,0x33,0x35,0x20,0x3d,0x20, + 0x5f,0x32,0x32,0x30,0x2e,0x78,0x7a,0x20,0x2d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x32, + 0x28,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x5f,0x32,0x32,0x30,0x2e,0x78,0x29,0x20,0x2b, + 0x20,0x30,0x2e,0x35,0x2c,0x20,0x66,0x6c,0x6f,0x6f,0x72,0x28,0x5f,0x32,0x32,0x30, + 0x2e,0x7a,0x29,0x20,0x2b,0x20,0x30,0x2e,0x35,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f,0x32,0x33,0x39,0x20,0x3d,0x20,0x5f,0x32,0x33, + 0x35,0x2e,0x78,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, + 0x32,0x34,0x35,0x20,0x3d,0x20,0x5f,0x32,0x33,0x35,0x2e,0x79,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x20,0x3d, + 0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x32,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x33,0x20,0x3d,0x20,0x5f,0x32,0x33, + 0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x34,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x35,0x20, + 0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61, + 0x72,0x61,0x6d,0x5f,0x33,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f, + 0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x20,0x3d,0x20,0x30,0x2e,0x30, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x37,0x20,0x3d,0x20,0x5f,0x32,0x34,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x38,0x20,0x3d, + 0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x20,0x3d,0x20,0x30,0x2e,0x30,0x3b,0x0a, + 0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x31,0x30,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32, + 0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x37,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x31,0x20,0x3d, + 0x20,0x5f,0x32,0x33,0x39,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74, + 0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x32,0x20,0x3d,0x20,0x5f,0x32,0x34,0x35, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x31,0x33,0x20,0x3d,0x20,0x5f,0x32,0x32,0x30,0x3b,0x0a,0x20,0x20, + 0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x34, + 0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x31,0x31,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x35,0x20,0x3d,0x20, + 0x66,0x6c,0x6f,0x61,0x74,0x28,0x73,0x69,0x67,0x6e,0x32,0x28,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x32,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61, + 0x74,0x33,0x20,0x5f,0x32,0x39,0x37,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33, + 0x28,0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x32,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38, + 0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x61, + 0x62,0x73,0x28,0x5f,0x32,0x33,0x39,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29, + 0x3b,0x0a,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x20,0x5f,0x33,0x30, + 0x34,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75, + 0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f, + 0x38,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x39,0x2c,0x20,0x70,0x61,0x72,0x61, + 0x6d,0x5f,0x31,0x30,0x2c,0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x2c,0x20,0x72,0x65, + 0x66,0x73,0x6d,0x70,0x2c,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f, + 0x72,0x64,0x2c,0x20,0x5f,0x31,0x34,0x35,0x2c,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64, + 0x74,0x65,0x78,0x2c,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x29,0x2c, + 0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70, + 0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x33,0x2c,0x20,0x70,0x61,0x72, + 0x61,0x6d,0x5f,0x31,0x34,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x35,0x2c, + 0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x2c,0x20,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c, + 0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2c,0x20,0x5f, + 0x31,0x34,0x35,0x2c,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x2c,0x20, + 0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x29,0x2c,0x20,0x5f,0x32,0x39,0x37, + 0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x33,0x31,0x33,0x2e, + 0x70,0x6c,0x61,0x6e,0x65,0x54,0x79,0x70,0x65,0x20,0x3d,0x3d,0x20,0x31,0x29,0x0a, + 0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75, + 0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66, + 0x6c,0x6f,0x61,0x74,0x34,0x28,0x6d,0x69,0x78,0x28,0x6d,0x69,0x78,0x28,0x67,0x65, + 0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73,0x61,0x6d,0x70,0x6c,0x65,0x28, + 0x70,0x61,0x72,0x61,0x6d,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x31,0x2c,0x20, + 0x70,0x61,0x72,0x61,0x6d,0x5f,0x32,0x2c,0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x2c, + 0x20,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c,0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67, + 0x43,0x6f,0x6f,0x72,0x64,0x2c,0x20,0x5f,0x31,0x34,0x35,0x2c,0x20,0x67,0x72,0x6f, + 0x75,0x6e,0x64,0x74,0x65,0x78,0x2c,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d, + 0x70,0x29,0x2c,0x20,0x67,0x65,0x74,0x5f,0x67,0x72,0x6f,0x75,0x6e,0x64,0x5f,0x73, + 0x61,0x6d,0x70,0x6c,0x65,0x28,0x70,0x61,0x72,0x61,0x6d,0x5f,0x34,0x2c,0x20,0x70, + 0x61,0x72,0x61,0x6d,0x5f,0x35,0x2c,0x20,0x70,0x61,0x72,0x61,0x6d,0x5f,0x36,0x2c, + 0x20,0x72,0x65,0x66,0x74,0x65,0x78,0x2c,0x20,0x72,0x65,0x66,0x73,0x6d,0x70,0x2c, + 0x20,0x67,0x6c,0x5f,0x46,0x72,0x61,0x67,0x43,0x6f,0x6f,0x72,0x64,0x2c,0x20,0x5f, + 0x31,0x34,0x35,0x2c,0x20,0x67,0x72,0x6f,0x75,0x6e,0x64,0x74,0x65,0x78,0x2c,0x20, + 0x67,0x72,0x6f,0x75,0x6e,0x64,0x73,0x6d,0x70,0x29,0x2c,0x20,0x5f,0x32,0x39,0x37, + 0x29,0x2c,0x20,0x5f,0x33,0x30,0x34,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x33,0x28, + 0x73,0x6d,0x6f,0x6f,0x74,0x68,0x73,0x74,0x65,0x70,0x28,0x30,0x2e,0x32,0x30,0x30, 0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37, - 0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x20,0x2a,0x20,0x5f,0x36,0x32,0x31,0x29, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x72,0x75, - 0x6f,0x68,0x6f,0x6b,0x65,0x73,0x6b,0x75,0x73,0x20,0x3d,0x20,0x5f,0x37,0x33,0x36, - 0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x62,0x6f, - 0x6f,0x6c,0x20,0x5f,0x36,0x34,0x37,0x20,0x3d,0x20,0x69,0x6e,0x2e,0x69,0x64,0x78, - 0x20,0x3e,0x20,0x30,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x34,0x37,0x20,0x26,0x26,0x20,0x28,0x5f, - 0x36,0x32,0x37,0x20,0x3c,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31, - 0x32,0x35,0x29,0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x5f,0x66,0x72,0x61,0x67,0x6d, - 0x65,0x6e,0x74,0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x62,0x6f,0x6f,0x6c,0x20,0x5f,0x36,0x36,0x36,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x34,0x37, - 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x5f,0x36,0x36,0x36,0x20,0x3d,0x20,0x28,0x28,0x72,0x61,0x6e,0x64,0x20,0x2d,0x20, - 0x5f,0x36,0x32,0x31,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x20,0x3c,0x20,0x6c, - 0x65,0x6e,0x67,0x74,0x68,0x28,0x5f,0x37,0x33,0x36,0x20,0x2d,0x20,0x5f,0x37,0x35, - 0x36,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c, - 0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x5f,0x36,0x36,0x36,0x20,0x3d,0x20,0x5f,0x36,0x34,0x37,0x3b,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x69,0x66,0x20,0x28,0x5f,0x36,0x36,0x36, - 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b,0x0a, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x64,0x69,0x73,0x63,0x61,0x72,0x64,0x5f,0x66,0x72,0x61,0x67,0x6d,0x65,0x6e,0x74, - 0x28,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x7d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c, - 0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7b, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x69,0x66,0x20,0x28,0x69,0x6e,0x2e,0x69,0x64,0x78,0x20,0x3d,0x3d,0x20,0x30, - 0x29,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67, - 0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28,0x66,0x6c,0x6f, - 0x61,0x74,0x34,0x28,0x5f,0x33,0x39,0x37,0x20,0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20, - 0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33, - 0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x20,0x2b,0x20,0x28, - 0x5f,0x33,0x39,0x30,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30, - 0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33, - 0x31,0x32,0x35,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x31,0x34,0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35, - 0x36,0x32,0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x5f,0x34,0x37,0x36,0x2c, - 0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x63,0x6f,0x61,0x73,0x74,0x5f,0x6d,0x75, - 0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x65,0x6c, - 0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x66,0x6c,0x6f,0x61,0x74,0x20,0x5f, - 0x37,0x31,0x31,0x20,0x3d,0x20,0x28,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e, - 0x30,0x31,0x35,0x36,0x32,0x35,0x29,0x20,0x2b,0x20,0x30,0x2e,0x34,0x30,0x30,0x30, - 0x30,0x30,0x30,0x30,0x35,0x39,0x36,0x30,0x34,0x36,0x34,0x34,0x37,0x37,0x35,0x33, - 0x39,0x30,0x36,0x32,0x35,0x3b,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66, - 0x72,0x61,0x67,0x5f,0x63,0x6f,0x6c,0x6f,0x72,0x20,0x3d,0x20,0x6d,0x69,0x78,0x28, - 0x6d,0x69,0x78,0x28,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x33,0x39,0x37,0x20, - 0x2a,0x20,0x30,0x2e,0x35,0x2c,0x20,0x66,0x61,0x73,0x74,0x3a,0x3a,0x6d,0x69,0x6e, - 0x28,0x31,0x2e,0x30,0x2c,0x20,0x5f,0x36,0x32,0x31,0x20,0x2b,0x20,0x30,0x2e,0x32, - 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32,0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33, - 0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x29,0x20,0x2b,0x20,0x28,0x5f,0x33, - 0x39,0x30,0x20,0x2a,0x20,0x30,0x2e,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x32, - 0x39,0x38,0x30,0x32,0x33,0x32,0x32,0x33,0x38,0x37,0x36,0x39,0x35,0x33,0x31,0x32, - 0x35,0x29,0x2c,0x20,0x30,0x2e,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x34, - 0x39,0x30,0x31,0x31,0x36,0x31,0x31,0x39,0x33,0x38,0x34,0x37,0x36,0x35,0x36,0x32, - 0x35,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28, - 0x5f,0x36,0x32,0x31,0x2c,0x20,0x5f,0x36,0x32,0x30,0x20,0x2a,0x20,0x30,0x2e,0x30, - 0x30,0x32,0x33,0x34,0x33,0x37,0x35,0x30,0x30,0x39,0x33,0x31,0x33,0x32,0x32,0x35, - 0x37,0x34,0x36,0x31,0x35,0x34,0x37,0x38,0x35,0x31,0x35,0x36,0x32,0x35,0x2c,0x20, - 0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e,0x30,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74, - 0x34,0x28,0x6e,0x6f,0x69,0x73,0x65,0x76,0x61,0x6c,0x5f,0x70,0x6c,0x61,0x6e,0x74, - 0x74,0x69,0x29,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x37,0x31, - 0x31,0x2c,0x20,0x5f,0x37,0x31,0x31,0x2c,0x20,0x30,0x2e,0x30,0x2c,0x20,0x31,0x2e, - 0x30,0x29,0x2c,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x63,0x6f,0x61,0x73,0x74, - 0x5f,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x69,0x65,0x72,0x29,0x29,0x3b,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d, - 0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, - 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, + 0x36,0x39,0x35,0x33,0x31,0x32,0x35,0x2c,0x20,0x30,0x2e,0x35,0x2c,0x20,0x61,0x62, + 0x73,0x28,0x5f,0x32,0x34,0x35,0x29,0x29,0x20,0x2a,0x20,0x30,0x2e,0x35,0x29,0x29, + 0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20,0x20, + 0x20,0x20,0x65,0x6c,0x73,0x65,0x0a,0x20,0x20,0x20,0x20,0x7b,0x0a,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x6f,0x75,0x74,0x2e,0x66,0x72,0x61,0x67,0x5f,0x63,0x6f, + 0x6c,0x6f,0x72,0x20,0x3d,0x20,0x66,0x6c,0x6f,0x61,0x74,0x34,0x28,0x5f,0x33,0x30, + 0x34,0x2c,0x20,0x31,0x2e,0x30,0x29,0x3b,0x0a,0x20,0x20,0x20,0x20,0x7d,0x0a,0x20, 0x20,0x20,0x20,0x72,0x65,0x74,0x75,0x72,0x6e,0x20,0x6f,0x75,0x74,0x3b,0x0a,0x7d, 0x0a,0x0a,0x00, ]; @@ -2462,49 +1329,49 @@ plane_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.uniform_blocks[1].size = 144; desc.uniform_blocks[1].glsl_uniforms[0].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_207.skyBase"; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_313.skyBase"; desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_207.skyTop"; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_313.skyTop"; desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_207.sunDisk"; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_313.sunDisk"; desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_207.horizonHalo"; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_313.horizonHalo"; desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_207.sunHalo"; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_313.sunHalo"; desc.uniform_blocks[1].glsl_uniforms[5].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[5].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_207.sunLightColor"; + desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_313.sunLightColor"; desc.uniform_blocks[1].glsl_uniforms[6].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[6].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_207.sunPosition"; + desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_313.sunPosition"; desc.uniform_blocks[1].glsl_uniforms[7].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[7].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_207.sunIntensity"; + desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_313.sunIntensity"; desc.uniform_blocks[1].glsl_uniforms[8].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[8].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_207.skyIntensity"; + desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_313.skyIntensity"; desc.uniform_blocks[1].glsl_uniforms[9].type = .INT; desc.uniform_blocks[1].glsl_uniforms[9].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_207.hasClouds"; + desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_313.hasClouds"; desc.uniform_blocks[1].glsl_uniforms[10].type = .INT; desc.uniform_blocks[1].glsl_uniforms[10].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_207.hasPlane"; + desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_313.hasPlane"; desc.uniform_blocks[1].glsl_uniforms[11].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[11].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_207.planeHeight"; + desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_313.planeHeight"; desc.uniform_blocks[1].glsl_uniforms[12].type = .INT; desc.uniform_blocks[1].glsl_uniforms[12].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_207.planeType"; + desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_313.planeType"; desc.uniform_blocks[1].glsl_uniforms[13].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[13].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[13].glsl_name = "_207.time"; + desc.uniform_blocks[1].glsl_uniforms[13].glsl_name = "_313.time"; desc.uniform_blocks[1].glsl_uniforms[14].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[14].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[14].glsl_name = "_207.grassDensity"; + desc.uniform_blocks[1].glsl_uniforms[14].glsl_name = "_313.grassDensity"; desc.uniform_blocks[2].stage = .FRAGMENT; desc.uniform_blocks[2].layout = .STD140; desc.uniform_blocks[2].size = 16; @@ -2515,12 +1382,22 @@ plane_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; desc.samplers[0].stage = .FRAGMENT; desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[1].stage = .FRAGMENT; + desc.samplers[1].sampler_type = .FILTERING; desc.image_sampler_pairs[0].stage = .FRAGMENT; desc.image_sampler_pairs[0].image_slot = 0; desc.image_sampler_pairs[0].sampler_slot = 0; desc.image_sampler_pairs[0].glsl_name = "reftex_refsmp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 1; + desc.image_sampler_pairs[1].glsl_name = "groundtex_groundsmp"; case .GLES3; desc.vertex_func.source = xx *vs_plane_source_glsl300es; desc.vertex_func.entry = "main"; @@ -2539,49 +1416,49 @@ plane_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.uniform_blocks[1].size = 144; desc.uniform_blocks[1].glsl_uniforms[0].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[0].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_207.skyBase"; + desc.uniform_blocks[1].glsl_uniforms[0].glsl_name = "_313.skyBase"; desc.uniform_blocks[1].glsl_uniforms[1].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[1].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_207.skyTop"; + desc.uniform_blocks[1].glsl_uniforms[1].glsl_name = "_313.skyTop"; desc.uniform_blocks[1].glsl_uniforms[2].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[2].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_207.sunDisk"; + desc.uniform_blocks[1].glsl_uniforms[2].glsl_name = "_313.sunDisk"; desc.uniform_blocks[1].glsl_uniforms[3].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[3].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_207.horizonHalo"; + desc.uniform_blocks[1].glsl_uniforms[3].glsl_name = "_313.horizonHalo"; desc.uniform_blocks[1].glsl_uniforms[4].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[4].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_207.sunHalo"; + desc.uniform_blocks[1].glsl_uniforms[4].glsl_name = "_313.sunHalo"; desc.uniform_blocks[1].glsl_uniforms[5].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[5].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_207.sunLightColor"; + desc.uniform_blocks[1].glsl_uniforms[5].glsl_name = "_313.sunLightColor"; desc.uniform_blocks[1].glsl_uniforms[6].type = .FLOAT3; desc.uniform_blocks[1].glsl_uniforms[6].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_207.sunPosition"; + desc.uniform_blocks[1].glsl_uniforms[6].glsl_name = "_313.sunPosition"; desc.uniform_blocks[1].glsl_uniforms[7].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[7].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_207.sunIntensity"; + desc.uniform_blocks[1].glsl_uniforms[7].glsl_name = "_313.sunIntensity"; desc.uniform_blocks[1].glsl_uniforms[8].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[8].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_207.skyIntensity"; + desc.uniform_blocks[1].glsl_uniforms[8].glsl_name = "_313.skyIntensity"; desc.uniform_blocks[1].glsl_uniforms[9].type = .INT; desc.uniform_blocks[1].glsl_uniforms[9].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_207.hasClouds"; + desc.uniform_blocks[1].glsl_uniforms[9].glsl_name = "_313.hasClouds"; desc.uniform_blocks[1].glsl_uniforms[10].type = .INT; desc.uniform_blocks[1].glsl_uniforms[10].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_207.hasPlane"; + desc.uniform_blocks[1].glsl_uniforms[10].glsl_name = "_313.hasPlane"; desc.uniform_blocks[1].glsl_uniforms[11].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[11].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_207.planeHeight"; + desc.uniform_blocks[1].glsl_uniforms[11].glsl_name = "_313.planeHeight"; desc.uniform_blocks[1].glsl_uniforms[12].type = .INT; desc.uniform_blocks[1].glsl_uniforms[12].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_207.planeType"; + desc.uniform_blocks[1].glsl_uniforms[12].glsl_name = "_313.planeType"; desc.uniform_blocks[1].glsl_uniforms[13].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[13].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[13].glsl_name = "_207.time"; + desc.uniform_blocks[1].glsl_uniforms[13].glsl_name = "_313.time"; desc.uniform_blocks[1].glsl_uniforms[14].type = .FLOAT; desc.uniform_blocks[1].glsl_uniforms[14].array_count = 0; - desc.uniform_blocks[1].glsl_uniforms[14].glsl_name = "_207.grassDensity"; + desc.uniform_blocks[1].glsl_uniforms[14].glsl_name = "_313.grassDensity"; desc.uniform_blocks[2].stage = .FRAGMENT; desc.uniform_blocks[2].layout = .STD140; desc.uniform_blocks[2].size = 16; @@ -2592,12 +1469,22 @@ plane_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; desc.samplers[0].stage = .FRAGMENT; desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[1].stage = .FRAGMENT; + desc.samplers[1].sampler_type = .FILTERING; desc.image_sampler_pairs[0].stage = .FRAGMENT; desc.image_sampler_pairs[0].image_slot = 0; desc.image_sampler_pairs[0].sampler_slot = 0; desc.image_sampler_pairs[0].glsl_name = "reftex_refsmp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 1; + desc.image_sampler_pairs[1].glsl_name = "groundtex_groundsmp"; case .METAL_MACOS; desc.vertex_func.source = xx *vs_plane_source_metal_macos; desc.vertex_func.entry = "main0"; @@ -2611,22 +1498,33 @@ plane_shader_desc :: (backend: sg_backend) -> sg_shader_desc { desc.uniform_blocks[1].stage = .FRAGMENT; desc.uniform_blocks[1].layout = .STD140; desc.uniform_blocks[1].size = 144; - desc.uniform_blocks[1].msl_buffer_n = 0; + desc.uniform_blocks[1].msl_buffer_n = 1; desc.uniform_blocks[2].stage = .FRAGMENT; desc.uniform_blocks[2].layout = .STD140; desc.uniform_blocks[2].size = 16; - desc.uniform_blocks[2].msl_buffer_n = 1; + desc.uniform_blocks[2].msl_buffer_n = 0; desc.images[0].stage = .FRAGMENT; desc.images[0].multisampled = false; desc.images[0].image_type = ._2D; desc.images[0].sample_type = .FLOAT; desc.images[0].msl_texture_n = 0; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[1].msl_texture_n = 1; desc.samplers[0].stage = .FRAGMENT; desc.samplers[0].sampler_type = .FILTERING; desc.samplers[0].msl_sampler_n = 0; + desc.samplers[1].stage = .FRAGMENT; + desc.samplers[1].sampler_type = .FILTERING; + desc.samplers[1].msl_sampler_n = 1; desc.image_sampler_pairs[0].stage = .FRAGMENT; desc.image_sampler_pairs[0].image_slot = 0; desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 1; } return desc; } diff --git a/src/shaders/shader_plane.glsl b/src/shaders/shader_plane.glsl index da391ec..563f574 100644 --- a/src/shaders/shader_plane.glsl +++ b/src/shaders/shader_plane.glsl @@ -13,7 +13,7 @@ out flat int idx; void main() { vec3 multisize = vec3(position.xyz * 1000.0); - gl_Position = mvp * (vec4(multisize.x, 0.0 + float(gl_InstanceIndex) * 0.006, multisize.z, 1.0)); + gl_Position = mvp * vec4(multisize, 1.0); pos = vec4(multisize, 1.0); idx = gl_InstanceIndex; } @@ -68,18 +68,9 @@ layout(binding=2) uniform plane_data { }; layout(binding = 0) uniform texture2D reftex; -layout(binding = 2) uniform texture2D groundtex; +layout(binding = 1) uniform texture2D groundtex; layout(binding = 0) uniform sampler refsmp; - -#define hash(p) fract(sin(dot(p, vec2(11.9898, 78.233))) * 43758.5453) - -float B(vec2 U) { - float v = hash( U + vec2(-1, 0) ) - + hash( U + vec2( 1, 0) ) - + hash( U + vec2( 0, 1) ) - + hash( U + vec2( 0,-1) ); - return hash(U) - v/4. + .5; -} +layout(binding = 1) uniform sampler groundsmp; float random (vec2 st) { return fract(sin(dot(st.xy, @@ -108,135 +99,56 @@ float noise (vec2 st) { (d - b) * u.x * u.y; } -vec3 wave(vec4 wave, vec3 p, inout vec3 tangent, inout vec3 binormal) { - float steepness = wave.z; - float wavelength = wave.w; - float k = 2.0 * 3.141 / wavelength; - float c = 2.0; - vec2 d = normalize(vec2(wave.x, wave.y)); - float f = k * (dot(d, p.xz) - c * (time * 0.1)); - float a = steepness / k; - - tangent += vec3( - -d.x * d.x * (steepness * sin(f)), - d.x * (steepness * cos(f)), - -d.x * d.y * (steepness * sin(f)) - ); +int sign2(float x) { + if(x < 0) return -1; + return 1; +} + +vec3 get_ground_sample(vec4 pos, float dirX, float dirY) { + ivec2 plane_coord = ivec2(floor(pos.x + dirX) + 500, floor(pos.z + dirY) + 500); + vec4 reflection = texelFetch(sampler2D(reftex, refsmp), ivec2(gl_FragCoord.x, screen_h - gl_FragCoord.y), 0); + vec4 groundSample = texelFetch(sampler2D(groundtex, groundsmp), plane_coord, 0); - binormal += vec3( - -d.x * d.y * (steepness * sin(f)), - d.y * (steepness * cos(f)), - -d.y * d.y * (steepness * sin(f)) - ); - - return vec3( - d.x * (a * cos(f)), - a * sin(f), - d.y * (a * cos(f)) - ); + // Calculate all materials so we can blend them. + vec3 water = reflection.xyz * vec3(0.0, 0.8, 0.8); + vec3 sand = vec3(mix(0.8, 1.0, hash12(pos.xz)) * vec3(0.8, 0.7, 0.5)); + vec3 grass = vec3(mix(0.8, 1.0, hash12(pos.xz)) * vec3(0.4, 0.8, 0.3)); + + if(groundSample.b == 1.0) { + return water; + } else if(groundSample.r == 1.0) { + return sand; + } else { + return grass; + } } void main() { + vec4 npos = round(pos * 16.0) / 16.0; + vec2 tileCenter = vec2(floor(npos.x) + 0.5, floor(npos.z) + 0.5); + vec2 toCenter = npos.xz - tileCenter; + // Bilinear filtering + float u = smoothstep(0.2, 0.5, abs(toCenter.x)) * 0.5; + float v = smoothstep(0.2, 0.5, abs(toCenter.y)) * 0.5; + + // @ToDo: We should implement some sort of fog system and stop doing all this sampling + // stuff if we are far enough from the camera. Currently ground rendering is taking way + // too much time each frame. + vec3 c0 = get_ground_sample(npos, 0.0, 0.0); + vec3 c1 = get_ground_sample(npos, sign2(toCenter.x), 0.0); + vec3 c2 = get_ground_sample(npos, 0.0, sign2(toCenter.y)); + vec3 c3 = get_ground_sample(npos, sign2(toCenter.x), sign2(toCenter.y)); + + // @ToDo: Consider using cool Inigo Quilez trick here to make it even smoother. + vec3 b01 = mix(c0, c1, u); + vec3 b23 = mix(c2, c3, u); + vec3 bf = mix(b01, b23, v); + if(planeType == 1) { - vec4 reflection = texelFetch(sampler2D(reftex, refsmp), ivec2(gl_FragCoord.x, screen_h - gl_FragCoord.y), 0); - frag_color = reflection * vec4(0.9, 0.9, 1.0, 1.0); + frag_color = vec4(bf, 1.0); } else { - float density = grassDensity; - - vec2 densifiedCoordinate = pos.xz * density; - densifiedCoordinate.x += sin(densifiedCoordinate.y) * 0.5; - densifiedCoordinate.y += sin(densifiedCoordinate.x) * 0.5; - vec2 ruohokeskus = round(densifiedCoordinate); - - float noiseval_fine = noise(densifiedCoordinate / 50.0); - float noiseval_coarse = noise(densifiedCoordinate / 500.0); - float noiseval_plantti = noise(densifiedCoordinate / 500.0); - if(noiseval_plantti < 0.9) { - noiseval_plantti = 0.0; - } else { - noiseval_plantti = (noiseval_plantti - 0.9) * 10.0; - } - - float noiseval_vesi = noise(densifiedCoordinate.yx / 700.0); - int is_water = 0; - float is_water_coast = 1.0; - float coast_multiplier = 0.0; - if(noiseval_vesi > 0.9) { - is_water = 1; - if(noiseval_vesi < 0.93) { - is_water_coast = (noiseval_vesi - 0.9) * 33.333; - } - } - if(noiseval_vesi > 0.8) { - coast_multiplier = (noiseval_vesi - 0.8) * 10; - } - - float rand = (hash12(ruohokeskus)) - 0.4; - rand += 0.4 * noiseval_coarse; - vec2 sandDensifiedCoordinate = round(pos.xz * density * 10.0); - float sand_rand = (hash12(sandDensifiedCoordinate)); - vec4 sandcolor = vec4(mix(0.8, 1.0, sand_rand) * vec3(0.8, 0.7, 0.5), 1.0); - if(is_water == 1) { - vec3 tangent = vec3(1.0, 0.0, 0.0); - vec3 binormal = vec3(0.0, 0.0, 1.0); - vec3 p = vec3(0.0); - p += wave(vec4(1.0, 0.5, 0.1, 0.9), pos.xyz, tangent, binormal); - vec3 normal = normalize(cross(normalize(binormal), normalize(tangent))); - - vec2 rippleOffset = normal.xz * 0.005; - rippleOffset.x = clamp(rippleOffset.x, -0.01, 0.01); - rippleOffset.y = clamp(rippleOffset.y, -0.01, 0.01); - vec3 light = normalize(sunPosition); - - float lightfactor = max(dot(light, normal),0.0); - lightfactor = min(max(lightfactor, 0.1), 1.0); - // float spec = max(dot(normalize(light + normalize(cv - fragWorldPos)), normal), 0.0); - // spec -= 0.9; - // spec = max(spec, 0.0); - // spec *= 4.0; - // vec3 specLight = spec * sunIntensity * sunColor.xyz; - vec3 diffLight = lightfactor * sunIntensity * sunLightColor.xyz * 0.1; - // vec3 totalLight = (specLight + diffLight); - - - if(idx > 0 || is_reflection_pass == 1) discard; - vec4 reflection = texelFetch(sampler2D(reftex, refsmp), ivec2(gl_FragCoord.x + int(rippleOffset.x * screen_w), screen_h + int(rippleOffset.y * screen_h) - gl_FragCoord.y), 0); - frag_color = vec4(min(vec3(1.0), vec3(mix(1.0, 0.8, smoothstep(0.0, 0.9, is_water_coast))) + diffLight), 1.0) * mix(sandcolor, reflection, smoothstep(0.0, 0.9, is_water_coast)); - // frag_color = reflection; - } else { - float h = (1.0 / 128.0) * idx; - - - rand -= mix(0.0, 1.0, coast_multiplier); - rand = max(0.0, rand); - - ruohokeskus.x += sin(time * 1.2) * 0.2 * h; - - float distanceFromCenter = length(ruohokeskus - (densifiedCoordinate)); - - - if(idx > 0 && rand < 0.2) { - discard; - } - - - float thickness = 0.5; - - - if(idx > 0 && (rand - h) * thickness < distanceFromCenter) { - discard; - } else { - if(idx == 0) { - frag_color = mix(vec4(noiseval_coarse * 0.5, 0.2 + noiseval_fine * 0.2, 0.1, 1.0),sandcolor,coast_multiplier); - } else { - vec4 grass_color = vec4(noiseval_coarse * 0.5, min(1.0, h + 0.2) + noiseval_fine * 0.2, 0.1, 1.0); - vec4 plantti_color = vec4(h, h * 0.3, 0.0, 1.0); - vec4 normal_ground_color = mix(grass_color, plantti_color, noiseval_plantti); - frag_color = mix(normal_ground_color, vec4(h * 2.0 + 0.4, h * 2.0 + 0.4, 0.0, 1.0), coast_multiplier); - } - } - } + frag_color = vec4(b23, 1.0); } } @end diff --git a/src/trile.jai b/src/trile.jai index 617b31b..de35b2a 100644 --- a/src/trile.jai +++ b/src/trile.jai @@ -197,6 +197,7 @@ material_from_rgba :: (r: u8, g: u8, b: u8, a: u8) -> Material { draw_trile_picker :: (theme: *GR.Overall_Theme) { r := GR.get_rect(ui_w(85,85), ui_h(5,0), ui_w(15, 15), ui_h(95, 0)); + ui_add_mouse_occluder(r); draw_bg_rectangle(r, theme); tpt := get_trile_table_ptr(); r.h = ui_h(4,4); diff --git a/src/ui/ui.jai b/src/ui/ui.jai index 4a31e61..6a0df12 100644 --- a/src/ui/ui.jai +++ b/src/ui/ui.jai @@ -86,6 +86,34 @@ defaultFont: Font; ui_texture_counter : u32 = 0; +#scope_file + +ui_mouse_occluders : [..]GR.Rect; + +#scope_export + +ui_add_mouse_occluder :: (r: GR.Rect) { + array_add(*ui_mouse_occluders, r); +} + +ui_clear_mouse_occluders :: () { + array_reset_keeping_memory(*ui_mouse_occluders); +} + +ui_is_mouse_in_occluder :: (mpos: Vector2) -> bool { + for ui_mouse_occluders { + if (mpos.x >= it.x && mpos.x <= it.x + it.w && mpos.y >= it.y && mpos.y <= it.y + it.h) { + return true; + }; + } + return false; +} + +get_mouse_state :: (kc: Key_Code) -> Key_Current_State { + if ui_is_mouse_in_occluder(.{input_mouse_x, input_mouse_y}) then return .NONE; + return input_button_states[kc]; +} + texture_load_from_memory :: (texture: *Ui_Texture, memory: []u8, srgb: bool, build_mipmaps: bool) -> bool { x : s32; y : s32; @@ -158,14 +186,17 @@ prepare_text :: (font: *Ui_Type_Indicator.Font, text: string, effects: Ui_Type_I gPreppedTextWidth = 0; return 0; } + // print("Font: %\n", font); fonsSetFont(state.fons, state.font_default.fons_font); fonsSetSize(state.fons, xx font.character_height); w := fonsTextBounds(state.fons, 0.0, 0.0, text.data, text.data + text.count, null); gPreppedText = text; gPreppedTextWidth = cast(s32) w; - array_reset(*font.temporary_glyphs); - array_reset(*font.temporary_glyphs_byte_offsets); + // @Memory: there is a bug if we actually free these during subwindow popup draw. + // I'm not completely sure why, but it should be fine/better if we just reset keeping memory. + array_reset_keeping_memory(*font.temporary_glyphs); + array_reset_keeping_memory(*font.temporary_glyphs_byte_offsets); font.temporary_glyphs_width_in_pixels = 0; diff --git a/src/world.jai b/src/world.jai index 9f618eb..59f3cf1 100644 --- a/src/world.jai +++ b/src/world.jai @@ -14,9 +14,9 @@ World_Config :: struct { hasPlane : s32 = 0; @Slider,0,1,1 planeHeight : float = 0.0; @Slider,-100,100,1 - planeType : s32 = 0; @Slider,0,1,1 + planeType : s32 = 1; @Slider,0,1,1 - grassDensity : float = 30; @Slider,10,100,1 + grassDensity : float = 200; @Slider,10,300,1 } // Copies over all the fields of our world config into a given shader type. @@ -43,6 +43,7 @@ TrilePositions :: struct { Ground_Tile :: enum { WATER; GRASS; + SAND; } World :: struct { @@ -70,6 +71,13 @@ update_image_from_ground :: (world: *World, img: *sg_image) { materialdata[counter + 2] = 255; materialdata[counter + 3] = 255; + } + if world.ground[x][y] == .SAND { + materialdata[counter + 0] = 255; + materialdata[counter + 1] = 0; + materialdata[counter + 2] = 0; + materialdata[counter + 3] = 255; + } counter += 4; } diff --git a/walloc.o b/walloc.o deleted file mode 100755 index a3252ccfdb771f972173884a6a973e59f24e2f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2888 zcmb_e&2Jk;6n`_byWY)uZG%*V6p&{3L=QEsI8^F|c%ghqNOhvBLR?%YUD8nJ13PV1 zw05>6jdDSa5QhpRR8*mI313qG06q>J03jhEgt*fa&4B|K2){SGj-66*Vx!EweKYgk z@4feXv!-@$Q4o=ME6XxcXT?AaFwj{dd4p9#B}X&B_sMQx<-76MbC&K#F#YI45EnQTB@lzS@q=k(~eae{y+ zb~mGvb~d!}zq{`sW$$i3&SV;@+@yB3(5i=Y3 zQg~e&Jjn1`D93$y<1aQR!z4X-jsOAPg&QvEX-2N)D?Ei#dm(Uz0>OY`3h<1ESD-B` zACt%4kz`j3L$9a7#!Zx#;%%<>kZs$;*eS9&Ubf^Ig6VO1@!p<76oz2^$U3e@=d=~N z>_`Hx((cP#fB1pekEFI@u@x!2$kTs&^p(=ZHvAV0!K z+6+$4U*1m}#wwxsA}0dpkWZo$253BXuLTk>@_y%&APBetmcZ`XwLF7dE^O2GK2z=K zK$I;s$S9=Hfo+QK{iV)eyQA%yz(UYofh7fVxwTQ-gR!tG%Ped}#n$_g1A5|05{Pp6 zP;DI|+BV*L(@GJ5(>KY%R#slkth9*K5D#wS3>$$M?=?#9rPH%KiWtz#fr}d&Wt`E z4G$d4+j5i?!~M}KdqKuG@@PgMFL=(Q8L52V{}x|Hva#a3G<;&$7jRP>S82aFT>jtY zc$fU<&~2?S`)D!iVt%5Sj~4S(F%RKn#XAAAdEP-YQ3*d!E-Wm~OZOfJIDsD~&SJaM zS)L;)4jG}nnzTCY?tIc(o_#HuTNUz=9&agLTd#JLq_fal?I~&sd8qzU@AAUx-1+)y zd$yC*b7K}Y$&wat6*3sN)+2I-d~79IItLgB9JS__7gySFNT5LNvH{aNpR`w6y@fXt ziE}l-l`Cf3y@aHCagWKMUzJV;4E46c)h!PuD#l>KQL8_=yOwwZh|V*pE>pHNh_pH zA*#28q{^2R4L?;MvZcOg~2 zC}H@4hmTyW{^4PGcfuz6aKfwHDC6xb4D@~3t9%yV?Q0%>4PgAw003@P@cJ_kzwxkF zVLWeF8P6wtJ9{gL?&4h1?TIqPxun-i&K;S(A}TK|FDA3y