diff --git a/CMakeLists.txt b/CMakeLists.txt index 74787f40c..321c5bd6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -275,6 +275,7 @@ option(LWS_WITH_LEJP "With the Lightweight JSON Parser" ON) option(LWS_WITH_CBOR "With the Lightweight LECP CBOR Parser" OFF) option(LWS_WITH_CBOR_FLOAT "Build floating point types if building CBOR LECP" ON) option(LWS_WITH_SQLITE3 "Require SQLITE3 support" OFF) +option(LWS_WITH_LHP "With the Lightweight HTML5 parser" ON) option(LWS_WITH_STRUCT_JSON "Generic struct serialization to and from JSON" OFF) option(LWS_WITH_STRUCT_SQLITE3 "Generic struct serialization to and from SQLITE3" OFF) option(LWS_WITH_JSONRPC "JSON RPC support" ON) @@ -352,7 +353,10 @@ option(LWS_WITH_ALLOC_METADATA_LWS "Build lws_*alloc() with compressed backtrace # option(LWS_WITH_OTA "Build with support for Over The Air update download and validation" OFF) set(LWS_OTA_VARIANT "set-LWS_OTA_VARIANT" CACHE STRING "Build Variant ID for OTA filtering") -set(LWS_OTA_PUBLIC_JWK "set-LWS_OTA_PUBLIC_JWK" CACHE STRING "Filepath to public JWK used for OTA validation") +set(LWS_OTA_PUBLIC_JWK_FILE "$ENV{HOME}/.lws_ota/libwebsockets.org-ota-v1.public.jwk" CACHE STRING "Filepath of public JWK used to validate packages") +if (LWS_WITH_OTA) + file(READ ${LWS_OTA_PUBLIC_JWK_FILE} LWS_OTA_PUBLIC_JWK) +endif() if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") diff --git a/READMEs/README.html-parser.md b/READMEs/README.html-parser.md new file mode 100644 index 000000000..a5f649798 --- /dev/null +++ b/READMEs/README.html-parser.md @@ -0,0 +1,294 @@ +# lws LHP HTML5 and CSS parser and render pipeline + +## Please note this is working end-end, but some parts incomplete and generally pre-alpha... looking for interested parties to help + +![overview](../doc-assets/lhp-overview.png) +
*LHP Stream-parses HTML and CSS into a DOM and then into DLOs (lws +Display List Objects). Multiple, antialiased, proportional fonts, JPEG and PNGs +are supported. A linewise rasterizer is provided well-suited to resource- +constrained devices with SPI based displays.*
+ +![example](../doc-assets/lhp-acep7.jpg) +
*Page fetched from `https://libwebsockets.org/lhp-tests/t1.html` by +an ESP32, and rendered by lws on a 600x448 ACEP 7-colour EPD with 24-bit +composition. The warning symbol at the bottom right is a .png `` in an +absolutely positioned `
`. The yellow shapes at the top right are divs with +css-styled rounded corners. The red div is partly transparent. Display only +has a 7 colour palette. Server only sends CSS/HTML/JPEG/PNG, all parsing and +rendering done on the ESP32.*
+ +## Overview + +Lws is able to parse **and render** a subset of CSS + HTML5 on very constrained +devices such as ESP32, which have a total of 200KB heap available after boot at +best. There are some technology advances in lws that allow much greater +capability that has previously been possible on those platforms. + +The goal is that all system display content is expressed in HTML/CSS by user +code, which may also be dynamically generated, with CSS responsive layout +simplifying managing the same UI over different display dimensions. + +There are restrictions - most generic html on the internet are too complex or +want more assets from different hosts than tiny devices can connect to - but +they are quite far beyond what you would expect from a 200KB heap limit. It +is very possible to mix remote and local http content over h2 including large +JPEG and PNG images and express all UI in html/css. + +### Features + + - Parses common HTML and CSS, somewhat beyond html5 and CSS2.1 (supports + some CSS3) + - Uses Secure Streams to bring in HTML, and references to JPEG and PNG ``, + toplevel async renderer api takes an lws VFS file:// or https:// URL + retrieved via SS. There's easy, customizable lws VFS support at SS for + transparently referencing dynamically-generated or .text, or SD card-stored + HTML, or other assets + - No framebuffer... rendered strictly linewise. RGB framebuffer for 600x448 + image above would be 800KB, lws can render it efficiently on an ESP32 with + only the default 200KB memory available. + - Image data is fetched from local or remote as needed during composition, + image buffering just 2 lines (PNG) or 8 or 16 lines (JPEG) plus decompressor + overhead (see below for more details) + - Layout supports DIVs, text wrapping, margin and padding, font colour, + selection and weight supported via CSS; implementation still early on others + - HTML element ID names that the user code cares about can be given, these are + found during parse and layout information for the elements kept + - Rendering is very flexible and lightweight, supports Y (8-) or RGB (24-) bit + line buffer and composition, alpha composing, Gamma correction, RGB565 and + individual palette RGB/Y packing, Dynamic Floyd-Steinberg error diffusion so + the same render can look as good as possible even on B&W display + - EPD Gray levels and spot colour palette (eg, BW-Red) supported + - Compatible with LCD/OLED but understands needs of EPD, display management is + all done via the event loop without any blocking waits. + - LHP, DLO and lws_display use fixed-point int32:8 sig digits, FPU not needed + - SPI DMA supported crossplatform, ESP32 driver provided + - lws_display drivers provided for several common SPI display chips, most + support ping-pong buffering so DMA proceeds while next line rendered + - 9 specific display + ESP32 example combinations provided + - HTML Parse -> 320x240 565 SPI Display update complete possible in under 250ms + on ESP32 WROVER KIT, remote assets slow it down + +### Restrictions + + - Only quite basic HTML + CSS implemented atm, old `style=` element attributes + not supported. + - Requires correct HTML, not yet tolerant of missing end tags etc + - CSS must be inline in the HTML atm + - lws understands ETAGs but there's no support to cache assets yet, they are + fetched anew in realtime each time + - There is no JS support. Information can be collected from laid-out elements + though by passing a list of IDs to the html parser api at the start. + - There's no CSS Rotation, animation etc + - There's no image scaling, images are presented 1:1 + - There is a DOM representation, but for optimal memory usage it is stream- + parsed and destroyed element by element after using it to produce the DLO + layout, so only DOM parent elements that are still open exist at any one time. + This allows the parser to scale to complex html where most of it will be + discarded. + - CSS is parsed and kept for the whole HTML parse, since it doesn't know which + pieces will be needed until it has parsed the html. So giant CSS alone will + overflow available memory on constrained targets + +Heap Costs during active decode (while rendering line that includes image) + +|Feature|Decoder Cost in heap (600px width)| +|---|---| +|JPEG-Grayscale|6.5KB| +|JPEG-YUV 4:4:4|16.4KB| +|JPEG-YUV 4:4:2v|16.4KB| +|JPEG-YUV 4:4:2h|31KB| +|JPEG-YUV 4:4:0|31KB| +|PNG|36KB| + +Connecting to an external tls source costs around 50KB. So for very constrained +targets like ESP32, the only practical way is a single h2 connection that +provides the assets as streams multiplexed inside a single tls tunnel. + +### JIT_TRUST + +Integrates CA trust bundle dynamic querying into lws, with openssl and mbedtls. +It can support all the typical Mozilla 130+ trusted CAs, using the trust chain +information from the server cert to identify the CA cert required, and just +instantiating that one to validate the server cert, if it trusts it. The +trust CTX is kept around in heap for a little while for the case there are +multiple connections needing it. + +No heap is needed for trusted certs that are not actively required. This means +lws can securely connect over tls to arbitrary servers like a browser would +without using up all the memory; without this it's not possible to support +arbitrary connections securely within the memory constraints. + +### Display List Objects (DLO) + +Lws supports a logical Display List for graphical primitives common in HTML + +CSS, including compressed antialiased fonts, JPEG, PNG and rounded rectangles. + +This intermediate representation allows display surface layout without having +all the details to hand, and provides flexibility for how to render the logical +representation of the layout. + +### Linewise rendering + +There may not be enough heap to hold a framebuffer for even a midrange display +device, eg an RGB buffer for the 600 x 448 display at the top of the page is +800KB. Even if there is, for display devices that hold a framebuffer on the +display, eg, SPI TFT, OLED, or Electrophoretic displays, the display data is +anyway sent linewise (perhaps in two planes, but still linewise) to the display. + +In this case, there is no need for a framebuffer at the device, if the software +stack is rewritten to stream-parse all the page elements asynchronously, and +each time enough is buffered, processed and composed to produce the next line's +worth of pixels. Only one or two lines' worth of buffer is required then. + +This is the lws approach, rewrite the asset decoders to operate completely +statefully so they can collaborate to provide just the next line's data Just-in- +Time. + +### PNG and JPEG stream parsers + +Lws includes fully stream-parsed decoders, which can run dry for input or output +at any state safely, and pick up where they left off when more data or space is +next available. + +These were rewritten from UPNG and Picojpeg to be wholly stateful. These DLO +are bound to flow-controlled SS so the content can be provided to the composer +Just In Time. The rewrite requires that it can exit the decode at any byte +boundary, due to running out of input, or needing to flush output, and resume +with the same state, this is a complete inversion of the original program flow +where it only returns when it has rendered the whole image into a fullsize +buffer and decode state is spread around stack or filescope variables. + +PNG transparency is supported via its A channel and composed by modulating +alpha. + +### Compressed, Anti-aliased fonts + +Based on mcufont, these are 4-bit antialised fonts produced from arbitrary TTFs. +They are compressed, a set of a dozen different font sizes from 10px thru 32px +and bold sizes only costs 100KB storage. The user can choose their own fonts +and sizes, the encoder is included in lws. + +The mcufont decompressor was rewritten to be again completely stateful, glyphs +present on the current line are statefully decoded to produce that line's-worth +of output only and paused until the next line. Only glyphs that appear on the +current line have instantiated decoders. + +The anti-alias information is composed into the line buffer as alpha. + +### Integration of PNG, JPEG and file:// VFS sources into Secure Streams + +Secure Streams and lws VFS now work together via `file://` URLs, a SS can be +directed to a local VFS resource the same way as to an `https://` resource. +Resources from https:// and file:// can refer to each other in CSS or `` +cleanly. + +![example](../doc-assets/lhp-ss-unification.png) +
*All local and remote resources are fetched using Secure Streams with +a VFS `file://` or `https://` URL. Delivery of enough data to render the next +line from multiple sources without excess buffering is handled by `lws_flow`.*
+ +Dynamic content, such as dynamic HTML, can be registered in a DLO VFS filesystem +and referenced via SS either as the toplevel html document or by URLs inside the +HTML. + +`.jpg` and `.png` resources can be used in the html and are fetched using their +own SS, if coming from the same server over h2, these have very modest extra +memory needs since they are sharing the existing h2 connection and tls. + +### H2 tx credit buffer management + +All of the efforts to make JPEG or PNG stream-parsed are not useful if either +there is an h1 connection requiring a new TLS session that exhausts the heap, +or even if multiplexed into the same h2 session, the whole JPEG or PNG is +dumped too quickly into the device which cannot buffer it. + +On constrained devices, the only mix that allows multiple streaming assets that +are decoded as they come, is an h2 server with streaming modulated by h2 tx +credit. The demos stream css, html, JPEG and CSS from libwebsockets.org over h2. +In lws, `lws_flow` provides the link between maximum buffering targets and the +tx_credit flow control management. + +The number of assets that can be handled simultaneously on an HTML page is +restricted by the irreducible heap cost of decoding them, about 36KB + an RGB +line buffer for PNGs, and an either 8 (YUV4:4:4) or 16 RGB (4:4:2 or 4:4:0) +line buffer for JPEG. + +However, PNG and JPEG decode occurs lazily starting at the render line where the +object starts becoming visible, and all DLO objects are destroyed after the last +line where they are visible. The SS responsible for fetching and regulating the +bufferspace needed is started at layout-time, and the parser is started too up +to the point that the header with the image dimensions is decoded, but not +beyond that where the large decoder allocation is required. + +It means only images that appear on the same line have decoders that are +instantiated in memory at the same time; images that don't share any horizontal +common lines do not exist in heap simultaneously; basically multiple vertically +stacked images cost little more than one. + +The demo shows that even on ESP32, the images are cheap enough to allow a full +size background JPEG with a partially-transparent PNG composed over it. + +### lws_display Composition, palette and dithering + +Internally, lws provides either a 8-bit Y (grayscale) or 32-bit RGBA (trucolor) +composition pipeline for all display elements, based on if the display device is +monochrome or not. Alpha (opacity) is supported. This is true regardless of +final the bit depth of the display device, so even B&W devices can approximate +the same output. + +Gamma of 2.2 is also applied before palettization, then floyd-steinberg +dithering, all with just a line buffer and no framebuffer needed at the device. +The assets like JPEG can be normal, RGB ones, and the rendering adapts down to +the display palette and capabilities dynamically. + +The `lws_display` support in lws has been extended to a variety of common EPD +controllers such as UC8171, supporting B&W, B&W plus a third colour (red or +yellow typically) and 4-level Gray. The ILI9341 driver for the displays found +on WROVER KIT and the ESP32S Kaluga KIT has been enhanced to work with the new +display pipline using native 565. + +![overview](../doc-assets/lhp-400-300-red.jpg) +
*HTML rendered on the device from file:// VFS-stored normal RGB JPEG and HTML/CSS, by ESP32 with BW-Red palette 400x300 EPD*
+ +![overview](../doc-assets/lhp-rgb-example.png) +
*Test html rendered to 24-bit RGB data directly*
+ +![overview](../doc-assets/lhp-example-g4.jpg) +
*Test html rendered to 300x240 4-gray palette EPD (from RGB JPEG also fetched from server during render) using Y-only composition... notice effectiveness of error diffusion use of the palette*
+ +![overview](../doc-assets/lhp-104-212-red.jpg) +
*Test html rendered to 104 x 212 BW-Red palette EPD, red h1 text set by CSS `color:#f00`, on a lilygo ESP32-based EPD label board*
+ +![overview](../doc-assets/lhp-epd-flex-104.jpg) +
*Test html rendered to 104 x 212 BW flexible EPD, notice font legibility, effectiveness of dither and presence of line breaks*
+ +![overview](https://libwebsockets.org/wrover-boot.gif) +
*ESP32 WROVER KIT running the example carousel on a 320x200 565 RGB SPI display. 10s delay between tests snipped for brevity, otherwise shown realtime. Moire is artifact of camera. As composition is linewise, the JPEG and other data from libwebsockets.org is arriving and being completely parsed / composed in the time taken to update the display. Interleaved SPI DMA used to send line to display while rendering the next.*
+ +## Top level API + +``` +int +lws_lhp_ss_browse(struct lws_context *cx, lws_display_render_state_t *rs, + const char *url, sul_cb_t render); +``` + +You basically give it an `https://` or `file://` URL, a structure for the +render state, and a callback for when the DLOs have been created and lines of +pixels are being emitted. The source fetching, parsing, layout, and finally +rendering proceed asynchronously on the event loop without blocking beyond the +time taken to emit by default 4 lines. + +In these examples, the renderer callback passes the lines of pixels to the +`lws_display` blit op. + +See `./include/libwebsockets/lws-html.h` for more information. + +Also see `./minimal-examples-lowlevel/api-tests/api-test-lhp-dlo/main.c` +example, you can render to 24-bit RGB on stdout by giving it a URL, eg + +``` + $ ./bin/lws-api-test-lhp-dlo https://libwebsockets.org/lhp-tests/t1.html >/tmp/a.data +``` + +The raw RGB can be opened in GIMP. diff --git a/cmake/lws_config.h.in b/cmake/lws_config.h.in index 20992de2d..5a9e1a2ff 100644 --- a/cmake/lws_config.h.in +++ b/cmake/lws_config.h.in @@ -188,6 +188,7 @@ #cmakedefine LWS_WITH_CBOR_FLOAT #cmakedefine LWS_WITH_JSONRPC #cmakedefine LWS_WITH_LEJP +#cmakedefine LWS_WITH_LHP #cmakedefine LWS_WITH_LIBEV #cmakedefine LWS_WITH_LIBEVENT #cmakedefine LWS_WITH_LIBUV diff --git a/doc-assets/lhp-104-212-red.jpg b/doc-assets/lhp-104-212-red.jpg new file mode 100644 index 000000000..d1bc79fbc Binary files /dev/null and b/doc-assets/lhp-104-212-red.jpg differ diff --git a/doc-assets/lhp-400-300-red.jpg b/doc-assets/lhp-400-300-red.jpg new file mode 100644 index 000000000..a325f46b6 Binary files /dev/null and b/doc-assets/lhp-400-300-red.jpg differ diff --git a/doc-assets/lhp-acep7.jpg b/doc-assets/lhp-acep7.jpg new file mode 100644 index 000000000..8439ad658 Binary files /dev/null and b/doc-assets/lhp-acep7.jpg differ diff --git a/doc-assets/lhp-epd-flex-104.jpg b/doc-assets/lhp-epd-flex-104.jpg new file mode 100644 index 000000000..4b3e88de5 Binary files /dev/null and b/doc-assets/lhp-epd-flex-104.jpg differ diff --git a/doc-assets/lhp-example-g4.jpg b/doc-assets/lhp-example-g4.jpg new file mode 100644 index 000000000..0e23936b5 Binary files /dev/null and b/doc-assets/lhp-example-g4.jpg differ diff --git a/doc-assets/lhp-overview.png b/doc-assets/lhp-overview.png new file mode 100644 index 000000000..c0de5e870 Binary files /dev/null and b/doc-assets/lhp-overview.png differ diff --git a/doc-assets/lhp-rgb-example.png b/doc-assets/lhp-rgb-example.png new file mode 100644 index 000000000..e4266ad0f Binary files /dev/null and b/doc-assets/lhp-rgb-example.png differ diff --git a/doc-assets/lhp-ss-unification.png b/doc-assets/lhp-ss-unification.png new file mode 100644 index 000000000..8b8f6964d Binary files /dev/null and b/doc-assets/lhp-ss-unification.png differ diff --git a/include/libwebsockets.h b/include/libwebsockets.h index ebad8492c..0da17677f 100644 --- a/include/libwebsockets.h +++ b/include/libwebsockets.h @@ -798,6 +798,8 @@ lws_fx_string(const lws_fx_t *a, char *buf, size_t size); #include #endif +#include + #ifdef __cplusplus } #endif diff --git a/include/libwebsockets/lws-dlo.h b/include/libwebsockets/lws-dlo.h index 1de3415c1..f19aac4cc 100644 --- a/include/libwebsockets/lws-dlo.h +++ b/include/libwebsockets/lws-dlo.h @@ -49,6 +49,11 @@ struct lws_dlo; /* stores Y in RGBY */ #define PALETTE_RGBY(_r, _g, _b) LWSDC_RGBA(_r, _g, _b, (RGB_TO_Y(_r, _g, _b))) +typedef struct { + lws_fx_t w; + lws_fx_t h; +} lws_dlo_dim_t; + /* * When using RGBA to describe native greyscale, R is Y and A is A, GB is ignored */ @@ -98,20 +103,37 @@ typedef struct lws_display_id { typedef struct lws_dlo { lws_dll2_t list; + lws_dll2_t col_list; /* lws_dlo_t: column-mates */ + lws_dll2_t row_list; /* lws_dlo_t: row-mates */ + /* children are rendered "inside" the parent DLO box after allowing * for parent padding */ lws_dll2_owner_t children; + /* only used for dlo rect representing whole table */ + + lws_dll2_owner_t table_cols; /* lhp_table_col_t */ + lws_dll2_owner_t table_rows; /* lhp_table_row_t */ + + /* may point to dlo whose width or height decides our x or y */ + + struct lws_dlo *abut_x; + struct lws_dlo *abut_y; + lws_dlo_destroy_t _destroy; /* dlo-type specific cb */ lws_dlo_renderer_t render; /* dlo-type specific cb */ + lws_fx_t margin[4]; + lws_fx_t padding[4]; /* child origin */ + lws_display_id_t *id; /* only valid until ids destroyed */ lws_box_t box; lws_display_colour_t dc; uint8_t flag_runon:1; /* continues same line */ - uint8_t flag_done_align:1; /* continues same line */ + uint8_t flag_done_align:1; + uint8_t flag_toplevel:1; /* don't scan up with me (different owner) */ /* render-specific members ... */ } lws_dlo_t; @@ -232,7 +254,8 @@ typedef struct lws_dlo_jpeg { typedef enum { LWSDLOSS_TYPE_JPEG, - LWSDLOSS_TYPE_PNG + LWSDLOSS_TYPE_PNG, + LWSDLOSS_TYPE_CSS, } lws_dlo_image_type_t; typedef struct { @@ -297,6 +320,12 @@ lws_display_render_get_id(lws_display_render_state_t *rs, const char *id); LWS_VISIBLE LWS_EXTERN void lws_display_render_dump_ids(lws_dll2_owner_t *ids); +LWS_VISIBLE LWS_EXTERN void +lws_dlo_contents(lws_dlo_t *parent, lws_dlo_dim_t *dim); + +LWS_VISIBLE LWS_EXTERN void +lws_display_dlo_adjust_dims(lws_dlo_t *dlo, lws_dlo_dim_t *dim); + /** * lws_display_dl_init() - init display list object * @@ -424,17 +453,19 @@ typedef struct { struct lhp_ctx *lhp; lws_dlo_image_t *u; int32_t window; + + uint8_t type; } lws_dlo_ss_create_info_t; -LWS_VISIBLE LWS_EXTERN lws_dlo_t * -lws_dlo_ss_create(lws_dlo_ss_create_info_t *i); +LWS_VISIBLE LWS_EXTERN int +lws_dlo_ss_create(lws_dlo_ss_create_info_t *i, lws_dlo_t **pdlo); typedef struct lhp_ctx lhp_ctx_t; LWS_VISIBLE LWS_EXTERN int lws_dlo_ss_find(struct lws_context *cx, const char *url, lws_dlo_image_t *u); -LWS_VISIBLE LWS_EXTERN signed char +LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t lhp_displaylist_layout(lhp_ctx_t *ctx, char reason); #define lws_dlo_image_width(_u) ((_u)->failed ? -1 : \ @@ -471,7 +502,7 @@ lws_fonts_destroy(struct lws_context *cx); * Static blob registry (built-in, name-accessible blobs) */ -LWS_VISIBLE LWS_EXTERN int +LWS_VISIBLE LWS_EXTERN lws_dlo_filesystem_t * lws_dlo_file_register(struct lws_context *cx, const lws_dlo_filesystem_t *f); /* only needed if f dynamically heap-allocated... doesn't free data; data @@ -481,6 +512,9 @@ lws_dlo_file_register(struct lws_context *cx, const lws_dlo_filesystem_t *f); LWS_VISIBLE LWS_EXTERN void lws_dlo_file_unregister(lws_dlo_filesystem_t **f); +LWS_VISIBLE LWS_EXTERN void +lws_dlo_file_unregister_by_name(struct lws_context *cx, const char *name); + LWS_VISIBLE LWS_EXTERN const lws_dlo_filesystem_t * lws_dlo_file_choose(struct lws_context *cx, const char *name); diff --git a/include/libwebsockets/lws-html.h b/include/libwebsockets/lws-html.h new file mode 100644 index 000000000..c18eaac73 --- /dev/null +++ b/include/libwebsockets/lws-html.h @@ -0,0 +1,659 @@ +/* + * libwebsockets - small server side websockets and web server implementation + * + * Copyright (C) 2010 - 2022 Andy Green + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Extremely Lightweight HTML5 Stream Parser, same approach as lecp but for + * html5. + */ + +#if !defined(LHP_MAX_ELEMS_NEST) +#define LHP_MAX_ELEMS_NEST 32 +#endif +#if !defined(LHP_MAX_DEPTH) +#define LHP_MAX_DEPTH 12 +#endif +#if !defined(LHP_STRING_CHUNK) +#define LHP_STRING_CHUNK 254 +#endif + +enum lhp_callbacks { + + LHPCB_ERR_ATTRIB_SYNTAX = -5, + LHPCB_ERR_ATTRIB_LEN = -4, + LHPCB_ERR_OOM = -3, + LHPCB_ERR_ELEM_DEPTH = -2, + LHPCB_CONTINUE = -1, + + LHPCB_CONSTRUCTED = 0, + LHPCB_DESTRUCTED = 1, + + LHPCB_COMPLETE = 2, + LHPCB_FAILED = 3, + + LHPCB_ELEMENT_START = 4, /* reported at end of <> */ + LHPCB_ELEMENT_END = 5, + + LHPCB_CONTENT = 6, + + LHPCB_COMMENT = 7, +}; + +/* + * CSS v2.1 full property set, taken from + * + * https://www.w3.org/TR/CSS21/propidx.html + */ + +typedef enum lcsp_props { + LCSP_PROP_AZIMUTH, + LCSP_PROP_BACKGROUND_ATTACHMENT, + LCSP_PROP_BACKGROUND_COLOR, + LCSP_PROP_BACKGROUND_IMAGE, + LCSP_PROP_BACKGROUND_POSITION, + LCSP_PROP_BACKGROUND_REPEAT, + LCSP_PROP_BACKGROUND, + LCSP_PROP_BORDER_COLLAPSE, + LCSP_PROP_BORDER_COLOR, + LCSP_PROP_BORDER_SPACING, + LCSP_PROP_BORDER_STYLE, + LCSP_PROP_BORDER_TOP, + LCSP_PROP_BORDER_RIGHT, + LCSP_PROP_BORDER_BOTTOM, + LCSP_PROP_BORDER_LEFT, + LCSP_PROP_BORDER_TOP_COLOR, + LCSP_PROP_BORDER_RIGHT_COLOR, + LCSP_PROP_BORDER_BOTTOM_COLOR, + LCSP_PROP_BORDER_LEFT_COLOR, + LCSP_PROP_BORDER_TOP_STYLE, + LCSP_PROP_BORDER_RIGHT_STYLE, + LCSP_PROP_BORDER_BOTTOM_STYLE, + LCSP_PROP_BORDER_LEFT_STYLE, + LCSP_PROP_BORDER_TOP_WIDTH, + LCSP_PROP_BORDER_RIGHT_WIDTH, + LCSP_PROP_BORDER_BOTTOM_WIDTH, + LCSP_PROP_BORDER_LEFT_WIDTH, + LCSP_PROP_BORDER_WIDTH, + LCSP_PROP_BORDER_TOP_LEFT_RADIUS, + LCSP_PROP_BORDER_TOP_RIGHT_RADIUS, + LCSP_PROP_BORDER_BOTTOM_LEFT_RADIUS, + LCSP_PROP_BORDER_BOTTOM_RIGHT_RADIUS, + LCSP_PROP_BORDER_RADIUS, + LCSP_PROP_BORDER, + LCSP_PROP_BOTTOM, + LCSP_PROP_CAPTION_SIDE, + LCSP_PROP_CLEAR, + LCSP_PROP_CLIP, + LCSP_PROP_COLOR, + LCSP_PROP_CONTENT, + LCSP_PROP_COUNTER_INCREMENT, + LCSP_PROP_COUNTER_RESET, + LCSP_PROP_CUE_AFTER, + LCSP_PROP_CUE_BEFORE, + LCSP_PROP_CUE, + LCSP_PROP_CURSOR, + LCSP_PROP_DIRECTION, + LCSP_PROP_DISPLAY, + LCSP_PROP_ELEVATION, + LCSP_PROP_EMPTY_CELLS, + LCSP_PROP_FLOAT, + LCSP_PROP_FONT_FAMILY, + LCSP_PROP_FONT_SIZE, + LCSP_PROP_FONT_STYLE, + LCSP_PROP_FONT_VARAIANT, + LCSP_PROP_FONT_WEIGHT, + LCSP_PROP_FONT, + LCSP_PROP_HEIGHT, + LCSP_PROP_LEFT, + LCSP_PROP_LETTER_SPACING, + LCSP_PROP_LINE_HEIGHT, + LCSP_PROP_LIST_STYLE_IMAGE, + LCSP_PROP_LIST_STYLE_POSITION, + LCSP_PROP_LIST_STYLE_TYPE, + LCSP_PROP_LIST_STYLE, + LCSP_PROP_MARGIN_RIGHT, + LCSP_PROP_MARGIN_LEFT, + LCSP_PROP_MARGIN_TOP, + LCSP_PROP_MARGIN_BOTTOM, + LCSP_PROP_MARGIN, + LCSP_PROP_MAX_HEIGHT, + LCSP_PROP_MAX_WIDTH, + LCSP_PROP_MIN_HEIGHT, + LCSP_PROP_MIN_WIDTH, + LCSP_PROP_ORPHANS, + LCSP_PROP_OUTLINE_COLOR, + LCSP_PROP_OUTLINE_STYLE, + LCSP_PROP_OUTLINE_WIDTH, + LCSP_PROP_OUTLINE, + LCSP_PROP_OVERFLOW, + LCSP_PROP_PADDING_TOP, + LCSP_PROP_PADDING_RIGHT, + LCSP_PROP_PADDING_BOTTOM, + LCSP_PROP_PADDING_LEFT, + LCSP_PROP_PADDING, + LCSP_PROP_PAGE_BREAK_AFTER, + LCSP_PROP_PAGE_BREAK_BEFORE, + LCSP_PROP_PAGE_BREAK_INSIDE, + LCSP_PROP_PAUSE_AFTER, + LCSP_PROP_PAUSE_BEFORE, + LCSP_PROP_PAUSE, + LCSP_PROP_PITCH_RANGE, + LCSP_PROP_PITCH, + LCSP_PROP_PLAY_DURING, + LCSP_PROP_POSITION, + LCSP_PROP_QUOTES, + LCSP_PROP_RICHNESS, + LCSP_PROP_RIGHT, + LCSP_PROP_SPEAK_HEADER, + LCSP_PROP_SPEAK_NUMERAL, + LCSP_PROP_SPEAK_PUNCTUATION, + LCSP_PROP_SPEAK, + LCSP_PROP_SPEECH_RATE, + LCSP_PROP_STRESS, + LCSP_PROP_TABLE_LAYOUT, + LCSP_PROP_TEXT_ALIGN, + LCSP_PROP_TEXT_DECORATION, + LCSP_PROP_TEXT_INDENT, + LCSP_PROP_TEXT_TRANSFORM, + LCSP_PROP_TOP, + LCSP_PROP_UNICODE_BIDI, + LCSP_PROP_VERTICAL_ALIGN, + LCSP_PROP_VISIBILITY, + LCSP_PROP_VOICE_FAMILY, + LCSP_PROP_VOLUME, + LCSP_PROP_WHITE_SPACE, + LCSP_PROP_WIDOWS, + LCSP_PROP_WIDTH, + LCSP_PROP_WORD_SPACING, + LCSP_PROP_Z_INDEX, + + LCSP_PROP__COUNT /* always last */ +} lcsp_props_t; + +/* + * Indexes for the well-known property values + */ + +typedef enum { + LCSP_PROPVAL_ABOVE, + LCSP_PROPVAL_ABSOLUTE, + LCSP_PROPVAL_ALWAYS, + LCSP_PROPVAL_ARMENIAN, + LCSP_PROPVAL_AUTO, + LCSP_PROPVAL_AVOID, + LCSP_PROPVAL_BASELINE, + LCSP_PROPVAL_BEHIND, + LCSP_PROPVAL_BELOW, + LCSP_PROPVAL_BIDI_OVERRIDE, + LCSP_PROPVAL_BLINK, + LCSP_PROPVAL_BLOCK, + LCSP_PROPVAL_BOLD, + LCSP_PROPVAL_BOLDER, + LCSP_PROPVAL_BOTH, + LCSP_PROPVAL_BOTTOM, + LCSP_PROPVAL_CAPITALIZE, + LCSP_PROPVAL_CAPTION, + LCSP_PROPVAL_CENTER, + LCSP_PROPVAL_CIRCLE, + LCSP_PROPVAL_CLOSE_QUOTE, + LCSP_PROPVAL_CODE, + LCSP_PROPVAL_COLLAPSE, + LCSP_PROPVAL_CONTINUOUS, + LCSP_PROPVAL_CROSSHAIR, + LCSP_PROPVAL_DECIMAL_LEADING_ZERO, + LCSP_PROPVAL_DECIMAL, + LCSP_PROPVAL_DIGITS, + LCSP_PROPVAL_DISC, + LCSP_PROPVAL_EMBED, + LCSP_PROPVAL_E_RESIZE, + LCSP_PROPVAL_FIXED, + LCSP_PROPVAL_GEORGIAN, + LCSP_PROPVAL_HELP, + LCSP_PROPVAL_HIDDEN, + LCSP_PROPVAL_HIDE, + LCSP_PROPVAL_HIGH, + LCSP_PROPVAL_HIGHER, + LCSP_PROPVAL_ICON, + LCSP_PROPVAL_INHERIT, + LCSP_PROPVAL_INLINE, + LCSP_PROPVAL_INLINE_BLOCK, + LCSP_PROPVAL_INLINE_TABLE, + LCSP_PROPVAL_INVERT, + LCSP_PROPVAL_ITALIC, + LCSP_PROPVAL_JUSTIFY, + LCSP_PROPVAL_LEFT, + LCSP_PROPVAL_LIGHTER, + LCSP_PROPVAL_LINE_THROUGH, + LCSP_PROPVAL_LIST_ITEM, + LCSP_PROPVAL_LOW, + LCSP_PROPVAL_LOWER, + LCSP_PROPVAL_LOWER_ALPHA, + LCSP_PROPVAL_LOWERCASE, + LCSP_PROPVAL_LOWER_GREEK, + LCSP_PROPVAL_LOWER_LATIN, + LCSP_PROPVAL_LOWER_ROMAN, + LCSP_PROPVAL_LTR, + LCSP_PROPVAL_MENU, + LCSP_PROPVAL_MESSAGE_BOX, + LCSP_PROPVAL_MIDDLE, + LCSP_PROPVAL_MIX, + LCSP_PROPVAL_MOVE, + LCSP_PROPVAL_NE_RESIZE, + LCSP_PROPVAL_NO_CLOSE_QUOTE, + LCSP_PROPVAL_NONE, + LCSP_PROPVAL_NO_OPEN_QUOTE, + LCSP_PROPVAL_NO_REPEAT, + LCSP_PROPVAL_NORMAL, + LCSP_PROPVAL_NOWRAP, + LCSP_PROPVAL_N_RESIZE, + LCSP_PROPVAL_NW_RESIZE, + LCSP_PROPVAL_OBLIQUE, + LCSP_PROPVAL_ONCE, + LCSP_PROPVAL_OPEN_QUOTE, + LCSP_PROPVAL_OUTSIDE, + LCSP_PROPVAL_OVERLINE, + LCSP_PROPVAL_POINTER, + LCSP_PROPVAL_PRE, + LCSP_PROPVAL_PRE_LINE, + LCSP_PROPVAL_PRE_WRAP, + LCSP_PROPVAL_PROGRESS, + LCSP_PROPVAL_RELATIVE, + LCSP_PROPVAL_REPEAT, + LCSP_PROPVAL_REPEAT_X, + LCSP_PROPVAL_REPEAT_Y, + LCSP_PROPVAL_RIGHT, + LCSP_PROPVAL_RTL, + LCSP_PROPVAL_SCROLL, + LCSP_PROPVAL_SEPARATE, + LCSP_PROPVAL_SE_RESIZE, + LCSP_PROPVAL_SHOW, + LCSP_PROPVAL_SILENT, + LCSP_PROPVAL_SMALL_CAPS, + LCSP_PROPVAL_SMALL_CAPTION, + LCSP_PROPVAL_SPELL_OUT, + LCSP_PROPVAL_SQUARE, + LCSP_PROPVAL_S_RESIZE, + LCSP_PROPVAL_STATIC, + LCSP_PROPVAL_STATUS_BAR, + LCSP_PROPVAL_SUB, + LCSP_PROPVAL_SUPER, + LCSP_PROPVAL_SW_RESIZE, + LCSP_PROPVAL_TABLE, + LCSP_PROPVAL_TABLE_CAPTION, + LCSP_PROPVAL_TABLE_CELL, + LCSP_PROPVAL_TABLE_COLUMN, + LCSP_PROPVAL_TABLE_COLUMN_GROUP, + LCSP_PROPVAL_TABLE_FOOTER_GROUP, + LCSP_PROPVAL_TABLE_HEADER_GROUP, + LCSP_PROPVAL_TABLE_ROW, + LCSP_PROPVAL_TABLE_ROW_GROUP, + LCSP_PROPVAL_TEXT_BOTTOM, + LCSP_PROPVAL_TEXT_TOP, + LCSP_PROPVAL_TEXT, + LCSP_PROPVAL_TOP, + LCSP_PROPVAL_TRANSPARENT, + LCSP_PROPVAL_UNDERLINE, + LCSP_PROPVAL_UPPER_ALPHA, + LCSP_PROPVAL_UPPERCASE, + LCSP_PROPVAL_UPPER_LATIN, + LCSP_PROPVAL_UPPER_ROMAN, + LCSP_PROPVAL_VISIBLE, + LCSP_PROPVAL_WAIT, + LCSP_PROPVAL_W_RESIZE, + + LCSP_PROPVAL__COUNT /* always last */ +} lcsp_propvals_t; + +struct lhp_ctx; +typedef lws_stateful_ret_t (*lhp_callback)(struct lhp_ctx *ctx, char reason); + +/* html attribute */ + +typedef struct lhp_atr { + lws_dll2_t list; + size_t name_len; /* 0 if it is elem tag */ + size_t value_len; + + /* name+NUL then value+NUL follow */ +} lhp_atr_t; + +struct lcsp_atr; + +#define CCPAS_TOP 0 +#define CCPAS_RIGHT 1 +#define CCPAS_BOTTOM 2 +#define CCPAS_LEFT 3 + +typedef struct lhp_pstack { + lws_dll2_t list; + void *user; /* private to the stack level */ + lhp_callback cb; + + /* static: x,y: offset from parent, w,h: surface size of this object */ + lws_box_t drt; + + /* dynamic cursor inside drt for progressive child placement */ + lws_fx_t curx; + lws_fx_t cury; + lws_fx_t widest; + + lws_dll2_owner_t atr; /* lhp_atr_t */ + + const lws_display_font_t *f; + + const struct lcsp_atr *css_background_color; + const struct lcsp_atr *css_color; + + const struct lcsp_atr *css_position; + const struct lcsp_atr *css_display; + const struct lcsp_atr *css_width; + const struct lcsp_atr *css_height; + + const struct lcsp_atr *css_border_radius[4]; + + const struct lcsp_atr *css_pos[4]; + const struct lcsp_atr *css_margin[4]; + const struct lcsp_atr *css_padding[4]; + + uint8_t is_block; /* children use space in our drt */ + + /* user layout owns these after initial values set */ + + void *opaque1; + const void *opaque2; + int oi[4]; + int positioned[4]; + int rel_layout_cursor[4]; + uint8_t runon; /* continues same line */ + +} lhp_pstack_t; + +typedef enum lcsp_css_units { + LCSP_UNIT_NONE, + + LCSP_UNIT_NUM, /* u.i */ + + LCSP_UNIT_LENGTH_EM, /* u.i */ + LCSP_UNIT_LENGTH_EX, /* u.i */ + LCSP_UNIT_LENGTH_IN, /* u.i */ + LCSP_UNIT_LENGTH_CM, /* u.i */ + LCSP_UNIT_LENGTH_MM, /* u.i */ + LCSP_UNIT_LENGTH_PT, /* u.i */ + LCSP_UNIT_LENGTH_PC, /* u.i */ + LCSP_UNIT_LENGTH_PX, /* u.i */ + LCSP_UNIT_LENGTH_PERCENT, /* u.i */ + + LCSP_UNIT_ANGLE_ABS_DEG, /* u.i */ + LCSP_UNIT_ANGLE_REL_DEG, /* u.i */ + + LCSP_UNIT_FREQ_HZ, /* u.i */ + + LCSP_UNIT_RGBA, /* u.rgba */ + + LCSP_UNIT_URL, /* string at end of atr */ + LCSP_UNIT_STRING, /* string at end of atr */ + LCSP_UNIT_DATA, /* binary data at end of atr */ + +} lcsp_css_units_t; + +typedef struct lcsp_atr { + lws_dll2_t list; + + int propval; /* lcsp_propvals_t LCSP_PROPVAL_ */ + + size_t value_len; /* for string . url */ + lcsp_css_units_t unit; + + union { + lws_fx_t i; + uint32_t rgba; /* for colours */ + } u; + + lws_fx_t r; + + uint8_t op; + + /* .value_len bytes follow (for strings and blobs) */ +} lcsp_atr_t; + +/* css definitions like font-weight: */ +typedef struct lcsp_defs { + lws_dll2_t list; + lws_dll2_owner_t atrs; /* lcsp_atr_t */ + lcsp_props_t prop; /* lcsp_props_t, LCSP_PROP_* */ +} lcsp_defs_t; + +typedef struct lcsp_names { + lws_dll2_t list; + size_t name_len; + + /* name + NUL follow */ +} lcsp_names_t; + +typedef struct lcsp_stanza { /* css stanza, with names and defs */ + lws_dll2_t list; + + lws_dll2_owner_t names; /* lcsp_names_t */ + lws_dll2_owner_t defs; /* lcsp_defs_t */ + +} lcsp_stanza_t; + +/* + * A list of stanza references can easily have to bring in the same stanza + * multiple times, eg,
won't work unless the div + * stanzas are listed twice at different places in the list. It means we can't + * use dll2 directly since the number of references is open-ended. + * + * lcsp_stanza_ptr provides indirection that allows multiple listings. + */ + +typedef struct lcsp_stanza_ptr { + lws_dll2_t list; + + lcsp_stanza_t *stz; +} lcsp_stanza_ptr_t; + +typedef struct lcsp_atr_ptr { + lws_dll2_t list; + + lcsp_atr_t *atr; +} lcsp_atr_ptr_t; + +#define LHP_FLAG_DOCUMENT_END (1 << 0) + +typedef struct lhp_ctx { + lws_dll2_owner_t stack; /* lhp_pstack_t */ + + struct lwsac *cssac; /* css allocations all in an ac */ + struct lwsac *cascadeac; /* active_stanzas ac */ + struct lwsac *propatrac; /* prop atr query results ac */ + lws_dll2_owner_t css; /* lcsp_stanza_t (all in ac) */ + + lws_dll2_owner_t *ids; + + lws_fx_t tf; + lcsp_css_units_t unit; + lcsp_stanza_t *stz; /* current stanza getting properties */ + lcsp_defs_t *def; /* current property getting values */ + + lws_dll2_owner_t active_stanzas; /* lcsp_stanza_ptr_t allocated + * in cascadeac */ + lws_dll2_owner_t active_atr; /* lcsp_atr_ptr_t allocated in + * propatrac */ + + lws_surface_info_t ic; + + const char *base_url; /* strdup of https://x.com/y.html */ + sul_cb_t ssevcb; /* callback for ss events */ + lws_sorted_usec_list_t *ssevsul; /* sul to use to resume rz */ + + void *user; + void *user1; + const char *tag; /* private */ + size_t tag_len; /* private */ + + int npos; + int state; /* private */ + int state_css_comm; /* private */ + int nl_temp; + int temp_count; + + uint32_t flags; + uint32_t temp; + int32_t window; /* 0, or ss item flow control limit */ + + union { + uint32_t s; + struct { + uint32_t first:1; + uint32_t closing:1; + uint32_t void_element:1; + uint32_t doctype:1; + uint32_t inq:1; + uint32_t tag_used:1; + uint32_t arg:1; + uint32_t default_css:1; +#define LHP_CSS_PROPVAL_INT_WHOLE 1 +#define LHP_CSS_PROPVAL_INT_FRAC 2 +#define LHP_CSS_PROPVAL_INT_UNIT 3 + uint32_t integer:2; + uint32_t color:2; + } f; + } u; + + int prop; /* lcsp_props_t */ + int propval; /* lcsp_propvals_t */ + int16_t css_state; /* private */ + int16_t cssval_state; /* private */ + + uint8_t in_body:1; + + /* at end so we can memset members above it in one go */ + + char buf[LHP_STRING_CHUNK + 1]; + +} lhp_ctx_t; + +/* + * lws_lhp_construct() - Construct an lhp context + * + * \param ctx: the lhp context to prepare + * \param cb: the stream parsing callback + * \param user: opaque user pointer available from the lhp context + * \param ic: struct with arguments for lhp context + * + * The lhp context is allocated by the caller (the size is known). + * Prepares an lhp context to parse html. Returns 0 for OK, or nonzero if OOM. + */ +LWS_VISIBLE LWS_EXTERN int +lws_lhp_construct(lhp_ctx_t *ctx, lhp_callback cb, void *user, + const lws_surface_info_t *ic); + +/* + * lws_lhp_destruct() - Destroy an lhp context + * + * \param ctx: the lhp context to prepare + * + * Destroys an lhp context. The lhp context is allocated by the caller (the + * size is known). But there are suballocations that must be destroyed with + * this. + */ +LWS_VISIBLE LWS_EXTERN void +lws_lhp_destruct(lhp_ctx_t *ctx); + +/** + * lws_lhp_ss_browse() - browse url using SS and parse via lhp to DLOs + * + * \param cx: the lws_context + * \param rs: the user's render state object + * \param url: the https://x.com/y.xyz URL to browse + * \param render: the user's linewise render callback (called from \p rs.sul) + * + * High level network fetch via SS and render html via lhp / DLO + * + * rs->ic must be prepared before calling. + * + * Returns nonzero if an early, fatal problem, else returns 0 and continues + * asynchronously. + * + * If rs->box is (0,0,0,0) on entry, it is set to represent the whole display + * surface. Otherwise if not representing the whole display surface, it + * indicates partial mode should be used. + */ +LWS_VISIBLE LWS_EXTERN int +lws_lhp_ss_browse(struct lws_context *cx, lws_display_render_state_t *rs, + const char *url, sul_cb_t render); + +/** + * lws_lhp_parse() - parses a chunk of input HTML + * + * \p ctx: the parsing context + * \p buf: pointer to the start of the chunk of html + * \p len: pointer the number of bytes of html available at *\pbuf + * + * Parses up to *len bytes at *buf. On exit, *buf and *len are adjusted + * according to how much data was used. May return before processing all the + * input. + * + * Returns LWS_SRET_WANT_INPUT if the parsing is stalled on some other async + * event (eg, fetch of image to find out the dimensions). + * + * The lws_lhp_ss_browse() api wraps this. + */ +LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t +lws_lhp_parse(lhp_ctx_t *ctx, const uint8_t **buf, size_t *len); + +/** + * lws_css_cascade_get_prop_atr() - create active css atr list for property + * + * \p ctx: the parsing context + * \p prop: the LCSP_PROP_ property to generate the attribute list for + * + * Returns NULL if no atr or OOM. + * + * Otherwise produces a list of active CSS property attributes walkable via + * ctx->active_atr, and returns the tail one. For simple attributes where the + * last definition is the active one, this points to the last definition. + */ +LWS_VISIBLE LWS_EXTERN const lcsp_atr_t * +lws_css_cascade_get_prop_atr(lhp_ctx_t *ctx, lcsp_props_t prop); + +LWS_VISIBLE LWS_EXTERN lhp_pstack_t * +lws_css_get_parent_block(lhp_ctx_t *ctx, lhp_pstack_t *ps); + +LWS_VISIBLE LWS_EXTERN const char * +lws_css_pstack_name(lhp_pstack_t *ps); + +LWS_VISIBLE LWS_EXTERN const char * +lws_html_get_atr(lhp_pstack_t *ps, const char *aname, size_t aname_len); + +LWS_VISIBLE LWS_EXTERN const lws_fx_t * +lws_csp_px(const lcsp_atr_t *a, lhp_pstack_t *ps); + +LWS_VISIBLE LWS_EXTERN void +lws_lhp_tag_dlo_id(lhp_ctx_t *ctx, lhp_pstack_t *ps, lws_dlo_t *dlo); + +#define LWS_LHPREF_WIDTH 0 +#define LWS_LHPREF_HEIGHT 1 +#define LWS_LHPREF_NONE 2 + +LWS_VISIBLE LWS_EXTERN int +lhp_prop_axis(const lcsp_atr_t *a); diff --git a/lib/misc/CMakeLists.txt b/lib/misc/CMakeLists.txt index 71a3c92c4..3a5f4b59e 100644 --- a/lib/misc/CMakeLists.txt +++ b/lib/misc/CMakeLists.txt @@ -165,6 +165,16 @@ if (LWS_WITH_CBOR) misc/lecp.c misc/ieeehalfprecision.c) endif() +if (LWS_WITH_LHP) + list(APPEND SOURCES + misc/lhp.c) + + if (LWS_WITH_SECURE_STREAMS) + list(APPEND SOURCES + misc/lhp-ss.c) + endif() + +endif() if (UNIX) if (NOT LWS_HAVE_GETIFADDRS) diff --git a/lib/misc/css-lextable-strings.txt b/lib/misc/css-lextable-strings.txt new file mode 100644 index 000000000..a6d92117e --- /dev/null +++ b/lib/misc/css-lextable-strings.txt @@ -0,0 +1,120 @@ +azimuth: +background-attachment: +background-color: +background-image: +background-position: +background-repeat: +background: +border-collapse: +border-color: +border-spacing: +border-style: +border-top: +border-right: +border-bottom: +border-left: +border-top-color: +border-right-color: +border-bottom-color: +border-left-color: +border-top-style: +border-right-style: +border-bottom-style: +border-left-style: +border-top-width: +border-right-width: +border-bottom-width: +border-left-width: +border-width: +border-top-left-radius: +border-top-right-radius: +border-bottom-left-radius: +border-bottom-right-radius: +border-radius: +border: +bottom: +caption-side: +clear: +clip: +color: +content: +counter-increment: +counter-reset: +cue-after: +cue-before: +cue: +cursor: +direction: +display: +elevation: +empty-cells: +float: +font-family: +font-size: +font-style: +font-variant: +font-weight: +font: +height: +left: +letter-spacing: +line-height: +list-style-image: +list-style-position: +list-style-type: +list-style: +margin-right: +margin-left: +margin-top: +margin-bottom: +margin: +max-height: +max-width: +min-height: +min-width: +orphans: +outline-color: +outline-style: +outline-width: +outline: +overflow: +padding-top: +padding-right: +padding-bottom: +padding-left: +padding: +page-break-after: +page-break-before: +page-break-inside: +pause-after: +pause-before: +pause: +pitch-range: +pitch: +play-during: +position: +quotes: +richness: +right: +speak-header: +speak-numeral: +speak-punctuation: +speak: +speech-rate: +stress: +table-layout: +text-align: +text-decoration: +text-indent: +text-transform: +top: +unicode-bidi: +vertical-align: +visibility: +voice-family: +volume: +white-space: +widows: +width: +word-spacing: +z-index: diff --git a/lib/misc/css-lextable.h b/lib/misc/css-lextable.h new file mode 100644 index 000000000..446ca3c8d --- /dev/null +++ b/lib/misc/css-lextable.h @@ -0,0 +1,1337 @@ + /* 0: azimuth: */ + /* 1: background-attachment: */ + /* 2: background-color: */ + /* 3: background-image: */ + /* 4: background-position: */ + /* 5: background-repeat: */ + /* 6: background: */ + /* 7: border-collapse: */ + /* 8: border-color: */ + /* 9: border-spacing: */ + /* 10: border-style: */ + /* 11: border-top: */ + /* 12: border-right: */ + /* 13: border-bottom: */ + /* 14: border-left: */ + /* 15: border-top-color: */ + /* 16: border-right-color: */ + /* 17: border-bottom-color: */ + /* 18: border-left-color: */ + /* 19: border-top-style: */ + /* 20: border-right-style: */ + /* 21: border-bottom-style: */ + /* 22: border-left-style: */ + /* 23: border-top-width: */ + /* 24: border-right-width: */ + /* 25: border-bottom-width: */ + /* 26: border-left-width: */ + /* 27: border-width: */ + /* 28: border-top-left-radius: */ + /* 29: border-top-right-radius: */ + /* 30: border-bottom-left-radius: */ + /* 31: border-bottom-right-radius: */ + /* 32: border-radius: */ + /* 33: border: */ + /* 34: bottom: */ + /* 35: caption-side: */ + /* 36: clear: */ + /* 37: clip: */ + /* 38: color: */ + /* 39: content: */ + /* 40: counter-increment: */ + /* 41: counter-reset: */ + /* 42: cue-after: */ + /* 43: cue-before: */ + /* 44: cue: */ + /* 45: cursor: */ + /* 46: direction: */ + /* 47: display: */ + /* 48: elevation: */ + /* 49: empty-cells: */ + /* 50: float: */ + /* 51: font-family: */ + /* 52: font-size: */ + /* 53: font-style: */ + /* 54: font-variant: */ + /* 55: font-weight: */ + /* 56: font: */ + /* 57: height: */ + /* 58: left: */ + /* 59: letter-spacing: */ + /* 60: line-height: */ + /* 61: list-style-image: */ + /* 62: list-style-position: */ + /* 63: list-style-type: */ + /* 64: list-style: */ + /* 65: margin-right: */ + /* 66: margin-left: */ + /* 67: margin-top: */ + /* 68: margin-bottom: */ + /* 69: margin: */ + /* 70: max-height: */ + /* 71: max-width: */ + /* 72: min-height: */ + /* 73: min-width: */ + /* 74: orphans: */ + /* 75: outline-color: */ + /* 76: outline-style: */ + /* 77: outline-width: */ + /* 78: outline: */ + /* 79: overflow: */ + /* 80: padding-top: */ + /* 81: padding-right: */ + /* 82: padding-bottom: */ + /* 83: padding-left: */ + /* 84: padding: */ + /* 85: page-break-after: */ + /* 86: page-break-before: */ + /* 87: page-break-inside: */ + /* 88: pause-after: */ + /* 89: pause-before: */ + /* 90: pause: */ + /* 91: pitch-range: */ + /* 92: pitch: */ + /* 93: play-during: */ + /* 94: position: */ + /* 95: quotes: */ + /* 96: richness: */ + /* 97: right: */ + /* 98: speak-header: */ + /* 99: speak-numeral: */ + /* 100: speak-punctuation: */ + /* 101: speak: */ + /* 102: speech-rate: */ + /* 103: stress: */ + /* 104: table-layout: */ + /* 105: text-align: */ + /* 106: text-decoration: */ + /* 107: text-indent: */ + /* 108: text-transform: */ + /* 109: top: */ + /* 110: unicode-bidi: */ + /* 111: vertical-align: */ + /* 112: visibility: */ + /* 113: voice-family: */ + /* 114: volume: */ + /* 115: white-space: */ + /* 116: widows: */ + /* 117: width: */ + /* 118: word-spacing: */ + /* 119: z-index: */ +/* enum { + XXXX_AZIMUTH, + XXXX_BACKGROUND_ATTACHMENT, + XXXX_BACKGROUND_COLOR, + XXXX_BACKGROUND_IMAGE, + XXXX_BACKGROUND_POSITION, + XXXX_BACKGROUND_REPEAT, + XXXX_BACKGROUND, + XXXX_BORDER_COLLAPSE, + XXXX_BORDER_COLOR, + XXXX_BORDER_SPACING, + XXXX_BORDER_STYLE, + XXXX_BORDER_TOP, + XXXX_BORDER_RIGHT, + XXXX_BORDER_BOTTOM, + XXXX_BORDER_LEFT, + XXXX_BORDER_TOP_COLOR, + XXXX_BORDER_RIGHT_COLOR, + XXXX_BORDER_BOTTOM_COLOR, + XXXX_BORDER_LEFT_COLOR, + XXXX_BORDER_TOP_STYLE, + XXXX_BORDER_RIGHT_STYLE, + XXXX_BORDER_BOTTOM_STYLE, + XXXX_BORDER_LEFT_STYLE, + XXXX_BORDER_TOP_WIDTH, + XXXX_BORDER_RIGHT_WIDTH, + XXXX_BORDER_BOTTOM_WIDTH, + XXXX_BORDER_LEFT_WIDTH, + XXXX_BORDER_WIDTH, + XXXX_BORDER_TOP_LEFT_RADIUS, + XXXX_BORDER_TOP_RIGHT_RADIUS, + XXXX_BORDER_BOTTOM_LEFT_RADIUS, + XXXX_BORDER_BOTTOM_RIGHT_RADIUS, + XXXX_BORDER_RADIUS, + XXXX_BORDER, + XXXX_BOTTOM, + XXXX_CAPTION_SIDE, + XXXX_CLEAR, + XXXX_CLIP, + XXXX_COLOR, + XXXX_CONTENT, + XXXX_COUNTER_INCREMENT, + XXXX_COUNTER_RESET, + XXXX_CUE_AFTER, + XXXX_CUE_BEFORE, + XXXX_CUE, + XXXX_CURSOR, + XXXX_DIRECTION, + XXXX_DISPLAY, + XXXX_ELEVATION, + XXXX_EMPTY_CELLS, + XXXX_FLOAT, + XXXX_FONT_FAMILY, + XXXX_FONT_SIZE, + XXXX_FONT_STYLE, + XXXX_FONT_VARIANT, + XXXX_FONT_WEIGHT, + XXXX_FONT, + XXXX_HEIGHT, + XXXX_LEFT, + XXXX_LETTER_SPACING, + XXXX_LINE_HEIGHT, + XXXX_LIST_STYLE_IMAGE, + XXXX_LIST_STYLE_POSITION, + XXXX_LIST_STYLE_TYPE, + XXXX_LIST_STYLE, + XXXX_MARGIN_RIGHT, + XXXX_MARGIN_LEFT, + XXXX_MARGIN_TOP, + XXXX_MARGIN_BOTTOM, + XXXX_MARGIN, + XXXX_MAX_HEIGHT, + XXXX_MAX_WIDTH, + XXXX_MIN_HEIGHT, + XXXX_MIN_WIDTH, + XXXX_ORPHANS, + XXXX_OUTLINE_COLOR, + XXXX_OUTLINE_STYLE, + XXXX_OUTLINE_WIDTH, + XXXX_OUTLINE, + XXXX_OVERFLOW, + XXXX_PADDING_TOP, + XXXX_PADDING_RIGHT, + XXXX_PADDING_BOTTOM, + XXXX_PADDING_LEFT, + XXXX_PADDING, + XXXX_PAGE_BREAK_AFTER, + XXXX_PAGE_BREAK_BEFORE, + XXXX_PAGE_BREAK_INSIDE, + XXXX_PAUSE_AFTER, + XXXX_PAUSE_BEFORE, + XXXX_PAUSE, + XXXX_PITCH_RANGE, + XXXX_PITCH, + XXXX_PLAY_DURING, + XXXX_POSITION, + XXXX_QUOTES, + XXXX_RICHNESS, + XXXX_RIGHT, + XXXX_SPEAK_HEADER, + XXXX_SPEAK_NUMERAL, + XXXX_SPEAK_PUNCTUATION, + XXXX_SPEAK, + XXXX_SPEECH_RATE, + XXXX_STRESS, + XXXX_TABLE_LAYOUT, + XXXX_TEXT_ALIGN, + XXXX_TEXT_DECORATION, + XXXX_TEXT_INDENT, + XXXX_TEXT_TRANSFORM, + XXXX_TOP, + XXXX_UNICODE_BIDI, + XXXX_VERTICAL_ALIGN, + XXXX_VISIBILITY, + XXXX_VOICE_FAMILY, + XXXX_VOLUME, + XXXX_WHITE_SPACE, + XXXX_WIDOWS, + XXXX_WIDTH, + XXXX_WORD_SPACING, + XXXX_Z_INDEX, +}; */ + +/* pos 0000: 0 */ 0x61 /* 'a' */, 0x3A, 0x00 /* (to 0x003A s 1) */, + 0x62 /* 'b' */, 0x40, 0x00 /* (to 0x0043 s 9) */, + 0x63 /* 'c' */, 0xED, 0x01 /* (to 0x01F3 s 257) */, + 0x64 /* 'd' */, 0x74, 0x02 /* (to 0x027D s 333) */, + 0x65 /* 'e' */, 0x89, 0x02 /* (to 0x0295 s 349) */, + 0x66 /* 'f' */, 0xA3, 0x02 /* (to 0x02B2 s 370) */, + 0x68 /* 'h' */, 0xF0, 0x02 /* (to 0x0302 s 413) */, + 0x6C /* 'l' */, 0xF5, 0x02 /* (to 0x030A s 420) */, + 0x6D /* 'm' */, 0x55, 0x03 /* (to 0x036D s 479) */, + 0x6F /* 'o' */, 0xC2, 0x03 /* (to 0x03DD s 540) */, + 0x70 /* 'p' */, 0x07, 0x04 /* (to 0x0425 s 582) */, + 0x71 /* 'q' */, 0xC2, 0x04 /* (to 0x04E3 s 691) */, + 0x72 /* 'r' */, 0xC7, 0x04 /* (to 0x04EB s 698) */, + 0x73 /* 's' */, 0xD9, 0x04 /* (to 0x0500 s 711) */, + 0x74 /* 't' */, 0x28, 0x05 /* (to 0x0552 s 760) */, + 0x75 /* 'u' */, 0x76, 0x05 /* (to 0x05A3 s 814) */, + 0x76 /* 'v' */, 0x81, 0x05 /* (to 0x05B1 s 827) */, + 0x77 /* 'w' */, 0xBB, 0x05 /* (to 0x05EE s 869) */, + 0x7A /* 'z' */, 0xEC, 0x05 /* (to 0x0622 s 902) */, + 0x08, /* fail */ +/* pos 003a: 1 */ 0xFA /* 'z' -> */, +/* pos 003b: 2 */ 0xE9 /* 'i' -> */, +/* pos 003c: 3 */ 0xED /* 'm' -> */, +/* pos 003d: 4 */ 0xF5 /* 'u' -> */, +/* pos 003e: 5 */ 0xF4 /* 't' -> */, +/* pos 003f: 6 */ 0xE8 /* 'h' -> */, +/* pos 0040: 7 */ 0xBA /* ':' -> */, +/* pos 0041: 8 */ 0x00, 0x00 /* - terminal marker 0 - */, +/* pos 0043: 9 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x004A s 10) */, + 0x6F /* 'o' */, 0x51, 0x00 /* (to 0x0097 s 60) */, + 0x08, /* fail */ +/* pos 004a: 10 */ 0xE3 /* 'c' -> */, +/* pos 004b: 11 */ 0xEB /* 'k' -> */, +/* pos 004c: 12 */ 0xE7 /* 'g' -> */, +/* pos 004d: 13 */ 0xF2 /* 'r' -> */, +/* pos 004e: 14 */ 0xEF /* 'o' -> */, +/* pos 004f: 15 */ 0xF5 /* 'u' -> */, +/* pos 0050: 16 */ 0xEE /* 'n' -> */, +/* pos 0051: 17 */ 0xE4 /* 'd' -> */, +/* pos 0052: 18 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0059 s 19) */, + 0x3A /* ':' */, 0x40, 0x00 /* (to 0x0095 s 59) */, + 0x08, /* fail */ +/* pos 0059: 19 */ 0x61 /* 'a' */, 0x10, 0x00 /* (to 0x0069 s 20) */, + 0x63 /* 'c' */, 0x19, 0x00 /* (to 0x0075 s 31) */, + 0x69 /* 'i' */, 0x1D, 0x00 /* (to 0x007C s 37) */, + 0x70 /* 'p' */, 0x21, 0x00 /* (to 0x0083 s 43) */, + 0x72 /* 'r' */, 0x28, 0x00 /* (to 0x008D s 52) */, + 0x08, /* fail */ +/* pos 0069: 20 */ 0xF4 /* 't' -> */, +/* pos 006a: 21 */ 0xF4 /* 't' -> */, +/* pos 006b: 22 */ 0xE1 /* 'a' -> */, +/* pos 006c: 23 */ 0xE3 /* 'c' -> */, +/* pos 006d: 24 */ 0xE8 /* 'h' -> */, +/* pos 006e: 25 */ 0xED /* 'm' -> */, +/* pos 006f: 26 */ 0xE5 /* 'e' -> */, +/* pos 0070: 27 */ 0xEE /* 'n' -> */, +/* pos 0071: 28 */ 0xF4 /* 't' -> */, +/* pos 0072: 29 */ 0xBA /* ':' -> */, +/* pos 0073: 30 */ 0x00, 0x01 /* - terminal marker 1 - */, +/* pos 0075: 31 */ 0xEF /* 'o' -> */, +/* pos 0076: 32 */ 0xEC /* 'l' -> */, +/* pos 0077: 33 */ 0xEF /* 'o' -> */, +/* pos 0078: 34 */ 0xF2 /* 'r' -> */, +/* pos 0079: 35 */ 0xBA /* ':' -> */, +/* pos 007a: 36 */ 0x00, 0x02 /* - terminal marker 2 - */, +/* pos 007c: 37 */ 0xED /* 'm' -> */, +/* pos 007d: 38 */ 0xE1 /* 'a' -> */, +/* pos 007e: 39 */ 0xE7 /* 'g' -> */, +/* pos 007f: 40 */ 0xE5 /* 'e' -> */, +/* pos 0080: 41 */ 0xBA /* ':' -> */, +/* pos 0081: 42 */ 0x00, 0x03 /* - terminal marker 3 - */, +/* pos 0083: 43 */ 0xEF /* 'o' -> */, +/* pos 0084: 44 */ 0xF3 /* 's' -> */, +/* pos 0085: 45 */ 0xE9 /* 'i' -> */, +/* pos 0086: 46 */ 0xF4 /* 't' -> */, +/* pos 0087: 47 */ 0xE9 /* 'i' -> */, +/* pos 0088: 48 */ 0xEF /* 'o' -> */, +/* pos 0089: 49 */ 0xEE /* 'n' -> */, +/* pos 008a: 50 */ 0xBA /* ':' -> */, +/* pos 008b: 51 */ 0x00, 0x04 /* - terminal marker 4 - */, +/* pos 008d: 52 */ 0xE5 /* 'e' -> */, +/* pos 008e: 53 */ 0xF0 /* 'p' -> */, +/* pos 008f: 54 */ 0xE5 /* 'e' -> */, +/* pos 0090: 55 */ 0xE1 /* 'a' -> */, +/* pos 0091: 56 */ 0xF4 /* 't' -> */, +/* pos 0092: 57 */ 0xBA /* ':' -> */, +/* pos 0093: 58 */ 0x00, 0x05 /* - terminal marker 5 - */, +/* pos 0095: 59 */ 0x00, 0x06 /* - terminal marker 6 - */, +/* pos 0097: 60 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x009E s 61) */, + 0x74 /* 't' */, 0x53, 0x01 /* (to 0x01ED s 252) */, + 0x08, /* fail */ +/* pos 009e: 61 */ 0xE4 /* 'd' -> */, +/* pos 009f: 62 */ 0xE5 /* 'e' -> */, +/* pos 00a0: 63 */ 0xF2 /* 'r' -> */, +/* pos 00a1: 64 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x00A8 s 65) */, + 0x3A /* ':' */, 0x47, 0x01 /* (to 0x01EB s 251) */, + 0x08, /* fail */ +/* pos 00a8: 65 */ 0x63 /* 'c' */, 0x16, 0x00 /* (to 0x00BE s 66) */, + 0x73 /* 's' */, 0x27, 0x00 /* (to 0x00D2 s 78) */, + 0x74 /* 't' */, 0x39, 0x00 /* (to 0x00E7 s 91) */, + 0x72 /* 'r' */, 0x41, 0x00 /* (to 0x00F2 s 95) */, + 0x62 /* 'b' */, 0x51, 0x00 /* (to 0x0105 s 101) */, + 0x6C /* 'l' */, 0x5C, 0x00 /* (to 0x0113 s 108) */, + 0x77 /* 'w' */, 0xED, 0x00 /* (to 0x01A7 s 189) */, + 0x08, /* fail */ +/* pos 00be: 66 */ 0xEF /* 'o' -> */, +/* pos 00bf: 67 */ 0xEC /* 'l' -> */, +/* pos 00c0: 68 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x00C7 s 69) */, + 0x6F /* 'o' */, 0x0B, 0x00 /* (to 0x00CE s 75) */, + 0x08, /* fail */ +/* pos 00c7: 69 */ 0xE1 /* 'a' -> */, +/* pos 00c8: 70 */ 0xF0 /* 'p' -> */, +/* pos 00c9: 71 */ 0xF3 /* 's' -> */, +/* pos 00ca: 72 */ 0xE5 /* 'e' -> */, +/* pos 00cb: 73 */ 0xBA /* ':' -> */, +/* pos 00cc: 74 */ 0x00, 0x07 /* - terminal marker 7 - */, +/* pos 00ce: 75 */ 0xF2 /* 'r' -> */, +/* pos 00cf: 76 */ 0xBA /* ':' -> */, +/* pos 00d0: 77 */ 0x00, 0x08 /* - terminal marker 8 - */, +/* pos 00d2: 78 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x00D9 s 79) */, + 0x74 /* 't' */, 0x0C, 0x00 /* (to 0x00E1 s 86) */, + 0x08, /* fail */ +/* pos 00d9: 79 */ 0xE1 /* 'a' -> */, +/* pos 00da: 80 */ 0xE3 /* 'c' -> */, +/* pos 00db: 81 */ 0xE9 /* 'i' -> */, +/* pos 00dc: 82 */ 0xEE /* 'n' -> */, +/* pos 00dd: 83 */ 0xE7 /* 'g' -> */, +/* pos 00de: 84 */ 0xBA /* ':' -> */, +/* pos 00df: 85 */ 0x00, 0x09 /* - terminal marker 9 - */, +/* pos 00e1: 86 */ 0xF9 /* 'y' -> */, +/* pos 00e2: 87 */ 0xEC /* 'l' -> */, +/* pos 00e3: 88 */ 0xE5 /* 'e' -> */, +/* pos 00e4: 89 */ 0xBA /* ':' -> */, +/* pos 00e5: 90 */ 0x00, 0x0A /* - terminal marker 10 - */, +/* pos 00e7: 91 */ 0xEF /* 'o' -> */, +/* pos 00e8: 92 */ 0xF0 /* 'p' -> */, +/* pos 00e9: 93 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x00F0 s 94) */, + 0x2D /* '-' */, 0x33, 0x00 /* (to 0x011F s 113) */, + 0x08, /* fail */ +/* pos 00f0: 94 */ 0x00, 0x0B /* - terminal marker 11 - */, +/* pos 00f2: 95 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x00F9 s 96) */, + 0x61 /* 'a' */, 0xEF, 0x00 /* (to 0x01E4 s 245) */, + 0x08, /* fail */ +/* pos 00f9: 96 */ 0xE7 /* 'g' -> */, +/* pos 00fa: 97 */ 0xE8 /* 'h' -> */, +/* pos 00fb: 98 */ 0xF4 /* 't' -> */, +/* pos 00fc: 99 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x0103 s 100) */, + 0x2D /* '-' */, 0x37, 0x00 /* (to 0x0136 s 120) */, + 0x08, /* fail */ +/* pos 0103: 100 */ 0x00, 0x0C /* - terminal marker 12 - */, +/* pos 0105: 101 */ 0xEF /* 'o' -> */, +/* pos 0106: 102 */ 0xF4 /* 't' -> */, +/* pos 0107: 103 */ 0xF4 /* 't' -> */, +/* pos 0108: 104 */ 0xEF /* 'o' -> */, +/* pos 0109: 105 */ 0xED /* 'm' -> */, +/* pos 010a: 106 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x0111 s 107) */, + 0x2D /* '-' */, 0x3A, 0x00 /* (to 0x0147 s 127) */, + 0x08, /* fail */ +/* pos 0111: 107 */ 0x00, 0x0D /* - terminal marker 13 - */, +/* pos 0113: 108 */ 0xE5 /* 'e' -> */, +/* pos 0114: 109 */ 0xE6 /* 'f' -> */, +/* pos 0115: 110 */ 0xF4 /* 't' -> */, +/* pos 0116: 111 */ 0x3A /* ':' */, 0x07, 0x00 /* (to 0x011D s 112) */, + 0x2D /* '-' */, 0x45, 0x00 /* (to 0x015E s 134) */, + 0x08, /* fail */ +/* pos 011d: 112 */ 0x00, 0x0E /* - terminal marker 14 - */, +/* pos 011f: 113 */ 0x63 /* 'c' */, 0x10, 0x00 /* (to 0x012F s 114) */, + 0x73 /* 's' */, 0x4D, 0x00 /* (to 0x016F s 141) */, + 0x77 /* 'w' */, 0x66, 0x00 /* (to 0x018B s 165) */, + 0x6C /* 'l' */, 0x86, 0x00 /* (to 0x01AE s 195) */, + 0x72 /* 'r' */, 0x90, 0x00 /* (to 0x01BB s 207) */, + 0x08, /* fail */ +/* pos 012f: 114 */ 0xEF /* 'o' -> */, +/* pos 0130: 115 */ 0xEC /* 'l' -> */, +/* pos 0131: 116 */ 0xEF /* 'o' -> */, +/* pos 0132: 117 */ 0xF2 /* 'r' -> */, +/* pos 0133: 118 */ 0xBA /* ':' -> */, +/* pos 0134: 119 */ 0x00, 0x0F /* - terminal marker 15 - */, +/* pos 0136: 120 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x0140 s 121) */, + 0x73 /* 's' */, 0x3D, 0x00 /* (to 0x0176 s 147) */, + 0x77 /* 'w' */, 0x56, 0x00 /* (to 0x0192 s 171) */, + 0x08, /* fail */ +/* pos 0140: 121 */ 0xEF /* 'o' -> */, +/* pos 0141: 122 */ 0xEC /* 'l' -> */, +/* pos 0142: 123 */ 0xEF /* 'o' -> */, +/* pos 0143: 124 */ 0xF2 /* 'r' -> */, +/* pos 0144: 125 */ 0xBA /* ':' -> */, +/* pos 0145: 126 */ 0x00, 0x10 /* - terminal marker 16 - */, +/* pos 0147: 127 */ 0x63 /* 'c' */, 0x10, 0x00 /* (to 0x0157 s 128) */, + 0x73 /* 's' */, 0x33, 0x00 /* (to 0x017D s 153) */, + 0x77 /* 'w' */, 0x4C, 0x00 /* (to 0x0199 s 177) */, + 0x6C /* 'l' */, 0x79, 0x00 /* (to 0x01C9 s 220) */, + 0x72 /* 'r' */, 0x83, 0x00 /* (to 0x01D6 s 232) */, + 0x08, /* fail */ +/* pos 0157: 128 */ 0xEF /* 'o' -> */, +/* pos 0158: 129 */ 0xEC /* 'l' -> */, +/* pos 0159: 130 */ 0xEF /* 'o' -> */, +/* pos 015a: 131 */ 0xF2 /* 'r' -> */, +/* pos 015b: 132 */ 0xBA /* ':' -> */, +/* pos 015c: 133 */ 0x00, 0x11 /* - terminal marker 17 - */, +/* pos 015e: 134 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x0168 s 135) */, + 0x73 /* 's' */, 0x23, 0x00 /* (to 0x0184 s 159) */, + 0x77 /* 'w' */, 0x3C, 0x00 /* (to 0x01A0 s 183) */, + 0x08, /* fail */ +/* pos 0168: 135 */ 0xEF /* 'o' -> */, +/* pos 0169: 136 */ 0xEC /* 'l' -> */, +/* pos 016a: 137 */ 0xEF /* 'o' -> */, +/* pos 016b: 138 */ 0xF2 /* 'r' -> */, +/* pos 016c: 139 */ 0xBA /* ':' -> */, +/* pos 016d: 140 */ 0x00, 0x12 /* - terminal marker 18 - */, +/* pos 016f: 141 */ 0xF4 /* 't' -> */, +/* pos 0170: 142 */ 0xF9 /* 'y' -> */, +/* pos 0171: 143 */ 0xEC /* 'l' -> */, +/* pos 0172: 144 */ 0xE5 /* 'e' -> */, +/* pos 0173: 145 */ 0xBA /* ':' -> */, +/* pos 0174: 146 */ 0x00, 0x13 /* - terminal marker 19 - */, +/* pos 0176: 147 */ 0xF4 /* 't' -> */, +/* pos 0177: 148 */ 0xF9 /* 'y' -> */, +/* pos 0178: 149 */ 0xEC /* 'l' -> */, +/* pos 0179: 150 */ 0xE5 /* 'e' -> */, +/* pos 017a: 151 */ 0xBA /* ':' -> */, +/* pos 017b: 152 */ 0x00, 0x14 /* - terminal marker 20 - */, +/* pos 017d: 153 */ 0xF4 /* 't' -> */, +/* pos 017e: 154 */ 0xF9 /* 'y' -> */, +/* pos 017f: 155 */ 0xEC /* 'l' -> */, +/* pos 0180: 156 */ 0xE5 /* 'e' -> */, +/* pos 0181: 157 */ 0xBA /* ':' -> */, +/* pos 0182: 158 */ 0x00, 0x15 /* - terminal marker 21 - */, +/* pos 0184: 159 */ 0xF4 /* 't' -> */, +/* pos 0185: 160 */ 0xF9 /* 'y' -> */, +/* pos 0186: 161 */ 0xEC /* 'l' -> */, +/* pos 0187: 162 */ 0xE5 /* 'e' -> */, +/* pos 0188: 163 */ 0xBA /* ':' -> */, +/* pos 0189: 164 */ 0x00, 0x16 /* - terminal marker 22 - */, +/* pos 018b: 165 */ 0xE9 /* 'i' -> */, +/* pos 018c: 166 */ 0xE4 /* 'd' -> */, +/* pos 018d: 167 */ 0xF4 /* 't' -> */, +/* pos 018e: 168 */ 0xE8 /* 'h' -> */, +/* pos 018f: 169 */ 0xBA /* ':' -> */, +/* pos 0190: 170 */ 0x00, 0x17 /* - terminal marker 23 - */, +/* pos 0192: 171 */ 0xE9 /* 'i' -> */, +/* pos 0193: 172 */ 0xE4 /* 'd' -> */, +/* pos 0194: 173 */ 0xF4 /* 't' -> */, +/* pos 0195: 174 */ 0xE8 /* 'h' -> */, +/* pos 0196: 175 */ 0xBA /* ':' -> */, +/* pos 0197: 176 */ 0x00, 0x18 /* - terminal marker 24 - */, +/* pos 0199: 177 */ 0xE9 /* 'i' -> */, +/* pos 019a: 178 */ 0xE4 /* 'd' -> */, +/* pos 019b: 179 */ 0xF4 /* 't' -> */, +/* pos 019c: 180 */ 0xE8 /* 'h' -> */, +/* pos 019d: 181 */ 0xBA /* ':' -> */, +/* pos 019e: 182 */ 0x00, 0x19 /* - terminal marker 25 - */, +/* pos 01a0: 183 */ 0xE9 /* 'i' -> */, +/* pos 01a1: 184 */ 0xE4 /* 'd' -> */, +/* pos 01a2: 185 */ 0xF4 /* 't' -> */, +/* pos 01a3: 186 */ 0xE8 /* 'h' -> */, +/* pos 01a4: 187 */ 0xBA /* ':' -> */, +/* pos 01a5: 188 */ 0x00, 0x1A /* - terminal marker 26 - */, +/* pos 01a7: 189 */ 0xE9 /* 'i' -> */, +/* pos 01a8: 190 */ 0xE4 /* 'd' -> */, +/* pos 01a9: 191 */ 0xF4 /* 't' -> */, +/* pos 01aa: 192 */ 0xE8 /* 'h' -> */, +/* pos 01ab: 193 */ 0xBA /* ':' -> */, +/* pos 01ac: 194 */ 0x00, 0x1B /* - terminal marker 27 - */, +/* pos 01ae: 195 */ 0xE5 /* 'e' -> */, +/* pos 01af: 196 */ 0xE6 /* 'f' -> */, +/* pos 01b0: 197 */ 0xF4 /* 't' -> */, +/* pos 01b1: 198 */ 0xAD /* '-' -> */, +/* pos 01b2: 199 */ 0xF2 /* 'r' -> */, +/* pos 01b3: 200 */ 0xE1 /* 'a' -> */, +/* pos 01b4: 201 */ 0xE4 /* 'd' -> */, +/* pos 01b5: 202 */ 0xE9 /* 'i' -> */, +/* pos 01b6: 203 */ 0xF5 /* 'u' -> */, +/* pos 01b7: 204 */ 0xF3 /* 's' -> */, +/* pos 01b8: 205 */ 0xBA /* ':' -> */, +/* pos 01b9: 206 */ 0x00, 0x1C /* - terminal marker 28 - */, +/* pos 01bb: 207 */ 0xE9 /* 'i' -> */, +/* pos 01bc: 208 */ 0xE7 /* 'g' -> */, +/* pos 01bd: 209 */ 0xE8 /* 'h' -> */, +/* pos 01be: 210 */ 0xF4 /* 't' -> */, +/* pos 01bf: 211 */ 0xAD /* '-' -> */, +/* pos 01c0: 212 */ 0xF2 /* 'r' -> */, +/* pos 01c1: 213 */ 0xE1 /* 'a' -> */, +/* pos 01c2: 214 */ 0xE4 /* 'd' -> */, +/* pos 01c3: 215 */ 0xE9 /* 'i' -> */, +/* pos 01c4: 216 */ 0xF5 /* 'u' -> */, +/* pos 01c5: 217 */ 0xF3 /* 's' -> */, +/* pos 01c6: 218 */ 0xBA /* ':' -> */, +/* pos 01c7: 219 */ 0x00, 0x1D /* - terminal marker 29 - */, +/* pos 01c9: 220 */ 0xE5 /* 'e' -> */, +/* pos 01ca: 221 */ 0xE6 /* 'f' -> */, +/* pos 01cb: 222 */ 0xF4 /* 't' -> */, +/* pos 01cc: 223 */ 0xAD /* '-' -> */, +/* pos 01cd: 224 */ 0xF2 /* 'r' -> */, +/* pos 01ce: 225 */ 0xE1 /* 'a' -> */, +/* pos 01cf: 226 */ 0xE4 /* 'd' -> */, +/* pos 01d0: 227 */ 0xE9 /* 'i' -> */, +/* pos 01d1: 228 */ 0xF5 /* 'u' -> */, +/* pos 01d2: 229 */ 0xF3 /* 's' -> */, +/* pos 01d3: 230 */ 0xBA /* ':' -> */, +/* pos 01d4: 231 */ 0x00, 0x1E /* - terminal marker 30 - */, +/* pos 01d6: 232 */ 0xE9 /* 'i' -> */, +/* pos 01d7: 233 */ 0xE7 /* 'g' -> */, +/* pos 01d8: 234 */ 0xE8 /* 'h' -> */, +/* pos 01d9: 235 */ 0xF4 /* 't' -> */, +/* pos 01da: 236 */ 0xAD /* '-' -> */, +/* pos 01db: 237 */ 0xF2 /* 'r' -> */, +/* pos 01dc: 238 */ 0xE1 /* 'a' -> */, +/* pos 01dd: 239 */ 0xE4 /* 'd' -> */, +/* pos 01de: 240 */ 0xE9 /* 'i' -> */, +/* pos 01df: 241 */ 0xF5 /* 'u' -> */, +/* pos 01e0: 242 */ 0xF3 /* 's' -> */, +/* pos 01e1: 243 */ 0xBA /* ':' -> */, +/* pos 01e2: 244 */ 0x00, 0x1F /* - terminal marker 31 - */, +/* pos 01e4: 245 */ 0xE4 /* 'd' -> */, +/* pos 01e5: 246 */ 0xE9 /* 'i' -> */, +/* pos 01e6: 247 */ 0xF5 /* 'u' -> */, +/* pos 01e7: 248 */ 0xF3 /* 's' -> */, +/* pos 01e8: 249 */ 0xBA /* ':' -> */, +/* pos 01e9: 250 */ 0x00, 0x20 /* - terminal marker 32 - */, +/* pos 01eb: 251 */ 0x00, 0x21 /* - terminal marker 33 - */, +/* pos 01ed: 252 */ 0xF4 /* 't' -> */, +/* pos 01ee: 253 */ 0xEF /* 'o' -> */, +/* pos 01ef: 254 */ 0xED /* 'm' -> */, +/* pos 01f0: 255 */ 0xBA /* ':' -> */, +/* pos 01f1: 256 */ 0x00, 0x22 /* - terminal marker 34 - */, +/* pos 01f3: 257 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0200 s 258) */, + 0x6C /* 'l' */, 0x17, 0x00 /* (to 0x020D s 270) */, + 0x6F /* 'o' */, 0x24, 0x00 /* (to 0x021D s 278) */, + 0x75 /* 'u' */, 0x55, 0x00 /* (to 0x0251 s 311) */, + 0x08, /* fail */ +/* pos 0200: 258 */ 0xF0 /* 'p' -> */, +/* pos 0201: 259 */ 0xF4 /* 't' -> */, +/* pos 0202: 260 */ 0xE9 /* 'i' -> */, +/* pos 0203: 261 */ 0xEF /* 'o' -> */, +/* pos 0204: 262 */ 0xEE /* 'n' -> */, +/* pos 0205: 263 */ 0xAD /* '-' -> */, +/* pos 0206: 264 */ 0xF3 /* 's' -> */, +/* pos 0207: 265 */ 0xE9 /* 'i' -> */, +/* pos 0208: 266 */ 0xE4 /* 'd' -> */, +/* pos 0209: 267 */ 0xE5 /* 'e' -> */, +/* pos 020a: 268 */ 0xBA /* ':' -> */, +/* pos 020b: 269 */ 0x00, 0x23 /* - terminal marker 35 - */, +/* pos 020d: 270 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0214 s 271) */, + 0x69 /* 'i' */, 0x09, 0x00 /* (to 0x0219 s 275) */, + 0x08, /* fail */ +/* pos 0214: 271 */ 0xE1 /* 'a' -> */, +/* pos 0215: 272 */ 0xF2 /* 'r' -> */, +/* pos 0216: 273 */ 0xBA /* ':' -> */, +/* pos 0217: 274 */ 0x00, 0x24 /* - terminal marker 36 - */, +/* pos 0219: 275 */ 0xF0 /* 'p' -> */, +/* pos 021a: 276 */ 0xBA /* ':' -> */, +/* pos 021b: 277 */ 0x00, 0x25 /* - terminal marker 37 - */, +/* pos 021d: 278 */ 0x6C /* 'l' */, 0x0A, 0x00 /* (to 0x0227 s 279) */, + 0x6E /* 'n' */, 0x0C, 0x00 /* (to 0x022C s 283) */, + 0x75 /* 'u' */, 0x10, 0x00 /* (to 0x0233 s 289) */, + 0x08, /* fail */ +/* pos 0227: 279 */ 0xEF /* 'o' -> */, +/* pos 0228: 280 */ 0xF2 /* 'r' -> */, +/* pos 0229: 281 */ 0xBA /* ':' -> */, +/* pos 022a: 282 */ 0x00, 0x26 /* - terminal marker 38 - */, +/* pos 022c: 283 */ 0xF4 /* 't' -> */, +/* pos 022d: 284 */ 0xE5 /* 'e' -> */, +/* pos 022e: 285 */ 0xEE /* 'n' -> */, +/* pos 022f: 286 */ 0xF4 /* 't' -> */, +/* pos 0230: 287 */ 0xBA /* ':' -> */, +/* pos 0231: 288 */ 0x00, 0x27 /* - terminal marker 39 - */, +/* pos 0233: 289 */ 0xEE /* 'n' -> */, +/* pos 0234: 290 */ 0xF4 /* 't' -> */, +/* pos 0235: 291 */ 0xE5 /* 'e' -> */, +/* pos 0236: 292 */ 0xF2 /* 'r' -> */, +/* pos 0237: 293 */ 0xAD /* '-' -> */, +/* pos 0238: 294 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x023F s 295) */, + 0x72 /* 'r' */, 0x0F, 0x00 /* (to 0x024A s 305) */, + 0x08, /* fail */ +/* pos 023f: 295 */ 0xEE /* 'n' -> */, +/* pos 0240: 296 */ 0xE3 /* 'c' -> */, +/* pos 0241: 297 */ 0xF2 /* 'r' -> */, +/* pos 0242: 298 */ 0xE5 /* 'e' -> */, +/* pos 0243: 299 */ 0xED /* 'm' -> */, +/* pos 0244: 300 */ 0xE5 /* 'e' -> */, +/* pos 0245: 301 */ 0xEE /* 'n' -> */, +/* pos 0246: 302 */ 0xF4 /* 't' -> */, +/* pos 0247: 303 */ 0xBA /* ':' -> */, +/* pos 0248: 304 */ 0x00, 0x28 /* - terminal marker 40 - */, +/* pos 024a: 305 */ 0xE5 /* 'e' -> */, +/* pos 024b: 306 */ 0xF3 /* 's' -> */, +/* pos 024c: 307 */ 0xE5 /* 'e' -> */, +/* pos 024d: 308 */ 0xF4 /* 't' -> */, +/* pos 024e: 309 */ 0xBA /* ':' -> */, +/* pos 024f: 310 */ 0x00, 0x29 /* - terminal marker 41 - */, +/* pos 0251: 311 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0258 s 312) */, + 0x72 /* 'r' */, 0x23, 0x00 /* (to 0x0277 s 328) */, + 0x08, /* fail */ +/* pos 0258: 312 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x025F s 313) */, + 0x3A /* ':' */, 0x1A, 0x00 /* (to 0x0275 s 327) */, + 0x08, /* fail */ +/* pos 025f: 313 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0266 s 314) */, + 0x62 /* 'b' */, 0x0B, 0x00 /* (to 0x026D s 320) */, + 0x08, /* fail */ +/* pos 0266: 314 */ 0xE6 /* 'f' -> */, +/* pos 0267: 315 */ 0xF4 /* 't' -> */, +/* pos 0268: 316 */ 0xE5 /* 'e' -> */, +/* pos 0269: 317 */ 0xF2 /* 'r' -> */, +/* pos 026a: 318 */ 0xBA /* ':' -> */, +/* pos 026b: 319 */ 0x00, 0x2A /* - terminal marker 42 - */, +/* pos 026d: 320 */ 0xE5 /* 'e' -> */, +/* pos 026e: 321 */ 0xE6 /* 'f' -> */, +/* pos 026f: 322 */ 0xEF /* 'o' -> */, +/* pos 0270: 323 */ 0xF2 /* 'r' -> */, +/* pos 0271: 324 */ 0xE5 /* 'e' -> */, +/* pos 0272: 325 */ 0xBA /* ':' -> */, +/* pos 0273: 326 */ 0x00, 0x2B /* - terminal marker 43 - */, +/* pos 0275: 327 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 0277: 328 */ 0xF3 /* 's' -> */, +/* pos 0278: 329 */ 0xEF /* 'o' -> */, +/* pos 0279: 330 */ 0xF2 /* 'r' -> */, +/* pos 027a: 331 */ 0xBA /* ':' -> */, +/* pos 027b: 332 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 027d: 333 */ 0xE9 /* 'i' -> */, +/* pos 027e: 334 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x0285 s 335) */, + 0x73 /* 's' */, 0x0D, 0x00 /* (to 0x028E s 343) */, + 0x08, /* fail */ +/* pos 0285: 335 */ 0xE5 /* 'e' -> */, +/* pos 0286: 336 */ 0xE3 /* 'c' -> */, +/* pos 0287: 337 */ 0xF4 /* 't' -> */, +/* pos 0288: 338 */ 0xE9 /* 'i' -> */, +/* pos 0289: 339 */ 0xEF /* 'o' -> */, +/* pos 028a: 340 */ 0xEE /* 'n' -> */, +/* pos 028b: 341 */ 0xBA /* ':' -> */, +/* pos 028c: 342 */ 0x00, 0x2E /* - terminal marker 46 - */, +/* pos 028e: 343 */ 0xF0 /* 'p' -> */, +/* pos 028f: 344 */ 0xEC /* 'l' -> */, +/* pos 0290: 345 */ 0xE1 /* 'a' -> */, +/* pos 0291: 346 */ 0xF9 /* 'y' -> */, +/* pos 0292: 347 */ 0xBA /* ':' -> */, +/* pos 0293: 348 */ 0x00, 0x2F /* - terminal marker 47 - */, +/* pos 0295: 349 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x029C s 350) */, + 0x6D /* 'm' */, 0x0E, 0x00 /* (to 0x02A6 s 359) */, + 0x08, /* fail */ +/* pos 029c: 350 */ 0xE5 /* 'e' -> */, +/* pos 029d: 351 */ 0xF6 /* 'v' -> */, +/* pos 029e: 352 */ 0xE1 /* 'a' -> */, +/* pos 029f: 353 */ 0xF4 /* 't' -> */, +/* pos 02a0: 354 */ 0xE9 /* 'i' -> */, +/* pos 02a1: 355 */ 0xEF /* 'o' -> */, +/* pos 02a2: 356 */ 0xEE /* 'n' -> */, +/* pos 02a3: 357 */ 0xBA /* ':' -> */, +/* pos 02a4: 358 */ 0x00, 0x30 /* - terminal marker 48 - */, +/* pos 02a6: 359 */ 0xF0 /* 'p' -> */, +/* pos 02a7: 360 */ 0xF4 /* 't' -> */, +/* pos 02a8: 361 */ 0xF9 /* 'y' -> */, +/* pos 02a9: 362 */ 0xAD /* '-' -> */, +/* pos 02aa: 363 */ 0xE3 /* 'c' -> */, +/* pos 02ab: 364 */ 0xE5 /* 'e' -> */, +/* pos 02ac: 365 */ 0xEC /* 'l' -> */, +/* pos 02ad: 366 */ 0xEC /* 'l' -> */, +/* pos 02ae: 367 */ 0xF3 /* 's' -> */, +/* pos 02af: 368 */ 0xBA /* ':' -> */, +/* pos 02b0: 369 */ 0x00, 0x31 /* - terminal marker 49 - */, +/* pos 02b2: 370 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x02B9 s 371) */, + 0x6F /* 'o' */, 0x0A, 0x00 /* (to 0x02BF s 376) */, + 0x08, /* fail */ +/* pos 02b9: 371 */ 0xEF /* 'o' -> */, +/* pos 02ba: 372 */ 0xE1 /* 'a' -> */, +/* pos 02bb: 373 */ 0xF4 /* 't' -> */, +/* pos 02bc: 374 */ 0xBA /* ':' -> */, +/* pos 02bd: 375 */ 0x00, 0x32 /* - terminal marker 50 - */, +/* pos 02bf: 376 */ 0xEE /* 'n' -> */, +/* pos 02c0: 377 */ 0xF4 /* 't' -> */, +/* pos 02c1: 378 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x02C8 s 379) */, + 0x3A /* ':' */, 0x3C, 0x00 /* (to 0x0300 s 412) */, + 0x08, /* fail */ +/* pos 02c8: 379 */ 0x66 /* 'f' */, 0x0D, 0x00 /* (to 0x02D5 s 380) */, + 0x73 /* 's' */, 0x12, 0x00 /* (to 0x02DD s 387) */, + 0x76 /* 'v' */, 0x21, 0x00 /* (to 0x02EF s 397) */, + 0x77 /* 'w' */, 0x27, 0x00 /* (to 0x02F8 s 405) */, + 0x08, /* fail */ +/* pos 02d5: 380 */ 0xE1 /* 'a' -> */, +/* pos 02d6: 381 */ 0xED /* 'm' -> */, +/* pos 02d7: 382 */ 0xE9 /* 'i' -> */, +/* pos 02d8: 383 */ 0xEC /* 'l' -> */, +/* pos 02d9: 384 */ 0xF9 /* 'y' -> */, +/* pos 02da: 385 */ 0xBA /* ':' -> */, +/* pos 02db: 386 */ 0x00, 0x33 /* - terminal marker 51 - */, +/* pos 02dd: 387 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x02E4 s 388) */, + 0x74 /* 't' */, 0x09, 0x00 /* (to 0x02E9 s 392) */, + 0x08, /* fail */ +/* pos 02e4: 388 */ 0xFA /* 'z' -> */, +/* pos 02e5: 389 */ 0xE5 /* 'e' -> */, +/* pos 02e6: 390 */ 0xBA /* ':' -> */, +/* pos 02e7: 391 */ 0x00, 0x34 /* - terminal marker 52 - */, +/* pos 02e9: 392 */ 0xF9 /* 'y' -> */, +/* pos 02ea: 393 */ 0xEC /* 'l' -> */, +/* pos 02eb: 394 */ 0xE5 /* 'e' -> */, +/* pos 02ec: 395 */ 0xBA /* ':' -> */, +/* pos 02ed: 396 */ 0x00, 0x35 /* - terminal marker 53 - */, +/* pos 02ef: 397 */ 0xE1 /* 'a' -> */, +/* pos 02f0: 398 */ 0xF2 /* 'r' -> */, +/* pos 02f1: 399 */ 0xE9 /* 'i' -> */, +/* pos 02f2: 400 */ 0xE1 /* 'a' -> */, +/* pos 02f3: 401 */ 0xEE /* 'n' -> */, +/* pos 02f4: 402 */ 0xF4 /* 't' -> */, +/* pos 02f5: 403 */ 0xBA /* ':' -> */, +/* pos 02f6: 404 */ 0x00, 0x36 /* - terminal marker 54 - */, +/* pos 02f8: 405 */ 0xE5 /* 'e' -> */, +/* pos 02f9: 406 */ 0xE9 /* 'i' -> */, +/* pos 02fa: 407 */ 0xE7 /* 'g' -> */, +/* pos 02fb: 408 */ 0xE8 /* 'h' -> */, +/* pos 02fc: 409 */ 0xF4 /* 't' -> */, +/* pos 02fd: 410 */ 0xBA /* ':' -> */, +/* pos 02fe: 411 */ 0x00, 0x37 /* - terminal marker 55 - */, +/* pos 0300: 412 */ 0x00, 0x38 /* - terminal marker 56 - */, +/* pos 0302: 413 */ 0xE5 /* 'e' -> */, +/* pos 0303: 414 */ 0xE9 /* 'i' -> */, +/* pos 0304: 415 */ 0xE7 /* 'g' -> */, +/* pos 0305: 416 */ 0xE8 /* 'h' -> */, +/* pos 0306: 417 */ 0xF4 /* 't' -> */, +/* pos 0307: 418 */ 0xBA /* ':' -> */, +/* pos 0308: 419 */ 0x00, 0x39 /* - terminal marker 57 - */, +/* pos 030a: 420 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0311 s 421) */, + 0x69 /* 'i' */, 0x1D, 0x00 /* (to 0x032A s 438) */, + 0x08, /* fail */ +/* pos 0311: 421 */ 0x66 /* 'f' */, 0x07, 0x00 /* (to 0x0318 s 422) */, + 0x74 /* 't' */, 0x08, 0x00 /* (to 0x031C s 425) */, + 0x08, /* fail */ +/* pos 0318: 422 */ 0xF4 /* 't' -> */, +/* pos 0319: 423 */ 0xBA /* ':' -> */, +/* pos 031a: 424 */ 0x00, 0x3A /* - terminal marker 58 - */, +/* pos 031c: 425 */ 0xF4 /* 't' -> */, +/* pos 031d: 426 */ 0xE5 /* 'e' -> */, +/* pos 031e: 427 */ 0xF2 /* 'r' -> */, +/* pos 031f: 428 */ 0xAD /* '-' -> */, +/* pos 0320: 429 */ 0xF3 /* 's' -> */, +/* pos 0321: 430 */ 0xF0 /* 'p' -> */, +/* pos 0322: 431 */ 0xE1 /* 'a' -> */, +/* pos 0323: 432 */ 0xE3 /* 'c' -> */, +/* pos 0324: 433 */ 0xE9 /* 'i' -> */, +/* pos 0325: 434 */ 0xEE /* 'n' -> */, +/* pos 0326: 435 */ 0xE7 /* 'g' -> */, +/* pos 0327: 436 */ 0xBA /* ':' -> */, +/* pos 0328: 437 */ 0x00, 0x3B /* - terminal marker 59 - */, +/* pos 032a: 438 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0331 s 439) */, + 0x73 /* 's' */, 0x0F, 0x00 /* (to 0x033C s 449) */, + 0x08, /* fail */ +/* pos 0331: 439 */ 0xE5 /* 'e' -> */, +/* pos 0332: 440 */ 0xAD /* '-' -> */, +/* pos 0333: 441 */ 0xE8 /* 'h' -> */, +/* pos 0334: 442 */ 0xE5 /* 'e' -> */, +/* pos 0335: 443 */ 0xE9 /* 'i' -> */, +/* pos 0336: 444 */ 0xE7 /* 'g' -> */, +/* pos 0337: 445 */ 0xE8 /* 'h' -> */, +/* pos 0338: 446 */ 0xF4 /* 't' -> */, +/* pos 0339: 447 */ 0xBA /* ':' -> */, +/* pos 033a: 448 */ 0x00, 0x3C /* - terminal marker 60 - */, +/* pos 033c: 449 */ 0xF4 /* 't' -> */, +/* pos 033d: 450 */ 0xAD /* '-' -> */, +/* pos 033e: 451 */ 0xF3 /* 's' -> */, +/* pos 033f: 452 */ 0xF4 /* 't' -> */, +/* pos 0340: 453 */ 0xF9 /* 'y' -> */, +/* pos 0341: 454 */ 0xEC /* 'l' -> */, +/* pos 0342: 455 */ 0xE5 /* 'e' -> */, +/* pos 0343: 456 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x034A s 457) */, + 0x3A /* ':' */, 0x25, 0x00 /* (to 0x036B s 478) */, + 0x08, /* fail */ +/* pos 034a: 457 */ 0x69 /* 'i' */, 0x0A, 0x00 /* (to 0x0354 s 458) */, + 0x70 /* 'p' */, 0x0E, 0x00 /* (to 0x035B s 464) */, + 0x74 /* 't' */, 0x15, 0x00 /* (to 0x0365 s 473) */, + 0x08, /* fail */ +/* pos 0354: 458 */ 0xED /* 'm' -> */, +/* pos 0355: 459 */ 0xE1 /* 'a' -> */, +/* pos 0356: 460 */ 0xE7 /* 'g' -> */, +/* pos 0357: 461 */ 0xE5 /* 'e' -> */, +/* pos 0358: 462 */ 0xBA /* ':' -> */, +/* pos 0359: 463 */ 0x00, 0x3D /* - terminal marker 61 - */, +/* pos 035b: 464 */ 0xEF /* 'o' -> */, +/* pos 035c: 465 */ 0xF3 /* 's' -> */, +/* pos 035d: 466 */ 0xE9 /* 'i' -> */, +/* pos 035e: 467 */ 0xF4 /* 't' -> */, +/* pos 035f: 468 */ 0xE9 /* 'i' -> */, +/* pos 0360: 469 */ 0xEF /* 'o' -> */, +/* pos 0361: 470 */ 0xEE /* 'n' -> */, +/* pos 0362: 471 */ 0xBA /* ':' -> */, +/* pos 0363: 472 */ 0x00, 0x3E /* - terminal marker 62 - */, +/* pos 0365: 473 */ 0xF9 /* 'y' -> */, +/* pos 0366: 474 */ 0xF0 /* 'p' -> */, +/* pos 0367: 475 */ 0xE5 /* 'e' -> */, +/* pos 0368: 476 */ 0xBA /* ':' -> */, +/* pos 0369: 477 */ 0x00, 0x3F /* - terminal marker 63 - */, +/* pos 036b: 478 */ 0x00, 0x40 /* - terminal marker 64 - */, +/* pos 036d: 479 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0374 s 480) */, + 0x69 /* 'i' */, 0x55, 0x00 /* (to 0x03C5 s 524) */, + 0x08, /* fail */ +/* pos 0374: 480 */ 0x72 /* 'r' */, 0x07, 0x00 /* (to 0x037B s 481) */, + 0x78 /* 'x' */, 0x37, 0x00 /* (to 0x03AE s 509) */, + 0x08, /* fail */ +/* pos 037b: 481 */ 0xE7 /* 'g' -> */, +/* pos 037c: 482 */ 0xE9 /* 'i' -> */, +/* pos 037d: 483 */ 0xEE /* 'n' -> */, +/* pos 037e: 484 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0385 s 485) */, + 0x3A /* ':' */, 0x2B, 0x00 /* (to 0x03AC s 508) */, + 0x08, /* fail */ +/* pos 0385: 485 */ 0x72 /* 'r' */, 0x0D, 0x00 /* (to 0x0392 s 486) */, + 0x6C /* 'l' */, 0x11, 0x00 /* (to 0x0399 s 492) */, + 0x74 /* 't' */, 0x14, 0x00 /* (to 0x039F s 497) */, + 0x62 /* 'b' */, 0x16, 0x00 /* (to 0x03A4 s 501) */, + 0x08, /* fail */ +/* pos 0392: 486 */ 0xE9 /* 'i' -> */, +/* pos 0393: 487 */ 0xE7 /* 'g' -> */, +/* pos 0394: 488 */ 0xE8 /* 'h' -> */, +/* pos 0395: 489 */ 0xF4 /* 't' -> */, +/* pos 0396: 490 */ 0xBA /* ':' -> */, +/* pos 0397: 491 */ 0x00, 0x41 /* - terminal marker 65 - */, +/* pos 0399: 492 */ 0xE5 /* 'e' -> */, +/* pos 039a: 493 */ 0xE6 /* 'f' -> */, +/* pos 039b: 494 */ 0xF4 /* 't' -> */, +/* pos 039c: 495 */ 0xBA /* ':' -> */, +/* pos 039d: 496 */ 0x00, 0x42 /* - terminal marker 66 - */, +/* pos 039f: 497 */ 0xEF /* 'o' -> */, +/* pos 03a0: 498 */ 0xF0 /* 'p' -> */, +/* pos 03a1: 499 */ 0xBA /* ':' -> */, +/* pos 03a2: 500 */ 0x00, 0x43 /* - terminal marker 67 - */, +/* pos 03a4: 501 */ 0xEF /* 'o' -> */, +/* pos 03a5: 502 */ 0xF4 /* 't' -> */, +/* pos 03a6: 503 */ 0xF4 /* 't' -> */, +/* pos 03a7: 504 */ 0xEF /* 'o' -> */, +/* pos 03a8: 505 */ 0xED /* 'm' -> */, +/* pos 03a9: 506 */ 0xBA /* ':' -> */, +/* pos 03aa: 507 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 03ac: 508 */ 0x00, 0x45 /* - terminal marker 69 - */, +/* pos 03ae: 509 */ 0xAD /* '-' -> */, +/* pos 03af: 510 */ 0x68 /* 'h' */, 0x07, 0x00 /* (to 0x03B6 s 511) */, + 0x77 /* 'w' */, 0x0C, 0x00 /* (to 0x03BE s 518) */, + 0x08, /* fail */ +/* pos 03b6: 511 */ 0xE5 /* 'e' -> */, +/* pos 03b7: 512 */ 0xE9 /* 'i' -> */, +/* pos 03b8: 513 */ 0xE7 /* 'g' -> */, +/* pos 03b9: 514 */ 0xE8 /* 'h' -> */, +/* pos 03ba: 515 */ 0xF4 /* 't' -> */, +/* pos 03bb: 516 */ 0xBA /* ':' -> */, +/* pos 03bc: 517 */ 0x00, 0x46 /* - terminal marker 70 - */, +/* pos 03be: 518 */ 0xE9 /* 'i' -> */, +/* pos 03bf: 519 */ 0xE4 /* 'd' -> */, +/* pos 03c0: 520 */ 0xF4 /* 't' -> */, +/* pos 03c1: 521 */ 0xE8 /* 'h' -> */, +/* pos 03c2: 522 */ 0xBA /* ':' -> */, +/* pos 03c3: 523 */ 0x00, 0x47 /* - terminal marker 71 - */, +/* pos 03c5: 524 */ 0xEE /* 'n' -> */, +/* pos 03c6: 525 */ 0xAD /* '-' -> */, +/* pos 03c7: 526 */ 0x68 /* 'h' */, 0x07, 0x00 /* (to 0x03CE s 527) */, + 0x77 /* 'w' */, 0x0C, 0x00 /* (to 0x03D6 s 534) */, + 0x08, /* fail */ +/* pos 03ce: 527 */ 0xE5 /* 'e' -> */, +/* pos 03cf: 528 */ 0xE9 /* 'i' -> */, +/* pos 03d0: 529 */ 0xE7 /* 'g' -> */, +/* pos 03d1: 530 */ 0xE8 /* 'h' -> */, +/* pos 03d2: 531 */ 0xF4 /* 't' -> */, +/* pos 03d3: 532 */ 0xBA /* ':' -> */, +/* pos 03d4: 533 */ 0x00, 0x48 /* - terminal marker 72 - */, +/* pos 03d6: 534 */ 0xE9 /* 'i' -> */, +/* pos 03d7: 535 */ 0xE4 /* 'd' -> */, +/* pos 03d8: 536 */ 0xF4 /* 't' -> */, +/* pos 03d9: 537 */ 0xE8 /* 'h' -> */, +/* pos 03da: 538 */ 0xBA /* ':' -> */, +/* pos 03db: 539 */ 0x00, 0x49 /* - terminal marker 73 - */, +/* pos 03dd: 540 */ 0x72 /* 'r' */, 0x0A, 0x00 /* (to 0x03E7 s 541) */, + 0x75 /* 'u' */, 0x0F, 0x00 /* (to 0x03EF s 548) */, + 0x76 /* 'v' */, 0x39, 0x00 /* (to 0x041C s 574) */, + 0x08, /* fail */ +/* pos 03e7: 541 */ 0xF0 /* 'p' -> */, +/* pos 03e8: 542 */ 0xE8 /* 'h' -> */, +/* pos 03e9: 543 */ 0xE1 /* 'a' -> */, +/* pos 03ea: 544 */ 0xEE /* 'n' -> */, +/* pos 03eb: 545 */ 0xF3 /* 's' -> */, +/* pos 03ec: 546 */ 0xBA /* ':' -> */, +/* pos 03ed: 547 */ 0x00, 0x4A /* - terminal marker 74 - */, +/* pos 03ef: 548 */ 0xF4 /* 't' -> */, +/* pos 03f0: 549 */ 0xEC /* 'l' -> */, +/* pos 03f1: 550 */ 0xE9 /* 'i' -> */, +/* pos 03f2: 551 */ 0xEE /* 'n' -> */, +/* pos 03f3: 552 */ 0xE5 /* 'e' -> */, +/* pos 03f4: 553 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x03FB s 554) */, + 0x3A /* ':' */, 0x23, 0x00 /* (to 0x041A s 573) */, + 0x08, /* fail */ +/* pos 03fb: 554 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x0405 s 555) */, + 0x73 /* 's' */, 0x0E, 0x00 /* (to 0x040C s 561) */, + 0x77 /* 'w' */, 0x12, 0x00 /* (to 0x0413 s 567) */, + 0x08, /* fail */ +/* pos 0405: 555 */ 0xEF /* 'o' -> */, +/* pos 0406: 556 */ 0xEC /* 'l' -> */, +/* pos 0407: 557 */ 0xEF /* 'o' -> */, +/* pos 0408: 558 */ 0xF2 /* 'r' -> */, +/* pos 0409: 559 */ 0xBA /* ':' -> */, +/* pos 040a: 560 */ 0x00, 0x4B /* - terminal marker 75 - */, +/* pos 040c: 561 */ 0xF4 /* 't' -> */, +/* pos 040d: 562 */ 0xF9 /* 'y' -> */, +/* pos 040e: 563 */ 0xEC /* 'l' -> */, +/* pos 040f: 564 */ 0xE5 /* 'e' -> */, +/* pos 0410: 565 */ 0xBA /* ':' -> */, +/* pos 0411: 566 */ 0x00, 0x4C /* - terminal marker 76 - */, +/* pos 0413: 567 */ 0xE9 /* 'i' -> */, +/* pos 0414: 568 */ 0xE4 /* 'd' -> */, +/* pos 0415: 569 */ 0xF4 /* 't' -> */, +/* pos 0416: 570 */ 0xE8 /* 'h' -> */, +/* pos 0417: 571 */ 0xBA /* ':' -> */, +/* pos 0418: 572 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 041a: 573 */ 0x00, 0x4E /* - terminal marker 78 - */, +/* pos 041c: 574 */ 0xE5 /* 'e' -> */, +/* pos 041d: 575 */ 0xF2 /* 'r' -> */, +/* pos 041e: 576 */ 0xE6 /* 'f' -> */, +/* pos 041f: 577 */ 0xEC /* 'l' -> */, +/* pos 0420: 578 */ 0xEF /* 'o' -> */, +/* pos 0421: 579 */ 0xF7 /* 'w' -> */, +/* pos 0422: 580 */ 0xBA /* ':' -> */, +/* pos 0423: 581 */ 0x00, 0x4F /* - terminal marker 79 - */, +/* pos 0425: 582 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0432 s 583) */, + 0x69 /* 'i' */, 0x92, 0x00 /* (to 0x04BA s 660) */, + 0x6C /* 'l' */, 0xA3, 0x00 /* (to 0x04CE s 672) */, + 0x6F /* 'o' */, 0xAC, 0x00 /* (to 0x04DA s 683) */, + 0x08, /* fail */ +/* pos 0432: 583 */ 0x64 /* 'd' */, 0x0A, 0x00 /* (to 0x043C s 584) */, + 0x67 /* 'g' */, 0x3B, 0x00 /* (to 0x0470 s 613) */, + 0x75 /* 'u' */, 0x61, 0x00 /* (to 0x0499 s 642) */, + 0x08, /* fail */ +/* pos 043c: 584 */ 0xE4 /* 'd' -> */, +/* pos 043d: 585 */ 0xE9 /* 'i' -> */, +/* pos 043e: 586 */ 0xEE /* 'n' -> */, +/* pos 043f: 587 */ 0xE7 /* 'g' -> */, +/* pos 0440: 588 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0447 s 589) */, + 0x3A /* ':' */, 0x2B, 0x00 /* (to 0x046E s 612) */, + 0x08, /* fail */ +/* pos 0447: 589 */ 0x74 /* 't' */, 0x0D, 0x00 /* (to 0x0454 s 590) */, + 0x72 /* 'r' */, 0x0F, 0x00 /* (to 0x0459 s 594) */, + 0x62 /* 'b' */, 0x13, 0x00 /* (to 0x0460 s 600) */, + 0x6C /* 'l' */, 0x18, 0x00 /* (to 0x0468 s 607) */, + 0x08, /* fail */ +/* pos 0454: 590 */ 0xEF /* 'o' -> */, +/* pos 0455: 591 */ 0xF0 /* 'p' -> */, +/* pos 0456: 592 */ 0xBA /* ':' -> */, +/* pos 0457: 593 */ 0x00, 0x50 /* - terminal marker 80 - */, +/* pos 0459: 594 */ 0xE9 /* 'i' -> */, +/* pos 045a: 595 */ 0xE7 /* 'g' -> */, +/* pos 045b: 596 */ 0xE8 /* 'h' -> */, +/* pos 045c: 597 */ 0xF4 /* 't' -> */, +/* pos 045d: 598 */ 0xBA /* ':' -> */, +/* pos 045e: 599 */ 0x00, 0x51 /* - terminal marker 81 - */, +/* pos 0460: 600 */ 0xEF /* 'o' -> */, +/* pos 0461: 601 */ 0xF4 /* 't' -> */, +/* pos 0462: 602 */ 0xF4 /* 't' -> */, +/* pos 0463: 603 */ 0xEF /* 'o' -> */, +/* pos 0464: 604 */ 0xED /* 'm' -> */, +/* pos 0465: 605 */ 0xBA /* ':' -> */, +/* pos 0466: 606 */ 0x00, 0x52 /* - terminal marker 82 - */, +/* pos 0468: 607 */ 0xE5 /* 'e' -> */, +/* pos 0469: 608 */ 0xE6 /* 'f' -> */, +/* pos 046a: 609 */ 0xF4 /* 't' -> */, +/* pos 046b: 610 */ 0xBA /* ':' -> */, +/* pos 046c: 611 */ 0x00, 0x53 /* - terminal marker 83 - */, +/* pos 046e: 612 */ 0x00, 0x54 /* - terminal marker 84 - */, +/* pos 0470: 613 */ 0xE5 /* 'e' -> */, +/* pos 0471: 614 */ 0xAD /* '-' -> */, +/* pos 0472: 615 */ 0xE2 /* 'b' -> */, +/* pos 0473: 616 */ 0xF2 /* 'r' -> */, +/* pos 0474: 617 */ 0xE5 /* 'e' -> */, +/* pos 0475: 618 */ 0xE1 /* 'a' -> */, +/* pos 0476: 619 */ 0xEB /* 'k' -> */, +/* pos 0477: 620 */ 0xAD /* '-' -> */, +/* pos 0478: 621 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x0482 s 622) */, + 0x62 /* 'b' */, 0x0E, 0x00 /* (to 0x0489 s 628) */, + 0x69 /* 'i' */, 0x13, 0x00 /* (to 0x0491 s 635) */, + 0x08, /* fail */ +/* pos 0482: 622 */ 0xE6 /* 'f' -> */, +/* pos 0483: 623 */ 0xF4 /* 't' -> */, +/* pos 0484: 624 */ 0xE5 /* 'e' -> */, +/* pos 0485: 625 */ 0xF2 /* 'r' -> */, +/* pos 0486: 626 */ 0xBA /* ':' -> */, +/* pos 0487: 627 */ 0x00, 0x55 /* - terminal marker 85 - */, +/* pos 0489: 628 */ 0xE5 /* 'e' -> */, +/* pos 048a: 629 */ 0xE6 /* 'f' -> */, +/* pos 048b: 630 */ 0xEF /* 'o' -> */, +/* pos 048c: 631 */ 0xF2 /* 'r' -> */, +/* pos 048d: 632 */ 0xE5 /* 'e' -> */, +/* pos 048e: 633 */ 0xBA /* ':' -> */, +/* pos 048f: 634 */ 0x00, 0x56 /* - terminal marker 86 - */, +/* pos 0491: 635 */ 0xEE /* 'n' -> */, +/* pos 0492: 636 */ 0xF3 /* 's' -> */, +/* pos 0493: 637 */ 0xE9 /* 'i' -> */, +/* pos 0494: 638 */ 0xE4 /* 'd' -> */, +/* pos 0495: 639 */ 0xE5 /* 'e' -> */, +/* pos 0496: 640 */ 0xBA /* ':' -> */, +/* pos 0497: 641 */ 0x00, 0x57 /* - terminal marker 87 - */, +/* pos 0499: 642 */ 0xF3 /* 's' -> */, +/* pos 049a: 643 */ 0xE5 /* 'e' -> */, +/* pos 049b: 644 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x04A2 s 645) */, + 0x3A /* ':' */, 0x1A, 0x00 /* (to 0x04B8 s 659) */, + 0x08, /* fail */ +/* pos 04a2: 645 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x04A9 s 646) */, + 0x62 /* 'b' */, 0x0B, 0x00 /* (to 0x04B0 s 652) */, + 0x08, /* fail */ +/* pos 04a9: 646 */ 0xE6 /* 'f' -> */, +/* pos 04aa: 647 */ 0xF4 /* 't' -> */, +/* pos 04ab: 648 */ 0xE5 /* 'e' -> */, +/* pos 04ac: 649 */ 0xF2 /* 'r' -> */, +/* pos 04ad: 650 */ 0xBA /* ':' -> */, +/* pos 04ae: 651 */ 0x00, 0x58 /* - terminal marker 88 - */, +/* pos 04b0: 652 */ 0xE5 /* 'e' -> */, +/* pos 04b1: 653 */ 0xE6 /* 'f' -> */, +/* pos 04b2: 654 */ 0xEF /* 'o' -> */, +/* pos 04b3: 655 */ 0xF2 /* 'r' -> */, +/* pos 04b4: 656 */ 0xE5 /* 'e' -> */, +/* pos 04b5: 657 */ 0xBA /* ':' -> */, +/* pos 04b6: 658 */ 0x00, 0x59 /* - terminal marker 89 - */, +/* pos 04b8: 659 */ 0x00, 0x5A /* - terminal marker 90 - */, +/* pos 04ba: 660 */ 0xF4 /* 't' -> */, +/* pos 04bb: 661 */ 0xE3 /* 'c' -> */, +/* pos 04bc: 662 */ 0xE8 /* 'h' -> */, +/* pos 04bd: 663 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x04C4 s 664) */, + 0x3A /* ':' */, 0x0C, 0x00 /* (to 0x04CC s 671) */, + 0x08, /* fail */ +/* pos 04c4: 664 */ 0xF2 /* 'r' -> */, +/* pos 04c5: 665 */ 0xE1 /* 'a' -> */, +/* pos 04c6: 666 */ 0xEE /* 'n' -> */, +/* pos 04c7: 667 */ 0xE7 /* 'g' -> */, +/* pos 04c8: 668 */ 0xE5 /* 'e' -> */, +/* pos 04c9: 669 */ 0xBA /* ':' -> */, +/* pos 04ca: 670 */ 0x00, 0x5B /* - terminal marker 91 - */, +/* pos 04cc: 671 */ 0x00, 0x5C /* - terminal marker 92 - */, +/* pos 04ce: 672 */ 0xE1 /* 'a' -> */, +/* pos 04cf: 673 */ 0xF9 /* 'y' -> */, +/* pos 04d0: 674 */ 0xAD /* '-' -> */, +/* pos 04d1: 675 */ 0xE4 /* 'd' -> */, +/* pos 04d2: 676 */ 0xF5 /* 'u' -> */, +/* pos 04d3: 677 */ 0xF2 /* 'r' -> */, +/* pos 04d4: 678 */ 0xE9 /* 'i' -> */, +/* pos 04d5: 679 */ 0xEE /* 'n' -> */, +/* pos 04d6: 680 */ 0xE7 /* 'g' -> */, +/* pos 04d7: 681 */ 0xBA /* ':' -> */, +/* pos 04d8: 682 */ 0x00, 0x5D /* - terminal marker 93 - */, +/* pos 04da: 683 */ 0xF3 /* 's' -> */, +/* pos 04db: 684 */ 0xE9 /* 'i' -> */, +/* pos 04dc: 685 */ 0xF4 /* 't' -> */, +/* pos 04dd: 686 */ 0xE9 /* 'i' -> */, +/* pos 04de: 687 */ 0xEF /* 'o' -> */, +/* pos 04df: 688 */ 0xEE /* 'n' -> */, +/* pos 04e0: 689 */ 0xBA /* ':' -> */, +/* pos 04e1: 690 */ 0x00, 0x5E /* - terminal marker 94 - */, +/* pos 04e3: 691 */ 0xF5 /* 'u' -> */, +/* pos 04e4: 692 */ 0xEF /* 'o' -> */, +/* pos 04e5: 693 */ 0xF4 /* 't' -> */, +/* pos 04e6: 694 */ 0xE5 /* 'e' -> */, +/* pos 04e7: 695 */ 0xF3 /* 's' -> */, +/* pos 04e8: 696 */ 0xBA /* ':' -> */, +/* pos 04e9: 697 */ 0x00, 0x5F /* - terminal marker 95 - */, +/* pos 04eb: 698 */ 0xE9 /* 'i' -> */, +/* pos 04ec: 699 */ 0x63 /* 'c' */, 0x07, 0x00 /* (to 0x04F3 s 700) */, + 0x67 /* 'g' */, 0x0C, 0x00 /* (to 0x04FB s 707) */, + 0x08, /* fail */ +/* pos 04f3: 700 */ 0xE8 /* 'h' -> */, +/* pos 04f4: 701 */ 0xEE /* 'n' -> */, +/* pos 04f5: 702 */ 0xE5 /* 'e' -> */, +/* pos 04f6: 703 */ 0xF3 /* 's' -> */, +/* pos 04f7: 704 */ 0xF3 /* 's' -> */, +/* pos 04f8: 705 */ 0xBA /* ':' -> */, +/* pos 04f9: 706 */ 0x00, 0x60 /* - terminal marker 96 - */, +/* pos 04fb: 707 */ 0xE8 /* 'h' -> */, +/* pos 04fc: 708 */ 0xF4 /* 't' -> */, +/* pos 04fd: 709 */ 0xBA /* ':' -> */, +/* pos 04fe: 710 */ 0x00, 0x61 /* - terminal marker 97 - */, +/* pos 0500: 711 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x0507 s 712) */, + 0x74 /* 't' */, 0x48, 0x00 /* (to 0x054B s 754) */, + 0x08, /* fail */ +/* pos 0507: 712 */ 0xE5 /* 'e' -> */, +/* pos 0508: 713 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x050F s 714) */, + 0x65 /* 'e' */, 0x36, 0x00 /* (to 0x0541 s 745) */, + 0x08, /* fail */ +/* pos 050f: 714 */ 0xEB /* 'k' -> */, +/* pos 0510: 715 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x0517 s 716) */, + 0x3A /* ':' */, 0x2C, 0x00 /* (to 0x053F s 744) */, + 0x08, /* fail */ +/* pos 0517: 716 */ 0x68 /* 'h' */, 0x0A, 0x00 /* (to 0x0521 s 717) */, + 0x6E /* 'n' */, 0x0F, 0x00 /* (to 0x0529 s 724) */, + 0x70 /* 'p' */, 0x15, 0x00 /* (to 0x0532 s 732) */, + 0x08, /* fail */ +/* pos 0521: 717 */ 0xE5 /* 'e' -> */, +/* pos 0522: 718 */ 0xE1 /* 'a' -> */, +/* pos 0523: 719 */ 0xE4 /* 'd' -> */, +/* pos 0524: 720 */ 0xE5 /* 'e' -> */, +/* pos 0525: 721 */ 0xF2 /* 'r' -> */, +/* pos 0526: 722 */ 0xBA /* ':' -> */, +/* pos 0527: 723 */ 0x00, 0x62 /* - terminal marker 98 - */, +/* pos 0529: 724 */ 0xF5 /* 'u' -> */, +/* pos 052a: 725 */ 0xED /* 'm' -> */, +/* pos 052b: 726 */ 0xE5 /* 'e' -> */, +/* pos 052c: 727 */ 0xF2 /* 'r' -> */, +/* pos 052d: 728 */ 0xE1 /* 'a' -> */, +/* pos 052e: 729 */ 0xEC /* 'l' -> */, +/* pos 052f: 730 */ 0xBA /* ':' -> */, +/* pos 0530: 731 */ 0x00, 0x63 /* - terminal marker 99 - */, +/* pos 0532: 732 */ 0xF5 /* 'u' -> */, +/* pos 0533: 733 */ 0xEE /* 'n' -> */, +/* pos 0534: 734 */ 0xE3 /* 'c' -> */, +/* pos 0535: 735 */ 0xF4 /* 't' -> */, +/* pos 0536: 736 */ 0xF5 /* 'u' -> */, +/* pos 0537: 737 */ 0xE1 /* 'a' -> */, +/* pos 0538: 738 */ 0xF4 /* 't' -> */, +/* pos 0539: 739 */ 0xE9 /* 'i' -> */, +/* pos 053a: 740 */ 0xEF /* 'o' -> */, +/* pos 053b: 741 */ 0xEE /* 'n' -> */, +/* pos 053c: 742 */ 0xBA /* ':' -> */, +/* pos 053d: 743 */ 0x00, 0x64 /* - terminal marker 100 - */, +/* pos 053f: 744 */ 0x00, 0x65 /* - terminal marker 101 - */, +/* pos 0541: 745 */ 0xE3 /* 'c' -> */, +/* pos 0542: 746 */ 0xE8 /* 'h' -> */, +/* pos 0543: 747 */ 0xAD /* '-' -> */, +/* pos 0544: 748 */ 0xF2 /* 'r' -> */, +/* pos 0545: 749 */ 0xE1 /* 'a' -> */, +/* pos 0546: 750 */ 0xF4 /* 't' -> */, +/* pos 0547: 751 */ 0xE5 /* 'e' -> */, +/* pos 0548: 752 */ 0xBA /* ':' -> */, +/* pos 0549: 753 */ 0x00, 0x66 /* - terminal marker 102 - */, +/* pos 054b: 754 */ 0xF2 /* 'r' -> */, +/* pos 054c: 755 */ 0xE5 /* 'e' -> */, +/* pos 054d: 756 */ 0xF3 /* 's' -> */, +/* pos 054e: 757 */ 0xF3 /* 's' -> */, +/* pos 054f: 758 */ 0xBA /* ':' -> */, +/* pos 0550: 759 */ 0x00, 0x67 /* - terminal marker 103 - */, +/* pos 0552: 760 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x055C s 761) */, + 0x65 /* 'e' */, 0x14, 0x00 /* (to 0x0569 s 773) */, + 0x6F /* 'o' */, 0x47, 0x00 /* (to 0x059F s 811) */, + 0x08, /* fail */ +/* pos 055c: 761 */ 0xE2 /* 'b' -> */, +/* pos 055d: 762 */ 0xEC /* 'l' -> */, +/* pos 055e: 763 */ 0xE5 /* 'e' -> */, +/* pos 055f: 764 */ 0xAD /* '-' -> */, +/* pos 0560: 765 */ 0xEC /* 'l' -> */, +/* pos 0561: 766 */ 0xE1 /* 'a' -> */, +/* pos 0562: 767 */ 0xF9 /* 'y' -> */, +/* pos 0563: 768 */ 0xEF /* 'o' -> */, +/* pos 0564: 769 */ 0xF5 /* 'u' -> */, +/* pos 0565: 770 */ 0xF4 /* 't' -> */, +/* pos 0566: 771 */ 0xBA /* ':' -> */, +/* pos 0567: 772 */ 0x00, 0x68 /* - terminal marker 104 - */, +/* pos 0569: 773 */ 0xF8 /* 'x' -> */, +/* pos 056a: 774 */ 0xF4 /* 't' -> */, +/* pos 056b: 775 */ 0xAD /* '-' -> */, +/* pos 056c: 776 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0579 s 777) */, + 0x64 /* 'd' */, 0x11, 0x00 /* (to 0x0580 s 783) */, + 0x69 /* 'i' */, 0x1A, 0x00 /* (to 0x058C s 794) */, + 0x74 /* 't' */, 0x1F, 0x00 /* (to 0x0594 s 801) */, + 0x08, /* fail */ +/* pos 0579: 777 */ 0xEC /* 'l' -> */, +/* pos 057a: 778 */ 0xE9 /* 'i' -> */, +/* pos 057b: 779 */ 0xE7 /* 'g' -> */, +/* pos 057c: 780 */ 0xEE /* 'n' -> */, +/* pos 057d: 781 */ 0xBA /* ':' -> */, +/* pos 057e: 782 */ 0x00, 0x69 /* - terminal marker 105 - */, +/* pos 0580: 783 */ 0xE5 /* 'e' -> */, +/* pos 0581: 784 */ 0xE3 /* 'c' -> */, +/* pos 0582: 785 */ 0xEF /* 'o' -> */, +/* pos 0583: 786 */ 0xF2 /* 'r' -> */, +/* pos 0584: 787 */ 0xE1 /* 'a' -> */, +/* pos 0585: 788 */ 0xF4 /* 't' -> */, +/* pos 0586: 789 */ 0xE9 /* 'i' -> */, +/* pos 0587: 790 */ 0xEF /* 'o' -> */, +/* pos 0588: 791 */ 0xEE /* 'n' -> */, +/* pos 0589: 792 */ 0xBA /* ':' -> */, +/* pos 058a: 793 */ 0x00, 0x6A /* - terminal marker 106 - */, +/* pos 058c: 794 */ 0xEE /* 'n' -> */, +/* pos 058d: 795 */ 0xE4 /* 'd' -> */, +/* pos 058e: 796 */ 0xE5 /* 'e' -> */, +/* pos 058f: 797 */ 0xEE /* 'n' -> */, +/* pos 0590: 798 */ 0xF4 /* 't' -> */, +/* pos 0591: 799 */ 0xBA /* ':' -> */, +/* pos 0592: 800 */ 0x00, 0x6B /* - terminal marker 107 - */, +/* pos 0594: 801 */ 0xF2 /* 'r' -> */, +/* pos 0595: 802 */ 0xE1 /* 'a' -> */, +/* pos 0596: 803 */ 0xEE /* 'n' -> */, +/* pos 0597: 804 */ 0xF3 /* 's' -> */, +/* pos 0598: 805 */ 0xE6 /* 'f' -> */, +/* pos 0599: 806 */ 0xEF /* 'o' -> */, +/* pos 059a: 807 */ 0xF2 /* 'r' -> */, +/* pos 059b: 808 */ 0xED /* 'm' -> */, +/* pos 059c: 809 */ 0xBA /* ':' -> */, +/* pos 059d: 810 */ 0x00, 0x6C /* - terminal marker 108 - */, +/* pos 059f: 811 */ 0xF0 /* 'p' -> */, +/* pos 05a0: 812 */ 0xBA /* ':' -> */, +/* pos 05a1: 813 */ 0x00, 0x6D /* - terminal marker 109 - */, +/* pos 05a3: 814 */ 0xEE /* 'n' -> */, +/* pos 05a4: 815 */ 0xE9 /* 'i' -> */, +/* pos 05a5: 816 */ 0xE3 /* 'c' -> */, +/* pos 05a6: 817 */ 0xEF /* 'o' -> */, +/* pos 05a7: 818 */ 0xE4 /* 'd' -> */, +/* pos 05a8: 819 */ 0xE5 /* 'e' -> */, +/* pos 05a9: 820 */ 0xAD /* '-' -> */, +/* pos 05aa: 821 */ 0xE2 /* 'b' -> */, +/* pos 05ab: 822 */ 0xE9 /* 'i' -> */, +/* pos 05ac: 823 */ 0xE4 /* 'd' -> */, +/* pos 05ad: 824 */ 0xE9 /* 'i' -> */, +/* pos 05ae: 825 */ 0xBA /* ':' -> */, +/* pos 05af: 826 */ 0x00, 0x6E /* - terminal marker 110 - */, +/* pos 05b1: 827 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x05BB s 828) */, + 0x69 /* 'i' */, 0x16, 0x00 /* (to 0x05CA s 842) */, + 0x6F /* 'o' */, 0x1E, 0x00 /* (to 0x05D5 s 852) */, + 0x08, /* fail */ +/* pos 05bb: 828 */ 0xF2 /* 'r' -> */, +/* pos 05bc: 829 */ 0xF4 /* 't' -> */, +/* pos 05bd: 830 */ 0xE9 /* 'i' -> */, +/* pos 05be: 831 */ 0xE3 /* 'c' -> */, +/* pos 05bf: 832 */ 0xE1 /* 'a' -> */, +/* pos 05c0: 833 */ 0xEC /* 'l' -> */, +/* pos 05c1: 834 */ 0xAD /* '-' -> */, +/* pos 05c2: 835 */ 0xE1 /* 'a' -> */, +/* pos 05c3: 836 */ 0xEC /* 'l' -> */, +/* pos 05c4: 837 */ 0xE9 /* 'i' -> */, +/* pos 05c5: 838 */ 0xE7 /* 'g' -> */, +/* pos 05c6: 839 */ 0xEE /* 'n' -> */, +/* pos 05c7: 840 */ 0xBA /* ':' -> */, +/* pos 05c8: 841 */ 0x00, 0x6F /* - terminal marker 111 - */, +/* pos 05ca: 842 */ 0xF3 /* 's' -> */, +/* pos 05cb: 843 */ 0xE9 /* 'i' -> */, +/* pos 05cc: 844 */ 0xE2 /* 'b' -> */, +/* pos 05cd: 845 */ 0xE9 /* 'i' -> */, +/* pos 05ce: 846 */ 0xEC /* 'l' -> */, +/* pos 05cf: 847 */ 0xE9 /* 'i' -> */, +/* pos 05d0: 848 */ 0xF4 /* 't' -> */, +/* pos 05d1: 849 */ 0xF9 /* 'y' -> */, +/* pos 05d2: 850 */ 0xBA /* ':' -> */, +/* pos 05d3: 851 */ 0x00, 0x70 /* - terminal marker 112 - */, +/* pos 05d5: 852 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x05DC s 853) */, + 0x6C /* 'l' */, 0x10, 0x00 /* (to 0x05E8 s 864) */, + 0x08, /* fail */ +/* pos 05dc: 853 */ 0xE3 /* 'c' -> */, +/* pos 05dd: 854 */ 0xE5 /* 'e' -> */, +/* pos 05de: 855 */ 0xAD /* '-' -> */, +/* pos 05df: 856 */ 0xE6 /* 'f' -> */, +/* pos 05e0: 857 */ 0xE1 /* 'a' -> */, +/* pos 05e1: 858 */ 0xED /* 'm' -> */, +/* pos 05e2: 859 */ 0xE9 /* 'i' -> */, +/* pos 05e3: 860 */ 0xEC /* 'l' -> */, +/* pos 05e4: 861 */ 0xF9 /* 'y' -> */, +/* pos 05e5: 862 */ 0xBA /* ':' -> */, +/* pos 05e6: 863 */ 0x00, 0x71 /* - terminal marker 113 - */, +/* pos 05e8: 864 */ 0xF5 /* 'u' -> */, +/* pos 05e9: 865 */ 0xED /* 'm' -> */, +/* pos 05ea: 866 */ 0xE5 /* 'e' -> */, +/* pos 05eb: 867 */ 0xBA /* ':' -> */, +/* pos 05ec: 868 */ 0x00, 0x72 /* - terminal marker 114 - */, +/* pos 05ee: 869 */ 0x68 /* 'h' */, 0x0A, 0x00 /* (to 0x05F8 s 870) */, + 0x69 /* 'i' */, 0x13, 0x00 /* (to 0x0604 s 881) */, + 0x6F /* 'o' */, 0x21, 0x00 /* (to 0x0615 s 890) */, + 0x08, /* fail */ +/* pos 05f8: 870 */ 0xE9 /* 'i' -> */, +/* pos 05f9: 871 */ 0xF4 /* 't' -> */, +/* pos 05fa: 872 */ 0xE5 /* 'e' -> */, +/* pos 05fb: 873 */ 0xAD /* '-' -> */, +/* pos 05fc: 874 */ 0xF3 /* 's' -> */, +/* pos 05fd: 875 */ 0xF0 /* 'p' -> */, +/* pos 05fe: 876 */ 0xE1 /* 'a' -> */, +/* pos 05ff: 877 */ 0xE3 /* 'c' -> */, +/* pos 0600: 878 */ 0xE5 /* 'e' -> */, +/* pos 0601: 879 */ 0xBA /* ':' -> */, +/* pos 0602: 880 */ 0x00, 0x73 /* - terminal marker 115 - */, +/* pos 0604: 881 */ 0xE4 /* 'd' -> */, +/* pos 0605: 882 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x060C s 883) */, + 0x74 /* 't' */, 0x09, 0x00 /* (to 0x0611 s 887) */, + 0x08, /* fail */ +/* pos 060c: 883 */ 0xF7 /* 'w' -> */, +/* pos 060d: 884 */ 0xF3 /* 's' -> */, +/* pos 060e: 885 */ 0xBA /* ':' -> */, +/* pos 060f: 886 */ 0x00, 0x74 /* - terminal marker 116 - */, +/* pos 0611: 887 */ 0xE8 /* 'h' -> */, +/* pos 0612: 888 */ 0xBA /* ':' -> */, +/* pos 0613: 889 */ 0x00, 0x75 /* - terminal marker 117 - */, +/* pos 0615: 890 */ 0xF2 /* 'r' -> */, +/* pos 0616: 891 */ 0xE4 /* 'd' -> */, +/* pos 0617: 892 */ 0xAD /* '-' -> */, +/* pos 0618: 893 */ 0xF3 /* 's' -> */, +/* pos 0619: 894 */ 0xF0 /* 'p' -> */, +/* pos 061a: 895 */ 0xE1 /* 'a' -> */, +/* pos 061b: 896 */ 0xE3 /* 'c' -> */, +/* pos 061c: 897 */ 0xE9 /* 'i' -> */, +/* pos 061d: 898 */ 0xEE /* 'n' -> */, +/* pos 061e: 899 */ 0xE7 /* 'g' -> */, +/* pos 061f: 900 */ 0xBA /* ':' -> */, +/* pos 0620: 901 */ 0x00, 0x76 /* - terminal marker 118 - */, +/* pos 0622: 902 */ 0xAD /* '-' -> */, +/* pos 0623: 903 */ 0xE9 /* 'i' -> */, +/* pos 0624: 904 */ 0xEE /* 'n' -> */, +/* pos 0625: 905 */ 0xE4 /* 'd' -> */, +/* pos 0626: 906 */ 0xE5 /* 'e' -> */, +/* pos 0627: 907 */ 0xF8 /* 'x' -> */, +/* pos 0628: 908 */ 0xBA /* ':' -> */, +/* pos 0629: 909 */ 0x00, 0x77 /* - terminal marker 119 - */, +/* total size 1579 bytes */ diff --git a/lib/misc/css-prop-constants.txt b/lib/misc/css-prop-constants.txt new file mode 100644 index 000000000..308bc1f9f --- /dev/null +++ b/lib/misc/css-prop-constants.txt @@ -0,0 +1,125 @@ +above +absolute +always +armenian +auto +avoid +baseline +behind +below +bidi-override +blink +block +bold +bolder +both +bottom +capitalize +caption +center +circle +close-quote +code +collapse +continuous +crosshair +decimal-leading-zero +decimal +digits +disc +embed +e-resize +fixed +georgian +help +hidden +hide +high +higher +icon +inherit +inline +inline-block +inline-table +invert +italic +justify +left +lighter +line-through +list-item +low +lower +lower-alpha +lowercase +lower-greek +lower-latin +lower-roman +ltr +menu +message-box +middle +mix +move +ne-resize +no-close-quote +none +no-open-quote +no-repeat +normal +nowrap +n-resize +nw-resize +oblique +once +open-quote +outside +overline +pointer +pre +pre-line +pre-wrap +progress +relative +repeat +repeat-x +repeat-y +right +rtl +scroll +separate +se-resize +show +silent +small-caps +small-caption +spell-out +square +s-resize +static +status-bar +sub +super +sw-resize +table +table-caption +table-cell +table-column +table-column-group +table-footer-group +table-header-group +table-row +table-row-group +text-bottom +text-top +text +top +transparent +underline +upper-alpha +uppercase +upper-latin +upper-roman +visible +wait +w-resize \ No newline at end of file diff --git a/lib/misc/css-propconst-lextable.h b/lib/misc/css-propconst-lextable.h new file mode 100644 index 000000000..24b2f0f46 --- /dev/null +++ b/lib/misc/css-propconst-lextable.h @@ -0,0 +1,1110 @@ + /* 0: above */ + /* 1: absolute */ + /* 2: always */ + /* 3: armenian */ + /* 4: auto */ + /* 5: avoid */ + /* 6: baseline */ + /* 7: behind */ + /* 8: below */ + /* 9: bidi-override */ + /* 10: blink */ + /* 11: block */ + /* 12: bold */ + /* 13: bolder */ + /* 14: both */ + /* 15: bottom */ + /* 16: capitalize */ + /* 17: caption */ + /* 18: center */ + /* 19: circle */ + /* 20: close-quote */ + /* 21: code */ + /* 22: collapse */ + /* 23: continuous */ + /* 24: crosshair */ + /* 25: decimal-leading-zero */ + /* 26: decimal */ + /* 27: digits */ + /* 28: disc */ + /* 29: embed */ + /* 30: e-resize */ + /* 31: fixed */ + /* 32: georgian */ + /* 33: help */ + /* 34: hidden */ + /* 35: hide */ + /* 36: high */ + /* 37: higher */ + /* 38: icon */ + /* 39: inherit */ + /* 40: inline */ + /* 41: inline-block */ + /* 42: inline-table */ + /* 43: invert */ + /* 44: italic */ + /* 45: justify */ + /* 46: left */ + /* 47: lighter */ + /* 48: line-through */ + /* 49: list-item */ + /* 50: low */ + /* 51: lower */ + /* 52: lower-alpha */ + /* 53: lowercase */ + /* 54: lower-greek */ + /* 55: lower-latin */ + /* 56: lower-roman */ + /* 57: ltr */ + /* 58: menu */ + /* 59: message-box */ + /* 60: middle */ + /* 61: mix */ + /* 62: move */ + /* 63: ne-resize */ + /* 64: no-close-quote */ + /* 65: none */ + /* 66: no-open-quote */ + /* 67: no-repeat */ + /* 68: normal */ + /* 69: nowrap */ + /* 70: n-resize */ + /* 71: nw-resize */ + /* 72: oblique */ + /* 73: once */ + /* 74: open-quote */ + /* 75: outside */ + /* 76: overline */ + /* 77: pointer */ + /* 78: pre */ + /* 79: pre-line */ + /* 80: pre-wrap */ + /* 81: progress */ + /* 82: relative */ + /* 83: repeat */ + /* 84: repeat-x */ + /* 85: repeat-y */ + /* 86: right */ + /* 87: rtl */ + /* 88: scroll */ + /* 89: separate */ + /* 90: se-resize */ + /* 91: show */ + /* 92: silent */ + /* 93: small-caps */ + /* 94: small-caption */ + /* 95: spell-out */ + /* 96: square */ + /* 97: s-resize */ + /* 98: static */ + /* 99: status-bar */ + /* 100: sub */ + /* 101: super */ + /* 102: sw-resize */ + /* 103: table */ + /* 104: table-caption */ + /* 105: table-cell */ + /* 106: table-column */ + /* 107: table-column-group */ + /* 108: table-footer-group */ + /* 109: table-header-group */ + /* 110: table-row */ + /* 111: table-row-group */ + /* 112: text-bottom */ + /* 113: text-top */ + /* 114: text */ + /* 115: top */ + /* 116: transparent */ + /* 117: underline */ + /* 118: upper-alpha */ + /* 119: uppercase */ + /* 120: upper-latin */ + /* 121: upper-roman */ + /* 122: visible */ + /* 123: wait */ + /* 124: w-resize */ +/* enum { + XXXX_ABOVE, + XXXX_ABSOLUTE, + XXXX_ALWAYS, + XXXX_ARMENIAN, + XXXX_AUTO, + XXXX_AVOID, + XXXX_BASELINE, + XXXX_BEHIND, + XXXX_BELOW, + XXXX_BIDI_OVERRIDE, + XXXX_BLINK, + XXXX_BLOCK, + XXXX_BOLD, + XXXX_BOLDER, + XXXX_BOTH, + XXXX_BOTTOM, + XXXX_CAPITALIZE, + XXXX_CAPTION, + XXXX_CENTER, + XXXX_CIRCLE, + XXXX_CLOSE_QUOTE, + XXXX_CODE, + XXXX_COLLAPSE, + XXXX_CONTINUOUS, + XXXX_CROSSHAIR, + XXXX_DECIMAL_LEADING_ZERO, + XXXX_DECIMAL, + XXXX_DIGITS, + XXXX_DISC, + XXXX_EMBED, + XXXX_E_RESIZE, + XXXX_FIXED, + XXXX_GEORGIAN, + XXXX_HELP, + XXXX_HIDDEN, + XXXX_HIDE, + XXXX_HIGH, + XXXX_HIGHER, + XXXX_ICON, + XXXX_INHERIT, + XXXX_INLINE, + XXXX_INLINE_BLOCK, + XXXX_INLINE_TABLE, + XXXX_INVERT, + XXXX_ITALIC, + XXXX_JUSTIFY, + XXXX_LEFT, + XXXX_LIGHTER, + XXXX_LINE_THROUGH, + XXXX_LIST_ITEM, + XXXX_LOW, + XXXX_LOWER, + XXXX_LOWER_ALPHA, + XXXX_LOWERCASE, + XXXX_LOWER_GREEK, + XXXX_LOWER_LATIN, + XXXX_LOWER_ROMAN, + XXXX_LTR, + XXXX_MENU, + XXXX_MESSAGE_BOX, + XXXX_MIDDLE, + XXXX_MIX, + XXXX_MOVE, + XXXX_NE_RESIZE, + XXXX_NO_CLOSE_QUOTE, + XXXX_NONE, + XXXX_NO_OPEN_QUOTE, + XXXX_NO_REPEAT, + XXXX_NORMAL, + XXXX_NOWRAP, + XXXX_N_RESIZE, + XXXX_NW_RESIZE, + XXXX_OBLIQUE, + XXXX_ONCE, + XXXX_OPEN_QUOTE, + XXXX_OUTSIDE, + XXXX_OVERLINE, + XXXX_POINTER, + XXXX_PRE, + XXXX_PRE_LINE, + XXXX_PRE_WRAP, + XXXX_PROGRESS, + XXXX_RELATIVE, + XXXX_REPEAT, + XXXX_REPEAT_X, + XXXX_REPEAT_Y, + XXXX_RIGHT, + XXXX_RTL, + XXXX_SCROLL, + XXXX_SEPARATE, + XXXX_SE_RESIZE, + XXXX_SHOW, + XXXX_SILENT, + XXXX_SMALL_CAPS, + XXXX_SMALL_CAPTION, + XXXX_SPELL_OUT, + XXXX_SQUARE, + XXXX_S_RESIZE, + XXXX_STATIC, + XXXX_STATUS_BAR, + XXXX_SUB, + XXXX_SUPER, + XXXX_SW_RESIZE, + XXXX_TABLE, + XXXX_TABLE_CAPTION, + XXXX_TABLE_CELL, + XXXX_TABLE_COLUMN, + XXXX_TABLE_COLUMN_GROUP, + XXXX_TABLE_FOOTER_GROUP, + XXXX_TABLE_HEADER_GROUP, + XXXX_TABLE_ROW, + XXXX_TABLE_ROW_GROUP, + XXXX_TEXT_BOTTOM, + XXXX_TEXT_TOP, + XXXX_TEXT, + XXXX_TOP, + XXXX_TRANSPARENT, + XXXX_UNDERLINE, + XXXX_UPPER_ALPHA, + XXXX_UPPERCASE, + XXXX_UPPER_LATIN, + XXXX_UPPER_ROMAN, + XXXX_VISIBLE, + XXXX_WAIT, + XXXX_W_RESIZE, +}; */ + +/* pos 0000: 0 */ 0x61 /* 'a' */, 0x40, 0x00 /* (to 0x0040 s 1) */, + 0x62 /* 'b' */, 0x76, 0x00 /* (to 0x0079 s 31) */, + 0x63 /* 'c' */, 0xD4, 0x00 /* (to 0x00DA s 76) */, + 0x64 /* 'd' */, 0x36, 0x01 /* (to 0x013F s 135) */, + 0x65 /* 'e' */, 0x61, 0x01 /* (to 0x016D s 162) */, + 0x66 /* 'f' */, 0x72, 0x01 /* (to 0x0181 s 174) */, + 0x67 /* 'g' */, 0x75, 0x01 /* (to 0x0187 s 179) */, + 0x68 /* 'h' */, 0x7B, 0x01 /* (to 0x0190 s 187) */, + 0x69 /* 'i' */, 0xA0, 0x01 /* (to 0x01B8 s 201) */, + 0x6A /* 'j' */, 0xE1, 0x01 /* (to 0x01FC s 235) */, + 0x6C /* 'l' */, 0xE6, 0x01 /* (to 0x0204 s 242) */, + 0x6D /* 'm' */, 0x53, 0x02 /* (to 0x0274 s 300) */, + 0x6E /* 'n' */, 0x80, 0x02 /* (to 0x02A4 s 322) */, + 0x6F /* 'o' */, 0xE6, 0x02 /* (to 0x030D s 385) */, + 0x70 /* 'p' */, 0x17, 0x03 /* (to 0x0341 s 417) */, + 0x72 /* 'r' */, 0x46, 0x03 /* (to 0x0373 s 441) */, + 0x73 /* 's' */, 0x76, 0x03 /* (to 0x03A6 s 462) */, + 0x74 /* 't' */, 0x10, 0x04 /* (to 0x0443 s 547) */, + 0x75 /* 'u' */, 0xA3, 0x04 /* (to 0x04D9 s 632) */, + 0x76 /* 'v' */, 0xDB, 0x04 /* (to 0x0514 s 665) */, + 0x77 /* 'w' */, 0xE0, 0x04 /* (to 0x051C s 672) */, + 0x08, /* fail */ +/* pos 0040: 1 */ 0x62 /* 'b' */, 0x10, 0x00 /* (to 0x0050 s 2) */, + 0x6C /* 'l' */, 0x1F, 0x00 /* (to 0x0062 s 12) */, + 0x72 /* 'r' */, 0x22, 0x00 /* (to 0x0068 s 17) */, + 0x75 /* 'u' */, 0x27, 0x00 /* (to 0x0070 s 24) */, + 0x76 /* 'v' */, 0x28, 0x00 /* (to 0x0074 s 27) */, + 0x08, /* fail */ +/* pos 0050: 2 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0057 s 3) */, + 0x73 /* 's' */, 0x08, 0x00 /* (to 0x005B s 6) */, + 0x08, /* fail */ +/* pos 0057: 3 */ 0xF6 /* 'v' -> */, +/* pos 0058: 4 */ 0xE5 /* 'e' -> */, +/* pos 0059: 5 */ 0x00, 0x00 /* - terminal marker 0 - */, +/* pos 005b: 6 */ 0xEF /* 'o' -> */, +/* pos 005c: 7 */ 0xEC /* 'l' -> */, +/* pos 005d: 8 */ 0xF5 /* 'u' -> */, +/* pos 005e: 9 */ 0xF4 /* 't' -> */, +/* pos 005f: 10 */ 0xE5 /* 'e' -> */, +/* pos 0060: 11 */ 0x00, 0x01 /* - terminal marker 1 - */, +/* pos 0062: 12 */ 0xF7 /* 'w' -> */, +/* pos 0063: 13 */ 0xE1 /* 'a' -> */, +/* pos 0064: 14 */ 0xF9 /* 'y' -> */, +/* pos 0065: 15 */ 0xF3 /* 's' -> */, +/* pos 0066: 16 */ 0x00, 0x02 /* - terminal marker 2 - */, +/* pos 0068: 17 */ 0xED /* 'm' -> */, +/* pos 0069: 18 */ 0xE5 /* 'e' -> */, +/* pos 006a: 19 */ 0xEE /* 'n' -> */, +/* pos 006b: 20 */ 0xE9 /* 'i' -> */, +/* pos 006c: 21 */ 0xE1 /* 'a' -> */, +/* pos 006d: 22 */ 0xEE /* 'n' -> */, +/* pos 006e: 23 */ 0x00, 0x03 /* - terminal marker 3 - */, +/* pos 0070: 24 */ 0xF4 /* 't' -> */, +/* pos 0071: 25 */ 0xEF /* 'o' -> */, +/* pos 0072: 26 */ 0x00, 0x04 /* - terminal marker 4 - */, +/* pos 0074: 27 */ 0xEF /* 'o' -> */, +/* pos 0075: 28 */ 0xE9 /* 'i' -> */, +/* pos 0076: 29 */ 0xE4 /* 'd' -> */, +/* pos 0077: 30 */ 0x00, 0x05 /* - terminal marker 5 - */, +/* pos 0079: 31 */ 0x61 /* 'a' */, 0x10, 0x00 /* (to 0x0089 s 32) */, + 0x65 /* 'e' */, 0x15, 0x00 /* (to 0x0091 s 39) */, + 0x69 /* 'i' */, 0x22, 0x00 /* (to 0x00A1 s 47) */, + 0x6C /* 'l' */, 0x2C, 0x00 /* (to 0x00AE s 59) */, + 0x6F /* 'o' */, 0x38, 0x00 /* (to 0x00BD s 66) */, + 0x08, /* fail */ +/* pos 0089: 32 */ 0xF3 /* 's' -> */, +/* pos 008a: 33 */ 0xE5 /* 'e' -> */, +/* pos 008b: 34 */ 0xEC /* 'l' -> */, +/* pos 008c: 35 */ 0xE9 /* 'i' -> */, +/* pos 008d: 36 */ 0xEE /* 'n' -> */, +/* pos 008e: 37 */ 0xE5 /* 'e' -> */, +/* pos 008f: 38 */ 0x00, 0x06 /* - terminal marker 6 - */, +/* pos 0091: 39 */ 0x68 /* 'h' */, 0x07, 0x00 /* (to 0x0098 s 40) */, + 0x6C /* 'l' */, 0x09, 0x00 /* (to 0x009D s 44) */, + 0x08, /* fail */ +/* pos 0098: 40 */ 0xE9 /* 'i' -> */, +/* pos 0099: 41 */ 0xEE /* 'n' -> */, +/* pos 009a: 42 */ 0xE4 /* 'd' -> */, +/* pos 009b: 43 */ 0x00, 0x07 /* - terminal marker 7 - */, +/* pos 009d: 44 */ 0xEF /* 'o' -> */, +/* pos 009e: 45 */ 0xF7 /* 'w' -> */, +/* pos 009f: 46 */ 0x00, 0x08 /* - terminal marker 8 - */, +/* pos 00a1: 47 */ 0xE4 /* 'd' -> */, +/* pos 00a2: 48 */ 0xE9 /* 'i' -> */, +/* pos 00a3: 49 */ 0xAD /* '-' -> */, +/* pos 00a4: 50 */ 0xEF /* 'o' -> */, +/* pos 00a5: 51 */ 0xF6 /* 'v' -> */, +/* pos 00a6: 52 */ 0xE5 /* 'e' -> */, +/* pos 00a7: 53 */ 0xF2 /* 'r' -> */, +/* pos 00a8: 54 */ 0xF2 /* 'r' -> */, +/* pos 00a9: 55 */ 0xE9 /* 'i' -> */, +/* pos 00aa: 56 */ 0xE4 /* 'd' -> */, +/* pos 00ab: 57 */ 0xE5 /* 'e' -> */, +/* pos 00ac: 58 */ 0x00, 0x09 /* - terminal marker 9 - */, +/* pos 00ae: 59 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x00B5 s 60) */, + 0x6F /* 'o' */, 0x08, 0x00 /* (to 0x00B9 s 63) */, + 0x08, /* fail */ +/* pos 00b5: 60 */ 0xEE /* 'n' -> */, +/* pos 00b6: 61 */ 0xEB /* 'k' -> */, +/* pos 00b7: 62 */ 0x00, 0x0A /* - terminal marker 10 - */, +/* pos 00b9: 63 */ 0xE3 /* 'c' -> */, +/* pos 00ba: 64 */ 0xEB /* 'k' -> */, +/* pos 00bb: 65 */ 0x00, 0x0B /* - terminal marker 11 - */, +/* pos 00bd: 66 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x00C4 s 67) */, + 0x74 /* 't' */, 0x0D, 0x00 /* (to 0x00CD s 71) */, + 0x08, /* fail */ +/* pos 00c4: 67 */ 0xE4 /* 'd' -> */, +/* pos 00c5: 68 */ 0x65 /* 'e' */, 0x05, 0x00 /* (to 0x00CA s 69) */, + 0x00, 0x0C /* - terminal marker 12 - */, +/* pos 00ca: 69 */ 0xF2 /* 'r' -> */, +/* pos 00cb: 70 */ 0x00, 0x0D /* - terminal marker 13 - */, +/* pos 00cd: 71 */ 0x68 /* 'h' */, 0x07, 0x00 /* (to 0x00D4 s 72) */, + 0x74 /* 't' */, 0x06, 0x00 /* (to 0x00D6 s 73) */, + 0x08, /* fail */ +/* pos 00d4: 72 */ 0x00, 0x0E /* - terminal marker 14 - */, +/* pos 00d6: 73 */ 0xEF /* 'o' -> */, +/* pos 00d7: 74 */ 0xED /* 'm' -> */, +/* pos 00d8: 75 */ 0x00, 0x0F /* - terminal marker 15 - */, +/* pos 00da: 76 */ 0x61 /* 'a' */, 0x13, 0x00 /* (to 0x00ED s 77) */, + 0x65 /* 'e' */, 0x25, 0x00 /* (to 0x0102 s 90) */, + 0x69 /* 'i' */, 0x28, 0x00 /* (to 0x0108 s 95) */, + 0x6C /* 'l' */, 0x2B, 0x00 /* (to 0x010E s 100) */, + 0x6F /* 'o' */, 0x33, 0x00 /* (to 0x0119 s 110) */, + 0x72 /* 'r' */, 0x4D, 0x00 /* (to 0x0136 s 127) */, + 0x08, /* fail */ +/* pos 00ed: 77 */ 0xF0 /* 'p' -> */, +/* pos 00ee: 78 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x00F5 s 79) */, + 0x74 /* 't' */, 0x0C, 0x00 /* (to 0x00FD s 86) */, + 0x08, /* fail */ +/* pos 00f5: 79 */ 0xF4 /* 't' -> */, +/* pos 00f6: 80 */ 0xE1 /* 'a' -> */, +/* pos 00f7: 81 */ 0xEC /* 'l' -> */, +/* pos 00f8: 82 */ 0xE9 /* 'i' -> */, +/* pos 00f9: 83 */ 0xFA /* 'z' -> */, +/* pos 00fa: 84 */ 0xE5 /* 'e' -> */, +/* pos 00fb: 85 */ 0x00, 0x10 /* - terminal marker 16 - */, +/* pos 00fd: 86 */ 0xE9 /* 'i' -> */, +/* pos 00fe: 87 */ 0xEF /* 'o' -> */, +/* pos 00ff: 88 */ 0xEE /* 'n' -> */, +/* pos 0100: 89 */ 0x00, 0x11 /* - terminal marker 17 - */, +/* pos 0102: 90 */ 0xEE /* 'n' -> */, +/* pos 0103: 91 */ 0xF4 /* 't' -> */, +/* pos 0104: 92 */ 0xE5 /* 'e' -> */, +/* pos 0105: 93 */ 0xF2 /* 'r' -> */, +/* pos 0106: 94 */ 0x00, 0x12 /* - terminal marker 18 - */, +/* pos 0108: 95 */ 0xF2 /* 'r' -> */, +/* pos 0109: 96 */ 0xE3 /* 'c' -> */, +/* pos 010a: 97 */ 0xEC /* 'l' -> */, +/* pos 010b: 98 */ 0xE5 /* 'e' -> */, +/* pos 010c: 99 */ 0x00, 0x13 /* - terminal marker 19 - */, +/* pos 010e: 100 */ 0xEF /* 'o' -> */, +/* pos 010f: 101 */ 0xF3 /* 's' -> */, +/* pos 0110: 102 */ 0xE5 /* 'e' -> */, +/* pos 0111: 103 */ 0xAD /* '-' -> */, +/* pos 0112: 104 */ 0xF1 /* 'q' -> */, +/* pos 0113: 105 */ 0xF5 /* 'u' -> */, +/* pos 0114: 106 */ 0xEF /* 'o' -> */, +/* pos 0115: 107 */ 0xF4 /* 't' -> */, +/* pos 0116: 108 */ 0xE5 /* 'e' -> */, +/* pos 0117: 109 */ 0x00, 0x14 /* - terminal marker 20 - */, +/* pos 0119: 110 */ 0x64 /* 'd' */, 0x0A, 0x00 /* (to 0x0123 s 111) */, + 0x6C /* 'l' */, 0x0A, 0x00 /* (to 0x0126 s 113) */, + 0x6E /* 'n' */, 0x0E, 0x00 /* (to 0x012D s 119) */, + 0x08, /* fail */ +/* pos 0123: 111 */ 0xE5 /* 'e' -> */, +/* pos 0124: 112 */ 0x00, 0x15 /* - terminal marker 21 - */, +/* pos 0126: 113 */ 0xEC /* 'l' -> */, +/* pos 0127: 114 */ 0xE1 /* 'a' -> */, +/* pos 0128: 115 */ 0xF0 /* 'p' -> */, +/* pos 0129: 116 */ 0xF3 /* 's' -> */, +/* pos 012a: 117 */ 0xE5 /* 'e' -> */, +/* pos 012b: 118 */ 0x00, 0x16 /* - terminal marker 22 - */, +/* pos 012d: 119 */ 0xF4 /* 't' -> */, +/* pos 012e: 120 */ 0xE9 /* 'i' -> */, +/* pos 012f: 121 */ 0xEE /* 'n' -> */, +/* pos 0130: 122 */ 0xF5 /* 'u' -> */, +/* pos 0131: 123 */ 0xEF /* 'o' -> */, +/* pos 0132: 124 */ 0xF5 /* 'u' -> */, +/* pos 0133: 125 */ 0xF3 /* 's' -> */, +/* pos 0134: 126 */ 0x00, 0x17 /* - terminal marker 23 - */, +/* pos 0136: 127 */ 0xEF /* 'o' -> */, +/* pos 0137: 128 */ 0xF3 /* 's' -> */, +/* pos 0138: 129 */ 0xF3 /* 's' -> */, +/* pos 0139: 130 */ 0xE8 /* 'h' -> */, +/* pos 013a: 131 */ 0xE1 /* 'a' -> */, +/* pos 013b: 132 */ 0xE9 /* 'i' -> */, +/* pos 013c: 133 */ 0xF2 /* 'r' -> */, +/* pos 013d: 134 */ 0x00, 0x18 /* - terminal marker 24 - */, +/* pos 013f: 135 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0146 s 136) */, + 0x69 /* 'i' */, 0x1C, 0x00 /* (to 0x015E s 155) */, + 0x08, /* fail */ +/* pos 0146: 136 */ 0xE3 /* 'c' -> */, +/* pos 0147: 137 */ 0xE9 /* 'i' -> */, +/* pos 0148: 138 */ 0xED /* 'm' -> */, +/* pos 0149: 139 */ 0xE1 /* 'a' -> */, +/* pos 014a: 140 */ 0xEC /* 'l' -> */, +/* pos 014b: 141 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x0150 s 142) */, + 0x00, 0x1A /* - terminal marker 26 - */, +/* pos 0150: 142 */ 0xEC /* 'l' -> */, +/* pos 0151: 143 */ 0xE5 /* 'e' -> */, +/* pos 0152: 144 */ 0xE1 /* 'a' -> */, +/* pos 0153: 145 */ 0xE4 /* 'd' -> */, +/* pos 0154: 146 */ 0xE9 /* 'i' -> */, +/* pos 0155: 147 */ 0xEE /* 'n' -> */, +/* pos 0156: 148 */ 0xE7 /* 'g' -> */, +/* pos 0157: 149 */ 0xAD /* '-' -> */, +/* pos 0158: 150 */ 0xFA /* 'z' -> */, +/* pos 0159: 151 */ 0xE5 /* 'e' -> */, +/* pos 015a: 152 */ 0xF2 /* 'r' -> */, +/* pos 015b: 153 */ 0xEF /* 'o' -> */, +/* pos 015c: 154 */ 0x00, 0x19 /* - terminal marker 25 - */, +/* pos 015e: 155 */ 0x67 /* 'g' */, 0x07, 0x00 /* (to 0x0165 s 156) */, + 0x73 /* 's' */, 0x09, 0x00 /* (to 0x016A s 160) */, + 0x08, /* fail */ +/* pos 0165: 156 */ 0xE9 /* 'i' -> */, +/* pos 0166: 157 */ 0xF4 /* 't' -> */, +/* pos 0167: 158 */ 0xF3 /* 's' -> */, +/* pos 0168: 159 */ 0x00, 0x1B /* - terminal marker 27 - */, +/* pos 016a: 160 */ 0xE3 /* 'c' -> */, +/* pos 016b: 161 */ 0x00, 0x1C /* - terminal marker 28 - */, +/* pos 016d: 162 */ 0x6D /* 'm' */, 0x07, 0x00 /* (to 0x0174 s 163) */, + 0x2D /* '-' */, 0x09, 0x00 /* (to 0x0179 s 167) */, + 0x08, /* fail */ +/* pos 0174: 163 */ 0xE2 /* 'b' -> */, +/* pos 0175: 164 */ 0xE5 /* 'e' -> */, +/* pos 0176: 165 */ 0xE4 /* 'd' -> */, +/* pos 0177: 166 */ 0x00, 0x1D /* - terminal marker 29 - */, +/* pos 0179: 167 */ 0xF2 /* 'r' -> */, +/* pos 017a: 168 */ 0xE5 /* 'e' -> */, +/* pos 017b: 169 */ 0xF3 /* 's' -> */, +/* pos 017c: 170 */ 0xE9 /* 'i' -> */, +/* pos 017d: 171 */ 0xFA /* 'z' -> */, +/* pos 017e: 172 */ 0xE5 /* 'e' -> */, +/* pos 017f: 173 */ 0x00, 0x1E /* - terminal marker 30 - */, +/* pos 0181: 174 */ 0xE9 /* 'i' -> */, +/* pos 0182: 175 */ 0xF8 /* 'x' -> */, +/* pos 0183: 176 */ 0xE5 /* 'e' -> */, +/* pos 0184: 177 */ 0xE4 /* 'd' -> */, +/* pos 0185: 178 */ 0x00, 0x1F /* - terminal marker 31 - */, +/* pos 0187: 179 */ 0xE5 /* 'e' -> */, +/* pos 0188: 180 */ 0xEF /* 'o' -> */, +/* pos 0189: 181 */ 0xF2 /* 'r' -> */, +/* pos 018a: 182 */ 0xE7 /* 'g' -> */, +/* pos 018b: 183 */ 0xE9 /* 'i' -> */, +/* pos 018c: 184 */ 0xE1 /* 'a' -> */, +/* pos 018d: 185 */ 0xEE /* 'n' -> */, +/* pos 018e: 186 */ 0x00, 0x20 /* - terminal marker 32 - */, +/* pos 0190: 187 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0197 s 188) */, + 0x69 /* 'i' */, 0x08, 0x00 /* (to 0x019B s 191) */, + 0x08, /* fail */ +/* pos 0197: 188 */ 0xEC /* 'l' -> */, +/* pos 0198: 189 */ 0xF0 /* 'p' -> */, +/* pos 0199: 190 */ 0x00, 0x21 /* - terminal marker 33 - */, +/* pos 019b: 191 */ 0x64 /* 'd' */, 0x07, 0x00 /* (to 0x01A2 s 192) */, + 0x67 /* 'g' */, 0x11, 0x00 /* (to 0x01AF s 197) */, + 0x08, /* fail */ +/* pos 01a2: 192 */ 0x64 /* 'd' */, 0x07, 0x00 /* (to 0x01A9 s 193) */, + 0x65 /* 'e' */, 0x08, 0x00 /* (to 0x01AD s 196) */, + 0x08, /* fail */ +/* pos 01a9: 193 */ 0xE5 /* 'e' -> */, +/* pos 01aa: 194 */ 0xEE /* 'n' -> */, +/* pos 01ab: 195 */ 0x00, 0x22 /* - terminal marker 34 - */, +/* pos 01ad: 196 */ 0x00, 0x23 /* - terminal marker 35 - */, +/* pos 01af: 197 */ 0xE8 /* 'h' -> */, +/* pos 01b0: 198 */ 0x65 /* 'e' */, 0x05, 0x00 /* (to 0x01B5 s 199) */, + 0x00, 0x24 /* - terminal marker 36 - */, +/* pos 01b5: 199 */ 0xF2 /* 'r' -> */, +/* pos 01b6: 200 */ 0x00, 0x25 /* - terminal marker 37 - */, +/* pos 01b8: 201 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x01C2 s 202) */, + 0x6E /* 'n' */, 0x0B, 0x00 /* (to 0x01C6 s 205) */, + 0x74 /* 't' */, 0x38, 0x00 /* (to 0x01F6 s 230) */, + 0x08, /* fail */ +/* pos 01c2: 202 */ 0xEF /* 'o' -> */, +/* pos 01c3: 203 */ 0xEE /* 'n' -> */, +/* pos 01c4: 204 */ 0x00, 0x26 /* - terminal marker 38 - */, +/* pos 01c6: 205 */ 0x68 /* 'h' */, 0x0A, 0x00 /* (to 0x01D0 s 206) */, + 0x6C /* 'l' */, 0x0D, 0x00 /* (to 0x01D6 s 211) */, + 0x76 /* 'v' */, 0x25, 0x00 /* (to 0x01F1 s 226) */, + 0x08, /* fail */ +/* pos 01d0: 206 */ 0xE5 /* 'e' -> */, +/* pos 01d1: 207 */ 0xF2 /* 'r' -> */, +/* pos 01d2: 208 */ 0xE9 /* 'i' -> */, +/* pos 01d3: 209 */ 0xF4 /* 't' -> */, +/* pos 01d4: 210 */ 0x00, 0x27 /* - terminal marker 39 - */, +/* pos 01d6: 211 */ 0xE9 /* 'i' -> */, +/* pos 01d7: 212 */ 0xEE /* 'n' -> */, +/* pos 01d8: 213 */ 0xE5 /* 'e' -> */, +/* pos 01d9: 214 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x01DE s 215) */, + 0x00, 0x28 /* - terminal marker 40 - */, +/* pos 01de: 215 */ 0x62 /* 'b' */, 0x07, 0x00 /* (to 0x01E5 s 216) */, + 0x74 /* 't' */, 0x0A, 0x00 /* (to 0x01EB s 221) */, + 0x08, /* fail */ +/* pos 01e5: 216 */ 0xEC /* 'l' -> */, +/* pos 01e6: 217 */ 0xEF /* 'o' -> */, +/* pos 01e7: 218 */ 0xE3 /* 'c' -> */, +/* pos 01e8: 219 */ 0xEB /* 'k' -> */, +/* pos 01e9: 220 */ 0x00, 0x29 /* - terminal marker 41 - */, +/* pos 01eb: 221 */ 0xE1 /* 'a' -> */, +/* pos 01ec: 222 */ 0xE2 /* 'b' -> */, +/* pos 01ed: 223 */ 0xEC /* 'l' -> */, +/* pos 01ee: 224 */ 0xE5 /* 'e' -> */, +/* pos 01ef: 225 */ 0x00, 0x2A /* - terminal marker 42 - */, +/* pos 01f1: 226 */ 0xE5 /* 'e' -> */, +/* pos 01f2: 227 */ 0xF2 /* 'r' -> */, +/* pos 01f3: 228 */ 0xF4 /* 't' -> */, +/* pos 01f4: 229 */ 0x00, 0x2B /* - terminal marker 43 - */, +/* pos 01f6: 230 */ 0xE1 /* 'a' -> */, +/* pos 01f7: 231 */ 0xEC /* 'l' -> */, +/* pos 01f8: 232 */ 0xE9 /* 'i' -> */, +/* pos 01f9: 233 */ 0xE3 /* 'c' -> */, +/* pos 01fa: 234 */ 0x00, 0x2C /* - terminal marker 44 - */, +/* pos 01fc: 235 */ 0xF5 /* 'u' -> */, +/* pos 01fd: 236 */ 0xF3 /* 's' -> */, +/* pos 01fe: 237 */ 0xF4 /* 't' -> */, +/* pos 01ff: 238 */ 0xE9 /* 'i' -> */, +/* pos 0200: 239 */ 0xE6 /* 'f' -> */, +/* pos 0201: 240 */ 0xF9 /* 'y' -> */, +/* pos 0202: 241 */ 0x00, 0x2D /* - terminal marker 45 - */, +/* pos 0204: 242 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x0211 s 243) */, + 0x69 /* 'i' */, 0x0E, 0x00 /* (to 0x0215 s 246) */, + 0x6F /* 'o' */, 0x2E, 0x00 /* (to 0x0238 s 269) */, + 0x74 /* 't' */, 0x64, 0x00 /* (to 0x0271 s 298) */, + 0x08, /* fail */ +/* pos 0211: 243 */ 0xE6 /* 'f' -> */, +/* pos 0212: 244 */ 0xF4 /* 't' -> */, +/* pos 0213: 245 */ 0x00, 0x2E /* - terminal marker 46 - */, +/* pos 0215: 246 */ 0x67 /* 'g' */, 0x0A, 0x00 /* (to 0x021F s 247) */, + 0x6E /* 'n' */, 0x0D, 0x00 /* (to 0x0225 s 252) */, + 0x73 /* 's' */, 0x15, 0x00 /* (to 0x0230 s 262) */, + 0x08, /* fail */ +/* pos 021f: 247 */ 0xE8 /* 'h' -> */, +/* pos 0220: 248 */ 0xF4 /* 't' -> */, +/* pos 0221: 249 */ 0xE5 /* 'e' -> */, +/* pos 0222: 250 */ 0xF2 /* 'r' -> */, +/* pos 0223: 251 */ 0x00, 0x2F /* - terminal marker 47 - */, +/* pos 0225: 252 */ 0xE5 /* 'e' -> */, +/* pos 0226: 253 */ 0xAD /* '-' -> */, +/* pos 0227: 254 */ 0xF4 /* 't' -> */, +/* pos 0228: 255 */ 0xE8 /* 'h' -> */, +/* pos 0229: 256 */ 0xF2 /* 'r' -> */, +/* pos 022a: 257 */ 0xEF /* 'o' -> */, +/* pos 022b: 258 */ 0xF5 /* 'u' -> */, +/* pos 022c: 259 */ 0xE7 /* 'g' -> */, +/* pos 022d: 260 */ 0xE8 /* 'h' -> */, +/* pos 022e: 261 */ 0x00, 0x30 /* - terminal marker 48 - */, +/* pos 0230: 262 */ 0xF4 /* 't' -> */, +/* pos 0231: 263 */ 0xAD /* '-' -> */, +/* pos 0232: 264 */ 0xE9 /* 'i' -> */, +/* pos 0233: 265 */ 0xF4 /* 't' -> */, +/* pos 0234: 266 */ 0xE5 /* 'e' -> */, +/* pos 0235: 267 */ 0xED /* 'm' -> */, +/* pos 0236: 268 */ 0x00, 0x31 /* - terminal marker 49 - */, +/* pos 0238: 269 */ 0xF7 /* 'w' -> */, +/* pos 0239: 270 */ 0x65 /* 'e' */, 0x05, 0x00 /* (to 0x023E s 271) */, + 0x00, 0x32 /* - terminal marker 50 - */, +/* pos 023e: 271 */ 0xF2 /* 'r' -> */, +/* pos 023f: 272 */ 0x2D /* '-' */, 0x08, 0x00 /* (to 0x0247 s 273) */, + 0x63 /* 'c' */, 0x18, 0x00 /* (to 0x025A s 279) */, + 0x00, 0x33 /* - terminal marker 51 - */, +/* pos 0247: 273 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0254 s 274) */, + 0x67 /* 'g' */, 0x15, 0x00 /* (to 0x025F s 283) */, + 0x6C /* 'l' */, 0x18, 0x00 /* (to 0x0265 s 288) */, + 0x72 /* 'r' */, 0x1B, 0x00 /* (to 0x026B s 293) */, + 0x08, /* fail */ +/* pos 0254: 274 */ 0xEC /* 'l' -> */, +/* pos 0255: 275 */ 0xF0 /* 'p' -> */, +/* pos 0256: 276 */ 0xE8 /* 'h' -> */, +/* pos 0257: 277 */ 0xE1 /* 'a' -> */, +/* pos 0258: 278 */ 0x00, 0x34 /* - terminal marker 52 - */, +/* pos 025a: 279 */ 0xE1 /* 'a' -> */, +/* pos 025b: 280 */ 0xF3 /* 's' -> */, +/* pos 025c: 281 */ 0xE5 /* 'e' -> */, +/* pos 025d: 282 */ 0x00, 0x35 /* - terminal marker 53 - */, +/* pos 025f: 283 */ 0xF2 /* 'r' -> */, +/* pos 0260: 284 */ 0xE5 /* 'e' -> */, +/* pos 0261: 285 */ 0xE5 /* 'e' -> */, +/* pos 0262: 286 */ 0xEB /* 'k' -> */, +/* pos 0263: 287 */ 0x00, 0x36 /* - terminal marker 54 - */, +/* pos 0265: 288 */ 0xE1 /* 'a' -> */, +/* pos 0266: 289 */ 0xF4 /* 't' -> */, +/* pos 0267: 290 */ 0xE9 /* 'i' -> */, +/* pos 0268: 291 */ 0xEE /* 'n' -> */, +/* pos 0269: 292 */ 0x00, 0x37 /* - terminal marker 55 - */, +/* pos 026b: 293 */ 0xEF /* 'o' -> */, +/* pos 026c: 294 */ 0xED /* 'm' -> */, +/* pos 026d: 295 */ 0xE1 /* 'a' -> */, +/* pos 026e: 296 */ 0xEE /* 'n' -> */, +/* pos 026f: 297 */ 0x00, 0x38 /* - terminal marker 56 - */, +/* pos 0271: 298 */ 0xF2 /* 'r' -> */, +/* pos 0272: 299 */ 0x00, 0x39 /* - terminal marker 57 - */, +/* pos 0274: 300 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x027E s 301) */, + 0x69 /* 'i' */, 0x1B, 0x00 /* (to 0x0292 s 313) */, + 0x6F /* 'o' */, 0x26, 0x00 /* (to 0x02A0 s 319) */, + 0x08, /* fail */ +/* pos 027e: 301 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x0285 s 302) */, + 0x73 /* 's' */, 0x07, 0x00 /* (to 0x0288 s 304) */, + 0x08, /* fail */ +/* pos 0285: 302 */ 0xF5 /* 'u' -> */, +/* pos 0286: 303 */ 0x00, 0x3A /* - terminal marker 58 - */, +/* pos 0288: 304 */ 0xF3 /* 's' -> */, +/* pos 0289: 305 */ 0xE1 /* 'a' -> */, +/* pos 028a: 306 */ 0xE7 /* 'g' -> */, +/* pos 028b: 307 */ 0xE5 /* 'e' -> */, +/* pos 028c: 308 */ 0xAD /* '-' -> */, +/* pos 028d: 309 */ 0xE2 /* 'b' -> */, +/* pos 028e: 310 */ 0xEF /* 'o' -> */, +/* pos 028f: 311 */ 0xF8 /* 'x' -> */, +/* pos 0290: 312 */ 0x00, 0x3B /* - terminal marker 59 - */, +/* pos 0292: 313 */ 0x64 /* 'd' */, 0x07, 0x00 /* (to 0x0299 s 314) */, + 0x78 /* 'x' */, 0x09, 0x00 /* (to 0x029E s 318) */, + 0x08, /* fail */ +/* pos 0299: 314 */ 0xE4 /* 'd' -> */, +/* pos 029a: 315 */ 0xEC /* 'l' -> */, +/* pos 029b: 316 */ 0xE5 /* 'e' -> */, +/* pos 029c: 317 */ 0x00, 0x3C /* - terminal marker 60 - */, +/* pos 029e: 318 */ 0x00, 0x3D /* - terminal marker 61 - */, +/* pos 02a0: 319 */ 0xF6 /* 'v' -> */, +/* pos 02a1: 320 */ 0xE5 /* 'e' -> */, +/* pos 02a2: 321 */ 0x00, 0x3E /* - terminal marker 62 - */, +/* pos 02a4: 322 */ 0x65 /* 'e' */, 0x0D, 0x00 /* (to 0x02B1 s 323) */, + 0x6F /* 'o' */, 0x13, 0x00 /* (to 0x02BA s 331) */, + 0x2D /* '-' */, 0x52, 0x00 /* (to 0x02FC s 370) */, + 0x77 /* 'w' */, 0x57, 0x00 /* (to 0x0304 s 377) */, + 0x08, /* fail */ +/* pos 02b1: 323 */ 0xAD /* '-' -> */, +/* pos 02b2: 324 */ 0xF2 /* 'r' -> */, +/* pos 02b3: 325 */ 0xE5 /* 'e' -> */, +/* pos 02b4: 326 */ 0xF3 /* 's' -> */, +/* pos 02b5: 327 */ 0xE9 /* 'i' -> */, +/* pos 02b6: 328 */ 0xFA /* 'z' -> */, +/* pos 02b7: 329 */ 0xE5 /* 'e' -> */, +/* pos 02b8: 330 */ 0x00, 0x3F /* - terminal marker 63 - */, +/* pos 02ba: 331 */ 0x2D /* '-' */, 0x0D, 0x00 /* (to 0x02C7 s 332) */, + 0x6E /* 'n' */, 0x20, 0x00 /* (to 0x02DD s 344) */, + 0x72 /* 'r' */, 0x32, 0x00 /* (to 0x02F2 s 362) */, + 0x77 /* 'w' */, 0x34, 0x00 /* (to 0x02F7 s 366) */, + 0x08, /* fail */ +/* pos 02c7: 332 */ 0x63 /* 'c' */, 0x0A, 0x00 /* (to 0x02D1 s 333) */, + 0x6F /* 'o' */, 0x16, 0x00 /* (to 0x02E0 s 346) */, + 0x72 /* 'r' */, 0x1E, 0x00 /* (to 0x02EB s 356) */, + 0x08, /* fail */ +/* pos 02d1: 333 */ 0xEC /* 'l' -> */, +/* pos 02d2: 334 */ 0xEF /* 'o' -> */, +/* pos 02d3: 335 */ 0xF3 /* 's' -> */, +/* pos 02d4: 336 */ 0xE5 /* 'e' -> */, +/* pos 02d5: 337 */ 0xAD /* '-' -> */, +/* pos 02d6: 338 */ 0xF1 /* 'q' -> */, +/* pos 02d7: 339 */ 0xF5 /* 'u' -> */, +/* pos 02d8: 340 */ 0xEF /* 'o' -> */, +/* pos 02d9: 341 */ 0xF4 /* 't' -> */, +/* pos 02da: 342 */ 0xE5 /* 'e' -> */, +/* pos 02db: 343 */ 0x00, 0x40 /* - terminal marker 64 - */, +/* pos 02dd: 344 */ 0xE5 /* 'e' -> */, +/* pos 02de: 345 */ 0x00, 0x41 /* - terminal marker 65 - */, +/* pos 02e0: 346 */ 0xF0 /* 'p' -> */, +/* pos 02e1: 347 */ 0xE5 /* 'e' -> */, +/* pos 02e2: 348 */ 0xEE /* 'n' -> */, +/* pos 02e3: 349 */ 0xAD /* '-' -> */, +/* pos 02e4: 350 */ 0xF1 /* 'q' -> */, +/* pos 02e5: 351 */ 0xF5 /* 'u' -> */, +/* pos 02e6: 352 */ 0xEF /* 'o' -> */, +/* pos 02e7: 353 */ 0xF4 /* 't' -> */, +/* pos 02e8: 354 */ 0xE5 /* 'e' -> */, +/* pos 02e9: 355 */ 0x00, 0x42 /* - terminal marker 66 - */, +/* pos 02eb: 356 */ 0xE5 /* 'e' -> */, +/* pos 02ec: 357 */ 0xF0 /* 'p' -> */, +/* pos 02ed: 358 */ 0xE5 /* 'e' -> */, +/* pos 02ee: 359 */ 0xE1 /* 'a' -> */, +/* pos 02ef: 360 */ 0xF4 /* 't' -> */, +/* pos 02f0: 361 */ 0x00, 0x43 /* - terminal marker 67 - */, +/* pos 02f2: 362 */ 0xED /* 'm' -> */, +/* pos 02f3: 363 */ 0xE1 /* 'a' -> */, +/* pos 02f4: 364 */ 0xEC /* 'l' -> */, +/* pos 02f5: 365 */ 0x00, 0x44 /* - terminal marker 68 - */, +/* pos 02f7: 366 */ 0xF2 /* 'r' -> */, +/* pos 02f8: 367 */ 0xE1 /* 'a' -> */, +/* pos 02f9: 368 */ 0xF0 /* 'p' -> */, +/* pos 02fa: 369 */ 0x00, 0x45 /* - terminal marker 69 - */, +/* pos 02fc: 370 */ 0xF2 /* 'r' -> */, +/* pos 02fd: 371 */ 0xE5 /* 'e' -> */, +/* pos 02fe: 372 */ 0xF3 /* 's' -> */, +/* pos 02ff: 373 */ 0xE9 /* 'i' -> */, +/* pos 0300: 374 */ 0xFA /* 'z' -> */, +/* pos 0301: 375 */ 0xE5 /* 'e' -> */, +/* pos 0302: 376 */ 0x00, 0x46 /* - terminal marker 70 - */, +/* pos 0304: 377 */ 0xAD /* '-' -> */, +/* pos 0305: 378 */ 0xF2 /* 'r' -> */, +/* pos 0306: 379 */ 0xE5 /* 'e' -> */, +/* pos 0307: 380 */ 0xF3 /* 's' -> */, +/* pos 0308: 381 */ 0xE9 /* 'i' -> */, +/* pos 0309: 382 */ 0xFA /* 'z' -> */, +/* pos 030a: 383 */ 0xE5 /* 'e' -> */, +/* pos 030b: 384 */ 0x00, 0x47 /* - terminal marker 71 - */, +/* pos 030d: 385 */ 0x62 /* 'b' */, 0x10, 0x00 /* (to 0x031D s 386) */, + 0x6E /* 'n' */, 0x14, 0x00 /* (to 0x0324 s 392) */, + 0x70 /* 'p' */, 0x15, 0x00 /* (to 0x0328 s 395) */, + 0x75 /* 'u' */, 0x1C, 0x00 /* (to 0x0332 s 404) */, + 0x76 /* 'v' */, 0x20, 0x00 /* (to 0x0339 s 410) */, + 0x08, /* fail */ +/* pos 031d: 386 */ 0xEC /* 'l' -> */, +/* pos 031e: 387 */ 0xE9 /* 'i' -> */, +/* pos 031f: 388 */ 0xF1 /* 'q' -> */, +/* pos 0320: 389 */ 0xF5 /* 'u' -> */, +/* pos 0321: 390 */ 0xE5 /* 'e' -> */, +/* pos 0322: 391 */ 0x00, 0x48 /* - terminal marker 72 - */, +/* pos 0324: 392 */ 0xE3 /* 'c' -> */, +/* pos 0325: 393 */ 0xE5 /* 'e' -> */, +/* pos 0326: 394 */ 0x00, 0x49 /* - terminal marker 73 - */, +/* pos 0328: 395 */ 0xE5 /* 'e' -> */, +/* pos 0329: 396 */ 0xEE /* 'n' -> */, +/* pos 032a: 397 */ 0xAD /* '-' -> */, +/* pos 032b: 398 */ 0xF1 /* 'q' -> */, +/* pos 032c: 399 */ 0xF5 /* 'u' -> */, +/* pos 032d: 400 */ 0xEF /* 'o' -> */, +/* pos 032e: 401 */ 0xF4 /* 't' -> */, +/* pos 032f: 402 */ 0xE5 /* 'e' -> */, +/* pos 0330: 403 */ 0x00, 0x4A /* - terminal marker 74 - */, +/* pos 0332: 404 */ 0xF4 /* 't' -> */, +/* pos 0333: 405 */ 0xF3 /* 's' -> */, +/* pos 0334: 406 */ 0xE9 /* 'i' -> */, +/* pos 0335: 407 */ 0xE4 /* 'd' -> */, +/* pos 0336: 408 */ 0xE5 /* 'e' -> */, +/* pos 0337: 409 */ 0x00, 0x4B /* - terminal marker 75 - */, +/* pos 0339: 410 */ 0xE5 /* 'e' -> */, +/* pos 033a: 411 */ 0xF2 /* 'r' -> */, +/* pos 033b: 412 */ 0xEC /* 'l' -> */, +/* pos 033c: 413 */ 0xE9 /* 'i' -> */, +/* pos 033d: 414 */ 0xEE /* 'n' -> */, +/* pos 033e: 415 */ 0xE5 /* 'e' -> */, +/* pos 033f: 416 */ 0x00, 0x4C /* - terminal marker 76 - */, +/* pos 0341: 417 */ 0x6F /* 'o' */, 0x07, 0x00 /* (to 0x0348 s 418) */, + 0x72 /* 'r' */, 0x0B, 0x00 /* (to 0x034F s 424) */, + 0x08, /* fail */ +/* pos 0348: 418 */ 0xE9 /* 'i' -> */, +/* pos 0349: 419 */ 0xEE /* 'n' -> */, +/* pos 034a: 420 */ 0xF4 /* 't' -> */, +/* pos 034b: 421 */ 0xE5 /* 'e' -> */, +/* pos 034c: 422 */ 0xF2 /* 'r' -> */, +/* pos 034d: 423 */ 0x00, 0x4D /* - terminal marker 77 - */, +/* pos 034f: 424 */ 0x65 /* 'e' */, 0x07, 0x00 /* (to 0x0356 s 425) */, + 0x6F /* 'o' */, 0x1A, 0x00 /* (to 0x036C s 435) */, + 0x08, /* fail */ +/* pos 0356: 425 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x035B s 426) */, + 0x00, 0x4E /* - terminal marker 78 - */, +/* pos 035b: 426 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x0362 s 427) */, + 0x77 /* 'w' */, 0x09, 0x00 /* (to 0x0367 s 431) */, + 0x08, /* fail */ +/* pos 0362: 427 */ 0xE9 /* 'i' -> */, +/* pos 0363: 428 */ 0xEE /* 'n' -> */, +/* pos 0364: 429 */ 0xE5 /* 'e' -> */, +/* pos 0365: 430 */ 0x00, 0x4F /* - terminal marker 79 - */, +/* pos 0367: 431 */ 0xF2 /* 'r' -> */, +/* pos 0368: 432 */ 0xE1 /* 'a' -> */, +/* pos 0369: 433 */ 0xF0 /* 'p' -> */, +/* pos 036a: 434 */ 0x00, 0x50 /* - terminal marker 80 - */, +/* pos 036c: 435 */ 0xE7 /* 'g' -> */, +/* pos 036d: 436 */ 0xF2 /* 'r' -> */, +/* pos 036e: 437 */ 0xE5 /* 'e' -> */, +/* pos 036f: 438 */ 0xF3 /* 's' -> */, +/* pos 0370: 439 */ 0xF3 /* 's' -> */, +/* pos 0371: 440 */ 0x00, 0x51 /* - terminal marker 81 - */, +/* pos 0373: 441 */ 0x65 /* 'e' */, 0x0A, 0x00 /* (to 0x037D s 442) */, + 0x69 /* 'i' */, 0x28, 0x00 /* (to 0x039E s 456) */, + 0x74 /* 't' */, 0x2A, 0x00 /* (to 0x03A3 s 460) */, + 0x08, /* fail */ +/* pos 037d: 442 */ 0x6C /* 'l' */, 0x07, 0x00 /* (to 0x0384 s 443) */, + 0x70 /* 'p' */, 0x0B, 0x00 /* (to 0x038B s 449) */, + 0x08, /* fail */ +/* pos 0384: 443 */ 0xE1 /* 'a' -> */, +/* pos 0385: 444 */ 0xF4 /* 't' -> */, +/* pos 0386: 445 */ 0xE9 /* 'i' -> */, +/* pos 0387: 446 */ 0xF6 /* 'v' -> */, +/* pos 0388: 447 */ 0xE5 /* 'e' -> */, +/* pos 0389: 448 */ 0x00, 0x52 /* - terminal marker 82 - */, +/* pos 038b: 449 */ 0xE5 /* 'e' -> */, +/* pos 038c: 450 */ 0xE1 /* 'a' -> */, +/* pos 038d: 451 */ 0xF4 /* 't' -> */, +/* pos 038e: 452 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x0393 s 453) */, + 0x00, 0x53 /* - terminal marker 83 - */, +/* pos 0393: 453 */ 0x78 /* 'x' */, 0x07, 0x00 /* (to 0x039A s 454) */, + 0x79 /* 'y' */, 0x06, 0x00 /* (to 0x039C s 455) */, + 0x08, /* fail */ +/* pos 039a: 454 */ 0x00, 0x54 /* - terminal marker 84 - */, +/* pos 039c: 455 */ 0x00, 0x55 /* - terminal marker 85 - */, +/* pos 039e: 456 */ 0xE7 /* 'g' -> */, +/* pos 039f: 457 */ 0xE8 /* 'h' -> */, +/* pos 03a0: 458 */ 0xF4 /* 't' -> */, +/* pos 03a1: 459 */ 0x00, 0x56 /* - terminal marker 86 - */, +/* pos 03a3: 460 */ 0xEC /* 'l' -> */, +/* pos 03a4: 461 */ 0x00, 0x57 /* - terminal marker 87 - */, +/* pos 03a6: 462 */ 0x63 /* 'c' */, 0x22, 0x00 /* (to 0x03C8 s 463) */, + 0x65 /* 'e' */, 0x25, 0x00 /* (to 0x03CE s 468) */, + 0x68 /* 'h' */, 0x38, 0x00 /* (to 0x03E4 s 482) */, + 0x69 /* 'i' */, 0x39, 0x00 /* (to 0x03E8 s 485) */, + 0x6D /* 'm' */, 0x3C, 0x00 /* (to 0x03EE s 490) */, + 0x70 /* 'p' */, 0x4E, 0x00 /* (to 0x0403 s 503) */, + 0x71 /* 'q' */, 0x54, 0x00 /* (to 0x040C s 511) */, + 0x2D /* '-' */, 0x57, 0x00 /* (to 0x0412 s 516) */, + 0x74 /* 't' */, 0x5C, 0x00 /* (to 0x041A s 523) */, + 0x75 /* 'u' */, 0x6C, 0x00 /* (to 0x042D s 534) */, + 0x77 /* 'w' */, 0x76, 0x00 /* (to 0x043A s 539) */, + 0x08, /* fail */ +/* pos 03c8: 463 */ 0xF2 /* 'r' -> */, +/* pos 03c9: 464 */ 0xEF /* 'o' -> */, +/* pos 03ca: 465 */ 0xEC /* 'l' -> */, +/* pos 03cb: 466 */ 0xEC /* 'l' -> */, +/* pos 03cc: 467 */ 0x00, 0x58 /* - terminal marker 88 - */, +/* pos 03ce: 468 */ 0x70 /* 'p' */, 0x07, 0x00 /* (to 0x03D5 s 469) */, + 0x2D /* '-' */, 0x0B, 0x00 /* (to 0x03DC s 475) */, + 0x08, /* fail */ +/* pos 03d5: 469 */ 0xE1 /* 'a' -> */, +/* pos 03d6: 470 */ 0xF2 /* 'r' -> */, +/* pos 03d7: 471 */ 0xE1 /* 'a' -> */, +/* pos 03d8: 472 */ 0xF4 /* 't' -> */, +/* pos 03d9: 473 */ 0xE5 /* 'e' -> */, +/* pos 03da: 474 */ 0x00, 0x59 /* - terminal marker 89 - */, +/* pos 03dc: 475 */ 0xF2 /* 'r' -> */, +/* pos 03dd: 476 */ 0xE5 /* 'e' -> */, +/* pos 03de: 477 */ 0xF3 /* 's' -> */, +/* pos 03df: 478 */ 0xE9 /* 'i' -> */, +/* pos 03e0: 479 */ 0xFA /* 'z' -> */, +/* pos 03e1: 480 */ 0xE5 /* 'e' -> */, +/* pos 03e2: 481 */ 0x00, 0x5A /* - terminal marker 90 - */, +/* pos 03e4: 482 */ 0xEF /* 'o' -> */, +/* pos 03e5: 483 */ 0xF7 /* 'w' -> */, +/* pos 03e6: 484 */ 0x00, 0x5B /* - terminal marker 91 - */, +/* pos 03e8: 485 */ 0xEC /* 'l' -> */, +/* pos 03e9: 486 */ 0xE5 /* 'e' -> */, +/* pos 03ea: 487 */ 0xEE /* 'n' -> */, +/* pos 03eb: 488 */ 0xF4 /* 't' -> */, +/* pos 03ec: 489 */ 0x00, 0x5C /* - terminal marker 92 - */, +/* pos 03ee: 490 */ 0xE1 /* 'a' -> */, +/* pos 03ef: 491 */ 0xEC /* 'l' -> */, +/* pos 03f0: 492 */ 0xEC /* 'l' -> */, +/* pos 03f1: 493 */ 0xAD /* '-' -> */, +/* pos 03f2: 494 */ 0xE3 /* 'c' -> */, +/* pos 03f3: 495 */ 0xE1 /* 'a' -> */, +/* pos 03f4: 496 */ 0xF0 /* 'p' -> */, +/* pos 03f5: 497 */ 0x73 /* 's' */, 0x07, 0x00 /* (to 0x03FC s 498) */, + 0x74 /* 't' */, 0x06, 0x00 /* (to 0x03FE s 499) */, + 0x08, /* fail */ +/* pos 03fc: 498 */ 0x00, 0x5D /* - terminal marker 93 - */, +/* pos 03fe: 499 */ 0xE9 /* 'i' -> */, +/* pos 03ff: 500 */ 0xEF /* 'o' -> */, +/* pos 0400: 501 */ 0xEE /* 'n' -> */, +/* pos 0401: 502 */ 0x00, 0x5E /* - terminal marker 94 - */, +/* pos 0403: 503 */ 0xE5 /* 'e' -> */, +/* pos 0404: 504 */ 0xEC /* 'l' -> */, +/* pos 0405: 505 */ 0xEC /* 'l' -> */, +/* pos 0406: 506 */ 0xAD /* '-' -> */, +/* pos 0407: 507 */ 0xEF /* 'o' -> */, +/* pos 0408: 508 */ 0xF5 /* 'u' -> */, +/* pos 0409: 509 */ 0xF4 /* 't' -> */, +/* pos 040a: 510 */ 0x00, 0x5F /* - terminal marker 95 - */, +/* pos 040c: 511 */ 0xF5 /* 'u' -> */, +/* pos 040d: 512 */ 0xE1 /* 'a' -> */, +/* pos 040e: 513 */ 0xF2 /* 'r' -> */, +/* pos 040f: 514 */ 0xE5 /* 'e' -> */, +/* pos 0410: 515 */ 0x00, 0x60 /* - terminal marker 96 - */, +/* pos 0412: 516 */ 0xF2 /* 'r' -> */, +/* pos 0413: 517 */ 0xE5 /* 'e' -> */, +/* pos 0414: 518 */ 0xF3 /* 's' -> */, +/* pos 0415: 519 */ 0xE9 /* 'i' -> */, +/* pos 0416: 520 */ 0xFA /* 'z' -> */, +/* pos 0417: 521 */ 0xE5 /* 'e' -> */, +/* pos 0418: 522 */ 0x00, 0x61 /* - terminal marker 97 - */, +/* pos 041a: 523 */ 0xE1 /* 'a' -> */, +/* pos 041b: 524 */ 0xF4 /* 't' -> */, +/* pos 041c: 525 */ 0x69 /* 'i' */, 0x07, 0x00 /* (to 0x0423 s 526) */, + 0x75 /* 'u' */, 0x07, 0x00 /* (to 0x0426 s 528) */, + 0x08, /* fail */ +/* pos 0423: 526 */ 0xE3 /* 'c' -> */, +/* pos 0424: 527 */ 0x00, 0x62 /* - terminal marker 98 - */, +/* pos 0426: 528 */ 0xF3 /* 's' -> */, +/* pos 0427: 529 */ 0xAD /* '-' -> */, +/* pos 0428: 530 */ 0xE2 /* 'b' -> */, +/* pos 0429: 531 */ 0xE1 /* 'a' -> */, +/* pos 042a: 532 */ 0xF2 /* 'r' -> */, +/* pos 042b: 533 */ 0x00, 0x63 /* - terminal marker 99 - */, +/* pos 042d: 534 */ 0x62 /* 'b' */, 0x07, 0x00 /* (to 0x0434 s 535) */, + 0x70 /* 'p' */, 0x06, 0x00 /* (to 0x0436 s 536) */, + 0x08, /* fail */ +/* pos 0434: 535 */ 0x00, 0x64 /* - terminal marker 100 - */, +/* pos 0436: 536 */ 0xE5 /* 'e' -> */, +/* pos 0437: 537 */ 0xF2 /* 'r' -> */, +/* pos 0438: 538 */ 0x00, 0x65 /* - terminal marker 101 - */, +/* pos 043a: 539 */ 0xAD /* '-' -> */, +/* pos 043b: 540 */ 0xF2 /* 'r' -> */, +/* pos 043c: 541 */ 0xE5 /* 'e' -> */, +/* pos 043d: 542 */ 0xF3 /* 's' -> */, +/* pos 043e: 543 */ 0xE9 /* 'i' -> */, +/* pos 043f: 544 */ 0xFA /* 'z' -> */, +/* pos 0440: 545 */ 0xE5 /* 'e' -> */, +/* pos 0441: 546 */ 0x00, 0x66 /* - terminal marker 102 - */, +/* pos 0443: 547 */ 0x61 /* 'a' */, 0x0D, 0x00 /* (to 0x0450 s 548) */, + 0x65 /* 'e' */, 0x6C, 0x00 /* (to 0x04B2 s 607) */, + 0x6F /* 'o' */, 0x82, 0x00 /* (to 0x04CB s 620) */, + 0x72 /* 'r' */, 0x82, 0x00 /* (to 0x04CE s 622) */, + 0x08, /* fail */ +/* pos 0450: 548 */ 0xE2 /* 'b' -> */, +/* pos 0451: 549 */ 0xEC /* 'l' -> */, +/* pos 0452: 550 */ 0xE5 /* 'e' -> */, +/* pos 0453: 551 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x0458 s 552) */, + 0x00, 0x67 /* - terminal marker 103 - */, +/* pos 0458: 552 */ 0x63 /* 'c' */, 0x0D, 0x00 /* (to 0x0465 s 553) */, + 0x66 /* 'f' */, 0x2F, 0x00 /* (to 0x048A s 574) */, + 0x68 /* 'h' */, 0x39, 0x00 /* (to 0x0497 s 586) */, + 0x72 /* 'r' */, 0x43, 0x00 /* (to 0x04A4 s 598) */, + 0x08, /* fail */ +/* pos 0465: 553 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x046F s 554) */, + 0x65 /* 'e' */, 0x0E, 0x00 /* (to 0x0476 s 560) */, + 0x6F /* 'o' */, 0x0F, 0x00 /* (to 0x047A s 563) */, + 0x08, /* fail */ +/* pos 046f: 554 */ 0xF0 /* 'p' -> */, +/* pos 0470: 555 */ 0xF4 /* 't' -> */, +/* pos 0471: 556 */ 0xE9 /* 'i' -> */, +/* pos 0472: 557 */ 0xEF /* 'o' -> */, +/* pos 0473: 558 */ 0xEE /* 'n' -> */, +/* pos 0474: 559 */ 0x00, 0x68 /* - terminal marker 104 - */, +/* pos 0476: 560 */ 0xEC /* 'l' -> */, +/* pos 0477: 561 */ 0xEC /* 'l' -> */, +/* pos 0478: 562 */ 0x00, 0x69 /* - terminal marker 105 - */, +/* pos 047a: 563 */ 0xEC /* 'l' -> */, +/* pos 047b: 564 */ 0xF5 /* 'u' -> */, +/* pos 047c: 565 */ 0xED /* 'm' -> */, +/* pos 047d: 566 */ 0xEE /* 'n' -> */, +/* pos 047e: 567 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x0483 s 568) */, + 0x00, 0x6A /* - terminal marker 106 - */, +/* pos 0483: 568 */ 0xE7 /* 'g' -> */, +/* pos 0484: 569 */ 0xF2 /* 'r' -> */, +/* pos 0485: 570 */ 0xEF /* 'o' -> */, +/* pos 0486: 571 */ 0xF5 /* 'u' -> */, +/* pos 0487: 572 */ 0xF0 /* 'p' -> */, +/* pos 0488: 573 */ 0x00, 0x6B /* - terminal marker 107 - */, +/* pos 048a: 574 */ 0xEF /* 'o' -> */, +/* pos 048b: 575 */ 0xEF /* 'o' -> */, +/* pos 048c: 576 */ 0xF4 /* 't' -> */, +/* pos 048d: 577 */ 0xE5 /* 'e' -> */, +/* pos 048e: 578 */ 0xF2 /* 'r' -> */, +/* pos 048f: 579 */ 0xAD /* '-' -> */, +/* pos 0490: 580 */ 0xE7 /* 'g' -> */, +/* pos 0491: 581 */ 0xF2 /* 'r' -> */, +/* pos 0492: 582 */ 0xEF /* 'o' -> */, +/* pos 0493: 583 */ 0xF5 /* 'u' -> */, +/* pos 0494: 584 */ 0xF0 /* 'p' -> */, +/* pos 0495: 585 */ 0x00, 0x6C /* - terminal marker 108 - */, +/* pos 0497: 586 */ 0xE5 /* 'e' -> */, +/* pos 0498: 587 */ 0xE1 /* 'a' -> */, +/* pos 0499: 588 */ 0xE4 /* 'd' -> */, +/* pos 049a: 589 */ 0xE5 /* 'e' -> */, +/* pos 049b: 590 */ 0xF2 /* 'r' -> */, +/* pos 049c: 591 */ 0xAD /* '-' -> */, +/* pos 049d: 592 */ 0xE7 /* 'g' -> */, +/* pos 049e: 593 */ 0xF2 /* 'r' -> */, +/* pos 049f: 594 */ 0xEF /* 'o' -> */, +/* pos 04a0: 595 */ 0xF5 /* 'u' -> */, +/* pos 04a1: 596 */ 0xF0 /* 'p' -> */, +/* pos 04a2: 597 */ 0x00, 0x6D /* - terminal marker 109 - */, +/* pos 04a4: 598 */ 0xEF /* 'o' -> */, +/* pos 04a5: 599 */ 0xF7 /* 'w' -> */, +/* pos 04a6: 600 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x04AB s 601) */, + 0x00, 0x6E /* - terminal marker 110 - */, +/* pos 04ab: 601 */ 0xE7 /* 'g' -> */, +/* pos 04ac: 602 */ 0xF2 /* 'r' -> */, +/* pos 04ad: 603 */ 0xEF /* 'o' -> */, +/* pos 04ae: 604 */ 0xF5 /* 'u' -> */, +/* pos 04af: 605 */ 0xF0 /* 'p' -> */, +/* pos 04b0: 606 */ 0x00, 0x6F /* - terminal marker 111 - */, +/* pos 04b2: 607 */ 0xF8 /* 'x' -> */, +/* pos 04b3: 608 */ 0xF4 /* 't' -> */, +/* pos 04b4: 609 */ 0x2D /* '-' */, 0x05, 0x00 /* (to 0x04B9 s 610) */, + 0x00, 0x72 /* - terminal marker 114 - */, +/* pos 04b9: 610 */ 0x62 /* 'b' */, 0x07, 0x00 /* (to 0x04C0 s 611) */, + 0x74 /* 't' */, 0x0B, 0x00 /* (to 0x04C7 s 617) */, + 0x08, /* fail */ +/* pos 04c0: 611 */ 0xEF /* 'o' -> */, +/* pos 04c1: 612 */ 0xF4 /* 't' -> */, +/* pos 04c2: 613 */ 0xF4 /* 't' -> */, +/* pos 04c3: 614 */ 0xEF /* 'o' -> */, +/* pos 04c4: 615 */ 0xED /* 'm' -> */, +/* pos 04c5: 616 */ 0x00, 0x70 /* - terminal marker 112 - */, +/* pos 04c7: 617 */ 0xEF /* 'o' -> */, +/* pos 04c8: 618 */ 0xF0 /* 'p' -> */, +/* pos 04c9: 619 */ 0x00, 0x71 /* - terminal marker 113 - */, +/* pos 04cb: 620 */ 0xF0 /* 'p' -> */, +/* pos 04cc: 621 */ 0x00, 0x73 /* - terminal marker 115 - */, +/* pos 04ce: 622 */ 0xE1 /* 'a' -> */, +/* pos 04cf: 623 */ 0xEE /* 'n' -> */, +/* pos 04d0: 624 */ 0xF3 /* 's' -> */, +/* pos 04d1: 625 */ 0xF0 /* 'p' -> */, +/* pos 04d2: 626 */ 0xE1 /* 'a' -> */, +/* pos 04d3: 627 */ 0xF2 /* 'r' -> */, +/* pos 04d4: 628 */ 0xE5 /* 'e' -> */, +/* pos 04d5: 629 */ 0xEE /* 'n' -> */, +/* pos 04d6: 630 */ 0xF4 /* 't' -> */, +/* pos 04d7: 631 */ 0x00, 0x74 /* - terminal marker 116 - */, +/* pos 04d9: 632 */ 0x6E /* 'n' */, 0x07, 0x00 /* (to 0x04E0 s 633) */, + 0x70 /* 'p' */, 0x0D, 0x00 /* (to 0x04E9 s 641) */, + 0x08, /* fail */ +/* pos 04e0: 633 */ 0xE4 /* 'd' -> */, +/* pos 04e1: 634 */ 0xE5 /* 'e' -> */, +/* pos 04e2: 635 */ 0xF2 /* 'r' -> */, +/* pos 04e3: 636 */ 0xEC /* 'l' -> */, +/* pos 04e4: 637 */ 0xE9 /* 'i' -> */, +/* pos 04e5: 638 */ 0xEE /* 'n' -> */, +/* pos 04e6: 639 */ 0xE5 /* 'e' -> */, +/* pos 04e7: 640 */ 0x00, 0x75 /* - terminal marker 117 - */, +/* pos 04e9: 641 */ 0xF0 /* 'p' -> */, +/* pos 04ea: 642 */ 0xE5 /* 'e' -> */, +/* pos 04eb: 643 */ 0xF2 /* 'r' -> */, +/* pos 04ec: 644 */ 0x2D /* '-' */, 0x07, 0x00 /* (to 0x04F3 s 645) */, + 0x63 /* 'c' */, 0x14, 0x00 /* (to 0x0503 s 651) */, + 0x08, /* fail */ +/* pos 04f3: 645 */ 0x61 /* 'a' */, 0x0A, 0x00 /* (to 0x04FD s 646) */, + 0x6C /* 'l' */, 0x12, 0x00 /* (to 0x0508 s 655) */, + 0x72 /* 'r' */, 0x15, 0x00 /* (to 0x050E s 660) */, + 0x08, /* fail */ +/* pos 04fd: 646 */ 0xEC /* 'l' -> */, +/* pos 04fe: 647 */ 0xF0 /* 'p' -> */, +/* pos 04ff: 648 */ 0xE8 /* 'h' -> */, +/* pos 0500: 649 */ 0xE1 /* 'a' -> */, +/* pos 0501: 650 */ 0x00, 0x76 /* - terminal marker 118 - */, +/* pos 0503: 651 */ 0xE1 /* 'a' -> */, +/* pos 0504: 652 */ 0xF3 /* 's' -> */, +/* pos 0505: 653 */ 0xE5 /* 'e' -> */, +/* pos 0506: 654 */ 0x00, 0x77 /* - terminal marker 119 - */, +/* pos 0508: 655 */ 0xE1 /* 'a' -> */, +/* pos 0509: 656 */ 0xF4 /* 't' -> */, +/* pos 050a: 657 */ 0xE9 /* 'i' -> */, +/* pos 050b: 658 */ 0xEE /* 'n' -> */, +/* pos 050c: 659 */ 0x00, 0x78 /* - terminal marker 120 - */, +/* pos 050e: 660 */ 0xEF /* 'o' -> */, +/* pos 050f: 661 */ 0xED /* 'm' -> */, +/* pos 0510: 662 */ 0xE1 /* 'a' -> */, +/* pos 0511: 663 */ 0xEE /* 'n' -> */, +/* pos 0512: 664 */ 0x00, 0x79 /* - terminal marker 121 - */, +/* pos 0514: 665 */ 0xE9 /* 'i' -> */, +/* pos 0515: 666 */ 0xF3 /* 's' -> */, +/* pos 0516: 667 */ 0xE9 /* 'i' -> */, +/* pos 0517: 668 */ 0xE2 /* 'b' -> */, +/* pos 0518: 669 */ 0xEC /* 'l' -> */, +/* pos 0519: 670 */ 0xE5 /* 'e' -> */, +/* pos 051a: 671 */ 0x00, 0x7A /* - terminal marker 122 - */, +/* pos 051c: 672 */ 0x61 /* 'a' */, 0x07, 0x00 /* (to 0x0523 s 673) */, + 0x2D /* '-' */, 0x08, 0x00 /* (to 0x0527 s 676) */, + 0x08, /* fail */ +/* pos 0523: 673 */ 0xE9 /* 'i' -> */, +/* pos 0524: 674 */ 0xF4 /* 't' -> */, +/* pos 0525: 675 */ 0x00, 0x7B /* - terminal marker 123 - */, +/* pos 0527: 676 */ 0xF2 /* 'r' -> */, +/* pos 0528: 677 */ 0xE5 /* 'e' -> */, +/* pos 0529: 678 */ 0xF3 /* 's' -> */, +/* pos 052a: 679 */ 0xE9 /* 'i' -> */, +/* pos 052b: 680 */ 0xFA /* 'z' -> */, +/* pos 052c: 681 */ 0xE5 /* 'e' -> */, +/* pos 052d: 682 */ 0x00, 0x7C /* - terminal marker 124 - */, +/* total size 1327 bytes */ diff --git a/lib/misc/dlo/dlo.c b/lib/misc/dlo/dlo.c index 6d113fdfc..a310a5c3a 100644 --- a/lib/misc/dlo/dlo.c +++ b/lib/misc/dlo/dlo.c @@ -534,8 +534,8 @@ lws_display_render_dump_ids(lws_dll2_owner_t *ids) lwsl_notice(" id: '%s' (not present)\n", id->id); else lwsl_notice(" id: '%s', (%d,%d), %dx%d\n", id->id, - id->box.x.whole, id->box.y.whole, - id->box.w.whole, id->box.h.whole); + (int)id->box.x.whole, (int)id->box.y.whole, + (int)id->box.w.whole, (int)id->box.h.whole); } lws_end_foreach_dll(d); } diff --git a/lib/misc/lhp-ss.c b/lib/misc/lhp-ss.c new file mode 100644 index 000000000..27c30a37b --- /dev/null +++ b/lib/misc/lhp-ss.c @@ -0,0 +1,241 @@ +/* + * libwebsockets - small server side websockets and web server implementation + * + * Copyright (C) 2010 - 2022 Andy Green + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * SS bindings for html5 parser + */ + +#include + +LWS_SS_USER_TYPEDEF + lws_flow_t flow; + lhp_ctx_t lhp; /* html ss owns html parser */ + lws_dl_rend_t drt; + lws_sorted_usec_list_t sul; + lws_display_render_state_t *rs; + struct lws_context *cx; +} htmlss_t; + +static void +lws_lhp_ss_html_parse(lws_sorted_usec_list_t *sul) +{ + htmlss_t *m = lws_container_of(sul, htmlss_t, sul); + lws_stateful_ret_t r; + size_t zero = 0; + + do { + if (lws_flow_feed(&m->flow)) { + lwsl_notice("%s: returning from flow_feed\n", __func__); + return; + } + + // lwsl_notice("%s: html_parse in len %d\n", __func__, (int)m->flow.len); + + /* creates display list objects from html */ + r = lws_lhp_parse(&m->lhp, (const uint8_t **)&m->flow.data, + (size_t *)&m->flow.len); + + lws_flow_req(&m->flow); + + if ((r & LWS_SRET_WANT_INPUT) && !m->flow.len && !m->lhp.await_css_done) { + if (m->flow.state == LWSDLOFLOW_STATE_READ) { + lwsl_warn("%s: returning to await more input\n", __func__); + return; + } + lwsl_warn("%s: inferring we are finished\n", __func__); + break; + } + + if (r & LWS_SRET_AWAIT_RETRY) { + if (!m->lhp.await_css_done) + lws_sul_schedule(m->cx, 0, &m->sul, lws_lhp_ss_html_parse, 1); + + return; + } + + if (r & (LWS_SRET_NO_FURTHER_OUT | LWS_SRET_FATAL)) { + lwsl_warn("%s: r 0x%x\n", __func__, r); + break; + } + } while (1); + + /* Finalize the html parse and clean up */ + + lwsl_notice("%s: DESTROYING the lhp\n", __func__); + + m->lhp.flags = LHP_FLAG_DOCUMENT_END; + lws_lhp_parse(&m->lhp, (const uint8_t **)NULL, &zero); + lws_lhp_destruct(&m->lhp); + m->rs->html = 2; /* html completed.. rs outlives the html ss and priv */ + + lws_display_dl_dump(m->drt.dl); + + /* schedule starting the render */ + + lws_sul_schedule(m->cx, 0, &m->rs->sul, m->lhp.ssevcb, 1); + lws_ss_destroy(&m->ss); +} + +void +lws_lhp_ss_html_parse_from_lhp(lhp_ctx_t *lhp) +{ + htmlss_t *m = lws_container_of(lhp, htmlss_t, lhp); + + lws_lhp_ss_html_parse(&m->sul); +} + +/* secure streams payload interface */ + +static lws_ss_state_return_t +htmlss_rx(void *userobj, const uint8_t *buf, size_t len, int flags) +{ + htmlss_t *m = (htmlss_t *)userobj; + lws_ss_state_return_t r = LWSSSSRET_OK; + + if (len && + lws_buflist_append_segment(&m->flow.bl, buf, len) < 0) + return LWSSSSRET_DISCONNECT_ME; + + lwsl_notice("%s: buflen size %d\n", __func__, + (int)lws_buflist_total_len(&m->flow.bl)); + + if (flags & LWSSS_FLAG_EOM) { + m->flow.state = LWSDLOFLOW_STATE_READ_COMPLETED; + r = LWSSSSRET_DISCONNECT_ME; + } + + lws_sul_schedule(m->cx, 0, &m->sul, lws_lhp_ss_html_parse, 1); + + return r; +} + +static lws_ss_state_return_t +htmlss_state(void *userobj, void *sh, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + htmlss_t *m = (htmlss_t *)userobj; + + switch (state) { + case LWSSSCS_CREATING: + break; + + case LWSSSCS_DISCONNECTED: + m->flow.state = LWSDLOFLOW_STATE_READ_COMPLETED; + m->flow.h = NULL; + break; + + case LWSSSCS_DESTROYING: + lws_lhp_destruct(&m->lhp); + lws_buflist_destroy_all_segments(&m->flow.bl); + m->drt.dl = NULL; + break; + + default: + break; + } + + return LWSSSSRET_OK; +} + +static LWS_SS_INFO("__default", htmlss_t) + .rx = htmlss_rx, + .state = htmlss_state, + .manual_initial_tx_credit = 1024 +}; + +/* prep rs->displaylist, rs->ic */ + +int +lws_lhp_ss_browse(struct lws_context *cx, lws_display_render_state_t *rs, + const char *url, sul_cb_t render) +{ + struct lws_ss_handle *h = NULL; + lws_ss_info_t ssi; + int32_t w = 64 * 1024; + htmlss_t *m; + + /* fetch via SS */ +#if defined(LWS_PLAT_BAREMETAL) || defined(LWS_PLAT_FREERTOS) + w = 4096; +#endif + + ssi = ssi_htmlss_t; + ssi.manual_initial_tx_credit = w; + + if (lws_ss_create(cx, 0, &ssi, NULL, &h, NULL, NULL)) { + lwsl_err("%s: ss create failed\n", __func__); + return 1; /* failed */ + } + + m = (htmlss_t *)lws_ss_to_user_object(h); + m->cx = cx; + m->flow.h = h; + m->flow.window = w; + + m->drt.dl = &rs->displaylist; + m->drt.w = rs->ic->wh_px[0].whole; + m->drt.h = rs->ic->wh_px[1].whole; + + m->rs = rs; + m->rs->html = 1; /* render must wait for html to complete */ + + if (lws_lhp_construct(&m->lhp, lhp_displaylist_layout, &m->drt, rs->ic)) { + lwsl_err("%s: lhp create %s failed\n", __func__, url); + goto bail1; + } + + m->lhp.user1 = cx; + m->lhp.base_url = strdup(url); + m->lhp.ssevcb = render; + m->lhp.ssevsul = &rs->sul; + m->lhp.sshtmlevcb = lws_lhp_ss_html_parse; + m->lhp.sshtmlevsul = &m->sul; + m->lhp.ids = &rs->ids; + + if (lws_ss_set_metadata(m->ss, "endpoint", url, strlen(url))) { + lwsl_err("%s: failed to use metadata %s\n", __func__, url); + goto bail2; + } + + if (lws_ss_set_metadata(m->ss, "ua", "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", 76)) { + lwsl_err("%s: failed to use metadata ua\n", __func__); + goto bail2; + } + + if (lws_ss_set_metadata(m->ss, "acc", "text/html,image/jpeg,image/png,", 30)) { + lwsl_err("%s: failed to use metadata ua\n", __func__); + goto bail2; + } + + if (lws_ss_client_connect(m->ss)) + goto bail2; + + return 0; + +bail2: + lws_lhp_destruct(&m->lhp); + +bail1: + lws_ss_destroy(&h); + + return 1; +} diff --git a/lib/misc/lhp.c b/lib/misc/lhp.c new file mode 100644 index 000000000..59a227d84 --- /dev/null +++ b/lib/misc/lhp.c @@ -0,0 +1,2146 @@ +/* + * libwebsockets - small server side websockets and web server implementation + * + * Copyright (C) 2010 - 2022 Andy Green + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Stream parser for HTML 5 + * https://w3c.github.io/html-reference/syntax.html + * + */ + +#include + +#define FAIL_CHAR 0x08 +static uint8_t css_lextable[] = { /* the css property names */ + #include "css-lextable.h" +}; + +static uint8_t css_propconst_lextable[] = { /* the css property values */ + #include "css-propconst-lextable.h" +}; + +#define LHP_AC_GRANULE 512 + +enum { + /* html */ + + LHPS_INIT, /* default css injection */ + + LHPS_OUTER, + LHPS_TAG, + LHPS_BAD_TAG, + LHPS_DO_START_ELEM, + LHPS_ATTRIB, + LHPS_ATTRIB_VAL, + LHPS_AMP, + LHPS_AMPHASH, + LHPS_AMPHASH_HEX, + LHPS_SCOMMENT1, + LHPS_SCOMMENT2, + LHPS_COMMENT, + LHPS_ECOMMENT1, + LHPS_ECOMMENT2, + + /* css */ + + LCSPS_CSS_OUTER, + LCSPS_CCOM_S1, + LCSPS_CCOM_E1, + LCSPS_CCOM, + LCSPS_CSS_OUTER_TAG1, + LCSPS_CSS_NAMES, + LCSPS_CSS_DEF_NAME, + LCSPS_CSS_DEF_VALUE, + LCSPS_SCOMMENT1, + LCSPS_SCOMMENT2, + LCSPS_COMMENT, + LCSPS_ECOMMENT1, + LCSPS_ECOMMENT2, + + LCSPS_CSS_STANZA, +}; + +/* + * 17 well-known colours specified by CSS 2.1 + * https://www.w3.org/TR/CSS21/syndata.html#value-def-color + */ + +#if 0 +static struct cols { + const char * const name; + uint32_t rgba; +} cols[] = { + { "maroon", LWSDC_RGBA(0x80, 0x00, 0x00, 255) }, + { "red", LWSDC_RGBA(0xff, 0x00, 0x00, 255) }, + { "orange", LWSDC_RGBA(0xff, 0xa5, 0x00, 255) }, + { "yellow", LWSDC_RGBA(0xff, 0xff, 0x00, 255) }, + { "olive", LWSDC_RGBA(0x80, 0x80, 0x00, 255) }, + { "purple", LWSDC_RGBA(0x80, 0x00, 0x80, 255) }, + { "fuchsia", LWSDC_RGBA(0xff, 0x00, 0xff, 255) }, + { "white", LWSDC_RGBA(0xff, 0xff, 0xff, 255) }, + { "lime", LWSDC_RGBA(0x00, 0xff, 0x00, 255) }, + { "green", LWSDC_RGBA(0x00, 0x80, 0x00, 255) }, + { "navy", LWSDC_RGBA(0x00, 0x00, 0x80, 255) }, + { "blue", LWSDC_RGBA(0x00, 0x00, 0xff, 255) }, + { "aqua", LWSDC_RGBA(0x00, 0xff, 0xff, 255) }, + { "teal", LWSDC_RGBA(0x00, 0x80, 0x80, 255) }, + { "black", LWSDC_RGBA(0x00, 0x00, 0x00, 255) }, + { "silver", LWSDC_RGBA(0xc0, 0xc0, 0xc0, 255) }, + { "gray", LWSDC_RGBA(0x80, 0x80, 0x80, 255) }, +}; +#endif + +/* + * "void elements" are html elements that don't have a scope, and so don't + * have a scope closure + */ +static const char * const void_elems[] = { + "area", "base", "br", "col", "command", "embed", "hr", "img", + "input", "keygen", "link", "meta", "param", "source", "track", "wbr" +}; +static const uint8_t void_elems_lens[] = /* lengths for the table above */ + { 4, 4, 2, 3, 7, 5, 2, 3, 5, 6, 4, 4, 5, 6, 5, 3 }; + +static const char *const default_css = + "/* lws_lhp default css */" + "html, address,blockquote, dd, div,dl, dt, fieldset, form, frame, " + "frameset, h1, h2, h3, h4, h5, h6, noframes, ol, p, ul, center, " + "dir, hr, menu, pre { top: 0px; right: 0px; bottom: 0px; left: 0px;" + " unicode-bidi: embed; color: #000;" + "padding-top: 2px; padding-left: 2px; padding-bottom: 2px; padding-right: 2px;" + "margin-top: 2px; margin-left: 2px; margin-bottom: 2px; margin-right: 2px;" + "position: static; width: auto; height: auto;" + "}\n" + "div { display: block; width: auto; }\n" + "body { display: block}\n" + "li { display: list-item }\n" + "head { display: none }\n" + "table { display: table; }\n" + "tr { display: table-row }\n" + "thead { display: table-header-group }\n" + "tbody { display: table-row-group }\n" + "tfoot { display: table-footer-group }\n" + "col { display: table-column }\n" + "colgroup { display: table-column-group }\n" + "td, th { display: table-cell }\n" + "caption { display: table-caption }\n" + "th { font-weight: bolder; text-align: center }\n" + "caption { text-align: center }\n" + "body { margin: 8px }\n" + "h1 { font-size: 2em; margin: .67em 0 }\n" + "h2 { font-size: 1.5em; margin: .75em 0 }\n" + "h3 { font-size: 1.17em; margin: .83em 0 }\n" + "h4, p, blockquote, ul, fieldset, form, ol, dl, dir, menu " + "{ margin: 1.12em 0 }\n" + "h5 { font-size: .83em; margin: 1.5em 0 }\n" + "h6 { font-size: .75em; margin: 1.67em 0 }\n" + "h1, h2, h3, h4, h5, h6, b, strong { font-weight: bolder }\n" + "blockquote { margin-left: 40px; margin-right: 40px }\n" + "i, cite, em, var, address { font-style: italic }\n" + " pre, tt, code, kbd, samp { font-family: monospace }\n" + "pre { white-space: pre }\n" + "button, textarea, input, select { display: inline-block }\n" + "big { font-size: 1.17em }\n" + "small, sub, sup { font-size: .83em }\n" + "sub { vertical-align: sub }\n" + "sup { vertical-align: super }\n" + "table { border-spacing: 2px; padding-top: 2px; padding-left: 2px; padding-bottom: 2px; padding-right: 2px; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px }\n" + "thead, tbody, tfoot { vertical-align: middle }\n" + "td, th, tr { vertical-align: inherit; width: auto; padding-top: 2px; padding-left: 2px; padding-bottom: 2px; padding-right: 2px; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px }\n" + "s, strike, del { text-decoration: line-through }\n" + "hr { border: 1px inset }\n" + "ol, ul, dir, menu, dd { margin-left: 40px }\n" + "ol { list-style-type: decimal }\n" + "ol ul, ul ol, ul ul, ol ol { margin-top: 0; margin-bottom: 0 }\n" + "u, ins { text-decoration: underline }\n" + "br:before { content: \"A\"; white-space: pre-line }\n" + "center { text-align: center }\n" + ":link, :visited { text-decoration: underline }\n" + ":focus { outline: thin dotted invert }\n" + + "BDO[DIR=\"ltr\"] { direction: ltr; unicode-bidi: bidi-override }" + "BDO[DIR=\"rtl\"] { direction: rtl; unicode-bidi: bidi-override }" + + "*[DIR=\"ltr\"] { direction: ltr; unicode-bidi: embed }" + "*[DIR=\"rtl\"] { direction: rtl; unicode-bidi: embed }" + + "@media print {" + " h1 { page-break-before: always }\n" + " h1, h2, h3, h4, h5, h6 { page-break-after: avoid }\n" + " ul, ol, dl { page-break-before: avoid }\n" + "}\n" +; + + + +static int +lhp_clean_atr(lws_dll2_t *d, void *user) +{ + lhp_atr_t *atr = lws_container_of(d, lhp_atr_t, list); + + lws_dll2_remove(d); + lws_free(atr); + + return 0; +} + +static void +lhp_clean_level(lhp_pstack_t *ps) +{ + lws_dll2_foreach_safe(&ps->atr, NULL, lhp_clean_atr); + lws_dll2_remove(&ps->list); + + lws_free(ps); +} + +int +lws_lhp_construct(lhp_ctx_t *ctx, lhp_callback cb, void *user, + const lws_surface_info_t *ic) +{ + lhp_pstack_t *ps = lws_zalloc(sizeof(*ps), __func__); + + if (!ps) + return 1; + + memset(ctx, 0, sizeof(*ctx) - sizeof(ctx->buf)); + ctx->user = user; + ctx->ic = *ic; + + /* + * these are done implicitly by the memset above + * ctx->state = LHPS_INIT; + * ctx->sp = 0; + */ + + ps->cb = cb; + lws_dll2_add_tail(&ps->list, &ctx->stack); + + return 0; +} + +static int +lhp_clean_stack(lws_dll2_t *d, void *user) +{ + lhp_pstack_t *ps = lws_container_of(d, lhp_pstack_t, list); + + lhp_clean_level(ps); + return 0; +} + +static const lws_fx_t c_254= { 2,54000000 }, c_10 = { 10,0 }, + c_72 = { 72,0 }, c_6 = { 6,0 }, c_100 = { 100,0 }; + +/* + * We need to go backward until we reach an absolute length for the reference + * axis, then base off that and go forward applying relative operations (like %) + * on it in order. + */ + +static int +lws_css_compute_cascaded_length(lhp_ctx_t *ctx, int ref, lhp_pstack_t *ps, + lws_fx_t *t1) +{ + lhp_pstack_t *psb = ps, *psmap[20]; + const struct lcsp_atr *atrmap[20]; + lws_fx_t t2; + int amp = 0; + + do { + const struct lcsp_atr *a; + + psb = lws_css_get_parent_block(ctx, psb); + if (!psb) + break; + + a = (ref == LWS_LHPREF_WIDTH) ? psb->css_width : psb->css_height; + if (!a) + /* skip levels that don't change it */ + continue; + + if (amp + 1 == LWS_ARRAY_SIZE(atrmap)) + /* uhh... */ + break; + + psmap[amp] = psb; + atrmap[amp++] = a; + + if (a->unit == LCSP_UNIT_LENGTH_PERCENT || + a->unit == LCSP_UNIT_ANGLE_REL_DEG || + a->unit == LCSP_UNIT_NONE) + /* need earlier info to compute... keep going back */ + continue; + + break; + } while (1); + + /* + * We have the path back through the elements to the first + * absolute one + */ + + while (amp-- > 0) { + if (atrmap[amp]->unit != LCSP_UNIT_LENGTH_PERCENT) { + *t1 = *lws_csp_px(atrmap[amp], psmap[amp]); + } else + if (amp) + lws_fx_div(t1, + lws_fx_mul(&t2, &atrmap[amp]->u.i, t1), + &c_100); + } + + return 0; +} + +const lws_fx_t * +lws_csp_px(const lcsp_atr_t *a, lhp_pstack_t *ps) +{ + lhp_ctx_t *ctx = lws_container_of(ps->list.owner, lhp_ctx_t, stack); + const lws_display_font_t *f = ps->font; + lws_fx_t t1, t2, t3; + int ref; + + if (!a) + return NULL; + + ref = lhp_prop_axis(a); + + switch (a->unit) { + case LCSP_UNIT_LENGTH_EM: + return lws_fx_mul((lws_fx_t *)&a->r, &a->u.i, &f->em); + + case LCSP_UNIT_LENGTH_EX: + return lws_fx_mul((lws_fx_t *)&a->r, &a->u.i, &f->ex); + + case LCSP_UNIT_LENGTH_IN: /* (inches * 2.54 * hwmm) / hwpx */ + if (ref == LWS_LHPREF_NONE) + break; + return lws_fx_div((lws_fx_t *)&a->r, lws_fx_mul(&t2, + lws_fx_mul(&t3, &a->u.i, &c_254), + &ctx->ic.wh_mm[ref]), &ctx->ic.wh_px[ref]); + + case LCSP_UNIT_LENGTH_CM: /* (cm * 10 * hwmm) / hwpx */ + if (ref == LWS_LHPREF_NONE) + break; + return lws_fx_div((lws_fx_t *)&a->r, + lws_fx_mul(&t2, + lws_fx_mul(&t3, &a->u.i, &c_10), + &ctx->ic.wh_mm[ref]), &ctx->ic.wh_px[ref]); + case LCSP_UNIT_LENGTH_MM: /* (mm * hwmm) / hwpx */ + if (ref == LWS_LHPREF_NONE) + break; + return lws_fx_div((lws_fx_t *)&a->r, lws_fx_mul(&t2, + &a->u.i, &ctx->ic.wh_mm[ref]), &ctx->ic.wh_px[ref]); + + case LCSP_UNIT_LENGTH_PT: /* ((pt * 2.54 * hwmm) / hwpx ) / 72 */ + if (ref == LWS_LHPREF_NONE) + break; + return lws_fx_div((lws_fx_t *)&a->r, lws_fx_div(&t1, + lws_fx_mul(&t2, lws_fx_mul(&t3, + &a->u.i, &c_254), + &ctx->ic.wh_mm[ref]), + &ctx->ic.wh_px[ref]), &c_72); + + case LCSP_UNIT_LENGTH_PC: /* ((pc * 2.54 * hwmm) / hwpx ) / 6 */ + if (ref == LWS_LHPREF_NONE) + break; + return lws_fx_div((lws_fx_t *)&a->r, lws_fx_div(&t1, + lws_fx_mul(&t2, lws_fx_mul(&t3, + &a->u.i, &c_254), &ctx->ic.wh_mm[ref]), + &ctx->ic.wh_px[ref]), &c_6); + case LCSP_UNIT_LENGTH_PX: /* px */ + return &a->u.i; + + case LCSP_UNIT_LENGTH_PERCENT: /* (percent * psb->w) / 100 */ + if (ref == LWS_LHPREF_NONE) + break; + + t1.whole = 0; + t1.frac = 0; + + lws_css_compute_cascaded_length(ctx, ref, ps, &t1); + + return lws_fx_div((lws_fx_t *)&a->r, + lws_fx_mul(&t2, &a->u.i, &t1), &c_100); + + default: + break; + } + + return &a->u.i; +} + +static lhp_atr_t * +lhp_atr_new(lhp_ctx_t *ctx, size_t name_len, size_t value_len) +{ + lhp_pstack_t *ps = lws_container_of(ctx->stack.tail, lhp_pstack_t, list); + + /* create the element name attribute */ + lhp_atr_t *a = lws_malloc(sizeof(*a) + name_len + 1 + value_len + 1, + "html_elem_atr"); + size_t n; + + if (!a) + return NULL; + + if (!ps->atr.count) { + /* only check the tag string, not the attributes */ + ctx->u.f.void_element = 0; + + /* + * mark ps that are elements that contain others for layout as + * being the parent block + */ + if ((name_len == 4 && !strncmp(ctx->buf, "body", 4)) || + (name_len == 3 && !strncmp(ctx->buf, "div", 3))) + ps->is_block = 1; + + for (n = 0; n < LWS_ARRAY_SIZE(void_elems); n++) + if (ctx->npos == void_elems_lens[n] && + !strncmp(void_elems[n], ctx->buf, (size_t)ctx->npos)) + ctx->u.f.void_element = 1; + } + + lws_dll2_clear(&a->list); + a->name_len = name_len; + a->value_len = value_len; + ctx->buf[ctx->npos] = '\0'; + memcpy(&a[1], ctx->buf, (unsigned int)ctx->npos + 1u); + *(((uint8_t *)&a[1]) + name_len) = '\0'; + lws_dll2_add_tail(&a->list, &ps->atr); + + ctx->npos = 0; + + return a; +} + +static int +hspace(uint8_t c) +{ + return c == ' ' || c == 9 || c == 10 || c == 12 || c == 13; +} + +void +lhp_uni_emit(lhp_ctx_t *ctx) +{ + /* emit */ + if (ctx->temp <= 0x7f) { + ctx->buf[ctx->npos++] = (char)(ctx->temp & 0x7f); + return; + } + if (ctx->temp <= 0x7ff) { + ctx->buf[ctx->npos++] = (char)(0xc0 | ((uint8_t)(ctx->temp >> 6) & 0x1f)); + goto a; + } + if (ctx->temp <= 0xffff) { + ctx->buf[ctx->npos++] = (char)(0xe0 | ((uint8_t)(ctx->temp >> 12) & 0xf)); + goto b; + } + if (ctx->temp <= 0x10ffff) { + ctx->buf[ctx->npos++] = (char)(0xf0 | ((uint8_t)(ctx->temp >> 18) & 7)); + ctx->buf[ctx->npos++] = (char)(0x80 | ((uint8_t)(ctx->temp >> 12) & 0x3f)); + } +b: + ctx->buf[ctx->npos++] = (char)(0x80 | ((uint8_t)(ctx->temp >> 6) & 0x3f)); +a: + ctx->buf[ctx->npos++] = (char)(0x80 | ((uint8_t)(ctx->temp) & 0x3f)); +} + +static int +lcsp_append_cssval_int(lhp_ctx_t *ctx) +{ + lcsp_atr_t *atr = lwsac_use_zero(&ctx->cssac, sizeof(*atr), LHP_AC_GRANULE); + if (!atr) + return 1; + + /* add this prop value atr to the def */ + + //lwsl_err("%s: tf %d.%u\n", __func__, ctx->tf.whole, ctx->tf.frac); + atr->u.i = ctx->tf; + atr->unit = ctx->unit; + + lws_dll2_add_tail(&atr->list, &ctx->def->atrs); + + return 0; +} + +static int +lcsp_append_cssval_color(lhp_ctx_t *ctx) +{ + lcsp_atr_t *atr = lwsac_use_zero(&ctx->cssac, sizeof(*atr), LHP_AC_GRANULE); + unsigned int r, g, b, a = 0xff; + + if (!atr) + return 1; + + /* add this prop value atr to the def */ + + switch (ctx->temp_count) { + case 3: + r = (ctx->temp >> 8) & 0xf; + g = (ctx->temp >> 4) & 0xf; + b = ctx->temp & 0xf; + atr->u.rgba = (a << 24) | (b << 20) | (b << 16) | + (g << 12) | (g << 8) | (r << 4) | r; + break; + case 4: + r = (ctx->temp >> 12) & 0xf; + g = (ctx->temp >> 8) & 0xf; + b = (ctx->temp >> 4) & 0xf; + a = ctx->temp & 0xf; + atr->u.rgba = (a << 28) | (a << 24) | (b << 20) | (b << 16) | + (g << 12) | (g << 8) | (r << 4) | r; + break; + case 6: + r = (ctx->temp >> 16) & 0xff; + g = (ctx->temp >> 8) & 0xff; + b = (ctx->temp) & 0xff; + atr->u.rgba = (a << 24) | (b << 16) | (g << 8) | r; + break; + case 8: + r = (ctx->temp >> 24) & 0xff; + g = (ctx->temp >> 16) & 0xff; + b = (ctx->temp >> 8) & 0xff; + a = (ctx->temp) & 0xff; + atr->u.rgba = (a << 24) | (b << 16) | (g << 8) | r; + break; + } + + // lwsl_err("%s: %d, 0x%08x, 0x%08x\n", __func__, ctx->temp_count, ctx->temp, atr->u.rgba); + + atr->unit = LCSP_UNIT_RGBA; + + lws_dll2_add_tail(&atr->list, &ctx->def->atrs); + + ctx->u.f.color = 0; + ctx->temp = 0; + ctx->temp_count = 0; + + return 0; +} + +static int +lcsp_append_cssval_string(lhp_ctx_t *ctx) +{ + lcsp_atr_t *atr; + char *v, *c = &ctx->buf[0]; + + if (c[0] == '\"' || c[0] == '\'') { + c++; + ctx->npos--; + } + if (ctx->npos && (c[ctx->npos - 1] == '\"' || c[ctx->npos - 1] == '\'')) + ctx->npos--; + + atr = lwsac_use_zero(&ctx->cssac, sizeof(*atr) + (size_t)ctx->npos + 1u, + LHP_AC_GRANULE); + if (!atr) + return 1; + + v = (char *)&atr[1]; + atr->value_len = (size_t)ctx->npos; + memcpy(v, c, (size_t)ctx->npos); + v[ctx->npos] = '\0'; + + //lwsl_notice("%s: %s\n", __func__, v); + + lws_dll2_add_tail(&atr->list, &ctx->def->atrs); + + return 0; +} + +static int +lws_css_cascade_atr_match(lhp_ctx_t *ctx, const char *tag, size_t tag_len) +{ + lws_start_foreach_dll(struct lws_dll2 *, q, ctx->css.head) { + lcsp_stanza_t *stz = lws_container_of(q, lcsp_stanza_t, list); + + /* ... does this stanza mention our name? */ + + lws_start_foreach_dll(struct lws_dll2 *, z, stz->names.head) { + lcsp_names_t *nm = lws_container_of(z, lcsp_names_t, + list); + const char *p = (const char *)&nm[1]; + size_t nl = nm->name_len; + + if (nl && *p == '.') { /* match .mycss as mycss */ + p++; + nl--; + } + + if (nl == tag_len && !memcmp(p, tag, tag_len)) { + + lcsp_stanza_ptr_t *sp = lwsac_use_zero( + &ctx->cascadeac, + sizeof(*sp), LHP_AC_GRANULE); + if (!sp) + return 1; + + sp->stz = stz; + lws_dll2_add_tail(&sp->list, + &ctx->active_stanzas); + break; + } + + } lws_end_foreach_dll(z); + + } lws_end_foreach_dll(q); + + return 0; +} + +const char * +lws_html_get_atr(lhp_pstack_t *ps, const char *aname, size_t aname_len) +{ + /* look for src= attribute */ + lws_start_foreach_dll(struct lws_dll2 *, p, + lws_dll2_get_head(&ps->atr)) { + const lhp_atr_t *at = lws_container_of(p, + lhp_atr_t, list); + const char *ats = (const char *)&at[1]; + + if (at->name_len == aname_len && !strcmp(ats, aname)) + return ats + aname_len + 1; + + } lws_end_foreach_dll(p); + + return NULL; +} + +/* + * Produce an ordered list of css stanzas that apply to the current html + * parsing context, accounting for class="xxx" at each level + */ + +static int +lws_css_cascade(lhp_ctx_t *ctx) +{ + lws_dll2_owner_clear(&ctx->active_stanzas); + lwsac_free(&ctx->cascadeac); + lws_dll2_owner_clear(&ctx->active_atr); + lwsac_free(&ctx->propatrac); + ctx->in_body = 0; + + /* let's proceed through the html element stack that applies */ + + lws_start_foreach_dll(struct lws_dll2 *, p, ctx->stack.head) { + lhp_pstack_t *ps = lws_container_of(p, lhp_pstack_t, list); + + /* + * if there is a css definition for the html entity at this + * stack level, add its stanza to the results + */ + + lws_start_foreach_dll(struct lws_dll2 *, ha, ps->atr.head) { + lhp_atr_t *a = lws_container_of(ha, lhp_atr_t, list); + struct lws_tokenize ts; + + memset(&ts, 0, sizeof(ts)); + + if (ha == ps->atr.head) { + ts.start = (const char *)&a[1]; + ts.len = a->name_len; + } + + + if (a->name_len == 5 && + !strcmp((const char *)&a[1], "class")) { + ts.start = ((const char *)&a[1]) + 5 + 1; + ts.len = a->value_len; + } + + do { + ts.e = (int8_t)lws_tokenize(&ts); + if (ts.e == LWS_TOKZE_TOKEN) { + + if (ha == ps->atr.head && + ts.token_len == 4 && + !memcmp(ts.token, "body", 4)) + ctx->in_body = 1; + + /* + * let's look through the css stanzas + * for a tag match + */ + + if (lws_css_cascade_atr_match(ctx, + ts.token, ts.token_len)) + return 1; + } + + } while (ts.e > 0); + + } lws_end_foreach_dll(ha); + + /* + * ... fill layout-related CSS lookups into the element + * stack item... these are all pointers to the attribute + * not necessarily computed scalars. Eg lws_csp_px() can be + * used later to resolve atr like 50% to pixel values. + */ + + ps->css_position = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_POSITION); + ps->css_width = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_WIDTH); + ps->css_height = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_HEIGHT); + ps->css_display = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_DISPLAY); + + ps->css_border_radius[0] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BORDER_TOP_LEFT_RADIUS); + ps->css_border_radius[1] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BORDER_TOP_RIGHT_RADIUS); + ps->css_border_radius[2] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BORDER_BOTTOM_LEFT_RADIUS); + ps->css_border_radius[3] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BORDER_BOTTOM_RIGHT_RADIUS); + + ps->css_background_color = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BACKGROUND_COLOR); + ps->css_color = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_COLOR); + + ps->css_pos[CCPAS_TOP] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_TOP); + ps->css_pos[CCPAS_RIGHT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_RIGHT); + ps->css_pos[CCPAS_BOTTOM] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_BOTTOM); + ps->css_pos[CCPAS_LEFT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_LEFT); + + ps->css_margin[CCPAS_TOP] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_MARGIN_TOP); + ps->css_margin[CCPAS_RIGHT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_MARGIN_RIGHT); + ps->css_margin[CCPAS_BOTTOM] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_MARGIN_BOTTOM); + ps->css_margin[CCPAS_LEFT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_MARGIN_LEFT); + + ps->css_padding[CCPAS_TOP] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_PADDING_TOP); + ps->css_padding[CCPAS_RIGHT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_PADDING_RIGHT); + ps->css_padding[CCPAS_BOTTOM] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_PADDING_BOTTOM); + ps->css_padding[CCPAS_LEFT] = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_PADDING_LEFT); + + } lws_end_foreach_dll(p); + + return 0; +} + +void +lws_lhp_destruct(lhp_ctx_t *ctx) +{ + if (ctx->base_url) { + free((void *)ctx->base_url); + ctx->base_url = NULL; + } + lws_dll2_foreach_safe(&ctx->stack, NULL, lhp_clean_stack); + lws_dll2_owner_clear(&ctx->active_stanzas); + lws_dll2_owner_clear(&ctx->active_atr); + lwsac_free(&ctx->propatrac); + lwsac_free(&ctx->cascadeac); + lwsac_free(&ctx->cssac); +} + +void +lws_lhp_tag_dlo_id(lhp_ctx_t *ctx, lhp_pstack_t *ps, lws_dlo_t *dlo) +{ + const char *pname; + + /* Deal with ID matching */ + + pname = lws_html_get_atr(ps, "id", 2); + if (!pname) + return; + + lws_start_foreach_dll(struct lws_dll2 *, d, lws_dll2_get_head(ctx->ids)) { + lws_display_id_t *id = lws_container_of(d, lws_display_id_t, list); + + if (!strcmp(pname, id->id)) { + dlo->id = id; + id->exists = 1; + lwsl_debug("%s: %s tagged\n", __func__, pname); + return; + } + + } lws_end_foreach_dll(d); +} + +lws_stateful_ret_t +lws_lhp_parse(lhp_ctx_t *ctx, const uint8_t **buf, size_t *len) +{ + lhp_pstack_t *ps1, *ps = lws_container_of(ctx->stack.tail, + lhp_pstack_t, list); + struct lws_context *cx = (struct lws_context *)ctx->user1; + lws_dl_rend_t *drt = (lws_dl_rend_t *)ctx->user; + lws_stateful_ret_t r; + const uint8_t *rbuf; + size_t rsize; + lhp_atr_t *a; + + if (ctx->await_css_done && !ctx->is_css) + return LWS_SRET_AWAIT_RETRY; + + assert(drt); + + if (!*len && ctx->is_css && ctx->await_css_done && ctx->finish_css) + goto finish_css; + + while (*len) { + uint8_t c = *(*buf)++; + + (*len)--; + + if (ctx->state == LHPS_DO_START_ELEM) { + /* we are retrying the inner callback */ + (*len)++; + (*buf)--; + } + + // lwsl_notice("%s: %d, '%c', %02X\n", __func__, ctx->state, c, c); + + switch (ctx->state) { + + case LHPS_INIT: + + /* default css injection first, then... */ + + ctx->state = LCSPS_CSS_OUTER; + ctx->u.f.default_css = 1; + /* + * recurse (there's no stack usage to speak of) to + * do the default css parse first, CSS doesn't have a + * way to recurse further. + */ + rbuf = (const uint8_t *)default_css; + rsize = strlen(default_css); + r = lws_lhp_parse(ctx, &rbuf, &rsize); + if (r >= LWS_SRET_FATAL) { + lwsl_err("%s: css parse fail\n", __func__); + return r; + } + ctx->u.f.default_css = 0; + ctx->npos = 0; + ctx->state = LHPS_OUTER; + + /* fallthru */ + + case LHPS_OUTER: + switch (c) { + case '<': + ctx->u.s = 0; + ctx->u.f.first = 1; + + ctx->tag = NULL; + ctx->tag_len = 0; + + ctx->state = LHPS_TAG; + + if (ctx->stack.count == LHP_MAX_ELEMS_NEST /* sanity */) { + lwsl_err("%s: MAX_ELEMS_NEST\n", __func__); + ps->cb(ctx, LHPCB_FAILED); + return LWS_SRET_FATAL; + + } + + ps1 = lws_zalloc(sizeof(*ps1), __func__); + if (!ps1) + goto oom; + + /* inherit user and cb to start with */ + ps1->user = ps->user; + ps1->cb = ps->cb; + lws_dll2_owner_clear(&ps1->atr); + lws_dll2_add_tail(&ps1->list, &ctx->stack); + ps = ps1; + break; + + case '&': + ctx->state = LHPS_AMP; + ctx->temp_count = 0; + continue; + + case '\t': + case '\n': + c = ' '; + /* fallthru */ + default: + if (c != ' ' || !ctx->npos || + ctx->buf[ctx->npos - 1] != ' ') + ctx->buf[ctx->npos++] = (char)c; + break; + } + + if (ctx->npos && + (ctx->state != LHPS_OUTER || + ctx->npos >= LHP_STRING_CHUNK - 4)) { + if (ctx->in_body && (ctx->npos != 1 || ctx->buf[0] != ' ')) { + lws_css_cascade(ctx); + ps->cb(ctx, LHPCB_CONTENT); + } + ctx->npos = 0; + } + break; + + case LHPS_TAG: + if (c == '!' && ctx->u.f.first) { + ctx->state = LHPS_SCOMMENT1; + ctx->u.f.first = 0; + break; + } + + if (c == '/' && ctx->u.f.first) { + /* remove the level we just prepared for this */ + lhp_clean_level(ps); + ps = lws_container_of(ctx->stack.tail, + lhp_pstack_t, list); + ctx->u.f.closing = 1; + ctx->u.f.first = 0; + break; + } + ctx->u.f.first = 0; + + /* it implies the end of the tag name */ + + if (hspace(c) || c == '/' || c == '>') { + if (!ctx->u.f.tag_used && ctx->npos && !ctx->u.f.closing) { + a = lhp_atr_new(ctx, (size_t)ctx->npos, 0); + if (!a) + goto oom; + ctx->tag = (const char *)&a[1]; + ctx->tag_len = a->name_len; + + ctx->u.f.tag_used = 1; + + if (ctx->tag_len == 8 && + !strncasecmp(ctx->buf, "!doctype", 8)) + ctx->u.f.doctype = 1; + } + + if (c != '/' && c != '>') { + + /* after that, there may be attributes */ + ctx->state = LHPS_ATTRIB; + break; + } + + /* " + "\n" + "

libwebsockets.org

\n" + "A bunch of normal text, long enough that it is going to want to wrap
" + "bold, normal
\n" + "" + "\n" + "\n", + "€👍", + "the title" + "

Heading

\n" + "
" + "A bunch of normal and boldtext in a div" + "
" + "hello" +}; + +static unsigned int m, step; + +static int +dump_atr(lws_dll2_t *d, void *user) +{ + lhp_atr_t *atr = lws_container_of(d, lhp_atr_t, list); + const char *p = (const char *)&atr[1]; + + printf("{ \"%.*s\", \"%.*s\" }, ", + (int)atr->name_len, p, (int)atr->value_len, p + atr->name_len + 1); + + return 0; +} + +#if 0 +static int +dump_css_atr(lws_dll2_t *d, void *user) +{ + lcsp_atr_ptr_t *pa = lws_container_of(d, lcsp_atr_ptr_t, list); + lcsp_atr_t *a = pa->atr; + + if (a->unit == LCSP_UNIT_RGBA) + lwsl_notice("css attr: color 0x%08x\n", a->u.rgba); + else + lwsl_notice("css attr: %d %u.%u %u\n", a->propval, a->u.i.whole, a->u.i.frac, a->unit); + + return 0; +} +#endif + +static lws_stateful_ret_t +test_cb(lhp_ctx_t *ctx, char reason) +{ + lhp_pstack_t *ps = lws_container_of(ctx->stack.tail, lhp_pstack_t, list); + const lcsp_atr_t *a; + + printf("{ %s, %u, \"%.*s\", %u, { ", cb_reasons[(unsigned int)reason], ctx->npos, ctx->npos, ctx->buf, ps->atr.count); + + if (reason == LHPCB_ELEMENT_START || reason == LHPCB_ELEMENT_END) { + lws_dll2_foreach_safe(&ps->atr, NULL, dump_atr); + + a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_DISPLAY); + if (a) + lwsl_notice("display: %d\n", a->propval); + + a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_COLOR); + if (a) + lwsl_notice("color: %d 0x%08X\n", a->propval, a->u.rgba); + //lwsl_notice("color: active_stz %d, atr %d\n", ctx->active_stanzas.count, ctx->active_atr.count); + //lws_dll2_foreach_safe(&ctx->active_atr, NULL, dump_css_atr); + + a = ps->css_position; + if (a) + lwsl_notice("position: %d\n", a->propval); + + a = ps->css_width; + if (a) + lwsl_notice("width: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = ps->css_height; + if (a) + lwsl_notice("height: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = ps->css_pos[CCPAS_TOP]; + if (a) + lwsl_notice("top: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_pos[CCPAS_RIGHT]; + if (a) + lwsl_notice("right: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_pos[CCPAS_BOTTOM]; + if (a) + lwsl_notice("bottom: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_pos[CCPAS_LEFT]; + if (a) + lwsl_notice("left: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = ps->css_margin[CCPAS_TOP]; + if (a) + lwsl_notice("margin top: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_margin[CCPAS_RIGHT]; + if (a) + lwsl_notice("margin right: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_margin[CCPAS_BOTTOM]; + if (a) + lwsl_notice("margin bottom: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_margin[CCPAS_LEFT]; + if (a) + lwsl_notice("margin left: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = ps->css_padding[CCPAS_TOP]; + if (a) + lwsl_notice("padding top: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_padding[CCPAS_RIGHT]; + if (a) + lwsl_notice("padding right: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_padding[CCPAS_BOTTOM]; + if (a) + lwsl_notice("padding bottom: %d.%u\n", a->u.i.whole, a->u.i.frac); + a = ps->css_padding[CCPAS_LEFT]; + if (a) + lwsl_notice("padding left: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_SIZE); + if (a) + lwsl_notice("font-size: %d.%u\n", a->u.i.whole, a->u.i.frac); + + a = lws_css_cascade_get_prop_atr(ctx, LCSP_PROP_FONT_FAMILY); + if (a) + lwsl_notice("font-family: %s\n", (const char *)&a[1]); + } + + printf(" },\n"); + +#if 0 + if (m < LWS_ARRAY_SIZE(rpkg)) { + if (step < rpkg[m].len) { + // lwsl_notice("test %d, step %d\n", m, step); + if (reason != rpkg[m].r[step].reason) { + lwsl_err("%s: reason mismatch %d vs %d\n", __func__, reason, rpkg[m].r[step].reason); + return -1; + } + if (ctx->ipos != rpkg[m].r[step].ipos) { + lwsl_err("%s: ipos mismatch %d vs %d\n", __func__, ctx->ipos, rpkg[m].r[step].ipos); + return -1; + } + if (ctx->ipos && memcmp(ctx->i, rpkg[m].r[step].indexes, ctx->ipos)) { + lwsl_err("%s: indexes mismatch\n", __func__); + lwsl_hexdump_err(ctx->i, ctx->ipos); + lwsl_hexdump_err(rpkg[m].r[step].indexes, ctx->ipos); + return -1; + } + if (ctx->path_match != rpkg[m].r[step].path_match) { + lwsl_err("%s: path_match mismatch %d vs %d\n", __func__, ctx->path_match, rpkg[m].r[step].path_match); + return -1; + } + if (strcmp(ctx->path, rpkg[m].r[step].path)) { + lwsl_err("%s: path mismatch '%s' vs '%s'\n", __func__, ctx->path, rpkg[m].r[step].path); + return -1; + } + if (strcmp(ctx->buf, rpkg[m].r[step].buf)) { + lwsl_err("%s: buf mismatch '%s' vs '%s'\n", __func__, ctx->buf, rpkg[m].r[step].buf); + return -1; + } + } else { + lwsl_err("%s: extra steps\n", __func__); + return -1; + } + + step++; + } +#endif + return 0; +} + +static const lws_surface_info_t ic = { + .wh_px = { { 600,0 }, { 448,0 } }, + .wh_mm = { { 114,5000000 }, { 82,5000000 } }, +}; + +static lws_displaylist_t displaylist; + +int +main(int argc, const char **argv) +{ + int e = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE; + lws_stateful_ret_t n; + lws_dl_rend_t drt; + lhp_ctx_t ctx; + const char *p; + + + memset(&ctx, 0, sizeof(ctx)); + + if ((p = lws_cmdline_option(argc, argv, "-d"))) + logs = atoi(p); + + lws_set_log_level(logs, NULL); + lwsl_user("LWS API selftest: lhp HTML5 parser\n"); + + for (m = 0; m < (int)LWS_ARRAY_SIZE(html_tests); m++) { + const uint8_t *data; + size_t size; + + lwsl_user("%s: ++++++++++++++++ test %d\n", __func__, m + 1); + step = 0; + + drt.dl = &displaylist; + drt.w = ic.wh_px[0].whole; + drt.h = ic.wh_px[1].whole; + + if (lws_lhp_construct(&ctx, test_cb, &drt, &ic)) { + e++; + continue; + } + ctx.flags = LHP_FLAG_DOCUMENT_END; + ctx.base_url = strdup(""); + + data = (uint8_t *)html_tests[m]; + size = strlen(html_tests[m]); + + lwsl_hexdump_info(data, size); + n = lws_lhp_parse(&ctx, &data, &size); + + lwsl_notice("n = %d\n", (int)n); + if (n & LWS_SRET_FATAL) + e = 1; + + lws_lhp_destruct(&ctx); + } + + if (e) + goto bail; + + lwsl_user("Completed: PASS\n"); + + return 0; + +bail: + lwsl_user("Completed: FAIL\n"); + + return 1; +}