jpeg: Move component esp_jpeg from BSP and add test.

This commit is contained in:
Vilem Zavodny 2022-09-23 11:09:37 +02:00
parent b901876ea1
commit 26147cf7ac
17 changed files with 2854 additions and 2 deletions

View File

@ -15,6 +15,6 @@ jobs:
- name: Upload components to component service
uses: espressif/upload-components-ci-action@v1
with:
directories: "bdc_motor;cbor;jsmn;led_strip;libsodium;pid_ctrl;qrcode;nghttp;sh2lib;expat;esp_encrypted_img;coap;pcap;json_generator;json_parser;usb/usb_host_cdc_acm;usb/usb_host_msc;usb/usb_host_uvc;esp_serial_slave_link"
directories: "bdc_motor;cbor;jsmn;led_strip;libsodium;pid_ctrl;qrcode;nghttp;sh2lib;expat;esp_encrypted_img;coap;pcap;json_generator;json_parser;usb/usb_host_cdc_acm;usb/usb_host_msc;usb/usb_host_uvc;esp_serial_slave_link;esp_jpeg"
namespace: "espressif"
api_token: ${{ secrets.IDF_COMPONENT_API_TOKEN }}

10
esp_jpeg/CMakeLists.txt Normal file
View File

@ -0,0 +1,10 @@
set(sources "jpeg_decoder.c")
set(includes "include")
# Compile only when cannot use ROM code
if(NOT CONFIG_JD_USE_ROM)
list(APPEND sources "tjpgd/tjpgd.c")
list(APPEND includes "tjpgd")
endif()
idf_component_register(SRCS ${sources} INCLUDE_DIRS ${includes})

69
esp_jpeg/Kconfig Normal file
View File

@ -0,0 +1,69 @@
menu "JPEG Decoder"
config JD_USE_ROM
bool "Use TinyJPG Decoder from ROM"
depends on (!IDF_TARGET_ESP32S2 && !IDF_TARGET_ESP32C2)
default y
help
By default, Espressif SoCs use TJpg decoder implemented in ROM code.
If this feature is disabled, new configuration of TJpg decoder can be used.
Refer to REAME.md for more details.
config JD_SZBUF
int "Size of stream input buffer"
depends on !JD_USE_ROM
default 512
config JD_FORMAT
int
depends on !JD_USE_ROM
default 0 if JD_FORMAT_RGB888
default 1 if JD_FORMAT_RGB565
choice
prompt "Output pixel format"
depends on !JD_USE_ROM
default JD_FORMAT_RGB888
help
Output format is selected at runtime.
config JD_FORMAT_RGB888
bool "Support RGB565 and RGB888 output (16-bit/pix and 24-bit/pix)"
config JD_FORMAT_RGB565
bool "Support RGB565 output (16-bit/pix)"
endchoice
config JD_USE_SCALE
bool "Enable descaling"
depends on !JD_USE_ROM
default y
help
If scaling is enabled, size of output image can be lowered during decoding.
config JD_TBLCLIP
bool "Use table conversion for saturation arithmetic"
depends on !JD_USE_ROM
default y
help
Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size.
config JD_FASTDECODE
int
depends on !JD_USE_ROM
default 0 if JD_FASTDECODE_BASIC
default 1 if JD_FASTDECODE_32BIT
default 2 if JD_FASTDECODE_TABLE
choice
prompt "Optimization level"
depends on !JD_USE_ROM
default JD_FASTDECODE_32BIT
config JD_FASTDECODE_BASIC
bool "Basic optimization. Suitable for 8/16-bit MCUs"
config JD_FASTDECODE_32BIT
bool "+ 32-bit barrel shifter. Suitable for 32-bit MCUs"
config JD_FASTDECODE_TABLE
bool "+ Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM)"
endchoice
endmenu

103
esp_jpeg/README.md Normal file
View File

@ -0,0 +1,103 @@
# JPEG Decoder: TJpgDec - Tiny JPEG Decompressor
TJpgDec is a generic JPEG image decompressor that is highly optimized for small embedded systems. It works with very low memory consumption.
Some microcontrollers have TJpg decoder in ROM, it is used, if there is. [^1] Using ROM code can be disabled in menuconfig.
[^1]: **_NOTE:_** When the ROM decoder is used, the configuration can't be changed. The configuration is fixed.
## Features
**Compilation configuration:**
- Size of stream input buffer (default 512)
- Output pixel format (default RGB888): RGB888/RGB565
- Switches output descaling feature (default enabled)
- Use table conversion for saturation arithmetic (default enabled)
- Three optimization levels (default basic): 8/16-bit MCUs, 32-bit MCUs, Table conversion for huffman decoding
**Runtime configuration:**
- Pixel Format: RGB888, RGB565
- Scaling Ratio: 1/1, 1/2, 1/4 or 1/8 Selectable on Decompression
- Allow swap the first and the last byte of the color
## TJpgDec in ROM
Some microcontrollers have TJpg decoder in ROM. It is used as default, but it can be disabled in menuconfig. Then there will be used code saved in this component.
### List of MCUs, which have TJpgDec in ROM
- ESP32
- ESP32-S3
- ESP32-C2
- ESP32-C3
- ESP32-H2
### Fixed compilation configuration of the ROM code
- Stream input buffer: 512
- Output pixel format: RGB888
- Descaling feature for output: Enabled
- Table for saturation: Enabled
- Optimization level: Basic (JD_FASTDECODE = 0)
### Pros and cons using ROM code
**Advantages:**
- Save 5k of the flash memory (in the same configuration)
**Disadvantages:**
- Cannot be changed compilation configuration
- Some configuration can be faster in some cases
## Speed comparison
In this table are examples of speed decoding JPEG image with this configuration:
* Image size: 320 x 180 px
* Output format: RGB565
* CPU: ESP32-S3
* CPU frequency: 240 MHz
* SPI mode: DIO
* Internal RAM used
* Measured in 1000 retries
| ROM used | JD_SZBUF | JD_FORMAT | JD_USE_SCALE | JD_TBLCLIP | JD_FASTDECODE | RAM buffer | Flash size | Approx. time |
| :------: | :------: | :-------: | :----------: | :--------: | :-----------: | :--------: | :--------: | :----------: |
| YES | 512 | RGB888 | 1 | 1 | 0 | 3.1 kB | 0 kB | 52 ms |
| NO | 512 | RGB888 | 1 | 1 | 0 | 3.1 kB | 5 kB | 50 ms |
| NO | 512 | RGB888 | 1 | 0 | 0 | 3.1 kB | 4 kB | 68 ms |
| NO | 512 | RGB888 | 1 | 1 | 1 | 3.1 kB | 5 kB | 50 ms |
| NO | 512 | RGB888 | 1 | 0 | 1 | 3.1 kB | 4 kB | 62 ms |
| NO | 512 | RGB888 | 1 | 1 | 2 | 65.5 kB | 5.5 kB | 46 ms |
| NO | 512 | RGB888 | 1 | 0 | 2 | 65.5 kB | 4.5 kB | 59 ms |
| NO | 512 | RGB565 | 1 | 1 | 0 | 5 kB | 5 kB | 60 ms |
| NO | 512 | RGB565 | 1 | 1 | 1 | 5 kB | 5 kB | 59 ms |
| NO | 512 | RGB565 | 1 | 1 | 2 | 65.5 kB | 5.5 kB | 56 ms |
## Add to project
Packages from this repository are uploaded to [Espressif's component service](https://components.espressif.com/).
You can add them to your project via `idf.py add-dependancy`, e.g.
```
idf.py add-dependency esp_jpeg==1.0.0
```
Alternatively, you can create `idf_component.yml`. More is in [Espressif's documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html).
## Example use
Here is example of usage. This calling is **blocking**.
```
esp_jpeg_image_cfg_t jpeg_cfg = {
.indata = (uint8_t *)jpeg_img_buf,
.indata_size = jpeg_img_buf_size,
.outbuf = out_img_buf,
.outbuf_size = out_img_buf_size,
.out_format = JPEG_IMAGE_OUT_FORMAT_RGB565,
.out_scale = JPEG_IMAGE_SCALE_0,
.flags = {
.swap_color_bytes = 1,
}
};
esp_jpeg_image_output_t outimg;
esp_jpeg_decode(&jpeg_cfg, &outimg);
```

View File

@ -0,0 +1,5 @@
version: "1.0.3"
description: "JPEG Decoder: TJpgDec"
url: https://github.com/espressif/idf-extra-components/tree/master/esp_jpeg/
dependencies:
idf: ">=4.4"

View File

@ -0,0 +1,82 @@
/*
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "esp_err.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Scale of output image
*
*/
typedef enum {
JPEG_IMAGE_SCALE_0 = 0, /*!< No scale */
JPEG_IMAGE_SCALE_1_2, /*!< Scale 1:2 */
JPEG_IMAGE_SCALE_1_4, /*!< Scale 1:4 */
JPEG_IMAGE_SCALE_1_8, /*!< Scale 1:8 */
} esp_jpeg_image_scale_t;
/**
* @brief Format of output image
*
*/
typedef enum {
JPEG_IMAGE_FORMAT_RGB888 = 0, /*!< Format RGB888 */
JPEG_IMAGE_FORMAT_RGB565, /*!< Format RGB565 */
} esp_jpeg_image_format_t;
/**
* @brief JPEG Configuration Type
*
*/
typedef struct esp_jpeg_image_cfg_s {
uint8_t *indata; /*!< Input JPEG image */
uint32_t indata_size; /*!< Size of input image */
uint8_t *outbuf; /*!< Output buffer */
uint32_t outbuf_size; /*!< Output buffer size */
esp_jpeg_image_format_t out_format; /*!< Output image format */
esp_jpeg_image_scale_t out_scale; /*!< Output scale */
struct {
uint8_t swap_color_bytes: 1; /*!< Swap first and last color bytes */
} flags;
struct {
uint32_t read; /*!< Internal count of read bytes */
} priv;
} esp_jpeg_image_cfg_t;
/**
* @brief JPEG output info
*
*/
typedef struct esp_jpeg_image_output_s {
uint16_t width; /*!< Width of the output image */
uint16_t height; /*!< Height of the output image */
} esp_jpeg_image_output_t;
/**
* @brief Decode JPEG image
*
* @note This function is blocking.
*
* @param cfg: Configuration structure
* @param img: Output image info
*
* @return
* - ESP_OK on success
* - ESP_ERR_NO_MEM if there is no memory for allocating main structure
* - ESP_FAIL if there is an error in decoding JPEG
*/
esp_err_t esp_jpeg_decode(esp_jpeg_image_cfg_t *cfg, esp_jpeg_image_output_t *img);
#ifdef __cplusplus
}
#endif

228
esp_jpeg/jpeg_decoder.c Normal file
View File

@ -0,0 +1,228 @@
/*
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "esp_system.h"
#include "esp_rom_caps.h"
#include "esp_log.h"
#include "esp_err.h"
#include "esp_check.h"
#include "jpeg_decoder.h"
#if CONFIG_JD_USE_ROM
/* When supported in ROM, use ROM functions */
#if defined(ESP_ROM_HAS_JPEG_DECODE)
#include "rom/tjpgd.h"
#else
#error Using JPEG decoder from ROM is not supported for selected target. Please select external code in menuconfig.
#endif
/* The ROM code of TJPGD is older and has different return type in decode callback */
typedef unsigned int jpeg_decode_out_t;
#else
/* When Tiny JPG Decoder is not in ROM or selected external code */
#include "tjpgd.h"
/* The TJPGD outside the ROM code is newer and has different return type in decode callback */
typedef int jpeg_decode_out_t;
#endif
static const char *TAG = "JPEG";
#define LOBYTE(u16) ((uint8_t)(((uint16_t)(u16)) & 0xff))
#define HIBYTE(u16) ((uint8_t)((((uint16_t)(u16))>>8) & 0xff))
#if defined(JD_FASTDECODE) && (JD_FASTDECODE == 2)
#define JPEG_WORK_BUF_SIZE 65472
#else
#define JPEG_WORK_BUF_SIZE 3100 /* Recommended buffer size; Independent on the size of the image */
#endif
/* If not set JD_FORMAT, it is set in ROM to RGB888, otherwise, it can be set in config */
#ifndef JD_FORMAT
#define JD_FORMAT 0
#endif
/* Output color bytes from tjpgd (depends on JD_FORMAT) */
#if (JD_FORMAT==0)
#define ESP_JPEG_COLOR_BYTES 3
#elif (JD_FORMAT==1)
#define ESP_JPEG_COLOR_BYTES 2
#elif (JD_FORMAT==2)
#error Grayscale image output format is not supported
#define ESP_JPEG_COLOR_BYTES 1
#endif
/*******************************************************************************
* Function definitions
*******************************************************************************/
static uint8_t jpeg_get_div_by_scale(esp_jpeg_image_scale_t scale);
static uint8_t jpeg_get_color_bytes(esp_jpeg_image_format_t format);
static unsigned int jpeg_decode_in_cb(JDEC *jd, uint8_t *buff, unsigned int nbyte);
static jpeg_decode_out_t jpeg_decode_out_cb(JDEC *jd, void *bitmap, JRECT *rect);
/*******************************************************************************
* Public API functions
*******************************************************************************/
esp_err_t esp_jpeg_decode(esp_jpeg_image_cfg_t *cfg, esp_jpeg_image_output_t *img)
{
esp_err_t ret = ESP_OK;
uint8_t *workbuf = NULL;
JRESULT res;
JDEC JDEC;
assert(cfg != NULL);
assert(img != NULL);
workbuf = heap_caps_malloc(JPEG_WORK_BUF_SIZE, MALLOC_CAP_DEFAULT);
ESP_GOTO_ON_FALSE(workbuf, ESP_ERR_NO_MEM, err, TAG, "no mem for JPEG work buffer");
cfg->priv.read = 0;
/* Prepare image */
res = jd_prepare(&JDEC, jpeg_decode_in_cb, workbuf, JPEG_WORK_BUF_SIZE, cfg);
ESP_GOTO_ON_FALSE((res == JDR_OK), ESP_FAIL, err, TAG, "Error in preparing JPEG image!");
uint8_t scale_div = jpeg_get_div_by_scale(cfg->out_scale);
uint8_t out_color_bytes = jpeg_get_color_bytes(cfg->out_format);
/* Size of output image */
uint32_t outsize = (JDEC.height / scale_div) * (JDEC.width / scale_div) * out_color_bytes;
ESP_GOTO_ON_FALSE((outsize <= cfg->outbuf_size), ESP_ERR_NO_MEM, err, TAG, "Not enough size in output buffer!");
/* Size of output image */
img->height = JDEC.height / scale_div;
img->width = JDEC.width / scale_div;
/* Decode JPEG */
res = jd_decomp(&JDEC, jpeg_decode_out_cb, cfg->out_scale);
ESP_GOTO_ON_FALSE((res == JDR_OK), ESP_FAIL, err, TAG, "Error in decoding JPEG image!");
err:
if (workbuf) {
free(workbuf);
}
return ret;
}
/*******************************************************************************
* Private API functions
*******************************************************************************/
static unsigned int jpeg_decode_in_cb(JDEC *dec, uint8_t *buff, unsigned int nbyte)
{
assert(dec != NULL);
uint32_t to_read = nbyte;
esp_jpeg_image_cfg_t *cfg = (esp_jpeg_image_cfg_t *)dec->device;
assert(cfg != NULL);
if (buff) {
if (cfg->priv.read + to_read > cfg->indata_size) {
to_read = cfg->indata_size - cfg->priv.read;
}
/* Copy data from JPEG image */
memcpy(buff, &cfg->indata[cfg->priv.read], to_read);
cfg->priv.read += to_read;
} else if (buff == NULL) {
/* Skip data */
cfg->priv.read += to_read;
}
return to_read;
}
static jpeg_decode_out_t jpeg_decode_out_cb(JDEC *dec, void *bitmap, JRECT *rect)
{
uint16_t color = 0;
assert(dec != NULL);
esp_jpeg_image_cfg_t *cfg = (esp_jpeg_image_cfg_t *)dec->device;
assert(cfg != NULL);
assert(bitmap != NULL);
assert(rect != NULL);
uint8_t scale_div = jpeg_get_div_by_scale(cfg->out_scale);
uint8_t out_color_bytes = jpeg_get_color_bytes(cfg->out_format);
/* Copy decoded image data to output buffer */
uint8_t *in = (uint8_t *)bitmap;
uint32_t line = dec->width / scale_div;
uint8_t *dst = (uint8_t *)cfg->outbuf;
for (int y = rect->top; y <= rect->bottom; y++) {
for (int x = rect->left; x <= rect->right; x++) {
if ( (JD_FORMAT == 0 && cfg->out_format == JPEG_IMAGE_FORMAT_RGB888) ||
(JD_FORMAT == 1 && cfg->out_format == JPEG_IMAGE_FORMAT_RGB565) ) {
/* Output image format is same as set in TJPGD */
for (int b = 0; b < ESP_JPEG_COLOR_BYTES; b++) {
if (JD_FORMAT == 1 && cfg->flags.swap_color_bytes) {
dst[(y * line * out_color_bytes) + x * out_color_bytes + b] = in[out_color_bytes - b - 1];
} else {
dst[(y * line * out_color_bytes) + x * out_color_bytes + b] = in[b];
}
}
} else if (JD_FORMAT == 0 && cfg->out_format == JPEG_IMAGE_FORMAT_RGB565) {
/* Output image format is not same as set in TJPGD */
/* We need to convert the 3 bytes in `in` to a rgb565 value */
color = ((in[0] & 0xF8) << 8);
color |= ((in[1] & 0xFC) << 3);
color |= (in[2] >> 3);
if (cfg->flags.swap_color_bytes) {
dst[(y * line * out_color_bytes) + (x * out_color_bytes)] = HIBYTE(color);
dst[(y * line * out_color_bytes) + (x * out_color_bytes) + 1] = LOBYTE(color);
} else {
dst[(y * line * out_color_bytes) + (x * out_color_bytes) + 1] = HIBYTE(color);
dst[(y * line * out_color_bytes) + (x * out_color_bytes)] = LOBYTE(color);
}
} else {
ESP_LOGE(TAG, "Selected output format is not supported!");
assert(0);
}
in += ESP_JPEG_COLOR_BYTES;
}
}
return 1;
}
static uint8_t jpeg_get_div_by_scale(esp_jpeg_image_scale_t scale)
{
switch (scale) {
/* Not scaled */
case JPEG_IMAGE_SCALE_0:
return 1;
/* Scaled 1:2 */
case JPEG_IMAGE_SCALE_1_2:
return 2;
/* Scaled 1:4 */
case JPEG_IMAGE_SCALE_1_4:
return 4;
/* Scaled 1:8 */
case JPEG_IMAGE_SCALE_1_8:
return 8;
}
return 1;
}
static uint8_t jpeg_get_color_bytes(esp_jpeg_image_format_t format)
{
switch (format) {
/* RGB888 (24-bit/pix) */
case JPEG_IMAGE_FORMAT_RGB888:
return 3;
/* RGB565 (16-bit/pix) */
case JPEG_IMAGE_FORMAT_RGB565:
return 2;
}
return 1;
}

202
esp_jpeg/license.txt Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -0,0 +1,4 @@
idf_component_register(SRCS "tjpgd_test.c"
INCLUDE_DIRS "."
REQUIRES "unity")

BIN
esp_jpeg/test/logo.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,634 @@
unsigned char logo_jpg[] = {
0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01,
0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xe2, 0x0c, 0x58,
0x49, 0x43, 0x43, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x00,
0x01, 0x01, 0x00, 0x00, 0x0c, 0x48, 0x4c, 0x69, 0x6e, 0x6f, 0x02, 0x10,
0x00, 0x00, 0x6d, 0x6e, 0x74, 0x72, 0x52, 0x47, 0x42, 0x20, 0x58, 0x59,
0x5a, 0x20, 0x07, 0xce, 0x00, 0x02, 0x00, 0x09, 0x00, 0x06, 0x00, 0x31,
0x00, 0x00, 0x61, 0x63, 0x73, 0x70, 0x4d, 0x53, 0x46, 0x54, 0x00, 0x00,
0x00, 0x00, 0x49, 0x45, 0x43, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d, 0x48, 0x50,
0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x11, 0x63, 0x70, 0x72, 0x74, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00,
0x00, 0x33, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00,
0x00, 0x6c, 0x77, 0x74, 0x70, 0x74, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00,
0x00, 0x14, 0x62, 0x6b, 0x70, 0x74, 0x00, 0x00, 0x02, 0x04, 0x00, 0x00,
0x00, 0x14, 0x72, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x02, 0x18, 0x00, 0x00,
0x00, 0x14, 0x67, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x00,
0x00, 0x14, 0x62, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00,
0x00, 0x14, 0x64, 0x6d, 0x6e, 0x64, 0x00, 0x00, 0x02, 0x54, 0x00, 0x00,
0x00, 0x70, 0x64, 0x6d, 0x64, 0x64, 0x00, 0x00, 0x02, 0xc4, 0x00, 0x00,
0x00, 0x88, 0x76, 0x75, 0x65, 0x64, 0x00, 0x00, 0x03, 0x4c, 0x00, 0x00,
0x00, 0x86, 0x76, 0x69, 0x65, 0x77, 0x00, 0x00, 0x03, 0xd4, 0x00, 0x00,
0x00, 0x24, 0x6c, 0x75, 0x6d, 0x69, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00,
0x00, 0x14, 0x6d, 0x65, 0x61, 0x73, 0x00, 0x00, 0x04, 0x0c, 0x00, 0x00,
0x00, 0x24, 0x74, 0x65, 0x63, 0x68, 0x00, 0x00, 0x04, 0x30, 0x00, 0x00,
0x00, 0x0c, 0x72, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00,
0x08, 0x0c, 0x67, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00,
0x08, 0x0c, 0x62, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x3c, 0x00, 0x00,
0x08, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f,
0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20,
0x31, 0x39, 0x39, 0x38, 0x20, 0x48, 0x65, 0x77, 0x6c, 0x65, 0x74, 0x74,
0x2d, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x72, 0x64, 0x20, 0x43, 0x6f, 0x6d,
0x70, 0x61, 0x6e, 0x79, 0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x73, 0x52, 0x47, 0x42, 0x20, 0x49,
0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e, 0x31, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x73,
0x52, 0x47, 0x42, 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36,
0x2d, 0x32, 0x2e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf3, 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
0x16, 0xcc, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x59,
0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xa2, 0x00, 0x00,
0x38, 0xf5, 0x00, 0x00, 0x03, 0x90, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x62, 0x99, 0x00, 0x00, 0xb7, 0x85, 0x00, 0x00,
0x18, 0xda, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x24, 0xa0, 0x00, 0x00, 0x0f, 0x84, 0x00, 0x00, 0xb6, 0xcf, 0x64, 0x65,
0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45,
0x43, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
0x2e, 0x69, 0x65, 0x63, 0x2e, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45, 0x43, 0x20, 0x68,
0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65,
0x63, 0x2e, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x2e, 0x49, 0x45, 0x43, 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d,
0x32, 0x2e, 0x31, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20,
0x52, 0x47, 0x42, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x75, 0x72, 0x20, 0x73,
0x70, 0x61, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x49,
0x45, 0x43, 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e, 0x31,
0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x52, 0x47, 0x42,
0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x75, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63,
0x65, 0x20, 0x2d, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65,
0x6e, 0x63, 0x65, 0x20, 0x56, 0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x20,
0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e,
0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e,
0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x56,
0x69, 0x65, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x69,
0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x45, 0x43, 0x36,
0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e, 0x31, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x69,
0x65, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xa4, 0xfe, 0x00, 0x14,
0x5f, 0x2e, 0x00, 0x10, 0xcf, 0x14, 0x00, 0x03, 0xed, 0xcc, 0x00, 0x04,
0x13, 0x0b, 0x00, 0x03, 0x5c, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x58, 0x59,
0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x09, 0x56, 0x00, 0x50,
0x00, 0x00, 0x00, 0x57, 0x1f, 0xe7, 0x6d, 0x65, 0x61, 0x73, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x73, 0x69, 0x67, 0x20, 0x00, 0x00,
0x00, 0x00, 0x43, 0x52, 0x54, 0x20, 0x63, 0x75, 0x72, 0x76, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0a,
0x00, 0x0f, 0x00, 0x14, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x28,
0x00, 0x2d, 0x00, 0x32, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x40, 0x00, 0x45,
0x00, 0x4a, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x59, 0x00, 0x5e, 0x00, 0x63,
0x00, 0x68, 0x00, 0x6d, 0x00, 0x72, 0x00, 0x77, 0x00, 0x7c, 0x00, 0x81,
0x00, 0x86, 0x00, 0x8b, 0x00, 0x90, 0x00, 0x95, 0x00, 0x9a, 0x00, 0x9f,
0x00, 0xa4, 0x00, 0xa9, 0x00, 0xae, 0x00, 0xb2, 0x00, 0xb7, 0x00, 0xbc,
0x00, 0xc1, 0x00, 0xc6, 0x00, 0xcb, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xdb,
0x00, 0xe0, 0x00, 0xe5, 0x00, 0xeb, 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfb,
0x01, 0x01, 0x01, 0x07, 0x01, 0x0d, 0x01, 0x13, 0x01, 0x19, 0x01, 0x1f,
0x01, 0x25, 0x01, 0x2b, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x45,
0x01, 0x4c, 0x01, 0x52, 0x01, 0x59, 0x01, 0x60, 0x01, 0x67, 0x01, 0x6e,
0x01, 0x75, 0x01, 0x7c, 0x01, 0x83, 0x01, 0x8b, 0x01, 0x92, 0x01, 0x9a,
0x01, 0xa1, 0x01, 0xa9, 0x01, 0xb1, 0x01, 0xb9, 0x01, 0xc1, 0x01, 0xc9,
0x01, 0xd1, 0x01, 0xd9, 0x01, 0xe1, 0x01, 0xe9, 0x01, 0xf2, 0x01, 0xfa,
0x02, 0x03, 0x02, 0x0c, 0x02, 0x14, 0x02, 0x1d, 0x02, 0x26, 0x02, 0x2f,
0x02, 0x38, 0x02, 0x41, 0x02, 0x4b, 0x02, 0x54, 0x02, 0x5d, 0x02, 0x67,
0x02, 0x71, 0x02, 0x7a, 0x02, 0x84, 0x02, 0x8e, 0x02, 0x98, 0x02, 0xa2,
0x02, 0xac, 0x02, 0xb6, 0x02, 0xc1, 0x02, 0xcb, 0x02, 0xd5, 0x02, 0xe0,
0x02, 0xeb, 0x02, 0xf5, 0x03, 0x00, 0x03, 0x0b, 0x03, 0x16, 0x03, 0x21,
0x03, 0x2d, 0x03, 0x38, 0x03, 0x43, 0x03, 0x4f, 0x03, 0x5a, 0x03, 0x66,
0x03, 0x72, 0x03, 0x7e, 0x03, 0x8a, 0x03, 0x96, 0x03, 0xa2, 0x03, 0xae,
0x03, 0xba, 0x03, 0xc7, 0x03, 0xd3, 0x03, 0xe0, 0x03, 0xec, 0x03, 0xf9,
0x04, 0x06, 0x04, 0x13, 0x04, 0x20, 0x04, 0x2d, 0x04, 0x3b, 0x04, 0x48,
0x04, 0x55, 0x04, 0x63, 0x04, 0x71, 0x04, 0x7e, 0x04, 0x8c, 0x04, 0x9a,
0x04, 0xa8, 0x04, 0xb6, 0x04, 0xc4, 0x04, 0xd3, 0x04, 0xe1, 0x04, 0xf0,
0x04, 0xfe, 0x05, 0x0d, 0x05, 0x1c, 0x05, 0x2b, 0x05, 0x3a, 0x05, 0x49,
0x05, 0x58, 0x05, 0x67, 0x05, 0x77, 0x05, 0x86, 0x05, 0x96, 0x05, 0xa6,
0x05, 0xb5, 0x05, 0xc5, 0x05, 0xd5, 0x05, 0xe5, 0x05, 0xf6, 0x06, 0x06,
0x06, 0x16, 0x06, 0x27, 0x06, 0x37, 0x06, 0x48, 0x06, 0x59, 0x06, 0x6a,
0x06, 0x7b, 0x06, 0x8c, 0x06, 0x9d, 0x06, 0xaf, 0x06, 0xc0, 0x06, 0xd1,
0x06, 0xe3, 0x06, 0xf5, 0x07, 0x07, 0x07, 0x19, 0x07, 0x2b, 0x07, 0x3d,
0x07, 0x4f, 0x07, 0x61, 0x07, 0x74, 0x07, 0x86, 0x07, 0x99, 0x07, 0xac,
0x07, 0xbf, 0x07, 0xd2, 0x07, 0xe5, 0x07, 0xf8, 0x08, 0x0b, 0x08, 0x1f,
0x08, 0x32, 0x08, 0x46, 0x08, 0x5a, 0x08, 0x6e, 0x08, 0x82, 0x08, 0x96,
0x08, 0xaa, 0x08, 0xbe, 0x08, 0xd2, 0x08, 0xe7, 0x08, 0xfb, 0x09, 0x10,
0x09, 0x25, 0x09, 0x3a, 0x09, 0x4f, 0x09, 0x64, 0x09, 0x79, 0x09, 0x8f,
0x09, 0xa4, 0x09, 0xba, 0x09, 0xcf, 0x09, 0xe5, 0x09, 0xfb, 0x0a, 0x11,
0x0a, 0x27, 0x0a, 0x3d, 0x0a, 0x54, 0x0a, 0x6a, 0x0a, 0x81, 0x0a, 0x98,
0x0a, 0xae, 0x0a, 0xc5, 0x0a, 0xdc, 0x0a, 0xf3, 0x0b, 0x0b, 0x0b, 0x22,
0x0b, 0x39, 0x0b, 0x51, 0x0b, 0x69, 0x0b, 0x80, 0x0b, 0x98, 0x0b, 0xb0,
0x0b, 0xc8, 0x0b, 0xe1, 0x0b, 0xf9, 0x0c, 0x12, 0x0c, 0x2a, 0x0c, 0x43,
0x0c, 0x5c, 0x0c, 0x75, 0x0c, 0x8e, 0x0c, 0xa7, 0x0c, 0xc0, 0x0c, 0xd9,
0x0c, 0xf3, 0x0d, 0x0d, 0x0d, 0x26, 0x0d, 0x40, 0x0d, 0x5a, 0x0d, 0x74,
0x0d, 0x8e, 0x0d, 0xa9, 0x0d, 0xc3, 0x0d, 0xde, 0x0d, 0xf8, 0x0e, 0x13,
0x0e, 0x2e, 0x0e, 0x49, 0x0e, 0x64, 0x0e, 0x7f, 0x0e, 0x9b, 0x0e, 0xb6,
0x0e, 0xd2, 0x0e, 0xee, 0x0f, 0x09, 0x0f, 0x25, 0x0f, 0x41, 0x0f, 0x5e,
0x0f, 0x7a, 0x0f, 0x96, 0x0f, 0xb3, 0x0f, 0xcf, 0x0f, 0xec, 0x10, 0x09,
0x10, 0x26, 0x10, 0x43, 0x10, 0x61, 0x10, 0x7e, 0x10, 0x9b, 0x10, 0xb9,
0x10, 0xd7, 0x10, 0xf5, 0x11, 0x13, 0x11, 0x31, 0x11, 0x4f, 0x11, 0x6d,
0x11, 0x8c, 0x11, 0xaa, 0x11, 0xc9, 0x11, 0xe8, 0x12, 0x07, 0x12, 0x26,
0x12, 0x45, 0x12, 0x64, 0x12, 0x84, 0x12, 0xa3, 0x12, 0xc3, 0x12, 0xe3,
0x13, 0x03, 0x13, 0x23, 0x13, 0x43, 0x13, 0x63, 0x13, 0x83, 0x13, 0xa4,
0x13, 0xc5, 0x13, 0xe5, 0x14, 0x06, 0x14, 0x27, 0x14, 0x49, 0x14, 0x6a,
0x14, 0x8b, 0x14, 0xad, 0x14, 0xce, 0x14, 0xf0, 0x15, 0x12, 0x15, 0x34,
0x15, 0x56, 0x15, 0x78, 0x15, 0x9b, 0x15, 0xbd, 0x15, 0xe0, 0x16, 0x03,
0x16, 0x26, 0x16, 0x49, 0x16, 0x6c, 0x16, 0x8f, 0x16, 0xb2, 0x16, 0xd6,
0x16, 0xfa, 0x17, 0x1d, 0x17, 0x41, 0x17, 0x65, 0x17, 0x89, 0x17, 0xae,
0x17, 0xd2, 0x17, 0xf7, 0x18, 0x1b, 0x18, 0x40, 0x18, 0x65, 0x18, 0x8a,
0x18, 0xaf, 0x18, 0xd5, 0x18, 0xfa, 0x19, 0x20, 0x19, 0x45, 0x19, 0x6b,
0x19, 0x91, 0x19, 0xb7, 0x19, 0xdd, 0x1a, 0x04, 0x1a, 0x2a, 0x1a, 0x51,
0x1a, 0x77, 0x1a, 0x9e, 0x1a, 0xc5, 0x1a, 0xec, 0x1b, 0x14, 0x1b, 0x3b,
0x1b, 0x63, 0x1b, 0x8a, 0x1b, 0xb2, 0x1b, 0xda, 0x1c, 0x02, 0x1c, 0x2a,
0x1c, 0x52, 0x1c, 0x7b, 0x1c, 0xa3, 0x1c, 0xcc, 0x1c, 0xf5, 0x1d, 0x1e,
0x1d, 0x47, 0x1d, 0x70, 0x1d, 0x99, 0x1d, 0xc3, 0x1d, 0xec, 0x1e, 0x16,
0x1e, 0x40, 0x1e, 0x6a, 0x1e, 0x94, 0x1e, 0xbe, 0x1e, 0xe9, 0x1f, 0x13,
0x1f, 0x3e, 0x1f, 0x69, 0x1f, 0x94, 0x1f, 0xbf, 0x1f, 0xea, 0x20, 0x15,
0x20, 0x41, 0x20, 0x6c, 0x20, 0x98, 0x20, 0xc4, 0x20, 0xf0, 0x21, 0x1c,
0x21, 0x48, 0x21, 0x75, 0x21, 0xa1, 0x21, 0xce, 0x21, 0xfb, 0x22, 0x27,
0x22, 0x55, 0x22, 0x82, 0x22, 0xaf, 0x22, 0xdd, 0x23, 0x0a, 0x23, 0x38,
0x23, 0x66, 0x23, 0x94, 0x23, 0xc2, 0x23, 0xf0, 0x24, 0x1f, 0x24, 0x4d,
0x24, 0x7c, 0x24, 0xab, 0x24, 0xda, 0x25, 0x09, 0x25, 0x38, 0x25, 0x68,
0x25, 0x97, 0x25, 0xc7, 0x25, 0xf7, 0x26, 0x27, 0x26, 0x57, 0x26, 0x87,
0x26, 0xb7, 0x26, 0xe8, 0x27, 0x18, 0x27, 0x49, 0x27, 0x7a, 0x27, 0xab,
0x27, 0xdc, 0x28, 0x0d, 0x28, 0x3f, 0x28, 0x71, 0x28, 0xa2, 0x28, 0xd4,
0x29, 0x06, 0x29, 0x38, 0x29, 0x6b, 0x29, 0x9d, 0x29, 0xd0, 0x2a, 0x02,
0x2a, 0x35, 0x2a, 0x68, 0x2a, 0x9b, 0x2a, 0xcf, 0x2b, 0x02, 0x2b, 0x36,
0x2b, 0x69, 0x2b, 0x9d, 0x2b, 0xd1, 0x2c, 0x05, 0x2c, 0x39, 0x2c, 0x6e,
0x2c, 0xa2, 0x2c, 0xd7, 0x2d, 0x0c, 0x2d, 0x41, 0x2d, 0x76, 0x2d, 0xab,
0x2d, 0xe1, 0x2e, 0x16, 0x2e, 0x4c, 0x2e, 0x82, 0x2e, 0xb7, 0x2e, 0xee,
0x2f, 0x24, 0x2f, 0x5a, 0x2f, 0x91, 0x2f, 0xc7, 0x2f, 0xfe, 0x30, 0x35,
0x30, 0x6c, 0x30, 0xa4, 0x30, 0xdb, 0x31, 0x12, 0x31, 0x4a, 0x31, 0x82,
0x31, 0xba, 0x31, 0xf2, 0x32, 0x2a, 0x32, 0x63, 0x32, 0x9b, 0x32, 0xd4,
0x33, 0x0d, 0x33, 0x46, 0x33, 0x7f, 0x33, 0xb8, 0x33, 0xf1, 0x34, 0x2b,
0x34, 0x65, 0x34, 0x9e, 0x34, 0xd8, 0x35, 0x13, 0x35, 0x4d, 0x35, 0x87,
0x35, 0xc2, 0x35, 0xfd, 0x36, 0x37, 0x36, 0x72, 0x36, 0xae, 0x36, 0xe9,
0x37, 0x24, 0x37, 0x60, 0x37, 0x9c, 0x37, 0xd7, 0x38, 0x14, 0x38, 0x50,
0x38, 0x8c, 0x38, 0xc8, 0x39, 0x05, 0x39, 0x42, 0x39, 0x7f, 0x39, 0xbc,
0x39, 0xf9, 0x3a, 0x36, 0x3a, 0x74, 0x3a, 0xb2, 0x3a, 0xef, 0x3b, 0x2d,
0x3b, 0x6b, 0x3b, 0xaa, 0x3b, 0xe8, 0x3c, 0x27, 0x3c, 0x65, 0x3c, 0xa4,
0x3c, 0xe3, 0x3d, 0x22, 0x3d, 0x61, 0x3d, 0xa1, 0x3d, 0xe0, 0x3e, 0x20,
0x3e, 0x60, 0x3e, 0xa0, 0x3e, 0xe0, 0x3f, 0x21, 0x3f, 0x61, 0x3f, 0xa2,
0x3f, 0xe2, 0x40, 0x23, 0x40, 0x64, 0x40, 0xa6, 0x40, 0xe7, 0x41, 0x29,
0x41, 0x6a, 0x41, 0xac, 0x41, 0xee, 0x42, 0x30, 0x42, 0x72, 0x42, 0xb5,
0x42, 0xf7, 0x43, 0x3a, 0x43, 0x7d, 0x43, 0xc0, 0x44, 0x03, 0x44, 0x47,
0x44, 0x8a, 0x44, 0xce, 0x45, 0x12, 0x45, 0x55, 0x45, 0x9a, 0x45, 0xde,
0x46, 0x22, 0x46, 0x67, 0x46, 0xab, 0x46, 0xf0, 0x47, 0x35, 0x47, 0x7b,
0x47, 0xc0, 0x48, 0x05, 0x48, 0x4b, 0x48, 0x91, 0x48, 0xd7, 0x49, 0x1d,
0x49, 0x63, 0x49, 0xa9, 0x49, 0xf0, 0x4a, 0x37, 0x4a, 0x7d, 0x4a, 0xc4,
0x4b, 0x0c, 0x4b, 0x53, 0x4b, 0x9a, 0x4b, 0xe2, 0x4c, 0x2a, 0x4c, 0x72,
0x4c, 0xba, 0x4d, 0x02, 0x4d, 0x4a, 0x4d, 0x93, 0x4d, 0xdc, 0x4e, 0x25,
0x4e, 0x6e, 0x4e, 0xb7, 0x4f, 0x00, 0x4f, 0x49, 0x4f, 0x93, 0x4f, 0xdd,
0x50, 0x27, 0x50, 0x71, 0x50, 0xbb, 0x51, 0x06, 0x51, 0x50, 0x51, 0x9b,
0x51, 0xe6, 0x52, 0x31, 0x52, 0x7c, 0x52, 0xc7, 0x53, 0x13, 0x53, 0x5f,
0x53, 0xaa, 0x53, 0xf6, 0x54, 0x42, 0x54, 0x8f, 0x54, 0xdb, 0x55, 0x28,
0x55, 0x75, 0x55, 0xc2, 0x56, 0x0f, 0x56, 0x5c, 0x56, 0xa9, 0x56, 0xf7,
0x57, 0x44, 0x57, 0x92, 0x57, 0xe0, 0x58, 0x2f, 0x58, 0x7d, 0x58, 0xcb,
0x59, 0x1a, 0x59, 0x69, 0x59, 0xb8, 0x5a, 0x07, 0x5a, 0x56, 0x5a, 0xa6,
0x5a, 0xf5, 0x5b, 0x45, 0x5b, 0x95, 0x5b, 0xe5, 0x5c, 0x35, 0x5c, 0x86,
0x5c, 0xd6, 0x5d, 0x27, 0x5d, 0x78, 0x5d, 0xc9, 0x5e, 0x1a, 0x5e, 0x6c,
0x5e, 0xbd, 0x5f, 0x0f, 0x5f, 0x61, 0x5f, 0xb3, 0x60, 0x05, 0x60, 0x57,
0x60, 0xaa, 0x60, 0xfc, 0x61, 0x4f, 0x61, 0xa2, 0x61, 0xf5, 0x62, 0x49,
0x62, 0x9c, 0x62, 0xf0, 0x63, 0x43, 0x63, 0x97, 0x63, 0xeb, 0x64, 0x40,
0x64, 0x94, 0x64, 0xe9, 0x65, 0x3d, 0x65, 0x92, 0x65, 0xe7, 0x66, 0x3d,
0x66, 0x92, 0x66, 0xe8, 0x67, 0x3d, 0x67, 0x93, 0x67, 0xe9, 0x68, 0x3f,
0x68, 0x96, 0x68, 0xec, 0x69, 0x43, 0x69, 0x9a, 0x69, 0xf1, 0x6a, 0x48,
0x6a, 0x9f, 0x6a, 0xf7, 0x6b, 0x4f, 0x6b, 0xa7, 0x6b, 0xff, 0x6c, 0x57,
0x6c, 0xaf, 0x6d, 0x08, 0x6d, 0x60, 0x6d, 0xb9, 0x6e, 0x12, 0x6e, 0x6b,
0x6e, 0xc4, 0x6f, 0x1e, 0x6f, 0x78, 0x6f, 0xd1, 0x70, 0x2b, 0x70, 0x86,
0x70, 0xe0, 0x71, 0x3a, 0x71, 0x95, 0x71, 0xf0, 0x72, 0x4b, 0x72, 0xa6,
0x73, 0x01, 0x73, 0x5d, 0x73, 0xb8, 0x74, 0x14, 0x74, 0x70, 0x74, 0xcc,
0x75, 0x28, 0x75, 0x85, 0x75, 0xe1, 0x76, 0x3e, 0x76, 0x9b, 0x76, 0xf8,
0x77, 0x56, 0x77, 0xb3, 0x78, 0x11, 0x78, 0x6e, 0x78, 0xcc, 0x79, 0x2a,
0x79, 0x89, 0x79, 0xe7, 0x7a, 0x46, 0x7a, 0xa5, 0x7b, 0x04, 0x7b, 0x63,
0x7b, 0xc2, 0x7c, 0x21, 0x7c, 0x81, 0x7c, 0xe1, 0x7d, 0x41, 0x7d, 0xa1,
0x7e, 0x01, 0x7e, 0x62, 0x7e, 0xc2, 0x7f, 0x23, 0x7f, 0x84, 0x7f, 0xe5,
0x80, 0x47, 0x80, 0xa8, 0x81, 0x0a, 0x81, 0x6b, 0x81, 0xcd, 0x82, 0x30,
0x82, 0x92, 0x82, 0xf4, 0x83, 0x57, 0x83, 0xba, 0x84, 0x1d, 0x84, 0x80,
0x84, 0xe3, 0x85, 0x47, 0x85, 0xab, 0x86, 0x0e, 0x86, 0x72, 0x86, 0xd7,
0x87, 0x3b, 0x87, 0x9f, 0x88, 0x04, 0x88, 0x69, 0x88, 0xce, 0x89, 0x33,
0x89, 0x99, 0x89, 0xfe, 0x8a, 0x64, 0x8a, 0xca, 0x8b, 0x30, 0x8b, 0x96,
0x8b, 0xfc, 0x8c, 0x63, 0x8c, 0xca, 0x8d, 0x31, 0x8d, 0x98, 0x8d, 0xff,
0x8e, 0x66, 0x8e, 0xce, 0x8f, 0x36, 0x8f, 0x9e, 0x90, 0x06, 0x90, 0x6e,
0x90, 0xd6, 0x91, 0x3f, 0x91, 0xa8, 0x92, 0x11, 0x92, 0x7a, 0x92, 0xe3,
0x93, 0x4d, 0x93, 0xb6, 0x94, 0x20, 0x94, 0x8a, 0x94, 0xf4, 0x95, 0x5f,
0x95, 0xc9, 0x96, 0x34, 0x96, 0x9f, 0x97, 0x0a, 0x97, 0x75, 0x97, 0xe0,
0x98, 0x4c, 0x98, 0xb8, 0x99, 0x24, 0x99, 0x90, 0x99, 0xfc, 0x9a, 0x68,
0x9a, 0xd5, 0x9b, 0x42, 0x9b, 0xaf, 0x9c, 0x1c, 0x9c, 0x89, 0x9c, 0xf7,
0x9d, 0x64, 0x9d, 0xd2, 0x9e, 0x40, 0x9e, 0xae, 0x9f, 0x1d, 0x9f, 0x8b,
0x9f, 0xfa, 0xa0, 0x69, 0xa0, 0xd8, 0xa1, 0x47, 0xa1, 0xb6, 0xa2, 0x26,
0xa2, 0x96, 0xa3, 0x06, 0xa3, 0x76, 0xa3, 0xe6, 0xa4, 0x56, 0xa4, 0xc7,
0xa5, 0x38, 0xa5, 0xa9, 0xa6, 0x1a, 0xa6, 0x8b, 0xa6, 0xfd, 0xa7, 0x6e,
0xa7, 0xe0, 0xa8, 0x52, 0xa8, 0xc4, 0xa9, 0x37, 0xa9, 0xa9, 0xaa, 0x1c,
0xaa, 0x8f, 0xab, 0x02, 0xab, 0x75, 0xab, 0xe9, 0xac, 0x5c, 0xac, 0xd0,
0xad, 0x44, 0xad, 0xb8, 0xae, 0x2d, 0xae, 0xa1, 0xaf, 0x16, 0xaf, 0x8b,
0xb0, 0x00, 0xb0, 0x75, 0xb0, 0xea, 0xb1, 0x60, 0xb1, 0xd6, 0xb2, 0x4b,
0xb2, 0xc2, 0xb3, 0x38, 0xb3, 0xae, 0xb4, 0x25, 0xb4, 0x9c, 0xb5, 0x13,
0xb5, 0x8a, 0xb6, 0x01, 0xb6, 0x79, 0xb6, 0xf0, 0xb7, 0x68, 0xb7, 0xe0,
0xb8, 0x59, 0xb8, 0xd1, 0xb9, 0x4a, 0xb9, 0xc2, 0xba, 0x3b, 0xba, 0xb5,
0xbb, 0x2e, 0xbb, 0xa7, 0xbc, 0x21, 0xbc, 0x9b, 0xbd, 0x15, 0xbd, 0x8f,
0xbe, 0x0a, 0xbe, 0x84, 0xbe, 0xff, 0xbf, 0x7a, 0xbf, 0xf5, 0xc0, 0x70,
0xc0, 0xec, 0xc1, 0x67, 0xc1, 0xe3, 0xc2, 0x5f, 0xc2, 0xdb, 0xc3, 0x58,
0xc3, 0xd4, 0xc4, 0x51, 0xc4, 0xce, 0xc5, 0x4b, 0xc5, 0xc8, 0xc6, 0x46,
0xc6, 0xc3, 0xc7, 0x41, 0xc7, 0xbf, 0xc8, 0x3d, 0xc8, 0xbc, 0xc9, 0x3a,
0xc9, 0xb9, 0xca, 0x38, 0xca, 0xb7, 0xcb, 0x36, 0xcb, 0xb6, 0xcc, 0x35,
0xcc, 0xb5, 0xcd, 0x35, 0xcd, 0xb5, 0xce, 0x36, 0xce, 0xb6, 0xcf, 0x37,
0xcf, 0xb8, 0xd0, 0x39, 0xd0, 0xba, 0xd1, 0x3c, 0xd1, 0xbe, 0xd2, 0x3f,
0xd2, 0xc1, 0xd3, 0x44, 0xd3, 0xc6, 0xd4, 0x49, 0xd4, 0xcb, 0xd5, 0x4e,
0xd5, 0xd1, 0xd6, 0x55, 0xd6, 0xd8, 0xd7, 0x5c, 0xd7, 0xe0, 0xd8, 0x64,
0xd8, 0xe8, 0xd9, 0x6c, 0xd9, 0xf1, 0xda, 0x76, 0xda, 0xfb, 0xdb, 0x80,
0xdc, 0x05, 0xdc, 0x8a, 0xdd, 0x10, 0xdd, 0x96, 0xde, 0x1c, 0xde, 0xa2,
0xdf, 0x29, 0xdf, 0xaf, 0xe0, 0x36, 0xe0, 0xbd, 0xe1, 0x44, 0xe1, 0xcc,
0xe2, 0x53, 0xe2, 0xdb, 0xe3, 0x63, 0xe3, 0xeb, 0xe4, 0x73, 0xe4, 0xfc,
0xe5, 0x84, 0xe6, 0x0d, 0xe6, 0x96, 0xe7, 0x1f, 0xe7, 0xa9, 0xe8, 0x32,
0xe8, 0xbc, 0xe9, 0x46, 0xe9, 0xd0, 0xea, 0x5b, 0xea, 0xe5, 0xeb, 0x70,
0xeb, 0xfb, 0xec, 0x86, 0xed, 0x11, 0xed, 0x9c, 0xee, 0x28, 0xee, 0xb4,
0xef, 0x40, 0xef, 0xcc, 0xf0, 0x58, 0xf0, 0xe5, 0xf1, 0x72, 0xf1, 0xff,
0xf2, 0x8c, 0xf3, 0x19, 0xf3, 0xa7, 0xf4, 0x34, 0xf4, 0xc2, 0xf5, 0x50,
0xf5, 0xde, 0xf6, 0x6d, 0xf6, 0xfb, 0xf7, 0x8a, 0xf8, 0x19, 0xf8, 0xa8,
0xf9, 0x38, 0xf9, 0xc7, 0xfa, 0x57, 0xfa, 0xe7, 0xfb, 0x77, 0xfc, 0x07,
0xfc, 0x98, 0xfd, 0x29, 0xfd, 0xba, 0xfe, 0x4b, 0xfe, 0xdc, 0xff, 0x6d,
0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
0x01, 0x01, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, 0x03,
0x03, 0x02, 0x02, 0x03, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04,
0x02, 0x03, 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0xff,
0xdb, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x01,
0x01, 0x02, 0x04, 0x03, 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xff, 0xc0, 0x00, 0x11,
0x08, 0x00, 0x2e, 0x00, 0x2e, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01,
0x03, 0x11, 0x01, 0xff, 0xc4, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x04, 0x03,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x09, 0x05, 0x07, 0x08, 0x0a, 0x01, 0x02, 0x06, 0x03, 0xff, 0xc4, 0x00,
0x31, 0x10, 0x00, 0x00, 0x06, 0x02, 0x01, 0x03, 0x03, 0x03, 0x03, 0x02,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x11, 0x00, 0x09, 0x12, 0x13, 0x14, 0x21, 0x22, 0x31, 0x41,
0x15, 0x23, 0x32, 0x16, 0x19, 0x35, 0x42, 0x52, 0x61, 0x74, 0x91, 0xb3,
0xff, 0xc4, 0x00, 0x1e, 0x01, 0x00, 0x02, 0x01, 0x04, 0x03, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0x05,
0x01, 0x04, 0x06, 0x09, 0x02, 0x03, 0x0a, 0x00, 0xff, 0xc4, 0x00, 0x39,
0x11, 0x00, 0x02, 0x01, 0x03, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x07,
0x05, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x06,
0x12, 0x21, 0x00, 0x07, 0x31, 0x08, 0x13, 0x22, 0x32, 0x41, 0x51, 0x14,
0x23, 0x61, 0x15, 0x42, 0x62, 0x81, 0xb1, 0x09, 0x17, 0x18, 0x24, 0x33,
0x34, 0x71, 0x52, 0x72, 0x91, 0xa1, 0xd1, 0xff, 0xda, 0x00, 0x0c, 0x03,
0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x1c, 0x6e, 0xdd,
0xae, 0x9a, 0xce, 0x4c, 0x77, 0x6b, 0x11, 0x34, 0x94, 0x39, 0x8e, 0xa2,
0x8e, 0x4c, 0x05, 0x21, 0x4a, 0x22, 0x22, 0x63, 0x18, 0x47, 0xec, 0x00,
0x1c, 0x88, 0x88, 0xfe, 0x3e, 0x7a, 0xd4, 0xdb, 0x33, 0xef, 0x20, 0x13,
0xe7, 0xaf, 0x5e, 0x50, 0xc3, 0x1b, 0xa2, 0x05, 0x40, 0x49, 0x03, 0x80,
0x07, 0x93, 0xf6, 0x03, 0xff, 0x00, 0x40, 0x74, 0xb3, 0x53, 0xae, 0x5e,
0x6f, 0xd6, 0xa8, 0x5a, 0x1d, 0x0e, 0xb1, 0x71, 0xba, 0xde, 0xec, 0x6e,
0x45, 0xa4, 0x05, 0x26, 0xb1, 0x0c, 0xee, 0x5e, 0xd7, 0x2c, 0xa1, 0x4b,
0xe6, 0x72, 0xa4, 0xc4, 0x85, 0xf5, 0x40, 0x0a, 0x41, 0x03, 0x98, 0xe7,
0x02, 0x90, 0x85, 0x10, 0x31, 0x8c, 0x50, 0x10, 0x11, 0xbd, 0xa0, 0xb6,
0xdd, 0x2e, 0x95, 0x8b, 0x41, 0x6e, 0x85, 0xe4, 0x99, 0x8e, 0x02, 0xa8,
0x2c, 0xc7, 0xf9, 0x0c, 0x9f, 0xb9, 0xe3, 0xe8, 0x09, 0xf0, 0x0f, 0x51,
0xf7, 0x9b, 0xae, 0x9e, 0xd3, 0x76, 0x79, 0xf5, 0x1e, 0xa2, 0xab, 0x82,
0x96, 0xdd, 0x00, 0xdd, 0x25, 0x44, 0xd2, 0x22, 0x42, 0x80, 0x9c, 0x02,
0x64, 0x27, 0x6e, 0x49, 0xe0, 0x00, 0x4b, 0x31, 0xc8, 0x00, 0x90, 0x47,
0x4e, 0x93, 0x0c, 0x13, 0x90, 0x22, 0x32, 0x9d, 0x73, 0x16, 0x67, 0xb7,
0x32, 0x7a, 0x87, 0xfd, 0x40, 0xba, 0xed, 0x57, 0xc8, 0x3b, 0x23, 0x4e,
0xb0, 0x54, 0x68, 0xd0, 0x0a, 0x22, 0x82, 0x8a, 0xa6, 0x47, 0x0b, 0x15,
0xb8, 0x8a, 0x82, 0xb9, 0xc8, 0x54, 0x08, 0x64, 0x44, 0x48, 0x53, 0x28,
0x06, 0x50, 0xe4, 0x21, 0x4c, 0x60, 0xc8, 0x68, 0xf4, 0x7d, 0xdc, 0x5e,
0x21, 0xb5, 0x5f, 0xc1, 0xa2, 0x57, 0x24, 0x6f, 0x9d, 0x64, 0x40, 0x30,
0x09, 0xe7, 0xe0, 0x2d, 0x83, 0x8c, 0x67, 0x6e, 0x39, 0x04, 0x90, 0x32,
0x46, 0x1d, 0x55, 0xdc, 0x7d, 0x33, 0x59, 0xa3, 0xaa, 0xb5, 0x87, 0x6e,
0x55, 0x35, 0x27, 0xb2, 0x14, 0x8a, 0x6b, 0x54, 0xf4, 0xd3, 0xd4, 0x48,
0x19, 0x82, 0x92, 0xa0, 0xc9, 0x85, 0xd8, 0x0e, 0xf6, 0x0c, 0x03, 0x10,
0x36, 0xa2, 0xb3, 0x90, 0x3a, 0x20, 0x39, 0x0f, 0xb2, 0xae, 0xf0, 0x56,
0x29, 0x6d, 0x72, 0x36, 0x28, 0x96, 0xc3, 0xbb, 0x51, 0x48, 0x7b, 0x1a,
0x33, 0x0c, 0xa5, 0x30, 0x3e, 0x41, 0x33, 0x99, 0x49, 0x66, 0xc0, 0x26,
0x0f, 0x52, 0x39, 0xab, 0xd2, 0x24, 0x83, 0xde, 0x7c, 0x47, 0x80, 0x6a,
0xe9, 0x43, 0x1b, 0x81, 0x02, 0x94, 0xc3, 0xf1, 0xd1, 0x06, 0xe5, 0xd8,
0x5d, 0x69, 0x05, 0x17, 0xed, 0x2b, 0x3c, 0xb0, 0xd6, 0x40, 0x40, 0x2a,
0x61, 0x93, 0x71, 0x23, 0x3c, 0x91, 0xb8, 0x20, 0x60, 0x07, 0x20, 0x26,
0xe2, 0x7c, 0x01, 0x9e, 0x96, 0xbd, 0x33, 0xeb, 0xe3, 0xd3, 0xed, 0xda,
0xfc, 0xfa, 0x5b, 0x59, 0x43, 0x5d, 0xa7, 0xee, 0x0a, 0xfb, 0x19, 0x2e,
0x34, 0xc0, 0x22, 0x3f, 0x1c, 0x4a, 0xf0, 0xb3, 0xbc, 0x3e, 0x79, 0x32,
0x42, 0xa0, 0x79, 0x24, 0x0e, 0x7a, 0x13, 0x32, 0x4d, 0xe7, 0x61, 0x25,
0xa5, 0xab, 0xf3, 0xec, 0x67, 0x6b, 0xd6, 0x2a, 0xfc, 0x82, 0x91, 0x36,
0x0a, 0xe5, 0x81, 0x8b, 0x98, 0x3b, 0x04, 0x03, 0xb4, 0x87, 0x85, 0x1b,
0x3d, 0x64, 0xb9, 0x48, 0xb2, 0x0a, 0x94, 0x7e, 0xe4, 0x50, 0xa0, 0x3c,
0x70, 0x21, 0xc8, 0x08, 0x08, 0x85, 0xaa, 0xa9, 0xeb, 0x68, 0x67, 0x6a,
0x5a, 0xd4, 0x68, 0xe5, 0x5f, 0x2a, 0xc0, 0x86, 0x07, 0xec, 0x41, 0xe4,
0x11, 0xe0, 0x8f, 0x20, 0xe4, 0x1e, 0x41, 0xe9, 0xd0, 0xa4, 0x96, 0xdd,
0x71, 0xa2, 0x86, 0xe7, 0x6d, 0x92, 0x39, 0xa9, 0x66, 0x50, 0xf1, 0x4b,
0x13, 0x24, 0x91, 0x48, 0x87, 0xc3, 0xc7, 0x22, 0x12, 0x8e, 0xa7, 0xee,
0xa4, 0xfd, 0x8f, 0x3c, 0x74, 0xa3, 0x5e, 0x5d, 0xc2, 0x8f, 0xd4, 0x29,
0x9c, 0xba, 0x00, 0xf6, 0x67, 0x37, 0xd0, 0xe9, 0x44, 0x87, 0xf9, 0xa5,
0xf9, 0x01, 0x01, 0xfc, 0xfd, 0xba, 0xa5, 0x33, 0x31, 0x97, 0x19, 0x3e,
0x0f, 0xd4, 0xfd, 0xc7, 0x56, 0xf7, 0x24, 0x8d, 0x29, 0xc1, 0x08, 0x3e,
0x61, 0xe4, 0x03, 0xf4, 0x3f, 0x71, 0xd4, 0xaf, 0xd4, 0x1c, 0x73, 0x8e,
0x9d, 0xcb, 0xe6, 0x7d, 0x9c, 0xcf, 0x30, 0x49, 0xd9, 0xb5, 0xeb, 0x4e,
0x2a, 0x6d, 0xf2, 0x55, 0xb6, 0x9a, 0xe8, 0xe5, 0x49, 0x86, 0x5c, 0xb7,
0x49, 0xbe, 0x33, 0x0a, 0x15, 0x29, 0x73, 0x9b, 0x90, 0xf6, 0xef, 0xa4,
0x13, 0x33, 0x87, 0x60, 0x24, 0x50, 0xbe, 0xdd, 0x88, 0x11, 0x42, 0x0a,
0x6b, 0x1f, 0xa2, 0x1f, 0x6f, 0x6c, 0xd4, 0x13, 0x4f, 0x5b, 0xaa, 0x6f,
0x51, 0xfb, 0x94, 0x54, 0x2a, 0x1c, 0xc6, 0x79, 0x12, 0xca, 0xe7, 0x6c,
0x31, 0x37, 0x04, 0x85, 0x77, 0xe5, 0x8e, 0xd6, 0x1b, 0x12, 0x40, 0x47,
0x82, 0x02, 0xfd, 0xef, 0xd5, 0x3a, 0xa2, 0x0a, 0x1b, 0x0f, 0x69, 0x7b,
0x73, 0x52, 0x60, 0xd4, 0xda, 0x9a, 0x67, 0xa4, 0x82, 0x71, 0x92, 0xd4,
0x54, 0x50, 0xc7, 0xee, 0x5c, 0xab, 0xd4, 0x0c, 0x7e, 0x64, 0x30, 0x10,
0x90, 0x61, 0x95, 0xbd, 0xd9, 0x37, 0x23, 0x07, 0x41, 0xd1, 0x7a, 0xed,
0xc9, 0x96, 0xfb, 0x81, 0x63, 0x9b, 0x76, 0xc3, 0x6d, 0xe6, 0x44, 0xed,
0xf1, 0x98, 0x76, 0x4a, 0xd5, 0xb5, 0x4f, 0x20, 0xe7, 0x8d, 0x93, 0x62,
0x1c, 0x41, 0xe2, 0xb9, 0x88, 0x78, 0xd6, 0x08, 0x39, 0x21, 0x58, 0x42,
0x46, 0xc9, 0x01, 0x5f, 0xab, 0x14, 0xa2, 0x4a, 0x47, 0x11, 0xba, 0x64,
0x2a, 0x65, 0x14, 0xa2, 0x9b, 0x09, 0x85, 0x51, 0x02, 0x9c, 0x0e, 0x3d,
0xb9, 0xba, 0xeb, 0xfa, 0x3a, 0xeb, 0x8e, 0xae, 0xb9, 0x58, 0xa4, 0xa9,
0x7a, 0xd2, 0x84, 0x49, 0x91, 0x1b, 0xaa, 0xae, 0xee, 0x15, 0x4a, 0x92,
0xca, 0xc0, 0xa6, 0x36, 0x9d, 0xb8, 0x45, 0xc1, 0x23, 0x18, 0x48, 0xbd,
0x52, 0xe8, 0xaf, 0x4d, 0x5a, 0xa2, 0xc9, 0xa6, 0x7b, 0x23, 0xa5, 0xfb,
0x99, 0x45, 0x63, 0xa3, 0xd3, 0xcb, 0x51, 0x1f, 0xe1, 0x1c, 0x54, 0x56,
0x24, 0x92, 0xc8, 0xc8, 0x4c, 0x95, 0x13, 0x41, 0x98, 0x16, 0xa5, 0x58,
0x4a, 0x65, 0x66, 0x2c, 0x77, 0xcd, 0x20, 0x50, 0x83, 0x2a, 0x4a, 0xdd,
0x7f, 0xb9, 0xe6, 0xa0, 0x66, 0x09, 0x84, 0xb5, 0xef, 0x6d, 0xb1, 0x8d,
0xe7, 0x59, 0x6e, 0x96, 0xd1, 0xfd, 0x38, 0x31, 0x5e, 0xe9, 0xe2, 0xe4,
0xa0, 0x29, 0x76, 0xd5, 0x04, 0xe0, 0x90, 0x24, 0xd2, 0x59, 0x70, 0x5a,
0x25, 0xc1, 0x4d, 0xea, 0x90, 0x08, 0x2b, 0x28, 0x97, 0x98, 0xa8, 0x00,
0x50, 0x11, 0xf8, 0xe8, 0xb1, 0x07, 0x71, 0x74, 0x9d, 0xe6, 0x4f, 0xd8,
0x3a, 0xa6, 0x99, 0xe9, 0x64, 0x7e, 0x3d, 0xaa, 0xc8, 0xb6, 0xa3, 0xfd,
0x0e, 0x0b, 0x65, 0x4a, 0xf3, 0x80, 0x5c, 0x28, 0x39, 0xe3, 0x39, 0x19,
0x4d, 0x2e, 0x5e, 0x92, 0x3b, 0xdf, 0xa1, 0xe8, 0x4f, 0x73, 0x3b, 0x2b,
0x77, 0xa7, 0xbe, 0xd0, 0x53, 0x7c, 0x5f, 0x8c, 0xb0, 0xd6, 0x19, 0x67,
0x84, 0x60, 0xb6, 0x5e, 0x14, 0xf6, 0xea, 0x50, 0x8d, 0xa7, 0x70, 0x45,
0x7d, 0xa0, 0x65, 0x88, 0x1c, 0xf4, 0xdd, 0x64, 0x1d, 0x15, 0xcc, 0x3a,
0x43, 0x2d, 0x35, 0xb0, 0xbd, 0xad, 0x64, 0x9c, 0x23, 0x09, 0xe6, 0x13,
0xd9, 0x4b, 0x42, 0x6d, 0x13, 0x2b, 0xc9, 0x61, 0x9c, 0xb4, 0xd0, 0x82,
0x2a, 0xbc, 0x5a, 0x9e, 0xa2, 0xa7, 0x39, 0xe1, 0x66, 0x4c, 0x4e, 0x45,
0x1f, 0x44, 0x45, 0x25, 0x4d, 0xe0, 0x42, 0xf0, 0x42, 0xfb, 0x65, 0xec,
0x6b, 0xf4, 0x6d, 0xd7, 0x48, 0x4a, 0xd7, 0xee, 0xdc, 0xb9, 0xf6, 0xf3,
0xba, 0x5a, 0x36, 0x25, 0xa3, 0x94, 0x7d, 0x4c, 0x79, 0x24, 0xab, 0xe3,
0xc0, 0x07, 0xec, 0x14, 0x80, 0x3d, 0xb7, 0xc9, 0xb4, 0xc7, 0xa8, 0x6d,
0x0f, 0xea, 0x02, 0x8a, 0x9f, 0xb6, 0x1e, 0xaf, 0x61, 0x06, 0x7e, 0x63,
0xa4, 0xd4, 0x70, 0xa2, 0xa5, 0x75, 0x13, 0x9c, 0x04, 0x5a, 0xd0, 0xa1,
0x56, 0xae, 0x94, 0x1f, 0x9f, 0x70, 0xdc, 0xa3, 0x2c, 0x72, 0xe7, 0xde,
0x8a, 0x3c, 0x6e, 0x06, 0x0a, 0xc0, 0xfd, 0xdf, 0xb5, 0x11, 0xde, 0xe4,
0x6b, 0x14, 0x1a, 0x90, 0x7b, 0x49, 0x8a, 0xa2, 0x5d, 0xb1, 0x98, 0xac,
0x3f, 0x62, 0x10, 0xf7, 0xf7, 0xcf, 0x21, 0x12, 0xf5, 0x26, 0xb1, 0xb5,
0xc1, 0xa8, 0x07, 0x91, 0x9f, 0x22, 0x5f, 0x21, 0x8e, 0x5d, 0x42, 0x89,
0x88, 0xa9, 0x9b, 0x89, 0x0e, 0x0d, 0xdc, 0x28, 0x06, 0xc5, 0x75, 0xc6,
0x9c, 0xb0, 0xf7, 0x73, 0x48, 0x3e, 0xa8, 0xb1, 0x47, 0xb6, 0xe5, 0x00,
0x39, 0x5c, 0x7e, 0x66, 0x54, 0x65, 0xa1, 0x70, 0x3e, 0x66, 0xc7, 0x31,
0x93, 0xe7, 0x81, 0x95, 0x0d, 0x95, 0x28, 0x76, 0x3b, 0xb8, 0xbd, 0xc6,
0xf4, 0x45, 0xde, 0xc4, 0xec, 0x5f, 0x76, 0xaa, 0x44, 0xda, 0x3e, 0xe2,
0xe8, 0xd1, 0xcc, 0xad, 0xee, 0x53, 0x2a, 0x4e, 0x71, 0x05, 0xd6, 0x89,
0xc9, 0xc0, 0x85, 0x8f, 0x15, 0x48, 0xa4, 0x06, 0x41, 0x20, 0x65, 0x33,
0x44, 0x98, 0xa9, 0xed, 0x49, 0xc2, 0x4e, 0xdc, 0x91, 0xca, 0x22, 0x61,
0x49, 0xc4, 0x68, 0xac, 0x9f, 0x99, 0x05, 0x33, 0xf0, 0x63, 0x22, 0x20,
0x06, 0x28, 0xfc, 0x80, 0xfc, 0xfc, 0x80, 0xfc, 0x80, 0xf2, 0x1d, 0x25,
0x74, 0xc0, 0xac, 0xe5, 0x4f, 0x90, 0x0f, 0xeb, 0xf5, 0x1d, 0x6e, 0x82,
0xf3, 0x1b, 0xc3, 0x11, 0x89, 0xfe, 0x65, 0x7c, 0x1f, 0xe4, 0x1b, 0xff,
0x00, 0x23, 0xf5, 0xe8, 0xe4, 0x76, 0xe3, 0xa4, 0xd1, 0x6d, 0x38, 0xb7,
0x4d, 0xe8, 0x77, 0x68, 0xa8, 0x97, 0x95, 0x8c, 0xe3, 0xdd, 0x46, 0xcb,
0x66, 0xbe, 0x92, 0x58, 0xa0, 0x78, 0xeb, 0x31, 0xb1, 0xbe, 0x33, 0x5d,
0xdd, 0x52, 0x11, 0xf2, 0x46, 0xfd, 0xb5, 0xd0, 0x3c, 0x92, 0x89, 0xac,
0x0d, 0x95, 0x03, 0x11, 0x55, 0x38, 0x28, 0x94, 0xc0, 0x3c, 0x0b, 0x27,
0xda, 0xda, 0x0a, 0x2a, 0x9b, 0x1d, 0xa2, 0xdf, 0x70, 0x50, 0x62, 0x9e,
0xe5, 0x23, 0xb1, 0x3e, 0x0f, 0xb1, 0x4e, 0x1a, 0x28, 0xdb, 0xe8, 0xca,
0xcf, 0x23, 0x7c, 0x24, 0x1c, 0x96, 0xc1, 0xeb, 0x5e, 0x7e, 0xa9, 0xef,
0xda, 0x86, 0xcf, 0xac, 0x75, 0xd6, 0xa2, 0xb0, 0x4c, 0xe9, 0x57, 0x6a,
0xd1, 0xf4, 0x90, 0xd3, 0x6c, 0xf9, 0xa2, 0xfd, 0xa9, 0x76, 0x54, 0xad,
0xa8, 0x8c, 0x8f, 0x89, 0x24, 0x14, 0xe0, 0xa9, 0x91, 0x08, 0x64, 0x5c,
0x90, 0x41, 0x19, 0x16, 0x66, 0xda, 0xcc, 0xeb, 0xb4, 0x98, 0x59, 0xf5,
0x2d, 0xe6, 0x05, 0xd3, 0x59, 0x5d, 0xab, 0xaa, 0x48, 0x36, 0x7a, 0xe3,
0x21, 0x3d, 0xae, 0xe6, 0x18, 0x6c, 0x7d, 0x67, 0xa7, 0x9d, 0x13, 0x20,
0x0c, 0xd1, 0x67, 0x16, 0xf5, 0x33, 0x1d, 0xf0, 0xae, 0x53, 0xb8, 0x38,
0x99, 0x23, 0x00, 0x17, 0xdb, 0x81, 0x04, 0x39, 0x39, 0x47, 0xa6, 0x73,
0x54, 0x5f, 0x35, 0x35, 0x9a, 0x48, 0x5a, 0xc5, 0x68, 0x35, 0xb1, 0x1c,
0xfb, 0x84, 0x4c, 0xb1, 0x94, 0xc7, 0x8c, 0x29, 0x56, 0x67, 0xcf, 0xf0,
0x83, 0xf6, 0xe3, 0xcf, 0x5a, 0x97, 0xec, 0xd7, 0x6e, 0xbb, 0x3f, 0xaf,
0xa9, 0xae, 0x10, 0xf7, 0x1f, 0x5d, 0xa6, 0x9f, 0xad, 0x43, 0x18, 0xa6,
0x59, 0x68, 0x67, 0xaa, 0x8a, 0x70, 0xc1, 0xb7, 0xb3, 0xcd, 0x0b, 0x05,
0x87, 0x61, 0x0a, 0x30, 0xe3, 0x9d, 0xdb, 0x81, 0xc2, 0x9e, 0x98, 0x0c,
0x73, 0xb4, 0x5a, 0x6d, 0xdc, 0x99, 0x9d, 0xbf, 0x55, 0xb3, 0x9e, 0x22,
0x95, 0xab, 0xe5, 0x88, 0xa6, 0x2a, 0x39, 0xbb, 0xea, 0x9e, 0xcf, 0x52,
0xbf, 0xa6, 0x72, 0x2c, 0x72, 0x69, 0x7d, 0x2a, 0x49, 0x42, 0x98, 0xc3,
0xfb, 0xe5, 0x4c, 0x40, 0x4e, 0x47, 0xb1, 0x8b, 0x15, 0x74, 0x8a, 0x05,
0x50, 0x41, 0x20, 0x12, 0x98, 0x61, 0x2d, 0xfa, 0x97, 0x49, 0xf7, 0x05,
0x24, 0xd3, 0x97, 0x9a, 0x53, 0x1d, 0x48, 0xf9, 0xa9, 0xea, 0x13, 0x6c,
0x83, 0xf8, 0x90, 0xf9, 0xc8, 0x1c, 0x82, 0xa5, 0x64, 0x51, 0x86, 0x21,
0x7a, 0x25, 0x6a, 0x9e, 0xd0, 0xf7, 0xd3, 0xd2, 0xac, 0xf4, 0x5d, 0xe0,
0xed, 0xed, 0xed, 0x2a, 0x2c, 0xb2, 0x30, 0x10, 0x5e, 0x2d, 0x33, 0xfb,
0xb4, 0xac, 0x5b, 0x91, 0x14, 0xe0, 0x7c, 0x85, 0xbc, 0x34, 0x33, 0xa1,
0x89, 0xce, 0x53, 0x2e, 0x43, 0x00, 0xc5, 0x61, 0xe9, 0x9c, 0x8b, 0xda,
0xe7, 0x61, 0xb1, 0xce, 0xa7, 0xe5, 0x0b, 0xb4, 0xfe, 0x47, 0xd1, 0x6d,
0x89, 0x9f, 0x3d, 0x53, 0x53, 0x32, 0xad, 0xd6, 0x40, 0xd2, 0x76, 0xcc,
0x03, 0x6a, 0x30, 0x7a, 0x8d, 0xb1, 0xcc, 0xeb, 0xf3, 0x7c, 0xac, 0xc1,
0xe1, 0x79, 0x2c, 0x62, 0xe7, 0xe0, 0x4a, 0x62, 0x81, 0x0a, 0x50, 0x21,
0x17, 0x14, 0x61, 0x2d, 0x73, 0xd7, 0x76, 0xda, 0xfd, 0x4f, 0xa6, 0x2e,
0x12, 0x34, 0xb6, 0x6a, 0xa3, 0xb2, 0x9a, 0x46, 0xe4, 0xc3, 0x27, 0xd2,
0x17, 0x3f, 0xf4, 0x9e, 0x02, 0xf1, 0x8e, 0x41, 0x50, 0x14, 0x49, 0xb4,
0x87, 0xae, 0x28, 0x34, 0xbf, 0xab, 0xee, 0xd8, 0xdd, 0x3b, 0xcb, 0xa4,
0x68, 0x23, 0xa1, 0xee, 0x1d, 0x96, 0x31, 0x35, 0xe6, 0x8e, 0x9d, 0x76,
0xc3, 0x72, 0xa3, 0x1c, 0x3d, 0xd2, 0x9e, 0x31, 0xf2, 0xcd, 0x11, 0xe6,
0xad, 0x06, 0x72, 0x32, 0xcc, 0x77, 0xb4, 0x42, 0x45, 0x8d, 0x8b, 0x88,
0x0e, 0xdf, 0xfb, 0xd3, 0x8b, 0xf7, 0x22, 0x98, 0x51, 0x86, 0xd7, 0xcd,
0xc5, 0xb8, 0xc7, 0x6b, 0xde, 0xe4, 0xd5, 0x99, 0x94, 0x1b, 0x57, 0xa1,
0xed, 0x0f, 0x45, 0x42, 0x53, 0x32, 0x08, 0xa2, 0x50, 0xf1, 0x4d, 0x61,
0x5c, 0x55, 0x68, 0xf9, 0x7e, 0x00, 0xa2, 0x45, 0x14, 0x31, 0xbc, 0xd6,
0x74, 0x63, 0xf5, 0xcb, 0x50, 0x42, 0x34, 0x26, 0xb5, 0xa6, 0xd5, 0x94,
0x63, 0x6d, 0x05, 0x7b, 0x88, 0x2a, 0xd4, 0x70, 0xa2, 0x43, 0x93, 0x1c,
0xde, 0x70, 0x3f, 0x79, 0x9d, 0x88, 0xe3, 0x0f, 0xe5, 0xe6, 0xcf, 0x56,
0x3d, 0xae, 0xae, 0xff, 0x00, 0x12, 0x9e, 0x9e, 0x6e, 0xfd, 0x8d, 0xbf,
0x7e, 0x6e, 0xa6, 0xd3, 0x30, 0x4b, 0x73, 0xb1, 0xcc, 0xdc, 0xca, 0xf4,
0x91, 0xe0, 0xd7, 0x5b, 0x72, 0x79, 0x65, 0xd9, 0xb6, 0x4a, 0x74, 0xc9,
0x3b, 0x82, 0xa8, 0xdb, 0x14, 0x01, 0x7a, 0xa9, 0xa6, 0xca, 0x53, 0x61,
0x31, 0xd6, 0xe4, 0x6d, 0x65, 0x06, 0xb2, 0x44, 0x93, 0xad, 0xd4, 0xb3,
0xcd, 0xbe, 0x32, 0x05, 0x24, 0x04, 0xa6, 0x41, 0x06, 0xa7, 0x9a, 0x3b,
0xb4, 0x91, 0x20, 0x97, 0xe9, 0xf1, 0x48, 0x1c, 0xfa, 0x40, 0x01, 0xf6,
0xf4, 0xf8, 0xf8, 0xe3, 0x8e, 0x93, 0x0d, 0x65, 0x43, 0x15, 0xbb, 0x5b,
0xdc, 0xe8, 0xe9, 0xc8, 0xf6, 0xd2, 0x69, 0x42, 0x81, 0x8c, 0x05, 0x12,
0x10, 0xa3, 0x8f, 0xb0, 0x00, 0x75, 0xba, 0x6e, 0xd4, 0x5f, 0x6e, 0x1a,
0x9f, 0xb1, 0x9a, 0x37, 0x51, 0xdd, 0x89, 0x35, 0x55, 0x36, 0xda, 0x17,
0x90, 0x9c, 0xe4, 0xb8, 0xa7, 0x08, 0xcc, 0x73, 0xce, 0x5b, 0x6e, 0xee,
0x7c, 0xe7, 0x3f, 0x5e, 0x9f, 0x5c, 0x41, 0x2b, 0x3b, 0x7e, 0xd0, 0x5d,
0x88, 0xa2, 0x52, 0x25, 0x5f, 0x43, 0x65, 0xcd, 0x33, 0xd8, 0xea, 0xfe,
0xfa, 0x63, 0xf7, 0xd5, 0xb7, 0x0e, 0x1a, 0x5d, 0x9a, 0x57, 0x9d, 0x34,
0x2d, 0x5e, 0xd9, 0x25, 0x16, 0xaa, 0x40, 0x22, 0x51, 0x85, 0x70, 0x84,
0x64, 0xaa, 0xa7, 0x1f, 0xe0, 0x51, 0x20, 0x8f, 0x20, 0x22, 0x03, 0x97,
0x69, 0x9a, 0x9a, 0xaa, 0xfe, 0xde, 0xd7, 0xdb, 0xed, 0x4e, 0x56, 0xb6,
0x82, 0xa1, 0x2b, 0x53, 0x1f, 0x3b, 0x21, 0x1e, 0xd4, 0x9b, 0x79, 0xca,
0xac, 0x67, 0xd9, 0x76, 0x6e, 0x36, 0xf2, 0xc0, 0xf1, 0xd0, 0xe7, 0x5c,
0xd1, 0x5b, 0xb4, 0xdf, 0xa9, 0x2d, 0x31, 0xa8, 0xf5, 0x04, 0x2b, 0x2d,
0x97, 0x53, 0xda, 0xaa, 0x74, 0xe5, 0x4a, 0xca, 0x15, 0xa9, 0xcd, 0x52,
0x39, 0xac, 0xa3, 0x8a, 0x60, 0xde, 0x7f, 0x16, 0x8d, 0x2d, 0x32, 0x0f,
0xde, 0x3b, 0x87, 0x07, 0x07, 0xa2, 0xbb, 0x82, 0x7b, 0xd2, 0xef, 0xfc,
0x26, 0x15, 0x8c, 0xcd, 0x79, 0xa7, 0x48, 0x24, 0x33, 0x66, 0xbf, 0x56,
0xcc, 0x2c, 0x6e, 0x1b, 0x29, 0x8e, 0x90, 0x75, 0x8f, 0x82, 0x4d, 0x04,
0x16, 0x16, 0xae, 0x64, 0xc1, 0x8a, 0x89, 0x2c, 0xc5, 0x4f, 0x49, 0x5e,
0x48, 0xab, 0x86, 0xfe, 0x83, 0x11, 0x51, 0x33, 0x97, 0xd4, 0x6f, 0xf3,
0xe0, 0x63, 0xd3, 0x7d, 0xe6, 0xd7, 0x22, 0xc0, 0x97, 0xcb, 0xe5, 0x99,
0xa6, 0xa3, 0x53, 0x86, 0x9d, 0x15, 0x93, 0x20, 0x70, 0x5f, 0xe5, 0x64,
0x38, 0x3c, 0x36, 0xd0, 0xab, 0xbb, 0x2b, 0xf0, 0x9e, 0x93, 0x3e, 0xe3,
0x7a, 0x09, 0xf4, 0xd5, 0x70, 0xd7, 0xd3, 0x68, 0x2d, 0x05, 0xdc, 0x05,
0xb5, 0x6a, 0x59, 0xfe, 0x28, 0x2d, 0x55, 0x45, 0x2a, 0x76, 0x33, 0x2e,
0xf4, 0x8b, 0xdc, 0x0d, 0x1c, 0xcb, 0xb9, 0x79, 0x44, 0x7f, 0x72, 0xa3,
0x69, 0x0d, 0xb6, 0x4e, 0x37, 0x12, 0x8d, 0xbb, 0xc5, 0xf8, 0xdf, 0xb8,
0x56, 0xa0, 0x52, 0xb7, 0x27, 0x58, 0xa6, 0xd4, 0x89, 0xce, 0xd8, 0xd2,
0xa0, 0x7c, 0xf3, 0xa9, 0xb9, 0xa6, 0x29, 0xb7, 0xe9, 0x17, 0x58, 0x77,
0xf1, 0x40, 0xab, 0xc7, 0x35, 0x99, 0x01, 0x00, 0x13, 0x19, 0x07, 0x4a,
0x36, 0x77, 0x1c, 0xe9, 0x82, 0xc2, 0x74, 0x93, 0x73, 0xc9, 0x84, 0xa6,
0x02, 0x18, 0xa7, 0x25, 0x6a, 0xba, 0x0b, 0x7e, 0xbb, 0xd2, 0x31, 0xea,
0xed, 0x38, 0xe5, 0x6b, 0x21, 0x43, 0x35, 0x3c, 0xab, 0x8d, 0xe0, 0xa6,
0x4b, 0x44, 0x7c, 0x8c, 0xe5, 0x59, 0x70, 0x49, 0x55, 0x90, 0x67, 0x90,
0x18, 0x32, 0xa1, 0xd9, 0x4d, 0x5b, 0xaa, 0xbd, 0x33, 0x77, 0xba, 0xbf,
0xb1, 0x3d, 0xdb, 0x80, 0x49, 0xa7, 0x6b, 0xa7, 0x16, 0xeb, 0xcd, 0x03,
0x9d, 0xf4, 0xef, 0x1c, 0xd8, 0x44, 0xab, 0x8f, 0xc0, 0x0f, 0x1a, 0xba,
0x4f, 0x14, 0xc9, 0xb5, 0xda, 0x1e, 0x01, 0x52, 0xca, 0x57, 0x39, 0x89,
0xc4, 0x3f, 0x73, 0x5e, 0xd0, 0x72, 0x19, 0x19, 0x28, 0xf4, 0x62, 0x2d,
0x19, 0x03, 0x01, 0x06, 0x65, 0xa9, 0x99, 0x98, 0x98, 0x8b, 0x53, 0x2f,
0x15, 0x74, 0x95, 0x7e, 0x5f, 0xd3, 0xd7, 0x01, 0xf5, 0x13, 0xf4, 0xa5,
0x22, 0xdd, 0x34, 0x05, 0x4a, 0x20, 0x71, 0x41, 0x63, 0x80, 0xff, 0x00,
0x23, 0x07, 0x5c, 0x6f, 0x2d, 0x17, 0x70, 0xfb, 0x4e, 0xf7, 0x17, 0x41,
0xef, 0x34, 0x26, 0x50, 0x17, 0xf7, 0x67, 0x87, 0x3b, 0x82, 0x13, 0xc8,
0x05, 0xd1, 0xa3, 0xcf, 0x9d, 0x8c, 0x73, 0xe4, 0xf5, 0xf6, 0x87, 0x8a,
0xb7, 0xd2, 0x77, 0xad, 0xc8, 0xf4, 0xb3, 0x4a, 0x64, 0xa3, 0xa4, 0xb9,
0x7e, 0x06, 0x6d, 0xc0, 0x11, 0x3d, 0xbe, 0xb0, 0x88, 0xff, 0x00, 0x35,
0x48, 0xda, 0xc5, 0xa9, 0xa6, 0x49, 0x4a, 0x91, 0xb4, 0x48, 0xaa, 0x47,
0x80, 0x7a, 0x48, 0xcc, 0x76, 0x98, 0x8d, 0xdc, 0xec, 0x8f, 0x64, 0xc9,
0x37, 0x99, 0x18, 0xa8, 0x87, 0xb7, 0xcd, 0x42, 0x4b, 0x26, 0x4a, 0x4e,
0x4c, 0xb9, 0x49, 0xab, 0x18, 0xbb, 0x3d, 0x79, 0x92, 0x72, 0x62, 0xe0,
0xab, 0x08, 0x00, 0x26, 0x3f, 0xab, 0x44, 0x89, 0x48, 0x21, 0xc0, 0xfe,
0xe0, 0x14, 0x3e, 0xfc, 0x75, 0xd1, 0x7c, 0x9e, 0x3d, 0x5d, 0xd9, 0x89,
0xab, 0x6e, 0x25, 0x4b, 0xb5, 0x2f, 0xb8, 0xc4, 0xf0, 0x0c, 0xb0, 0x8d,
0xc7, 0xfe, 0x03, 0x4a, 0x98, 0x03, 0xec, 0x71, 0xce, 0x71, 0xd5, 0xf6,
0x84, 0xb4, 0xd6, 0xf6, 0x07, 0xfb, 0x40, 0x29, 0x34, 0xb6, 0x9d, 0x89,
0xe4, 0x8e, 0x92, 0xf6, 0x69, 0x12, 0x34, 0x04, 0xb3, 0xd1, 0xd5, 0x48,
0x61, 0x0a, 0x54, 0x64, 0xb7, 0xf9, 0x59, 0xb2, 0xd9, 0xc8, 0xe0, 0x9e,
0xa9, 0x27, 0x51, 0x50, 0x55, 0x70, 0x9a, 0xa2, 0x45, 0x13, 0x15, 0x63,
0x05, 0x53, 0x26, 0xb0, 0x88, 0xac, 0x41, 0x39, 0x91, 0x30, 0x81, 0xc4,
0x7e, 0x7c, 0xb9, 0x11, 0xe4, 0x47, 0xe7, 0x9e, 0x79, 0xe9, 0x00, 0xa6,
0x18, 0x98, 0xe7, 0xec, 0x7c, 0x7f, 0xc8, 0xeb, 0xd0, 0x15, 0xe9, 0x76,
0x46, 0x53, 0x20, 0xe1, 0xf1, 0x91, 0xe3, 0x80, 0xc3, 0x8f, 0xd3, 0xed,
0xfa, 0x74, 0xe7, 0x60, 0xcc, 0xe3, 0x75, 0xd6, 0xec, 0xcf, 0x59, 0xcc,
0xd4, 0x14, 0x22, 0xe4, 0xe6, 0x2b, 0x0e, 0x9d, 0xb0, 0x99, 0xa9, 0xd8,
0x52, 0x2b, 0xaa, 0x9e, 0x45, 0x82, 0x91, 0x48, 0xed, 0x26, 0xeb, 0x53,
0x28, 0x18, 0xa6, 0x2a, 0x8c, 0xa4, 0x5b, 0x1c, 0xe9, 0x1b, 0xc8, 0xa6,
0xf4, 0xd4, 0x2a, 0x0b, 0x14, 0x3c, 0x92, 0x2f, 0x53, 0xba, 0x63, 0x52,
0x55, 0xe9, 0x5b, 0xe4, 0x77, 0x6a, 0x50, 0x18, 0x02, 0x43, 0xa3, 0x72,
0xb2, 0x23, 0x02, 0xae, 0x8e, 0xa7, 0x86, 0x56, 0x52, 0x41, 0x07, 0xef,
0x91, 0x86, 0xc3, 0x0c, 0x43, 0xb8, 0x7d, 0xbd, 0xb0, 0x77, 0x57, 0x42,
0x55, 0xe8, 0x4d, 0x48, 0xcf, 0x1c, 0x13, 0x84, 0x68, 0xe6, 0x88, 0xe2,
0x6a, 0x5a, 0x88, 0x88, 0x7a, 0x7a, 0xb8, 0x18, 0x10, 0x56, 0x58, 0x24,
0x01, 0x86, 0x08, 0xde, 0xa5, 0xe3, 0x3f, 0x0b, 0x9e, 0xac, 0xbf, 0x6b,
0xdf, 0xf8, 0x6f, 0xed, 0x9f, 0x31, 0x5a, 0xd1, 0x3d, 0x76, 0xb2, 0x66,
0x2c, 0x73, 0x1d, 0x87, 0x9e, 0xe1, 0xdb, 0x04, 0x3a, 0x73, 0x68, 0x4f,
0xdc, 0xb5, 0x45, 0x07, 0xec, 0x97, 0x66, 0x76, 0x37, 0x4a, 0x92, 0x65,
0x3c, 0xa3, 0xb6, 0xcd, 0x1a, 0x2a, 0xeb, 0xda, 0xca, 0xb4, 0x2a, 0xec,
0x9d, 0xa6, 0xd0, 0x86, 0x5d, 0xc2, 0x7f, 0x59, 0xce, 0xda, 0x56, 0x6b,
0xa8, 0xa5, 0xed, 0xac, 0x94, 0xba, 0x1e, 0x81, 0xaa, 0xa9, 0x8c, 0x2d,
0x11, 0xf8, 0xc3, 0x3d, 0x38, 0x70, 0x54, 0x89, 0x63, 0x20, 0xbb, 0x05,
0x05, 0xb6, 0xc9, 0x82, 0x8c, 0x14, 0xfb, 0x8c, 0x08, 0x20, 0xea, 0x76,
0xcd, 0xe9, 0xaa, 0xb8, 0x7a, 0xb0, 0x82, 0xef, 0xea, 0x23, 0x53, 0xc5,
0x6c, 0xba, 0x3d, 0x74, 0x75, 0xd1, 0x3f, 0xb6, 0xd1, 0x53, 0xde, 0x5a,
0x39, 0x16, 0x41, 0x25, 0x05, 0x69, 0x2b, 0x4d, 0x14, 0x92, 0xca, 0xa8,
0x26, 0xa6, 0x94, 0xc7, 0x3c, 0x2d, 0x21, 0x58, 0xa2, 0x6f, 0x84, 0x2b,
0xd3, 0xdb, 0x5f, 0x35, 0xeb, 0x7e, 0xb5, 0xf6, 0x87, 0x88, 0x97, 0x6d,
0x9e, 0xf1, 0xed, 0xf1, 0x7c, 0x61, 0x8a, 0x6c, 0xd9, 0x13, 0x22, 0xc4,
0x30, 0xb2, 0x24, 0x69, 0xda, 0xcc, 0xc4, 0x8a, 0xaf, 0xe5, 0x14, 0xad,
0x2d, 0x14, 0xb0, 0x95, 0xe2, 0x4e, 0x51, 0x59, 0xd2, 0x2c, 0x0a, 0x45,
0x12, 0x0f, 0x70, 0xb7, 0xd6, 0x97, 0x9a, 0x6b, 0x26, 0x63, 0x4d, 0x76,
0xf6, 0xf7, 0xa7, 0xf4, 0xf7, 0x6a, 0x04, 0xc2, 0xba, 0x39, 0x5e, 0x38,
0xa4, 0x95, 0xd4, 0x30, 0x0c, 0xae, 0xe5, 0x9c, 0x47, 0xb0, 0x90, 0x43,
0x65, 0x95, 0x06, 0x46, 0x1d, 0x8e, 0xe5, 0xca, 0xb0, 0x3d, 0x60, 0x3e,
0xaa, 0xf4, 0x0f, 0x74, 0xfb, 0xaf, 0xeb, 0x6e, 0x6a, 0x29, 0x34, 0xdd,
0x4d, 0x22, 0x57, 0xd6, 0x52, 0x52, 0xd2, 0xc8, 0xd1, 0x37, 0xb7, 0x34,
0x11, 0x2c, 0x70, 0x8a, 0xa5, 0x99, 0x73, 0x13, 0x46, 0xc8, 0x8d, 0x39,
0x2a, 0xe7, 0xda, 0x4f, 0x82, 0x4d, 0xaf, 0x1b, 0x01, 0xc5, 0xe8, 0xd6,
0xd4, 0x6a, 0xfe, 0xb7, 0x76, 0x79, 0xc7, 0x70, 0x37, 0x5d, 0x84, 0xc4,
0xc7, 0xbc, 0xa3, 0x8a, 0x6d, 0x48, 0x2b, 0x8f, 0x98, 0xdc, 0xda, 0x49,
0x5e, 0x97, 0xb1, 0xce, 0x38, 0x9a, 0x94, 0x46, 0xb0, 0xda, 0x05, 0x33,
0x19, 0xf9, 0xde, 0x90, 0xf2, 0x2d, 0xdb, 0x19, 0xba, 0x68, 0x9b, 0xc4,
0xe2, 0x3f, 0x22, 0x4e, 0x0e, 0x36, 0x3a, 0x1b, 0x52, 0x69, 0x7d, 0x3d,
0xda, 0x48, 0xe8, 0x9a, 0xe3, 0x13, 0xcc, 0x23, 0x9c, 0x84, 0x12, 0x06,
0x90, 0xb4, 0x8d, 0x23, 0xaa, 0x6c, 0xce, 0xfd, 0xd8, 0x75, 0x07, 0x8c,
0x0c, 0xe7, 0x38, 0xe7, 0xa9, 0xef, 0x50, 0xbd, 0x9f, 0xee, 0xf7, 0x75,
0x3d, 0x71, 0x5c, 0xee, 0x76, 0x2d, 0x33, 0x5a, 0x2d, 0xe6, 0xb2, 0x8c,
0x8a, 0x96, 0x81, 0xd6, 0x9c, 0x52, 0xd3, 0xa4, 0x10, 0xb5, 0x5b, 0x54,
0xb0, 0x10, 0x88, 0x48, 0x89, 0xa4, 0x12, 0x19, 0x06, 0x57, 0xf8, 0xb2,
0x3a, 0x05, 0x77, 0x94, 0x77, 0x2b, 0x1f, 0xf6, 0xf5, 0xa9, 0x62, 0x3d,
0xa6, 0xce, 0x6a, 0x60, 0xfc, 0x5a, 0xa3, 0x38, 0x77, 0x5a, 0xe9, 0xa5,
0x93, 0xf5, 0x16, 0xa8, 0xe5, 0xfc, 0xd8, 0x8b, 0x79, 0x5f, 0x74, 0xf5,
0xfc, 0xca, 0x2d, 0x48, 0x49, 0x18, 0x98, 0x36, 0x2b, 0x19, 0xc3, 0xd4,
0x55, 0x9d, 0x30, 0x91, 0xcb, 0x86, 0x88, 0x90, 0x5b, 0x97, 0x86, 0xe2,
0x60, 0x65, 0xf2, 0x3d, 0x67, 0x6c, 0xd0, 0x0d, 0x6e, 0xd4, 0xd7, 0x3f,
0xc3, 0x52, 0x96, 0x06, 0x9e, 0x91, 0x91, 0x7d, 0xc9, 0x94, 0xb9, 0x62,
0x5b, 0x68, 0x12, 0x22, 0x29, 0x2c, 0xca, 0x65, 0xc8, 0x2c, 0xa3, 0x6a,
0xe4, 0x23, 0x8d, 0x88, 0xe9, 0xd7, 0xec, 0x56, 0xa5, 0xf5, 0x33, 0x59,
0xad, 0x3b, 0x3f, 0xa7, 0x45, 0xd6, 0xee, 0x1a, 0x75, 0xba, 0x5f, 0xa2,
0x9d, 0xcd, 0x0d, 0xbd, 0x9a, 0x1d, 0x91, 0xc7, 0x03, 0x48, 0x5a, 0x0a,
0xaa, 0xc9, 0x94, 0x24, 0x2e, 0xb4, 0x60, 0x34, 0x51, 0x3b, 0x37, 0xb8,
0x7f, 0x34, 0x01, 0xf1, 0x5b, 0xff, 0x00, 0x11, 0x53, 0xfe, 0x11, 0xff,
0x00, 0xf4, 0x4b, 0xa0, 0xad, 0x2f, 0xfa, 0xbf, 0xc8, 0xff, 0x00, 0x51,
0xd3, 0x39, 0x74, 0xff, 0x00, 0x6c, 0x3f, 0xee, 0x1f, 0xd0, 0xf5, 0x87,
0x30, 0x8f, 0x3d, 0xc2, 0xfe, 0x47, 0x6c, 0x06, 0x15, 0x8c, 0x26, 0x02,
0xa8, 0x73, 0x14, 0x07, 0x91, 0xf8, 0x01, 0xf1, 0x0e, 0x7f, 0xeb, 0xaa,
0xb4, 0x0d, 0xb8, 0xe4, 0xf5, 0x58, 0x6b, 0xa1, 0x31, 0x29, 0x50, 0x71,
0x81, 0xf4, 0x1f, 0xfd, 0xeb, 0xa7, 0xa0, 0x59, 0x72, 0x56, 0x26, 0xb8,
0xc6, 0xe4, 0x3c, 0x53, 0x7e, 0xb2, 0xe3, 0x3b, 0xf4, 0x3a, 0x66, 0x42,
0x36, 0xe3, 0x46, 0x9f, 0x71, 0x5e, 0x9f, 0x41, 0x23, 0xf2, 0x0a, 0x37,
0x3a, 0xa9, 0x87, 0x0b, 0x20, 0xa0, 0x09, 0x80, 0xed, 0x97, 0x2a, 0x88,
0x9c, 0x0c, 0x20, 0x64, 0xcd, 0xcf, 0x52, 0x56, 0x8b, 0x9d, 0xda, 0xc3,
0x5a, 0xb7, 0x0b, 0x45, 0x43, 0x45, 0x32, 0xf8, 0x65, 0x25, 0x4f, 0x38,
0xc8, 0xe0, 0x8e, 0x0e, 0x00, 0x23, 0xea, 0x38, 0x3c, 0x75, 0x13, 0xa9,
0x6c, 0xfa, 0x57, 0x5a, 0x58, 0xe5, 0xd3, 0x1a, 0xca, 0xdb, 0x15, 0x7d,
0xb6, 0x52, 0x0b, 0xc1, 0x51, 0x1a, 0xcb, 0x19, 0x61, 0xe1, 0x82, 0xb7,
0x28, 0xeb, 0xe5, 0x64, 0x42, 0xae, 0xa4, 0x0d, 0xac, 0x3a, 0x99, 0x6e,
0xf7, 0xc2, 0xff, 0x00, 0x72, 0x59, 0xd4, 0x9e, 0x7d, 0xd5, 0xfd, 0x0e,
0xd9, 0xbb, 0x5b, 0xd5, 0x81, 0x67, 0x99, 0x17, 0x29, 0x6b, 0xab, 0x7a,
0xfe, 0x4e, 0x92, 0x31, 0x43, 0xf9, 0x3d, 0x99, 0x84, 0x59, 0x97, 0xb8,
0x30, 0xf2, 0x22, 0x22, 0xa2, 0x3f, 0x71, 0x11, 0xfb, 0x88, 0xf2, 0x41,
0xfe, 0xf4, 0xae, 0x95, 0x23, 0x37, 0xab, 0x6d, 0x15, 0x54, 0xad, 0xcb,
0xcb, 0x24, 0x01, 0x64, 0x63, 0xf7, 0x2d, 0x09, 0x8b, 0x3f, 0xae, 0xec,
0x9f, 0xd7, 0xa0, 0x44, 0x5e, 0x9c, 0x34, 0xd5, 0x8d, 0x12, 0x97, 0xb6,
0xfa, 0xbb, 0x51, 0xd8, 0x68, 0xd0, 0x61, 0x69, 0x68, 0xee, 0x8d, 0x2d,
0x22, 0x0f, 0xb4, 0x70, 0x56, 0x25, 0x46, 0xc0, 0x3c, 0x0d, 0xaf, 0xe3,
0x8e, 0xb5, 0x2e, 0xfc, 0x65, 0xfa, 0xa0, 0xfa, 0xda, 0xf3, 0x83, 0xb4,
0xc7, 0x51, 0xa5, 0xce, 0xc9, 0x68, 0xe5, 0x6e, 0xda, 0xff, 0x00, 0xaf,
0x2c, 0x10, 0xca, 0x7e, 0x8a, 0xe4, 0x14, 0xd4, 0x2a, 0x56, 0x69, 0x63,
0x3e, 0x72, 0x90, 0xf8, 0x88, 0x80, 0x19, 0x12, 0x90, 0x4b, 0xf7, 0x28,
0x94, 0xdf, 0x3d, 0x51, 0xbb, 0xa7, 0x7b, 0x80, 0x03, 0x64, 0xa1, 0xa3,
0xa2, 0x90, 0x64, 0x09, 0x20, 0x80, 0x7b, 0x9b, 0x4f, 0xcc, 0x37, 0xc9,
0xee, 0x38, 0xcf, 0x8c, 0xab, 0x29, 0x1e, 0x47, 0x23, 0xaa, 0x9f, 0x4d,
0x7a, 0x22, 0xf1, 0x94, 0xee, 0x66, 0xa1, 0xbf, 0x6a, 0x38, 0x37, 0x2b,
0x8a, 0x7b, 0x9d, 0xd2, 0x43, 0x47, 0xb9, 0x4e, 0x46, 0x69, 0x29, 0x45,
0x3c, 0x6c, 0x33, 0xc9, 0x0c, 0x58, 0x1f, 0x0d, 0x91, 0xc7, 0x50, 0x82,
0xc6, 0xbd, 0xbe, 0xe7, 0x64, 0x9a, 0xba, 0x5d, 0xad, 0x33, 0x57, 0x5b,
0x9d, 0x95, 0xd7, 0xbe, 0xb1, 0xdc, 0x2d, 0xf3, 0xae, 0xec, 0x96, 0x79,
0xd5, 0xbf, 0xd6, 0xe9, 0xf2, 0xe2, 0x75, 0x4f, 0xc7, 0xf9, 0x4a, 0x26,
0xf1, 0x20, 0x0f, 0x05, 0x29, 0x43, 0xe3, 0xa1, 0xc5, 0xc2, 0xaa, 0xe1,
0x75, 0xaa, 0x6a, 0xdb, 0x94, 0xed, 0x2c, 0xac, 0x72, 0x59, 0x89, 0x62,
0x4f, 0xdc, 0x93, 0xc9, 0x38, 0x03, 0x93, 0xc9, 0xc0, 0xcf, 0x4c, 0x15,
0xaa, 0x0b, 0x25, 0x86, 0xd5, 0x4f, 0x61, 0xb0, 0x51, 0xc7, 0x4b, 0x41,
0x00, 0xdb, 0x14, 0x10, 0x46, 0x91, 0x43, 0x1a, 0xfd, 0x92, 0x34, 0xc2,
0x8f, 0xd4, 0xe3, 0x27, 0xcb, 0x12, 0x79, 0xeb, 0xd6, 0xbd, 0x0a, 0xfc,
0x24, 0x0f, 0xe9, 0x0b, 0x43, 0x9b, 0xd9, 0x9f, 0x90, 0x51, 0x73, 0xa6,
0x5e, 0x3c, 0xd2, 0xfc, 0x81, 0x07, 0xfd, 0xbf, 0x1d, 0x74, 0xd3, 0x40,
0xfe, 0xef, 0xc3, 0x8f, 0x07, 0xfa, 0x8e, 0xb8, 0xdc, 0xeb, 0xa9, 0xc5,
0x30, 0xdf, 0xbb, 0x1b, 0x87, 0x80, 0x0f, 0xd0, 0xfe, 0xa3, 0xaf, 0xff,
0xd9
};
unsigned int logo_jpg_len = 7561;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,78 @@
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "sdkconfig.h"
#include "unity.h"
#include "../include/jpeg_decoder.h"
#include "test_logo_jpg.h"
#include "test_logo_rgb888.h"
#define TESTW 46
#define TESTH 46
TEST_CASE("Test JPEG decompression library", "[esp_jpeg]")
{
char aapix[] = " .:;+=xX$$";
unsigned char *decoded, *p, *o;
int x, y, v;
int decoded_outsize = TESTW * TESTH * 3;
decoded = malloc(decoded_outsize);
for (x = 0; x < decoded_outsize; x += 2) {
decoded[x] = 0;
decoded[x + 1] = 0xff;
}
/* JPEG decode */
esp_jpeg_image_cfg_t jpeg_cfg = {
.indata = (uint8_t *)logo_jpg,
.indata_size = sizeof(logo_jpg),
.outbuf = decoded,
.outbuf_size = decoded_outsize,
.out_format = JPEG_IMAGE_FORMAT_RGB888,
.out_scale = JPEG_IMAGE_SCALE_0,
.flags = {
.swap_color_bytes = 0,
}
};
esp_jpeg_image_output_t outimg;
esp_err_t err = esp_jpeg_decode(&jpeg_cfg, &outimg);
TEST_ASSERT_EQUAL(err, ESP_OK);
/* Decoded image size */
TEST_ASSERT_EQUAL(outimg.width, TESTW);
TEST_ASSERT_EQUAL(outimg.height, TESTH);
p = decoded;
o = logo_rgb888;
for (x = 0; x < outimg.width * outimg.height; x++) {
/* The color can be +- 2 */
TEST_ASSERT(p[0] >= (o[0] - 2) && p[0] <= (o[0] + 2));
TEST_ASSERT(p[1] >= (o[1] - 2) && p[1] <= (o[1] + 2));
TEST_ASSERT(p[2] >= (o[2] - 2) && p[2] <= (o[2] + 2));
p += 3;
o += 3;
}
p = decoded + 2;
for (y = 0; y < outimg.width; y++) {
for (x = 0; x < outimg.height; x++) {
v = ((*p) * (sizeof(aapix) - 2) * 2) / 256;
printf("%c%c", aapix[v / 2], aapix[(v + 1) / 2]);
p += 3;
}
printf("%c%c", ' ', '\n');
}
free(decoded);
}

1297
esp_jpeg/tjpgd/tjpgd.c Normal file

File diff suppressed because it is too large Load Diff

102
esp_jpeg/tjpgd/tjpgd.h Normal file
View File

@ -0,0 +1,102 @@
/*----------------------------------------------------------------------------/
/ TJpgDec - Tiny JPEG Decompressor R0.03 include file (C)ChaN, 2021
/----------------------------------------------------------------------------*/
#ifndef DEF_TJPGDEC
#define DEF_TJPGDEC
#ifdef __cplusplus
extern "C" {
#endif
#include "tjpgdcnf.h"
#include <string.h>
#if defined(_WIN32) /* VC++ or some compiler without stdint.h */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef short int16_t;
typedef unsigned long uint32_t;
typedef long int32_t;
#else /* Embedded platform */
#include <stdint.h>
#endif
#if JD_FASTDECODE >= 1
typedef int16_t jd_yuv_t;
#else
typedef uint8_t jd_yuv_t;
#endif
/* Error code */
typedef enum {
JDR_OK = 0, /* 0: Succeeded */
JDR_INTR, /* 1: Interrupted by output function */
JDR_INP, /* 2: Device error or wrong termination of input stream */
JDR_MEM1, /* 3: Insufficient memory pool for the image */
JDR_MEM2, /* 4: Insufficient stream input buffer */
JDR_PAR, /* 5: Parameter error */
JDR_FMT1, /* 6: Data format error (may be broken data) */
JDR_FMT2, /* 7: Right format but not supported */
JDR_FMT3 /* 8: Not supported JPEG standard */
} JRESULT;
/* Rectangular region in the output image */
typedef struct {
uint16_t left; /* Left end */
uint16_t right; /* Right end */
uint16_t top; /* Top end */
uint16_t bottom; /* Bottom end */
} JRECT;
/* Decompressor object structure */
typedef struct JDEC JDEC;
struct JDEC {
size_t dctr; /* Number of bytes available in the input buffer */
uint8_t *dptr; /* Current data read ptr */
uint8_t *inbuf; /* Bit stream input buffer */
uint8_t dbit; /* Number of bits availavble in wreg or reading bit mask */
uint8_t scale; /* Output scaling ratio */
uint8_t msx, msy; /* MCU size in unit of block (width, height) */
uint8_t qtid[3]; /* Quantization table ID of each component, Y, Cb, Cr */
uint8_t ncomp; /* Number of color components 1:grayscale, 3:color */
int16_t dcv[3]; /* Previous DC element of each component */
uint16_t nrst; /* Restart inverval */
uint16_t width, height; /* Size of the input image (pixel) */
uint8_t *huffbits[2][2]; /* Huffman bit distribution tables [id][dcac] */
uint16_t *huffcode[2][2]; /* Huffman code word tables [id][dcac] */
uint8_t *huffdata[2][2]; /* Huffman decoded data tables [id][dcac] */
int32_t *qttbl[4]; /* Dequantizer tables [id] */
#if JD_FASTDECODE >= 1
uint32_t wreg; /* Working shift register */
uint8_t marker; /* Detected marker (0:None) */
#if JD_FASTDECODE == 2
uint8_t longofs[2][2]; /* Table offset of long code [id][dcac] */
uint16_t *hufflut_ac[2]; /* Fast huffman decode tables for AC short code [id] */
uint8_t *hufflut_dc[2]; /* Fast huffman decode tables for DC short code [id] */
#endif
#endif
void *workbuf; /* Working buffer for IDCT and RGB output */
jd_yuv_t *mcubuf; /* Working buffer for the MCU */
void *pool; /* Pointer to available memory pool */
size_t sz_pool; /* Size of momory pool (bytes available) */
size_t (*infunc)(JDEC *, uint8_t *, size_t); /* Pointer to jpeg stream input function */
void *device; /* Pointer to I/O device identifiler for the session */
};
/* TJpgDec API functions */
JRESULT jd_prepare (JDEC *jd, size_t (*infunc)(JDEC *, uint8_t *, size_t), void *pool, size_t sz_pool, void *dev);
JRESULT jd_decomp (JDEC *jd, int (*outfunc)(JDEC *, void *, JRECT *), uint8_t scale);
#ifdef __cplusplus
}
#endif
#endif /* _TJPGDEC */

35
esp_jpeg/tjpgd/tjpgdcnf.h Normal file
View File

@ -0,0 +1,35 @@
/*----------------------------------------------*/
/* TJpgDec System Configurations R0.03 */
/*----------------------------------------------*/
#include "sdkconfig.h"
#define JD_SZBUF CONFIG_JD_SZBUF
/* Specifies size of stream input buffer */
#define JD_FORMAT CONFIG_JD_FORMAT
/* Specifies output pixel format.
/ 0: RGB888 (24-bit/pix)
/ 1: RGB565 (16-bit/pix)
/ 2: Grayscale (8-bit/pix)
*/
#define JD_USE_SCALE CONFIG_JD_USE_SCALE
/* Switches output descaling feature.
/ 0: Disable
/ 1: Enable
*/
#define JD_TBLCLIP CONFIG_JD_TBLCLIP
/* Use table conversion for saturation arithmetic. A bit faster, but increases 1 KB of code size.
/ 0: Disable
/ 1: Enable
*/
#define JD_FASTDECODE CONFIG_JD_FASTDECODE
/* Optimization level
/ 0: Basic optimization. Suitable for 8/16-bit MCUs.
/ 1: + 32-bit barrel shifter. Suitable for 32-bit MCUs.
/ 2: + Table conversion for huffman decoding (wants 6 << HUFF_BIT bytes of RAM)
*/

View File

@ -9,7 +9,7 @@ set(EXTRA_COMPONENT_DIRS ../libsodium ../expat ../cbor ../jsmn ../qrcode ../coap
# 2. Add here if the component is compatible with IDF >= v4.4
if("${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}" VERSION_GREATER_EQUAL "4.4")
list(APPEND EXTRA_COMPONENT_DIRS ../pid_ctrl ../esp_encrypted_img ../pcap)
list(APPEND EXTRA_COMPONENT_DIRS ../pid_ctrl ../esp_encrypted_img ../pcap ../esp_jpeg)
endif()
# 3. Add here if the component is compatible with IDF >= v5.0