diff options
Diffstat (limited to 'dom/canvas/test/webgl-mochitest')
59 files changed, 10232 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/driver-info.js b/dom/canvas/test/webgl-mochitest/driver-info.js new file mode 100644 index 000000000..e2f6e003a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/driver-info.js @@ -0,0 +1,169 @@ +DriverInfo = (function() { + // --------------------------------------------------------------------------- + // Debug info handling + + function defaultInfoFunc(str) { + console.log('Info: ' + str); + } + + var gInfoFunc = defaultInfoFunc; + function setInfoFunc(func) { + gInfoFunc = func; + } + + function info(str) { + gInfoFunc(str); + } + + // --------------------------------------------------------------------------- + // OS and driver identification + // Stolen from dom/canvas/test/webgl/test_webgl_conformance_test_suite.html + function detectDriverInfo() { + try { + var cc = SpecialPowers.Cc; + } catch (e) { + throw 'No SpecialPowers!'; + } + + const Cc = SpecialPowers.Cc; + const Ci = SpecialPowers.Ci; + var doc = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser).parseFromString("<html/>", "text/html"); + + var canvas = doc.createElement("canvas"); + canvas.width = 1; + canvas.height = 1; + + var type = ""; + var gl = null; + try { + gl = canvas.getContext("experimental-webgl"); + } catch(e) {} + + if (!gl) { + info('Failed to create WebGL context for querying driver info.'); + throw 'WebGL failed'; + } + + var ext = gl.getExtension("WEBGL_debug_renderer_info"); + // this extension is unconditionally available to chrome. No need to check. + + var webglRenderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + var webglVendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + return [webglVendor, webglRenderer]; + } + + function detectOSInfo() { + try { + var cc = SpecialPowers.Cc; + } catch (e) { + throw 'No SpecialPowers!'; + } + + const Cc = SpecialPowers.Cc; + const Ci = SpecialPowers.Ci; + + // From reftest.js: + var runtime = Cc['@mozilla.org/xre/app-info;1'].getService(Ci.nsIXULRuntime); + + var os = null; + var version = null; + if (navigator.platform.indexOf('Win') == 0) { + os = OS.WINDOWS; + + // code borrowed from browser/modules/test/browser_taskbar_preview.js + version = SpecialPowers.Services.sysinfo.getProperty('version'); + version = parseFloat(version); + // Version 6.0 is Vista, 6.1 is 7. + + } else if (navigator.platform.indexOf('Mac') == 0) { + os = OS.MAC; + + var versionMatch = /Mac OS X (\d+.\d+)/.exec(navigator.userAgent); + version = versionMatch ? parseFloat(versionMatch[1]) : null; + + } else if (runtime.widgetToolkit == 'gonk') { + os = OS.B2G; + + } else if (navigator.appVersion.indexOf('Android') != -1) { + os = OS.ANDROID; + // From layout/tools/reftest/reftest.js: + version = SpecialPowers.Services.sysinfo.getProperty('version'); + + } else if (navigator.platform.indexOf('Linux') == 0) { + // Must be checked after android, as android also has a 'Linux' platform string. + os = OS.LINUX; + } + + return [os, version]; + } + + var OS = { + WINDOWS: 'windows', + MAC: 'mac', + LINUX: 'linux', + ANDROID: 'android', + B2G: 'b2g', + }; + + var DRIVER = { + MESA: 'mesa', + NVIDIA: 'nvidia', + ANDROID_X86_EMULATOR: 'android x86 emulator', + ANGLE: 'angle', + }; + + var kOS = null; + var kOSVersion = null; + var kDriver = null; + + try { + [kOS, kOSVersion] = detectOSInfo(); + } catch (e) { + // Generally just fails when we don't have SpecialPowers. + } + + try { + var glVendor, glRenderer; + [glVendor, glRenderer] = detectDriverInfo(); + info('GL vendor: ' + glVendor); + info('GL renderer: ' + glRenderer); + + if (glRenderer.includes('llvmpipe')) { + kDriver = DRIVER.MESA; + } else if (glRenderer.includes('Android Emulator')) { + kDriver = DRIVER.ANDROID_X86_EMULATOR; + } else if (glRenderer.includes('ANGLE')) { + kDriver = DRIVER.ANGLE; + } else if (glVendor.includes('NVIDIA')) { + kDriver = DRIVER.NVIDIA; + } + } catch (e) { + // detectDriverInfo is fallible where WebGL fails. + } + + if (kOS) { + info('OS detected as: ' + kOS); + info(' Version: ' + kOSVersion); + } else { + info('OS not detected.'); + info(' `platform`: ' + navigator.platform); + info(' `appVersion`: ' + navigator.appVersion); + info(' `userAgent`: ' + navigator.userAgent); + } + if (kDriver) { + info('GL driver detected as: ' + kDriver); + } else { + info('GL driver not detected.'); + } + + return { + setInfoFunc: setInfoFunc, + + OS: OS, + DRIVER: DRIVER, + getOS: function() { return kOS; }, + getDriver: function() { return kDriver; }, + getOSVersion: function() { return kOSVersion; }, + }; +})(); + diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js new file mode 100644 index 000000000..8d710139f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/ensure-ext.js @@ -0,0 +1,44 @@ +'use strict'; + +function EnsureExt(extName, shouldHave=true) { + EnsureExtFor('webgl', extName, shouldHave); + EnsureExtFor('webgl2', extName, shouldHave); +} + +function EnsureExtFor(contextType, extName, shouldHave=true) { + var c = document.createElement('canvas'); + var gl = c.getContext(contextType); + + if (!gl) { + todo(false, 'Failed to create context: ' + contextType); + return; + } + + var ext = gl.getExtension(extName); + var haveText = ' have ' + contextType + ' extension ' + extName + '.'; + if (shouldHave) { + ok(ext, 'Should' + haveText); + } else { + ok(!ext, 'Should not' + haveText); + } +} + +function Lastly_WithDraftExtsEnabled(func) { + SimpleTest.waitForExplicitFinish(); + + var fnEnsure = function() { + func(); + SimpleTest.finish(); + }; + + if ('SpecialPowers' in window) { + var prefStateList = [ + ['webgl.enable-draft-extensions', true], + ]; + var prefEnv = {'set': prefStateList}; + SpecialPowers.pushPrefEnv(prefEnv, fnEnsure); + } else { + console.log('Couldn\'t use SpecialPowers to enable draft extensions.'); + fnEnsure(); + } +} diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html new file mode 100644 index 000000000..5905539a4 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_ANGLE_instanced_arrays.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'ANGLE_instanced_arrays'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html new file mode 100644 index 000000000..46b135b79 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_blend_minmax.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_blend_minmax'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html new file mode 100644 index 000000000..443c7ab70 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_color_buffer_half_float.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_color_buffer_half_float'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html new file mode 100644 index 000000000..af94cbc65 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_disjoint_timer_query.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_disjoint_timer_query'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html new file mode 100644 index 000000000..9dbac9881 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_frag_depth.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_frag_depth'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html new file mode 100644 index 000000000..cbdde000a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_sRGB.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_sRGB'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html new file mode 100644 index 000000000..c3a51c0c9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_shader_texture_lod.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'EXT_shader_texture_lod'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html new file mode 100644 index 000000000..877c4440b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_EXT_texture_filter_anisotropic.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('EXT_texture_filter_anisotropic'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html new file mode 100644 index 000000000..359726256 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_OES_standard_derivatives.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'OES_standard_derivatives'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html new file mode 100644 index 000000000..9a88b2771 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_color_buffer_float.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_color_buffer_float'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_atc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_atc.html new file mode 100644 index 000000000..6d68f0b4e --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_atc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_atc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_es3.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_es3.html new file mode 100644 index 000000000..9e6ade9f4 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_es3.html @@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +Lastly_WithDraftExtsEnabled(function() { + EnsureExt('WEBGL_compressed_texture_es3'); +}); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html new file mode 100644 index 000000000..327625c01 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_etc1.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_etc1'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html new file mode 100644 index 000000000..c95481398 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_pvrtc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_pvrtc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html new file mode 100644 index 000000000..6ad800110 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_compressed_texture_s3tc.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExt('WEBGL_compressed_texture_s3tc'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html new file mode 100644 index 000000000..6d8a864c0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_depth_texture.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_depth_texture'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html new file mode 100644 index 000000000..068351635 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_WEBGL_draw_buffers.html @@ -0,0 +1,17 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; +EnsureExtFor('webgl', 'WEBGL_draw_buffers'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html new file mode 100644 index 000000000..153161d93 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/ensure-exts/test_common.html @@ -0,0 +1,110 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='ensure-ext.js'></script> + </head> + <body> + <script> + +'use strict'; + +var ENSURE = 'ENSURE'; // Works on all test machines. +var FORBID = 'FORBID'; // Should not work on any test machine. +var MACHINE_SPECIFIC = 'MACHINE_SPECIFIC'; + +var defaultExts = [ + // Ratified + ['ANGLE_instanced_arrays' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_blend_minmax' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_disjoint_timer_query' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['EXT_frag_depth' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_shader_texture_lod' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_texture_filter_anisotropic', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['OES_element_index_uint' , [ENSURE , FORBID ]], + ['OES_standard_derivatives' , [MACHINE_SPECIFIC, FORBID ]], + ['OES_texture_float' , [ENSURE , FORBID ]], + ['OES_texture_float_linear' , [ENSURE , ENSURE ]], + ['OES_texture_half_float' , [ENSURE , FORBID ]], + ['OES_texture_half_float_linear' , [ENSURE , FORBID ]], + ['OES_vertex_array_object' , [ENSURE , FORBID ]], + ['WEBGL_compressed_texture_s3tc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], +// ['WEBGL_debug_renderer_info' , [FORBID , FORBID ]], // Complicated! + ['WEBGL_debug_shaders' , [FORBID , FORBID ]], + ['WEBGL_depth_texture' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_draw_buffers' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_lose_context' , [ENSURE , ENSURE ]], + + // Community Approved + ['EXT_color_buffer_float' , [FORBID , ENSURE ]], + ['EXT_color_buffer_half_float' , [MACHINE_SPECIFIC, FORBID ]], + ['EXT_sRGB' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_color_buffer_float' , [MACHINE_SPECIFIC, FORBID ]], + ['WEBGL_compressed_texture_atc' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_etc1' , [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], + ['WEBGL_compressed_texture_pvrtc', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], +]; + +var draftExts = [ + ['WEBGL_compressed_texture_es3', [MACHINE_SPECIFIC, MACHINE_SPECIFIC]], +]; + +var nonImplementedExts = [ + 'OES_fbo_render_mipmap', + 'WEBGL_compressed_texture_astc', + 'WEBGL_security_sensitive_resources', + 'WEBGL_shared_resources', +]; + +//////////////////// + +function TestExtFor(contextType, extName, status) { + switch (status) { + case ENSURE: + EnsureExtFor(contextType, extName); + break; + + case FORBID: + EnsureExtFor(contextType, extName, false); + break; + + case MACHINE_SPECIFIC: + break; + } +} + +function TestExt(extName, statusArr) { + TestExtFor('webgl', extName, statusArr[0]); + TestExtFor('webgl2', extName, statusArr[1]); +} + +//////////////////// + +defaultExts.forEach(function(x) { + var extName = x[0]; + var statusArr = x[1]; + TestExt(extName, statusArr); +}); + +nonImplementedExts.forEach(function(extName) { + EnsureExt(extName, false); +}); + +draftExts.forEach(function(x) { + var extName = x[0]; + EnsureExt(extName, false); +}); + +Lastly_WithDraftExtsEnabled(function() { + draftExts.forEach(function(x) { + var extName = x[0]; + var statusArr = x[1]; + TestExt(extName, statusArr); + }); +}); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/es3-data.js b/dom/canvas/test/webgl-mochitest/es3-data.js new file mode 100644 index 000000000..ec00cf82e --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/es3-data.js @@ -0,0 +1,4719 @@ +// The compressed data are created by Mali GPU Texture Compression Tool +// (http://malideveloper.arm.com/resources/tools/mali-gpu-texture-compression-tool/). +// Simply convert image to ktx format then strip the ktx header to +// get compressed data. +// +// The decompressed data are create by Khronos KTX library and tools +// (https://github.com/KhronosGroup/KTX) +// Calling _ktxUnpackETC with previous generated compressed data to +// get decompressed data. + +var img_4x4_r11_eac = { + compressed: new Uint8Array([ + 0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + ]) +} + +var img_4x4_signed_r11_eac = { + compressed: new Uint8Array([ + 0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + ]) +} + +var img_4x4_rg11_eac = { + compressed: new Uint8Array([ + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x2e, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + ]) +} + +var img_4x4_signed_rg11_eac = { + compressed: new Uint8Array([ + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0xae, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + ]) +} + +var img_4x4_rgb_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00 + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + ]) +} + +var img_4x4_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x00, 0xbf, 0x5f, 0x02, 0x05, + ]), + decompressed: new Uint8Array([ + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]) +} + +var img_4x4_rgba_etc2 = { + compressed: new Uint8Array([ + 0x44, 0x89, 0x69, 0x24, 0x41, 0x43, 0x04, 0x41, + 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x04, + 0xff, 0x00, 0x00, 0x04, 0x00, 0xff, 0x00, 0x04, + 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c, + 0xff, 0x00, 0x00, 0x34, 0x00, 0xff, 0x00, 0x1c, + 0xff, 0x00, 0x00, 0x04, 0xff, 0x00, 0x00, 0x34, + 0xff, 0x00, 0x00, 0x7c, 0x00, 0xff, 0x00, 0x34, + 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, 0x00, 0x1c, + 0x00, 0xff, 0x00, 0x34, 0x00, 0xff, 0x00, 0x1c, + ]) +} + +var img_8x8_r11_eac = { + compressed: new Uint8Array([ + 0x0f, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, + 0x5e, 0xb3, 0xeb, 0xa4, 0xba, 0xff, 0xa4, 0x92, + 0x00, 0xf6, 0xfb, 0xed, 0xbe, 0xff, 0xed, 0xb6, + 0x2c, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + 0xb3, 0x00, 0x00, 0xff, 0xb3, 0x00, 0x00, 0xff, + ]) +} + +var img_8x8_signed_r11_eac = { + compressed: new Uint8Array([ + 0x90, 0xf9, 0xbe, 0xff, 0xef, 0xb6, 0xff, 0xff, + 0xdf, 0xb3, 0xeb, 0xa4, 0xba, 0xff, 0xa4, 0x92, + 0xfb, 0x20, 0xeb, 0xa4, 0xba, 0xff, 0xa4, 0x92, + 0xac, 0xfd, 0x1c, 0x7f, 0xc7, 0x00, 0x7f, 0xff, + ]), + decompressed: new Uint8Array([ + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x00, 0xff, + 0xe2, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x96, 0x00, 0x00, 0xff, + 0x96, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + 0xb2, 0x00, 0x00, 0xff, 0xb2, 0x00, 0x00, 0xff, + ]) +} + +var img_8x8_rg11_eac = { + compressed: new Uint8Array([ + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x2e, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x2e, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + 0x2e, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x00, 0x00, 0x24, 0x92, 0x49, 0x24, 0x92, 0x49, + 0x2e, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + ]) +} + +var img_8x8_signed_rg11_eac = { + compressed: new Uint8Array([ + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0xae, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0xae, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + 0xae, 0xf0, 0xe7, 0x92, 0x79, 0xff, 0x92, 0x49, + 0x80, 0x00, 0x49, 0x24, 0x92, 0x49, 0x24, 0x92, + 0xae, 0xf0, 0x3c, 0xff, 0xcf, 0x24, 0xff, 0xff, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + ]) +} + +var img_8x8_rgb_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00, + 0x04, 0x0f, 0xff, 0x02, 0x07, 0x45, 0x00, 0x00, + 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00, + 0x04, 0x0f, 0x0f, 0xf2, 0xf8, 0xba, 0x00, 0x00 + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, + 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, + 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, + ]) +} + +var img_8x8_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([ + 0x04, 0xf0, 0xf0, 0x00, 0x5f, 0xef, 0x01, 0x44, + 0xfb, 0xf0, 0x00, 0xf0, 0xfd, 0xfa, 0x10, 0x80, + 0xfb, 0x0f, 0x0f, 0x00, 0x7f, 0x6f, 0x02, 0x40, + 0x04, 0xff, 0x00, 0xf0, 0xf7, 0x6d, 0x05, 0x04, + ]), + decompressed: new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfc, 0x00, 0x00, 0xff, 0xfc, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfc, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + ]) +} + +var img_8x8_rgba_etc2 = { + compressed: new Uint8Array([ + 0x35, 0x83, 0x6d, 0x26, 0x88, 0x46, 0x64, 0x37, + 0x04, 0xf0, 0xf0, 0x02, 0x07, 0x45, 0x00, 0x00, + 0x69, 0xa8, 0x66, 0x76, 0x45, 0x68, 0x86, 0xd1, + 0x04, 0x0f, 0xff, 0x02, 0x07, 0x45, 0x00, 0x00, + 0x69, 0xa8, 0x6d, 0xb2, 0x53, 0x80, 0xaf, 0x41, + 0x04, 0xf0, 0xf0, 0xf2, 0xf8, 0xba, 0x00, 0x00, + 0x8c, 0xca, 0xf4, 0x2b, 0x0a, 0x05, 0x34, 0x9b, + 0x04, 0x0f, 0x0f, 0xf2, 0xf8, 0xba, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x05, 0x00, 0xff, 0x00, 0x05, + 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05, + 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0xff, 0x05, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x05, + 0xff, 0x00, 0x00, 0x15, 0x00, 0xff, 0x00, 0x25, + 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, 0x2d, + 0xff, 0xff, 0x00, 0x19, 0x00, 0x00, 0xff, 0x05, + 0xff, 0x00, 0x00, 0x05, 0xff, 0x00, 0x00, 0x15, + 0xff, 0x00, 0x00, 0x3d, 0x00, 0xff, 0x00, 0x5d, + 0xff, 0xff, 0x00, 0x73, 0xff, 0xff, 0x00, 0x55, + 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0xff, 0x19, + 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x25, + 0x00, 0xff, 0x00, 0x5d, 0x00, 0xff, 0x00, 0x95, + 0x00, 0x00, 0xff, 0xc3, 0x00, 0x00, 0xff, 0x9b, + 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0x00, 0x05, 0xff, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0x00, 0x73, 0xff, 0x00, 0xff, 0xc3, + 0x00, 0x00, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xb0, + 0x00, 0x00, 0xff, 0x74, 0x00, 0xff, 0xff, 0x2c, + 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0x00, 0x55, 0xff, 0x00, 0xff, 0x9b, + 0x00, 0xff, 0xff, 0xb0, 0x00, 0xff, 0xff, 0x98, + 0x00, 0x00, 0xff, 0x5c, 0x00, 0xff, 0xff, 0x2c, + 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, 0x00, 0x19, + 0x00, 0xff, 0x00, 0x2d, 0xff, 0x00, 0xff, 0x55, + 0x00, 0x00, 0xff, 0x74, 0x00, 0x00, 0xff, 0x5c, + 0x00, 0x00, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x14, + 0xff, 0x00, 0xff, 0x05, 0xff, 0x00, 0xff, 0x05, + 0xff, 0x00, 0xff, 0x19, 0xff, 0x00, 0xff, 0x2d, + 0x00, 0xff, 0xff, 0x2c, 0x00, 0xff, 0xff, 0x2c, + 0x00, 0xff, 0xff, 0x14, 0x00, 0xff, 0xff, 0x14, + ]) +} + +/* This image exercises every ETC2 block type */ +var img_32x32_r11_eac = { + compressed: new Uint8Array([ + 0x6e, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, + 0x21, 0x32, 0xf2, 0x8d, 0x01, 0xf0, 0x9f, 0x02, + 0x2b, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12, + 0x1f, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, + 0x20, 0x34, 0xf0, 0x1b, 0x42, 0xb6, 0x1a, 0x02, + 0x1e, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a, + 0x2a, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, + 0x47, 0x32, 0x29, 0xb0, 0x52, 0xb0, 0x1f, 0xac, + 0x31, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb, + 0x0a, 0x23, 0xda, 0x1c, 0x08, 0x18, 0x90, 0x21, + 0x08, 0x2d, 0x08, 0x0c, 0x92, 0x91, 0x22, 0x4a, + 0x04, 0x00, 0x40, 0x70, 0x87, 0x40, 0x30, 0x9f, + 0x0c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, + 0x12, 0x14, 0x81, 0x9c, 0x8b, 0x50, 0xb4, 0x39, + 0x1a, 0x28, 0x66, 0x00, 0x64, 0xa0, 0x51, 0x45, + 0x2e, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, + 0x34, 0x31, 0x82, 0x62, 0x08, 0x48, 0xb6, 0x9b, + 0x07, 0x2d, 0xa3, 0x45, 0x60, 0x2b, 0x10, 0x44, + 0x08, 0x18, 0x67, 0x12, 0x86, 0x24, 0x92, 0x5b, + 0x02, 0x00, 0xe0, 0x3e, 0x10, 0xe9, 0x74, 0xd5, + 0x08, 0x1c, 0x09, 0x44, 0x88, 0x84, 0xe9, 0xa4, + 0x16, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, + 0x20, 0x11, 0x4f, 0xe6, 0xb6, 0xef, 0x6f, 0xf6, + 0x2f, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff, + 0x2c, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, + 0x07, 0x13, 0x09, 0x54, 0xdb, 0x29, 0xb4, 0x9a, + 0x01, 0x02, 0x6c, 0xf2, 0xd9, 0xb5, 0xbb, 0x6d, + 0x0e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, + 0x14, 0x13, 0x6a, 0x48, 0xe7, 0x5e, 0x7f, 0xbe, + 0x1e, 0x19, 0x92, 0x69, 0xa6, 0x87, 0x4f, 0xff, + 0x36, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, + 0x54, 0x2b, 0x6d, 0xa4, 0x91, 0x00, 0x0b, 0x6d, + 0x19, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09, + 0x10, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x04, 0x91, + 0x01, 0x23, 0x92, 0x49, 0x34, 0x9b, 0x69, 0x37, + 0x11, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed, + 0x21, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, + 0x13, 0x36, 0x9b, 0x6d, 0x36, 0xdf, 0xff, 0xff, + 0x38, 0x17, 0x26, 0x49, 0xb6, 0xda, 0xdf, 0xfe, + 0x60, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, + 0x2c, 0x53, 0x9b, 0x62, 0x44, 0x29, 0x14, 0x89, + 0x0b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd, + 0x0f, 0x13, 0x3f, 0xf5, 0xbf, 0x3b, 0x6f, 0xf6, + 0x1e, 0x10, 0xb7, 0x27, 0x74, 0xa4, 0x43, 0x62, + 0x21, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f, + 0x36, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, + 0x3f, 0x1d, 0x80, 0xab, 0x01, 0xd6, 0x0d, 0xac, + 0x4c, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff, + 0x35, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, + 0x1e, 0x19, 0x22, 0xf4, 0x2f, 0x66, 0x66, 0x66, + 0x19, 0x13, 0x3b, 0x69, 0xb7, 0x9f, 0xfd, 0xbf, + 0x2b, 0x16, 0x4e, 0x76, 0x25, 0x02, 0x72, 0xaf, + 0x35, 0x10, 0x68, 0x54, 0x85, 0x03, 0x61, 0x26, + 0x39, 0x1d, 0x44, 0x42, 0x25, 0x12, 0xeb, 0x76, + 0x3d, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, + 0x65, 0x37, 0x6d, 0xb4, 0x91, 0x20, 0x49, 0x77, + 0x68, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5, + 0x49, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, + 0x5a, 0x4c, 0x68, 0x56, 0x84, 0x68, 0x46, 0x84, + 0x4a, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f, + 0x53, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, + 0x51, 0x2b, 0x68, 0x66, 0x86, 0x68, 0x66, 0x86, + 0x52, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27, + 0x77, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37, + ]), + decompressed: new Uint8Array([ + 0x7a, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x36, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, + 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x4a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x7a, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x12, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x12, 0x00, 0x00, 0xff, + 0x12, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x36, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x56, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x71, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x22, 0x00, 0x00, 0xff, 0x22, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x27, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff, + 0x6b, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x71, 0x00, 0x00, 0xff, + 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x98, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x4c, 0x00, 0x00, 0xff, + 0x56, 0x00, 0x00, 0xff, 0x56, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x7a, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, + 0x98, 0x00, 0x00, 0xff, 0x98, 0x00, 0x00, 0xff, + 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x66, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, + 0x62, 0x00, 0x00, 0xff, 0x62, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x5b, 0x00, 0x00, 0xff, 0x5b, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x56, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x62, 0x00, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, + 0x68, 0x00, 0x00, 0xff, 0x7a, 0x00, 0x00, 0xff, + 0x8c, 0x00, 0x00, 0xff, 0x9b, 0x00, 0x00, 0xff, + ]) +} + +var img_32x32_signed_r11_eac = { + compressed: new Uint8Array([ + 0xef, 0x61, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, + 0xa2, 0x32, 0xf2, 0x8d, 0x01, 0xf0, 0x9f, 0x02, + 0xab, 0x4b, 0xd0, 0x9d, 0x41, 0xf0, 0x29, 0x12, + 0xa0, 0x30, 0xc0, 0x2e, 0x0a, 0xf0, 0xad, 0x02, + 0xa1, 0x34, 0xf0, 0x1b, 0x42, 0xb6, 0x1a, 0x02, + 0x9f, 0x34, 0xb0, 0x8d, 0x0a, 0xb0, 0x3f, 0x0a, + 0xaa, 0x21, 0xf1, 0xbf, 0x1a, 0xf1, 0x3e, 0x0b, + 0xc8, 0x32, 0x29, 0xb0, 0x52, 0xb0, 0x1f, 0xac, + 0xb2, 0x4f, 0x9f, 0xc0, 0x49, 0x49, 0xb0, 0xdb, + 0x8a, 0x16, 0xfe, 0x1e, 0x08, 0x1d, 0x20, 0x22, + 0x88, 0x2d, 0x08, 0x0c, 0x92, 0x91, 0x10, 0x02, + 0x85, 0x1d, 0x20, 0x60, 0x46, 0x20, 0x20, 0x56, + 0x8c, 0x1c, 0x61, 0x30, 0xd2, 0x61, 0x3a, 0x83, + 0x93, 0x11, 0x81, 0x9c, 0x8b, 0x50, 0xb4, 0x39, + 0x94, 0x2f, 0x42, 0xc8, 0x2d, 0xf2, 0x79, 0xe7, + 0xaf, 0x33, 0x42, 0x02, 0x64, 0xb6, 0xdf, 0xff, + 0xb5, 0x31, 0x82, 0x62, 0x08, 0x48, 0xb6, 0x9b, + 0x84, 0x1a, 0xd7, 0x51, 0xac, 0x83, 0x0b, 0x25, + 0x8a, 0x16, 0x66, 0xa4, 0x85, 0x49, 0x22, 0x5b, + 0x83, 0x1d, 0xa0, 0x2a, 0x08, 0xc4, 0xe2, 0x8c, + 0x8d, 0x15, 0x2d, 0x86, 0xd1, 0x09, 0x41, 0x00, + 0x96, 0x19, 0x4a, 0xdf, 0x6d, 0xbe, 0xd7, 0x6d, + 0xa1, 0x11, 0x4f, 0xe6, 0xb6, 0xef, 0x6f, 0xf6, + 0xb0, 0x44, 0xb2, 0xc9, 0x24, 0xbb, 0x6f, 0xff, + 0xad, 0x41, 0xdb, 0xf9, 0x65, 0x12, 0x44, 0x8c, + 0x82, 0x1d, 0xd2, 0x78, 0x49, 0xa0, 0x90, 0x08, + 0x82, 0x00, 0x6c, 0xe2, 0xd9, 0x91, 0xb9, 0x24, + 0x8e, 0x15, 0x64, 0x96, 0x40, 0x28, 0x41, 0x24, + 0x95, 0x13, 0x6a, 0x48, 0xe7, 0x5c, 0x7f, 0xbe, + 0xa1, 0x18, 0x00, 0x51, 0x45, 0x0a, 0x8d, 0xb6, + 0xb7, 0x14, 0x6d, 0x14, 0x40, 0x12, 0x5b, 0xb7, + 0xcf, 0x10, 0x6d, 0xa4, 0x89, 0x92, 0x4f, 0xff, + 0x99, 0x43, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x09, + 0x90, 0x21, 0xf0, 0x10, 0x00, 0x44, 0x02, 0x89, + 0x89, 0x2d, 0x49, 0x24, 0xaa, 0x56, 0xd4, 0xaf, + 0x91, 0x18, 0x6c, 0x00, 0x07, 0xe2, 0xdf, 0xed, + 0xa1, 0x23, 0x40, 0x28, 0x84, 0xd0, 0x49, 0xb0, + 0x93, 0x36, 0x9b, 0x6d, 0x36, 0xdf, 0xff, 0xff, + 0xbc, 0x12, 0x48, 0x01, 0x6d, 0xb6, 0x4d, 0xb5, + 0xe1, 0x44, 0x49, 0x22, 0x49, 0x00, 0x09, 0x24, + 0xad, 0x53, 0x9b, 0x62, 0x44, 0x29, 0x14, 0x89, + 0x8b, 0x1c, 0x93, 0xf0, 0x3f, 0x82, 0xd9, 0xfd, + 0x91, 0x16, 0x1f, 0xf3, 0x3f, 0x12, 0x4f, 0xe4, + 0x9e, 0x10, 0xb7, 0x27, 0x74, 0xa4, 0x43, 0x62, + 0xa1, 0x1a, 0x00, 0x50, 0x07, 0x17, 0xfb, 0x6f, + 0xb6, 0x11, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, + 0xc0, 0x1d, 0x05, 0x28, 0x0a, 0xb0, 0x1d, 0x60, + 0xcd, 0x23, 0x49, 0x20, 0x00, 0xb6, 0xdf, 0xff, + 0xb6, 0x20, 0xdb, 0xfd, 0xed, 0x36, 0xd6, 0x49, + 0x9f, 0x19, 0x22, 0xf4, 0x67, 0x66, 0x66, 0x66, + 0x99, 0x13, 0x3b, 0x6b, 0xb7, 0xbf, 0xfd, 0xbf, + 0xab, 0x17, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, + 0xb1, 0x11, 0x42, 0x60, 0x26, 0x93, 0xf9, 0x6f, + 0xba, 0x1d, 0x48, 0x84, 0x44, 0x22, 0x59, 0x2e, + 0xbd, 0x1d, 0x29, 0x20, 0x09, 0xb2, 0x4d, 0xb6, + 0xe6, 0x37, 0x6d, 0xb4, 0x91, 0x20, 0x49, 0x77, + 0xe8, 0x42, 0x17, 0xf4, 0x2f, 0x68, 0x56, 0xd5, + 0xc9, 0x54, 0x02, 0x60, 0x26, 0x22, 0x62, 0x26, + 0xcc, 0x21, 0x66, 0x76, 0x67, 0x66, 0x76, 0x67, + 0xcb, 0x27, 0x66, 0x74, 0x67, 0x46, 0x74, 0x2f, + 0xd4, 0x2b, 0x68, 0x66, 0x85, 0x68, 0x56, 0x85, + 0xd2, 0x2b, 0x68, 0x66, 0x86, 0x68, 0x66, 0x86, + 0xd3, 0x25, 0x68, 0x46, 0x45, 0x66, 0x64, 0x27, + 0xf8, 0x32, 0x6d, 0x16, 0x8c, 0x46, 0x61, 0x37, + ]), + decompressed: new Uint8Array([ + 0x7b, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x43, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x4a, 0x00, 0x00, 0xff, + 0x4a, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x54, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x30, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x4b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x7b, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x42, 0x00, 0x00, 0xff, 0x54, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x13, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x30, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x4b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x09, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x06, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x2c, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x17, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x2c, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x4c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x04, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x05, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x11, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x13, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x10, 0x00, 0x00, 0xff, 0x10, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0xff, + 0x21, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x5d, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x49, 0x00, 0x00, 0xff, 0x2d, 0x00, 0x00, 0xff, + 0x2d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x0b, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x11, 0x00, 0x00, 0xff, 0x09, 0x00, 0x00, 0xff, + 0x02, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0a, 0x00, 0x00, 0xff, 0x02, 0x00, 0x00, 0xff, + 0x03, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0xff, + 0x0b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x16, 0x00, 0x00, 0xff, 0x16, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x1d, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x31, 0x00, 0x00, 0xff, 0x31, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x55, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0d, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x0a, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x42, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, + 0x0d, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x08, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x18, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x29, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x0f, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1f, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x24, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3c, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3f, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x19, 0x00, 0x00, 0xff, 0x19, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x0e, 0x00, 0x00, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0x1b, 0x00, 0x00, 0xff, 0x1b, 0x00, 0x00, 0xff, + 0x14, 0x00, 0x00, 0xff, 0x14, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x24, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x49, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x2a, 0x00, 0x00, 0xff, 0x18, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x17, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0xff, + 0x15, 0x00, 0x00, 0xff, 0x1c, 0x00, 0x00, 0xff, + 0x1c, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x27, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x57, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x52, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x1d, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1a, 0x00, 0x00, 0xff, 0x1a, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0xff, + 0x2e, 0x00, 0x00, 0xff, 0x2e, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x37, 0x00, 0x00, 0xff, 0x38, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x72, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x23, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x20, 0x00, 0x00, 0xff, 0x20, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x1e, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x2f, 0x00, 0x00, 0xff, + 0x2f, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x37, 0x00, 0x00, 0xff, + 0x38, 0x00, 0x00, 0xff, 0x39, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x5d, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x52, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x2a, 0x00, 0x00, 0xff, + 0x28, 0x00, 0x00, 0xff, 0x28, 0x00, 0x00, 0xff, + 0x26, 0x00, 0x00, 0xff, 0x26, 0x00, 0x00, 0xff, + 0x1e, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x25, 0x00, 0x00, 0xff, 0x25, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x35, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x39, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3c, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x83, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x34, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x2b, 0x00, 0x00, 0xff, 0x2b, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x32, 0x00, 0x00, 0xff, 0x32, 0x00, 0x00, 0xff, + 0x35, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x3b, 0x00, 0x00, 0xff, 0x3b, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x40, 0x00, 0x00, 0xff, 0x40, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x3d, 0x00, 0x00, 0xff, + 0x3d, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x51, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x72, 0x00, 0x00, 0xff, + 0x78, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x48, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3a, 0x00, 0x00, 0xff, 0x3a, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x3e, 0x00, 0x00, 0xff, 0x3e, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x41, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x46, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x44, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, + 0x41, 0x00, 0x00, 0xff, 0x45, 0x00, 0x00, 0xff, + 0x45, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x51, 0x00, 0x00, 0xff, 0x60, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x97, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x48, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x53, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x4f, 0x00, 0x00, 0xff, + 0x4f, 0x00, 0x00, 0xff, 0x53, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x50, 0x00, 0x00, 0xff, 0x50, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4e, 0x00, 0x00, 0xff, 0x4e, 0x00, 0x00, 0xff, + 0x4d, 0x00, 0x00, 0xff, 0x4d, 0x00, 0x00, 0xff, + 0x57, 0x00, 0x00, 0xff, 0x57, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x69, 0x00, 0x00, 0xff, + 0x7b, 0x00, 0x00, 0xff, 0x8c, 0x00, 0x00, 0xff, + 0x97, 0x00, 0x00, 0xff, 0x97, 0x00, 0x00, 0xff, + 0x78, 0x00, 0x00, 0xff, 0x78, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x6c, 0x00, 0x00, 0xff, 0x6c, 0x00, 0x00, 0xff, + 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x64, 0x00, 0x00, 0xff, 0x64, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x5f, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x60, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5c, 0x00, 0x00, 0xff, 0x5c, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x5e, 0x00, 0x00, 0xff, 0x5e, 0x00, 0x00, 0xff, + 0x57, 0x00, 0x00, 0xff, 0x5f, 0x00, 0x00, 0xff, + 0x63, 0x00, 0x00, 0xff, 0x67, 0x00, 0x00, 0xff, + 0x69, 0x00, 0x00, 0xff, 0x7b, 0x00, 0x00, 0xff, + 0x8c, 0x00, 0x00, 0xff, 0x9b, 0x00, 0x00, 0xff, + ]) +} + +var img_32x32_rg11_eac = { + compressed: new Uint8Array([ + 0xa3, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, + 0x88, 0x72, 0xdb, 0x5d, 0x68, 0xb4, 0x49, 0x01, + 0x54, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03, + 0x64, 0x30, 0xf2, 0x8d, 0x02, 0xf1, 0x2f, 0x03, + 0x5f, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0x70, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0x57, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, + 0x69, 0x67, 0xa0, 0xbc, 0x13, 0xd1, 0x3b, 0x0b, + 0x54, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0x64, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0x4a, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0x4a, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0x71, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, + 0x5e, 0x44, 0xf5, 0x2f, 0x51, 0xf4, 0xaf, 0x02, + 0x9f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7, + 0x85, 0x6b, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, + 0x69, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0x69, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0x1c, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, + 0x33, 0x44, 0xda, 0x2c, 0x10, 0x19, 0x20, 0x22, + 0x17, 0x22, 0x8a, 0x4e, 0x92, 0xb5, 0x90, 0x03, + 0x24, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, + 0x13, 0x3d, 0x18, 0xea, 0x0e, 0x14, 0xbc, 0x1e, + 0x0c, 0x20, 0x9b, 0x7b, 0x37, 0x97, 0x0d, 0x07, + 0x01, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, + 0x29, 0x3a, 0x54, 0x2a, 0x80, 0x54, 0x2e, 0x2a, + 0x5c, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0, + 0x41, 0x34, 0xb1, 0x9c, 0x0b, 0x14, 0xb1, 0x31, + 0x6a, 0x44, 0x6a, 0xc0, 0xad, 0x82, 0x61, 0x26, + 0x45, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6, + 0xb4, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, + 0x64, 0x47, 0x64, 0x14, 0x80, 0x00, 0x0b, 0x6d, + 0x5d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0x6d, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0x17, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0x20, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0x0e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, + 0x1f, 0x30, 0x63, 0x82, 0xaf, 0x24, 0x00, 0x1b, + 0x0d, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25, + 0x0f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, + 0x3f, 0x42, 0x09, 0x44, 0x88, 0xa0, 0x6b, 0xad, + 0x17, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed, + 0x6f, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, + 0x06, 0xb2, 0xb6, 0xdd, 0x6d, 0xba, 0xd9, 0x6d, + 0xa3, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f, + 0x1c, 0x5d, 0x73, 0x88, 0xc0, 0xf0, 0x0f, 0xc0, + 0x7a, 0xb5, 0xdb, 0x6d, 0xb6, 0xdf, 0xff, 0xff, + 0x5a, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6, + 0x63, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, + 0x71, 0x67, 0xdb, 0xfb, 0xae, 0x12, 0x46, 0xd4, + 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x1a, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x01, 0x2f, 0x02, 0x78, 0x04, 0xb4, 0x0b, 0x6d, + 0x01, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6, + 0x2e, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, + 0x28, 0x2a, 0x56, 0xd5, 0x7f, 0x0a, 0xfb, 0xff, + 0x64, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe, + 0x31, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, + 0xab, 0x20, 0x49, 0x04, 0x10, 0x4c, 0x2d, 0xb6, + 0x2e, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb, + 0xd9, 0x2b, 0x6d, 0x12, 0x44, 0x12, 0xeb, 0xbf, + 0x0a, 0x19, 0x25, 0x28, 0x01, 0xb6, 0x4f, 0xb5, + 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x4c, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, + 0x55, 0x47, 0xff, 0x6f, 0x24, 0x90, 0x08, 0x52, + 0x4d, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49, + 0x2f, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, + 0x32, 0x52, 0xfa, 0x19, 0x24, 0x68, 0x06, 0xda, + 0x03, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f, + 0x03, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, + 0x5b, 0x20, 0x6c, 0x00, 0x06, 0xc3, 0xfd, 0xbf, + 0x39, 0x20, 0x6c, 0x00, 0x06, 0xc0, 0x0d, 0x80, + 0x89, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, + 0x47, 0x42, 0x10, 0xaa, 0x08, 0xd4, 0x8b, 0xa1, + 0xc1, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d, + 0x15, 0x22, 0x9f, 0xff, 0x3f, 0xe9, 0x24, 0x92, + 0xe4, 0x11, 0x6c, 0x01, 0xb6, 0xb6, 0x4f, 0xfd, + 0x07, 0x1a, 0x49, 0x24, 0x00, 0xb4, 0x0f, 0xfd, + 0xee, 0x2d, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb6, + 0x33, 0xb2, 0x00, 0x09, 0x24, 0xb6, 0xdd, 0xb6, + 0x75, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9, + 0x58, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, + 0x4b, 0x3a, 0x02, 0xd4, 0xad, 0x0b, 0xf1, 0x6f, + 0x1b, 0x45, 0xb7, 0xf9, 0x3f, 0xb0, 0x0b, 0xf8, + 0x46, 0x8f, 0x9b, 0x6b, 0xf6, 0x9f, 0xfd, 0xbf, + 0x1f, 0x32, 0x9f, 0xf6, 0x7f, 0x84, 0x9f, 0xc9, + 0x85, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34, + 0x2e, 0x4a, 0xda, 0x21, 0xa0, 0xd4, 0x8b, 0x82, + 0xa5, 0x20, 0x00, 0x60, 0x07, 0x1b, 0xfd, 0xb7, + 0x1a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8, + 0xdb, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, + 0x02, 0xfd, 0x00, 0x0a, 0x00, 0x00, 0x08, 0x00, + 0xeb, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60, + 0x09, 0x1a, 0x69, 0x22, 0x48, 0x92, 0x5d, 0xb6, + 0xed, 0x03, 0x6d, 0xb4, 0x92, 0xb6, 0xdf, 0xff, + 0x4d, 0x5c, 0x6d, 0xb0, 0x49, 0xb6, 0xdf, 0xff, + 0x9a, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, + 0x65, 0x5f, 0xdb, 0xfd, 0xed, 0x12, 0x46, 0x00, + 0x94, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f, + 0x30, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, + 0x94, 0x20, 0x5b, 0x61, 0xb7, 0x1f, 0xfd, 0xbf, + 0x00, 0x46, 0xdb, 0x6f, 0xb7, 0xff, 0xfd, 0xbf, + 0xc3, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, + 0x06, 0x2b, 0xb2, 0xf9, 0xee, 0xfe, 0xfd, 0x77, + 0xd3, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f, + 0x0b, 0x10, 0x6a, 0x74, 0xa7, 0x6e, 0xd6, 0x4d, + 0xe1, 0x2d, 0x44, 0x82, 0x04, 0x12, 0x59, 0x6e, + 0x07, 0x19, 0x42, 0x64, 0x2e, 0x32, 0xf3, 0x2f, + 0xe6, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, + 0x11, 0x10, 0x6d, 0x14, 0x44, 0x12, 0xeb, 0xbf, + 0xed, 0x2d, 0x05, 0x28, 0x0a, 0xb0, 0x1d, 0x60, + 0x64, 0x51, 0x68, 0x92, 0x04, 0x92, 0xdb, 0xbf, + 0xdc, 0x37, 0x17, 0xf4, 0x2f, 0x66, 0x66, 0xce, + 0x87, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c, + 0xc7, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, + 0x55, 0x47, 0x02, 0xf0, 0x2f, 0x42, 0xf4, 0x2f, + 0xd8, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e, + 0x51, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, + 0xe5, 0x12, 0x68, 0x56, 0x66, 0x42, 0xf3, 0x37, + 0x03, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xe5, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x4a, 0x47, 0x62, 0xf6, 0x67, 0x66, 0x76, 0x66, + 0xdf, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x02, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xe9, 0x1b, 0x64, 0x46, 0x45, 0x46, 0x54, 0x26, + 0x4d, 0x41, 0x66, 0x54, 0x26, 0x42, 0xf3, 0x2f, + 0xea, 0x2d, 0x46, 0x54, 0x26, 0x22, 0xe3, 0x2e, + 0x8c, 0x40, 0x68, 0x84, 0x44, 0x12, 0xe9, 0x77, + ]), + decompressed: new Uint8Array([ + 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff, + 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x7e, 0x8e, 0x00, 0xff, 0x7e, 0x8e, 0x00, 0xff, + 0x7b, 0x8c, 0x00, 0xff, 0x7b, 0x8c, 0x00, 0xff, + 0x87, 0x98, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, + 0x6f, 0x81, 0x00, 0xff, 0x81, 0x93, 0x00, 0xff, + 0x81, 0x93, 0x00, 0xff, 0x6f, 0x81, 0x00, 0xff, + 0x7e, 0x8e, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x74, 0x74, 0x00, 0xff, 0x74, 0x74, 0x00, 0xff, + 0x74, 0x74, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff, + 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff, + 0x87, 0x8a, 0x00, 0xff, 0x87, 0x8a, 0x00, 0xff, + 0x7f, 0x79, 0x00, 0xff, 0x8b, 0x8b, 0x00, 0xff, + 0xa3, 0x9d, 0x00, 0xff, 0xaf, 0xa9, 0x00, 0xff, + 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x7b, 0x8f, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x5a, 0x6a, 0x00, 0xff, + 0x67, 0x78, 0x00, 0xff, 0x6f, 0x80, 0x00, 0xff, + 0x67, 0x78, 0x00, 0xff, 0x67, 0x78, 0x00, 0xff, + 0x4b, 0x57, 0x00, 0xff, 0x4b, 0x57, 0x00, 0xff, + 0x5d, 0x75, 0x00, 0xff, 0x5d, 0x75, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x42, 0x52, 0x00, 0xff, + 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, + 0x66, 0x66, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, + 0x71, 0x72, 0x00, 0xff, 0x71, 0x72, 0x00, 0xff, + 0x71, 0x72, 0x00, 0xff, 0x66, 0x66, 0x00, 0xff, + 0x7f, 0x67, 0x00, 0xff, 0x97, 0x79, 0x00, 0xff, + 0xa3, 0x8b, 0x00, 0xff, 0xbb, 0x9d, 0x00, 0xff, + 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x6b, 0x7a, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3f, 0x50, 0x00, 0xff, 0x53, 0x64, 0x00, 0xff, + 0x53, 0x64, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x4b, 0x4b, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3c, 0x3c, 0x00, 0xff, 0x3c, 0x3c, 0x00, 0xff, + 0x51, 0x51, 0x00, 0xff, 0x3c, 0x3c, 0x00, 0xff, + 0x50, 0x3e, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, + 0x5b, 0x46, 0x00, 0xff, 0x66, 0x52, 0x00, 0xff, + 0x8b, 0x5b, 0x00, 0xff, 0x97, 0x67, 0x00, 0xff, + 0xaf, 0x79, 0x00, 0xff, 0xbb, 0x8b, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x6b, 0x7a, 0x00, 0xff, + 0x7b, 0x8f, 0x00, 0xff, 0x53, 0x65, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x39, 0x49, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x4b, 0x5c, 0x00, 0xff, 0x3f, 0x50, 0x00, 0xff, + 0x33, 0x44, 0x00, 0xff, 0x33, 0x44, 0x00, 0xff, + 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x27, 0x27, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x51, 0x51, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x19, 0x19, 0x00, 0xff, 0x27, 0x27, 0x00, 0xff, + 0x50, 0x3e, 0x00, 0xff, 0x5b, 0x46, 0x00, 0xff, + 0x50, 0x3e, 0x00, 0xff, 0x50, 0x3e, 0x00, 0xff, + 0x8b, 0x49, 0x00, 0xff, 0xa3, 0x5b, 0x00, 0xff, + 0xaf, 0x67, 0x00, 0xff, 0xc3, 0x79, 0x00, 0xff, + 0x81, 0x81, 0x00, 0xff, 0x6f, 0x6f, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x40, 0x4f, 0x00, 0xff, 0x40, 0x4f, 0x00, 0xff, + 0x1f, 0x27, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff, + 0x19, 0x28, 0x00, 0xff, 0x2f, 0x40, 0x00, 0xff, + 0x1f, 0x28, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, + 0x10, 0x10, 0x00, 0xff, 0x16, 0x16, 0x00, 0xff, + 0x10, 0x10, 0x00, 0xff, 0x19, 0x1c, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x31, 0x44, 0x00, 0xff, + 0x48, 0x50, 0x00, 0xff, 0x50, 0x56, 0x00, 0xff, + 0x30, 0x38, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, + 0x3a, 0x27, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x8c, 0x38, 0x00, 0xff, 0x98, 0x44, 0x00, 0xff, + 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, + 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x40, 0x4f, 0x00, 0xff, 0x16, 0x27, 0x00, 0xff, + 0x40, 0x4f, 0x00, 0xff, 0x1f, 0x27, 0x00, 0xff, + 0x07, 0x18, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, + 0x1f, 0x28, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, + 0x19, 0x1c, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x16, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x21, 0x32, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x21, 0x32, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, + 0x3c, 0x47, 0x00, 0xff, 0x30, 0x38, 0x00, 0xff, + 0x48, 0x50, 0x00, 0xff, 0x3c, 0x47, 0x00, 0xff, + 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, + 0xa0, 0x50, 0x00, 0xff, 0x98, 0x44, 0x00, 0xff, + 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, + 0x93, 0x93, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x2d, 0x2d, 0x00, 0xff, + 0x28, 0x3b, 0x00, 0xff, 0x04, 0x13, 0x00, 0xff, + 0x0d, 0x13, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, + 0x19, 0x28, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, + 0x00, 0x06, 0x00, 0xff, 0x13, 0x1e, 0x00, 0xff, + 0x0d, 0x1c, 0x00, 0xff, 0x0d, 0x1c, 0x00, 0xff, + 0x0d, 0x1c, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, + 0x11, 0x23, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, + 0x11, 0x23, 0x00, 0xff, 0x21, 0x32, 0x00, 0xff, + 0x3c, 0x1d, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, + 0x50, 0x2f, 0x00, 0xff, 0x78, 0x56, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0xac, 0x58, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, + 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, + 0x81, 0x81, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x04, 0x13, 0x00, 0xff, 0x16, 0x27, 0x00, 0xff, + 0x0d, 0x13, 0x00, 0xff, 0x0d, 0x13, 0x00, 0xff, + 0x19, 0x28, 0x00, 0xff, 0x07, 0x18, 0x00, 0xff, + 0x0d, 0x12, 0x00, 0xff, 0x00, 0x06, 0x00, 0xff, + 0x19, 0x28, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, + 0x00, 0x06, 0x00, 0xff, 0x19, 0x28, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x11, 0x23, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x11, 0x11, 0x00, 0xff, + 0x50, 0x2f, 0x00, 0xff, 0x3c, 0x1d, 0x00, 0xff, + 0x3c, 0x1d, 0x00, 0xff, 0x50, 0x2f, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, + 0x86, 0x55, 0x00, 0xff, 0x86, 0x55, 0x00, 0xff, + 0xa0, 0x50, 0x00, 0xff, 0xac, 0x58, 0x00, 0xff, + 0xb8, 0x58, 0x00, 0xff, 0xd8, 0x74, 0x00, 0xff, + 0x75, 0x85, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x0d, 0x00, 0xff, + 0x05, 0x0d, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff, + 0x11, 0x21, 0x00, 0xff, 0x11, 0x21, 0x00, 0xff, + 0x29, 0x21, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, + 0x37, 0x1d, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff, + 0x4f, 0x1d, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, + 0x55, 0x32, 0x00, 0xff, 0x75, 0x53, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x67, 0x11, 0x00, 0xff, + 0x94, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x00, 0xff, + 0xaf, 0x49, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff, + 0xd2, 0x5a, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xd2, 0x5a, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff, + 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x11, 0x16, 0x00, 0xff, 0x00, 0x04, 0x00, 0xff, + 0x05, 0x0d, 0x00, 0xff, 0x11, 0x16, 0x00, 0xff, + 0x05, 0x15, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, + 0x11, 0x0b, 0x00, 0xff, 0x05, 0x00, 0x00, 0xff, + 0x1f, 0x07, 0x00, 0xff, 0x1f, 0x07, 0x00, 0xff, + 0x37, 0x07, 0x00, 0xff, 0x5b, 0x29, 0x00, 0xff, + 0x55, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x75, 0x53, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x82, 0x1c, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, + 0x82, 0x1c, 0x00, 0xff, 0xaf, 0x49, 0x00, 0xff, + 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x75, 0x85, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x29, 0x49, 0x00, 0xff, 0x0e, 0x2e, 0x00, 0xff, + 0x00, 0x16, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x15, 0x00, 0xff, 0x00, 0x0b, 0x00, 0xff, + 0x11, 0x0b, 0x00, 0xff, 0x11, 0x0b, 0x00, 0xff, + 0x1f, 0x07, 0x00, 0xff, 0x2b, 0x13, 0x00, 0xff, + 0x37, 0x07, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0xaf, 0x49, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x5a, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x87, 0x97, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x1d, 0x26, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x16, 0x00, 0xff, 0x29, 0x49, 0x00, 0xff, + 0x00, 0x16, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x15, 0x00, 0xff, + 0x29, 0x21, 0x00, 0xff, 0x1d, 0x15, 0x00, 0xff, + 0x43, 0x29, 0x00, 0xff, 0x37, 0x1d, 0x00, 0xff, + 0x5b, 0x29, 0x00, 0xff, 0x4f, 0x1d, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0x87, 0x32, 0x00, 0xff, 0x87, 0x32, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x39, 0x00, 0xff, 0xd2, 0x39, 0x00, 0xff, + 0xe8, 0x4f, 0x00, 0xff, 0xe8, 0x70, 0x00, 0xff, + 0x7c, 0x9b, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff, + 0x54, 0x5f, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x20, 0x20, 0x00, 0xff, 0x0e, 0x0e, 0x00, 0xff, + 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x0e, 0x18, 0x00, 0xff, 0x0e, 0x18, 0x00, 0xff, + 0x32, 0x24, 0x00, 0xff, 0x3e, 0x2e, 0x00, 0xff, + 0x44, 0x13, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, + 0x6c, 0x1f, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xc5, 0x05, 0x00, 0xff, 0xcf, 0x0b, 0x00, 0xff, + 0xd5, 0x0e, 0x00, 0xff, 0xe1, 0x13, 0x00, 0xff, + 0xe7, 0x24, 0x00, 0xff, 0xe7, 0x40, 0x00, 0xff, + 0xe7, 0x58, 0x00, 0xff, 0xe7, 0x70, 0x00, 0xff, + 0x7c, 0x9b, 0x00, 0xff, 0x6d, 0x9b, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x26, 0x2e, 0x00, 0xff, 0x26, 0x2e, 0x00, 0xff, + 0x26, 0x18, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, + 0x58, 0x25, 0x00, 0xff, 0x44, 0x13, 0x00, 0xff, + 0x8c, 0x41, 0x00, 0xff, 0x80, 0x35, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff, + 0x8d, 0x28, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xc5, 0x05, 0x00, 0xff, 0xcf, 0x08, 0x00, 0xff, + 0xdb, 0x0e, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, + 0xe9, 0x24, 0x00, 0xff, 0xe9, 0x3c, 0x00, 0xff, + 0xe9, 0x58, 0x00, 0xff, 0xe9, 0x70, 0x00, 0xff, + 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x89, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, + 0x0e, 0x0e, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff, + 0x3e, 0x2e, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, + 0x6c, 0x3b, 0x00, 0xff, 0x6c, 0x3b, 0x00, 0xff, + 0x74, 0x2b, 0x00, 0xff, 0x8c, 0x41, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0x99, 0x32, 0x00, 0xff, + 0xa5, 0x3e, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xcb, 0x02, 0x00, 0xff, 0xd5, 0x08, 0x00, 0xff, + 0xe1, 0x0b, 0x00, 0xff, 0xeb, 0x11, 0x00, 0xff, + 0xeb, 0x24, 0x00, 0xff, 0xeb, 0x3c, 0x00, 0xff, + 0xeb, 0x58, 0x00, 0xff, 0xeb, 0x70, 0x00, 0xff, + 0x8b, 0xad, 0x00, 0xff, 0x6d, 0x9b, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, + 0x35, 0x35, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x05, 0x05, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x26, 0x2e, 0x00, 0xff, 0x32, 0x3a, 0x00, 0xff, + 0x4a, 0x3a, 0x00, 0xff, 0x4a, 0x3a, 0x00, 0xff, + 0x6c, 0x3b, 0x00, 0xff, 0x80, 0x4d, 0x00, 0xff, + 0x8c, 0x41, 0x00, 0xff, 0x80, 0x35, 0x00, 0xff, + 0xa5, 0x3e, 0x00, 0xff, 0xa5, 0x3e, 0x00, 0xff, + 0x99, 0x32, 0x00, 0xff, 0xbb, 0x10, 0x00, 0xff, + 0xcf, 0x02, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, + 0xe5, 0x0b, 0x00, 0xff, 0xeb, 0x0e, 0x00, 0xff, + 0xed, 0x24, 0x00, 0xff, 0xed, 0x3c, 0x00, 0xff, + 0xed, 0x54, 0x00, 0xff, 0xed, 0x70, 0x00, 0xff, + 0x7d, 0x95, 0x00, 0xff, 0x7d, 0x95, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5c, 0x6e, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3d, 0x1b, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, + 0x6b, 0x49, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, + 0x69, 0x3f, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, + 0x8d, 0x63, 0x00, 0xff, 0x81, 0x57, 0x00, 0xff, + 0xa0, 0x17, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xd7, 0x00, 0x00, 0xff, 0xe1, 0x00, 0x00, 0xff, + 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, + 0xee, 0x5f, 0x00, 0xff, 0xf0, 0x80, 0x00, 0xff, + 0x7d, 0x95, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x41, 0x65, 0x00, 0xff, + 0x3e, 0x55, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, + 0x1b, 0x0a, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x3d, 0x1b, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, + 0x75, 0x4b, 0x00, 0xff, 0x69, 0x3f, 0x00, 0xff, + 0x81, 0x57, 0x00, 0xff, 0x8d, 0x63, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xa0, 0x17, 0x00, 0xff, + 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xd7, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xea, 0x0a, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, + 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x25, 0x37, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, + 0x3e, 0x28, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x55, 0x33, 0x00, 0xff, + 0x77, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, + 0x8d, 0x33, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff, + 0x8d, 0x33, 0x00, 0xff, 0xa5, 0x4b, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xe1, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xe6, 0x05, 0x00, 0xff, 0xf0, 0x10, 0x00, 0xff, + 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xf0, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, + 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x07, 0x19, 0x00, 0xff, 0x25, 0x37, 0x00, 0xff, + 0x3e, 0x28, 0x00, 0xff, 0x1b, 0x0a, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, + 0x55, 0x33, 0x00, 0xff, 0x6b, 0x49, 0x00, 0xff, + 0x77, 0x33, 0x00, 0xff, 0x77, 0x33, 0x00, 0xff, + 0x81, 0x27, 0x00, 0xff, 0x99, 0x3f, 0x00, 0xff, + 0x99, 0x3f, 0x00, 0xff, 0x8d, 0x33, 0x00, 0xff, + 0xb5, 0x2d, 0x00, 0xff, 0xb5, 0x2d, 0x00, 0xff, + 0xd3, 0x05, 0x00, 0xff, 0xd3, 0x05, 0x00, 0xff, + 0xe1, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xe6, 0x05, 0x00, 0xff, 0xea, 0x0a, 0x00, 0xff, + 0xea, 0x1d, 0x00, 0xff, 0xee, 0x3e, 0x00, 0xff, + 0xf0, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x7b, 0x74, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff, + 0x60, 0x4a, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, + 0x45, 0x33, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x45, 0x33, 0x00, 0xff, 0x45, 0x33, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x66, 0x00, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x65, 0x26, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x79, 0x3a, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc3, 0x00, 0x00, 0xff, 0xe9, 0x11, 0x00, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xe9, 0x02, 0x00, 0xff, + 0xeb, 0x00, 0x00, 0xff, 0xed, 0x05, 0x00, 0xff, + 0xed, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, + 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x57, 0x4a, 0x00, 0xff, + 0x4e, 0x35, 0x00, 0xff, 0x4e, 0x35, 0x00, 0xff, + 0x45, 0x33, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4a, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, + 0x79, 0x3a, 0x00, 0xff, 0x8d, 0x4a, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc3, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, + 0xe9, 0x01, 0x00, 0xff, 0xeb, 0x05, 0x00, 0xff, + 0xeb, 0x0a, 0x00, 0xff, 0xed, 0x10, 0x00, 0xff, + 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, + 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x6c, 0x5f, 0x00, 0xff, + 0x4e, 0x35, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff, + 0x54, 0x43, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, + 0x66, 0x0f, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, + 0xad, 0x32, 0x00, 0xff, 0xad, 0x32, 0x00, 0xff, + 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0xff, + 0xe7, 0x01, 0x00, 0xff, 0xe9, 0x05, 0x00, 0xff, + 0xe9, 0x0a, 0x00, 0xff, 0xeb, 0x10, 0x00, 0xff, + 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, + 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x7b, 0x74, 0x00, 0xff, + 0x60, 0x4a, 0x00, 0xff, 0x60, 0x4a, 0x00, 0xff, + 0x54, 0x43, 0x00, 0xff, 0x54, 0x43, 0x00, 0xff, + 0x66, 0x0f, 0x00, 0xff, 0x66, 0x0f, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x86, 0x10, 0x00, 0xff, 0x86, 0x10, 0x00, 0xff, + 0x8d, 0x0e, 0x00, 0xff, 0xa1, 0x26, 0x00, 0xff, + 0xa1, 0x26, 0x00, 0xff, 0x8d, 0x0e, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xe5, 0x01, 0x00, 0xff, 0xe7, 0x07, 0x00, 0xff, + 0xe7, 0x0c, 0x00, 0xff, 0xe9, 0x10, 0x00, 0xff, + 0xeb, 0x1b, 0x00, 0xff, 0xec, 0x39, 0x00, 0xff, + 0xed, 0x5c, 0x00, 0xff, 0xef, 0x7a, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, + 0x8e, 0x56, 0x00, 0xff, 0x73, 0x38, 0x00, 0xff, + 0x73, 0x3e, 0x00, 0xff, 0x73, 0x32, 0x00, 0xff, + 0x7c, 0x26, 0x00, 0xff, 0x7c, 0x1c, 0x00, 0xff, + 0x82, 0x1c, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, + 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb3, 0x0e, 0x00, 0xff, 0xad, 0x08, 0x00, 0xff, + 0xbd, 0x18, 0x00, 0xff, 0xb9, 0x12, 0x00, 0xff, + 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xdb, 0x00, 0x00, 0xff, 0xdd, 0x00, 0x00, 0xff, + 0xdf, 0x02, 0x00, 0xff, 0xe1, 0x02, 0x00, 0xff, + 0xe4, 0x02, 0x00, 0xff, 0xe6, 0x08, 0x00, 0xff, + 0xe8, 0x0e, 0x00, 0xff, 0xea, 0x16, 0x00, 0xff, + 0xeb, 0x23, 0x00, 0xff, 0xed, 0x41, 0x00, 0xff, + 0xef, 0x6e, 0x00, 0xff, 0xf1, 0x82, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, + 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, + 0x85, 0x3e, 0x00, 0xff, 0x85, 0x32, 0x00, 0xff, + 0x8b, 0x26, 0x00, 0xff, 0x8b, 0x1c, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xad, 0x08, 0x00, 0xff, 0xbd, 0x18, 0x00, 0xff, + 0xbd, 0x18, 0x00, 0xff, 0xb3, 0x0e, 0x00, 0xff, + 0xc9, 0x02, 0x00, 0xff, 0xc9, 0x02, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, + 0xdd, 0x05, 0x00, 0xff, 0xdf, 0x05, 0x00, 0xff, + 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x08, 0x00, 0xff, + 0xe2, 0x02, 0x00, 0xff, 0xe4, 0x0b, 0x00, 0xff, + 0xe6, 0x13, 0x00, 0xff, 0xe8, 0x19, 0x00, 0xff, + 0xe9, 0x32, 0x00, 0xff, 0xeb, 0x55, 0x00, 0xff, + 0xed, 0x6e, 0x00, 0xff, 0xef, 0x91, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff, + 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, + 0x9a, 0x42, 0x00, 0xff, 0x9a, 0x38, 0x00, 0xff, + 0xa0, 0x2c, 0x00, 0xff, 0xa0, 0x20, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xcb, 0x0e, 0x00, 0xff, 0xcb, 0x0e, 0x00, 0xff, + 0xcb, 0x0e, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, + 0xd5, 0x0d, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff, + 0xe5, 0x10, 0x00, 0xff, 0xdb, 0x05, 0x00, 0xff, + 0xdd, 0x08, 0x00, 0xff, 0xdf, 0x0b, 0x00, 0xff, + 0xe1, 0x0b, 0x00, 0xff, 0xe3, 0x0b, 0x00, 0xff, + 0xe2, 0x08, 0x00, 0xff, 0xe4, 0x0e, 0x00, 0xff, + 0xe6, 0x16, 0x00, 0xff, 0xe8, 0x1f, 0x00, 0xff, + 0xe7, 0x41, 0x00, 0xff, 0xe9, 0x55, 0x00, 0xff, + 0xeb, 0x82, 0x00, 0xff, 0xed, 0xa0, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x79, 0x00, 0xff, + 0xa9, 0x6f, 0x00, 0xff, 0x8e, 0x56, 0x00, 0xff, + 0xa9, 0x42, 0x00, 0xff, 0xa9, 0x38, 0x00, 0xff, + 0xb2, 0x2c, 0x00, 0xff, 0xb2, 0x20, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xd7, 0x18, 0x00, 0xff, 0xd1, 0x12, 0x00, 0xff, + 0xd7, 0x18, 0x00, 0xff, 0xd7, 0x18, 0x00, 0xff, + 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, + 0xe5, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, + 0xdf, 0x0e, 0x00, 0xff, 0xe1, 0x0e, 0x00, 0xff, + 0xe3, 0x10, 0x00, 0xff, 0xe5, 0x10, 0x00, 0xff, + 0xe0, 0x0b, 0x00, 0xff, 0xe2, 0x13, 0x00, 0xff, + 0xe4, 0x19, 0x00, 0xff, 0xe6, 0x1f, 0x00, 0xff, + 0xe7, 0x41, 0x00, 0xff, 0xe7, 0x6e, 0x00, 0xff, + 0xe9, 0x82, 0x00, 0xff, 0xeb, 0xa0, 0x00, 0xff, + 0xd3, 0x8d, 0x00, 0xff, 0xc4, 0x7b, 0x00, 0xff, + 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, + 0xb9, 0x35, 0x00, 0xff, 0xb9, 0x35, 0x00, 0xff, + 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, + 0xcb, 0x29, 0x00, 0xff, 0xcb, 0x29, 0x00, 0xff, + 0xd8, 0x1f, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff, + 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff, + 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff, + 0xe7, 0x1e, 0x00, 0xff, 0xe7, 0x1e, 0x00, 0xff, + 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, + 0xe3, 0x1c, 0x00, 0xff, 0xe3, 0x1c, 0x00, 0xff, + 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x25, 0x00, 0xff, + 0xe2, 0x25, 0x00, 0xff, 0xe2, 0x31, 0x00, 0xff, + 0xe4, 0x50, 0x00, 0xff, 0xe4, 0x68, 0x00, 0xff, + 0xe6, 0x80, 0x00, 0xff, 0xe6, 0x94, 0x00, 0xff, + 0xe8, 0x9f, 0x00, 0xff, 0xd3, 0x8d, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, + 0xce, 0x49, 0x00, 0xff, 0xce, 0x49, 0x00, 0xff, + 0xd8, 0x45, 0x00, 0xff, 0xd8, 0x45, 0x00, 0xff, + 0xd8, 0x41, 0x00, 0xff, 0xd8, 0x41, 0x00, 0xff, + 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff, + 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, + 0xe9, 0x3e, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff, + 0xe9, 0x36, 0x00, 0xff, 0xe9, 0x36, 0x00, 0xff, + 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff, + 0xe7, 0x36, 0x00, 0xff, 0xe7, 0x36, 0x00, 0xff, + 0xe4, 0x31, 0x00, 0xff, 0xe4, 0x41, 0x00, 0xff, + 0xe4, 0x41, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, + 0xe6, 0x68, 0x00, 0xff, 0xe8, 0x74, 0x00, 0xff, + 0xe8, 0x94, 0x00, 0xff, 0xea, 0xa0, 0x00, 0xff, + 0xfa, 0xb1, 0x00, 0xff, 0xe8, 0x9f, 0x00, 0xff, + 0xe2, 0x7b, 0x00, 0xff, 0xcd, 0x69, 0x00, 0xff, + 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, + 0xe3, 0x65, 0x00, 0xff, 0xe3, 0x65, 0x00, 0xff, + 0xe5, 0x5d, 0x00, 0xff, 0xe5, 0x5d, 0x00, 0xff, + 0xe5, 0x59, 0x00, 0xff, 0xe5, 0x59, 0x00, 0xff, + 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, + 0xe9, 0x57, 0x00, 0xff, 0xec, 0x57, 0x00, 0xff, + 0xeb, 0x5a, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff, + 0xeb, 0x52, 0x00, 0xff, 0xeb, 0x52, 0x00, 0xff, + 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, + 0xeb, 0x50, 0x00, 0xff, 0xeb, 0x50, 0x00, 0xff, + 0xe7, 0x55, 0x00, 0xff, 0xe7, 0x55, 0x00, 0xff, + 0xea, 0x65, 0x00, 0xff, 0xea, 0x65, 0x00, 0xff, + 0xea, 0x74, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff, + 0xec, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, + 0xfa, 0xb1, 0x00, 0xff, 0xfa, 0xb1, 0x00, 0xff, + 0xf1, 0x8d, 0x00, 0xff, 0xf1, 0x8d, 0x00, 0xff, + 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff, + 0xf8, 0x7d, 0x00, 0xff, 0xf8, 0x7d, 0x00, 0xff, + 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, + 0xf2, 0x75, 0x00, 0xff, 0xf2, 0x75, 0x00, 0xff, + 0xe9, 0x73, 0x00, 0xff, 0xec, 0x73, 0x00, 0xff, + 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, + 0xed, 0x72, 0x00, 0xff, 0xed, 0x72, 0x00, 0xff, + 0xed, 0x72, 0x00, 0xff, 0xed, 0x66, 0x00, 0xff, + 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, + 0xef, 0x6a, 0x00, 0xff, 0xef, 0x6a, 0x00, 0xff, + 0xea, 0x65, 0x00, 0xff, 0xed, 0x71, 0x00, 0xff, + 0xed, 0x7d, 0x00, 0xff, 0xef, 0x7d, 0x00, 0xff, + 0xec, 0x80, 0x00, 0xff, 0xee, 0x94, 0x00, 0xff, + 0xee, 0xac, 0x00, 0xff, 0xee, 0xc4, 0x00, 0xff, + ]) +} + +var img_32x32_signed_rg11_eac = { + compressed: new Uint8Array([ + 0x24, 0x8b, 0x92, 0x08, 0x02, 0x01, 0x12, 0x53, + 0x09, 0x72, 0xdb, 0x5d, 0x68, 0xb4, 0x49, 0x01, + 0xd6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02, + 0xe6, 0x62, 0xd2, 0x0b, 0x01, 0xd0, 0x9d, 0x02, + 0xe0, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0xf1, 0x47, 0xd1, 0x1d, 0x42, 0xf0, 0x39, 0x1b, + 0xd8, 0x62, 0xa0, 0x2c, 0x0a, 0xd0, 0xab, 0x02, + 0xd8, 0x69, 0xd0, 0x2f, 0x0a, 0xf4, 0xad, 0x42, + 0xd4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0xe4, 0x30, 0xf0, 0x2d, 0x83, 0xda, 0xac, 0x43, + 0xcb, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0xcb, 0x7b, 0xd4, 0x4d, 0x41, 0xd6, 0x2f, 0x41, + 0xf2, 0xbd, 0xd1, 0x2d, 0x11, 0xd0, 0xac, 0x02, + 0xe0, 0x47, 0xf5, 0x2f, 0x51, 0xf4, 0xaf, 0x02, + 0x1f, 0x49, 0x48, 0x92, 0x04, 0x92, 0xdb, 0xb7, + 0xf5, 0x6b, 0x80, 0xab, 0x01, 0xd6, 0x0f, 0xac, + 0xe9, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0xe9, 0x69, 0xbb, 0x58, 0x00, 0x25, 0x20, 0x9a, + 0x9d, 0x32, 0xfe, 0xae, 0x10, 0x9c, 0x99, 0x31, + 0xb2, 0x3c, 0xfe, 0xbe, 0x18, 0x1d, 0xb0, 0x2b, + 0x90, 0x3c, 0xa2, 0xde, 0x00, 0xd9, 0x09, 0x22, + 0xa5, 0x20, 0x86, 0x4e, 0x49, 0x91, 0xa0, 0x03, + 0x93, 0x3d, 0x18, 0xea, 0x0e, 0x14, 0xbc, 0x1e, + 0x98, 0x2a, 0x32, 0xf0, 0x6f, 0x22, 0xa8, 0x57, + 0x82, 0x8f, 0x96, 0x4b, 0x24, 0x96, 0x4d, 0x2c, + 0xa9, 0x3a, 0x54, 0x2a, 0x80, 0x54, 0x2e, 0x2a, + 0xdd, 0x47, 0x29, 0x00, 0xc2, 0x64, 0x26, 0xb0, + 0xb7, 0x4b, 0xd5, 0x0f, 0x02, 0x98, 0x29, 0x78, + 0xea, 0x44, 0x6a, 0xc0, 0xad, 0x82, 0x61, 0x26, + 0xc5, 0x20, 0x66, 0x0a, 0x64, 0xf4, 0x6b, 0xc6, + 0x35, 0x4b, 0x64, 0x14, 0x80, 0x92, 0x4f, 0xff, + 0xe5, 0x47, 0x64, 0x14, 0x80, 0x00, 0x0b, 0x6d, + 0xdd, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0xed, 0x62, 0xb2, 0xe1, 0x04, 0x24, 0x24, 0x52, + 0x97, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0xa0, 0x2a, 0xf7, 0xd5, 0xe8, 0x0b, 0xaa, 0x05, + 0x8e, 0x3d, 0x77, 0xb4, 0xe7, 0x49, 0xbb, 0x5b, + 0xa0, 0x30, 0x63, 0x82, 0xaf, 0x24, 0x00, 0x1b, + 0x8e, 0x42, 0x80, 0x18, 0x08, 0xd2, 0x68, 0x25, + 0x8f, 0x2a, 0xf6, 0xaf, 0x45, 0xe0, 0x70, 0x85, + 0xc0, 0x42, 0x09, 0x44, 0x88, 0xa0, 0x6b, 0xad, + 0x97, 0x2a, 0xa9, 0x74, 0x85, 0xa9, 0x7b, 0xed, + 0xf0, 0x23, 0x6f, 0xfb, 0xff, 0xf7, 0xf3, 0xff, + 0x87, 0xb2, 0xb6, 0xdd, 0x6d, 0xba, 0xd9, 0x6d, + 0x24, 0x37, 0x2e, 0xf6, 0x7f, 0xaf, 0xfb, 0x7f, + 0xa7, 0x4c, 0x63, 0x90, 0xc9, 0xe0, 0x9f, 0xc9, + 0xfb, 0xb5, 0xdb, 0x6d, 0xb6, 0xdf, 0xff, 0xff, + 0xdb, 0xbd, 0x8a, 0x24, 0x92, 0x80, 0x0d, 0xb6, + 0xe3, 0x50, 0xb7, 0x69, 0x24, 0x12, 0x46, 0xd4, + 0xf1, 0x67, 0xdb, 0xfb, 0xae, 0x12, 0x46, 0xd4, + 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x9b, 0x3c, 0x84, 0xf2, 0xdb, 0x2d, 0xb6, 0xdb, + 0x80, 0x2f, 0x02, 0x78, 0x04, 0xb4, 0x0b, 0x6d, + 0x80, 0x20, 0x02, 0x68, 0x04, 0xd8, 0x0d, 0xb6, + 0xaf, 0x42, 0x40, 0x04, 0x24, 0x82, 0xeb, 0xb6, + 0xa8, 0x2a, 0x56, 0xd5, 0x7f, 0x0a, 0xfb, 0xff, + 0xe5, 0x47, 0x42, 0x48, 0xa6, 0x9e, 0xff, 0xbe, + 0xb2, 0x20, 0x66, 0xda, 0xef, 0x58, 0x6d, 0x34, + 0x20, 0x20, 0x00, 0x41, 0x04, 0x0a, 0x0f, 0xff, + 0xaf, 0x20, 0x92, 0x69, 0xa6, 0x83, 0x46, 0xdb, + 0x5a, 0x2b, 0x6d, 0x14, 0x44, 0x12, 0xdb, 0xbf, + 0x8b, 0x19, 0x25, 0x28, 0x01, 0xb6, 0x4f, 0xb5, + 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xcd, 0x4c, 0x6d, 0xb0, 0x49, 0xb6, 0xcf, 0xff, + 0xd5, 0x47, 0xff, 0x6f, 0x24, 0x90, 0x08, 0x12, + 0xcd, 0x62, 0xfe, 0xdf, 0xa4, 0xd8, 0x0d, 0x49, + 0xb0, 0x5a, 0xf4, 0x20, 0x00, 0x66, 0xd4, 0xd1, + 0xb3, 0x52, 0xfa, 0x19, 0x24, 0x68, 0x06, 0xda, + 0x83, 0x85, 0x92, 0xd9, 0x2d, 0x96, 0xdb, 0x2f, + 0x83, 0x85, 0x90, 0x09, 0x28, 0x96, 0xd1, 0x2f, + 0xdc, 0x20, 0x6c, 0x00, 0x06, 0xc3, 0xfd, 0xbf, + 0xaf, 0x20, 0x4a, 0x49, 0x27, 0xf2, 0x4f, 0xe4, + 0x0a, 0x42, 0x46, 0x00, 0xa5, 0x82, 0x51, 0x34, + 0xc8, 0x42, 0x10, 0xaa, 0x08, 0xd4, 0x8b, 0xa1, + 0x41, 0x36, 0x60, 0x00, 0xc0, 0x16, 0xdb, 0x6d, + 0x92, 0x3c, 0x9f, 0xff, 0x3f, 0xe4, 0x92, 0x49, + 0x64, 0x11, 0x6c, 0x01, 0xb6, 0xb6, 0x4f, 0xfd, + 0x89, 0x1a, 0x6d, 0xb6, 0x49, 0x90, 0x0d, 0xb4, + 0x6f, 0x2d, 0x49, 0x12, 0x40, 0x12, 0x5b, 0x76, + 0xb3, 0xb2, 0x00, 0x09, 0x24, 0xb6, 0xdd, 0xb6, + 0xf6, 0x31, 0x9b, 0x64, 0x84, 0x2d, 0x96, 0xc9, + 0xd9, 0x72, 0xbb, 0x60, 0x25, 0x04, 0x82, 0x40, + 0xcb, 0x3a, 0x02, 0xd4, 0xad, 0x0b, 0xf1, 0x6f, + 0xa9, 0x3a, 0xb7, 0xf0, 0x3f, 0xa1, 0x2b, 0xfa, + 0xf0, 0x23, 0x76, 0xd3, 0xed, 0x7f, 0xfb, 0x7f, + 0x9f, 0x32, 0x9f, 0xf6, 0x7f, 0x84, 0x9f, 0xc9, + 0x06, 0x47, 0x93, 0xc5, 0x3e, 0x82, 0xe1, 0x34, + 0xb6, 0x32, 0xd8, 0x33, 0x81, 0xd1, 0x19, 0x8b, + 0x26, 0x20, 0x00, 0x60, 0x07, 0x1b, 0xfd, 0xb7, + 0x9a, 0x10, 0xff, 0xbf, 0xf8, 0xec, 0x06, 0xd8, + 0x5b, 0x24, 0x6c, 0x0c, 0x00, 0x96, 0xcd, 0x6c, + 0x82, 0xfd, 0x00, 0x0a, 0x00, 0x00, 0x08, 0x00, + 0x6b, 0x2d, 0x80, 0xab, 0x01, 0xb0, 0x1d, 0x60, + 0x89, 0x1a, 0x69, 0x22, 0x00, 0x96, 0xdd, 0xb7, + 0x6d, 0x00, 0x49, 0x20, 0x00, 0xdb, 0x6f, 0xff, + 0xce, 0x5c, 0x6d, 0xb2, 0x49, 0xb6, 0xcf, 0xff, + 0x1b, 0x33, 0x92, 0xd9, 0x40, 0x3b, 0x66, 0x49, + 0xe6, 0x5f, 0xdb, 0xfd, 0xed, 0x12, 0x46, 0x00, + 0x15, 0x37, 0x66, 0x66, 0x66, 0x42, 0xf4, 0x2f, + 0xb1, 0x29, 0xdb, 0xf9, 0x2d, 0x24, 0x06, 0xd2, + 0x15, 0x20, 0x5b, 0x61, 0xb7, 0x1f, 0xfd, 0xbf, + 0x84, 0x41, 0xb6, 0xdd, 0x6e, 0xdb, 0x6b, 0x76, + 0x43, 0x27, 0x4e, 0xf6, 0x2e, 0x02, 0xf2, 0xb7, + 0x86, 0x2b, 0xb2, 0xf9, 0xee, 0xfe, 0xfd, 0x77, + 0x54, 0x2b, 0x66, 0x62, 0x66, 0x93, 0xf9, 0x6f, + 0x8b, 0x2a, 0x46, 0x62, 0x66, 0x4a, 0xd4, 0x05, + 0x61, 0x2d, 0x44, 0x82, 0x04, 0x12, 0x59, 0x6e, + 0x88, 0x1b, 0x62, 0x64, 0x26, 0x22, 0xf3, 0x2f, + 0x66, 0x2d, 0x04, 0xa8, 0x01, 0xb2, 0x0d, 0x6c, + 0x91, 0x10, 0x6d, 0x14, 0x44, 0x12, 0xeb, 0xbf, + 0x6c, 0x2d, 0x80, 0xab, 0x01, 0xd6, 0x0d, 0xac, + 0xe7, 0x6b, 0x6d, 0x12, 0x44, 0x92, 0xed, 0xbf, + 0x5d, 0x37, 0x17, 0xf4, 0x2f, 0x66, 0x66, 0xce, + 0x07, 0x62, 0x97, 0x61, 0x2e, 0x44, 0x44, 0x8c, + 0x47, 0x72, 0x92, 0xe9, 0x2e, 0x12, 0xe1, 0x2e, + 0xd5, 0x47, 0x02, 0xf0, 0x2f, 0x42, 0xf4, 0x2f, + 0x59, 0xdd, 0x12, 0xe1, 0x2e, 0x12, 0xe1, 0x2e, + 0xd2, 0x4c, 0x62, 0xf6, 0x2f, 0x66, 0x76, 0x67, + 0x66, 0x12, 0x68, 0x56, 0x66, 0x42, 0xf3, 0x37, + 0x83, 0xef, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x66, 0x1f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0xc7, 0x47, 0x42, 0xf6, 0x2f, 0x62, 0xf6, 0x67, + 0x60, 0x2f, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x83, 0xdf, 0x97, 0x79, 0x77, 0x97, 0x79, 0x77, + 0x66, 0x1b, 0x42, 0x62, 0x2e, 0x32, 0xf1, 0x2f, + 0xcd, 0x5b, 0x66, 0x64, 0x26, 0x42, 0xf3, 0x37, + 0x6b, 0x2d, 0x44, 0x54, 0x65, 0x42, 0x62, 0x2e, + 0x0d, 0x40, 0x68, 0x84, 0x44, 0x12, 0xe9, 0x77, + ]), + decompressed: new Uint8Array([ + 0xab, 0xb9, 0x00, 0xff, 0xab, 0xb9, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff, + 0x80, 0x8f, 0x00, 0xff, 0x6e, 0x7e, 0x00, 0xff, + 0x80, 0x8f, 0x00, 0xff, 0x80, 0x8f, 0x00, 0xff, + 0x7c, 0x8c, 0x00, 0xff, 0x7c, 0x8c, 0x00, 0xff, + 0x87, 0x98, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, + 0x70, 0x81, 0x00, 0xff, 0x81, 0x8d, 0x00, 0xff, + 0x81, 0x8d, 0x00, 0xff, 0x70, 0x81, 0x00, 0xff, + 0x7e, 0x8d, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x75, 0x75, 0x00, 0xff, 0x75, 0x75, 0x00, 0xff, + 0x75, 0x75, 0x00, 0xff, 0x89, 0x89, 0x00, 0xff, + 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff, + 0x87, 0x87, 0x00, 0xff, 0x87, 0x87, 0x00, 0xff, + 0x7f, 0x7b, 0x00, 0xff, 0x8a, 0x8c, 0x00, 0xff, + 0xa2, 0x98, 0x00, 0xff, 0xae, 0xaa, 0x00, 0xff, + 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x7c, 0x8f, 0x00, 0xff, + 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, + 0x5c, 0x6c, 0x00, 0xff, 0x5c, 0x6c, 0x00, 0xff, + 0x68, 0x79, 0x00, 0xff, 0x70, 0x80, 0x00, 0xff, + 0x68, 0x79, 0x00, 0xff, 0x68, 0x79, 0x00, 0xff, + 0x4c, 0x5e, 0x00, 0xff, 0x4c, 0x5e, 0x00, 0xff, + 0x5e, 0x70, 0x00, 0xff, 0x5e, 0x70, 0x00, 0xff, + 0x5a, 0x6a, 0x00, 0xff, 0x6c, 0x7c, 0x00, 0xff, + 0x6c, 0x7c, 0x00, 0xff, 0x42, 0x52, 0x00, 0xff, + 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, + 0x67, 0x67, 0x00, 0xff, 0x67, 0x67, 0x00, 0xff, + 0x72, 0x70, 0x00, 0xff, 0x72, 0x70, 0x00, 0xff, + 0x72, 0x70, 0x00, 0xff, 0x67, 0x68, 0x00, 0xff, + 0x7f, 0x69, 0x00, 0xff, 0x96, 0x7b, 0x00, 0xff, + 0xa2, 0x8c, 0x00, 0xff, 0xba, 0x98, 0x00, 0xff, + 0xab, 0xb9, 0x00, 0xff, 0x93, 0xa4, 0x00, 0xff, + 0x6c, 0x7b, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, + 0x5c, 0x6c, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff, + 0x38, 0x48, 0x00, 0xff, 0x4a, 0x5a, 0x00, 0xff, + 0x40, 0x51, 0x00, 0xff, 0x54, 0x65, 0x00, 0xff, + 0x54, 0x65, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff, + 0x4c, 0x4c, 0x00, 0xff, 0x3a, 0x3a, 0x00, 0xff, + 0x3a, 0x3a, 0x00, 0xff, 0x4c, 0x4c, 0x00, 0xff, + 0x4b, 0x5b, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x4b, 0x5b, 0x00, 0xff, + 0x3d, 0x3d, 0x00, 0xff, 0x3d, 0x3d, 0x00, 0xff, + 0x52, 0x52, 0x00, 0xff, 0x3d, 0x3d, 0x00, 0xff, + 0x51, 0x40, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, + 0x5c, 0x4c, 0x00, 0xff, 0x67, 0x54, 0x00, 0xff, + 0x8a, 0x57, 0x00, 0xff, 0x96, 0x69, 0x00, 0xff, + 0xae, 0x7b, 0x00, 0xff, 0xba, 0x8c, 0x00, 0xff, + 0x93, 0xa4, 0x00, 0xff, 0x6c, 0x7b, 0x00, 0xff, + 0x7c, 0x8f, 0x00, 0xff, 0x54, 0x66, 0x00, 0xff, + 0x4a, 0x5a, 0x00, 0xff, 0x38, 0x48, 0x00, 0xff, + 0x38, 0x48, 0x00, 0xff, 0x26, 0x36, 0x00, 0xff, + 0x4c, 0x5d, 0x00, 0xff, 0x40, 0x51, 0x00, 0xff, + 0x34, 0x45, 0x00, 0xff, 0x34, 0x45, 0x00, 0xff, + 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x28, 0x28, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x39, 0x49, 0x00, 0xff, 0x27, 0x37, 0x00, 0xff, + 0x52, 0x52, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x1a, 0x1a, 0x00, 0xff, 0x28, 0x28, 0x00, 0xff, + 0x51, 0x40, 0x00, 0xff, 0x5c, 0x4c, 0x00, 0xff, + 0x51, 0x40, 0x00, 0xff, 0x51, 0x40, 0x00, 0xff, + 0x8a, 0x4b, 0x00, 0xff, 0xa2, 0x57, 0x00, 0xff, + 0xae, 0x69, 0x00, 0xff, 0xc2, 0x7b, 0x00, 0xff, + 0x80, 0x80, 0x00, 0xff, 0x6f, 0x6f, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x41, 0x4d, 0x00, 0xff, 0x41, 0x4d, 0x00, 0xff, + 0x20, 0x29, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff, + 0x19, 0x29, 0x00, 0xff, 0x2b, 0x41, 0x00, 0xff, + 0x22, 0x29, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, + 0x10, 0x10, 0x00, 0xff, 0x16, 0x14, 0x00, 0xff, + 0x10, 0x10, 0x00, 0xff, 0x19, 0x1a, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x32, 0x44, 0x00, 0xff, + 0x49, 0x4f, 0x00, 0xff, 0x51, 0x5b, 0x00, 0xff, + 0x31, 0x3b, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, + 0x3a, 0x27, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x72, 0x61, 0x00, 0xff, 0x5e, 0x4f, 0x00, 0xff, + 0x8c, 0x39, 0x00, 0xff, 0x98, 0x45, 0x00, 0xff, + 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, + 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x4b, 0x4b, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x41, 0x4d, 0x00, 0xff, 0x17, 0x29, 0x00, 0xff, + 0x41, 0x4d, 0x00, 0xff, 0x20, 0x29, 0x00, 0xff, + 0x07, 0x19, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, + 0x22, 0x29, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, + 0x19, 0x1a, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x16, 0x14, 0x00, 0xff, 0x10, 0x10, 0x00, 0xff, + 0x22, 0x32, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff, + 0x22, 0x32, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, + 0x3d, 0x47, 0x00, 0xff, 0x31, 0x3b, 0x00, 0xff, + 0x49, 0x4f, 0x00, 0xff, 0x3d, 0x47, 0x00, 0xff, + 0x4a, 0x39, 0x00, 0xff, 0x4a, 0x39, 0x00, 0xff, + 0x5e, 0x4f, 0x00, 0xff, 0x72, 0x61, 0x00, 0xff, + 0xa0, 0x51, 0x00, 0xff, 0x98, 0x45, 0x00, 0xff, + 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, + 0x92, 0x92, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x2d, 0x2d, 0x00, 0xff, + 0x29, 0x3b, 0x00, 0xff, 0x05, 0x14, 0x00, 0xff, + 0x0e, 0x14, 0x00, 0xff, 0x32, 0x3b, 0x00, 0xff, + 0x19, 0x29, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, + 0x00, 0x07, 0x00, 0xff, 0x16, 0x1f, 0x00, 0xff, + 0x0d, 0x1e, 0x00, 0xff, 0x0d, 0x1e, 0x00, 0xff, + 0x0d, 0x1e, 0x00, 0xff, 0x00, 0x08, 0x00, 0xff, + 0x12, 0x23, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, + 0x12, 0x23, 0x00, 0xff, 0x22, 0x32, 0x00, 0xff, + 0x3d, 0x1b, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, + 0x51, 0x2f, 0x00, 0xff, 0x79, 0x5b, 0x00, 0xff, + 0x7e, 0x49, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0x72, 0x3f, 0x00, 0xff, + 0xac, 0x59, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, + 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, + 0x80, 0x80, 0x00, 0xff, 0x5d, 0x5d, 0x00, 0xff, + 0x39, 0x39, 0x00, 0xff, 0x39, 0x39, 0x00, 0xff, + 0x05, 0x14, 0x00, 0xff, 0x17, 0x29, 0x00, 0xff, + 0x0e, 0x14, 0x00, 0xff, 0x0e, 0x14, 0x00, 0xff, + 0x19, 0x29, 0x00, 0xff, 0x07, 0x19, 0x00, 0xff, + 0x07, 0x13, 0x00, 0xff, 0x00, 0x07, 0x00, 0xff, + 0x19, 0x2a, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff, + 0x00, 0x08, 0x00, 0xff, 0x19, 0x2a, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x12, 0x23, 0x00, 0xff, + 0x12, 0x11, 0x00, 0xff, 0x12, 0x11, 0x00, 0xff, + 0x51, 0x2f, 0x00, 0xff, 0x3d, 0x1b, 0x00, 0xff, + 0x3d, 0x1b, 0x00, 0xff, 0x51, 0x2f, 0x00, 0xff, + 0x72, 0x3f, 0x00, 0xff, 0x7e, 0x49, 0x00, 0xff, + 0x85, 0x55, 0x00, 0xff, 0x85, 0x55, 0x00, 0xff, + 0xa0, 0x51, 0x00, 0xff, 0xac, 0x59, 0x00, 0xff, + 0xb8, 0x59, 0x00, 0xff, 0xd8, 0x75, 0x00, 0xff, + 0x75, 0x84, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x07, 0x10, 0x00, 0xff, + 0x13, 0x1c, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x0e, 0x00, 0xff, + 0x05, 0x0e, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff, + 0x12, 0x21, 0x00, 0xff, 0x12, 0x21, 0x00, 0xff, + 0x2a, 0x21, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, + 0x38, 0x1d, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff, + 0x50, 0x1d, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x76, 0x54, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x68, 0x12, 0x00, 0xff, + 0x94, 0x00, 0x00, 0xff, 0x82, 0x1b, 0x00, 0xff, + 0xaf, 0x4b, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff, + 0xd2, 0x5b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xd2, 0x5b, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x63, 0x73, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x3f, 0x4f, 0x00, 0xff, 0x3f, 0x4f, 0x00, 0xff, + 0x1d, 0x26, 0x00, 0xff, 0x29, 0x32, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x11, 0x17, 0x00, 0xff, 0x00, 0x05, 0x00, 0xff, + 0x05, 0x0e, 0x00, 0xff, 0x11, 0x17, 0x00, 0xff, + 0x06, 0x15, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, + 0x12, 0x0b, 0x00, 0xff, 0x06, 0x00, 0x00, 0xff, + 0x20, 0x07, 0x00, 0xff, 0x20, 0x07, 0x00, 0xff, + 0x38, 0x07, 0x00, 0xff, 0x5c, 0x29, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x76, 0x54, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x82, 0x1b, 0x00, 0xff, 0x94, 0x00, 0x00, 0xff, + 0x82, 0x1b, 0x00, 0xff, 0xaf, 0x4b, 0x00, 0xff, + 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x75, 0x84, 0x00, 0xff, 0x51, 0x61, 0x00, 0xff, + 0x51, 0x61, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x29, 0x32, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x29, 0x4a, 0x00, 0xff, 0x0e, 0x2f, 0x00, 0xff, + 0x00, 0x17, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x06, 0x15, 0x00, 0xff, 0x00, 0x0b, 0x00, 0xff, + 0x12, 0x0b, 0x00, 0xff, 0x12, 0x0b, 0x00, 0xff, + 0x20, 0x07, 0x00, 0xff, 0x2c, 0x13, 0x00, 0xff, + 0x38, 0x07, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0xaf, 0x4b, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x5b, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x86, 0x96, 0x00, 0xff, 0x63, 0x73, 0x00, 0xff, + 0x2d, 0x3d, 0x00, 0xff, 0x2d, 0x3d, 0x00, 0xff, + 0x1d, 0x26, 0x00, 0xff, 0x13, 0x1c, 0x00, 0xff, + 0x07, 0x10, 0x00, 0xff, 0x1d, 0x26, 0x00, 0xff, + 0x00, 0x17, 0x00, 0xff, 0x29, 0x4a, 0x00, 0xff, + 0x00, 0x17, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x06, 0x15, 0x00, 0xff, + 0x2a, 0x21, 0x00, 0xff, 0x1e, 0x15, 0x00, 0xff, + 0x44, 0x29, 0x00, 0xff, 0x38, 0x1d, 0x00, 0xff, + 0x5c, 0x29, 0x00, 0xff, 0x50, 0x1d, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0x87, 0x33, 0x00, 0xff, 0x87, 0x33, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd2, 0x3a, 0x00, 0xff, 0xd2, 0x3a, 0x00, 0xff, + 0xe8, 0x50, 0x00, 0xff, 0xe8, 0x71, 0x00, 0xff, + 0x7c, 0x9a, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff, + 0x54, 0x5f, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x21, 0x21, 0x00, 0xff, 0x0f, 0x0f, 0x00, 0xff, + 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x0f, 0x18, 0x00, 0xff, 0x0f, 0x18, 0x00, 0xff, + 0x33, 0x24, 0x00, 0xff, 0x3f, 0x2e, 0x00, 0xff, + 0x45, 0x14, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, + 0x6d, 0x20, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xc5, 0x06, 0x00, 0xff, 0xcb, 0x0c, 0x00, 0xff, + 0xd5, 0x0f, 0x00, 0xff, 0xe1, 0x14, 0x00, 0xff, + 0xe7, 0x25, 0x00, 0xff, 0xe7, 0x41, 0x00, 0xff, + 0xe7, 0x59, 0x00, 0xff, 0xe7, 0x71, 0x00, 0xff, + 0x7c, 0x9a, 0x00, 0xff, 0x6d, 0x9a, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x18, 0x2f, 0x00, 0xff, + 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x09, 0x11, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x27, 0x2e, 0x00, 0xff, 0x27, 0x2e, 0x00, 0xff, + 0x27, 0x18, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, + 0x59, 0x26, 0x00, 0xff, 0x45, 0x14, 0x00, 0xff, + 0x8c, 0x42, 0x00, 0xff, 0x80, 0x36, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff, + 0x8d, 0x29, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xc5, 0x06, 0x00, 0xff, 0xcf, 0x09, 0x00, 0xff, + 0xdb, 0x0f, 0x00, 0xff, 0xe5, 0x12, 0x00, 0xff, + 0xe9, 0x25, 0x00, 0xff, 0xe9, 0x3d, 0x00, 0xff, + 0xe9, 0x59, 0x00, 0xff, 0xe9, 0x71, 0x00, 0xff, + 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x88, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x36, 0x41, 0x00, 0xff, + 0x0f, 0x0f, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x05, 0x05, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff, + 0x3f, 0x2e, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, + 0x6d, 0x3c, 0x00, 0xff, 0x6d, 0x3c, 0x00, 0xff, + 0x75, 0x2c, 0x00, 0xff, 0x8c, 0x42, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0x99, 0x33, 0x00, 0xff, + 0xa3, 0x3f, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xcb, 0x03, 0x00, 0xff, 0xd5, 0x09, 0x00, 0xff, + 0xe1, 0x0c, 0x00, 0xff, 0xeb, 0x12, 0x00, 0xff, + 0xeb, 0x25, 0x00, 0xff, 0xeb, 0x3d, 0x00, 0xff, + 0xeb, 0x59, 0x00, 0xff, 0xeb, 0x71, 0x00, 0xff, + 0x8a, 0xac, 0x00, 0xff, 0x6d, 0x9a, 0x00, 0xff, + 0x6d, 0x7d, 0x00, 0xff, 0x6d, 0x7d, 0x00, 0xff, + 0x36, 0x36, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x11, 0x11, 0x00, 0xff, 0x05, 0x05, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x09, 0x11, 0x00, 0xff, + 0x27, 0x2e, 0x00, 0xff, 0x33, 0x3a, 0x00, 0xff, + 0x4b, 0x3a, 0x00, 0xff, 0x4b, 0x3a, 0x00, 0xff, + 0x6d, 0x3c, 0x00, 0xff, 0x80, 0x4e, 0x00, 0xff, + 0x8c, 0x42, 0x00, 0xff, 0x80, 0x36, 0x00, 0xff, + 0xa3, 0x3f, 0x00, 0xff, 0xa3, 0x3f, 0x00, 0xff, + 0x99, 0x33, 0x00, 0xff, 0xbb, 0x11, 0x00, 0xff, + 0xcf, 0x03, 0x00, 0xff, 0xdb, 0x06, 0x00, 0xff, + 0xe1, 0x0c, 0x00, 0xff, 0xeb, 0x0f, 0x00, 0xff, + 0xed, 0x25, 0x00, 0xff, 0xed, 0x3d, 0x00, 0xff, + 0xed, 0x55, 0x00, 0xff, 0xed, 0x71, 0x00, 0xff, + 0x7d, 0x94, 0x00, 0xff, 0x7d, 0x94, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x6f, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, + 0x00, 0x00, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x3e, 0x1d, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x6c, 0x4b, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, + 0x6a, 0x40, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, + 0x8d, 0x64, 0x00, 0xff, 0x81, 0x58, 0x00, 0xff, + 0x9f, 0x18, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xd6, 0x00, 0x00, 0xff, 0xe0, 0x00, 0x00, 0xff, + 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, + 0xec, 0x5f, 0x00, 0xff, 0xf0, 0x80, 0x00, 0xff, + 0x7d, 0x94, 0x00, 0xff, 0x5d, 0x77, 0x00, 0xff, + 0x5d, 0x77, 0x00, 0xff, 0x49, 0x65, 0x00, 0xff, + 0x3f, 0x56, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, + 0x1c, 0x0b, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, + 0x13, 0x13, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x13, 0x13, 0x00, 0xff, + 0x3e, 0x1d, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, + 0x76, 0x4c, 0x00, 0xff, 0x6a, 0x40, 0x00, 0xff, + 0x81, 0x58, 0x00, 0xff, 0x8d, 0x64, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0x9f, 0x18, 0x00, 0xff, + 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xe9, 0x0a, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xea, 0x3e, 0x00, 0xff, + 0xee, 0x5f, 0x00, 0xff, 0xf0, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, + 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x26, 0x38, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, + 0x3f, 0x29, 0x00, 0xff, 0x08, 0x00, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x33, 0x33, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x56, 0x33, 0x00, 0xff, + 0x78, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, + 0x8d, 0x34, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff, + 0x8d, 0x34, 0x00, 0xff, 0xa5, 0x4c, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xe0, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xe5, 0x07, 0x00, 0xff, 0xef, 0x10, 0x00, 0xff, + 0xe8, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xee, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x71, 0x65, 0x00, 0xff, 0x5d, 0x53, 0x00, 0xff, + 0x49, 0x41, 0x00, 0xff, 0x35, 0x2f, 0x00, 0xff, + 0x08, 0x1a, 0x00, 0xff, 0x26, 0x38, 0x00, 0xff, + 0x3f, 0x29, 0x00, 0xff, 0x1c, 0x0b, 0x00, 0xff, + 0x33, 0x00, 0x00, 0xff, 0x33, 0x00, 0x00, 0xff, + 0x33, 0x33, 0x00, 0xff, 0x53, 0x53, 0x00, 0xff, + 0x56, 0x33, 0x00, 0xff, 0x6c, 0x4b, 0x00, 0xff, + 0x78, 0x33, 0x00, 0xff, 0x78, 0x33, 0x00, 0xff, + 0x81, 0x28, 0x00, 0xff, 0x99, 0x40, 0x00, 0xff, + 0x99, 0x40, 0x00, 0xff, 0x8d, 0x34, 0x00, 0xff, + 0xb4, 0x2d, 0x00, 0xff, 0xb4, 0x2d, 0x00, 0xff, + 0xd2, 0x06, 0x00, 0xff, 0xd2, 0x06, 0x00, 0xff, + 0xe0, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xe5, 0x07, 0x00, 0xff, 0xe9, 0x0a, 0x00, 0xff, + 0xea, 0x1d, 0x00, 0xff, 0xec, 0x3e, 0x00, 0xff, + 0xf0, 0x5f, 0x00, 0xff, 0xf2, 0x80, 0x00, 0xff, + 0x7c, 0x75, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff, + 0x61, 0x4b, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, + 0x45, 0x32, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x45, 0x32, 0x00, 0xff, 0x45, 0x32, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x68, 0x00, 0x00, 0xff, + 0x56, 0x22, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x66, 0x27, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x7a, 0x39, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc2, 0x00, 0x00, 0xff, 0xe8, 0x11, 0x00, 0xff, + 0xde, 0x00, 0x00, 0xff, 0xe8, 0x02, 0x00, 0xff, + 0xea, 0x00, 0x00, 0xff, 0xec, 0x05, 0x00, 0xff, + 0xec, 0x0a, 0x00, 0xff, 0xee, 0x10, 0x00, 0xff, + 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, + 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x58, 0x4b, 0x00, 0xff, + 0x4f, 0x36, 0x00, 0xff, 0x4f, 0x36, 0x00, 0xff, + 0x45, 0x32, 0x00, 0xff, 0x33, 0x23, 0x00, 0xff, + 0x33, 0x23, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x8d, 0x4b, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, + 0x7a, 0x39, 0x00, 0xff, 0x8d, 0x4b, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xc2, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, + 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, + 0xe8, 0x01, 0x00, 0xff, 0xea, 0x07, 0x00, 0xff, + 0xea, 0x0c, 0x00, 0xff, 0xec, 0x10, 0x00, 0xff, + 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, + 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x6d, 0x60, 0x00, 0xff, + 0x4f, 0x36, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff, + 0x54, 0x44, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, + 0x66, 0x11, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, + 0xad, 0x30, 0x00, 0xff, 0xad, 0x30, 0x00, 0xff, + 0x95, 0x1e, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff, + 0x9f, 0x28, 0x00, 0xff, 0x9f, 0x28, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xb5, 0x0b, 0x00, 0xff, + 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, + 0xe4, 0x00, 0x00, 0xff, 0xe4, 0x00, 0x00, 0xff, + 0xe6, 0x01, 0x00, 0xff, 0xe8, 0x07, 0x00, 0xff, + 0xe8, 0x0c, 0x00, 0xff, 0xea, 0x10, 0x00, 0xff, + 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, + 0xed, 0x5d, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x90, 0x89, 0x00, 0xff, 0x7c, 0x75, 0x00, 0xff, + 0x61, 0x4b, 0x00, 0xff, 0x61, 0x4b, 0x00, 0xff, + 0x54, 0x44, 0x00, 0xff, 0x54, 0x44, 0x00, 0xff, + 0x66, 0x11, 0x00, 0xff, 0x66, 0x11, 0x00, 0xff, + 0x76, 0x43, 0x00, 0xff, 0x76, 0x43, 0x00, 0xff, + 0x87, 0x10, 0x00, 0xff, 0x87, 0x10, 0x00, 0xff, + 0x8d, 0x0f, 0x00, 0xff, 0xa1, 0x27, 0x00, 0xff, + 0xa1, 0x27, 0x00, 0xff, 0x8d, 0x0f, 0x00, 0xff, + 0xb5, 0x0b, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xc1, 0x17, 0x00, 0xff, 0xc1, 0x17, 0x00, 0xff, + 0xd4, 0x00, 0x00, 0xff, 0xd4, 0x00, 0x00, 0xff, + 0xde, 0x00, 0x00, 0xff, 0xde, 0x00, 0x00, 0xff, + 0xe4, 0x01, 0x00, 0xff, 0xe6, 0x07, 0x00, 0xff, + 0xe6, 0x0c, 0x00, 0xff, 0xe8, 0x12, 0x00, 0xff, + 0xeb, 0x1c, 0x00, 0xff, 0xec, 0x3a, 0x00, 0xff, + 0xed, 0x58, 0x00, 0xff, 0xee, 0x7b, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0x9d, 0x83, 0x00, 0xff, + 0x8e, 0x57, 0x00, 0xff, 0x74, 0x39, 0x00, 0xff, + 0x74, 0x3f, 0x00, 0xff, 0x74, 0x33, 0x00, 0xff, + 0x7d, 0x27, 0x00, 0xff, 0x7d, 0x1d, 0x00, 0xff, + 0x82, 0x1c, 0x00, 0xff, 0x8e, 0x28, 0x00, 0xff, + 0x8e, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb2, 0x0e, 0x00, 0xff, 0xac, 0x08, 0x00, 0xff, + 0xbc, 0x18, 0x00, 0xff, 0xb8, 0x12, 0x00, 0xff, + 0xbf, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xda, 0x00, 0x00, 0xff, 0xdc, 0x01, 0x00, 0xff, + 0xde, 0x03, 0x00, 0xff, 0xe0, 0x03, 0x00, 0xff, + 0xe3, 0x02, 0x00, 0xff, 0xe5, 0x08, 0x00, 0xff, + 0xe7, 0x0e, 0x00, 0xff, 0xe9, 0x16, 0x00, 0xff, + 0xeb, 0x2b, 0x00, 0xff, 0xed, 0x49, 0x00, 0xff, + 0xef, 0x6d, 0x00, 0xff, 0xef, 0x8a, 0x00, 0xff, + 0x9d, 0x83, 0x00, 0xff, 0xa3, 0x8d, 0x00, 0xff, + 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, + 0x85, 0x3f, 0x00, 0xff, 0x85, 0x33, 0x00, 0xff, + 0x8b, 0x27, 0x00, 0xff, 0x8b, 0x1d, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xac, 0x08, 0x00, 0xff, 0xbc, 0x18, 0x00, 0xff, + 0xbc, 0x18, 0x00, 0xff, 0xb2, 0x0e, 0x00, 0xff, + 0xc9, 0x03, 0x00, 0xff, 0xc9, 0x03, 0x00, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xdb, 0x07, 0x00, 0xff, + 0xdc, 0x06, 0x00, 0xff, 0xde, 0x06, 0x00, 0xff, + 0xe0, 0x06, 0x00, 0xff, 0xe2, 0x09, 0x00, 0xff, + 0xe1, 0x02, 0x00, 0xff, 0xe3, 0x0b, 0x00, 0xff, + 0xe5, 0x13, 0x00, 0xff, 0xe7, 0x19, 0x00, 0xff, + 0xe9, 0x2b, 0x00, 0xff, 0xeb, 0x49, 0x00, 0xff, + 0xed, 0x6d, 0x00, 0xff, 0xef, 0x8a, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff, + 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, + 0x9a, 0x43, 0x00, 0xff, 0x9a, 0x39, 0x00, 0xff, + 0xa0, 0x2d, 0x00, 0xff, 0xa0, 0x21, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xa4, 0x1c, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xca, 0x0e, 0x00, 0xff, 0xca, 0x0e, 0x00, 0xff, + 0xca, 0x0e, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, + 0xd5, 0x0d, 0x00, 0xff, 0xd5, 0x0d, 0x00, 0xff, + 0xe5, 0x11, 0x00, 0xff, 0xdb, 0x07, 0x00, 0xff, + 0xdc, 0x09, 0x00, 0xff, 0xde, 0x09, 0x00, 0xff, + 0xe0, 0x0c, 0x00, 0xff, 0xe2, 0x0c, 0x00, 0xff, + 0xe1, 0x08, 0x00, 0xff, 0xe3, 0x0e, 0x00, 0xff, + 0xe5, 0x16, 0x00, 0xff, 0xe7, 0x1f, 0x00, 0xff, + 0xe7, 0x3d, 0x00, 0xff, 0xe9, 0x5b, 0x00, 0xff, + 0xeb, 0x7f, 0x00, 0xff, 0xed, 0x9c, 0x00, 0xff, + 0xa3, 0x8d, 0x00, 0xff, 0x94, 0x7a, 0x00, 0xff, + 0xa9, 0x70, 0x00, 0xff, 0x8e, 0x57, 0x00, 0xff, + 0xa9, 0x43, 0x00, 0xff, 0xa9, 0x39, 0x00, 0xff, + 0xb2, 0x2d, 0x00, 0xff, 0xb2, 0x21, 0x00, 0xff, + 0xa4, 0x1c, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xb0, 0x28, 0x00, 0xff, 0xb0, 0x28, 0x00, 0xff, + 0xd6, 0x18, 0x00, 0xff, 0xd0, 0x12, 0x00, 0xff, + 0xd6, 0x18, 0x00, 0xff, 0xd6, 0x18, 0x00, 0xff, + 0xdf, 0x19, 0x00, 0xff, 0xdf, 0x19, 0x00, 0xff, + 0xe5, 0x11, 0x00, 0xff, 0xe5, 0x11, 0x00, 0xff, + 0xde, 0x0e, 0x00, 0xff, 0xe0, 0x0e, 0x00, 0xff, + 0xe2, 0x11, 0x00, 0xff, 0xe4, 0x11, 0x00, 0xff, + 0xdf, 0x0b, 0x00, 0xff, 0xe1, 0x13, 0x00, 0xff, + 0xe3, 0x19, 0x00, 0xff, 0xe5, 0x1f, 0x00, 0xff, + 0xe5, 0x49, 0x00, 0xff, 0xe7, 0x6d, 0x00, 0xff, + 0xe9, 0x8a, 0x00, 0xff, 0xeb, 0x9c, 0x00, 0xff, + 0xd3, 0x8c, 0x00, 0xff, 0xc4, 0x7b, 0x00, 0xff, + 0xbb, 0x57, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, + 0xb8, 0x35, 0x00, 0xff, 0xb8, 0x35, 0x00, 0xff, + 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, + 0xcb, 0x2a, 0x00, 0xff, 0xcb, 0x2a, 0x00, 0xff, + 0xd8, 0x1f, 0x00, 0xff, 0xd8, 0x1f, 0x00, 0xff, + 0xdd, 0x1f, 0x00, 0xff, 0xe0, 0x1f, 0x00, 0xff, + 0xe7, 0x27, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff, + 0xe7, 0x1b, 0x00, 0xff, 0xe7, 0x1b, 0x00, 0xff, + 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, + 0xe3, 0x1d, 0x00, 0xff, 0xe3, 0x1d, 0x00, 0xff, + 0xde, 0x1b, 0x00, 0xff, 0xe0, 0x2a, 0x00, 0xff, + 0xe0, 0x2a, 0x00, 0xff, 0xe3, 0x34, 0x00, 0xff, + 0xe4, 0x51, 0x00, 0xff, 0xe4, 0x69, 0x00, 0xff, + 0xe4, 0x80, 0x00, 0xff, 0xe6, 0x94, 0x00, 0xff, + 0xe8, 0x9e, 0x00, 0xff, 0xd3, 0x8c, 0x00, 0xff, + 0xcd, 0x69, 0x00, 0xff, 0xbb, 0x57, 0x00, 0xff, + 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, + 0xcd, 0x49, 0x00, 0xff, 0xcd, 0x49, 0x00, 0xff, + 0xd8, 0x46, 0x00, 0xff, 0xd8, 0x46, 0x00, 0xff, + 0xd8, 0x42, 0x00, 0xff, 0xd8, 0x42, 0x00, 0xff, + 0xdd, 0x3b, 0x00, 0xff, 0xe0, 0x3b, 0x00, 0xff, + 0xe3, 0x3b, 0x00, 0xff, 0xe6, 0x3b, 0x00, 0xff, + 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x3b, 0x00, 0xff, + 0xe9, 0x3b, 0x00, 0xff, 0xe9, 0x33, 0x00, 0xff, + 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff, + 0xe7, 0x37, 0x00, 0xff, 0xe7, 0x37, 0x00, 0xff, + 0xe3, 0x34, 0x00, 0xff, 0xe3, 0x43, 0x00, 0xff, + 0xe6, 0x43, 0x00, 0xff, 0xe6, 0x52, 0x00, 0xff, + 0xe6, 0x69, 0x00, 0xff, 0xe6, 0x75, 0x00, 0xff, + 0xe8, 0x94, 0x00, 0xff, 0xe8, 0xa0, 0x00, 0xff, + 0xfa, 0xb0, 0x00, 0xff, 0xe8, 0x9e, 0x00, 0xff, + 0xe2, 0x7b, 0x00, 0xff, 0xcd, 0x69, 0x00, 0xff, + 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, + 0xe2, 0x65, 0x00, 0xff, 0xe2, 0x65, 0x00, 0xff, + 0xe5, 0x5e, 0x00, 0xff, 0xe5, 0x5e, 0x00, 0xff, + 0xe5, 0x5a, 0x00, 0xff, 0xe5, 0x5a, 0x00, 0xff, + 0xe3, 0x57, 0x00, 0xff, 0xe6, 0x57, 0x00, 0xff, + 0xe9, 0x57, 0x00, 0xff, 0xec, 0x57, 0x00, 0xff, + 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x57, 0x00, 0xff, + 0xeb, 0x57, 0x00, 0xff, 0xeb, 0x4f, 0x00, 0xff, + 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, + 0xeb, 0x51, 0x00, 0xff, 0xeb, 0x51, 0x00, 0xff, + 0xe6, 0x52, 0x00, 0xff, 0xe9, 0x52, 0x00, 0xff, + 0xe9, 0x61, 0x00, 0xff, 0xe9, 0x6b, 0x00, 0xff, + 0xe8, 0x75, 0x00, 0xff, 0xea, 0x80, 0x00, 0xff, + 0xea, 0xa0, 0x00, 0xff, 0xec, 0xac, 0x00, 0xff, + 0xfa, 0xb0, 0x00, 0xff, 0xfa, 0xb0, 0x00, 0xff, + 0xf1, 0x8c, 0x00, 0xff, 0xf1, 0x8c, 0x00, 0xff, + 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff, + 0xf7, 0x7d, 0x00, 0xff, 0xf7, 0x7d, 0x00, 0xff, + 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, + 0xf2, 0x76, 0x00, 0xff, 0xf2, 0x76, 0x00, 0xff, + 0xe9, 0x73, 0x00, 0xff, 0xec, 0x73, 0x00, 0xff, + 0xf1, 0x73, 0x00, 0xff, 0xf1, 0x73, 0x00, 0xff, + 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff, + 0xed, 0x6f, 0x00, 0xff, 0xed, 0x6f, 0x00, 0xff, + 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, + 0xef, 0x6b, 0x00, 0xff, 0xef, 0x6b, 0x00, 0xff, + 0xeb, 0x6b, 0x00, 0xff, 0xeb, 0x6b, 0x00, 0xff, + 0xee, 0x7a, 0x00, 0xff, 0xee, 0x7a, 0x00, 0xff, + 0xec, 0x80, 0x00, 0xff, 0xec, 0x94, 0x00, 0xff, + 0xee, 0xac, 0x00, 0xff, 0xee, 0xc4, 0x00, 0xff, + ]) +} + +var img_32x32_rgb_etc2 = { + compressed: new Uint8Array([ + 0x8d, 0x9d, 0xb6, 0x4a, 0xc4, 0x80, 0x83, 0x97, + 0x64, 0x74, 0x95, 0x4b, 0xae, 0xa2, 0x91, 0x05, + 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42, + 0x64, 0x74, 0x85, 0x49, 0xae, 0xea, 0x89, 0xba, + 0x64, 0x74, 0x7c, 0x4b, 0xa8, 0x8a, 0xa4, 0x81, + 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a, + 0x75, 0x74, 0x86, 0x25, 0xaa, 0x6e, 0x71, 0x11, + 0xbe, 0x7f, 0x04, 0x62, 0xbb, 0x6c, 0x86, 0xcf, + + 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6, + 0x21, 0x30, 0x5f, 0x4a, 0xbd, 0xe8, 0x8e, 0x5b, + 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10, + 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9, + 0x05, 0x13, 0x23, 0x57, 0x66, 0xd6, 0x34, 0xc4, + 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4, + 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01, + 0x9a, 0x48, 0x41, 0x2e, 0x00, 0x31, 0xf0, 0xc5, + + 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, + 0x18, 0x20, 0x4a, 0x27, 0x6b, 0x90, 0x0e, 0x35, + 0x00, 0x0b, 0x29, 0x2f, 0xcc, 0x29, 0xf0, 0x87, + 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, + 0x33, 0x18, 0x40, 0x26, 0x06, 0x76, 0x2e, 0x3e, + 0xb9, 0x06, 0x32, 0x2b, 0x02, 0x13, 0x10, 0x03, + 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, + 0x6a, 0x06, 0x6b, 0x33, 0xf1, 0x05, 0x01, 0xff, + + 0x74, 0x95, 0xa6, 0x2c, 0x70, 0xf0, 0xbe, 0x5c, + 0x1d, 0x1d, 0x32, 0x4e, 0xfe, 0xf6, 0x4c, 0xe8, + 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b, + 0x23, 0x28, 0x43, 0x26, 0x03, 0x11, 0xea, 0xd1, + 0x63, 0x30, 0x66, 0x46, 0x05, 0x23, 0x5b, 0xa1, + 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8, + 0x60, 0x86, 0x04, 0xf6, 0x18, 0x46, 0x80, 0x00, + 0x72, 0xa6, 0x0d, 0x73, 0x8b, 0x2f, 0x64, 0x48, + + 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f, + 0x31, 0x40, 0x63, 0x6c, 0x71, 0xfc, 0x2d, 0x09, + 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33, + 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83, + 0x7b, 0x55, 0x67, 0x27, 0x84, 0x6f, 0x61, 0x29, + 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21, + 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03, + 0x72, 0x9e, 0x0c, 0x7a, 0xa1, 0x2f, 0x43, 0x87, + + 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, + 0x0e, 0x15, 0x43, 0x67, 0x13, 0x33, 0x62, 0xfc, + 0xb8, 0x04, 0xb1, 0xb3, 0x31, 0xcf, 0x01, 0x11, + 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, + 0x58, 0x14, 0xc9, 0x1a, 0x01, 0x77, 0x72, 0x08, + 0xd9, 0x0f, 0x08, 0x42, 0xef, 0xef, 0x89, 0x03, + 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, + 0x74, 0x9c, 0x07, 0xf7, 0x9b, 0x2f, 0x43, 0x47, + + 0x98, 0x84, 0xa5, 0x0e, 0xf1, 0xd2, 0x10, 0xec, + 0xb8, 0xbc, 0xfa, 0xc2, 0x10, 0x85, 0xc8, 0xd2, + 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f, + 0xb3, 0x10, 0x10, 0x03, 0x24, 0x57, 0x8b, 0x3a, + 0xca, 0x08, 0x10, 0x22, 0x73, 0x33, 0x9f, 0x89, + 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46, + 0x70, 0x80, 0x04, 0x76, 0x1c, 0x56, 0xe2, 0x03, + 0x74, 0xa6, 0x0c, 0xfa, 0xa5, 0x37, 0x0a, 0x50, + + 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c, + 0xd2, 0x53, 0x53, 0x47, 0x77, 0x77, 0x99, 0x88, + 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4, + 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3, + 0x72, 0xa2, 0x0c, 0xf3, 0x18, 0x4f, 0x71, 0xa0, + 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2, + 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61, + 0x70, 0x54, 0x15, 0x73, 0xa7, 0x3f, 0x72, 0x22, + ]), + decompressed: new Uint8Array([ + 0xa9, 0xb9, 0xd2, 0xff, 0xa9, 0xb9, 0xd2, 0xff, + 0x90, 0xa1, 0xc2, 0xff, 0x7c, 0x8d, 0xae, 0xff, + 0x80, 0x90, 0xb1, 0xff, 0x6c, 0x7c, 0x9d, 0xff, + 0x80, 0x90, 0xb1, 0xff, 0x80, 0x90, 0xb1, 0xff, + 0x7c, 0x8d, 0xaf, 0xff, 0x7c, 0x8d, 0xaf, 0xff, + 0x88, 0x99, 0xbb, 0xff, 0x66, 0x77, 0x99, 0xff, + 0x6f, 0x80, 0x91, 0xff, 0x83, 0x94, 0xa5, 0xff, + 0x83, 0x94, 0xa5, 0xff, 0x6f, 0x80, 0x91, 0xff, + 0x80, 0x90, 0x98, 0xff, 0x6c, 0x7c, 0x84, 0xff, + 0x6c, 0x7c, 0x84, 0xff, 0x6c, 0x7c, 0x84, 0xff, + 0x72, 0x72, 0x83, 0xff, 0x7c, 0x7c, 0x8d, 0xff, + 0x72, 0x72, 0x83, 0xff, 0x88, 0x88, 0x99, 0xff, + 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff, + 0x88, 0x88, 0x99, 0xff, 0x88, 0x88, 0x99, 0xff, + 0x7d, 0x7e, 0x82, 0xff, 0x8f, 0x8d, 0x8f, 0xff, + 0xa0, 0x9d, 0x9c, 0xff, 0xb2, 0xac, 0xa9, 0xff, + 0xa9, 0xb9, 0xd2, 0xff, 0x95, 0xa5, 0xbe, 0xff, + 0x90, 0xa1, 0xc2, 0xff, 0x7c, 0x8d, 0xae, 0xff, + 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff, + 0x5a, 0x6a, 0x8b, 0xff, 0x5a, 0x6a, 0x8b, 0xff, + 0x66, 0x77, 0x99, 0xff, 0x72, 0x83, 0xa5, 0xff, + 0x66, 0x77, 0x99, 0xff, 0x66, 0x77, 0x99, 0xff, + 0x49, 0x5a, 0x6b, 0xff, 0x49, 0x5a, 0x6b, 0xff, + 0x5d, 0x6e, 0x7f, 0xff, 0x5d, 0x6e, 0x7f, 0xff, + 0x5a, 0x6a, 0x72, 0xff, 0x6c, 0x7c, 0x84, 0xff, + 0x6c, 0x7c, 0x84, 0xff, 0x46, 0x56, 0x5e, 0xff, + 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff, + 0x66, 0x66, 0x77, 0xff, 0x66, 0x66, 0x77, 0xff, + 0x72, 0x72, 0x83, 0xff, 0x72, 0x72, 0x83, 0xff, + 0x72, 0x72, 0x83, 0xff, 0x66, 0x66, 0x77, 0xff, + 0x82, 0x6c, 0x71, 0xff, 0x94, 0x7b, 0x7e, 0xff, + 0xa5, 0x8b, 0x8b, 0xff, 0xb7, 0x9a, 0x98, 0xff, + 0xa9, 0xb9, 0xd2, 0xff, 0x95, 0xa5, 0xbe, 0xff, + 0x6a, 0x7b, 0x9c, 0xff, 0x6a, 0x7b, 0x9c, 0xff, + 0x5f, 0x6f, 0x98, 0xff, 0x4b, 0x5b, 0x84, 0xff, + 0x39, 0x49, 0x72, 0xff, 0x4b, 0x5b, 0x84, 0xff, + 0x3f, 0x50, 0x72, 0xff, 0x55, 0x66, 0x88, 0xff, + 0x55, 0x66, 0x88, 0xff, 0x33, 0x44, 0x66, 0xff, + 0x4d, 0x4d, 0x5e, 0xff, 0x3b, 0x3b, 0x4c, 0xff, + 0x3b, 0x3b, 0x4c, 0xff, 0x4d, 0x4d, 0x5e, 0xff, + 0x4b, 0x5b, 0x63, 0xff, 0x4b, 0x5b, 0x63, 0xff, + 0x5f, 0x6f, 0x77, 0xff, 0x4b, 0x5b, 0x63, 0xff, + 0x3c, 0x3c, 0x5e, 0xff, 0x3c, 0x3c, 0x5e, 0xff, + 0x50, 0x50, 0x72, 0xff, 0x3c, 0x3c, 0x5e, 0xff, + 0x50, 0x3f, 0x61, 0xff, 0x50, 0x3f, 0x61, 0xff, + 0x5a, 0x49, 0x6b, 0xff, 0x66, 0x55, 0x77, 0xff, + 0x88, 0x5a, 0x5f, 0xff, 0x99, 0x69, 0x6c, 0xff, + 0xab, 0x79, 0x79, 0xff, 0xbc, 0x88, 0x86, 0xff, + 0x95, 0xa5, 0xbe, 0xff, 0x6f, 0x7f, 0x98, 0xff, + 0x7c, 0x8d, 0xae, 0xff, 0x56, 0x67, 0x88, 0xff, + 0x4b, 0x5b, 0x84, 0xff, 0x39, 0x49, 0x72, 0xff, + 0x39, 0x49, 0x72, 0xff, 0x25, 0x35, 0x5e, 0xff, + 0x49, 0x5a, 0x7c, 0xff, 0x3f, 0x50, 0x72, 0xff, + 0x33, 0x44, 0x66, 0xff, 0x33, 0x44, 0x66, 0xff, + 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff, + 0x27, 0x27, 0x38, 0xff, 0x27, 0x27, 0x38, 0xff, + 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff, + 0x39, 0x49, 0x51, 0xff, 0x25, 0x35, 0x3d, 0xff, + 0x50, 0x50, 0x72, 0xff, 0x2a, 0x2a, 0x4c, 0xff, + 0x16, 0x16, 0x38, 0xff, 0x2a, 0x2a, 0x4c, 0xff, + 0x50, 0x3f, 0x61, 0xff, 0x5a, 0x49, 0x6b, 0xff, + 0x50, 0x3f, 0x61, 0xff, 0x50, 0x3f, 0x61, 0xff, + 0x8d, 0x48, 0x4e, 0xff, 0x9e, 0x57, 0x5b, 0xff, + 0xb0, 0x67, 0x68, 0xff, 0xc1, 0x76, 0x75, 0xff, + 0x80, 0x80, 0xa2, 0xff, 0x6e, 0x6e, 0x90, 0xff, + 0x4d, 0x4d, 0x80, 0xff, 0x61, 0x61, 0x94, 0xff, + 0x3e, 0x4e, 0x77, 0xff, 0x3e, 0x4e, 0x77, 0xff, + 0x20, 0x28, 0x49, 0xff, 0x20, 0x28, 0x49, 0xff, + 0x19, 0x2a, 0x42, 0xff, 0x2d, 0x3e, 0x56, 0xff, + 0x21, 0x29, 0x5b, 0xff, 0x15, 0x1d, 0x4f, 0xff, + 0x10, 0x10, 0x42, 0xff, 0x16, 0x16, 0x48, 0xff, + 0x10, 0x10, 0x42, 0xff, 0x1a, 0x1a, 0x4c, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x22, 0x33, 0x55, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x32, 0x43, 0x65, 0xff, + 0x47, 0x4f, 0x5f, 0xff, 0x53, 0x5b, 0x6b, 0xff, + 0x31, 0x39, 0x49, 0xff, 0x31, 0x39, 0x49, 0xff, + 0x38, 0x27, 0x38, 0xff, 0x5e, 0x4d, 0x5e, 0xff, + 0x72, 0x61, 0x72, 0xff, 0x5e, 0x4d, 0x5e, 0xff, + 0x8b, 0x39, 0x31, 0xff, 0x97, 0x45, 0x3d, 0xff, + 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, + 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff, + 0x4d, 0x4d, 0x80, 0xff, 0x3b, 0x3b, 0x6e, 0xff, + 0x3e, 0x4e, 0x77, 0xff, 0x18, 0x28, 0x51, 0xff, + 0x46, 0x4e, 0x6f, 0xff, 0x20, 0x28, 0x49, 0xff, + 0x07, 0x18, 0x30, 0xff, 0x07, 0x18, 0x30, 0xff, + 0x21, 0x29, 0x5b, 0xff, 0x15, 0x1d, 0x4f, 0xff, + 0x1a, 0x1a, 0x4c, 0xff, 0x10, 0x10, 0x42, 0xff, + 0x16, 0x16, 0x48, 0xff, 0x10, 0x10, 0x42, 0xff, + 0x22, 0x33, 0x55, 0xff, 0x11, 0x11, 0x33, 0xff, + 0x22, 0x33, 0x55, 0xff, 0x12, 0x23, 0x45, 0xff, + 0x3d, 0x45, 0x55, 0xff, 0x31, 0x39, 0x49, 0xff, + 0x47, 0x4f, 0x5f, 0xff, 0x3d, 0x45, 0x55, 0xff, + 0x4c, 0x3b, 0x4c, 0xff, 0x4c, 0x3b, 0x4c, 0xff, + 0x5e, 0x4d, 0x5e, 0xff, 0x72, 0x61, 0x72, 0xff, + 0xa1, 0x4f, 0x47, 0xff, 0x97, 0x45, 0x3d, 0xff, + 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, + 0x94, 0x94, 0xb6, 0xff, 0x5a, 0x5a, 0x7c, 0xff, + 0x3b, 0x3b, 0x6e, 0xff, 0x27, 0x27, 0x5a, 0xff, + 0x2a, 0x3a, 0x63, 0xff, 0x04, 0x14, 0x3d, 0xff, + 0x0c, 0x14, 0x35, 0xff, 0x32, 0x3a, 0x5b, 0xff, + 0x19, 0x2a, 0x42, 0xff, 0x07, 0x18, 0x30, 0xff, + 0x00, 0x07, 0x39, 0xff, 0x15, 0x1d, 0x4f, 0xff, + 0x0d, 0x1d, 0x4f, 0xff, 0x0d, 0x1d, 0x4f, 0xff, + 0x0d, 0x1d, 0x4f, 0xff, 0x00, 0x07, 0x39, 0xff, + 0x12, 0x23, 0x45, 0xff, 0x12, 0x23, 0x45, 0xff, + 0x12, 0x23, 0x45, 0xff, 0x22, 0x33, 0x55, 0xff, + 0x3d, 0x1c, 0x1c, 0xff, 0x51, 0x30, 0x30, 0xff, + 0x51, 0x30, 0x30, 0xff, 0x77, 0x56, 0x56, 0xff, + 0x7c, 0x49, 0x5a, 0xff, 0x7c, 0x49, 0x5a, 0xff, + 0x72, 0x3f, 0x50, 0xff, 0x72, 0x3f, 0x50, 0xff, + 0xad, 0x5b, 0x53, 0xff, 0xad, 0x5b, 0x53, 0xff, + 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, + 0x80, 0x80, 0xa2, 0xff, 0x5a, 0x5a, 0x7c, 0xff, + 0x3b, 0x3b, 0x6e, 0xff, 0x3b, 0x3b, 0x6e, 0xff, + 0x04, 0x14, 0x3d, 0xff, 0x18, 0x28, 0x51, 0xff, + 0x0c, 0x14, 0x35, 0xff, 0x0c, 0x14, 0x35, 0xff, + 0x19, 0x2a, 0x42, 0xff, 0x07, 0x18, 0x30, 0xff, + 0x0b, 0x13, 0x45, 0xff, 0x00, 0x07, 0x39, 0xff, + 0x19, 0x29, 0x5b, 0xff, 0x19, 0x29, 0x5b, 0xff, + 0x00, 0x07, 0x39, 0xff, 0x19, 0x29, 0x5b, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x12, 0x23, 0x45, 0xff, + 0x11, 0x11, 0x33, 0xff, 0x11, 0x11, 0x33, 0xff, + 0x51, 0x30, 0x30, 0xff, 0x3d, 0x1c, 0x1c, 0xff, + 0x3d, 0x1c, 0x1c, 0xff, 0x51, 0x30, 0x30, 0xff, + 0x72, 0x3f, 0x50, 0xff, 0x7c, 0x49, 0x5a, 0xff, + 0x88, 0x55, 0x66, 0xff, 0x88, 0x55, 0x66, 0xff, + 0xa1, 0x4f, 0x47, 0xff, 0xad, 0x5b, 0x53, 0xff, + 0xba, 0x57, 0x57, 0xff, 0xd7, 0x74, 0x74, 0xff, + 0x74, 0x84, 0xa5, 0xff, 0x4e, 0x5e, 0x7f, 0xff, + 0x41, 0x51, 0x83, 0xff, 0x2d, 0x3d, 0x6f, 0xff, + 0x29, 0x32, 0x5b, 0xff, 0x07, 0x10, 0x39, 0xff, + 0x13, 0x1c, 0x45, 0xff, 0x1d, 0x26, 0x4f, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x05, 0x0d, 0x2e, 0xff, + 0x05, 0x0d, 0x2e, 0xff, 0x11, 0x19, 0x3a, 0xff, + 0x11, 0x21, 0x3a, 0xff, 0x11, 0x21, 0x3a, 0xff, + 0x29, 0x21, 0x32, 0xff, 0x13, 0x0b, 0x1c, 0xff, + 0x36, 0x1d, 0x47, 0xff, 0x20, 0x07, 0x31, 0xff, + 0x4f, 0x1d, 0x47, 0xff, 0x4f, 0x1d, 0x47, 0xff, + 0x56, 0x34, 0x45, 0xff, 0x76, 0x54, 0x65, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x67, 0x12, 0x34, 0xff, + 0x93, 0x00, 0x00, 0xff, 0x82, 0x1c, 0x1c, 0xff, + 0xb0, 0x4a, 0x4a, 0xff, 0xb0, 0x4a, 0x4a, 0xff, + 0xd2, 0x5b, 0x5b, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xd2, 0x5b, 0x5b, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x62, 0x72, 0x93, 0xff, 0x62, 0x72, 0x93, 0xff, + 0x41, 0x51, 0x83, 0xff, 0x41, 0x51, 0x83, 0xff, + 0x1d, 0x26, 0x4f, 0xff, 0x29, 0x32, 0x5b, 0xff, + 0x07, 0x10, 0x39, 0xff, 0x13, 0x1c, 0x45, 0xff, + 0x11, 0x19, 0x3a, 0xff, 0x00, 0x03, 0x24, 0xff, + 0x05, 0x0d, 0x2e, 0xff, 0x11, 0x19, 0x3a, 0xff, + 0x05, 0x15, 0x2e, 0xff, 0x05, 0x15, 0x2e, 0xff, + 0x13, 0x0b, 0x1c, 0xff, 0x07, 0x00, 0x10, 0xff, + 0x20, 0x07, 0x31, 0xff, 0x20, 0x07, 0x31, 0xff, + 0x39, 0x07, 0x31, 0xff, 0x5b, 0x29, 0x53, 0xff, + 0x56, 0x34, 0x45, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x76, 0x54, 0x65, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x82, 0x1c, 0x1c, 0xff, 0x93, 0x00, 0x00, 0xff, + 0x82, 0x1c, 0x1c, 0xff, 0xb0, 0x4a, 0x4a, 0xff, + 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x74, 0x84, 0xa5, 0xff, 0x4e, 0x5e, 0x7f, 0xff, + 0x53, 0x63, 0x95, 0xff, 0x2d, 0x3d, 0x6f, 0xff, + 0x29, 0x32, 0x6b, 0xff, 0x1d, 0x26, 0x5f, 0xff, + 0x29, 0x32, 0x6b, 0xff, 0x13, 0x1c, 0x55, 0xff, + 0x2a, 0x4b, 0x5b, 0xff, 0x0d, 0x2e, 0x3e, 0xff, + 0x00, 0x14, 0x24, 0xff, 0x00, 0x00, 0x07, 0xff, + 0x05, 0x15, 0x2e, 0xff, 0x00, 0x0b, 0x24, 0xff, + 0x13, 0x0b, 0x1c, 0xff, 0x13, 0x0b, 0x1c, 0xff, + 0x20, 0x07, 0x31, 0xff, 0x2c, 0x13, 0x3d, 0xff, + 0x39, 0x07, 0x31, 0xff, 0x4f, 0x1d, 0x47, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0xb0, 0x4a, 0x4a, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xd2, 0x5b, 0x5b, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x88, 0x98, 0xb9, 0xff, 0x62, 0x72, 0x93, 0xff, + 0x2d, 0x3d, 0x6f, 0xff, 0x2d, 0x3d, 0x6f, 0xff, + 0x1d, 0x26, 0x5f, 0xff, 0x13, 0x1c, 0x55, 0xff, + 0x07, 0x10, 0x49, 0xff, 0x1d, 0x26, 0x5f, 0xff, + 0x00, 0x14, 0x24, 0xff, 0x2a, 0x4b, 0x5b, 0xff, + 0x00, 0x14, 0x24, 0xff, 0x00, 0x00, 0x07, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x05, 0x15, 0x2e, 0xff, + 0x29, 0x21, 0x32, 0xff, 0x1d, 0x15, 0x26, 0xff, + 0x42, 0x29, 0x53, 0xff, 0x36, 0x1d, 0x47, 0xff, + 0x5b, 0x29, 0x53, 0xff, 0x4f, 0x1d, 0x47, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0x87, 0x32, 0x54, 0xff, 0x87, 0x32, 0x54, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xd2, 0x39, 0x39, 0xff, 0xd2, 0x39, 0x39, 0xff, + 0xe8, 0x4f, 0x4f, 0xff, 0xe8, 0x71, 0x71, 0xff, + 0x7c, 0x9e, 0xaf, 0xff, 0x66, 0x88, 0x99, 0xff, + 0x51, 0x62, 0x73, 0xff, 0x1a, 0x2b, 0x3c, 0xff, + 0x21, 0x21, 0x3a, 0xff, 0x0f, 0x0f, 0x28, 0xff, + 0x0d, 0x0d, 0x4f, 0xff, 0x00, 0x00, 0x35, 0xff, + 0x00, 0x00, 0x20, 0xff, 0x05, 0x05, 0x36, 0xff, + 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x10, 0x18, 0x31, 0xff, 0x10, 0x18, 0x31, 0xff, + 0x34, 0x24, 0x55, 0xff, 0x3e, 0x2e, 0x5f, 0xff, + 0x46, 0x14, 0x46, 0xff, 0x6c, 0x3a, 0x6c, 0xff, + 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, + 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, + 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xc3, 0x06, 0x04, 0xff, 0xcd, 0x0b, 0x0b, 0xff, + 0xd7, 0x0f, 0x12, 0xff, 0xe1, 0x14, 0x19, 0xff, + 0xe7, 0x26, 0x28, 0xff, 0xe7, 0x3f, 0x44, 0xff, + 0xe7, 0x59, 0x5f, 0xff, 0xe7, 0x72, 0x7b, 0xff, + 0x7c, 0x9e, 0xaf, 0xff, 0x72, 0x94, 0xa5, 0xff, + 0x6e, 0x7f, 0x90, 0xff, 0x1a, 0x2b, 0x3c, 0xff, + 0x0f, 0x0f, 0x28, 0xff, 0x00, 0x00, 0x14, 0xff, + 0x00, 0x00, 0x35, 0xff, 0x00, 0x00, 0x35, 0xff, + 0x00, 0x00, 0x20, 0xff, 0x00, 0x00, 0x20, 0xff, + 0x09, 0x11, 0x32, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x26, 0x2e, 0x47, 0xff, 0x26, 0x2e, 0x47, 0xff, + 0x28, 0x18, 0x49, 0xff, 0x4a, 0x3a, 0x6b, 0xff, + 0x5a, 0x28, 0x5a, 0xff, 0x46, 0x14, 0x46, 0xff, + 0x8c, 0x42, 0x63, 0xff, 0x80, 0x36, 0x57, 0xff, + 0x99, 0x33, 0x44, 0xff, 0xa4, 0x3e, 0x4f, 0xff, + 0x8e, 0x28, 0x39, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xc7, 0x05, 0x03, 0xff, 0xd1, 0x09, 0x0a, 0xff, + 0xdb, 0x0e, 0x11, 0xff, 0xe5, 0x12, 0x18, 0xff, + 0xe9, 0x25, 0x26, 0xff, 0xe9, 0x3e, 0x42, 0xff, + 0xe9, 0x58, 0x5d, 0xff, 0xe9, 0x71, 0x79, 0xff, + 0x88, 0xaa, 0xbb, 0xff, 0x66, 0x88, 0x99, 0xff, + 0x6e, 0x7f, 0x90, 0xff, 0x37, 0x48, 0x59, 0xff, + 0x0f, 0x0f, 0x28, 0xff, 0x00, 0x00, 0x14, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x18, 0xff, + 0x05, 0x05, 0x36, 0xff, 0x00, 0x00, 0x20, 0xff, + 0x00, 0x00, 0x0c, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff, + 0x3e, 0x2e, 0x5f, 0xff, 0x4a, 0x3a, 0x6b, 0xff, + 0x6c, 0x3a, 0x6c, 0xff, 0x6c, 0x3a, 0x6c, 0xff, + 0x76, 0x2c, 0x4d, 0xff, 0x8c, 0x42, 0x63, 0xff, + 0x99, 0x33, 0x44, 0xff, 0x99, 0x33, 0x44, 0xff, + 0xa4, 0x3e, 0x4f, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xcb, 0x03, 0x02, 0xff, 0xd5, 0x08, 0x09, 0xff, + 0xdf, 0x0c, 0x10, 0xff, 0xe9, 0x11, 0x17, 0xff, + 0xeb, 0x24, 0x24, 0xff, 0xeb, 0x3d, 0x40, 0xff, + 0xeb, 0x57, 0x5b, 0xff, 0xeb, 0x70, 0x77, 0xff, + 0x88, 0xaa, 0xbb, 0xff, 0x72, 0x94, 0xa5, 0xff, + 0x6e, 0x7f, 0x90, 0xff, 0x6e, 0x7f, 0x90, 0xff, + 0x35, 0x35, 0x4e, 0xff, 0x00, 0x00, 0x14, 0xff, + 0x00, 0x00, 0x18, 0xff, 0x00, 0x00, 0x35, 0xff, + 0x11, 0x11, 0x42, 0xff, 0x05, 0x05, 0x36, 0xff, + 0x00, 0x00, 0x0c, 0xff, 0x09, 0x11, 0x32, 0xff, + 0x26, 0x2e, 0x47, 0xff, 0x32, 0x3a, 0x53, 0xff, + 0x4a, 0x3a, 0x6b, 0xff, 0x4a, 0x3a, 0x6b, 0xff, + 0x6c, 0x3a, 0x6c, 0xff, 0x80, 0x4e, 0x80, 0xff, + 0x8c, 0x42, 0x63, 0xff, 0x80, 0x36, 0x57, 0xff, + 0xa4, 0x3e, 0x4f, 0xff, 0xa4, 0x3e, 0x4f, 0xff, + 0x99, 0x33, 0x44, 0xff, 0xbb, 0x11, 0x22, 0xff, + 0xcf, 0x02, 0x01, 0xff, 0xd9, 0x06, 0x08, 0xff, + 0xe3, 0x0b, 0x0f, 0xff, 0xed, 0x0f, 0x16, 0xff, + 0xed, 0x23, 0x22, 0xff, 0xed, 0x3c, 0x3e, 0xff, + 0xed, 0x56, 0x59, 0xff, 0xed, 0x6f, 0x75, 0xff, + 0x7c, 0x95, 0xae, 0xff, 0x7c, 0x95, 0xae, 0xff, + 0x5f, 0x78, 0x91, 0xff, 0x5f, 0x78, 0x91, 0xff, + 0x5d, 0x6e, 0x90, 0xff, 0x26, 0x37, 0x59, 0xff, + 0x00, 0x00, 0x09, 0xff, 0x04, 0x00, 0x26, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x33, 0x00, 0x11, 0xff, + 0x3e, 0x1c, 0x3e, 0xff, 0x55, 0x33, 0x55, 0xff, + 0x6c, 0x4a, 0x6c, 0xff, 0x6c, 0x4a, 0x6c, 0xff, + 0x6a, 0x41, 0x52, 0xff, 0x80, 0x57, 0x68, 0xff, + 0x8c, 0x63, 0x74, 0xff, 0x80, 0x57, 0x68, 0xff, + 0x9f, 0x17, 0x17, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xd6, 0x00, 0x00, 0xff, 0xe2, 0x00, 0x03, 0xff, + 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff, + 0xe7, 0x1e, 0x20, 0xff, 0xea, 0x3f, 0x3e, 0xff, + 0xed, 0x60, 0x5b, 0xff, 0xf0, 0x80, 0x79, 0xff, + 0x7c, 0x95, 0xae, 0xff, 0x5f, 0x78, 0x91, 0xff, + 0x5f, 0x78, 0x91, 0xff, 0x45, 0x5e, 0x77, 0xff, + 0x40, 0x51, 0x73, 0xff, 0x26, 0x37, 0x59, 0xff, + 0x1e, 0x0d, 0x40, 0xff, 0x00, 0x00, 0x09, 0xff, + 0x13, 0x13, 0x46, 0xff, 0x13, 0x13, 0x46, 0xff, + 0x33, 0x33, 0x66, 0xff, 0x13, 0x13, 0x46, 0xff, + 0x3e, 0x1c, 0x3e, 0xff, 0x55, 0x33, 0x55, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, + 0x76, 0x4d, 0x5e, 0xff, 0x6a, 0x41, 0x52, 0xff, + 0x80, 0x57, 0x68, 0xff, 0x8c, 0x63, 0x74, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0x9f, 0x17, 0x17, 0xff, + 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xd6, 0x00, 0x00, 0xff, 0xec, 0x05, 0x0d, 0xff, + 0xe9, 0x0a, 0x12, 0xff, 0xef, 0x10, 0x18, 0xff, + 0xe8, 0x1e, 0x1f, 0xff, 0xeb, 0x3e, 0x3d, 0xff, + 0xee, 0x5f, 0x5a, 0xff, 0xf1, 0x80, 0x78, 0xff, + 0x6f, 0x67, 0x88, 0xff, 0x5b, 0x53, 0x74, 0xff, + 0x49, 0x41, 0x62, 0xff, 0x35, 0x2d, 0x4e, 0xff, + 0x26, 0x37, 0x59, 0xff, 0x26, 0x37, 0x59, 0xff, + 0x3b, 0x2a, 0x5d, 0xff, 0x04, 0x00, 0x26, 0xff, + 0x33, 0x00, 0x11, 0xff, 0x33, 0x33, 0x66, 0xff, + 0x33, 0x33, 0x66, 0xff, 0x33, 0x33, 0x66, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x55, 0x33, 0x55, 0xff, + 0x77, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff, + 0x8f, 0x34, 0x55, 0xff, 0x8f, 0x34, 0x55, 0xff, + 0x8f, 0x34, 0x55, 0xff, 0xa5, 0x4a, 0x6b, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xe2, 0x00, 0x03, 0xff, 0xec, 0x05, 0x0d, 0xff, + 0xe5, 0x06, 0x0e, 0xff, 0xef, 0x10, 0x18, 0xff, + 0xe9, 0x1d, 0x1e, 0xff, 0xec, 0x3e, 0x3c, 0xff, + 0xef, 0x5f, 0x59, 0xff, 0xf2, 0x7f, 0x77, 0xff, + 0x6f, 0x67, 0x88, 0xff, 0x5b, 0x53, 0x74, 0xff, + 0x49, 0x41, 0x62, 0xff, 0x35, 0x2d, 0x4e, 0xff, + 0x09, 0x1a, 0x3c, 0xff, 0x26, 0x37, 0x59, 0xff, + 0x3b, 0x2a, 0x5d, 0xff, 0x1e, 0x0d, 0x40, 0xff, + 0x33, 0x00, 0x11, 0xff, 0x33, 0x00, 0x11, 0xff, + 0x33, 0x33, 0x66, 0xff, 0x53, 0x53, 0x86, 0xff, + 0x55, 0x33, 0x55, 0xff, 0x6c, 0x4a, 0x6c, 0xff, + 0x77, 0x33, 0x55, 0xff, 0x77, 0x33, 0x55, 0xff, + 0x83, 0x28, 0x49, 0xff, 0x99, 0x3e, 0x5f, 0xff, + 0x99, 0x3e, 0x5f, 0xff, 0x8f, 0x34, 0x55, 0xff, + 0xb5, 0x2d, 0x2d, 0xff, 0xb5, 0x2d, 0x2d, 0xff, + 0xd2, 0x06, 0x06, 0xff, 0xd2, 0x06, 0x06, 0xff, + 0xe2, 0x00, 0x03, 0xff, 0xec, 0x05, 0x0d, 0xff, + 0xe5, 0x06, 0x0e, 0xff, 0xe9, 0x0a, 0x12, 0xff, + 0xea, 0x1d, 0x1d, 0xff, 0xed, 0x3d, 0x3b, 0xff, + 0xf0, 0x5e, 0x58, 0xff, 0xf3, 0x7f, 0x76, 0xff, + 0x7c, 0x74, 0x95, 0xff, 0x56, 0x4e, 0x6f, 0xff, + 0x62, 0x49, 0x7b, 0xff, 0x4e, 0x35, 0x67, 0xff, + 0x44, 0x33, 0x66, 0xff, 0x34, 0x23, 0x56, 0xff, + 0x44, 0x33, 0x66, 0xff, 0x44, 0x33, 0x66, 0xff, + 0x56, 0x23, 0x56, 0xff, 0x67, 0x00, 0x01, 0xff, + 0x56, 0x23, 0x56, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x67, 0x25, 0x46, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x7b, 0x39, 0x5a, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0xb5, 0x0b, 0x0b, 0xff, + 0xc1, 0x00, 0x00, 0xff, 0xe7, 0x11, 0x11, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xe9, 0x02, 0x0a, 0xff, + 0xeb, 0x00, 0x04, 0xff, 0xec, 0x05, 0x0a, 0xff, + 0xed, 0x0a, 0x10, 0xff, 0xee, 0x0f, 0x16, 0xff, + 0xeb, 0x1c, 0x1c, 0xff, 0xec, 0x3c, 0x3b, 0xff, + 0xed, 0x5c, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff, + 0x90, 0x88, 0xa9, 0xff, 0x56, 0x4e, 0x6f, 0xff, + 0x4e, 0x35, 0x67, 0xff, 0x4e, 0x35, 0x67, 0xff, + 0x44, 0x33, 0x66, 0xff, 0x34, 0x23, 0x56, 0xff, + 0x34, 0x23, 0x56, 0xff, 0x54, 0x43, 0x76, 0xff, + 0x76, 0x43, 0x76, 0xff, 0x87, 0x10, 0x21, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x8d, 0x4b, 0x6c, 0xff, 0x8d, 0x4b, 0x6c, 0xff, + 0x7b, 0x39, 0x5a, 0xff, 0x8d, 0x4b, 0x6c, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, + 0xb5, 0x0b, 0x0b, 0xff, 0xb5, 0x0b, 0x0b, 0xff, + 0xc1, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff, + 0xe9, 0x01, 0x05, 0xff, 0xea, 0x06, 0x0b, 0xff, + 0xeb, 0x0b, 0x11, 0xff, 0xec, 0x10, 0x17, 0xff, + 0xeb, 0x1c, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff, + 0xed, 0x5b, 0x59, 0xff, 0xee, 0x7b, 0x78, 0xff, + 0x90, 0x88, 0xa9, 0xff, 0x6a, 0x62, 0x83, 0xff, + 0x4e, 0x35, 0x67, 0xff, 0x62, 0x49, 0x7b, 0xff, + 0x54, 0x43, 0x76, 0xff, 0x54, 0x43, 0x76, 0xff, + 0x66, 0x11, 0x55, 0xff, 0x54, 0x43, 0x76, 0xff, + 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, + 0xad, 0x32, 0x53, 0xff, 0xad, 0x32, 0x53, 0xff, + 0x97, 0x1c, 0x3d, 0xff, 0xa1, 0x26, 0x47, 0xff, + 0x9f, 0x28, 0x39, 0xff, 0x9f, 0x28, 0x39, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xb5, 0x0b, 0x0b, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xe5, 0x00, 0x06, 0xff, 0xe5, 0x00, 0x06, 0xff, + 0xe7, 0x01, 0x06, 0xff, 0xe8, 0x06, 0x0c, 0xff, + 0xe9, 0x0b, 0x12, 0xff, 0xea, 0x10, 0x18, 0xff, + 0xeb, 0x1b, 0x1c, 0xff, 0xec, 0x3b, 0x3b, 0xff, + 0xed, 0x5b, 0x59, 0xff, 0xee, 0x7a, 0x78, 0xff, + 0x90, 0x88, 0xa9, 0xff, 0x7c, 0x74, 0x95, 0xff, + 0x62, 0x49, 0x7b, 0xff, 0x62, 0x49, 0x7b, 0xff, + 0x54, 0x43, 0x76, 0xff, 0x54, 0x43, 0x76, 0xff, + 0x66, 0x11, 0x55, 0xff, 0x66, 0x11, 0x55, 0xff, + 0x76, 0x43, 0x76, 0xff, 0x76, 0x43, 0x76, 0xff, + 0x87, 0x10, 0x21, 0xff, 0x87, 0x10, 0x21, 0xff, + 0x8b, 0x10, 0x31, 0xff, 0xa1, 0x26, 0x47, 0xff, + 0xa1, 0x26, 0x47, 0xff, 0x8b, 0x10, 0x31, 0xff, + 0xb5, 0x0b, 0x0b, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xc1, 0x17, 0x17, 0xff, 0xc1, 0x17, 0x17, 0xff, + 0xd5, 0x00, 0x00, 0xff, 0xd5, 0x00, 0x00, 0xff, + 0xdf, 0x00, 0x00, 0xff, 0xdf, 0x00, 0x00, 0xff, + 0xe5, 0x02, 0x07, 0xff, 0xe6, 0x07, 0x0d, 0xff, + 0xe7, 0x0c, 0x13, 0xff, 0xe8, 0x11, 0x19, 0xff, + 0xeb, 0x1b, 0x1c, 0xff, 0xec, 0x3a, 0x3b, 0xff, + 0xed, 0x5a, 0x59, 0xff, 0xee, 0x7a, 0x78, 0xff, + 0x9e, 0x86, 0xa7, 0xff, 0x9a, 0x82, 0xa3, 0xff, + 0x8f, 0x56, 0x7f, 0xff, 0x72, 0x39, 0x62, 0xff, + 0x71, 0x3c, 0x75, 0xff, 0x75, 0x31, 0x68, 0xff, + 0x7a, 0x26, 0x5b, 0xff, 0x7e, 0x1b, 0x4e, 0xff, + 0x82, 0x1c, 0x4f, 0xff, 0x8e, 0x28, 0x5b, 0xff, + 0x8e, 0x28, 0x5b, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb3, 0x0e, 0x0e, 0xff, 0xad, 0x08, 0x08, 0xff, + 0xbd, 0x18, 0x18, 0xff, 0xb7, 0x12, 0x12, 0xff, + 0xbd, 0x00, 0x00, 0xff, 0xc9, 0x03, 0x0b, 0xff, + 0xd6, 0x00, 0x08, 0xff, 0xd6, 0x00, 0x08, 0xff, + 0xdb, 0x00, 0x08, 0xff, 0xdd, 0x01, 0x07, 0xff, + 0xdf, 0x02, 0x06, 0xff, 0xe1, 0x03, 0x05, 0xff, + 0xe3, 0x00, 0x00, 0xff, 0xe5, 0x07, 0x0a, 0xff, + 0xe7, 0x0e, 0x14, 0xff, 0xe9, 0x15, 0x1e, 0xff, + 0xeb, 0x26, 0x24, 0xff, 0xed, 0x46, 0x42, 0xff, + 0xef, 0x66, 0x5f, 0xff, 0xf1, 0x85, 0x7d, 0xff, + 0x9a, 0x82, 0xa3, 0xff, 0xa4, 0x8c, 0xad, 0xff, + 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, + 0x83, 0x3f, 0x6a, 0xff, 0x88, 0x34, 0x5d, 0xff, + 0x8c, 0x29, 0x50, 0xff, 0x90, 0x1e, 0x43, 0xff, + 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xad, 0x08, 0x08, 0xff, 0xbd, 0x18, 0x18, 0xff, + 0xbd, 0x18, 0x18, 0xff, 0xb3, 0x0e, 0x0e, 0xff, + 0xc9, 0x03, 0x0b, 0xff, 0xc9, 0x03, 0x0b, 0xff, + 0xd6, 0x00, 0x08, 0xff, 0xdc, 0x06, 0x0e, 0xff, + 0xdc, 0x05, 0x0c, 0xff, 0xde, 0x06, 0x0b, 0xff, + 0xe0, 0x07, 0x0a, 0xff, 0xe2, 0x08, 0x09, 0xff, + 0xe2, 0x04, 0x03, 0xff, 0xe4, 0x0b, 0x0d, 0xff, + 0xe6, 0x12, 0x17, 0xff, 0xe8, 0x19, 0x21, 0xff, + 0xe9, 0x31, 0x2b, 0xff, 0xeb, 0x51, 0x49, 0xff, + 0xed, 0x71, 0x66, 0xff, 0xef, 0x90, 0x84, 0xff, + 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff, + 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, + 0x96, 0x41, 0x5f, 0xff, 0x9a, 0x36, 0x52, 0xff, + 0x9e, 0x2b, 0x45, 0xff, 0xa2, 0x20, 0x38, 0xff, + 0xa4, 0x1c, 0x1c, 0xff, 0xa4, 0x1c, 0x1c, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff, + 0xcc, 0x0e, 0x0e, 0xff, 0xcc, 0x0e, 0x0e, 0xff, + 0xcc, 0x0e, 0x0e, 0xff, 0xd0, 0x12, 0x12, 0xff, + 0xd3, 0x0d, 0x15, 0xff, 0xd3, 0x0d, 0x15, 0xff, + 0xe6, 0x10, 0x18, 0xff, 0xdc, 0x06, 0x0e, 0xff, + 0xdd, 0x09, 0x10, 0xff, 0xdf, 0x0a, 0x0f, 0xff, + 0xe1, 0x0b, 0x0e, 0xff, 0xe3, 0x0c, 0x0d, 0xff, + 0xe1, 0x08, 0x06, 0xff, 0xe3, 0x0f, 0x10, 0xff, + 0xe5, 0x16, 0x1a, 0xff, 0xe7, 0x1d, 0x24, 0xff, + 0xe7, 0x3c, 0x33, 0xff, 0xe9, 0x5c, 0x50, 0xff, + 0xeb, 0x7c, 0x6e, 0xff, 0xed, 0x9b, 0x8b, 0xff, + 0xa4, 0x8c, 0xad, 0xff, 0x94, 0x7c, 0x9d, 0xff, + 0xa9, 0x70, 0x99, 0xff, 0x8f, 0x56, 0x7f, 0xff, + 0xa8, 0x44, 0x54, 0xff, 0xac, 0x39, 0x47, 0xff, + 0xb0, 0x2e, 0x3a, 0xff, 0xb5, 0x23, 0x2d, 0xff, + 0xa4, 0x1c, 0x1c, 0xff, 0xb0, 0x28, 0x28, 0xff, + 0xb0, 0x28, 0x28, 0xff, 0xb0, 0x28, 0x28, 0xff, + 0xd6, 0x18, 0x18, 0xff, 0xd0, 0x12, 0x12, 0xff, + 0xd6, 0x18, 0x18, 0xff, 0xd6, 0x18, 0x18, 0xff, + 0xdf, 0x19, 0x21, 0xff, 0xdf, 0x19, 0x21, 0xff, + 0xe6, 0x10, 0x18, 0xff, 0xe6, 0x10, 0x18, 0xff, + 0xde, 0x0e, 0x14, 0xff, 0xe0, 0x0f, 0x13, 0xff, + 0xe2, 0x10, 0x12, 0xff, 0xe4, 0x11, 0x11, 0xff, + 0xe0, 0x0c, 0x09, 0xff, 0xe2, 0x13, 0x13, 0xff, + 0xe4, 0x1a, 0x1d, 0xff, 0xe6, 0x21, 0x27, 0xff, + 0xe5, 0x47, 0x3a, 0xff, 0xe7, 0x67, 0x57, 0xff, + 0xe9, 0x87, 0x75, 0xff, 0xeb, 0xa6, 0x92, 0xff, + 0xd5, 0x8b, 0x83, 0xff, 0xc1, 0x77, 0x6f, 0xff, + 0xb9, 0x56, 0x56, 0xff, 0xb9, 0x56, 0x56, 0xff, + 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, + 0xb9, 0x35, 0x35, 0xff, 0xb9, 0x35, 0x35, 0xff, + 0xcb, 0x2e, 0x2c, 0xff, 0xcb, 0x2c, 0x2c, 0xff, + 0xcb, 0x2a, 0x2c, 0xff, 0xcb, 0x28, 0x2c, 0xff, + 0xd7, 0x20, 0x24, 0xff, 0xda, 0x20, 0x23, 0xff, + 0xdd, 0x1f, 0x22, 0xff, 0xe0, 0x1f, 0x21, 0xff, + 0xe7, 0x22, 0x24, 0xff, 0xe7, 0x20, 0x24, 0xff, + 0xe7, 0x1d, 0x24, 0xff, 0xe7, 0x1b, 0x24, 0xff, + 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff, + 0xe3, 0x1c, 0x20, 0xff, 0xe3, 0x1c, 0x20, 0xff, + 0xdf, 0x1a, 0x20, 0xff, 0xe0, 0x23, 0x25, 0xff, + 0xe1, 0x2b, 0x2a, 0xff, 0xe2, 0x34, 0x2f, 0xff, + 0xe3, 0x54, 0x49, 0xff, 0xe4, 0x69, 0x5e, 0xff, + 0xe5, 0x7e, 0x74, 0xff, 0xe6, 0x92, 0x89, 0xff, + 0xe7, 0x9d, 0x95, 0xff, 0xd5, 0x8b, 0x83, 0xff, + 0xcd, 0x6a, 0x6a, 0xff, 0xb9, 0x56, 0x56, 0xff, + 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, + 0xcd, 0x49, 0x49, 0xff, 0xcd, 0x49, 0x49, 0xff, + 0xd8, 0x46, 0x46, 0xff, 0xd8, 0x44, 0x46, 0xff, + 0xd8, 0x42, 0x46, 0xff, 0xd8, 0x40, 0x46, 0xff, + 0xdd, 0x3c, 0x3f, 0xff, 0xe0, 0x3b, 0x3e, 0xff, + 0xe3, 0x3b, 0x3d, 0xff, 0xe6, 0x3a, 0x3c, 0xff, + 0xe9, 0x3d, 0x3c, 0xff, 0xe9, 0x3a, 0x3c, 0xff, + 0xe9, 0x38, 0x3c, 0xff, 0xe9, 0x35, 0x3c, 0xff, + 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff, + 0xe7, 0x36, 0x3b, 0xff, 0xe7, 0x36, 0x3b, 0xff, + 0xe3, 0x34, 0x3a, 0xff, 0xe4, 0x3d, 0x3f, 0xff, + 0xe5, 0x45, 0x44, 0xff, 0xe6, 0x4e, 0x49, 0xff, + 0xe6, 0x63, 0x59, 0xff, 0xe7, 0x78, 0x6f, 0xff, + 0xe8, 0x8d, 0x84, 0xff, 0xe9, 0xa2, 0x99, 0xff, + 0xfb, 0xb1, 0xa9, 0xff, 0xe7, 0x9d, 0x95, 0xff, + 0xdf, 0x7c, 0x7c, 0xff, 0xcd, 0x6a, 0x6a, 0xff, + 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff, + 0xe2, 0x66, 0x66, 0xff, 0xe2, 0x66, 0x66, 0xff, + 0xe5, 0x5f, 0x5f, 0xff, 0xe5, 0x5d, 0x5f, 0xff, + 0xe5, 0x5b, 0x5f, 0xff, 0xe5, 0x59, 0x5f, 0xff, + 0xe3, 0x58, 0x59, 0xff, 0xe6, 0x57, 0x58, 0xff, + 0xe9, 0x57, 0x57, 0xff, 0xec, 0x56, 0x56, 0xff, + 0xeb, 0x58, 0x53, 0xff, 0xeb, 0x55, 0x53, 0xff, + 0xeb, 0x53, 0x53, 0xff, 0xeb, 0x50, 0x53, 0xff, + 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff, + 0xeb, 0x51, 0x55, 0xff, 0xeb, 0x51, 0x55, 0xff, + 0xe7, 0x4f, 0x53, 0xff, 0xe8, 0x57, 0x58, 0xff, + 0xe9, 0x60, 0x5d, 0xff, 0xea, 0x68, 0x62, 0xff, + 0xe9, 0x73, 0x6a, 0xff, 0xea, 0x87, 0x7f, 0xff, + 0xeb, 0x9c, 0x94, 0xff, 0xec, 0xb1, 0xa9, 0xff, + 0xfb, 0xb1, 0xa9, 0xff, 0xfb, 0xb1, 0xa9, 0xff, + 0xf3, 0x90, 0x90, 0xff, 0xf3, 0x90, 0x90, 0xff, + 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff, + 0xf8, 0x7c, 0x7c, 0xff, 0xf8, 0x7c, 0x7c, 0xff, + 0xf2, 0x77, 0x79, 0xff, 0xf2, 0x75, 0x79, 0xff, + 0xf2, 0x73, 0x79, 0xff, 0xf2, 0x71, 0x79, 0xff, + 0xe9, 0x73, 0x74, 0xff, 0xec, 0x73, 0x73, 0xff, + 0xef, 0x72, 0x72, 0xff, 0xf2, 0x72, 0x71, 0xff, + 0xed, 0x72, 0x6b, 0xff, 0xed, 0x70, 0x6b, 0xff, + 0xed, 0x6d, 0x6b, 0xff, 0xed, 0x6b, 0x6b, 0xff, + 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff, + 0xef, 0x6b, 0x70, 0xff, 0xef, 0x6b, 0x70, 0xff, + 0xeb, 0x69, 0x6d, 0xff, 0xec, 0x71, 0x72, 0xff, + 0xed, 0x7a, 0x77, 0xff, 0xee, 0x82, 0x7c, 0xff, + 0xec, 0x82, 0x7a, 0xff, 0xed, 0x97, 0x8f, 0xff, + 0xee, 0xab, 0xa4, 0xff, 0xef, 0xc0, 0xba, 0xff, + ]) +} + +var img_32x32_rgb_punchthrough_etc2 = { + compressed: new Uint8Array([ + 0x84, 0x94, 0xb4, 0x05, 0xf6, 0xff, 0x99, 0x00, + 0x74, 0x84, 0xa4, 0x05, 0xff, 0xf6, 0x08, 0x91, + 0x5f, 0x6f, 0x8f, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x4b, 0x5b, 0x6b, 0x00, 0xff, 0xfd, 0x20, 0x00, + 0x56, 0x66, 0x6e, 0x00, 0xdf, 0xfd, 0x00, 0x02, + 0x0e, 0x67, 0x33, 0x54, 0xff, 0xb9, 0x00, 0xc4, + 0xeb, 0x78, 0x54, 0x61, 0xff, 0xff, 0x08, 0x00, + 0x8b, 0x4b, 0x53, 0x00, 0xff, 0xf7, 0x00, 0x00, + 0xeb, 0x79, 0x44, 0x74, 0xff, 0xff, 0x80, 0x00, + 0x01, 0x10, 0x3f, 0x00, 0xfb, 0xb7, 0x00, 0x00, + 0x10, 0x27, 0x3a, 0x00, 0xff, 0xfb, 0x00, 0xc4, + 0x05, 0x24, 0x00, 0x38, 0xff, 0xef, 0x00, 0x10, + 0x05, 0x13, 0x23, 0x50, 0xfe, 0xff, 0x00, 0x00, + 0x41, 0x4c, 0x5c, 0x25, 0xff, 0xa7, 0x00, 0xb0, + 0x61, 0x43, 0x53, 0x00, 0xfe, 0xff, 0x01, 0x00, + 0x8b, 0x3b, 0x33, 0x01, 0xff, 0x9e, 0x00, 0x60, + 0x0e, 0x79, 0x34, 0x71, 0xff, 0xff, 0x80, 0x00, + 0x18, 0x20, 0x58, 0x04, 0xbb, 0xbf, 0x04, 0x40, + 0x16, 0x25, 0x3d, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x03, 0x10, 0x2f, 0x00, 0xff, 0xdf, 0x00, 0x60, + 0x0c, 0x24, 0x21, 0x31, 0xee, 0xff, 0x00, 0x10, + 0x79, 0x3f, 0x50, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x93, 0x34, 0x34, 0x21, 0xfa, 0xf7, 0x07, 0x08, + 0xf9, 0x66, 0xc3, 0x31, 0xff, 0x3f, 0x00, 0xc0, + 0x74, 0x94, 0xa4, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x0f, 0x0f, 0x21, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x01, 0x01, 0x22, 0x0d, 0x7f, 0x70, 0x08, 0x00, + 0x23, 0x28, 0x43, 0x00, 0xff, 0xf7, 0x00, 0x08, + 0x6a, 0x3f, 0x6d, 0x04, 0xe7, 0xef, 0x19, 0x00, + 0xa6, 0x46, 0x56, 0x00, 0xf7, 0x77, 0x00, 0x00, + 0xc3, 0x08, 0x09, 0x00, 0xff, 0xfc, 0x00, 0x00, + 0xef, 0x43, 0x4b, 0x00, 0xff, 0xff, 0x00, 0x70, + 0x6c, 0x74, 0x94, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x21, 0x35, 0x57, 0x04, 0xf7, 0xcf, 0x88, 0x30, + 0x06, 0x13, 0x33, 0x65, 0x77, 0x77, 0x88, 0x00, + 0x0e, 0x35, 0x42, 0x4c, 0xea, 0x3f, 0x11, 0x80, + 0x88, 0x64, 0x74, 0x01, 0xf2, 0xbb, 0x08, 0x00, + 0x1c, 0x00, 0xa2, 0x24, 0xf0, 0xff, 0x01, 0x00, + 0xd2, 0x01, 0x01, 0x01, 0xff, 0xfc, 0x00, 0x04, + 0xe1, 0x3b, 0x3b, 0x00, 0xff, 0x1f, 0x00, 0x60, + 0x58, 0x4f, 0x70, 0x01, 0x7f, 0xff, 0x80, 0x00, + 0x3b, 0x2d, 0x5f, 0x01, 0xfa, 0xff, 0x07, 0x10, + 0x6a, 0x2e, 0x55, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x88, 0x30, 0x50, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x15, 0x23, 0xb1, 0x11, 0xf2, 0xff, 0x0e, 0x00, + 0xdf, 0x00, 0x00, 0x01, 0xfc, 0xbf, 0x02, 0x20, + 0xe0, 0x02, 0x0a, 0x00, 0x7f, 0xff, 0x00, 0x00, + 0xe0, 0x27, 0x27, 0x21, 0xff, 0xe8, 0x00, 0x10, + 0x90, 0x6e, 0x96, 0x01, 0xff, 0xff, 0xc0, 0x00, + 0x8e, 0x3c, 0x5e, 0x00, 0xef, 0xff, 0x00, 0x00, + 0xf2, 0x22, 0x82, 0x51, 0xff, 0xff, 0x00, 0x01, + 0xb2, 0x17, 0x17, 0x01, 0xaa, 0xba, 0x45, 0x54, + 0xc2, 0x0f, 0x08, 0x04, 0x7e, 0xef, 0x80, 0x01, + 0xd9, 0x09, 0x10, 0x00, 0xff, 0xb3, 0x00, 0x00, + 0xe0, 0x12, 0x1a, 0x01, 0x6c, 0xff, 0x10, 0x20, + 0xef, 0x4b, 0x43, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xb3, 0x53, 0x53, 0x01, 0xef, 0xff, 0x00, 0x00, + 0xc0, 0x40, 0x40, 0x00, 0xdd, 0xdd, 0x22, 0x22, + 0xd0, 0x40, 0x40, 0x00, 0xdd, 0xdd, 0x00, 0x00, + 0xd8, 0x38, 0x38, 0x00, 0xfd, 0xdd, 0x00, 0x00, + 0xe0, 0x33, 0x3b, 0x01, 0xdb, 0xbf, 0x04, 0x40, + 0xe0, 0x47, 0x4e, 0x00, 0xdf, 0xff, 0x00, 0x00, + 0xd8, 0x37, 0x3e, 0x00, 0xee, 0xdd, 0x10, 0x20, + 0xe0, 0x73, 0x6b, 0x00, 0xff, 0xff, 0x00, 0x00, + ]), + decompressed: new Uint8Array([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x9c, 0xbd, 0xff, 0x7c, 0x8c, 0xad, 0xff, + 0x7b, 0x8c, 0xad, 0xff, 0x6b, 0x7c, 0x9d, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x5a, 0x6b, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x6b, 0x7c, 0xff, + 0x5a, 0x6b, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, 0x5a, 0xff, + 0x66, 0x66, 0x77, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x3e, 0x60, 0xff, 0x3e, 0x3e, 0x60, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x74, 0x84, 0xa5, 0xff, 0x52, 0x62, 0x83, 0xff, + 0x52, 0x63, 0x84, 0xff, 0x41, 0x52, 0x73, 0xff, + 0x41, 0x52, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x4a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4f, 0x3e, 0x60, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x4a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x4a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x5b, 0x6b, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x62, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x39, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x39, 0x49, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x94, 0x41, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x39, 0xff, + 0x08, 0x10, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x29, 0x41, 0xff, 0x08, 0x19, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4a, 0x29, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xad, 0x5a, 0x52, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x6c, 0xff, + 0x00, 0x10, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x19, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4a, 0x29, 0x39, 0xff, 0x39, 0x18, 0x28, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0b, 0x2d, 0xff, + 0x44, 0x22, 0x44, 0xff, 0x44, 0x22, 0x44, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0x42, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x83, 0x20, 0x20, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x29, 0x62, 0xff, + 0x29, 0x32, 0x6b, 0xff, 0x18, 0x21, 0x5a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0x39, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2d, 0x3e, 0x71, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd2, 0x39, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6b, 0x39, 0x6b, 0xff, + 0x6a, 0x20, 0x41, 0xff, 0x8c, 0x42, 0x63, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x3a, 0x42, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x08, 0x31, 0xff, 0x08, 0x08, 0x31, 0xff, + 0x00, 0x00, 0x07, 0xff, 0x08, 0x08, 0x31, 0xff, + 0x29, 0x31, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x42, 0x63, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xa5, 0x42, 0x52, 0xff, 0xa5, 0x42, 0x52, 0xff, + 0x94, 0x31, 0x42, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x29, 0x39, 0x5a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x4b, 0x6d, 0xff, 0x6d, 0x4b, 0x6d, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x63, 0x73, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x2d, 0x2d, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x29, 0x39, 0x5a, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xd6, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xef, 0x41, 0x41, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x66, 0x33, 0x55, 0xff, + 0x66, 0x33, 0x55, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x8c, 0x42, 0x52, 0xff, 0x8c, 0x42, 0x52, 0xff, + 0x8c, 0x42, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xdf, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xef, 0x41, 0x41, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3a, 0x29, 0x5b, 0xff, 0x18, 0x07, 0x39, 0xff, + 0x22, 0x11, 0x33, 0xff, 0x22, 0x11, 0x33, 0xff, + 0x43, 0x43, 0x76, 0xff, 0x43, 0x43, 0x76, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x6d, 0x4b, 0x6d, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x94, 0x4a, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x21, 0x52, 0xff, + 0x41, 0x31, 0x62, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0x22, 0x33, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xde, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x21, 0x21, 0xff, 0xf8, 0x32, 0x32, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x21, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x0b, 0x0b, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, + 0xe6, 0x08, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x21, 0x21, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5a, 0x18, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x62, 0x4a, 0x7b, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc1, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x10, 0x18, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7b, 0x18, 0x4a, 0xff, + 0x82, 0x1c, 0x4f, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0x10, 0x10, 0xff, 0xad, 0x08, 0x08, 0xff, + 0xbd, 0x18, 0x18, 0xff, 0xb5, 0x10, 0x10, 0xff, + 0xbe, 0x00, 0x00, 0xff, 0xc6, 0x08, 0x08, 0xff, + 0xd6, 0x00, 0x08, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe7, 0x10, 0x18, 0xff, 0xef, 0x18, 0x20, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x08, 0x10, 0xff, + 0xe7, 0x10, 0x18, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x52, 0x7c, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff, + 0xce, 0x10, 0x10, 0xff, 0xce, 0x10, 0x10, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xde, 0x08, 0x10, 0xff, 0xde, 0x08, 0x10, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x8c, 0x52, 0x7c, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x11, 0x19, 0xff, + 0xde, 0x08, 0x10, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x21, 0x29, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0x52, 0x52, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xde, 0x29, 0x29, 0xff, 0xe6, 0x31, 0x31, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff, + 0xce, 0x4a, 0x4a, 0xff, 0xce, 0x4a, 0x4a, 0xff, + 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff, + 0xd6, 0x42, 0x42, 0xff, 0xd6, 0x42, 0x42, 0xff, + 0xde, 0x39, 0x39, 0xff, 0xde, 0x39, 0x39, 0xff, + 0xde, 0x39, 0x39, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x31, 0x39, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe7, 0x39, 0x39, 0xff, + 0xde, 0x31, 0x39, 0xff, 0xe6, 0x39, 0x41, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xef, 0x52, 0x5a, 0xff, + 0xef, 0x52, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]) +} + +var img_32x32_rgba_etc2 = { + compressed: new Uint8Array([ + 0x04, 0x1d, 0x6d, 0x26, 0x91, 0x48, 0x84, 0x45, + 0x8d, 0x9d, 0xb6, 0x4a, 0xc4, 0x80, 0x83, 0x97, + 0x0b, 0x12, 0x48, 0x94, 0x88, 0x44, 0x42, 0x25, + 0x64, 0x74, 0x95, 0x4b, 0xae, 0xa2, 0x91, 0x05, + 0x15, 0x11, 0x68, 0x86, 0x84, 0x44, 0x54, 0x26, + 0x74, 0x85, 0xa7, 0x25, 0xfa, 0xa6, 0xff, 0x42, + 0x1b, 0x12, 0x68, 0x66, 0xa7, 0x66, 0xf6, 0x6f, + 0x64, 0x74, 0x85, 0x49, 0xae, 0xea, 0x89, 0xba, + 0x1d, 0x12, 0x66, 0x76, 0xa7, 0x6a, 0x76, 0x86, + 0x64, 0x74, 0x7c, 0x4b, 0xa8, 0x8a, 0xa4, 0x81, + 0x15, 0x11, 0x22, 0xf4, 0x26, 0x44, 0x56, 0x84, + 0x73, 0x73, 0x85, 0x29, 0xab, 0xa3, 0x3e, 0x2a, + 0x0b, 0x1b, 0x22, 0xf2, 0x25, 0x44, 0x44, 0x88, + 0x75, 0x74, 0x86, 0x25, 0xaa, 0x6e, 0x71, 0x11, + 0x04, 0x1d, 0x22, 0xe4, 0x45, 0x48, 0x86, 0x91, + 0xbe, 0x7f, 0x04, 0x62, 0xbb, 0x6c, 0x86, 0xcf, + 0x0b, 0x1b, 0x6d, 0x24, 0x89, 0x44, 0x02, 0x25, + 0x74, 0x74, 0x97, 0x48, 0xec, 0xf0, 0x50, 0xe6, + 0x1a, 0x10, 0x6d, 0x16, 0x88, 0x42, 0x63, 0x37, + 0x21, 0x30, 0x5f, 0x4a, 0xbd, 0xe8, 0x8e, 0x5b, + 0x37, 0x21, 0x68, 0x86, 0x44, 0x42, 0x52, 0x2f, + 0x10, 0x27, 0x3a, 0x46, 0x8c, 0xe2, 0x87, 0x10, + 0x4a, 0x3b, 0x64, 0x54, 0x66, 0x42, 0x74, 0x2f, + 0x1e, 0x18, 0x48, 0x07, 0x6b, 0x31, 0xe9, 0xa9, + 0x4b, 0x3a, 0x42, 0xf4, 0x2f, 0x46, 0x64, 0x66, + 0x05, 0x13, 0x23, 0x57, 0x66, 0xd6, 0x34, 0xc4, + 0x38, 0x22, 0x33, 0x74, 0x2f, 0x46, 0x66, 0x84, + 0x43, 0x4e, 0x5c, 0x2b, 0xbd, 0xee, 0x59, 0xb4, + 0x1f, 0x2b, 0x12, 0xf2, 0x25, 0x44, 0x46, 0x88, + 0x57, 0x44, 0x55, 0x45, 0x44, 0x2b, 0xa9, 0x01, + 0x0b, 0x1b, 0x12, 0xf2, 0x25, 0x44, 0x04, 0x89, + 0x9a, 0x48, 0x41, 0x2e, 0x00, 0x31, 0xf0, 0xc5, + 0x10, 0x19, 0x6d, 0x24, 0x48, 0x22, 0x59, 0x77, + 0x6c, 0x7c, 0x9e, 0x4a, 0xfb, 0xf2, 0xd8, 0x58, + 0x32, 0x22, 0x6d, 0x24, 0x88, 0x22, 0x51, 0x77, + 0x18, 0x20, 0x4a, 0x27, 0x6b, 0x90, 0x0e, 0x35, + 0x59, 0x42, 0x44, 0x02, 0x25, 0x12, 0xe9, 0x77, + 0x00, 0x0b, 0x29, 0x2f, 0xcc, 0x29, 0xf0, 0x87, + 0x8c, 0x32, 0x68, 0x54, 0x66, 0x42, 0xf3, 0x37, + 0x03, 0x10, 0x2f, 0x26, 0x76, 0x48, 0x29, 0x19, + 0x96, 0x4a, 0x42, 0xf4, 0x2e, 0x46, 0x66, 0x45, + 0x33, 0x18, 0x40, 0x26, 0x06, 0x76, 0x2e, 0x3e, + 0x71, 0x31, 0x12, 0xf2, 0x25, 0x44, 0x46, 0x88, + 0xb9, 0x06, 0x32, 0x2b, 0x02, 0x13, 0x10, 0x03, + 0x38, 0x22, 0x9b, 0xf1, 0x2e, 0x44, 0x46, 0x91, + 0x49, 0x15, 0xd0, 0x06, 0xcc, 0xe9, 0x02, 0x33, + 0x15, 0x11, 0x97, 0x70, 0x25, 0x44, 0x06, 0x91, + 0x6a, 0x06, 0x6b, 0x33, 0xf1, 0x05, 0x01, 0xff, + 0x15, 0x17, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xff, + 0x74, 0x95, 0xa6, 0x2c, 0x70, 0xf0, 0xbe, 0x5c, + 0x40, 0x24, 0x6d, 0xb4, 0x49, 0x12, 0x4d, 0xbf, + 0x1d, 0x1d, 0x32, 0x4e, 0xfe, 0xf6, 0x4c, 0xe8, + 0x7f, 0x4b, 0x69, 0x22, 0x00, 0x92, 0xdb, 0xbf, + 0x00, 0x01, 0x37, 0x2a, 0x0c, 0x63, 0x0c, 0x6b, + 0xc7, 0x32, 0x68, 0x94, 0x24, 0x13, 0x69, 0xbf, + 0x23, 0x28, 0x43, 0x26, 0x03, 0x11, 0xea, 0xd1, + 0xd9, 0x32, 0x33, 0x73, 0x2e, 0x42, 0x46, 0x89, + 0x63, 0x30, 0x66, 0x46, 0x05, 0x23, 0x5b, 0xa1, + 0x95, 0x4b, 0xbb, 0xf1, 0x2d, 0x24, 0x06, 0x92, + 0xf3, 0x12, 0x93, 0x46, 0x0b, 0x57, 0x06, 0xa8, + 0x4b, 0x3a, 0xdb, 0xf9, 0x2d, 0x20, 0x04, 0x92, + 0x60, 0x86, 0x04, 0xf6, 0x18, 0x46, 0x80, 0x00, + 0x1c, 0x12, 0xdf, 0xf9, 0x2d, 0x44, 0x96, 0xdb, + 0x72, 0xa6, 0x0d, 0x73, 0x8b, 0x2f, 0x64, 0x48, + 0x15, 0x17, 0x6d, 0xb2, 0x52, 0x90, 0x0f, 0xf5, + 0x50, 0x6c, 0x85, 0x6b, 0xec, 0x00, 0xc0, 0x1f, + 0x3d, 0x21, 0x49, 0xb0, 0x09, 0x92, 0x0f, 0xb5, + 0x31, 0x40, 0x63, 0x6c, 0x71, 0xfc, 0x2d, 0x09, + 0x7d, 0x34, 0x49, 0xb0, 0x0a, 0xb2, 0x0f, 0xf4, + 0x07, 0x01, 0x33, 0x6b, 0x6f, 0x73, 0xa1, 0x33, + 0xbb, 0x5a, 0x00, 0xab, 0x01, 0xd6, 0x0f, 0xa8, + 0xeb, 0x35, 0x53, 0x5a, 0x02, 0x7f, 0x31, 0x83, + 0xc7, 0x32, 0xfa, 0x1f, 0xa1, 0xd4, 0x28, 0x13, + 0x7b, 0x55, 0x67, 0x27, 0x84, 0x6f, 0x61, 0x29, + 0x91, 0x4b, 0xfa, 0xcb, 0x20, 0x00, 0xa4, 0x9b, + 0x51, 0x05, 0x68, 0x8b, 0xfe, 0x00, 0xfe, 0x21, + 0x4a, 0x21, 0xff, 0x5b, 0x20, 0x00, 0x94, 0x9b, + 0xe0, 0x01, 0x09, 0x22, 0x0c, 0x1f, 0x70, 0x03, + 0x1b, 0x12, 0xff, 0xeb, 0x60, 0x25, 0x26, 0xdb, + 0x72, 0x9e, 0x0c, 0x7a, 0xa1, 0x2f, 0x43, 0x87, + 0x0d, 0x19, 0x29, 0x20, 0x09, 0xb0, 0x0f, 0xac, + 0x77, 0x6d, 0x8f, 0x4a, 0xff, 0x70, 0x36, 0x3e, + 0x2f, 0x21, 0x29, 0xb0, 0x4a, 0x80, 0x1d, 0x60, + 0x0e, 0x15, 0x43, 0x67, 0x13, 0x33, 0x62, 0xfc, + 0x59, 0x49, 0x05, 0x38, 0x0a, 0xb0, 0x1d, 0x60, + 0xb8, 0x04, 0xb1, 0xb3, 0x31, 0xcf, 0x01, 0x11, + 0x7d, 0x34, 0x81, 0x3d, 0x0b, 0xf4, 0x2f, 0x42, + 0x83, 0x44, 0x64, 0x47, 0x96, 0x18, 0x80, 0x5c, + 0x84, 0x37, 0xf4, 0x3f, 0x0b, 0xd0, 0xba, 0x13, + 0x58, 0x14, 0xc9, 0x1a, 0x01, 0x77, 0x72, 0x08, + 0x63, 0x4b, 0xf6, 0x0d, 0x01, 0x80, 0xa0, 0x53, + 0xd9, 0x0f, 0x08, 0x42, 0xef, 0xef, 0x89, 0x03, + 0x37, 0x22, 0xfa, 0x0b, 0x02, 0x05, 0x34, 0x9b, + 0x74, 0x80, 0x04, 0xf7, 0x14, 0x3f, 0x00, 0x42, + 0x15, 0x11, 0xd6, 0x08, 0x01, 0x05, 0x24, 0x9b, + 0x74, 0x9c, 0x07, 0xf7, 0x9b, 0x2f, 0x43, 0x47, + 0x0a, 0x12, 0x49, 0x22, 0x52, 0x04, 0xa8, 0x01, + 0x98, 0x84, 0xa5, 0x0e, 0xf1, 0xd2, 0x10, 0xec, + 0x14, 0x11, 0x05, 0x38, 0x0a, 0xb0, 0x1f, 0x60, + 0xb8, 0xbc, 0xfa, 0xc2, 0x10, 0x85, 0xc8, 0xd2, + 0x2f, 0x21, 0x05, 0x38, 0x0b, 0xa0, 0xad, 0x01, + 0x51, 0x05, 0x41, 0x2a, 0x01, 0x11, 0x30, 0x6f, + 0x39, 0x3b, 0xb0, 0xad, 0x02, 0xf4, 0x1f, 0x41, + 0xb3, 0x10, 0x10, 0x03, 0x24, 0x57, 0x8b, 0x3a, + 0x3d, 0x21, 0xf0, 0x2f, 0x02, 0xd0, 0x2d, 0x0b, + 0xca, 0x08, 0x10, 0x22, 0x73, 0x33, 0x9f, 0x89, + 0x30, 0x22, 0xf4, 0x1d, 0x02, 0xa0, 0xa8, 0x53, + 0x6c, 0x80, 0x05, 0x72, 0x04, 0x0e, 0xe2, 0x46, + 0x1f, 0x2b, 0xb0, 0x18, 0x0a, 0x05, 0x32, 0x9b, + 0x70, 0x80, 0x04, 0x76, 0x1c, 0x56, 0xe2, 0x03, + 0x0b, 0x12, 0xb0, 0x18, 0x09, 0x05, 0x22, 0x92, + 0x74, 0xa6, 0x0c, 0xfa, 0xa5, 0x37, 0x0a, 0x50, + 0x04, 0x1d, 0x4d, 0xb4, 0x9b, 0x29, 0x30, 0x52, + 0xdf, 0x94, 0x8d, 0x4a, 0x73, 0x31, 0xb9, 0x9c, + 0x0f, 0x11, 0x4d, 0xb2, 0x9b, 0x29, 0x30, 0x53, + 0xd2, 0x53, 0x53, 0x47, 0x77, 0x77, 0x99, 0x88, + 0x0d, 0x19, 0x80, 0xaa, 0x0a, 0xd0, 0x2f, 0x41, + 0x64, 0xae, 0x0d, 0xe6, 0x26, 0x5f, 0xf1, 0xe4, + 0x11, 0x12, 0xd0, 0xaf, 0x42, 0xf4, 0x2f, 0x82, + 0x6a, 0xa0, 0x0c, 0xf2, 0x1e, 0x47, 0x71, 0xe3, + 0x19, 0x10, 0xa1, 0x3a, 0x13, 0xa1, 0x38, 0x53, + 0x72, 0xa2, 0x0c, 0xf3, 0x18, 0x4f, 0x71, 0xa0, + 0x10, 0x19, 0xf0, 0x2d, 0x0a, 0xa0, 0xb8, 0x53, + 0x70, 0x9c, 0x0c, 0x72, 0x1c, 0x47, 0x90, 0xa2, + 0x0b, 0x1b, 0xa0, 0xa8, 0x0a, 0x05, 0x32, 0x93, + 0x6e, 0x9a, 0x0c, 0x72, 0x3c, 0x6f, 0x70, 0x61, + 0x04, 0x1d, 0xa0, 0xa0, 0x52, 0x29, 0x34, 0x9b, + 0x70, 0x54, 0x15, 0x73, 0xa7, 0x3f, 0x72, 0x22, + ]), + decompressed: new Uint8Array([ + 0xa9, 0xb9, 0xd2, 0x00, 0xa9, 0xb9, 0xd2, 0x00, + 0x90, 0xa1, 0xc2, 0x01, 0x7c, 0x8d, 0xae, 0x01, + 0x80, 0x90, 0xb1, 0x03, 0x6c, 0x7c, 0x9d, 0x03, + 0x80, 0x90, 0xb1, 0x03, 0x80, 0x90, 0xb1, 0x06, + 0x7c, 0x8d, 0xaf, 0x08, 0x7c, 0x8d, 0xaf, 0x08, + 0x88, 0x99, 0xbb, 0x0b, 0x66, 0x77, 0x99, 0x0b, + 0x6f, 0x80, 0x91, 0x0e, 0x83, 0x94, 0xa5, 0x0e, + 0x83, 0x94, 0xa5, 0x0e, 0x6f, 0x80, 0x91, 0x0e, + 0x80, 0x90, 0x98, 0x10, 0x6c, 0x7c, 0x84, 0x10, + 0x6c, 0x7c, 0x84, 0x10, 0x6c, 0x7c, 0x84, 0x10, + 0x72, 0x72, 0x83, 0x0e, 0x7c, 0x7c, 0x8d, 0x0b, + 0x72, 0x72, 0x83, 0x0b, 0x88, 0x88, 0x99, 0x08, + 0x88, 0x88, 0x99, 0x06, 0x88, 0x88, 0x99, 0x06, + 0x88, 0x88, 0x99, 0x04, 0x88, 0x88, 0x99, 0x04, + 0x7d, 0x7e, 0x82, 0x02, 0x8f, 0x8d, 0x8f, 0x01, + 0xa0, 0x9d, 0x9c, 0x01, 0xb2, 0xac, 0xa9, 0x00, + 0xa9, 0xb9, 0xd2, 0x00, 0x95, 0xa5, 0xbe, 0x01, + 0x90, 0xa1, 0xc2, 0x01, 0x7c, 0x8d, 0xae, 0x02, + 0x5a, 0x6a, 0x8b, 0x03, 0x5a, 0x6a, 0x8b, 0x03, + 0x5a, 0x6a, 0x8b, 0x06, 0x5a, 0x6a, 0x8b, 0x09, + 0x66, 0x77, 0x99, 0x0b, 0x72, 0x83, 0xa5, 0x0b, + 0x66, 0x77, 0x99, 0x0e, 0x66, 0x77, 0x99, 0x12, + 0x49, 0x5a, 0x6b, 0x13, 0x49, 0x5a, 0x6b, 0x13, + 0x5d, 0x6e, 0x7f, 0x16, 0x5d, 0x6e, 0x7f, 0x16, + 0x5a, 0x6a, 0x72, 0x18, 0x6c, 0x7c, 0x84, 0x15, + 0x6c, 0x7c, 0x84, 0x15, 0x46, 0x56, 0x5e, 0x15, + 0x66, 0x66, 0x77, 0x12, 0x66, 0x66, 0x77, 0x12, + 0x66, 0x66, 0x77, 0x0e, 0x66, 0x66, 0x77, 0x0b, + 0x72, 0x72, 0x83, 0x09, 0x72, 0x72, 0x83, 0x09, + 0x72, 0x72, 0x83, 0x06, 0x66, 0x66, 0x77, 0x04, + 0x82, 0x6c, 0x71, 0x03, 0x94, 0x7b, 0x7e, 0x02, + 0xa5, 0x8b, 0x8b, 0x01, 0xb7, 0x9a, 0x98, 0x01, + 0xa9, 0xb9, 0xd2, 0x01, 0x95, 0xa5, 0xbe, 0x01, + 0x6a, 0x7b, 0x9c, 0x02, 0x6a, 0x7b, 0x9c, 0x03, + 0x5f, 0x6f, 0x98, 0x06, 0x4b, 0x5b, 0x84, 0x06, + 0x39, 0x49, 0x72, 0x09, 0x4b, 0x5b, 0x84, 0x0c, + 0x3f, 0x50, 0x72, 0x0e, 0x55, 0x66, 0x88, 0x12, + 0x55, 0x66, 0x88, 0x12, 0x33, 0x44, 0x66, 0x17, + 0x4d, 0x4d, 0x5e, 0x19, 0x3b, 0x3b, 0x4c, 0x1c, + 0x3b, 0x3b, 0x4c, 0x1f, 0x4d, 0x4d, 0x5e, 0x1f, + 0x4b, 0x5b, 0x63, 0x1e, 0x4b, 0x5b, 0x63, 0x1e, + 0x5f, 0x6f, 0x77, 0x1e, 0x4b, 0x5b, 0x63, 0x1b, + 0x3c, 0x3c, 0x5e, 0x1b, 0x3c, 0x3c, 0x5e, 0x17, + 0x50, 0x50, 0x72, 0x12, 0x3c, 0x3c, 0x5e, 0x12, + 0x50, 0x3f, 0x61, 0x0f, 0x50, 0x3f, 0x61, 0x0c, + 0x5a, 0x49, 0x6b, 0x09, 0x66, 0x55, 0x77, 0x06, + 0x88, 0x5a, 0x5f, 0x05, 0x99, 0x69, 0x6c, 0x03, + 0xab, 0x79, 0x79, 0x02, 0xbc, 0x88, 0x86, 0x01, + 0x95, 0xa5, 0xbe, 0x01, 0x6f, 0x7f, 0x98, 0x02, + 0x7c, 0x8d, 0xae, 0x03, 0x56, 0x67, 0x88, 0x05, + 0x4b, 0x5b, 0x84, 0x06, 0x39, 0x49, 0x72, 0x09, + 0x39, 0x49, 0x72, 0x0c, 0x25, 0x35, 0x5e, 0x0f, + 0x49, 0x5a, 0x7c, 0x12, 0x3f, 0x50, 0x72, 0x17, + 0x33, 0x44, 0x66, 0x1b, 0x33, 0x44, 0x66, 0x1e, + 0x27, 0x27, 0x38, 0x22, 0x27, 0x27, 0x38, 0x27, + 0x27, 0x27, 0x38, 0x27, 0x27, 0x27, 0x38, 0x27, + 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x29, + 0x39, 0x49, 0x51, 0x29, 0x25, 0x35, 0x3d, 0x24, + 0x50, 0x50, 0x72, 0x21, 0x2a, 0x2a, 0x4c, 0x1e, + 0x16, 0x16, 0x38, 0x1b, 0x2a, 0x2a, 0x4c, 0x17, + 0x50, 0x3f, 0x61, 0x14, 0x5a, 0x49, 0x6b, 0x0f, + 0x50, 0x3f, 0x61, 0x0c, 0x50, 0x3f, 0x61, 0x09, + 0x8d, 0x48, 0x4e, 0x06, 0x9e, 0x57, 0x5b, 0x05, + 0xb0, 0x67, 0x68, 0x03, 0xc1, 0x76, 0x75, 0x02, + 0x80, 0x80, 0xa2, 0x01, 0x6e, 0x6e, 0x90, 0x04, + 0x4d, 0x4d, 0x80, 0x04, 0x61, 0x61, 0x94, 0x06, + 0x3e, 0x4e, 0x77, 0x0b, 0x3e, 0x4e, 0x77, 0x0b, + 0x20, 0x28, 0x49, 0x11, 0x20, 0x28, 0x49, 0x14, + 0x19, 0x2a, 0x42, 0x1d, 0x2d, 0x3e, 0x56, 0x1d, + 0x21, 0x29, 0x5b, 0x23, 0x15, 0x1d, 0x4f, 0x29, + 0x10, 0x10, 0x42, 0x2c, 0x16, 0x16, 0x48, 0x35, + 0x10, 0x10, 0x42, 0x35, 0x1a, 0x1a, 0x4c, 0x35, + 0x11, 0x11, 0x33, 0x33, 0x22, 0x33, 0x55, 0x33, + 0x11, 0x11, 0x33, 0x33, 0x32, 0x43, 0x65, 0x33, + 0x47, 0x4f, 0x5f, 0x2e, 0x53, 0x5b, 0x6b, 0x28, + 0x31, 0x39, 0x49, 0x28, 0x31, 0x39, 0x49, 0x1e, + 0x38, 0x27, 0x38, 0x1b, 0x5e, 0x4d, 0x5e, 0x15, + 0x72, 0x61, 0x72, 0x11, 0x5e, 0x4d, 0x5e, 0x0b, + 0x8b, 0x39, 0x31, 0x09, 0x97, 0x45, 0x3d, 0x06, + 0xba, 0x57, 0x57, 0x04, 0xd7, 0x74, 0x74, 0x04, + 0x94, 0x94, 0xb6, 0x01, 0x5a, 0x5a, 0x7c, 0x04, + 0x4d, 0x4d, 0x80, 0x06, 0x3b, 0x3b, 0x6e, 0x09, + 0x3e, 0x4e, 0x77, 0x0b, 0x18, 0x28, 0x51, 0x11, + 0x46, 0x4e, 0x6f, 0x17, 0x20, 0x28, 0x49, 0x1c, + 0x07, 0x18, 0x30, 0x23, 0x07, 0x18, 0x30, 0x29, + 0x21, 0x29, 0x5b, 0x31, 0x15, 0x1d, 0x4f, 0x31, + 0x1a, 0x1a, 0x4c, 0x3b, 0x10, 0x10, 0x42, 0x3b, + 0x16, 0x16, 0x48, 0x44, 0x10, 0x10, 0x42, 0x44, + 0x22, 0x33, 0x55, 0x45, 0x11, 0x11, 0x33, 0x45, + 0x22, 0x33, 0x55, 0x3f, 0x12, 0x23, 0x45, 0x3f, + 0x3d, 0x45, 0x55, 0x3a, 0x31, 0x39, 0x49, 0x34, + 0x47, 0x4f, 0x5f, 0x2e, 0x3d, 0x45, 0x55, 0x28, + 0x4c, 0x3b, 0x4c, 0x21, 0x4c, 0x3b, 0x4c, 0x1b, + 0x5e, 0x4d, 0x5e, 0x15, 0x72, 0x61, 0x72, 0x11, + 0xa1, 0x4f, 0x47, 0x0c, 0x97, 0x45, 0x3d, 0x09, + 0xba, 0x57, 0x57, 0x06, 0xd7, 0x74, 0x74, 0x04, + 0x94, 0x94, 0xb6, 0x04, 0x5a, 0x5a, 0x7c, 0x06, + 0x3b, 0x3b, 0x6e, 0x09, 0x27, 0x27, 0x5a, 0x0c, + 0x2a, 0x3a, 0x63, 0x11, 0x04, 0x14, 0x3d, 0x14, + 0x0c, 0x14, 0x35, 0x1c, 0x32, 0x3a, 0x5b, 0x22, + 0x19, 0x2a, 0x42, 0x29, 0x07, 0x18, 0x30, 0x31, + 0x00, 0x07, 0x39, 0x3b, 0x15, 0x1d, 0x4f, 0x43, + 0x0d, 0x1d, 0x4f, 0x44, 0x0d, 0x1d, 0x4f, 0x4d, + 0x0d, 0x1d, 0x4f, 0x4d, 0x00, 0x07, 0x39, 0x56, + 0x12, 0x23, 0x45, 0x54, 0x12, 0x23, 0x45, 0x54, + 0x12, 0x23, 0x45, 0x4e, 0x22, 0x33, 0x55, 0x4e, + 0x3d, 0x1c, 0x1c, 0x46, 0x51, 0x30, 0x30, 0x40, + 0x51, 0x30, 0x30, 0x3a, 0x77, 0x56, 0x56, 0x34, + 0x7c, 0x49, 0x5a, 0x27, 0x7c, 0x49, 0x5a, 0x21, + 0x72, 0x3f, 0x50, 0x1b, 0x72, 0x3f, 0x50, 0x15, + 0xad, 0x5b, 0x53, 0x0f, 0xad, 0x5b, 0x53, 0x0c, + 0xba, 0x57, 0x57, 0x09, 0xd7, 0x74, 0x74, 0x06, + 0x80, 0x80, 0xa2, 0x04, 0x5a, 0x5a, 0x7c, 0x06, + 0x3b, 0x3b, 0x6e, 0x09, 0x3b, 0x3b, 0x6e, 0x0f, + 0x04, 0x14, 0x3d, 0x14, 0x18, 0x28, 0x51, 0x17, + 0x0c, 0x14, 0x35, 0x22, 0x0c, 0x14, 0x35, 0x28, + 0x19, 0x2a, 0x42, 0x31, 0x07, 0x18, 0x30, 0x3b, + 0x0b, 0x13, 0x45, 0x43, 0x00, 0x07, 0x39, 0x4f, + 0x19, 0x29, 0x5b, 0x56, 0x19, 0x29, 0x5b, 0x5c, + 0x00, 0x07, 0x39, 0x65, 0x19, 0x29, 0x5b, 0x65, + 0x11, 0x11, 0x33, 0x66, 0x12, 0x23, 0x45, 0x66, + 0x11, 0x11, 0x33, 0x60, 0x11, 0x11, 0x33, 0x60, + 0x51, 0x30, 0x30, 0x50, 0x3d, 0x1c, 0x1c, 0x50, + 0x3d, 0x1c, 0x1c, 0x46, 0x51, 0x30, 0x30, 0x3a, + 0x72, 0x3f, 0x50, 0x31, 0x7c, 0x49, 0x5a, 0x27, + 0x88, 0x55, 0x66, 0x21, 0x88, 0x55, 0x66, 0x1b, + 0xa1, 0x4f, 0x47, 0x14, 0xad, 0x5b, 0x53, 0x0f, + 0xba, 0x57, 0x57, 0x09, 0xd7, 0x74, 0x74, 0x06, + 0x74, 0x84, 0xa5, 0x06, 0x4e, 0x5e, 0x7f, 0x08, + 0x41, 0x51, 0x83, 0x0b, 0x2d, 0x3d, 0x6f, 0x11, + 0x29, 0x32, 0x5b, 0x18, 0x07, 0x10, 0x39, 0x22, + 0x13, 0x1c, 0x45, 0x28, 0x1d, 0x26, 0x4f, 0x2e, + 0x00, 0x00, 0x18, 0x39, 0x05, 0x0d, 0x2e, 0x45, + 0x05, 0x0d, 0x2e, 0x51, 0x11, 0x19, 0x3a, 0x5d, + 0x11, 0x21, 0x3a, 0x65, 0x11, 0x21, 0x3a, 0x74, + 0x29, 0x21, 0x32, 0x74, 0x13, 0x0b, 0x1c, 0x7d, + 0x36, 0x1d, 0x47, 0x76, 0x20, 0x07, 0x31, 0x76, + 0x4f, 0x1d, 0x47, 0x76, 0x4f, 0x1d, 0x47, 0x6e, + 0x56, 0x34, 0x45, 0x68, 0x76, 0x54, 0x65, 0x5c, + 0x87, 0x32, 0x54, 0x53, 0x67, 0x12, 0x34, 0x4a, + 0x93, 0x00, 0x00, 0x3a, 0x82, 0x1c, 0x1c, 0x34, + 0xb0, 0x4a, 0x4a, 0x28, 0xb0, 0x4a, 0x4a, 0x1e, + 0xd2, 0x5b, 0x5b, 0x17, 0xd2, 0x39, 0x39, 0x12, + 0xd2, 0x5b, 0x5b, 0x0b, 0xe8, 0x71, 0x71, 0x08, + 0x62, 0x72, 0x93, 0x06, 0x62, 0x72, 0x93, 0x0b, + 0x41, 0x51, 0x83, 0x0e, 0x41, 0x51, 0x83, 0x14, + 0x1d, 0x26, 0x4f, 0x18, 0x29, 0x32, 0x5b, 0x22, + 0x07, 0x10, 0x39, 0x2e, 0x13, 0x1c, 0x45, 0x3a, + 0x11, 0x19, 0x3a, 0x45, 0x00, 0x03, 0x24, 0x51, + 0x05, 0x0d, 0x2e, 0x5d, 0x11, 0x19, 0x3a, 0x69, + 0x05, 0x15, 0x2e, 0x74, 0x05, 0x15, 0x2e, 0x7d, + 0x13, 0x0b, 0x1c, 0x86, 0x07, 0x00, 0x10, 0x8f, + 0x20, 0x07, 0x31, 0x8e, 0x20, 0x07, 0x31, 0x8e, + 0x39, 0x07, 0x31, 0x86, 0x5b, 0x29, 0x53, 0x86, + 0x56, 0x34, 0x45, 0x77, 0x87, 0x32, 0x54, 0x68, + 0x76, 0x54, 0x65, 0x5c, 0x87, 0x32, 0x54, 0x53, + 0x82, 0x1c, 0x1c, 0x46, 0x93, 0x00, 0x00, 0x3a, + 0x82, 0x1c, 0x1c, 0x2e, 0xb0, 0x4a, 0x4a, 0x28, + 0xd2, 0x39, 0x39, 0x1b, 0xd2, 0x39, 0x39, 0x12, + 0xe8, 0x4f, 0x4f, 0x0e, 0xe8, 0x71, 0x71, 0x0b, + 0x74, 0x84, 0xa5, 0x08, 0x4e, 0x5e, 0x7f, 0x0b, + 0x53, 0x63, 0x95, 0x11, 0x2d, 0x3d, 0x6f, 0x17, + 0x29, 0x32, 0x6b, 0x22, 0x1d, 0x26, 0x5f, 0x28, + 0x29, 0x32, 0x6b, 0x34, 0x13, 0x1c, 0x55, 0x40, + 0x2a, 0x4b, 0x5b, 0x51, 0x0d, 0x2e, 0x3e, 0x5d, + 0x00, 0x14, 0x24, 0x69, 0x00, 0x00, 0x07, 0x75, + 0x05, 0x15, 0x2e, 0x86, 0x00, 0x0b, 0x24, 0x8f, + 0x13, 0x0b, 0x1c, 0x98, 0x13, 0x0b, 0x1c, 0xa1, + 0x20, 0x07, 0x31, 0xa2, 0x2c, 0x13, 0x3d, 0xa2, + 0x39, 0x07, 0x31, 0x9a, 0x4f, 0x1d, 0x47, 0x8e, + 0x87, 0x32, 0x54, 0x83, 0x87, 0x32, 0x54, 0x77, + 0x87, 0x32, 0x54, 0x68, 0x87, 0x32, 0x54, 0x5c, + 0xb0, 0x4a, 0x4a, 0x50, 0xc1, 0x17, 0x17, 0x40, + 0xc1, 0x17, 0x17, 0x34, 0xc1, 0x17, 0x17, 0x28, + 0xd2, 0x5b, 0x5b, 0x1e, 0xd2, 0x39, 0x39, 0x17, + 0xe8, 0x4f, 0x4f, 0x12, 0xe8, 0x71, 0x71, 0x0b, + 0x88, 0x98, 0xb9, 0x08, 0x62, 0x72, 0x93, 0x0e, + 0x2d, 0x3d, 0x6f, 0x14, 0x2d, 0x3d, 0x6f, 0x19, + 0x1d, 0x26, 0x5f, 0x22, 0x13, 0x1c, 0x55, 0x2e, + 0x07, 0x10, 0x49, 0x3a, 0x1d, 0x26, 0x5f, 0x4a, + 0x00, 0x14, 0x24, 0x51, 0x2a, 0x4b, 0x5b, 0x69, + 0x00, 0x14, 0x24, 0x75, 0x00, 0x00, 0x07, 0x89, + 0x00, 0x00, 0x18, 0x98, 0x05, 0x15, 0x2e, 0xa1, + 0x29, 0x21, 0x32, 0xb0, 0x1d, 0x15, 0x26, 0xb0, + 0x42, 0x29, 0x53, 0xba, 0x36, 0x1d, 0x47, 0xb2, + 0x5b, 0x29, 0x53, 0xb2, 0x4f, 0x1d, 0x47, 0xa2, + 0x87, 0x32, 0x54, 0x95, 0x87, 0x32, 0x54, 0x83, + 0x87, 0x32, 0x54, 0x77, 0x87, 0x32, 0x54, 0x68, + 0xc1, 0x17, 0x17, 0x50, 0xc1, 0x17, 0x17, 0x46, + 0xc1, 0x17, 0x17, 0x3a, 0xc1, 0x17, 0x17, 0x2e, + 0xd2, 0x39, 0x39, 0x21, 0xd2, 0x39, 0x39, 0x1b, + 0xe8, 0x4f, 0x4f, 0x12, 0xe8, 0x71, 0x71, 0x0e, + 0x7c, 0x9e, 0xaf, 0x0a, 0x66, 0x88, 0x99, 0x0d, + 0x51, 0x62, 0x73, 0x12, 0x1a, 0x2b, 0x3c, 0x1c, + 0x21, 0x21, 0x3a, 0x28, 0x0f, 0x0f, 0x28, 0x30, + 0x0d, 0x0d, 0x4f, 0x3a, 0x00, 0x00, 0x35, 0x4e, + 0x00, 0x00, 0x20, 0x57, 0x05, 0x05, 0x36, 0x6b, + 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x8f, + 0x10, 0x18, 0x31, 0xa0, 0x10, 0x18, 0x31, 0xaf, + 0x34, 0x24, 0x55, 0xc1, 0x3e, 0x2e, 0x5f, 0xca, + 0x46, 0x14, 0x46, 0xca, 0x6c, 0x3a, 0x6c, 0xca, + 0x6a, 0x20, 0x41, 0xc1, 0x8c, 0x42, 0x63, 0xb2, + 0x99, 0x33, 0x44, 0xa5, 0x99, 0x33, 0x44, 0x8d, + 0x99, 0x33, 0x44, 0x81, 0xbb, 0x11, 0x22, 0x6d, + 0xc3, 0x06, 0x04, 0x60, 0xcd, 0x0b, 0x0b, 0x4e, + 0xd7, 0x0f, 0x12, 0x3f, 0xe1, 0x14, 0x19, 0x33, + 0xe7, 0x26, 0x28, 0x23, 0xe7, 0x3f, 0x44, 0x1d, + 0xe7, 0x59, 0x5f, 0x14, 0xe7, 0x72, 0x7b, 0x0f, + 0x7c, 0x9e, 0xaf, 0x0a, 0x72, 0x94, 0xa5, 0x10, + 0x6e, 0x7f, 0x90, 0x17, 0x1a, 0x2b, 0x3c, 0x1f, + 0x0f, 0x0f, 0x28, 0x28, 0x00, 0x00, 0x14, 0x34, + 0x00, 0x00, 0x35, 0x44, 0x00, 0x00, 0x35, 0x4e, + 0x00, 0x00, 0x20, 0x63, 0x00, 0x00, 0x20, 0x77, + 0x09, 0x11, 0x32, 0x83, 0x09, 0x11, 0x32, 0x97, + 0x26, 0x2e, 0x47, 0xaf, 0x26, 0x2e, 0x47, 0xc1, + 0x28, 0x18, 0x49, 0xca, 0x4a, 0x3a, 0x6b, 0xdc, + 0x5a, 0x28, 0x5a, 0xdc, 0x46, 0x14, 0x46, 0xdc, + 0x8c, 0x42, 0x63, 0xd3, 0x80, 0x36, 0x57, 0xc1, + 0x99, 0x33, 0x44, 0xad, 0xa4, 0x3e, 0x4f, 0x99, + 0x8e, 0x28, 0x39, 0x81, 0xbb, 0x11, 0x22, 0x79, + 0xc7, 0x05, 0x03, 0x60, 0xd1, 0x09, 0x0a, 0x4e, + 0xdb, 0x0e, 0x11, 0x45, 0xe5, 0x12, 0x18, 0x33, + 0xe9, 0x25, 0x26, 0x28, 0xe9, 0x3e, 0x42, 0x1d, + 0xe9, 0x58, 0x5d, 0x17, 0xe9, 0x71, 0x79, 0x0f, + 0x88, 0xaa, 0xbb, 0x0a, 0x66, 0x88, 0x99, 0x10, + 0x6e, 0x7f, 0x90, 0x17, 0x37, 0x48, 0x59, 0x1f, + 0x0f, 0x0f, 0x28, 0x28, 0x00, 0x00, 0x14, 0x34, + 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x18, 0x56, + 0x05, 0x05, 0x36, 0x63, 0x00, 0x00, 0x20, 0x77, + 0x00, 0x00, 0x0c, 0x8f, 0x09, 0x11, 0x32, 0xa3, + 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca, + 0x3e, 0x2e, 0x5f, 0xdc, 0x4a, 0x3a, 0x6b, 0xeb, + 0x6c, 0x3a, 0x6c, 0xee, 0x6c, 0x3a, 0x6c, 0xe5, + 0x76, 0x2c, 0x4d, 0xdc, 0x8c, 0x42, 0x63, 0xca, + 0x99, 0x33, 0x44, 0xb9, 0x99, 0x33, 0x44, 0xa5, + 0xa4, 0x3e, 0x4f, 0x8d, 0xbb, 0x11, 0x22, 0x79, + 0xcb, 0x03, 0x02, 0x66, 0xd5, 0x08, 0x09, 0x54, + 0xdf, 0x0c, 0x10, 0x45, 0xe9, 0x11, 0x17, 0x33, + 0xeb, 0x24, 0x24, 0x28, 0xeb, 0x3d, 0x40, 0x20, + 0xeb, 0x57, 0x5b, 0x17, 0xeb, 0x70, 0x77, 0x0f, + 0x88, 0xaa, 0xbb, 0x0a, 0x72, 0x94, 0xa5, 0x10, + 0x6e, 0x7f, 0x90, 0x17, 0x6e, 0x7f, 0x90, 0x1f, + 0x35, 0x35, 0x4e, 0x28, 0x00, 0x00, 0x14, 0x34, + 0x00, 0x00, 0x18, 0x44, 0x00, 0x00, 0x35, 0x56, + 0x11, 0x11, 0x42, 0x63, 0x05, 0x05, 0x36, 0x77, + 0x00, 0x00, 0x0c, 0x8f, 0x09, 0x11, 0x32, 0xa3, + 0x26, 0x2e, 0x47, 0xb8, 0x32, 0x3a, 0x53, 0xca, + 0x4a, 0x3a, 0x6b, 0xdc, 0x4a, 0x3a, 0x6b, 0xeb, + 0x6c, 0x3a, 0x6c, 0xfd, 0x80, 0x4e, 0x80, 0xee, + 0x8c, 0x42, 0x63, 0xdc, 0x80, 0x36, 0x57, 0xca, + 0xa4, 0x3e, 0x4f, 0xb9, 0xa4, 0x3e, 0x4f, 0xa5, + 0x99, 0x33, 0x44, 0x8d, 0xbb, 0x11, 0x22, 0x79, + 0xcf, 0x02, 0x01, 0x66, 0xd9, 0x06, 0x08, 0x54, + 0xe3, 0x0b, 0x0f, 0x45, 0xed, 0x0f, 0x16, 0x33, + 0xed, 0x23, 0x22, 0x28, 0xed, 0x3c, 0x3e, 0x20, + 0xed, 0x56, 0x59, 0x17, 0xed, 0x6f, 0x75, 0x0f, + 0x7c, 0x95, 0xae, 0x0a, 0x7c, 0x95, 0xae, 0x10, + 0x5f, 0x78, 0x91, 0x17, 0x5f, 0x78, 0x91, 0x1f, + 0x5d, 0x6e, 0x90, 0x29, 0x26, 0x37, 0x59, 0x37, + 0x00, 0x00, 0x09, 0x41, 0x04, 0x00, 0x26, 0x55, + 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74, + 0x13, 0x13, 0x46, 0x8c, 0x33, 0x00, 0x11, 0x9e, + 0x3e, 0x1c, 0x3e, 0xb1, 0x55, 0x33, 0x55, 0xca, + 0x6c, 0x4a, 0x6c, 0xde, 0x6c, 0x4a, 0x6c, 0xe8, + 0x6a, 0x41, 0x52, 0xeb, 0x80, 0x57, 0x68, 0xeb, + 0x8c, 0x63, 0x74, 0xdc, 0x80, 0x57, 0x68, 0xca, + 0x9f, 0x17, 0x17, 0xb5, 0xb5, 0x2d, 0x2d, 0xa1, + 0xb5, 0x2d, 0x2d, 0x89, 0xd2, 0x06, 0x06, 0x75, + 0xd6, 0x00, 0x00, 0x62, 0xe2, 0x00, 0x03, 0x56, + 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36, + 0xe7, 0x1e, 0x20, 0x27, 0xea, 0x3f, 0x3e, 0x1f, + 0xed, 0x60, 0x5b, 0x16, 0xf0, 0x80, 0x79, 0x0e, + 0x7c, 0x95, 0xae, 0x0a, 0x5f, 0x78, 0x91, 0x10, + 0x5f, 0x78, 0x91, 0x17, 0x45, 0x5e, 0x77, 0x1f, + 0x40, 0x51, 0x73, 0x29, 0x26, 0x37, 0x59, 0x37, + 0x1e, 0x0d, 0x40, 0x41, 0x00, 0x00, 0x09, 0x4f, + 0x13, 0x13, 0x46, 0x65, 0x13, 0x13, 0x46, 0x74, + 0x33, 0x33, 0x66, 0x83, 0x13, 0x13, 0x46, 0x9e, + 0x3e, 0x1c, 0x3e, 0xb1, 0x55, 0x33, 0x55, 0xc0, + 0x55, 0x33, 0x55, 0xca, 0x6c, 0x4a, 0x6c, 0xde, + 0x76, 0x4d, 0x5e, 0xdc, 0x6a, 0x41, 0x52, 0xdc, + 0x80, 0x57, 0x68, 0xd3, 0x8c, 0x63, 0x74, 0xc1, + 0xb5, 0x2d, 0x2d, 0xa9, 0x9f, 0x17, 0x17, 0x95, + 0xd2, 0x06, 0x06, 0x89, 0xd2, 0x06, 0x06, 0x75, + 0xd6, 0x00, 0x00, 0x62, 0xec, 0x05, 0x0d, 0x4e, + 0xe9, 0x0a, 0x12, 0x44, 0xef, 0x10, 0x18, 0x36, + 0xe8, 0x1e, 0x1f, 0x27, 0xeb, 0x3e, 0x3d, 0x1f, + 0xee, 0x5f, 0x5a, 0x16, 0xf1, 0x80, 0x78, 0x0e, + 0x6f, 0x67, 0x88, 0x0a, 0x5b, 0x53, 0x74, 0x0d, + 0x49, 0x41, 0x62, 0x12, 0x35, 0x2d, 0x4e, 0x1c, + 0x26, 0x37, 0x59, 0x23, 0x26, 0x37, 0x59, 0x2f, + 0x3b, 0x2a, 0x5d, 0x41, 0x04, 0x00, 0x26, 0x4f, + 0x33, 0x00, 0x11, 0x59, 0x33, 0x33, 0x66, 0x6b, + 0x33, 0x33, 0x66, 0x83, 0x33, 0x33, 0x66, 0x92, + 0x55, 0x33, 0x55, 0xa7, 0x55, 0x33, 0x55, 0xb1, + 0x77, 0x33, 0x55, 0xc0, 0x77, 0x33, 0x55, 0xca, + 0x8f, 0x34, 0x55, 0xca, 0x8f, 0x34, 0x55, 0xca, + 0x8f, 0x34, 0x55, 0xc1, 0xa5, 0x4a, 0x6b, 0xaf, + 0xb5, 0x2d, 0x2d, 0xa1, 0xb5, 0x2d, 0x2d, 0x95, + 0xd2, 0x06, 0x06, 0x7d, 0xd2, 0x06, 0x06, 0x69, + 0xe2, 0x00, 0x03, 0x5c, 0xec, 0x05, 0x0d, 0x4e, + 0xe5, 0x06, 0x0e, 0x3c, 0xef, 0x10, 0x18, 0x30, + 0xe9, 0x1d, 0x1e, 0x27, 0xec, 0x3e, 0x3c, 0x1c, + 0xef, 0x5f, 0x59, 0x13, 0xf2, 0x7f, 0x77, 0x0e, + 0x6f, 0x67, 0x88, 0x0a, 0x5b, 0x53, 0x74, 0x0d, + 0x49, 0x41, 0x62, 0x12, 0x35, 0x2d, 0x4e, 0x19, + 0x09, 0x1a, 0x3c, 0x23, 0x26, 0x37, 0x59, 0x2f, + 0x3b, 0x2a, 0x5d, 0x37, 0x1e, 0x0d, 0x40, 0x49, + 0x33, 0x00, 0x11, 0x59, 0x33, 0x00, 0x11, 0x65, + 0x33, 0x33, 0x66, 0x74, 0x53, 0x53, 0x86, 0x83, + 0x55, 0x33, 0x55, 0x93, 0x6c, 0x4a, 0x6c, 0xa7, + 0x77, 0x33, 0x55, 0xb1, 0x77, 0x33, 0x55, 0xb1, + 0x83, 0x28, 0x49, 0xb8, 0x99, 0x3e, 0x5f, 0xb8, + 0x99, 0x3e, 0x5f, 0xaf, 0x8f, 0x34, 0x55, 0xa0, + 0xb5, 0x2d, 0x2d, 0x95, 0xb5, 0x2d, 0x2d, 0x89, + 0xd2, 0x06, 0x06, 0x75, 0xd2, 0x06, 0x06, 0x69, + 0xe2, 0x00, 0x03, 0x56, 0xec, 0x05, 0x0d, 0x44, + 0xe5, 0x06, 0x0e, 0x3c, 0xe9, 0x0a, 0x12, 0x30, + 0xea, 0x1d, 0x1d, 0x22, 0xed, 0x3d, 0x3b, 0x19, + 0xf0, 0x5e, 0x58, 0x13, 0xf3, 0x7f, 0x76, 0x0e, + 0x7c, 0x74, 0x95, 0x08, 0x56, 0x4e, 0x6f, 0x0b, + 0x62, 0x49, 0x7b, 0x11, 0x4e, 0x35, 0x67, 0x16, + 0x44, 0x33, 0x66, 0x21, 0x34, 0x23, 0x56, 0x29, + 0x44, 0x33, 0x66, 0x33, 0x44, 0x33, 0x66, 0x41, + 0x56, 0x23, 0x56, 0x51, 0x67, 0x00, 0x01, 0x5d, + 0x56, 0x23, 0x56, 0x69, 0x76, 0x43, 0x76, 0x75, + 0x8d, 0x4b, 0x6c, 0x83, 0x67, 0x25, 0x46, 0x92, + 0x8d, 0x4b, 0x6c, 0x9e, 0x7b, 0x39, 0x5a, 0x9e, + 0x9f, 0x28, 0x39, 0xa2, 0x9f, 0x28, 0x39, 0xa2, + 0x9f, 0x28, 0x39, 0x99, 0xb5, 0x0b, 0x0b, 0x90, + 0xc1, 0x00, 0x00, 0x87, 0xe7, 0x11, 0x11, 0x7b, + 0xdf, 0x00, 0x00, 0x67, 0xe9, 0x02, 0x0a, 0x5b, + 0xeb, 0x00, 0x04, 0x4f, 0xec, 0x05, 0x0a, 0x3f, + 0xed, 0x0a, 0x10, 0x33, 0xee, 0x0f, 0x16, 0x27, + 0xeb, 0x1c, 0x1c, 0x1e, 0xec, 0x3c, 0x3b, 0x17, + 0xed, 0x5c, 0x59, 0x12, 0xee, 0x7b, 0x78, 0x0b, + 0x90, 0x88, 0xa9, 0x05, 0x56, 0x4e, 0x6f, 0x0b, + 0x4e, 0x35, 0x67, 0x0e, 0x4e, 0x35, 0x67, 0x14, + 0x44, 0x33, 0x66, 0x1b, 0x34, 0x23, 0x56, 0x21, + 0x34, 0x23, 0x56, 0x29, 0x54, 0x43, 0x76, 0x3b, + 0x76, 0x43, 0x76, 0x45, 0x87, 0x10, 0x21, 0x51, + 0x87, 0x10, 0x21, 0x5d, 0x76, 0x43, 0x76, 0x69, + 0x8d, 0x4b, 0x6c, 0x74, 0x8d, 0x4b, 0x6c, 0x83, + 0x7b, 0x39, 0x5a, 0x8c, 0x8d, 0x4b, 0x6c, 0x8c, + 0x9f, 0x28, 0x39, 0x90, 0x9f, 0x28, 0x39, 0x8a, + 0xb5, 0x0b, 0x0b, 0x8a, 0xb5, 0x0b, 0x0b, 0x7b, + 0xc1, 0x00, 0x00, 0x73, 0xd5, 0x00, 0x00, 0x67, + 0xe5, 0x00, 0x06, 0x5b, 0xe5, 0x00, 0x06, 0x4f, + 0xe9, 0x01, 0x05, 0x45, 0xea, 0x06, 0x0b, 0x39, + 0xeb, 0x0b, 0x11, 0x2d, 0xec, 0x10, 0x17, 0x27, + 0xeb, 0x1c, 0x1c, 0x1b, 0xec, 0x3b, 0x3b, 0x12, + 0xed, 0x5b, 0x59, 0x0e, 0xee, 0x7b, 0x78, 0x0b, + 0x90, 0x88, 0xa9, 0x05, 0x6a, 0x62, 0x83, 0x08, + 0x4e, 0x35, 0x67, 0x0b, 0x62, 0x49, 0x7b, 0x11, + 0x54, 0x43, 0x76, 0x15, 0x54, 0x43, 0x76, 0x21, + 0x66, 0x11, 0x55, 0x29, 0x54, 0x43, 0x76, 0x33, + 0x76, 0x43, 0x76, 0x39, 0x76, 0x43, 0x76, 0x45, + 0x87, 0x10, 0x21, 0x51, 0x87, 0x10, 0x21, 0x5d, + 0xad, 0x32, 0x53, 0x65, 0xad, 0x32, 0x53, 0x6b, + 0x97, 0x1c, 0x3d, 0x74, 0xa1, 0x26, 0x47, 0x74, + 0x9f, 0x28, 0x39, 0x7b, 0x9f, 0x28, 0x39, 0x75, + 0xc1, 0x17, 0x17, 0x75, 0xb5, 0x0b, 0x0b, 0x6c, + 0xd5, 0x00, 0x00, 0x67, 0xd5, 0x00, 0x00, 0x5b, + 0xe5, 0x00, 0x06, 0x4f, 0xe5, 0x00, 0x06, 0x47, + 0xe7, 0x01, 0x06, 0x39, 0xe8, 0x06, 0x0c, 0x33, + 0xe9, 0x0b, 0x12, 0x27, 0xea, 0x10, 0x18, 0x1d, + 0xeb, 0x1b, 0x1c, 0x17, 0xec, 0x3b, 0x3b, 0x12, + 0xed, 0x5b, 0x59, 0x0b, 0xee, 0x7a, 0x78, 0x08, + 0x90, 0x88, 0xa9, 0x05, 0x7c, 0x74, 0x95, 0x08, + 0x62, 0x49, 0x7b, 0x0b, 0x62, 0x49, 0x7b, 0x0e, + 0x54, 0x43, 0x76, 0x15, 0x54, 0x43, 0x76, 0x1b, + 0x66, 0x11, 0x55, 0x21, 0x66, 0x11, 0x55, 0x29, + 0x76, 0x43, 0x76, 0x31, 0x76, 0x43, 0x76, 0x39, + 0x87, 0x10, 0x21, 0x45, 0x87, 0x10, 0x21, 0x51, + 0x8b, 0x10, 0x31, 0x59, 0xa1, 0x26, 0x47, 0x59, + 0xa1, 0x26, 0x47, 0x65, 0x8b, 0x10, 0x31, 0x65, + 0xb5, 0x0b, 0x0b, 0x63, 0xc1, 0x17, 0x17, 0x63, + 0xc1, 0x17, 0x17, 0x63, 0xc1, 0x17, 0x17, 0x63, + 0xd5, 0x00, 0x00, 0x5b, 0xd5, 0x00, 0x00, 0x4f, + 0xdf, 0x00, 0x00, 0x47, 0xdf, 0x00, 0x00, 0x3b, + 0xe5, 0x02, 0x07, 0x33, 0xe6, 0x07, 0x0d, 0x27, + 0xe7, 0x0c, 0x13, 0x1d, 0xe8, 0x11, 0x19, 0x1d, + 0xeb, 0x1b, 0x1c, 0x12, 0xec, 0x3a, 0x3b, 0x0e, + 0xed, 0x5a, 0x59, 0x0b, 0xee, 0x7a, 0x78, 0x08, + 0x9e, 0x86, 0xa7, 0x02, 0x9a, 0x82, 0xa3, 0x05, + 0x8f, 0x56, 0x7f, 0x08, 0x72, 0x39, 0x62, 0x0b, + 0x71, 0x3c, 0x75, 0x11, 0x75, 0x31, 0x68, 0x16, + 0x7a, 0x26, 0x5b, 0x1a, 0x7e, 0x1b, 0x4e, 0x20, + 0x82, 0x1c, 0x4f, 0x29, 0x8e, 0x28, 0x5b, 0x33, + 0x8e, 0x28, 0x5b, 0x3b, 0xa4, 0x1c, 0x1c, 0x41, + 0xb3, 0x0e, 0x0e, 0x45, 0xad, 0x08, 0x08, 0x4b, + 0xbd, 0x18, 0x18, 0x54, 0xb7, 0x12, 0x12, 0x54, + 0xbd, 0x00, 0x00, 0x55, 0xc9, 0x03, 0x0b, 0x55, + 0xd6, 0x00, 0x08, 0x4f, 0xd6, 0x00, 0x08, 0x4f, + 0xdb, 0x00, 0x08, 0x48, 0xdd, 0x01, 0x07, 0x3e, + 0xdf, 0x02, 0x06, 0x38, 0xe1, 0x03, 0x05, 0x32, + 0xe3, 0x00, 0x00, 0x27, 0xe5, 0x07, 0x0a, 0x21, + 0xe7, 0x0e, 0x14, 0x1b, 0xe9, 0x15, 0x1e, 0x15, + 0xeb, 0x26, 0x24, 0x0f, 0xed, 0x46, 0x42, 0x0c, + 0xef, 0x66, 0x5f, 0x09, 0xf1, 0x85, 0x7d, 0x06, + 0x9a, 0x82, 0xa3, 0x02, 0xa4, 0x8c, 0xad, 0x05, + 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08, + 0x83, 0x3f, 0x6a, 0x0d, 0x88, 0x34, 0x5d, 0x11, + 0x8c, 0x29, 0x50, 0x16, 0x90, 0x1e, 0x43, 0x1a, + 0xa4, 0x1c, 0x1c, 0x21, 0xa4, 0x1c, 0x1c, 0x29, + 0xb0, 0x28, 0x28, 0x29, 0xa4, 0x1c, 0x1c, 0x33, + 0xad, 0x08, 0x08, 0x3c, 0xbd, 0x18, 0x18, 0x3c, + 0xbd, 0x18, 0x18, 0x45, 0xb3, 0x0e, 0x0e, 0x45, + 0xc9, 0x03, 0x0b, 0x41, 0xc9, 0x03, 0x0b, 0x41, + 0xd6, 0x00, 0x08, 0x41, 0xdc, 0x06, 0x0e, 0x41, + 0xdc, 0x05, 0x0c, 0x38, 0xde, 0x06, 0x0b, 0x32, + 0xe0, 0x07, 0x0a, 0x2c, 0xe2, 0x08, 0x09, 0x26, + 0xe2, 0x04, 0x03, 0x21, 0xe4, 0x0b, 0x0d, 0x1b, + 0xe6, 0x12, 0x17, 0x15, 0xe8, 0x19, 0x21, 0x11, + 0xe9, 0x31, 0x2b, 0x0c, 0xeb, 0x51, 0x49, 0x09, + 0xed, 0x71, 0x66, 0x06, 0xef, 0x90, 0x84, 0x03, + 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02, + 0xa9, 0x70, 0x99, 0x05, 0x8f, 0x56, 0x7f, 0x08, + 0x96, 0x41, 0x5f, 0x0a, 0x9a, 0x36, 0x52, 0x0d, + 0x9e, 0x2b, 0x45, 0x11, 0xa2, 0x20, 0x38, 0x16, + 0xa4, 0x1c, 0x1c, 0x1b, 0xa4, 0x1c, 0x1c, 0x21, + 0xb0, 0x28, 0x28, 0x21, 0xb0, 0x28, 0x28, 0x29, + 0xcc, 0x0e, 0x0e, 0x2a, 0xcc, 0x0e, 0x0e, 0x33, + 0xcc, 0x0e, 0x0e, 0x33, 0xd0, 0x12, 0x12, 0x33, + 0xd3, 0x0d, 0x15, 0x37, 0xd3, 0x0d, 0x15, 0x37, + 0xe6, 0x10, 0x18, 0x37, 0xdc, 0x06, 0x0e, 0x2f, + 0xdd, 0x09, 0x10, 0x2c, 0xdf, 0x0a, 0x0f, 0x2c, + 0xe1, 0x0b, 0x0e, 0x26, 0xe3, 0x0c, 0x0d, 0x20, + 0xe1, 0x08, 0x06, 0x1b, 0xe3, 0x0f, 0x10, 0x15, + 0xe5, 0x16, 0x1a, 0x11, 0xe7, 0x1d, 0x24, 0x0b, + 0xe7, 0x3c, 0x33, 0x09, 0xe9, 0x5c, 0x50, 0x06, + 0xeb, 0x7c, 0x6e, 0x03, 0xed, 0x9b, 0x8b, 0x03, + 0xa4, 0x8c, 0xad, 0x02, 0x94, 0x7c, 0x9d, 0x02, + 0xa9, 0x70, 0x99, 0x02, 0x8f, 0x56, 0x7f, 0x05, + 0xa8, 0x44, 0x54, 0x07, 0xac, 0x39, 0x47, 0x0a, + 0xb0, 0x2e, 0x3a, 0x0d, 0xb5, 0x23, 0x2d, 0x11, + 0xa4, 0x1c, 0x1c, 0x15, 0xb0, 0x28, 0x28, 0x15, + 0xb0, 0x28, 0x28, 0x1b, 0xb0, 0x28, 0x28, 0x21, + 0xd6, 0x18, 0x18, 0x24, 0xd0, 0x12, 0x12, 0x24, + 0xd6, 0x18, 0x18, 0x2a, 0xd6, 0x18, 0x18, 0x2a, + 0xdf, 0x19, 0x21, 0x29, 0xdf, 0x19, 0x21, 0x29, + 0xe6, 0x10, 0x18, 0x29, 0xe6, 0x10, 0x18, 0x23, + 0xde, 0x0e, 0x14, 0x26, 0xe0, 0x0f, 0x13, 0x20, + 0xe2, 0x10, 0x12, 0x20, 0xe4, 0x11, 0x11, 0x16, + 0xe0, 0x0c, 0x09, 0x15, 0xe2, 0x13, 0x13, 0x11, + 0xe4, 0x1a, 0x1d, 0x0b, 0xe6, 0x21, 0x27, 0x0b, + 0xe5, 0x47, 0x3a, 0x06, 0xe7, 0x67, 0x57, 0x06, + 0xe9, 0x87, 0x75, 0x03, 0xeb, 0xa6, 0x92, 0x03, + 0xd5, 0x8b, 0x83, 0x01, 0xc1, 0x77, 0x6f, 0x01, + 0xb9, 0x56, 0x56, 0x02, 0xb9, 0x56, 0x56, 0x03, + 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08, + 0xb9, 0x35, 0x35, 0x08, 0xb9, 0x35, 0x35, 0x0c, + 0xcb, 0x2e, 0x2c, 0x0e, 0xcb, 0x2c, 0x2c, 0x11, + 0xcb, 0x2a, 0x2c, 0x14, 0xcb, 0x28, 0x2c, 0x16, + 0xd7, 0x20, 0x24, 0x18, 0xda, 0x20, 0x23, 0x1d, + 0xdd, 0x1f, 0x22, 0x1d, 0xe0, 0x1f, 0x21, 0x1d, + 0xe7, 0x22, 0x24, 0x1e, 0xe7, 0x20, 0x24, 0x1e, + 0xe7, 0x1d, 0x24, 0x1e, 0xe7, 0x1b, 0x24, 0x1b, + 0xe3, 0x1c, 0x20, 0x19, 0xe3, 0x1c, 0x20, 0x17, + 0xe3, 0x1c, 0x20, 0x14, 0xe3, 0x1c, 0x20, 0x11, + 0xdf, 0x1a, 0x20, 0x0f, 0xe0, 0x23, 0x25, 0x0c, + 0xe1, 0x2b, 0x2a, 0x09, 0xe2, 0x34, 0x2f, 0x06, + 0xe3, 0x54, 0x49, 0x05, 0xe4, 0x69, 0x5e, 0x03, + 0xe5, 0x7e, 0x74, 0x02, 0xe6, 0x92, 0x89, 0x01, + 0xe7, 0x9d, 0x95, 0x00, 0xd5, 0x8b, 0x83, 0x01, + 0xcd, 0x6a, 0x6a, 0x01, 0xb9, 0x56, 0x56, 0x02, + 0xcd, 0x49, 0x49, 0x02, 0xcd, 0x49, 0x49, 0x05, + 0xcd, 0x49, 0x49, 0x05, 0xcd, 0x49, 0x49, 0x08, + 0xd8, 0x46, 0x46, 0x0b, 0xd8, 0x44, 0x46, 0x0b, + 0xd8, 0x42, 0x46, 0x0e, 0xd8, 0x40, 0x46, 0x11, + 0xdd, 0x3c, 0x3f, 0x12, 0xe0, 0x3b, 0x3e, 0x15, + 0xe3, 0x3b, 0x3d, 0x15, 0xe6, 0x3a, 0x3c, 0x18, + 0xe9, 0x3d, 0x3c, 0x16, 0xe9, 0x3a, 0x3c, 0x16, + 0xe9, 0x38, 0x3c, 0x16, 0xe9, 0x35, 0x3c, 0x13, + 0xe7, 0x36, 0x3b, 0x11, 0xe7, 0x36, 0x3b, 0x11, + 0xe7, 0x36, 0x3b, 0x0e, 0xe7, 0x36, 0x3b, 0x0b, + 0xe3, 0x34, 0x3a, 0x09, 0xe4, 0x3d, 0x3f, 0x09, + 0xe5, 0x45, 0x44, 0x06, 0xe6, 0x4e, 0x49, 0x04, + 0xe6, 0x63, 0x59, 0x03, 0xe7, 0x78, 0x6f, 0x02, + 0xe8, 0x8d, 0x84, 0x01, 0xe9, 0xa2, 0x99, 0x01, + 0xfb, 0xb1, 0xa9, 0x00, 0xe7, 0x9d, 0x95, 0x00, + 0xdf, 0x7c, 0x7c, 0x01, 0xcd, 0x6a, 0x6a, 0x01, + 0xe2, 0x66, 0x66, 0x02, 0xe2, 0x66, 0x66, 0x02, + 0xe2, 0x66, 0x66, 0x05, 0xe2, 0x66, 0x66, 0x05, + 0xe5, 0x5f, 0x5f, 0x08, 0xe5, 0x5d, 0x5f, 0x08, + 0xe5, 0x5b, 0x5f, 0x0b, 0xe5, 0x59, 0x5f, 0x0b, + 0xe3, 0x58, 0x59, 0x0c, 0xe6, 0x57, 0x58, 0x0f, + 0xe9, 0x57, 0x57, 0x0f, 0xec, 0x56, 0x56, 0x0f, + 0xeb, 0x58, 0x53, 0x10, 0xeb, 0x55, 0x53, 0x10, + 0xeb, 0x53, 0x53, 0x10, 0xeb, 0x50, 0x53, 0x10, + 0xeb, 0x51, 0x55, 0x0e, 0xeb, 0x51, 0x55, 0x0b, + 0xeb, 0x51, 0x55, 0x0b, 0xeb, 0x51, 0x55, 0x08, + 0xe7, 0x4f, 0x53, 0x06, 0xe8, 0x57, 0x58, 0x06, + 0xe9, 0x60, 0x5d, 0x04, 0xea, 0x68, 0x62, 0x04, + 0xe9, 0x73, 0x6a, 0x02, 0xea, 0x87, 0x7f, 0x01, + 0xeb, 0x9c, 0x94, 0x01, 0xec, 0xb1, 0xa9, 0x00, + 0xfb, 0xb1, 0xa9, 0x00, 0xfb, 0xb1, 0xa9, 0x00, + 0xf3, 0x90, 0x90, 0x00, 0xf3, 0x90, 0x90, 0x01, + 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02, + 0xf8, 0x7c, 0x7c, 0x02, 0xf8, 0x7c, 0x7c, 0x02, + 0xf2, 0x77, 0x79, 0x05, 0xf2, 0x75, 0x79, 0x05, + 0xf2, 0x73, 0x79, 0x05, 0xf2, 0x71, 0x79, 0x08, + 0xe9, 0x73, 0x74, 0x09, 0xec, 0x73, 0x73, 0x09, + 0xef, 0x72, 0x72, 0x09, 0xf2, 0x72, 0x71, 0x09, + 0xed, 0x72, 0x6b, 0x0a, 0xed, 0x70, 0x6b, 0x0a, + 0xed, 0x6d, 0x6b, 0x0a, 0xed, 0x6b, 0x6b, 0x0a, + 0xef, 0x6b, 0x70, 0x08, 0xef, 0x6b, 0x70, 0x08, + 0xef, 0x6b, 0x70, 0x06, 0xef, 0x6b, 0x70, 0x06, + 0xeb, 0x69, 0x6d, 0x04, 0xec, 0x71, 0x72, 0x04, + 0xed, 0x7a, 0x77, 0x01, 0xee, 0x82, 0x7c, 0x01, + 0xec, 0x82, 0x7a, 0x01, 0xed, 0x97, 0x8f, 0x01, + 0xee, 0xab, 0xa4, 0x00, 0xef, 0xc0, 0xba, 0x00, + ]) +} + diff --git a/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py new file mode 100644 index 000000000..919ba2328 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/mochi-to-testcase.py @@ -0,0 +1,101 @@ +import sys +import os.path +import re + +assert len(sys.argv) == 2 +mochiPath = sys.argv[1] + +extDotPos = mochiPath.find('.html') +assert extDotPos != -1, 'mochitest target must be an html doc.' + +testPath = mochiPath[:extDotPos] + '.solo.html' + +def ReadLocalFile(include): + incPath = os.path.dirname(mochiPath) + filePath = os.path.join(incPath, include) + + data = None + try: + f = open(filePath, 'r') + data = f.read() + except: + pass + + try: + f.close() + except: + pass + + return data + +kSimpleTestReplacement = ''' + +<script> +// SimpleTest.js replacement + +function debug(text) { + var elem = document.getElementById('mochi-to-testcase-output'); + elem.innerHTML += '\\n<br/>\\n' + text; +} + +function ok(val, text) { + var status = val ? 'Test <font color=\\'green\\'>passed</font>: ' + : 'Test <font color=\\'red\\' >FAILED</font>: '; + debug(status + text); +} + +function todo(val, text) { + var status = val ? 'Test <font color=\\'orange\\'>UNEXPECTED PASS</font>: ' + : 'Test <font color=\\'blue\\' >todo</font>: '; + debug(status + text); +} + +SimpleTest = { + waitForExplicitFinish: function() {}, + finish: function() {}, + requestFlakyTimeout: function() {}, +}; +</script> +<div id='mochi-to-testcase-output'></div> + +''' + +fin = open(mochiPath, 'rb') +fout = open(testPath, 'wb') +includePattern = re.compile('<script\\s*src=[\'"](.*)\\.js[\'"]>\\s*</script>') +cssPattern = re.compile('<link\\s*rel=[\'"]stylesheet[\'"]\\s*href=[\'"]([^=>]*)[\'"]>') +for line in fin: + skipLine = False + for css in cssPattern.findall(line): + skipLine = True + print('Ignoring stylesheet: ' + css) + + for inc in includePattern.findall(line): + skipLine = True + if inc == '/MochiKit/MochiKit': + continue + + if inc == '/tests/SimpleTest/SimpleTest': + print('Injecting SimpleTest replacement') + fout.write(kSimpleTestReplacement); + continue + + incData = ReadLocalFile(inc + '.js') + if not incData: + print('Warning: Unknown JS file ignored: ' + inc + '.js') + continue + + print('Injecting include: ' + inc + '.js') + fout.write('\n<script>\n// Imported from: ' + inc + '.js\n'); + fout.write(incData); + fout.write('\n</script>\n'); + continue + + if skipLine: + continue + + fout.write(line) + continue + +fin.close() +fout.close() diff --git a/dom/canvas/test/webgl-mochitest/mochitest.ini b/dom/canvas/test/webgl-mochitest/mochitest.ini new file mode 100644 index 000000000..d5bc8701d --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/mochitest.ini @@ -0,0 +1,96 @@ +[DEFAULT] +subsuite = webgl + +support-files = + ensure-exts/ensure-ext.js + driver-info.js + es3-data.js + webgl-util.js + +[ensure-exts/test_ANGLE_instanced_arrays.html] +fail-if = (os == 'android') || (os == 'mac' && os_version == '10.6') +[ensure-exts/test_EXT_blend_minmax.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_color_buffer_half_float.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_disjoint_timer_query.html] +fail-if = (os == 'android') || (os == 'mac') || (os == 'win' && os_version == '5.1') +[ensure-exts/test_EXT_frag_depth.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_sRGB.html] +fail-if = (os == 'android') || (os == 'mac' && os_version == '10.6') || (os == 'win') +[ensure-exts/test_EXT_shader_texture_lod.html] +fail-if = (os == 'android') +[ensure-exts/test_EXT_texture_filter_anisotropic.html] +fail-if = (os == 'android') || (os == 'linux') +[ensure-exts/test_OES_standard_derivatives.html] +fail-if = (os == 'android') +[ensure-exts/test_WEBGL_color_buffer_float.html] +fail-if = (os == 'android') +[ensure-exts/test_WEBGL_compressed_texture_atc.html] +fail-if = (os == 'android') || (os == 'linux') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_es3.html] +fail-if = (os == 'android') || (os == 'linux') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_etc1.html] +fail-if = (os == 'linux') || (os == 'mac') || (os == 'win' && os_version == '5.1') +[ensure-exts/test_WEBGL_compressed_texture_pvrtc.html] +fail-if = (os == 'android') || (os == 'linux') || (os == 'mac') || (os == 'win') +[ensure-exts/test_WEBGL_compressed_texture_s3tc.html] +fail-if = (os == 'android') || (os == 'linux') +[ensure-exts/test_WEBGL_depth_texture.html] +fail-if = (os == 'mac' && os_version == '10.6') +[ensure-exts/test_WEBGL_draw_buffers.html] +fail-if = (os == 'android') || (os == 'win' && os_version == '5.1') + +[ensure-exts/test_common.html] + + +[regress/test_bug_1268096.html] + + +[test_backends.html] +[test_backbuffer_channels.html] +[test_depth_readpixels.html] +[test_canvas_size.html] +[test_capture.html] +support-files = ../captureStream_common.js +# Even though we use ../ here, in the test HTML, we need to omit this. Sub-CWD relative +# paths are fine, but they locate the file and dump it in the current directory. +[test_cubemap_must_be_square.html] +[test_depth_tex_lazy_clear.html] +[test_draw.html] +[test_fb_param.html] +[test_fb_param_crash.html] +[test_hidden_alpha.html] +[test_hidden_depth_stencil.html] +fail-if = (os == 'win' && os_version == '5.1') +[test_implicit_color_buffer_float.html] +[test_highp_fs.html] +[test_no_arr_points.html] +skip-if = android_version == '18' #Android 4.3 aws only; bug 1030942 +[test_noprog_draw.html] +[test_pixel_pack_buffer.html] +[test_privileged_exts.html] +[test_renderer_strings.html] +[test_sab_with_webgl.html] +[test_texsubimage_float.html] +[test_uninit_data.html] +[test_webgl_available.html] +#[test_webgl_color_buffer_float.html] +# We haven't cleaned up the Try results yet, but let's get this on the books first. +[test_webgl_conformance.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl_compressed_texture_es3.html] +[test_webgl_force_enable.html] +[test_webgl_request_context.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl_request_mismatch.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_not_exposed.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_invalidate_framebuffer.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_webgl2_alpha_luminance.html] +skip-if = toolkit == 'android' #bug 865443- seperate suite - the non_conf* tests pass except for one on armv6 tests +[test_fuzzing_bugs.html] +[test_webglcontextcreationerror.html] diff --git a/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html new file mode 100644 index 000000000..be66cc5f0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/regress/test_bug_1268096.html @@ -0,0 +1,140 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='../webgl-util.js'></script> + <script id='vs' type='x-shader/x-vertex'> + +attribute vec2 aPosition; + +void main(void) { + gl_PointSize = 16.0; + gl_Position = vec4(aPosition, 0, 1); +} + + </script> + <script id='fs' type='x-shader/x-fragment'> + +precision mediump float; + +uniform vec4 uColor; + +void main(void) { + gl_FragColor = uColor; +} + + </script> + </head> + <body> + <script> + +function GetPixel(gl, x, y) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + return pixel; +} + +function ColorStr(arr) { + return '{' + arr.map(function(x) { return '' + x; }).join(', ') + '}'; +} + +function PixelShouldBe(gl, x, y, ref, prefix) { + if (prefix) { + prefix += ': '; + } + + var test = GetPixel(gl, x, y); + + var testStr = ColorStr(test); + var refStr = ColorStr(ref.map(x => x * 255)); + ok(testStr == refStr, prefix + 'Should be ' + refStr + ', was ' + testStr + '.'); +} + +function GetProgram(gl) { + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + + prog.aPosition = gl.getAttribLocation(prog, 'aPosition'); + ok(prog.aPosition >= 0, '`aPosition` should be valid.'); + + prog.uColor = gl.getUniformLocation(prog, 'uColor'); + ok(prog.uColor, '`uColor` should be valid.'); + + return prog; +} + +// Give ourselves a scope to return early from: +(function () { + var c = document.createElement('canvas'); + document.body.appendChild(c); + var gl = c.getContext('webgl', { depth: false, antialias: false }); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + //////// + + // With default culling, it works fine. + // The problem seems to be that the virtual quads generated from points are wound 'backwards'. + gl.enable(gl.CULL_FACE); + gl.cullFace(gl.BACK); // Cull back faces. + + //////// + + var vertArr = new Float32Array([ + -1, -1, + +1, -1, + -1, +1, + ]); + + var vbo = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vbo); + gl.bufferData(gl.ARRAY_BUFFER, vertArr, gl.STATIC_DRAW); + + //////// + + var triProg = GetProgram(gl); + var pointProg = GetProgram(gl); + if (!triProg || !pointProg) { + ok(false, 'Program linking should succeed.'); + return; + } + + ok(triProg.aPosition == pointProg.aPosition, 'aPosition should match.'); + gl.enableVertexAttribArray(triProg.aPosition); + gl.vertexAttribPointer(triProg.aPosition, 2, gl.FLOAT, false, 0, 0); + + //////// + + gl.useProgram(triProg); + var triColor = [1, 0, 0, 1]; + gl.uniform4fv(triProg.uColor, triColor); + + gl.useProgram(pointProg); + var pointColor = [0, 1, 0, 1]; + gl.uniform4fv(pointProg.uColor, pointColor); + + //////// + + gl.clearColor(0, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT); + + gl.useProgram(triProg); + gl.drawArrays(gl.TRIANGLES, 0, 3); + + gl.useProgram(pointProg); + gl.drawArrays(gl.POINTS, 0, 3); + + //////// + + PixelShouldBe(gl, 32, 32, triColor, 'Tri'); + PixelShouldBe(gl, 0, 0, pointColor, 'Point'); + + ok(true, 'Test complete'); +})(); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html new file mode 100644 index 000000000..ef880f9c2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_backbuffer_channels.html @@ -0,0 +1,111 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958723</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<script> + +function TestAttribs(attribs) { + ok(true, 'Testing attribs: ' + JSON.stringify(attribs)); + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl', attribs); + ok(gl, 'No tested attribs should result in failure to create a context'); + if (!gl) + return; + + var actual = gl.getContextAttributes(); + + ok(actual.alpha == attribs.alpha, + 'Resulting `alpha` should match request.'); + ok(actual.premultipliedAlpha == attribs.premultipliedAlpha, + 'Resulting `premultipliedAlpha` should match request.'); + ok(actual.preserveDrawingBuffer == attribs.preserveDrawingBuffer, + 'Resulting `preserveDrawingBuffer` should match request.'); + + // "The depth, stencil and antialias attributes, when set to true, are + // requests, not requirements." + if (!attribs.antialias) { + ok(!actual.antialias, 'No `antialias` if not requested.'); + } + if (!attribs.depth) { + ok(!actual.depth, 'No `depth` if not requested.'); + } + if (!attribs.stencil) { + ok(!actual.stencil, 'No `stencil` if not requested.'); + } + + var hasAlpha = !!gl.getParameter(gl.ALPHA_BITS); + var hasDepth = !!gl.getParameter(gl.DEPTH_BITS); + var hasStencil = !!gl.getParameter(gl.STENCIL_BITS); + var hasAntialias = !!gl.getParameter(gl.SAMPLES); + + ok(hasAlpha == actual.alpha, 'Bits should match `alpha` attrib.'); + ok(hasAntialias == actual.antialias, 'Bits should match `antialias` attrib.'); + ok(hasDepth == actual.depth, 'Bits should match `depth` attrib.'); + ok(hasStencil == actual.stencil, 'Bits should match `stencil` attrib.'); +} + +function CloneAttribs(attribs) { + return { + alpha: attribs.alpha, + antialias: attribs.antialias, + depth: attribs.depth, + premultipliedAlpha: attribs.premultipliedAlpha, + preserveDrawingBuffer: attribs.preserveDrawingBuffer, + stencil: attribs.stencil, + }; +} + +function SplitForAttrib(list, attrib) { + var ret = []; + + for (var i in list) { + var cur = list[i]; + if (cur[attrib]) + throw 'Attrib is already true.'; + + var clone = CloneAttribs(cur); + clone[attrib] = true; + + ret.push(cur); + ret.push(clone); + } + + return ret; +} + +function GenAttribList() { + var base = { + alpha: false, + antialias: false, + depth: false, + premultipliedAlpha: false, + preserveDrawingBuffer: false, + stencil: false, + }; + var list = [base]; + list = SplitForAttrib(list, 'alpha'); + list = SplitForAttrib(list, 'antialias'); + list = SplitForAttrib(list, 'depth'); + list = SplitForAttrib(list, 'premultipliedAlpha'); + list = SplitForAttrib(list, 'preserveDrawingBuffer'); + list = SplitForAttrib(list, 'stencil'); + + if (list.length != 1<<6) + throw 'Attribs list length wrong: ' + list.length; + + return list; +} + +var list = GenAttribList(); +for (var i in list) { + var attribs = list[i]; + TestAttribs(attribs); +} + +ok(true, 'Test complete.'); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_backends.html b/dom/canvas/test/webgl-mochitest/test_backends.html new file mode 100644 index 000000000..50ba4cbd4 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_backends.html @@ -0,0 +1,169 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> + +function RunWithPrefs(prefPairList, func) { + var prefEnv = {'set': prefPairList}; + try { + SpecialPowers.pushPrefEnv(prefEnv, func); + } catch (e) { + console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList)); + func(); + } +} + +//////////////////////////////////////// + +var ANGLE_IS_SINGLETON = true; + +var expectD3DType; +try { + // code borrowed from browser/modules/test/browser_taskbar_preview.js + var version = SpecialPowers.Services.sysinfo.getProperty('version'); + version = parseFloat(version); + + // Version 6.0 is Vista, 6.1 is 7. + if (version <= 6.0) + expectD3DType = 'd3d9'; + else + expectD3DType = 'd3d11'; +} catch (e) { + expectD3DType = 'd3d11'; +} + +function GetRenderer() { + var c = document.createElement('canvas'); + var gl = c.getContext('experimental-webgl'); + if (!gl) + return undefined; + + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + if (!ext) + throw new Error('Requires WEBGL_debug_renderer_info.'); + + var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + return renderer; +} + +function GetRendererType() { + var renderer = GetRenderer(); + if (renderer === undefined) + return 'none'; + + if (renderer.includes('ANGLE')) { + if (renderer.includes('Microsoft Basic Render Driver')) // Also includes 'Direct3D11'. + return 'warp'; + if (renderer.includes('Direct3D11')) + return 'd3d11'; + if (renderer.includes('Direct3D9')) + return 'd3d9'; + + } else { + return 'gl'; + } + + throw new Error('Unrecognized renderer type for: ' + renderer); +} + +function TestActualType(testName, expectedType) { + var actualType = GetRendererType(); + ok(actualType == expectedType, + '[' + testName + '] Expected ' + expectedType + ', was ' + actualType); +} + +//////////////////////////////////////// + +function TestDefault() { + var expectedType = 'gl'; + var isWindows = (navigator.platform.indexOf('Win') == 0); + if (isWindows) { + expectedType = expectD3DType; + } + TestActualType('TestDefault', expectedType); + + if (isWindows && !ANGLE_IS_SINGLETON) { + var prefPairList = [ + ['webgl.angle.force-warp', true], + ]; + RunWithPrefs(prefPairList, TestWARP); + return; + } + + var prefPairList = [ + ['webgl.disabled', true], + ]; + RunWithPrefs(prefPairList, TestDisabled); + return; +} + + +function TestWARP() { + var expectedType = (expectD3DType == 'd3d11') ? 'warp' : 'none'; + TestActualType('TestWARP', expectedType); + + var prefPairList = [ + ['webgl.angle.force-warp', false], + ['webgl.angle.force-d3d11', true], + ]; + RunWithPrefs(prefPairList, TestD3D11); +} + + +function TestD3D11() { + var expectedType = (expectD3DType == 'd3d11') ? 'd3d11' : 'none'; + TestActualType('TestD3D11', expectedType); + + var prefPairList = [ + ['webgl.angle.force-d3d11', false], + ['webgl.angle.try-d3d11', false], + ]; + RunWithPrefs(prefPairList, TestD3D9); +} + + +function TestD3D9() { + TestActualType('TestD3D9', 'd3d9'); + + var prefPairList = [ + ['webgl.angle.try-d3d11', true], + ['webgl.disable-angle', true], + ]; + RunWithPrefs(prefPairList, TestWinGL); +} + + +function TestWinGL() { + TestActualType('TestWinGL', 'gl'); + + var prefPairList = [ + ['webgl.disabled', true], + ]; + RunWithPrefs(prefPairList, TestDisabled); +} + + +function TestDisabled() { + TestActualType('TestDisabled', 'none'); + + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +var prefPairList = [ + ['webgl.force-enabled', true], + ['webgl.enable-debug-renderer-info', true], +]; +RunWithPrefs(prefPairList, TestDefault); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_canvas_size.html b/dom/canvas/test/webgl-mochitest/test_canvas_size.html new file mode 100644 index 000000000..a9ea076a8 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_canvas_size.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<title>WebGL test: Framebuffer maximum size test. (Bug 1290333)</title> +<body> +<script> +function TestSize(contextName, testSize) { + var attributes = { + antialias: false, + }; + + var canvas = document.createElement('canvas'); + var gl = canvas.getContext(contextName, attributes); + + if (!gl) { + todo(false, contextName + 'is unavailable.'); + return; + } + gl.canvas.width = testSize; + gl.canvas.height = testSize; + + ok(true, contextName + 'test complete.'); +} + +function run() { + TestSize('webgl', 16384); + TestSize('webgl2', 16384); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +try { + var prefPairList = [ + ['webgl.force-enabled', true], + ]; + var prefEnv = {'set': prefPairList}; + SpecialPowers.pushPrefEnv(prefEnv, run); +} catch (e) { + warning('No SpecialPowers, but trying WebGL2 anyway...'); + run(); +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_capture.html b/dom/canvas/test/webgl-mochitest/test_capture.html new file mode 100644 index 000000000..1de9a2c0b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_capture.html @@ -0,0 +1,207 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: CaptureStream()</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="captureStream_common.js"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs" type="x-shader/x-vertex"> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; +uniform vec4 uColor; + +void main(void) { + gl_FragColor = uColor; +} + +</script> +<body> +<script> + +// Globals. Initialized during beginTest(). +var c; // Canvas element captured by streams. +var gl; // WebGLContext of |c|. +var h; // CaptureStreamTestHelper holding utility test functions. +var vauto; // Video element with captureStream stream in automatic mode. +var vmanual; // Video element with captureStream stream in manual (fps 0) mode. +var vrate; // Video element with captureStream stream with fixed frame rate. + +/* Fails the test if there was a GL error */ +function checkGLError(info) { + var error = gl.getError(); + // Comparing strings for sake of log output in hex format. + is("0x" + error.toString(16), "0x0", "WebGL error [" + info + "]"); +} + +function checkClearColorInitialRed() { + info("Checking that clearing to red works for first frame."); + + h.clearColor(c, h.red); + + vauto.srcObject = c.captureStream(); + vmanual.srcObject = c.captureStream(0); + vrate.srcObject = c.captureStream(10); + + ok(h.isPixel(h.getPixel(vauto), h.blackTransparent, 0, + "vauto should not be drawn to before stable state")); + ok(h.isPixel(h.getPixel(vrate), h.blackTransparent, 0, + "vrate should not be drawn to before stable state")); + ok(h.isPixel(h.getPixel(vmanual), h.blackTransparent, 0, + "vmanual should not be drawn to before stable state")); + + return Promise.resolve() + .then(() => h.waitForPixelColor(vauto, h.red, 0, + "should become red automatically")) + .then(() => h.waitForPixelColor(vrate, h.red, 0, + "should become red automatically")) + .then(() => h.waitForPixelColor(vmanual, h.red, 0, + "should become red when we get to stable " + + "state (first frame)")) +} + +function checkDrawColorGreen() { + info("Checking that drawing green results in green video frames."); + var drawing = h.startDrawing(h.drawColor.bind(h, c, h.green)); + checkGLError('after DrawColor'); + return Promise.resolve() + .then(() => h.waitForPixelColor(vauto, h.green, 0, + "should become green automatically")) + .then(() => h.waitForPixelColor(vrate, h.green, 0, + "should become green automatically")) + .then(() => h.waitForPixelColor(vmanual, h.red, 0, + "should still be red")) + .then(() => h.requestFrame(vmanual)) + .then(() => h.waitForPixelColor(vmanual, h.green, 0, + "should become green after requstFrame()")) + .then(() => drawing.stop()); +} + +function checkClearColorRed() { + info("Checking that clearing to red works."); + var drawing = h.startDrawing(h.clearColor.bind(h, c, h.red)); + return Promise.resolve() + .then(() => h.waitForPixelColor(vauto, h.red, 0, + "should become red automatically")) + .then(() => h.waitForPixelColor(vrate, h.red, 0, + "should become red automatically")) + .then(() => h.waitForPixelColor(vmanual, h.green, 0, + "should still be green")) + .then(() => h.requestFrame(vmanual)) + .then(() => h.waitForPixelColor(vmanual, h.red, 0, + "should become red after requestFrame()")) + .then(() => drawing.stop()); +} + +function checkRequestFrameOrderGuarantee() { + info("Checking that requestFrame() immediately after a draw " + + "call results in the expected frame seen in the stream."); + return Promise.resolve() + .then(() => h.waitForPixelColor(vmanual, h.red, 0, "should still be red")) + .then(() => h.drawColor(c, h.green)) // 1. Draw canvas green + .then(() => h.requestFrame(vmanual)) // 2. Immediately request a frame + .then(() => h.waitForPixelColor(vmanual, h.green, 0, + "should become green after call order test")) +} + +function checkEndedOnStop() { + let promises = [vauto, vmanual, vrate].map(elem => { + elem.srcObject.getTracks()[0].stop(); + return new Promise(resolve => + elem.addEventListener("ended", function endedListener(event) { + ok(true, "Element " + elem.id + " ended."); + resolve(); + elem.removeEventListener("ended", endedListener); + })); + }); + return Promise.all(promises); +} + + +function finish() { + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +function beginTest() { + h = new CaptureStreamTestHelperWebGL(); + + c = h.createAndAppendElement('canvas', 'c'); + vauto = h.createAndAppendElement('video', 'vauto'); + vmanual = h.createAndAppendElement('video', 'vmanual'); + vrate = h.createAndAppendElement('video', 'vrate'); + + gl = WebGLUtil.getWebGL('c', false); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + finish(); + return; + } + + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + WebGLUtil.setWarningFunc(errorFunc); + + gl.disable(gl.DEPTH_TEST); + + prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + // Setup vertex coordinates for drawing a rectangle across the whole canvas. + + prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord"); + ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.'); + + var vertCoordArr = new Float32Array([ + -1, -1, + 1, -1, + -1, 1, + 1, 1, + ]); + var vertCoordBuff = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff); + gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW); + + gl.useProgram(prog); + gl.enableVertexAttribArray(prog.aVertCoord); + gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0); + + // Setup the helper with a pointer to how to change fragment color. + + var uColorLocation = gl.getUniformLocation(prog, "uColor"); + h.setFragmentColorLocation(uColorLocation); + + checkGLError('after setup'); + + // Run tests. + + Promise.resolve() + .then(checkClearColorInitialRed) + .then(checkDrawColorGreen) + .then(checkClearColorRed) + .then(checkRequestFrameOrderGuarantee) + .then(checkEndedOnStop) + .then(finish); +} + +SimpleTest.waitForExplicitFinish(); + +beginTest(); +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html new file mode 100644 index 000000000..f2bc2914b --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_cubemap_must_be_square.html @@ -0,0 +1,35 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta http-equiv='content-type' content='text/html; charset=utf-8'/> + + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> + +<body> +<script> +'use strict'; + +(function() { + var c = document.createElement('canvas'); + var gl = c.getContext('webgl'); + + ok(!gl.getError(), 'No error before.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex); + gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGBA, 4, 3, 0, gl.RGBA, + gl.UNSIGNED_BYTE, null); + + var err = gl.getError(); + ok(err == gl.INVALID_VALUE, + 'Should be INVALID_VALUE (0x501) after, was 0x' + err.toString(16) + '.'); +})(); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html new file mode 100644 index 000000000..895e7c98f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_depth_readpixels.html @@ -0,0 +1,60 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check for error on ReadPixels from a depth-only FB.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> +"use strict"; + +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(gl, 'Get GL working here first.'); + return; + } + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 4, 4); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, + gl.RENDERBUFFER, rb); + + if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) { + todo(false, 'Depth-only FB incomplete. This is valid.'); + return; + } + + ok(!gl.getError(), 'Should have no errors after constructing FB.'); + + var pixels = new Uint8Array([1, 2, 3, 4]); + gl.readPixels(0, 0, // x,y + 1, 1, // w,h + gl.RGBA, gl.UNSIGNED_BYTE, pixels); + + ok(gl.getError() == gl.INVALID_OPERATION, + '1x1 color read from a depth FB should generated INVALID_OP.'); + console.log('Data after 1x1 color-from-depth readpixels:'); + console.log(pixels); + + gl.readPixels(0, 0, // x,y + 0, 0, // w,h + gl.RGBA, gl.UNSIGNED_BYTE, pixels); + + ok(gl.getError() == gl.INVALID_OPERATION, + '0x0 color read from a depth FB should generated INVALID_OP.'); +})(); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html new file mode 100644 index 000000000..a3f2dc409 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_depth_tex_lazy_clear.html @@ -0,0 +1,73 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='utf-8'/> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> +<body> +<script id='vs' type='x-shader/x-vertex'> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id='fs' type='x-shader/x-fragment'> + +precision mediump float; +uniform sampler2D uTexUnit; + +void main(void) { + vec4 tex = texture2D(uTexUnit, vec2(0)); + gl_FragColor = vec4(tex.r, 1.0, 0.0, 1.0); +} + +</script> +<script> +'use strict'; + +var gl = null; + +do { + var c = document.createElement('canvas'); + gl = c.getContext('webgl'); + if (!gl) { + todo(false, 'Get GL working here first.'); + break; + } + + var ext = gl.getExtension('WEBGL_depth_texture'); + if (!ext) { + todo(false, 'WEBGL_depth_texture not supported, which is fine.'); + break; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + break; + } + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT, 1, 1, 0, gl.DEPTH_COMPONENT, + gl.UNSIGNED_INT, null); + + var uTexUnit = gl.getUniformLocation(prog, 'uTexUnit'); + gl.useProgram(prog); + gl.uniform1i(uTexUnit, 0); + + gl.drawArrays(gl.POINTS, 0, 1); + + ok(!gl.getError(), 'Should have no errors.'); +} while (false); + +ok(true, 'Test complete.'); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_draw.html b/dom/canvas/test/webgl-mochitest/test_draw.html new file mode 100644 index 000000000..90d244719 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_draw.html @@ -0,0 +1,131 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: Basic drawing</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> + + +<script id="vs" type="x-shader/x-vertex"> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + WebGLUtil.setWarningFunc(errorFunc); + + gl.disable(gl.DEPTH_TEST); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + prog.aVertCoord = gl.getAttribLocation(prog, "aVertCoord"); + ok(prog.aVertCoord >= 0, '`aVertCoord` should be valid.'); + + function checkGLError(func, info, refValue) { + if (!refValue) + refValue = 0; + + var error = gl.getError(); + func(error == refValue, + '[' + info + '] gl.getError should be 0x' + refValue.toString(16) + + ', was 0x' + error.toString(16) + '.'); + } + + var vertCoordArr = new Float32Array([ + -1, -1, + 1, -1, + -1, 1, + 1, 1, + ]); + var vertCoordBuff = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertCoordBuff); + gl.bufferData(gl.ARRAY_BUFFER, vertCoordArr, gl.STATIC_DRAW); + + var indexArr = new Uint16Array([ + 0, 1, 2, + 3, + ]); + var indexBuff = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuff); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); + + + function testPixel(x, y, refData, func, infoString) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + var pixelMatches = pixel[0] == refData[0] && + pixel[1] == refData[1] && + pixel[2] == refData[2] && + pixel[3] == refData[3]; + func(pixelMatches, infoString); + } + + function preDraw(info) { + gl.clearColor(1.0, 0.0, 0.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + testPixel(0, 0, [255, 0, 0, 255], ok, '[' + info + '] Should be red before drawing.'); + } + + function postDraw(info) { + testPixel(0, 0, [0, 255, 0, 255], ok, '[' + info + '] Should be green before drawing.'); + } + + gl.useProgram(prog); + gl.enableVertexAttribArray(prog.aVertCoord); + gl.vertexAttribPointer(prog.aVertCoord, 2, gl.FLOAT, false, 0, 0); + + // Start drawing + checkGLError(ok, 'after setup'); + + preDraw('DrawArrays'); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + postDraw('DrawArrays'); + checkGLError(ok, 'after DrawArrays'); + + preDraw('DrawElements'); + gl.drawElements(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_SHORT, 0); + postDraw('DrawElements'); + checkGLError(ok, 'after DrawElements'); + + ok(true, 'Test complete.'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param.html b/dom/canvas/test/webgl-mochitest/test_fb_param.html new file mode 100644 index 000000000..5907221dd --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fb_param.html @@ -0,0 +1,54 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958491</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + // Catch actual WebGLUtil errors, not GL errors. + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 4, 4); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, + gl.RENDERBUFFER, rb); + + checkGLError(ok, 'before bad param query', 0); + + var GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = 0x8210; + var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING); + + checkGLError(ok, 'after bad param query', gl.INVALID_ENUM); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html new file mode 100644 index 000000000..56a29be46 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fb_param_crash.html @@ -0,0 +1,48 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 958723</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + // Catch actual WebGLUtil errors, not GL errors. + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + if (!gl.getExtension('WEBGL_draw_buffers')) { + todo(false, 'Not having this extension is fine.'); + return; + } + checkGLError(ok, 'before bad param query', 0); + + var result = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + + checkGLError(ok, 'after bad param query', gl.INVALID_OPERATION); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html new file mode 100644 index 000000000..3b0b1016c --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_fuzzing_bugs.html @@ -0,0 +1,159 @@ +<!DOCTYPE HTML> +<title>WebGL fuzzy bugs</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<script> + +// Test the framebufferTexture2D() call with a unbound texture. +function framebufferTexture2D_bug1257593() { + var canvas = document.createElement('canvas'); + + var gl = null; + gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); + if (!gl) { + todo(false, 'WebGL framebufferTexture2D test, webgl is unavailable.'); + return; + } + + var texture = gl.createTexture(); // only createTexture(), but no bindBuffer() + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, texture, 0); + + ok(true, 'WebGL framebufferTexture2D with unbound texture'); +} + +// Test to call ClearBufferXXX() during context lost. +function webGL2ClearBufferXXX_bug1252414() { + var canvas = document.createElement('canvas'); + + var gl = canvas.getContext('webgl2'); + if (!gl) { + todo(false, 'WebGL2 is not supported'); + return; + } + + var ext = gl.getExtension('WEBGL_lose_context'); + if (!ext) { + todo(false, 'WebGL ClearBufferXXX test, ext WEBGL_lose_context is unavailable.'); + return; + } + + // Force to lose context. + ext.loseContext(); + + // Even thought the context is lost, all clearBuffer* function should still + // work without crash. + gl.clearBufferiv(gl.COLOR, 0, new Int32Array(10)); + gl.clearBufferuiv(gl.COLOR, 0, new Uint32Array(10)); + gl.clearBufferfv(gl.DEPTH, 0, new Float32Array(10)); + gl.clearBufferfi(gl.DEPTH_STENCIL, 0, 0.0, 0); + + ok(true, 'WebGL2 clearBufferXXX call during loseContext'); +} + +// Test gl function for multiple gl contexts switch. +function getFramebufferAttachmentParameter_bug1267100() +{ + var canvas1 = document.createElement('canvas'); + var canvas2 = document.createElement('canvas'); + + var gl1 = null; + gl1 = canvas1.getContext('webgl') || canvas1.getContext('experimental-webgl'); + if (!gl1) { + todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.'); + return; + } + var gl2 = null; + gl2 = canvas2.getContext('webgl') || canvas2.getContext('experimental-webgl'); + if (!gl2) { + todo(false, 'WebGL getFramebufferAttachmentParameter test, webgl is unavailable.'); + return; + } + + gl1.bindFramebuffer(gl1.FRAMEBUFFER, gl1.createFramebuffer()); + gl2.scissor(0, 1, 2, 3); + // The gl call should still work even though we use another gl context before. + gl1.getFramebufferAttachmentParameter(gl1.FRAMEBUFFER, + gl1.COLOR_ATTACHMENT0, + gl1.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + + ok(true, 'WebGL test getFramebufferAttachmentParameter'); +} + +// Test to call getFragDataLocation() when the fragment shader is detatched. +function getFragDataLocation_bug1259702() { + var canvas = document.createElement('canvas'); + + var gl = canvas.getContext('webgl2'); + + if (!gl) { + todo(false, 'WebGL2 is not supported'); + return; + } + + var program = gl.createProgram(); + + var vertexShaderSrc = + "void main(void) { \ + gl_Position = vec4(1.0, 1.0, 1.0, 1.0); \ + }"; + var fragmentShaderSrc = + "void main(void) { \ + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); \ + }"; + + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + + gl.shaderSource(vertexShader, vertexShaderSrc); + gl.compileShader(vertexShader); + gl.attachShader(program, vertexShader); + + gl.shaderSource(fragmentShader, fragmentShaderSrc); + gl.compileShader(fragmentShader); + gl.attachShader(program, fragmentShader); + + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + var lastError = gl.getProgramInfoLog(program); + ok(false, 'WebGL getFragDataLocation() test, error in linking:' + + lastError); + return; + } + + gl.useProgram(program); + + gl.detachShader(program, fragmentShader); + // Test the getFragDataLocation() call after detatch the shader. + // This call should not hit crash. + gl.getFragDataLocation(program, "foobar"); + + ok(true, 'WebGL getFragDataLocation() call after detatch fragment shader'); +} + +function run() { + webGL2ClearBufferXXX_bug1252414(); + framebufferTexture2D_bug1257593(); + getFramebufferAttachmentParameter_bug1267100(); + getFragDataLocation_bug1259702(); + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +try { + var prefArrArr = [ + ['webgl.force-enabled', true], + ['webgl.enable-webgl2', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, run); +} catch (e) { + warning('No SpecialPowers, but trying WebGL2 anyway...'); + run(); +} +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html new file mode 100644 index 000000000..addc1b016 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html @@ -0,0 +1,156 @@ +<!DOCTYPE HTML> +<title>WebGL test: Hidden alpha on no-alpha contexts</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +<script src='driver-info.js'></script> +<script src='webgl-util.js'></script> +<body> +<script id='vs' type='x-shader/x-vertex'> + attribute vec2 aPosCoord; + + void main(void) { + gl_Position = vec4(aPosCoord, 0.0, 1.0); + } +</script> + +<script id='fs' type='x-shader/x-fragment'> + precision mediump float; + + void main(void) { + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); + } +</script> +<canvas id='canvas' style='border: none;' width='100' height='100'></canvas> +<script> + +var posCoords_arr = new Float32Array(2 * 4); +var posCoords_buff = null; +function DrawQuad(gl, prog, x0, y0, x1, y1) { + gl.useProgram(prog); + + if (!posCoords_buff) { + posCoords_buff = gl.createBuffer(); + } + gl.bindBuffer(gl.ARRAY_BUFFER, posCoords_buff); + posCoords_arr[0] = x0; + posCoords_arr[1] = y0; + + posCoords_arr[2] = x1; + posCoords_arr[3] = y0; + + posCoords_arr[4] = x0; + posCoords_arr[5] = y1; + + posCoords_arr[6] = x1; + posCoords_arr[7] = y1; + gl.bufferData(gl.ARRAY_BUFFER, posCoords_arr, gl.STREAM_DRAW); + + gl.enableVertexAttribArray(prog.aPosCoord); + gl.vertexAttribPointer(prog.aPosCoord, 2, gl.FLOAT, false, 0, 0); + + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); +} + +function DrawSquare(gl, prog, size) { + DrawQuad(gl, prog, -size, -size, size, size); +} + +function Reset(gl) { + gl.canvas.width += 1; + gl.canvas.width -= 1; +} + +function ReadCenterPixel(gl) { + var w = gl.drawingbufferWidth; + var h = gl.drawingbufferHeight; + var ret = new Uint8Array(4); + gl.readPixels(w/2, h/2, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ret); + return ret; +} + +function Test(gl, prog) { + gl.enable(gl.BLEND); + gl.blendFunc(gl.ZERO, gl.DST_ALPHA); + + var iColor = 64; + var fColor = iColor / 255.0; + + ////////////////// + + ok(true, 'clear(R,G,B,0)'); + + Reset(gl); + + gl.clearColor(fColor, fColor, fColor, 0.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + var dataURL_pre = gl.canvas.toDataURL(); + //console.log('Before blending: ' + dataURL_pre); + + DrawSquare(gl, prog, 0.7); + + var pixel = ReadCenterPixel(gl); + ok(pixel[0] == iColor && + pixel[1] == iColor && + pixel[2] == iColor, 'Color should be the same.'); + ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.'); + + var dataURL_post = gl.canvas.toDataURL(); + //console.log('After blending: ' + dataURL_post); + ok(dataURL_post == dataURL_pre, + 'toDataURL should be unchanged after blending.'); + + ////////////////// + + ok(true, 'mask(R,G,B,0), clear(R,G,B,1)'); + + Reset(gl); + + gl.colorMask(true, true, true, false); + gl.clearColor(fColor, fColor, fColor, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.colorMask(true, true, true, true); + + dataURL_pre = gl.canvas.toDataURL(); + //console.log('Before blending: ' + dataURL_pre); + + DrawSquare(gl, prog, 0.7); + + var pixel = ReadCenterPixel(gl); + ok(pixel[0] == iColor && + pixel[1] == iColor && + pixel[2] == iColor, 'Color should be the same.'); + ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.'); + ok(gl.getError() == 0, 'Should have no errors.'); + + dataURL_post = gl.canvas.toDataURL(); + //console.log('After blending: ' + dataURL_post); + ok(dataURL_post == dataURL_pre, + 'toDataURL should be unchanged after blending.'); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +(function(){ + var canvas = document.getElementById('canvas'); + var attribs = { + alpha: false, + antialias: false, + premultipliedAlpha: false, + }; + var gl = canvas.getContext('experimental-webgl', attribs); + ok(gl, 'WebGL should work.'); + ok(gl.getParameter(gl.ALPHA_BITS) == 0, 'Shouldn\'t have alpha bits.'); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + ok(prog, 'Program should link.'); + prog.aPosCoord = gl.getAttribLocation(prog, 'aPosCoord'); + + SimpleTest.waitForExplicitFinish(); + SimpleTest.requestFlakyTimeout("untriaged"); + setTimeout(function(){ Test(gl, prog); }, 500); +})(); + +</script> +</body> diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html new file mode 100644 index 000000000..987af9e37 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_hidden_depth_stencil.html @@ -0,0 +1,159 @@ +<!DOCTYPE HTML> +<title>WebGL test: Hidden depth/stencil passes without a depth/stencil buffer respectively</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +<script src='webgl-util.js'></script> +<body> +<script id='vs' type='x-shader/x-vertex'> + void main(void) { + gl_PointSize = 1.0; // Note that this is undefined if we don't write to it! + gl_Position = vec4(vec3(0), 1); + } +</script> + +<script id='fs' type='x-shader/x-fragment'> + precision mediump float; + + void main(void) { + gl_FragColor = vec4(0, 1, 0, 1); + } +</script> +<script> + +function ColorString(arr) { + return '[' + arr[0] + ', ' + arr[1] + ', ' + arr[2] + ', ' + arr[3] + ']'; +} + +function DrawAndCheck(gl, infoPrefix, refColorStr) { + gl.viewport(0, 0, 1, 1); + + gl.clearColor(1, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + + var pixel = new Uint8Array(4); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + var pixelStr = ColorString(pixel); + + ok(pixelStr == refColorStr, infoPrefix + pixelStr + ' should be ' + refColorStr); +} + +function TestCurrent(gl, attribs, infoPrefix) { + infoPrefix = infoPrefix + JSON.stringify(attribs) + ': '; + + var CLEAR_COLOR = ColorString([255, 0, 0, 255]); + var DRAW_COLOR = ColorString([0, 255, 0, 255]); + + gl.disable(gl.DEPTH_TEST); + gl.disable(gl.STENCIL_TEST); + + DrawAndCheck(gl, infoPrefix + 'initial: ', DRAW_COLOR); + + if (!attribs.depth) { + gl.enable(gl.DEPTH_TEST); + gl.depthFunc(gl.NEVER); + + gl.disable(gl.STENCIL_TEST); + + // Depth test is enabled, and should pass NEVER. + // Since there is no depth buffer, the depth test is not run. + // Stencil test is disabled. + DrawAndCheck(gl, infoPrefix + 'no-depth: ', DRAW_COLOR); + } + + if (!attribs.stencil) { + gl.disable(gl.DEPTH_TEST); + + gl.enable(gl.STENCIL_TEST); + gl.stencilFunc(gl.NEVER, 0, 0); + + // Depth test is disabled. + // Stencil test is enabled, and should pass NEVER. + // Since there is no stencil buffer, the stencil test is not run. + DrawAndCheck(gl, infoPrefix + 'no-stencil: ', DRAW_COLOR); + } +} + +function TestBackbuffer(requestedAttribs) { + var canvas = document.createElement('canvas'); + canvas.width = 1; + canvas.height = 1; + var gl = canvas.getContext('experimental-webgl', requestedAttribs); + if (!gl) { + ok(true, 'WebGL doesn\'t work, skipping test.'); + return; + } + + ok(gl.drawingBufferWidth == 1 && gl.drawingBufferHeight == 1, + 'backbuffer should be 1x1'); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + gl.useProgram(prog); + + var attribs = { + depth: gl.getContextAttributes().depth, + stencil: gl.getContextAttributes().stencil, + }; + TestCurrent(gl, attribs, 'Backbuffer: '); +} + +function TestUserFB() { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl'); + if (!gl) { + ok(true, 'WebGL doesn\'t work, skipping test.'); + return; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + gl.useProgram(prog); + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + + var depthRB = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthRB); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 1, 1); + + var stencilRB = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, stencilRB); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8, 1, 1); + + do { + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRB); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) { + ok(true, 'Depth-only user FB is incomplete. This is allowed.'); + break; + } + + TestCurrent(gl, {depth: true, stencil: false}, 'Depth-only user FB'); + } while (false); + + do { + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencilRB); + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) { + ok(true, 'Stencil-only user FB is incomplete. This is allowed.'); + break; + } + + TestCurrent(gl, {depth: false, stencil: true}, 'Stencil-only user FB'); + } while (false); +} + +(function(){ + TestBackbuffer({depth: true, stencil: false}); + TestBackbuffer({depth: false, stencil: true}); + TestUserFB(); +})(); + +</script> +</body> diff --git a/dom/canvas/test/webgl-mochitest/test_highp_fs.html b/dom/canvas/test/webgl-mochitest/test_highp_fs.html new file mode 100644 index 000000000..8d82c33e4 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_highp_fs.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML> +<title>WebGL test: `highp` support</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="shader-vs" type="x-shader/x-vertex"> + +void main(void) { + gl_Position = vec4(vec3(0.0), 1.0); +} + +</script> +<script id="shader-fs" type="x-shader/x-fragment"> + +precision highp float; + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} + +</script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + // Catch actual WebGLUtil errors, not GL errors. + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + + function checkGLError(func, info) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : '' + func(!error, prefix + 'gl.getError should be 0x0, was 0x' + error.toString(16) + '.'); + } + + var format = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT); + var prog = WebGLUtil.createProgramByIds(gl, 'shader-vs', 'shader-fs'); + checkGLError(ok); + + if (format) { + ok(prog, 'Frag shader with unconditional `precision highp float` should ' + + 'link if `getShaderPrecisionFormat` gives a format for it.'); + } else { + ok(!prog, 'Frag shader with unconditional `precision highp float` should ' + + 'NOT link if `getShaderPrecisionFormat` gives NO format for it.'); + } +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html new file mode 100644 index 000000000..bbabef3e8 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_implicit_color_buffer_float.html @@ -0,0 +1,199 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset='utf-8'> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +var RGBA32F_EXT = 0x8814; +var RGBA16F_EXT = 0x881A; // Yep, it's really 4 and A. +var HALF_FLOAT_OES = 0x8D61; + +function IsFormatValidForRB(gl, format) { + ok(!gl.getError(), 'Should have no errors here.'); + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, format, 4, 4); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_ENUM or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTex(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + return error == gl.NO_ERROR; +} + +function IsFormatValidForTexFB(gl, format, type) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 4, 4, 0, format, type, null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + return status == gl.FRAMEBUFFER_COMPLETE; +} + +function IsFormatValidForTexFBRead(gl, texFormat, texType, readType) { + ok(!gl.getError(), 'Should have no errors here.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, texFormat, 4, 4, 0, texFormat, texType, + null); + + var error = gl.getError(); + if (error == gl.INVALID_ENUM || error == gl.INVALID_OPERATION) + return false; + + ok(error == gl.NO_ERROR, 'Error should be INVALID_{ENUM,OPERATION} or NO_ERROR.'); + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, + tex, 0); + error = gl.getError(); + ok(error == gl.NO_ERROR, 'Error should be NO_ERROR.'); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + if (status != gl.FRAMEBUFFER_COMPLETE) + return false; + + var data; + switch (readType) { + case gl.UNSIGNED_BYTE: + data = new Uint8Array(4); + break; + case HALF_FLOAT_OES: + data = new Uint16Array(4); + break; + case gl.FLOAT: + data = new Float32Array(4); + break; + default: + throw 'Bad `readType`.'; + } + gl.readPixels(0, 0, 1, 1, gl.RGBA, readType, data); + + error = gl.getError(); + return error == gl.NO_ERROR; +} + +function TestColorBufferExt(gl, rbFormat, texFormat, texType, readType) +{ + var isTexFBValid = IsFormatValidForTexFB(gl, texFormat, texType); + var isTexFBReadValid = IsFormatValidForTexFBRead(gl, texFormat, texType, + readType); + var isRBValid = IsFormatValidForRB(gl, rbFormat); + + var validSubsetCount = isTexFBValid + isTexFBReadValid + isRBValid; + + if (validSubsetCount) { + ok(isTexFBValid, 'If active, texture-fbs should work.'); + ok(isTexFBReadValid, 'If active, reading texture-fbs should work.'); + ok(isRBValid, 'If active, renderbuffers should work.'); + } + + return validSubsetCount == 3; +} + +function TestImpliedExtension(gl, baseExtName, impliedExtName, rbFormat, + texFormat, texType, readType) +{ + ok(true, '========'); + ok(true, 'Testing if ' + baseExtName + ' implies ' + impliedExtName + '.'); + ok(true, '--------'); + + var baseExt = gl.getExtension(baseExtName); + if (!baseExt) { + ok(!baseExt, 'Ext \'' + baseExtName + '\' can be unsupported.'); + return; + } + + var isTexValid = IsFormatValidForTex(gl, texFormat, texType); + ok(isTexValid, baseExtName + ' should allow float textures.'); + if (!isTexValid) + return; + + var isImplicitlyActive = TestColorBufferExt(gl, rbFormat, texFormat, + texType, readType); + + if (isImplicitlyActive) { + ok(true, 'Activating ' + baseExtName + ' has implicitly activated ' + + impliedExtName + '.'); + + var impliedExt = gl.getExtension(impliedExtName); + ok(impliedExt, 'If ' + impliedExtName + ' is supported implicitly, it' + + ' must be supported explicitly as well.'); + return; + } + + ok(true, 'Activating ' + baseExtName + ' has not implicitly activated ' + + impliedExtName + '.'); + ok(true, '--------'); + + var impliedExt = gl.getExtension(impliedExtName); + if (!impliedExt) { + ok(true, impliedExtName + ' can be unsupported.'); + return; + } + ok(true, 'Explicit activation of ' + impliedExtName + ' successful.'); + + var isFunctional = TestColorBufferExt(gl, rbFormat, texFormat, texType, + readType); + ok(isFunctional, impliedExtName + ' should be fully functional.'); +} + +(function() { + var canvas = document.createElement('canvas'); + var gl = canvas.getContext('experimental-webgl'); + if (!gl) { + ok(!gl, 'WebGL can be unsupported.'); + return; + } + + TestImpliedExtension(gl, 'OES_texture_float', 'WEBGL_color_buffer_float', + RGBA32F_EXT, gl.RGBA, gl.FLOAT, gl.FLOAT); + TestImpliedExtension(gl, 'OES_texture_half_float', + 'EXT_color_buffer_half_float', RGBA16F_EXT, gl.RGBA, + HALF_FLOAT_OES, gl.FLOAT); + ok(true, '========'); + ok(true, 'TEST COMPLETE'); +})(); + +</script> + +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_no_arr_points.html b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html new file mode 100644 index 000000000..caeea696e --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_no_arr_points.html @@ -0,0 +1,169 @@ +<!DOCTYPE HTML> +<title>WebGL test: Drawing without attrib arrays</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs-no-attrib" type="x-shader/x-vertex"> + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(vec3(0.0), 1.0); +} + +</script> +<script id="vs-attrib" type="x-shader/x-vertex"> + +attribute vec3 aPosition; + +void main(void) { + gl_PointSize = 64.0; + gl_Position = vec4(aPosition, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + WebGLUtil.setWarningFunc(errorFunc); + + var attribProg = WebGLUtil.createProgramByIds(gl, 'vs-attrib', 'fs'); + var noAttribProg = WebGLUtil.createProgramByIds(gl, 'vs-no-attrib', 'fs'); + if (!attribProg || !noAttribProg) { + ok(false, 'Program linking should succeed.'); + return; + } + + attribProg.aPosition = gl.getAttribLocation(attribProg, "aPosition"); + ok(attribProg.aPosition >= 0, '`aPosition` should be valid.'); + + function isScreenBlack() { + var pixels = gl.drawingBufferWidth * gl.drawingBufferHeight; + var data = new Uint8Array(4 * pixels); + gl.readPixels(0, 0, + gl.drawingBufferWidth, gl.drawingBufferHeight, + gl.RGBA, gl.UNSIGNED_BYTE, + data); + + var accum = 0; + for (var i = 0; i < pixels; i++) { + accum += data[4*i + 0]; + accum += data[4*i + 1]; + accum += data[4*i + 2]; + } + + return accum == 0; + } + + function checkGLError(func, info) { + var error = gl.getError(); + func(!error, '[' + info + '] gl.getError should be 0, was 0x' + error.toString(16) + '.'); + } + + function testDrawing(info) { + var cruelNumber = 1024*1024; + // Really, we should test for INT32_MAX-1 here, but we don't gracefully chunk these calls, + // and so try to create a VBO of size INT32_MAX-1 to pretend that vert attrib 0 is an array. + // (INT32_MAX-1 because we check that `first+count` is a valid GLsizei, which is int32_t) + var UINT16_MAX = 0xffff; + var INT32_MAX = 0x7fffffff; + var UINT32_MAX = 0xffffffff; + + // `first` needs room for `first+count` <= sizeof(GLsizei) == INT32_MAX + var hugeFirst = Math.min(cruelNumber, INT32_MAX-1); + var hugeIndex = Math.min(cruelNumber, UINT32_MAX); + + var indexType = gl.UNSIGNED_SHORT; + var indexStride = 2; + var indexArr = new Uint16Array([0, 1, Math.min(hugeIndex, UINT16_MAX)]); + if (gl.getExtension('OES_element_index_uint')) { + indexType = gl.UNSIGNED_INT; + indexStride = 4; + indexArr = new Uint32Array([0, 1, hugeIndex]); + } + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, 0, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.POINTS, hugeFirst, 1); + ok(!isScreenBlack(), '[' + info + '] drawArrays[huge first] should color pixels.'); + + checkGLError(ok, info); + + var elemTestFunc = todo; // We fail on most implementations. + var checkGLTestFunc = todo; + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANGLE || + DriverInfo.getOS() == DriverInfo.OS.ANDROID) + { + // ANGLE and Android slaves seem to work fine. + elemTestFunc = ok; + checkGLTestFunc = ok; + } + if (DriverInfo.getDriver() == DriverInfo.DRIVER.ANDROID_X86_EMULATOR || + DriverInfo.getOS() == DriverInfo.OS.B2G) + { + // ...but the Android 4.2 x86 emulator environment is different + elemTestFunc = todo; + checkGLTestFunc = ok; + } + + // Now for drawElements: + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.createBuffer()); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArr, gl.STATIC_DRAW); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 0); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[0] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 1*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[1] should color pixels.'); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawElements(gl.POINTS, 1, indexType, 2*indexStride); + elemTestFunc(!isScreenBlack(), '[' + info + '] drawElements[huge offset] should color pixels.'); + + checkGLError(checkGLTestFunc, info); + } + + // Begin drawing + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.disable(gl.DEPTH_TEST); + + // No-attrib prog: + gl.useProgram(noAttribProg); + testDrawing('no-attrib'); + + // One-attrib, no-array prog: + gl.useProgram(attribProg); + gl.disableVertexAttribArray(attribProg.aPosition); + gl.vertexAttrib3fv(attribProg.aPosition, [0.0, 0.0, 0.0]); + testDrawing('one-attrib, no-array'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_noprog_draw.html b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html new file mode 100644 index 000000000..55e755894 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_noprog_draw.html @@ -0,0 +1,80 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL test: Drawing with a null program</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> + + +<script id="vs" type="x-shader/x-vertex"> + +void main(void) { + gl_PointSize = 16.0; + gl_Position = vec4(0.0, 0.0, 0.0, 1.0); +} + +</script> +<script id="fs" type="x-shader/x-fragment"> + +precision mediump float; + +void main(void) { + gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); +} + +</script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + WebGLUtil.setWarningFunc(errorFunc); + + gl.disable(gl.DEPTH_TEST); + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return; + } + + function checkGLError(func, info, refValue) { + if (!refValue) + refValue = 0; + + var error = gl.getError(); + func(error == refValue, + '[' + info + '] gl.getError should be 0x' + refValue.toString(16) + + ', was 0x' + error.toString(16) + '.'); + } + + // Start drawing + checkGLError(ok, 'after setup'); + + gl.useProgram(prog); + gl.drawArrays(gl.POINTS, 0, 1); + checkGLError(ok, 'after non-null-program DrawArrays'); + + gl.useProgram(null); + gl.drawArrays(gl.POINTS, 0, 1); + checkGLError(ok, 'after null-program DrawArrays', gl.INVALID_OPERATION); + + ok(true, 'Test complete.'); +})(); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html new file mode 100644 index 000000000..bfacc5bfa --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_pixel_pack_buffer.html @@ -0,0 +1,288 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> + <script> + +var RED = [1, 0, 0, 1]; +var GREEN = [0, 1, 0, 1]; +var BLUE = [0, 0, 1, 1]; +var WHITE = [1, 1, 1, 1]; +var ZERO = [0, 0, 0, 0]; + +function DrawColors(gl) { + var fnClearToColor = function(color) { + gl.clearColor(color[0], color[1], color[2], color[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + }; + + gl.enable(gl.SCISSOR_TEST); + + // +---+ + // |G W| + // |R B| + // +---+ + + gl.scissor(0, 0, 1, 1); + fnClearToColor(RED); + + gl.scissor(1, 0, 1, 1); + fnClearToColor(BLUE); + + gl.scissor(0, 1, 1, 1); + fnClearToColor(GREEN); + + gl.scissor(1, 1, 1, 1); + fnClearToColor(WHITE); +} + +function ClearBufferPair(gl, byteCount) { + // Using `null` here clears to zero according to WebGL. + gl.bufferData(gl.PIXEL_PACK_BUFFER, byteCount, gl.STREAM_READ); + + var arr = new Uint8Array(byteCount); + return arr; +} + +function ColorToString(color, offset=0) { + var arr = [ color[offset+0], + color[offset+1], + color[offset+2], + color[offset+3] ]; + return '[' + arr.join(', ') + ']'; +} + +function TestIsUNormColor(refColor, testData, offset) { + if (testData.length < offset + 4) { + ok(false, 'testData not long enough.'); + } + + var refUNormColor = [ + (refColor[0] * 255) | 0, + (refColor[1] * 255) | 0, + (refColor[2] * 255) | 0, + (refColor[3] * 255) | 0, + ]; + + var refStr = ColorToString(refUNormColor); + var testStr = ColorToString(testData, offset); + ok(testStr == refStr, 'Expected ' + refStr + ', was ' + testStr + '.'); +} + +function section(text) { + ok(true, ''); + ok(true, 'Section: ' + text); +} + +function EnsureNoError(gl) { + var glErr = gl.getError(); + while (gl.getError()) {} + + if (!glErr) + return; + + var extraInfo = ''; + + var err = new Error(); + var stackStr = err.stack; + if (stackStr !== undefined) { + var stackArr = stackStr.split('\n'); + stackStr = stackArr[1]; // First one after present scope. + extraInfo = ': ' + stackStr; + } + + ok(false, 'Unexpected GL error: 0x' + glErr.toString(16) + extraInfo); +} + +function TestError(gl, refErrVal, str='') { + if (str == '') { + str = 'gl.getError()'; + } else { + str = str + ': gl.getError()'; + } + + var err = gl.getError(); + while (gl.getError()) {} + + ShouldBe(err.toString(16), refErrVal.toString(16), str); +} + +function ShouldBe(val, ref, str='') { + if (str != '') { + str += ': '; + } + + ok(val == ref, str + 'Should be `' + ref + '`, was `' + val + '`.'); +} + +var gl; + +function Test() { + var canvas = document.createElement('canvas'); + canvas.width = 2; + canvas.height = 2; + canvas.style = 'width: 256px; height: 256px; border: 1px solid black;'; + document.body.appendChild(canvas); + + var attribs = { + antialias: false, + alpha: false, + }; + gl = canvas.getContext('webgl2', attribs); + if (!gl) { + todo(false, 'WebGL 2 not present, skipping.'); + return; + } + + //////// + + TestIsUNormColor(RED, new Uint8Array([255, 0, 0, 255]), 0); + + //////// + + gl.clearColor(RED[0], RED[1], RED[2], RED[3]); + gl.clear(gl.COLOR_BUFFER_BIT); + + var data = new Uint8Array(16); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + console.log(JSON.stringify(data)); + TestIsUNormColor(RED, data, 0); + + //////// + + DrawColors(gl); + + //////// + + EnsureNoError(gl); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0); + TestError(gl, gl.INVALID_OPERATION); + + var data = new Uint8Array(16); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + EnsureNoError(gl); + TestIsUNormColor(RED, data, 0); + TestIsUNormColor(BLUE, data, 4); + TestIsUNormColor(GREEN, data, 8); + TestIsUNormColor(WHITE, data, 12); + + //////// + + var a = gl.createBuffer(); + gl.bindBuffer(gl.PIXEL_PACK_BUFFER, a); + EnsureNoError(gl); + + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, data); + TestError(gl, gl.INVALID_OPERATION); + + //////// + + // Basic + section('Basic readback'); + data = ClearBufferPair(gl, 16); + EnsureNoError(gl); + gl.readPixels(0, 0, 2, 2, gl.RGBA, gl.UNSIGNED_BYTE, 0); + EnsureNoError(gl); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(RED, data, 0); + TestIsUNormColor(BLUE, data, 4); + TestIsUNormColor(GREEN, data, 8); + TestIsUNormColor(WHITE, data, 12); + + section('Subrect readback'); + data = ClearBufferPair(gl, 8); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(WHITE, data, 0); + TestIsUNormColor(ZERO, data, 4); + + section('ReadPixels offset:4'); + data = ClearBufferPair(gl, 16); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 4); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(WHITE, data, 4); + TestIsUNormColor(ZERO, data, 8); + TestIsUNormColor(ZERO, data, 12); + + section('ReadPixels offset:5'); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 5); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(WHITE, data, 4); // Should remain from previous read. + TestIsUNormColor(WHITE, data, 5); + TestIsUNormColor(ZERO, data, 9); + TestIsUNormColor(ZERO, data, 12); + + section('GetBufferSubData src too small'); + data = ClearBufferPair(gl, 16); + EnsureNoError(gl); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data); + TestError(gl, gl.INVALID_VALUE); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(ZERO, data, 4); + TestIsUNormColor(ZERO, data, 8); + TestIsUNormColor(ZERO, data, 12); + + section('GetBufferSubData offset:1'); + data = new Uint8Array(15); + gl.readPixels(1, 1, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 8); + gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 1, data); + EnsureNoError(gl); + TestIsUNormColor(ZERO, data, 0); + TestIsUNormColor(ZERO, data, 3); + TestIsUNormColor(WHITE, data, 7); + TestIsUNormColor(ZERO, data, 11); + + ////////////////////////////////////// + + section('Test packing state'); + EnsureNoError(gl); + + function TestPackState(enumStr, initialVal, changedVal) { + var enumVal = gl[enumStr]; + + ShouldBe(gl.getParameter(enumVal), initialVal, 'Initial ' + enumStr); + gl.pixelStorei(enumVal, changedVal); + ShouldBe(gl.getParameter(enumVal), changedVal, 'Changed ' + enumStr); + gl.pixelStorei(enumVal, initialVal); + ShouldBe(gl.getParameter(enumVal), initialVal, 'Reverted ' + enumStr); + EnsureNoError(gl); + } + + TestPackState('PACK_ALIGNMENT', 4, 1); + TestPackState('PACK_ROW_LENGTH', 0, 16); + TestPackState('PACK_SKIP_PIXELS', 0, 3); + TestPackState('PACK_SKIP_ROWS', 0, 3); +} + +function RunTest() { + Test(); + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +try { + var prefArrArr = [ + ['webgl.force-enabled', true], + ['webgl.disable-angle', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, RunTest); +} catch (e) { + todo(false, 'No SpecialPowers, but trying anyway...'); + RunTest(); +} + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_privileged_exts.html b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html new file mode 100644 index 000000000..c7895bcdf --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_privileged_exts.html @@ -0,0 +1,32 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check for privileged ext access.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> + +function TestExt(gl, name) { + var ext = gl.getExtension(name); + ok(!ext, 'Should not have access to \'' + name + '\'.'); +} + +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(gl, 'Get GL working here first.'); + return; + } + + // Privileged extensions: + TestExt(gl, 'WEBGL_debug_shaders'); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_renderer_strings.html b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html new file mode 100644 index 000000000..4890abf91 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_renderer_strings.html @@ -0,0 +1,102 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +function AssertError(gl, expected, info) { + var actual = gl.getError(); + while (gl.getError()) {} + + ok(actual == expected, + 'For ' + info + ', expected GL error 0x' + expected.toString(16) + ', got 0x' + + actual.toString(16)); +} + +var gl; + +var RENDERER_OVERRIDE = 'overridden renderer'; +var VENDOR_OVERRIDE = 'overridden vendor'; + +function TestExt() { + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(ext, 'When pref enabled: Should have access to \'WEBGL_debug_renderer_info\'.'); + AssertError(gl, 0, 'start of test'); + + var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + AssertError(gl, 0, 'UNMASKED_RENDERER_WEBGL'); + ok(renderer, + 'When pref enabled: UNMASKED_RENDERER_WEBGL value should not be empty, was \'' + + renderer + '\''); + + var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + AssertError(gl, 0, 'UNMASKED_VENDOR_WEBGL'); + ok(vendor, + 'When pref enabled: UNMASKED_VENDOR_WEBGL value should not be empty, was \'' + + vendor + '\''); + + var prefArrArr = [ + ['webgl.renderer-string-override', RENDERER_OVERRIDE], + ['webgl.vendor-string-override', VENDOR_OVERRIDE], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, TestOverrides); +} + +function TestOverrides() { + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(ext, 'When overrides set: Should have access to \'WEBGL_debug_renderer_info\'.'); + AssertError(gl, 0, 'start of test'); + + var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); + AssertError(gl, 0, 'UNMASKED_RENDERER_WEBGL'); + ok(renderer == RENDERER_OVERRIDE, + 'When overrides set: UNMASKED_RENDERER_WEBGL value should be \'' + RENDERER_OVERRIDE + + '\', was \'' + renderer + '\''); + + var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); + AssertError(gl, 0, 'UNMASKED_VENDOR_WEBGL'); + ok(vendor == VENDOR_OVERRIDE, + 'When overrides set: UNMASKED_VENDOR_WEBGL value should be \'' + VENDOR_OVERRIDE + + '\', was \'' + vendor + '\''); + + var prefArrArr = [ + ['webgl.enable-debug-renderer-info', false], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, TestDisable); +} + +function TestDisable() { + var ext = gl.getExtension('WEBGL_debug_renderer_info'); + ok(!ext, + 'When pref disabled: Should not have access to \'WEBGL_debug_renderer_info\'.'); + + ok(true, 'Test complete.'); + SimpleTest.finish(); +} + +(function() { + var canvas = document.createElement('canvas'); + gl = canvas.getContext('experimental-webgl'); + if (!gl) { + todo(gl, 'Get WebGL working here first.'); + ok(true, 'Test complete.'); + return; + } + + SimpleTest.waitForExplicitFinish(); + + var prefArrArr = [ + ['webgl.enable-debug-renderer-info', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, TestExt); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html new file mode 100644 index 000000000..56b89950a --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_sab_with_webgl.html @@ -0,0 +1,192 @@ +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> +<canvas id='c' width='200' height='200'></canvas> +<canvas id='c2' width='200' height='200'></canvas> + +<script> + +var gl; + +function RGBAToString(arr) { + return '[' + arr[0].toPrecision(4) + ', ' + + arr[1].toPrecision(4) + ', ' + + arr[2].toPrecision(4) + ', ' + + arr[3].toPrecision(4) + ']'; +} + +function TestScreenColor(gl, r, g, b, a) { + var arr = new SharedArrayBuffer(4); + var view = new Uint8Array(arr); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, view); + + var err = gl.getError(); + ok(err == 0, 'Should be no errors.'); + if (err) + return; + + var floatArr; + floatArr = new Float32Array(4); + floatArr[0] = view[0] / 255.0; + floatArr[1] = view[1] / 255.0; + floatArr[2] = view[2] / 255.0; + floatArr[3] = view[3] / 255.0; + + var testText = RGBAToString(floatArr); + var refText = RGBAToString([r, g, b, a]); + + var eps = 1.0 / 255.0; + var isSame = (Math.abs(floatArr[0] - r) < eps && + Math.abs(floatArr[1] - g) < eps && + Math.abs(floatArr[2] - b) < eps && + Math.abs(floatArr[3] - a) < eps); + + ok(isSame, 'Should be ' + refText + ', was ' + testText + ','); +} + +// Give ourselves a scope to return early from: +(function() { + var canvas = document.getElementById('c'); + var attribs = { + antialias: false, + depth: false, + }; + gl = canvas.getContext('experimental-webgl', attribs); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + if (typeof SharedArrayBuffer === 'undefined') { + todo(false, 'SharedArrayBuffer is unavailable.'); + return; + } + + var vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, "attribute vec2 aVertCoord; void main(void) { gl_Position = vec4(aVertCoord, 0.0, 1.0); }"); + gl.compileShader(vs); + var fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, "precision mediump float; uniform vec4 uFragColor; void main(void) { gl_FragColor = uFragColor; }"); + gl.compileShader(fs); + var prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + + var success = gl.getProgramParameter(prog, gl.LINK_STATUS); + if (!success) { + console.log('Error linking program for \'' + vsId + '\' and \'' + fsId + '\'.'); + console.log('\nLink log: ' + gl.getProgramInfoLog(prog)); + console.log('\nVert shader log: ' + gl.getShaderInfoLog(vs)); + console.log('\nFrag shader log: ' + gl.getShaderInfoLog(fs)); + } + ok(prog, 'Program should link.'); + if (!prog) { + return; + } + + prog.aVertCoord = gl.getAttribLocation(prog, 'aVertCoord'); + prog.uFragColor = gl.getUniformLocation(prog, 'uFragColor'); + + gl.useProgram(prog); + + // Test gl.bufferData(), gl.bufferSubData() and gl.readPixels() APIs with SAB as input. + var arr = new SharedArrayBuffer(8*4); + var view = new Float32Array(arr); + view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); + var vb = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vb); + gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW); + ok(gl.getError() == 0, 'bufferData with SAB as input parameter works ok.'); + gl.bufferSubData(gl.ARRAY_BUFFER, 0, view); + ok(gl.getError() == 0, 'bufferSubData with SAB as input parameter works ok.'); + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + gl.clearColor(0, 0, 0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.uniform4f(prog.uFragColor, 0.2, 0.4, 0.6, 1.0); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + var arr = new Uint8Array(4); + TestScreenColor(gl, 0.2, 0.4, 0.6, 1.0); + + // Test gl.texImage2D() and gl.texSubImage2D() APIs with SAB as input. + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + var width = 4; + var height = 4; + var numChannels = 4; + var sab = new SharedArrayBuffer(width * height * numChannels); + var data = new Uint8Array(sab); + for (var i = 0; i < data.length; ++i) { + data[i] = i; + } + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texImage2D() with SAB as input parameter works ok.'); + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texSubImage2D() with SAB as input parameter works ok.'); + + ok(gl.getError() == 0, 'Should be no errors after test.'); +})(); + +// Test WebGL 2 +(function() { + var canvas = document.getElementById('c2'); + var attribs = { + antialias: false, + depth: false, + }; + gl = canvas.getContext('webgl2', attribs); + if (!gl) { + todo(false, 'WebGL 2 is unavailable.'); + return; + } + if (typeof SharedArrayBuffer === 'undefined') { + todo(false, 'SharedArrayBuffer is unavailable.'); + return; + } + + var arr = new SharedArrayBuffer(8*4); + var view = new Float32Array(arr); + view.set(new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1])); + var vb = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vb); + gl.bufferData(gl.ARRAY_BUFFER, view, gl.STATIC_DRAW); + + var arr2 = new SharedArrayBuffer(8*4); + var view2 = new Float32Array(arr2); + gl.getBufferSubData(gl.ARRAY_BUFFER, 0, view2); + var equal = true; + for(var i = 0; i < 8; ++i) { + if (view[i] != view2[i]) equal = false; + } + ok(equal, 'getBufferSubData with SAB as input parameter works ok.'); + + // Test gl.texImage3D() and gl.texSubImage3D() APIs with SAB as input. + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_3D, tex); + var width = 4; + var height = 4; + var depth = 4; + var numChannels = 4; + var sab = new SharedArrayBuffer(width * height * depth* numChannels); + var data = new Uint8Array(sab); + for (var i = 0; i < data.length; ++i) { + data[i] = i; + } + gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, width, height, depth, 0, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texImage3D() with SAB as input parameter works ok.'); + gl.texSubImage3D(gl.TEXTURE_3D, 0, 0, 0, 0, width, height, depth, gl.RGBA, gl.UNSIGNED_BYTE, data); + ok(gl.getError() == 0, 'texSubImage3D() with SAB as input parameter works ok.'); + + ok(gl.getError() == 0, 'Should be no errors after test.'); +})(); + +ok(true, 'TEST COMPLETE'); + +</script> + + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html new file mode 100644 index 000000000..75735c657 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_texsubimage_float.html @@ -0,0 +1,62 @@ +<!DOCTYPE HTML> +<title>WebGL test: bug 1003607</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c"></canvas> +<script> + +// Give ourselves a scope to return early from: +(function() { + var gl = WebGLUtil.getWebGL('c'); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + // Catch actual WebGLUtil errors, not GL errors. + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + WebGLUtil.setErrorFunc(errorFunc); + + function checkGLError(func, info, reference) { + var error = gl.getError(); + var prefix = info ? ('[' + info + '] ') : ''; + var text = 'gl.getError should be 0x' + reference.toString(16) + + ', was 0x' + error.toString(16) + '.'; + func(error == reference, prefix + text); + } + + // Begin test: + if (!gl.getExtension('OES_texture_float')) { + todo(false, 'Not having this extension is fine.'); + return; + } + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + checkGLError(ok, 'texture parameter setup should succeed', gl.NO_ERROR); + + // Generate data + var width = 2; + var height = 2; + var numChannels = 4; + var data = new Float32Array(width * height * numChannels); + for (var ii = 0; ii < data.length; ++ii) { + data[ii] = 10000; + } + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.FLOAT, data); + checkGLError(ok, 'floating-point texture allocation should succeed', gl.NO_ERROR); + + // Try respecifying data + gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.FLOAT, data); + checkGLError(ok, 'floating-point texture sub image should succeed', gl.NO_ERROR); +})(); + +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_uninit_data.html b/dom/canvas/test/webgl-mochitest/test_uninit_data.html new file mode 100644 index 000000000..541cfdbe5 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_uninit_data.html @@ -0,0 +1,84 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta http-equiv='content-type' content='text/html; charset=utf-8'/> + + <title>Test contents of uninitialized buffers</title> + + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + <script src='webgl-util.js'></script> +</head> + +<body> +<script> +'use strict'; + +function TestFB(gl) { + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + ok(status == gl.FRAMEBUFFER_COMPLETE, 'FB should be complete.'); + + var pixel = new Uint8Array(4); + gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + ok(!pixel[0], 'R channel should be 0, was ' + pixel[0] + '.'); + ok(!pixel[1], 'G channel should be 0, was ' + pixel[1] + '.'); + ok(!pixel[2], 'B channel should be 0, was ' + pixel[2] + '.'); + ok(!pixel[3], 'A channel should be 0, was ' + pixel[3] + '.'); +} + +function Test(contextAttribs) { + ok(true, '==============================='); + ok(true, 'Testing ' + JSON.stringify(contextAttribs)); + + var c = document.createElement('canvas'); + var gl = c.getContext('webgl', contextAttribs); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + + var err = gl.getError(); + ok(!err, 'Error should be 0x0, was 0x' + err.toString(16)); + if (err) + return; + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + + ok(true, 'Backed with RB'); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, 1); + TestFB(gl); + + ok(true, 'Backed with texture'); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + TestFB(gl); + + err = gl.getError(); + ok(!err, 'Error should be 0x0, was 0x' + err.toString(16)); +} + +// Give ourselves a scope to return early from: +(function() { + // We test multiple configurations because we've had bugs regarding faking RGBX on + // ANGLE: With alpha:false, uninitialized buffers were being filled with (0,0,0,1) + // instead of (0,0,0,0). + Test({alpha: false, antialias: false}); + Test({alpha: true, antialias: false}); + Test({alpha: false, antialias: true}); + Test({alpha: true, antialias: true}); + + ok(true, 'Test complete.'); +})(); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html new file mode 100644 index 000000000..3ec6c1909 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_alpha_luminance.html @@ -0,0 +1,114 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> +<title>WebGL2 test: Alpha and Luminance Textures</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<script id="vs" type="x-shader/x-vertex" +>#version 300 es + +in vec2 aTexCoord; +out vec2 vTexCoord; + +void main() { + vec2 pos = vec2(2.0)*aTexCoord - vec2(1.0); + gl_Position = vec4(pos, 0.0, 1.0); + vTexCoord = aTexCoord; +} +</script> +<script id="fs" type="x-shader/x-fragment" +>#version 300 es +precision mediump float; + +in vec2 vTexCoord; +uniform sampler2D uTex; +out vec4 oFragColor; + +void main() { + oFragColor = texture(uTex, vTexCoord); +} +</script> +<body> +<canvas id="c" width="32" height="32"></canvas> +<script> + WebGLUtil.withWebGL2('c', function(gl) { + + function testPixel(x, y, refData, infoPrefix) { + var pixel = new Uint8Array(4); + gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel); + + var pixelMatches = (pixel[0] == refData[0] && + pixel[1] == refData[1] && + pixel[2] == refData[2] && + pixel[3] == refData[3]); + var expectedStr = '[' + refData.join(', ') + ']'; + var actualStr = '[' + pixel.join(', ') + ']'; + + if (pixelMatches) { + ok(true, infoPrefix + 'Expected ' + expectedStr + '.'); + } else { + ok(false, infoPrefix + 'Expected ' + expectedStr + ', was ' + actualStr + '.'); + } + } + + function testTexture(details, prog) { + prog.aTexCoord = gl.getAttribLocation(prog, "aTexCoord"); + ok(prog.aTexCoord >= 0, '`aTexCoord` should be valid.'); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, details.format, 1, 1, 0, + details.format, gl.UNSIGNED_BYTE, details.texData); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + gl.useProgram(prog); + gl.vertexAttribPointer(prog.aTexCoord, 2, gl.FLOAT, false, 0, 0); + gl.enableVertexAttribArray(prog.aTexCoord); + + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + testPixel(0, 0, details.result, details.info + ': '); + return true; + } + + var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs'); + if (!prog) { + ok(false, 'Program linking should succeed.'); + return false; + } + + gl.disable(gl.DEPTH_TEST); + + var vertData = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertData); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0, 0, 1, 0, 0, 1, 1, 1 ]), gl.STATIC_DRAW); + + gl.clearColor(0, 0, 1, 1); + gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); + + var details = [ + { info: 'Luminance8', format: gl.LUMINANCE, texData: new Uint8Array([ 128 ]), + result: [128, 128, 128, 255] }, + { info: 'Alpha8', format: gl.ALPHA, texData: new Uint8Array([ 128 ]), + result: [0, 0, 0, 128] }, + { info: 'Luminance8Alpha8', format: gl.LUMINANCE_ALPHA, texData: new Uint8Array([ 128, 128 ]), + result: [128, 128, 128, 128] }, + ]; + + for (var i = 0; i < details.length; i++) { + if (!testTexture(details[i], prog)) { + return; + } + } + ok(true, 'Test complete.'); + }, function() { + SimpleTest.finish(); + }); + + SimpleTest.waitForExplicitFinish(); +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html new file mode 100644 index 000000000..6a384e1b9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_invalidate_framebuffer.html @@ -0,0 +1,27 @@ +<!DOCTYPE HTML> +<meta http-equiv="content-type" content="text/html; charset=utf-8" /> + +<title>WebGL2 test: Framebuffers</title> + +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<script src="webgl-util.js"></script> +<body> +<canvas id="c" width="64" height="64"></canvas> +<script> + +WebGLUtil.withWebGL2('c', function (gl) { + gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR]); + ok(gl.getError() == 0, 'invalidateFramebuffer'); + gl.invalidateSubFramebuffer(gl.FRAMEBUFFER, [gl.COLOR], 0, 0, 64, 64); + ok(gl.getError() == 0, 'invalidateSubFramebuffer'); + gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.GL_COLOR_ATTACHMENT0]); + ok(gl.getError() == gl.INVALID_ENUM, 'invalidateFrameBuffer should fail with GL_COLOR_ATTACHMENT on the default framebuffer'); +}, function () { + SimpleTest.finish(); +}); + +SimpleTest.waitForExplicitFinish(); + +</script> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html new file mode 100644 index 000000000..d8d2f54c0 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl2_not_exposed.html @@ -0,0 +1,37 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: WebGL2RenderingContext only exposed when appropriate</title> +<script src='/tests/SimpleTest/SimpleTest.js'></script> +<link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> + +function ShouldExpose() { + try { + return SpecialPowers.getBoolPref('webgl.enable-webgl2'); + } catch (e) {} + + return false; +} + +function DoesExpose() { + try { + null instanceof WebGL2RenderingContext; + return true; + } catch (e) {} + + return false; +} + +var doesExpose = DoesExpose(); +if (ShouldExpose()) { + ok(doesExpose, 'WebGL2RenderingContext should be exposed.'); +} else { + ok(!doesExpose, 'WebGL2RenderingContext should not be exposed.'); +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_available.html b/dom/canvas/test/webgl-mochitest/test_webgl_available.html new file mode 100644 index 000000000..f6817c985 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_available.html @@ -0,0 +1,19 @@ +<!DOCTYPE HTML> +<html> + <head> + <meta charset='utf-8'/> + <title>WebGL test: Check that WebGL works out-of-the-box.</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"> + </head> + <body> + <script> + +'use strict'; +var c = document.createElement('canvas'); +var gl = c.getContext('experimental-webgl'); +ok(gl, 'Expected WebGL creation to succeed.'); + + </script> + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_color_buffer_float.html b/dom/canvas/test/webgl-mochitest/test_webgl_color_buffer_float.html new file mode 100644 index 000000000..94a75fa91 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_color_buffer_float.html @@ -0,0 +1,486 @@ +<html> + <head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> + </head> + <body> +<script id='vs' type='x-shader/x-vertex'> + +attribute vec2 aVertCoord; + +void main(void) { + gl_Position = vec4(aVertCoord, 0.0, 1.0); +} + +</script> +<script id='fs' type='x-shader/x-fragment'> + +precision mediump float; // 💩 + +uniform vec4 uFragColor; + +void main(void) { + gl_FragColor = uFragColor; +} + +</script> + +<canvas id='c' width='200' height='200'></canvas> + +<script> + +function GetGLSLByElemId(elemId) { + var elem = document.getElementById(elemId); + if (!elem) + throw 'Bad `elemId`: ' + elemId; + + return elem.innerHTML.trim(); +} + +function ProgramByElemIds(gl, vsId, fsId) { + var vs = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vs, GetGLSLByElemId(vsId)); + gl.compileShader(vs); + + var fs = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fs, GetGLSLByElemId(fsId)); + gl.compileShader(fs); + + var prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + + gl.linkProgram(prog); + + var success = gl.getProgramParameter(prog, gl.LINK_STATUS); + if (success) + return prog; + + console.log('Error linking program for \'' + vsId + '\' and \'' + fsId + '\'.'); + console.log('\nLink log: ' + gl.getProgramInfoLog(prog)); + console.log('\nVert shader log: ' + gl.getShaderInfoLog(vs)); + console.log('\nFrag shader log: ' + gl.getShaderInfoLog(fs)); + return null; +} + +var RGBA = 0x1908; +var UNSIGNED_BYTE = 0x1401; +var FLOAT = 0x1406; +var HALF_FLOAT_OES = 0x8D61; +var HALF_FLOAT = 0x140B; +var RGBA4 = 0x8056; +var RGBA8 = 0x8058; +var RGBA32F = 0x8814; +var RGBA16F = 0x881A; + +function EnumName(val) { + switch (val) { + case RGBA: + return 'RGBA'; + case UNSIGNED_BYTE: + return 'UNSIGNED_BYTE'; + case FLOAT: + return 'FLOAT'; + case HALF_FLOAT_OES: + return 'HALF_FLOAT_OES'; + case HALF_FLOAT: + return 'HALF_FLOAT'; + case RGBA4: + return 'RGBA4'; + case RGBA32F: + return 'RGBA32F'; + default: + throw 'Unknown enum: 0x' + val.toString(16); + } +} + +var gl; + +function RGBAToString(arr) { + return '[' + arr[0].toPrecision(4) + ', ' + + arr[1].toPrecision(4) + ', ' + + arr[2].toPrecision(4) + ', ' + + arr[3].toPrecision(4) + ']'; +} + +function TestScreenColor(gl, isFBFloat, r, g, b, a) { + var readType = isFBFloat ? FLOAT : UNSIGNED_BYTE; + + var arr; + switch (readType) { + case gl.UNSIGNED_BYTE: + arr = new Uint8Array(4); + break; + + case gl.FLOAT: + arr = new Float32Array(4); + break; + + default: + throw 'Bad `readType`.'; + } + + gl.readPixels(0, 0, 1, 1, gl.RGBA, readType, arr); + + var err = gl.getError(); + ok(err == 0, 'Should be no errors.'); + if (err) + return; + + var floatArr; + switch (readType) { + case gl.UNSIGNED_BYTE: + floatArr = new Float32Array(4); + floatArr[0] = arr[0] / 255.0; + floatArr[1] = arr[1] / 255.0; + floatArr[2] = arr[2] / 255.0; + floatArr[3] = arr[3] / 255.0; + break; + + case gl.FLOAT: + floatArr = arr; + break; + + default: + throw 'Bad `readType`.'; + } + + var testText = RGBAToString(floatArr); + var refText = RGBAToString([r, g, b, a]); + + var eps = 1.0 / 255.0; + var isSame = (Math.abs(floatArr[0] - r) < eps && + Math.abs(floatArr[1] - g) < eps && + Math.abs(floatArr[2] - b) < eps && + Math.abs(floatArr[3] - a) < eps); + + ok(isSame, 'Should be ' + refText + ', was ' + testText + ','); +} + +function TestReadFormat(gl, isFBFloat, format, type) { + var err = gl.getError(); + if (err) { + ok(false, 'Should be no error at start of TestReadFormat(). (0x' + err.toString(16) + ')'); + return; + } + var implFormat = gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT); + var implType = gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE); + + var err = gl.getError(); + if (err) { + ok(false, 'Should be no error at start2 of TestReadFormat(). (0x' + err.toString(16) + ')'); + return; + } + + var defaultReadType = isFBFloat ? FLOAT : UNSIGNED_BYTE; + + var formatOk = (format == gl.RGBA && + type == defaultReadType); + + if (format == implFormat && + type == implType) + { + formatOk = true; + } + + var w = 1; + var h = 1; + var channels = 4; + var arrSize = w * h * channels; + + var arr; + switch (type) { + case UNSIGNED_BYTE: + arr = new Uint8Array(arrSize); + break; + + case FLOAT: + arr = new Float32Array(arrSize); + break; + + case HALF_FLOAT_OES: + case HALF_FLOAT: + arr = new Uint16Array(arrSize); + break; + + default: + throw 'Bad `type`: 0x' + type.toString(16); + } + + gl.readPixels(0, 0, 1, 1, format, type, arr); + var wasOk = gl.getError() == 0; + + var text = 'Should ' + (formatOk ? '' : 'not ') + 'allow reading with ' + + EnumName(format) + '/' + EnumName(type) + '.' + ok(wasOk == formatOk, text); +} + +function TestError(gl, expectedErr, descText) { + var err = gl.getError(); + + while (gl.getError()) {} + + ok(err == expectedErr, + descText + ': Error should be 0x' + expectedErr.toString(16) + ', was 0x' + + err.toString(16) + '.'); + + return err; +} + +function AttachRBToCurFB(gl, sizedFormat) { + var isSupported; + switch (sizedFormat) { + case RGBA4: + isSupported = true; + break; + + case RGBA16F: + isSupported = !!gl.getExtension('EXT_color_buffer_half_float'); + break; + + case RGBA32F: + isSupported = !!gl.getExtension('WEBGL_color_buffer_float'); + break; + + default: + throw 'Bad `sizedFormat`.'; + } + + var rb = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, rb); + gl.renderbufferStorage(gl.RENDERBUFFER, sizedFormat, 1, 1); + + var correctError = isSupported ? 0 : gl.INVALID_ENUM; + var err = TestError(gl, correctError, 'RB specification with supported format'); + if (err) + return false; + + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rb); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + var isComplete = (status == gl.FRAMEBUFFER_COMPLETE); + ok(isComplete, 'Framebuffer should be complete after RB attachment.'); + return isComplete; +} + +function AttachTexToCurFB(gl, sizedFormat) { + var canCreate; + var isAttachGuaranteed; + var format; + var type; + + switch (sizedFormat) { + case RGBA8: + canCreate = true; + isAttachGuaranteed = true; + format = RGBA; + type = UNSIGNED_BYTE; + break; + + case RGBA16F: + canCreate = !!gl.getExtension('OES_texture_half_float'); + isAttachGuaranteed = !!gl.getExtension('EXT_color_buffer_half_float'); + format = RGBA; + type = HALF_FLOAT_OES; + break; + + case RGBA32F: + canCreate = !!gl.getExtension('OES_texture_float'); + isAttachGuaranteed = !!gl.getExtension('WEBGL_color_buffer_float'); + format = RGBA; + type = FLOAT; + break; + + default: + throw 'Bad `sizedFormat`.'; + } + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texImage2D(gl.TEXTURE_2D, 0, format, 1, 1, 0, format, type, null); + + var correctError = canCreate ? 0 : gl.INVALID_ENUM; + var err = TestError(gl, correctError, 'Tex specification with supported format'); + if (err) + return false; + + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); + + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); + var isComplete = (status == gl.FRAMEBUFFER_COMPLETE); + + if (!isAttachGuaranteed && !isComplete) + todo(false, 'Framebuffer needn\'t be complete after tex attachment.'); + else + ok(isComplete, 'Framebuffer should be complete after tex attachment.'); + + return isComplete; +} + +function IsFormatFloat(sizedFormat) { + switch (sizedFormat) { + case RGBA4: + case RGBA8: + return false; + + case RGBA16F: + case RGBA32F: + return true; + + default: + throw 'Bad `sizedFormat`.'; + } +} + +function TestType(gl, prog, isTex, sizedFormat) { + TestError(gl, 0, 'At start of TestRB()'); + + var isAttached = isTex ? AttachTexToCurFB(gl, sizedFormat) + : AttachRBToCurFB(gl, sizedFormat); + if (!isAttached) + return; + + var isFormatFloat = IsFormatFloat(sizedFormat); + + TestReadFormat(gl, isFormatFloat, gl.RGBA, gl.UNSIGNED_BYTE); + TestReadFormat(gl, isFormatFloat, gl.RGBA, gl.FLOAT); + TestReadFormat(gl, isFormatFloat, gl.RGBA, HALF_FLOAT); + TestReadFormat(gl, isFormatFloat, gl.RGBA, HALF_FLOAT_OES); + + ////////////////////////////////////// + + ok(true, 'Drawing:'); + + gl.clearColor(0.0, 1.5, 0.5, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + + if (isFormatFloat) + TestScreenColor(gl, isFormatFloat, 0, 1.5, 0.5, 1); + else + TestScreenColor(gl, isFormatFloat, 0, 1, 0.5, 1); + + //////// + + ok(true, 'Clearing:'); + + gl.uniform4f(prog.uFragColor, 0, 0.5, 1.5, 1); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + if (isFormatFloat) + TestScreenColor(gl, isFormatFloat, 0, 0.5, 1.5, 1); + else + TestScreenColor(gl, isFormatFloat, 0, 0.5, 1.0, 1); + + //////// + + ok(true, 'Blending:'); + + gl.enable(gl.BLEND); + gl.blendFunc(gl.CONSTANT_COLOR, gl.ZERO); + gl.blendColor(0, 10, 0.1, 1); + + gl.uniform4f(prog.uFragColor, 0, 0.5, 15.0, 1); + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + if (isFormatFloat) + TestScreenColor(gl, isFormatFloat, 0, 5.0, 1.5, 1); + else + TestScreenColor(gl, isFormatFloat, 0, 0.5, 0.1, 1); + + gl.disable(gl.BLEND); + + ////////////////////////////////////// +} + +// Give ourselves a scope to return early from: +(function() { + var canvas = document.getElementById('c'); + var attribs = { + antialias: false, + depth: false, + }; + gl = canvas.getContext('experimental-webgl', attribs); + if (!gl) { + todo(false, 'WebGL is unavailable.'); + return; + } + + var cbf = gl.getExtension('WEBGL_color_buffer_float'); + var cbhf = gl.getExtension('EXT_color_buffer_half_float'); + + ////////////////////////////////////// + + gl.viewport(0, 0, 1, 1); + + var prog = ProgramByElemIds(gl, 'vs', 'fs'); + ok(prog, 'Program should link.'); + if (!prog) + return; + + prog.aVertCoord = gl.getAttribLocation(prog, 'aVertCoord'); + prog.uFragColor = gl.getUniformLocation(prog, 'uFragColor'); + + gl.useProgram(prog); + + var arr = new Float32Array([ + -1, -1, + 1, -1, + -1, 1, + 1, 1, + ]); + var vb = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vb); + gl.bufferData(gl.ARRAY_BUFFER, arr, gl.STATIC_DRAW); + + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); + + ////////////////////////////////////// + + var fb = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); + + error = gl.getError(); + ok(error == 0, 'Should be no errors after setup. (0x' + error.toString(16) + ')'); + + ////////////////////////////////////// + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA8 texture'); + TestType(gl, prog, true, RGBA8); + + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA16F texture'); + TestType(gl, prog, true, RGBA16F); + + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA32F texture'); + TestType(gl, prog, true, RGBA32F); + + //////// + + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA4 renderbuffer'); + TestType(gl, prog, false, RGBA4); + + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA16F renderbuffer'); + TestType(gl, prog, false, RGBA16F); + + ok(true, '---------------------------------------------------------------------------'); + ok(true, 'RGBA32F renderbuffer'); + TestType(gl, prog, false, RGBA32F); + + ok(true, '---------------------------------------------------------------------------'); + ////////////////////////////////////// + + error = gl.getError(); + ok(error == 0, 'Should be no errors after test.'); + + ok(true, 'TEST COMPLETE'); +})(); + +</script> + + </body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html new file mode 100644 index 000000000..48dee2fc6 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_compressed_texture_es3.html @@ -0,0 +1,753 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="es3-data.js"></script> +<title>WebGL test: test WEBGL_compressed_texture_es3 extension</title> +<style> +img { + border: 1px solid black; + margin-right: 1em; +} +.testimages { +} + +.testimages br { + clear: both; +} + +.testimages > div { + float: left; + margin: 1em; +} +</style> +</head> +<body> +<div id="description"></div> +<canvas id="canvas" width="8" height="8"></canvas> +<div id="console"></div> +<script id="vshader" type="x-shader/x-vertex"> + attribute vec4 vPosition; + attribute vec2 texCoord0; + varying vec2 texCoord; + void main() { + gl_Position = vPosition; + texCoord = texCoord0; + } +</script> +<script id="fshader" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + gl_FragData[0] = texture2D(tex, texCoord); + } +</script> +<script id="fshader-r" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + vec4 pixel = (texture2D(tex, texCoord)); + pixel.r = (pixel.r + 1.0) / 2.0; + gl_FragData[0] = pixel; + } +</script> +<script id="fshader-rg" type="x-shader/x-fragment"> + precision mediump float; + uniform sampler2D tex; + varying vec2 texCoord; + void main() { + vec4 pixel = (texture2D(tex, texCoord)); + pixel.rg = (pixel.rg + 1.0) / 2.0; + gl_FragData[0] = pixel; + } +</script> +<script> +"use strict"; +var ext = null; +var vao = null; +var gl = null; +var validFormats = { + COMPRESSED_R11_EAC : 0x9270, + COMPRESSED_SIGNED_R11_EAC : 0x9271, + COMPRESSED_RG11_EAC : 0x9272, + COMPRESSED_SIGNED_RG11_EAC : 0x9273, + COMPRESSED_RGB8_ETC2 : 0x9274, + COMPRESSED_SRGB8_ETC2 : 0x9275, + COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9276, + COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 : 0x9277, + COMPRESSED_RGBA8_ETC2_EAC : 0x9278, + COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : 0x9279, +}; +var name; +var supportedFormats; + +function setupUnitQuad() { + var vertexObject = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 1.0, 1.0, 0.0, + -1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + 1.0, 1.0, 0.0, + -1.0, -1.0, 0.0, + 1.0, -1.0, 0.0]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(0); + gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); + + var vertexObject = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ + 1.0, 1.0, + 0.0, 1.0, + 0.0, 0.0, + 1.0, 1.0, + 0.0, 0.0, + 1.0, 0.0]), gl.STATIC_DRAW); + gl.enableVertexAttribArray(1); + gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0); +} + +function runTest() { + gl = WebGLUtil.getWebGL("canvas", false, {antialias: false}); + if (!gl) { + ok(false, "WebGL context does not exist"); + } else { + ok(true, "WebGL context exists"); + setupUnitQuad(); + + // Run tests with extension disabled + runTestDisabled(); + + // Query the extension and store globally so shouldBe can access it + ext = gl.getExtension("WEBGL_compressed_texture_es3"); + if (!ext) { + ok(true, "No WEBGL_compressed_texture_es3 support -- this is legal"); + runSupportedTest(false); + } else { + ok(true, "Successfully enabled WEBGL_compressed_texture_es3 extension"); + + runSupportedTest(true); + runTestExtension(); + } + } + SimpleTest.finish(); +} + +function runSupportedTest(extensionEnabled) { + var supported = gl.getSupportedExtensions(); + if (supported.indexOf("WEBGL_compressed_texture_es3") >= 0) { + if (extensionEnabled) { + ok(true, "WEBGL_compressed_texture_es3 listed as supported and getExtension succeeded"); + } else { + ok(false, "WEBGL_compressed_texture_es3 listed as supported but getExtension failed"); + } + } else { + if (extensionEnabled) { + ok(false, "WEBGL_compressed_texture_es3 not listed as supported but getExtension succeeded"); + } else { + ok(true, "WEBGL_compressed_texture_es3 not listed as supported and getExtension failed -- this is legal"); + } + } +} + +function runTestDisabled() { + is(gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS).length, 0, + "Should be no compressed texture formats"); +} + +function formatExists(format, supportedFormats) { + for (var ii = 0; ii < supportedFormats.length; ++ii) { + if (format == supportedFormats[ii]) { + ok(true, "supported format " + formatToString(format) + " is exists"); + return; + } + } + ok(false, "supported format " + formatToString(format) + " does not exist"); +} + +function formatToString(format) { + for (var p in ext) { + if (ext[p] == format) { + return p; + } + } + return "0x" + format.toString(16); +} + +function runTestExtension() { + // check that all format enums exist. + for (name in validFormats) { + is(ext[name], validFormats[name], "format is match"); + } + + supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS); + // There should be exactly 10 formats + is(supportedFormats.length, 10, "Should be exactly 10 formats"); + + // check that all 10 formats exist + for (var name in validFormats.length) { + formatExists(validFormats[name], supportedFormats); + } + + // Test each format + testETC2_RGB(); +} + +function testETC2_RGB() { + var tests = [ + { + width: 4, + height: 4, + channels: 1, + data: img_4x4_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 4, + height: 4, + channels: 1, + data: img_4x4_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 4, + height: 4, + channels: 2, + data: img_4x4_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 4, + height: 4, + channels: 2, + data: img_4x4_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 4, + height: 4, + channels: 3, + data: img_4x4_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 4, + height: 4, + channels: 3, + data: img_4x4_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 4, + height: 4, + channels: 4, + data: img_4x4_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + { + width: 8, + height: 8, + channels: 1, + data: img_8x8_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 8, + height: 8, + channels: 1, + data: img_8x8_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 8, + height: 8, + channels: 2, + data: img_8x8_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 8, + height: 8, + channels: 2, + data: img_8x8_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 8, + height: 8, + channels: 3, + data: img_8x8_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 8, + height: 8, + channels: 3, + data: img_8x8_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 8, + height: 8, + channels: 4, + data: img_8x8_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + { + width: 32, + height: 32, + channels: 1, + data: img_32x32_r11_eac, + format: ext.COMPRESSED_R11_EAC + }, + { + width: 32, + height: 32, + channels: 1, + data: img_32x32_signed_r11_eac, + format: ext.COMPRESSED_SIGNED_R11_EAC + }, + { + width: 32, + height: 32, + channels: 2, + data: img_32x32_rg11_eac, + format: ext.COMPRESSED_RG11_EAC + }, + { + width: 32, + height: 32, + channels: 2, + data: img_32x32_signed_rg11_eac, + format: ext.COMPRESSED_SIGNED_RG11_EAC + }, + { + width: 32, + height: 32, + channels: 3, + data: img_32x32_rgb_etc2, + format: ext.COMPRESSED_RGB8_ETC2 + }, + { + width: 32, + height: 32, + channels: 3, + data: img_32x32_rgb_etc2, + format: ext.COMPRESSED_SRGB8_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgb_punchthrough_etc2, + format: ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgb_punchthrough_etc2, + format: ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgba_etc2, + format: ext.COMPRESSED_RGBA8_ETC2_EAC + }, + { + width: 32, + height: 32, + channels: 4, + data: img_32x32_rgba_etc2, + format: ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC + }, + ]; + testETCTextures(tests); +} + +function testETCTextures(tests) { + for (var ii = 0; ii < tests.length; ++ii) { + testETCTexture(tests[ii]); + } +} + +/* Return the size of block in bytes */ +function getBlockSize(format) { + switch (format) { + case ext.COMPRESSED_R11_EAC: + case ext.COMPRESSED_SIGNED_R11_EAC: + case ext.COMPRESSED_RGB8_ETC2: + case ext.COMPRESSED_SRGB8_ETC2: + case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + return 8; + case ext.COMPRESSED_RG11_EAC: + case ext.COMPRESSED_SIGNED_RG11_EAC: + case ext.COMPRESSED_RGBA8_ETC2_EAC: + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + return 16 + } +} + +function copyRect(data, srcX, srcY, dstX, dstY, width, height, stride) { + var bytesPerLine = width * 4; + var srcOffset = srcX * 4 + srcY * stride; + var dstOffset = dstX * 4 + dstY * stride; + for (var jj = height; jj > 0; --jj) { + for (var ii = 0; ii < bytesPerLine; ++ii) { + data[dstOffset + ii] = data[srcOffset + ii]; + } + srcOffset += stride; + dstOffset += stride; + } +} + +function testETCTexture(test) { + var data = new Uint8Array(test.data.compressed); + var width = test.width; + var height = test.height; + var format = test.format; + + var uncompressedData = new Uint8Array(test.data.decompressed); + var glErrorShouldBe = (gl, glError, msg) => { + msg = msg || ""; + var err = gl.getError(); + var getGLErrorAsString = err => { + if (err === gl.NO_ERROR) { + return "NO_ERROR"; + } + for (var name in gl) { + if (gl[name] === err) { + return name; + } + } + return err.toString(); + } + + if (err != glError) { + ok(false, "getError expected: " + getGLErrorAsString(glError) + + ". Was " + getGLErrorAsString(err) + " : " + msg); + } else { + ok(true, "getError was expected value: " + + getGLErrorAsString(glError) + " : " + msg); + } + }; + + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, width, height); + + var tex = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, tex); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.generateMipmap(gl.TEXTURE_2D); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "trying to generate mipmaps from compressed texture"); + if (format == ext.COMPRESSED_SIGNED_R11_EAC) { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-r'); + } else if (format == ext.COMPRESSED_SIGNED_RG11_EAC) { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader-rg'); + } else { + var program = WebGLUtil.createProgramByIds(gl, 'vshader', 'fshader'); + } + gl.bindAttribLocation(program, 0, 'vPosition'); + gl.bindAttribLocation(program, 1, 'texCoord0'); + gl.useProgram(program); + + gl.clearColor(1.0, 1.0, 1.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLES, 0, 6); + compareRect(width, height, test.channels, width, height, uncompressedData, data, format); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 1, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "non 0 border"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width + 4, height, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height + 4, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 4, height, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 4, 0, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 1, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width - 2, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 1, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height - 2, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "non multiple-of-4 supported"); + + if (width == 4) { + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 1, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, 2, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + } + if (height == 4) { + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 1, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + gl.compressedTexImage2D(gl.TEXTURE_2D, 1, format, width, 2, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "valid dimensions for level > 0"); + } + + // pick a wrong format that uses the same amount of data. + var wrongFormat; + switch (format) { + case ext.COMPRESSED_R11_EAC: + wrongFormat = ext.COMPRESSED_SIGNED_R11_EAC; + break; + case ext.COMPRESSED_SIGNED_R11_EAC: + wrongFormat = ext.COMPRESSED_R11_EAC; + break; + case ext.COMPRESSED_RG11_EAC: + wrongFormat = ext.COMPRESSED_SIGNED_RG11_EAC; + break; + case ext.COMPRESSED_SIGNED_RG11_EAC: + wrongFormat = ext.COMPRESSED_RG11_EAC; + break; + case ext.COMPRESSED_RGB8_ETC2: + wrongFormat = ext.COMPRESSED_SRGB8_ETC2; + break; + case ext.COMPRESSED_SRGB8_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + wrongFormat = ext.COMPRESSED_RGB8_ETC2; + break; + case ext.COMPRESSED_RGBA8_ETC2_EAC: + wrongFormat = ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC; + break; + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + wrongFormat = ext.COMPRESSED_RGBA8_ETC2_EAC; + break; + } + + // Restore original texture. + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, wrongFormat, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "format does not match"); + + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width + 4, height, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height + 4, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 4, height, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 4, format, data); + glErrorShouldBe(gl, gl.INVALID_VALUE, "data size does not match dimensions"); + + gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 1, height, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width - 2, height, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 1, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height - 2, format, data); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid dimensions"); + + var subData = new Uint8Array(data.buffer, 0, getBlockSize(format)); + + if (width == 8 && height == 8) { + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 1, 0, 4, 4, format, subData); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset"); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 1, 4, 4, format, subData); + glErrorShouldBe(gl, gl.INVALID_OPERATION, "invalid offset"); + } + + if (width < 32 && height < 32) { + var stride = width * 4; + for (var yoff = 0; yoff < height; yoff += 4) { + for (var xoff = 0; xoff < width; xoff += 4) { + copyRect(uncompressedData, 0, 0, xoff, yoff, 4, 4, stride); + gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, xoff, yoff, 4, 4, format, subData); + glErrorShouldBe(gl, gl.NO_ERROR, "uploading compressed texture"); + gl.clearColor(1.0, 1.0, 1.0, 1.0); + gl.clear(gl.COLOR_BUFFER_BIT); + gl.drawArrays(gl.TRIANGLES, 0, 6); + compareRect(width, height, test.channels, width, height, uncompressedData, data, format); + } + } + } +} + +function insertImg(element, caption, img) { + var div = document.createElement("div"); + div.appendChild(img); + var label = document.createElement("div"); + label.appendChild(document.createTextNode(caption)); + div.appendChild(label); + element.appendChild(div); +} + +function convertToSRGB(val) { + var norm = val / 255.0; + var res = 0; + if (norm <= 0.04045) { + res = norm / 12.92; + } else { + res = Math.pow(((norm + 0.055)/1.055), 2.4); + } + + return res * 255.0; +} + +function makeImage(imageWidth, imageHeight, dataWidth, data, alpha) { + var scale = 8; + var c = document.createElement("canvas"); + c.width = imageWidth * scale; + c.height = imageHeight * scale; + var ctx = c.getContext("2d"); + for (var yy = 0; yy < imageHeight; ++yy) { + for (var xx = 0; xx < imageWidth; ++xx) { + var offset = (yy * dataWidth + xx) * 4; + ctx.fillStyle = "rgba(" + + data[offset + 0] + "," + + data[offset + 1] + "," + + data[offset + 2] + "," + + (alpha ? data[offset + 3] / 255 : 1) + ")"; + ctx.fillRect(xx * scale, yy * scale, scale, scale); + } + } + var img = document.createElement("img"); + img.src = c.toDataURL(); + return img; +} + +function compareRect(actualWidth, actualHeight, actualChannels, + dataWidth, dataHeight, expectedData, + testData, testFormat) +{ + var actual = new Uint8Array(actualWidth * actualHeight * 4); + gl.readPixels( + 0, 0, actualWidth, actualHeight, gl.RGBA, gl.UNSIGNED_BYTE, actual); + + var div = document.createElement("div"); + div.className = "testimages"; + var hasAlpha = actualChannels == 4; + var imgExpected = makeImage(actualWidth, actualHeight, dataWidth, expectedData, hasAlpha); + var imgActual = makeImage(actualWidth, actualHeight, actualWidth, actual, hasAlpha); + insertImg(div, "expected", imgExpected); + insertImg(div, "actual", imgActual); + div.appendChild(document.createElement('br')); + document.getElementById("console").appendChild(div); + + var failed = false; + for (var yy = 0; yy < actualHeight; ++yy) { + for (var xx = 0; xx < actualWidth; ++xx) { + var actualOffset = (yy * actualWidth + xx) * 4; + var expectedOffset = (yy * dataWidth + xx) * 4; + var expected = expectedData.slice(expectedOffset, expectedOffset + 4); + + var maxDiffPixel = 0; + switch (testFormat) { + case ext.COMPRESSED_SRGB8_ETC2: + case ext.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: + case ext.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: + + // Alpha shouldn't do conversion. + for (var i = 0; i < 3; ++i) { + expected[i] = convertToSRGB(expected[i]); + } + //fallthrough + case ext.COMPRESSED_R11_EAC: + case ext.COMPRESSED_RG11_EAC: + case ext.COMPRESSED_SIGNED_R11_EAC: + case ext.COMPRESSED_SIGNED_RG11_EAC: + // Due to floating round error, we need fuzzy test here. + var maxDiffPixel = 1; + break; + default: + var maxDiffPixel = 0; + break; + } + + for (var channel = 0; channel < actualChannels; ++channel) { + var diff = Math.abs(expected[channel] - actual[actualOffset + channel]); + + if (diff > maxDiffPixel) { + failed = true; + var was = actual.slice(actualOffset, actualOffset + 4).join(); + ok(false, 'at (' + xx + ', ' + yy + + ') expected: ' + expected.join() + ' was ' + was); + break; + } + } + } + } + if (!failed) { + ok(true, "texture rendered correctly"); + } +} + +var prefArrArr = [ + ['webgl.enable-draft-extensions', true], +]; +var prefEnv = {'set': prefArrArr}; +SimpleTest.waitForExplicitFinish(); +SpecialPowers.pushPrefEnv(prefEnv, runTest); +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_conformance.html b/dom/canvas/test/webgl-mochitest/test_webgl_conformance.html new file mode 100644 index 000000000..b4d1407f9 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_conformance.html @@ -0,0 +1,29 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: 'webgl' context request</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> + +var gl = WebGLUtil.getWebGL('c', true); + +var isMobile = /Mobile/.test(navigator.userAgent); +var isTablet = /Tablet/.test(navigator.userAgent); +var shouldBeConformant = !isMobile && !isTablet; + +if (shouldBeConformant) { + // Desktop. + ok(gl, 'Expected conformance on: ' + navigator.userAgent); +} else { + // Fennec, B2G. + ok(!gl, 'Expected no conformance on: ' + navigator.userAgent); +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html new file mode 100644 index 000000000..4b4611dd2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_force_enable.html @@ -0,0 +1,50 @@ +<!DOCTYPE HTML> +<html> +<head> +<title>WebGL test: Check that WebGL works (or not) if it should (or should not).</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="webgl-util.js"></script> +<script src="driver-info.js"></script> +</head> +<body> +<canvas id="c"></canvas> +<script> + +function test() { + ok(SpecialPowers.getBoolPref('webgl.force-enabled'), 'WebGL should be force-enabled.'); + + var shouldSucceed = true; + var shouldFail = false; + + if (DriverInfo.getOS() == DriverInfo.OS.ANDROID && + DriverInfo.getOSVersion() < 15) + { + // Consider 'random'. Actually, ARMv6 fails, and ARMv7 succeeds, but we have + // not been successful at determining this from JS. (see bug 917478) + shouldSucceed = false; + shouldFail = false; + } + + var gl = WebGLUtil.getWebGL('c'); + if (shouldSucceed) { + ok(gl, 'Expected WebGL creation to succeed.'); + } + if (shouldFail) { + ok(!gl, 'Expected WebGL creation to fail.'); + } + + SimpleTest.finish(); +} + +SimpleTest.waitForExplicitFinish(); + +var prefArrArr = [ + ['webgl.force-enabled', true] +]; +var prefEnv = {'set': prefArrArr}; +SpecialPowers.pushPrefEnv(prefEnv, test); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html new file mode 100644 index 000000000..d11584e08 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_context.html @@ -0,0 +1,36 @@ +<!DOCTYPE HTML> +<title>WebGL test: 'webgl' and 'experimental-webgl' context requests succeed, + 'moz-webgl' context requests fail.</title> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +<script src="driver-info.js"></script> +<body> +<canvas id="c1"></canvas> +<canvas id="c2"></canvas> +<script> + +var testFunc = ok; + +function testContextRetrieval(canvasId, creationId, shouldSucceed) { + var canvas = document.getElementById(canvasId); + ok(canvas, 'Invalid `canvasId`: ' + canvasId); + + var createdGL = canvas.getContext(creationId); + if (shouldSucceed) { + testFunc(createdGL, 'Request for \'' + creationId + '\' should succeed.'); + } else { + ok(!createdGL, 'Request for \'' + creationId + '\' should fail.'); + } +} + +SimpleTest.waitForExplicitFinish(); +SpecialPowers.pushPrefEnv({'set': [ + ['webgl.force-enabled', true] +]}, function() { + testContextRetrieval('c1', 'experimental-webgl', true); + testContextRetrieval('c2', 'moz-webgl', false); + SimpleTest.finish(); +}); + +</script> + diff --git a/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html new file mode 100644 index 000000000..8b8920603 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webgl_request_mismatch.html @@ -0,0 +1,90 @@ +<!DOCTYPE HTML> +<html> +<head> +<script src="/tests/SimpleTest/SimpleTest.js"></script> +<link rel="stylesheet" href="/tests/SimpleTest/test.css"> +</head> +<body> +<script> + +WEBGL_TYPES = {}; +WEBGL_TYPES['experimental-webgl'] = true; +WEBGL_TYPES['webgl'] = true; + +function AreBothIn(a, b, set) { + return (a in set) && (b in set); +} + +function IsAlias(typeA, typeB) { + if (typeA == typeB) + return true; + + if (AreBothIn(typeA, typeB, WEBGL_TYPES)) + return true; + + return false; +} + +function TestContextRetrieval(creationType, requestType, functionalTypeSet) { + var canvas = document.createElement('canvas'); + var createdGL = canvas.getContext(creationType); + + var didCreationSucceed = (createdGL != null); + if (creationType in functionalTypeSet) { + ok(createdGL, 'Context creation should succeed for type \'' + + creationType + '\''); + } else { + ok(!createdGL, 'Context creation should fail for type \'' + + creationType + '\''); + return; + } + + var requestedGL = canvas.getContext(requestType); + + if (requestType in functionalTypeSet && + IsAlias(creationType, requestType)) + { + ok(requestedGL, 'Request for \'' + requestType + '\' from \'' + + creationType + '\' should succeed.'); + ok(requestedGL == createdGL, 'Request for \'' + requestType + + '\' from \'' + creationType + + '\' should match.'); + } else { + ok(!requestedGL, 'Request for \'' + requestType + '\' from \'' + + creationType + '\' should fail.'); + } +} + +function IsWebGLFunctional() { + var canvas = document.createElement('canvas'); + return canvas.getContext('experimental-webgl') != null; +} + +function IsWebGLConformant() { + var canvas = document.createElement('canvas'); + return canvas.getContext('webgl') != null; +} + +var typeList = ['2d', 'experimental-webgl', 'webgl']; +var functionalTypeSet = {}; +functionalTypeSet['2d'] = true; + +if (IsWebGLFunctional()) + functionalTypeSet['experimental-webgl'] = true; + +if (IsWebGLConformant()) + functionalTypeSet['webgl'] = true; + +for (var i in typeList) { + var creationType = typeList[i]; + + for (var j in typeList) { + var requestType = typeList[j]; + + TestContextRetrieval(creationType, requestType, functionalTypeSet); + } +} + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html new file mode 100644 index 000000000..65d9b4eb2 --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/test_webglcontextcreationerror.html @@ -0,0 +1,66 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset='UTF-8'> + <script src='/tests/SimpleTest/SimpleTest.js'></script> + <link rel='stylesheet' href='/tests/SimpleTest/test.css'> +</head> +<body> +<script> +'use strict'; + +function RunWithPrefs(prefPairList, func) { + var prefEnv = {'set': prefPairList}; + try { + SpecialPowers.pushPrefEnv(prefEnv, func); + } catch (e) { + console.log('Warning: Failed to set prefs: ' + JSON.stringify(prefPairList)); + func(); + } +} + +//////////////////////////////////////// + +function Check(expr, text) { + ok(expr, text); + return expr; +} + +function TestWhenDisabled() { + var c = document.createElement('canvas'); + + var generatedEvent = null; + var f = function(event) { generatedEvent = event; }; + c.addEventListener('webglcontextcreationerror', f); + + var gl = c.getContext('webgl'); // Should fail. + + do { + if (!Check(!gl, 'When disabled, context creation should fail.')) + break; + + if (!Check(generatedEvent, 'Context creation failure should generate an event.')) + break; + + var reason = generatedEvent.statusMessage; + if (!Check(reason !== undefined, 'generatedEvent.statusMessage should be defined.')) + break; + + ok(reason.length, 'statusMessage should be non-empty.'); + } while (false); + + SimpleTest.finish(); +} + +//////////////////////////////////////// + +SimpleTest.waitForExplicitFinish(); + +var prefPairList = [ + ['webgl.disabled', true], +]; +RunWithPrefs(prefPairList, TestWhenDisabled); + +</script> +</body> +</html> diff --git a/dom/canvas/test/webgl-mochitest/webgl-util.js b/dom/canvas/test/webgl-mochitest/webgl-util.js new file mode 100644 index 000000000..21ef9cf0f --- /dev/null +++ b/dom/canvas/test/webgl-mochitest/webgl-util.js @@ -0,0 +1,170 @@ +WebGLUtil = (function() { + // --------------------------------------------------------------------------- + // Error handling (for obvious failures, such as invalid element ids) + + function defaultErrorFunc(str) { + console.log('Error: ' + str); + } + + var gErrorFunc = defaultErrorFunc; + function setErrorFunc(func) { + gErrorFunc = func; + } + + function error(str) { + gErrorFunc(str); + } + + // --------------------------------------------------------------------------- + // Warning handling (for failures that may be intentional) + + function defaultWarningFunc(str) { + console.log('Warning: ' + str); + } + + var gWarningFunc = defaultWarningFunc; + function setWarningFunc(func) { + gWarningFunc = func; + } + + function warning(str) { + gWarningFunc(str); + } + + // --------------------------------------------------------------------------- + // WebGL helpers + + function getWebGL(canvasId, requireConformant, attributes) { + // `requireConformant` will default to falsey if it is not supplied. + + var canvas = document.getElementById(canvasId); + + var gl = null; + try { + gl = canvas.getContext('webgl', attributes); + } catch(e) {} + + if (!gl && !requireConformant) { + try { + gl = canvas.getContext('experimental-webgl', attributes); + } catch(e) {} + } + + if (!gl) { + error('WebGL context could not be retrieved from \'' + canvasId + '\'.'); + return null; + } + + return gl; + } + + function withWebGL2(canvasId, callback, onFinished) { + var run = function() { + var canvas = document.getElementById(canvasId); + + var gl = null; + try { + gl = canvas.getContext('webgl2'); + } catch(e) {} + + if (!gl) { + todo(false, 'WebGL2 is not supported'); + onFinished(); + return; + } + + function errorFunc(str) { + ok(false, 'Error: ' + str); + } + setErrorFunc(errorFunc); + setWarningFunc(errorFunc); + + callback(gl); + onFinished(); + }; + + try { + var prefArrArr = [ + ['webgl.force-enabled', true], + ['webgl.enable-webgl2', true], + ]; + var prefEnv = {'set': prefArrArr}; + SpecialPowers.pushPrefEnv(prefEnv, run); + } catch (e) { + warning('No SpecialPowers, but trying WebGL2 anyway...'); + run(); + } + } + + function getContentFromElem(elem) { + var str = ""; + var k = elem.firstChild; + while (k) { + if (k.nodeType == 3) + str += k.textContent; + + k = k.nextSibling; + } + + return str; + } + + // Returns a valid shader, or null on errors. + function createShaderById(gl, id) { + var elem = document.getElementById(id); + if (!elem) { + error('Failed to create shader from non-existent id \'' + id + '\'.'); + return null; + } + + var src = getContentFromElem(elem); + + var shader; + if (elem.type == "x-shader/x-fragment") { + shader = gl.createShader(gl.FRAGMENT_SHADER); + } else if (elem.type == "x-shader/x-vertex") { + shader = gl.createShader(gl.VERTEX_SHADER); + } else { + error('Bad MIME type for shader \'' + id + '\': ' + elem.type + '.'); + return null; + } + + gl.shaderSource(shader, src); + gl.compileShader(shader); + + return shader; + } + + function createProgramByIds(gl, vsId, fsId) { + var vs = createShaderById(gl, vsId); + var fs = createShaderById(gl, fsId); + if (!vs || !fs) + return null; + + var prog = gl.createProgram(); + gl.attachShader(prog, vs); + gl.attachShader(prog, fs); + gl.linkProgram(prog); + + if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { + var str = "Shader program linking failed:"; + str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog); + str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs); + str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs); + warning(str); + return null; + } + + return prog; + } + + return { + setErrorFunc: setErrorFunc, + setWarningFunc: setWarningFunc, + + getWebGL: getWebGL, + withWebGL2: withWebGL2, + createShaderById: createShaderById, + createProgramByIds: createProgramByIds, + }; +})(); |